Compare commits

...

16 Commits

Author SHA1 Message Date
justuser31 bda4452390 Мелкие правки, добавление источников локализации и рецептов 2024-05-07 22:04:02 +03:00
justuser31 53d540c841 Добавлена функция получения предрасчётов 2024-05-07 20:37:54 +03:00
justuser31 320a7204e3 Обновление update_db и мелкие изменения 2024-05-04 18:53:45 +03:00
justuser31 0ef9fc1de9 Сохранение рецептов, изменение структуры класса reag__ 2024-05-04 14:20:09 +03:00
justuser31 5cce77aa10 Загрузка списком локализаций и рецептов 2024-05-04 14:00:31 +03:00
justuser31 0a98ef930b up 2024-05-04 13:20:24 +03:00
justuser31 45ec9a1157 Исправил баг, немного модифицировал. 2024-05-04 13:18:41 +03:00
justuser31 5deaa5823e up 2024-05-04 12:46:21 +03:00
justuser31 170dc0517a Оптимизация функции локализации 2024-05-03 18:08:26 +03:00
justuser31 63af9c4eaa Оптимизация функции локализации 2024-05-03 18:04:09 +03:00
wadehusky a54a1b3d61 Исправление табуляции 2024-05-03 17:58:37 +03:00
wadehusky 3d6074260a Добавление функции localize() в parse.py 2024-05-02 19:07:06 +03:00
justuser31 32527fe39e Домножение рецепта и мелкие доработки 2024-05-02 17:46:32 +03:00
justuser31 22b2a0ec27 Мелкие поправки, комментарии. 2024-05-01 15:14:33 +03:00
justuser31 eb13e945b9 Merge branch 'main' of github.com:Justuser3310/ss14_chemistry_site 2024-05-01 15:11:19 +03:00
justuser31 0d3bd86b2c Новый алгоритм, ура. 2024-05-01 15:07:43 +03:00
6 changed files with 226 additions and 25 deletions
+67
View File
@@ -0,0 +1,67 @@
from precalc__ import precalc__
from db import load
global expanded
def expand_recipe(recipe, recipes, main = False):
global expanded
if main:
expanded = {}
ok = False
part = 1 # Одна часть
while not ok:
ok = True
vol_in = 0 # Объём мин. рецепта (вход)
# Перебираем элементы
for el in recipe:
# Если составное
if el in recipes:
# Одна часть должна делиться без остатка!
if part % recipes[el].out != 0:
ok = False
part += 1
expanded = {}
break
else:
vol_in += expand_recipe(recipes[el].comps, recipes)
else:
if el in expanded:
expanded[el] += recipe[el]*part
else:
expanded[el] = recipe[el]*part
vol_in += recipe[el]*part
if main:
return expanded, vol_in, part
else:
return vol_in
def calc(element, amount, recipes):
# Получаем характеристику элемента
recipe, vol_out = recipes[element].comps, recipes[element].out
# Расчитываем минимальный рецепт
expanded, vol_in, part = expand_recipe(recipe, recipes, True)
need = amount//vol_in
for i in expanded:
expanded[i] = expanded[i]*need
vol_in *= need
vol_out *= part*need
return expanded, vol_in, vol_out
def calc_all(recipes, amount):
precalc = {}
for el in recipes:
precalc[el] = precalc__(calc(el, amount, recipes))
return precalc
def precalc(element, amount):
try:
# Загружаем рецепты с нужным количеством
recipes = load(f'{amount}_calc.json', 'precalc')
except:
return 'Нету такого файла или вещества'
return recipes[element]
+35 -7
View File
@@ -1,20 +1,48 @@
import os import os
import json import json
from reag__ import reag__
from precalc__ import precalc__
if not os.path.exists('db.json'): if not os.path.exists('precalc.json'):
db = {} db = {}
js = json.dumps(db, indent=2) js = json.dumps(db, indent=2)
with open("db.json", "w") as outfile: with open('precalc.json', 'w') as outfile:
outfile.write(js) outfile.write(js)
print('Created new db.json') print('Created new precalc.json')
if not os.path.exists('raw_db.json'):
db = {}
js = json.dumps(db, indent=2)
with open('raw_db.json', 'w') as outfile:
outfile.write(js)
print('Created new raw_db.json')
def read_db(file = 'db.json'): def read_db(file):
with open(file, "r", encoding="utf-8") as openfile: with open(file, 'r', encoding='utf-8') as openfile:
db = json.load(openfile) db = json.load(openfile)
return db return db
def write_db(db, file = 'db.json'): def write_db(db, file):
js = json.dumps(db, indent=2, ensure_ascii=False) js = json.dumps(db, indent=2, ensure_ascii=False)
with open(file, "w", encoding="utf-8") as outfile: with open(file, 'w', encoding='utf-8') as outfile:
outfile.write(js) outfile.write(js)
def save(db, file):
raw = {}
for el in db:
class_data = db[el].get_all()
raw[el] = class_data
write_db(raw, file)
def load(file, type = 'raw'):
raw = read_db(file)
db = {}
if type == 'raw':
for el in raw:
db[el] = reag__(raw[el][0], raw[el][1], raw[el][2])
elif type == 'precalc':
for el in raw:
db[el] = precalc__(raw[el])
return db
+63 -11
View File
@@ -1,12 +1,14 @@
from requests import get from requests import get
from yaml import load, SafeLoader from yaml import load, SafeLoader
from reag__ import reag__ from reag__ import reag__
from tqdm import tqdm
def parse_yml(url = 'https://raw.githubusercontent.com/SerbiaStrong-220/space-station-14/master/Resources/Prototypes/Recipes/Reactions/medicine.yml'): #### Локализация ####
yml = load(get(url).content.decode('utf-8'), Loader=SafeLoader)
return yml
def parse_ftl(url = 'https://raw.githubusercontent.com/SerbiaStrong-220/space-station-14/master/Resources/Locale/ru-RU/reagents/meta/medicine.ftl'): def parse_ftl(el, prefix = 'https://raw.githubusercontent.com/SerbiaStrong-220/space-station-14/master/Resources/Locale/ru-RU/reagents/meta'):
if '.ftl' not in el:
el += '.ftl'
url = f'{prefix}/{el}'
raw = get(url).content.decode('utf-8') raw = get(url).content.decode('utf-8')
locales = {} locales = {}
for i in raw.splitlines(): for i in raw.splitlines():
@@ -17,15 +19,65 @@ def parse_ftl(url = 'https://raw.githubusercontent.com/SerbiaStrong-220/space-st
locales[name] = locale locales[name] = locale
return locales return locales
def load_recipes(url = 'https://raw.githubusercontent.com/SerbiaStrong-220/space-station-14/master/Resources/Prototypes/Recipes/Reactions/medicine.yml', category = '-'): def load_locales(locales_url):
yml = parse_yml(url) locales = {}
for el in tqdm(locales_url):
locales = locales | parse_ftl(el)
return locales
#### Рецепты ####
SafeLoader.add_multi_constructor('', lambda loader, tag_suffix, node: None)
def parse_yml(el, prefix = 'https://raw.githubusercontent.com/SerbiaStrong-220/space-station-14/master/Resources/Prototypes/Recipes/Reactions'):
if '.yml' not in el:
el += '.yml'
url = f'{prefix}/{el}'
yml = load(get(url).content.decode('utf-8'), Loader=SafeLoader)
return yml
def load_recipes(recipes_url, prefix = 'https://raw.githubusercontent.com/SerbiaStrong-220/space-station-14/master/Resources/Prototypes/Recipes/Reactions'):
recipes = {} recipes = {}
for el in tqdm(recipes_url):
yml = parse_yml(el, prefix)
for element in yml: for element in yml:
product = element["id"] if 'products' not in element or 'reactants' not in element:
continue
product = element['id']
comps = {} comps = {}
for elem in element["reactants"]: for elem in element['reactants']:
comps[elem] = element["reactants"][elem]["amount"] comps[elem] = element['reactants'][elem]['amount']
for id, value in element["products"].items(): for id, value in element['products'].items():
out = value out = value
recipes[product] = reag__(category=category, comps=comps, out=out) recipes[product] = reag__(comps=comps, out=out, category=el)
return recipes return recipes
#### Локализируем ####
def localize(recipes, locale):
loc_recipes = {}
# Итерируем элементы
for element in recipes:
# Итерируем составные
el = recipes[element]
# Локализованные составные
loc_comps = {}
for comp in el.comps:
# Ищем перевод
if comp.lower() in locale:
loc = locale[comp.lower()].capitalize()
loc_comps[loc] = el.comps[comp]
else:
loc_comps[comp] = el.comps[comp]
# Заменяем на локализованное
el.comps = loc_comps
# Локализуем ключ
if element.lower() in locale:
loc = locale[element.lower()].capitalize()
loc_recipes[loc] = recipes[element]
else:
loc_recipes[element] = recipes[element]
return loc_recipes
+7
View File
@@ -0,0 +1,7 @@
class precalc__:
def __init__(self, els):
self.recipe = els[0]
self.vol_in = els[1]
self.vol_out = els[2]
def get_all(self):
return [self.recipe, self.vol_in, self.vol_out]
+4 -4
View File
@@ -1,11 +1,11 @@
class reag__: class reag__:
def __init__(self, category: str = '-', comps = {}, out: int = 0): def __init__(self, comps, out, category = '-'):
# medicine
self.category = category
# {'инапровалин': 1, 'углерод': 1} # {'инапровалин': 1, 'углерод': 1}
self.comps = comps self.comps = comps
# 2 # 2
self.out = out self.out = out
# medicine
self.category = category
def get_all(self): def get_all(self):
return [self.category, self.comps, self.out] return [self.comps, self.out, self.category]
+47
View File
@@ -0,0 +1,47 @@
from parse import *
from calc import *
from db import *
print('''1. Обновить всё.
2. Пересчитать рецепты.
''')
inp = input(">> ")
print('\n')
vols = [30, 50, 100]
if inp == '1':
print('Парсим и обрабатываем данные...')
# Загружаем локализацию
locales_url = ['biological', 'botany', 'chemicals', 'cleaning', 'elements', 'fun',
'gases', 'medicine', 'narcotics', 'physical-desc', 'pyrotechnic', 'toxins',
'consumable/drink/alcohol', 'consumable/drink/drinks', 'consumable/drink/juice', 'consumable/drink/soda',
'consumable/food/condiments', 'consumable/food/food', 'consumable/food/ingredients']
locales = load_locales(locales_url)
# Загружаем сырые рецепты
recipes_url = ['biological', 'botany', 'chemicals', 'cleaning', 'drinks', 'food',
'fun', 'gas', 'medicine', 'pyrotechnic']
raw_recipes = load_recipes(recipes_url)
# Локализируем
recipes = localize(raw_recipes, locales)
save(recipes, 'raw_db.json')
print('Сохранены минимальные рецепты в raw_db.json')
print('Выполняем предрасчёты...')
for i in vols:
precalc = calc_all(recipes, i)
save(precalc, f'{i}_calc.json')
print(f'Данные сохранены в {i}_calc.json')
elif inp == '2':
print('Выполняем расчёты...')
recipes = load('raw_db.json')
for i in vols:
precalc = calc_all(recipes, i)
save(precalc, f'{i}_calc.json')
print(f'Данные сохранены в {i}_calc.json')
else:
exit()
print("ГОТОВО.")