from tinydb import TinyDB, Query db = TinyDB('./db.json') material_table = db.table('material') medicine_table = db.table('medicine') def get_medicines(type="ALL"): assert type in ["ALL", "回复状态", "突破概率", "加攻击力"], f"type:{type} 不是有效的类别" if type in ["ALL"]: a = medicine_table.all() else: medicine = Query() a = medicine_table.search(medicine.type == type) return list(map(lambda x: x["name"], a)) def _get_medicine_elixir_config(medicine_select: str): medicine = Query() return medicine_table.search(medicine.name == medicine_select)[0] def _get_material_elixir_config(material_select: str): medicine = Query() return material_table.search(medicine.name == material_select)[0] def get_first_material(medicine_select, medicine_level_select="ALL",material_max_num=5) ->list: material = Query() m = _get_medicine_elixir_config(medicine_select) func1_type = m["func1_type"] func1_power = m["func1_power"] func2_type = m["func2_type"] func2_power = m["func2_power"] if medicine_level_select == "ALL": a = material_table.search((material.main_func_t == func1_type) | (material.auxi_func_t == func1_type) | ( material.main_func_t == func2_type) | (material.auxi_func_t == func2_type)) else: a = material_table.search((material.level == medicine_level_select) & ( (material.main_func_t == func1_type) | (material.auxi_func_t == func1_type) | ( material.main_func_t == func2_type) | (material.auxi_func_t == func2_type))) def get_num(material0): global material_second_f name = material0["name"] if material0["main_func_t"] == func1_type: material_second_f = (func2_type,False) num = func1_power / material0["main_func_p"] elif material0["auxi_func_t"] == func1_type: material_second_f = (func2_type,True) num = func1_power / material0["auxi_func_p"] elif material0["main_func_t"] == func2_type: material_second_f = (func1_type,False) num = func2_power / material0["main_func_p"] elif material0["auxi_func_t"] == func2_type: material_second_f = (func1_type,True) num = func2_power / material0["auxi_func_p"] num = int(num) + 1 if num > int(num) else int(num) return (name,num,material_second_f) rtn = list(map(get_num, a)) rtn = list(filter(lambda x:x[1]<=material_max_num, rtn)) def check_material(material0): if material0[1] > material_max_num: return False material_t = material.main_func_t if material0[2][1] else material.auxi_func_t a = material_table.search(material_t == material0[2][0]) if a == []: return False return True rtn = list(filter(check_material, rtn)) rtn = list(map(lambda x: f"{x[0]}*{x[1]}", rtn)) return rtn def get_second_material(medicine_select, first_material:str, medicine_level_select="ALL",material_max_num=5) ->list: m = _get_medicine_elixir_config(medicine_select) first_material_name, _ = first_material.split("*") first_material = _get_material_elixir_config(first_material_name) func1_type = m["func1_type"] func1_power = m["func1_power"] func2_type = m["func2_type"] func2_power = m["func2_power"] if first_material["main_func_t"] == func1_type: second_material_func_need,second_material_main = (func2_type,func2_power),False elif first_material["auxi_func_t"] == func1_type: second_material_func_need, second_material_main = (func2_type,func2_power), True elif first_material["main_func_t"] == func2_type: second_material_func_need, second_material_main = (func1_type,func1_power), False elif first_material["auxi_func_t"] == func2_type: second_material_func_need, second_material_main = (func1_type,func1_power), True material = Query() material_t = material.main_func_t if second_material_main else material.auxi_func_t if medicine_level_select == "ALL": a = material_table.search((material_t == second_material_func_need[0])) else: a = material_table.search((material.level == medicine_level_select) & (material_t == second_material_func_need[0])) def get_num(material0): name = material0["name"] material0_p = material0["main_func_p"] if second_material_main else material0["auxi_func_p"] num = second_material_func_need[1]/material0_p num = int(num) + 1 if num > int(num) else int(num) return (name,num) rtn = list(map(get_num, a)) rtn = list(filter(lambda x:x[1]<=material_max_num, rtn)) rtn = list(map(lambda x: f"{x[0]}*{x[1]}", rtn)) return rtn def get_possible_material(medicine_select, first_material:str="无", second_material:str="无",material_max_num=5): possible_choice = set() if first_material == "无": for first_material in get_first_material(medicine_select): for second_material in get_second_material(medicine_select, first_material): possible_choice.add((first_material, second_material)) elif second_material == "无": for second_material in get_second_material(medicine_select,first_material): possible_choice.add((first_material, second_material)) else: possible_choice.add((first_material,second_material)) m = _get_medicine_elixir_config(medicine_select) func1_type = m["func1_type"] func2_type = m["func2_type"] rtn = [] for first_material,second_material in possible_choice: first_material_name,first_material_num = first_material.split("*") second_material_name,second_material_num = second_material.split("*") first_material = _get_material_elixir_config(first_material_name) second_material = _get_material_elixir_config(second_material_name) if first_material["main_func_t"] in [func1_type,func2_type]: main_temp = first_material["main_temp"] main_material = f"{first_material_name}*{first_material_num}" auxi_material = f"{second_material_name}*{second_material_num}" else: main_temp = second_material["main_temp"] auxi_material = f"{first_material_name}*{first_material_num}" main_material = f"{second_material_name}*{second_material_num}" if main_temp==0: material_third_list=['恒心草(一品)*1', '红绫草(一品)*1', '五柳根(二品)*1', '天元果(二品)*1', '紫猴花(三品)*1', '九叶芝(三品)*1', '血莲精(四品)*1', '鸡冠草(四品)*1', '地心火芝(五品)*1', '天蝉灵叶(五品)*1', '三叶青芝(六品)*1', '七彩月兰(六品)*1', '地心淬灵乳(七品)*1', '天麻翡石精(七品)*1', '木灵三针花(八品)*1', '鎏鑫天晶草(八品)*1', '离火梧桐芝(九品)*1', '尘磊岩麟果(九品)*1', '宁心草(一品)*1', '凝血草(一品)*1', '流莹草(二品)*1', '蛇涎果(二品)*1', '轻灵草(三品)*1', '龙葵(三品)*1', '菩提花(四品)*1', '乌稠木(四品)*1', '天灵果(五品)*1', '灯心草(五品)*1', '白沉脂(六品)*1', '苦曼藤(六品)*1', '天问花(七品)*1', '渊血冥花(七品)*1', '阴阳黄泉花(八品)*1', '厉魂血珀(八品)*1', '太乙碧莹花(九品)*1', '森檀木(九品)*1', '地黄参(一品)*1', '火精枣(一品)*1', '风灵花(二品)*1', '伏龙参(二品)*1', '枫香脂(三品)*1', '炼魂珠(三品)*1', '石龙芮(四品)*1', '锦地罗(四品)*1', '伴妖草(五品)*1', '剑心竹(五品)*1', '混元果(六品)*1', '皇龙花(六品)*1', '血玉竹(七品)*1', '肠蚀草(七品)*1', '狼桃(八品)*1', '霸王花(八品)*1', '地龙干(九品)*1', '龙须藤(九品)*1'] else: material0 = Query() material0 = material0.phar_temp > 0 if main_temp<0 else material0.phar_temp <0 a = material_table.search(material0) def get_num(x): name = x["name"] phar_temp = x["phar_temp"] num = -main_temp//phar_temp num = 1 if num==0 else num return (name,num) a = list(map(get_num,a)) a = list(filter(lambda x:x[1]<=material_max_num, a)) material_third_list = list(map(lambda x:f'{x[0]}*{x[1]}',a)) rtn.append((main_material,auxi_material,material_third_list)) return rtn def init(): medicine_list = get_medicines() return medicine_list