OSDN Git Service

add alchemy simulator
[amulettoolsmh4/main.git] / model / db_accessor.py
1 # -*- coding: utf-8 -*-
2
3 # database のアクセス用スクリプト
4 # 2013/12/04 written by kei9 
5
6 import sqlite3
7 import sys
8
9 import db_supports
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
22 class DataBaseAccessor(object):
23     u""" this is access class to database """
24     def __init__(self, db_name):
25         u""" db_name is database name to access """
26         self._db_name = db_name
27         self._connect = sqlite3.connect(self._db_name)
28         self._cursor = self._connect.cursor()
29
30         self._acc_skill = SkillTableAccessor(self._cursor)
31         self._acc_amulet = AmuletTableAccessor(self._cursor)
32         self._acc_minmax = SkillMinMaxTableAccessor(self._cursor)
33         self._acc_seed2skill2 = Seed2Skill2TableAccessor(self._cursor)
34         self._acc_seed2no = Seed2TableNumberTableAccessor(self._cursor)
35         self._acc_seed2threshold = Seed2ThresholdTableAccessor(self._cursor)
36         self._acc_seed2inishie = Seed2InishieTableAccessor(self._cursor)
37         self._acc_sufficient = SufficientTableAccessor(self._cursor)
38         self._acc_seed1tenun = Seed1TenunTableAccessor(self._cursor)
39         self._simulator = AlchemySimulator(self._cursor)
40
41         self._minmax_dict_by_name = self._acc_minmax.get_minmax_by_name()
42
43     def select_seed2s(self, amu_name2skill_names):
44         u""" お守り名とスキル名のリストの辞書からSeed2を特定する 
45         skill_names: (skill_name1, skill_name2, ...., skill_name7)
46         不明であればNoneあるいはNO_DATAを入れておくものとする。
47         """
48         return self._acc_seed2skill2.select_seed2s_by_name(amu_name2skill_names)
49
50     def select_seed1s(self, amu_skill_name_list, alchemy_type):
51         u""" お守り名とスキル名のリスト、および錬金の種類からseed1を返す
52         amu_skill_name_list: [(amu_name, skill_name), ....]"""
53         return self._acc_seed1tenun.select_seed1s_from_names(amu_skill_name_list, alchemy_type)
54
55
56     def get_minmax_dict(self, copied=False):
57         u""" お守り名と第1.第2スキル名ごとのの最大値を関連付けた辞書を返す
58         return {amulet_name:({skill1_name:(min1,max1)}, {skill2_name:(min2,max2)})}"""
59         if copied is True:
60             return self._minmax_dict_by_name.copy()
61         else:
62             return self._minmax_dict_by_name
63
64     def get_id_sorted_amulet_names(self, is_desc=False):
65         u""" お守りId順でソートされたお守り名を返す(is_desc=Trueで降順) """
66         return self._acc_amulet.get_id_sorted_names(is_desc)
67
68     def get_id_sorted_skill_names(self, is_desc=False):
69         u""" スキルId順でソートされたスキル名を返す(is_desc=Trueで降順) """
70         return self._acc_skill.get_id_sorted_names(is_desc)
71
72     def select_threshold_from_sufficient(self, amulet_name, sufficient_val):
73         u""" お守り名と充足値から、スロットごとの判定値を得る
74             return (slot1_th, slot2_th, slot3_th)
75         """
76         return self._acc_sufficient.select_thresholds_by_name(amulet_name, sufficient_val)
77
78     def select_names_from_seed2(self, seed2):
79         u""" 指定されたSeed2に対応するテーブルNo, 通しNo,
80         お守り名ごとの第2スキル名(1-7枠)、
81         判定値1(1-7枠)、判定値2(1-7枠)を返す
82         return: table_no, no, {amu_name:(skill2_names)}, threshold1s, threshold2s
83         """
84         #table no, no
85         table_no, no = self._acc_seed2no.get_table_no_from_seed2(seed2)
86         # skill2 dict
87         skill_dict = self._acc_seed2skill2.select_skill_names_by_seed2(seed2)
88         # threshold1s
89         th1s = self._acc_seed2threshold.select_thresholds_from_seed2(seed2, 1)
90         # threshold2s
91         th2s = self._acc_seed2threshold.select_thresholds_from_seed2(seed2, 2)
92
93         return table_no, no, skill_dict, th1s, th2s
94
95     def select_inishie_skill2_from_seed2(self, seed2):
96         u""" get inishie's (skill2_name, threshold1, threshold2) from seed2 value """
97         return self._acc_seed2inishie.select_names_from_seed2(seed2)
98
99     def select_names_from_seed1(self, seed1, key_alchemy):
100         u""" seed1に対応する(no, table_no, result_num, 
101         (amulet_name1, ..., amulet_name7), (skill1_name1, ..., skill1_name7))
102         の辞書を得る。存在しない場所は空文字列で置き換えてある。
103         """
104         return self._acc_seed1tenun.select_names_from_seed1(seed1, key_alchemy)
105
106     def select_table_nos_from_seed1(self, seed1, key_alchemy):
107         u""" Seed1と錬金の種類から通しNo,テーブルNo,お守り個数を返す。
108         return (no, table_no, result_num)"""
109         return self._acc_seed1tenun.select_table_nos_from_seed1(seed1, key_alchemy)
110
111     def select_near_seed1s_from_table_no(self, no, table_no, smaller_num, larger_num, alchemy_type):
112         u""" 通し番号とテーブル番および錬金の種類からその周囲のseed1の通し番号、テーブルNo.、
113         お守り個数, お守り名(1-7)、スキル名(1-7)を辞書として返す。
114         ただし辞書のキーは通し番号とする。
115         値が存在しない場所は空文字列で埋める。
116         return {no: (seed1, result_num, (amulet_names), (skill_names))}"""
117         return self._acc_seed1tenun.select_near_names_from_seed1(no, table_no, smaller_num, larger_num, alchemy_type)
118
119     def get_sufficient_value(self, amulet_name, skill1_name, skill2_name, skill1_val, skill2_val):
120         u""" 充足値を計算する。
121         指定したスキルが見つからない場合や、充足値を計算できない場合はNoneを返す 
122         skill2_nameが存在しないスキルであればskill1のみから計算する
123         return sufficient_val
124         """
125         if amulet_name in self._minmax_dict_by_name:
126             skill1_minmax, skill2_minmax = self._minmax_dict_by_name[amulet_name]
127             if skill1_name in skill1_minmax:
128                 max1 = skill1_minmax[skill1_name]
129                 skill1_val = 0 if skill1_val < 0 else skill1_val
130             else:
131                 # cannot find skill1
132                 return None
133
134             if skill2_name in skill2_minmax:
135                 max2 = skill2_minmax[skill2_name]
136                 skill2_val = 0 if skill2_val < 0 else skill2_val
137             else:
138                 max2 = 1
139                 skill2_val = 0
140
141             if skill1_val > max1 or skill2_val > max2:
142                 # over value
143                 return None
144
145             suff_val = (10 * skill1_val) // max1 + (10 * skill2_val) // max2
146             return suff_val
147         else:
148             return None
149
150     def simulate_nazo(self, seed1, seed2):
151         u""" なぞの錬金
152         return (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
153         """
154         return self._simulator.alchemy_nazo_name(seed1, seed2)
155
156     def simulate_komyou(self, seed1, seed2):
157         u""" 光明の錬金
158         return (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
159         """
160         return self._simulator.alchemy_komyou_name(seed1, seed2)
161
162     def simulate_inishie(self, seed1, seed2):
163         u""" いにしえの錬金
164         return (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
165         """
166         return self._simulator.alchemy_inishie_name(seed1, seed2)
167
168     def simulate_tenun(self, seed1, seed2, alchemy_key):
169         u""" 天運の錬金
170         return list of (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
171         """
172         return self._simulator.alchemy_tenun_name(seed1, seed2, alchemy_key)
173
174     def close(self):
175         u""" close database accessor """
176         self._cursor.close()
177         self._connect.close()
178
179 if __name__ == "__main__":
180     db = DataBaseAccessor("test.sqlite3")
181     #db._print_dicts()
182     hikari = [None, 57, None, None, None, None, None]
183     huru = [54, None, None, None, None, None, None]
184     #yuga = [None, None, 98, 75, None, None, None]
185     yuga = [None, None, 98, None, None, None, None]
186     dic = {2:hikari, 3:huru, 4:yuga}
187     #seeds = db.select_seeds(dic)
188     seeds = set([58241, 176])
189     skill_dic, slot_dic = db.select_skills_from_seeds(seeds)
190
191     print "seeds: ", seeds
192     print "amu_id to seed2skill dict: ", skill_dic
193     print "seed2slot dict", slot_dic
194     db.close()