1 # -*- coding: utf-8 -*-
4 # 2013/12/04 written by kei9
10 import mh4constnumbers
11 from skilltable import SkillTableAccessor
12 from amulettable import AmuletTableAccessor
13 from skillminmaxtable import SkillMinMaxTableAccessor
14 from seed2skill2table import Seed2Skill2TableAccessor
15 from seed2tablenumbertable import Seed2TableNumberTableAccessor
16 from seed2thresholdtable import Seed2ThresholdTableAccessor
17 from seed2inishietable import Seed2InishieTableAccessor
18 from sufficienttable import SufficientTableAccessor
19 from seed1tenuntable import Seed1TenunTableAccessor
20 from alchemysimulator import AlchemySimulator
21 from amuletsearcher import AmuletSearcher
23 class DataBaseAccessor(object):
24 u""" this is access class to database """
25 def __init__(self, db_name):
26 u""" db_name is database name to access """
27 self._db_name = db_name
28 self._connect = sqlite3.connect(self._db_name)
29 self._cursor = self._connect.cursor()
31 self._acc_skill = SkillTableAccessor(self._cursor)
32 self._acc_amulet = AmuletTableAccessor(self._cursor)
33 self._acc_minmax = SkillMinMaxTableAccessor(self._cursor)
34 self._acc_seed2skill2 = Seed2Skill2TableAccessor(self._cursor)
35 self._acc_seed2no = Seed2TableNumberTableAccessor(self._cursor)
36 self._acc_seed2threshold = Seed2ThresholdTableAccessor(self._cursor)
37 self._acc_seed2inishie = Seed2InishieTableAccessor(self._cursor)
38 self._acc_sufficient = SufficientTableAccessor(self._cursor)
39 self._acc_seed1tenun = Seed1TenunTableAccessor(self._cursor)
40 self._simulator = AlchemySimulator(self._cursor)
41 self._amulet_searcher = AmuletSearcher(self._cursor)
43 self._minmax_dict_by_name = self._acc_minmax.get_minmax_by_name()
45 def select_seed2s(self, amu_name2skill_names):
46 u""" お守り名とスキル名のリストの辞書からSeed2を特定する
47 skill_names: (skill_name1, skill_name2, ...., skill_name7)
48 不明であればNoneあるいはNO_DATAを入れておくものとする。
50 return self._acc_seed2skill2.select_seed2s_by_name(amu_name2skill_names)
52 def select_seed1s(self, amu_skill_name_list, alchemy_type):
53 u""" お守り名とスキル名のリスト、および錬金の種類からseed1を返す
54 amu_skill_name_list: [(amu_name, skill_name), ....]"""
55 return self._acc_seed1tenun.select_seed1s_from_names(amu_skill_name_list, alchemy_type)
57 def get_minmax_dict(self, copied=False):
58 u""" お守り名と第1.第2スキル名ごとのの最大値を関連付けた辞書を返す
59 return {amulet_name:({skill1_name:(min1,max1)}, {skill2_name:(min2,max2)})}"""
61 return self._minmax_dict_by_name.copy()
63 return self._minmax_dict_by_name
65 def get_id_sorted_amulet_names(self, is_desc=False):
66 u""" お守りId順でソートされたお守り名を返す(is_desc=Trueで降順) """
67 return self._acc_amulet.get_id_sorted_names(is_desc)
69 def get_id_sorted_skill_names(self, is_desc=False):
70 u""" スキルId順でソートされたスキル名を返す(is_desc=Trueで降順) """
71 return self._acc_skill.get_id_sorted_names(is_desc)
73 def select_threshold_from_sufficient(self, amulet_name, sufficient_val):
74 u""" お守り名と充足値から、スロットごとの判定値を得る
75 return (slot1_th, slot2_th, slot3_th)
77 return self._acc_sufficient.select_thresholds_by_name(amulet_name, sufficient_val)
79 def select_names_from_seed2(self, seed2):
80 u""" 指定されたSeed2に対応するテーブルNo, 通しNo,
82 判定値1(1-7枠)、判定値2(1-7枠)を返す
83 return: table_no, no, {amu_name:(skill2_names)}, threshold1s, threshold2s
86 table_no, no = self._acc_seed2no.get_table_no_from_seed2(seed2)
88 skill_dict = self._acc_seed2skill2.select_skill_names_by_seed2(seed2)
90 th1s = self._acc_seed2threshold.select_thresholds_from_seed2(seed2, 1)
92 th2s = self._acc_seed2threshold.select_thresholds_from_seed2(seed2, 2)
94 return table_no, no, skill_dict, th1s, th2s
96 def select_inishie_skill2_from_seed2(self, seed2):
97 u""" get inishie's (skill2_name, threshold1, threshold2) from seed2 value """
98 return self._acc_seed2inishie.select_names_from_seed2(seed2)
100 def select_names_from_seed1(self, seed1, key_alchemy):
101 u""" seed1に対応する(no, table_no, result_num,
102 (amulet_name1, ..., amulet_name7), (skill1_name1, ..., skill1_name7))
103 の辞書を得る。存在しない場所は空文字列で置き換えてある。
105 return self._acc_seed1tenun.select_names_from_seed1(seed1, key_alchemy)
107 def select_table_nos_from_seed1(self, seed1, key_alchemy):
108 u""" Seed1と錬金の種類から通しNo,テーブルNo,お守り個数を返す。
109 return (no, table_no, result_num)"""
110 return self._acc_seed1tenun.select_table_nos_from_seed1(seed1, key_alchemy)
112 def select_near_seed1s_from_table_no(self, no, table_no, smaller_num, larger_num, alchemy_type):
113 u""" 通し番号とテーブル番および錬金の種類からその周囲のseed1の通し番号、テーブルNo.、
114 お守り個数, お守り名(1-7)、スキル名(1-7)を辞書として返す。
117 return {no: (seed1, result_num, (amulet_names), (skill_names))}"""
118 return self._acc_seed1tenun.select_near_names_from_seed1(no, table_no, smaller_num, larger_num, alchemy_type)
120 def get_sufficient_value(self, amulet_name, skill1_name, skill2_name, skill1_val, skill2_val):
122 指定したスキルが見つからない場合や、充足値を計算できない場合はNoneを返す
123 skill2_nameが存在しないスキルであればskill1のみから計算する
124 return sufficient_val
126 if amulet_name in self._minmax_dict_by_name:
127 skill1_minmax, skill2_minmax = self._minmax_dict_by_name[amulet_name]
128 if skill1_name in skill1_minmax:
129 max1 = skill1_minmax[skill1_name]
130 skill1_val = 0 if skill1_val < 0 else skill1_val
135 if skill2_name in skill2_minmax:
136 max2 = skill2_minmax[skill2_name]
137 skill2_val = 0 if skill2_val < 0 else skill2_val
142 if skill1_val > max1 or skill2_val > max2:
146 suff_val = (10 * skill1_val) // max1 + (10 * skill2_val) // max2
152 def simple_select_seed2s_from_names(self,
153 amulet_name, skill1_name, skill1_val, skill2_name, skill2_val, slot_num):
154 u""" 指定されたスキルId,スキル値、スロット数を元にして、
155 Seed1との組み合わせを無視したSeed2候補の簡易検索を行う
156 return (suff_val, threshold, th1_seed2s, th2_seed2s)"""
157 return self._amulet_searcher.simple_select_seed2s_from_names(
158 amulet_name, skill1_name, skill1_val, skill2_name, skill2_val, slot_num)
161 def simulate_nazo(self, seed1, seed2):
163 return (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
165 return self._simulator.alchemy_nazo_name(seed1, seed2)
167 def simulate_komyou(self, seed1, seed2):
169 return (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
171 return self._simulator.alchemy_komyou_name(seed1, seed2)
173 def simulate_inishie(self, seed1, seed2):
175 return (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
177 return self._simulator.alchemy_inishie_name(seed1, seed2)
179 def simulate_tenun(self, seed1, seed2, alchemy_key):
181 return list of (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
183 return self._simulator.alchemy_tenun_name(seed1, seed2, alchemy_key)
186 u""" close database accessor """
188 self._connect.close()
190 if __name__ == "__main__":
191 db = DataBaseAccessor("test.sqlite3")
193 hikari = [None, 57, None, None, None, None, None]
194 huru = [54, None, None, None, None, None, None]
195 #yuga = [None, None, 98, 75, None, None, None]
196 yuga = [None, None, 98, None, None, None, None]
197 dic = {2:hikari, 3:huru, 4:yuga}
198 #seeds = db.select_seeds(dic)
199 seeds = set([58241, 176])
200 skill_dic, slot_dic = db.select_skills_from_seeds(seeds)
202 print "seeds: ", seeds
203 print "amu_id to seed2skill dict: ", skill_dic
204 print "seed2slot dict", slot_dic