File size: 8,800 Bytes
c2dd0f7
 
 
 
 
 
 
77749d1
c2dd0f7
aaddd09
c2dd0f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f583104
c2dd0f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f583104
c2dd0f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5723520
c2dd0f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d62bdaf
c2dd0f7
 
 
d62bdaf
c2dd0f7
 
 
 
 
 
 
 
 
 
 
 
 
 
3333068
 
 
 
 
c2dd0f7
 
 
 
 
 
 
f629cc0
 
 
c2dd0f7
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
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=16) ->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=16) ->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=100):
    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"] * int(first_material_num)
            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"] * int(second_material_num)
            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
                if not num.is_integer():
                    num = 9999999
                # num = 1 if num==0 else num
                return (name,int(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 get_basename(text):
    name,num = text.split("*")
    return name[:-4]+num


def init():
    medicine_list = get_medicines()
    return medicine_list