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
21 class DataBaseAccessor(object):
22 u""" this is access class to database """
23 def __init__(self, db_name):
24 u""" db_name is database name to access """
25 self._db_name = db_name
26 self._connect = sqlite3.connect(self._db_name)
27 self._cursor = self._connect.cursor()
29 self._acc_skill = SkillTableAccessor(self._cursor)
30 self._acc_amulet = AmuletTableAccessor(self._cursor)
31 self._acc_minmax = SkillMinMaxTableAccessor(self._cursor)
32 self._acc_seed2skill2 = Seed2Skill2TableAccessor(self._cursor)
33 self._acc_seed2no = Seed2TableNumberTableAccessor(self._cursor)
34 self._acc_seed2threshold = Seed2ThresholdTableAccessor(self._cursor)
35 self._acc_seed2inishie = Seed2InishieTableAccessor(self._cursor)
36 self._acc_sufficient = SufficientTableAccessor(self._cursor)
37 self._acc_seed1tenun = Seed1TenunTableAccessor(self._cursor)
39 self._minmax_dict_by_name = self._acc_minmax.get_minmax_by_name()
41 def select_seed2s(self, amu_name2skill_names):
42 u""" お守り名とスキル名のリストの辞書からSeed2を特定する
43 skill_names: (skill_name1, skill_name2, ...., skill_name7)
44 不明であればNoneあるいはNO_DATAを入れておくものとする。
46 return self._acc_seed2skill2.select_seed2s_by_name(amu_name2skill_names)
48 def select_seed1s(self, amu_skill_name_list, alchemy_type):
49 u""" お守り名とスキル名のリスト、および錬金の種類からseed1を返す
50 amu_skill_name_list: [(amu_name, skill_name), ....]"""
51 return self._acc_seed1tenun.select_seed1s_from_names(amu_skill_name_list, alchemy_type)
54 def get_minmax_dict(self, copied=False):
55 u""" お守り名と第1.第2スキル名ごとのの最大値を関連付けた辞書を返す
56 return {amulet_name:({skill1_name:(min1,max1)}, {skill2_name:(min2,max2)})}"""
58 return self._minmax_dict_by_name.copy()
60 return self._minmax_dict_by_name
62 def get_id_sorted_amulet_names(self, is_desc=False):
63 u""" お守りId順でソートされたお守り名を返す(is_desc=Trueで降順) """
64 return self._acc_amulet.get_id_sorted_names(is_desc)
66 def get_id_sorted_skill_names(self, is_desc=False):
67 u""" スキルId順でソートされたスキル名を返す(is_desc=Trueで降順) """
68 return self._acc_skill.get_id_sorted_names(is_desc)
70 def select_threshold_from_sufficient(self, amulet_name, sufficient_val):
71 u""" お守り名と充足値から、スロットごとの判定値を得る
72 return (slot1_th, slot2_th, slot3_th)
74 return self._acc_sufficient.select_thresholds_by_name(amulet_name, sufficient_val)
76 def select_names_from_seed2(self, seed2):
77 u""" 指定されたSeed2に対応するテーブルNo, 通しNo,
79 判定値1(1-7枠)、判定値2(1-7枠)を返す
80 return: table_no, no, {amu_name:(skill2_names)}, threshold1s, threshold2s
83 table_no, no = self._acc_seed2no.get_table_no_from_seed2(seed2)
85 skill_dict = self._acc_seed2skill2.select_skill_names_by_seed2(seed2)
87 th1s = self._acc_seed2threshold.select_thresholds_from_seed2(seed2, 1)
89 th2s = self._acc_seed2threshold.select_thresholds_from_seed2(seed2, 2)
91 return table_no, no, skill_dict, th1s, th2s
93 def select_inishie_skill2_from_seed2(self, seed2):
94 u""" get inishie's (skill2_name, threshold1, threshold2) from seed2 value """
95 return self._acc_seed2inishie.select_names_from_seed2(seed2)
97 def select_names_from_seed1(self, seed1, key_alchemy):
98 u""" seed1に対応する(no, table_no, result_num,
99 (amulet_name1, ..., amulet_name7), (skill1_name1, ..., skill1_name7))
100 の辞書を得る。存在しない場所は空文字列で置き換えてある。
102 return self._acc_seed1tenun.select_names_from_seed1(seed1, key_alchemy)
104 def select_table_nos_from_seed1(self, seed1, key_alchemy):
105 u""" Seed1と錬金の種類から通しNo,テーブルNo,お守り個数を返す。
106 return (no, table_no, result_num)"""
107 return self._acc_seed1tenun.select_table_nos_from_seed1(seed1, key_alchemy)
109 def select_near_seed1s_from_table_no(self, no, table_no, smaller_num, larger_num, alchemy_type):
110 u""" 通し番号とテーブル番および錬金の種類からその周囲のseed1の通し番号、テーブルNo.、
111 お守り個数, お守り名(1-7)、スキル名(1-7)を辞書として返す。
114 return {no: (seed1, result_num, (amulet_names), (skill_names))}"""
115 return self._acc_seed1tenun.select_near_names_from_seed1(no, table_no, smaller_num, larger_num, alchemy_type)
117 def get_sufficient_value(self, amulet_name, skill1_name, skill2_name, skill1_val, skill2_val):
119 指定したスキルが見つからない場合や、充足値を計算できない場合はNoneを返す
120 skill2_nameが存在しないスキルであればskill1のみから計算する
121 return sufficient_val
123 if amulet_name in self._minmax_dict_by_name:
124 skill1_minmax, skill2_minmax = self._minmax_dict_by_name[amulet_name]
125 if skill1_name in skill1_minmax:
126 max1 = skill1_minmax[skill1_name]
127 skill1_val = 0 if skill1_val < 0 else skill1_val
132 if skill2_name in skill2_minmax:
133 max2 = skill2_minmax[skill2_name]
134 skill2_val = 0 if skill2_val < 0 else skill2_val
139 if skill1_val > max1 or skill2_val > max2:
143 suff_val = (10 * skill1_val) // max1 + (10 * skill2_val) // max2
149 u""" close database accessor """
151 self._connect.close()
153 if __name__ == "__main__":
154 db = DataBaseAccessor("test.sqlite3")
156 hikari = [None, 57, None, None, None, None, None]
157 huru = [54, None, None, None, None, None, None]
158 #yuga = [None, None, 98, 75, None, None, None]
159 yuga = [None, None, 98, None, None, None, None]
160 dic = {2:hikari, 3:huru, 4:yuga}
161 #seeds = db.select_seeds(dic)
162 seeds = set([58241, 176])
163 skill_dic, slot_dic = db.select_skills_from_seeds(seeds)
165 print "seeds: ", seeds
166 print "amu_id to seed2skill dict: ", skill_dic
167 print "seed2slot dict", slot_dic