OSDN Git Service

6d8a5cf4ca60aeb5f87f531fafd659be68e4559c
[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 from amuletsearcher import AmuletSearcher
22
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()
30
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)
42
43         self._minmax_dict_by_name = self._acc_minmax.get_minmax_by_name()
44
45     def select_seed2s(self, amu_name2skill_names):
46         u""" お守り名とスキル名のリストの辞書からSeed2を特定する 
47         skill_names: (skill_name1, skill_name2, ...., skill_name7)
48         不明であればNoneあるいはNO_DATAを入れておくものとする。
49         """
50         return self._acc_seed2skill2.select_seed2s_by_name(amu_name2skill_names)
51
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)
56
57     def get_minmax_dict(self, copied=False):
58         u""" お守り名と第1.第2スキル名ごとのの最大値を関連付けた辞書を返す
59         return {amulet_name:({skill1_name:(min1,max1)}, {skill2_name:(min2,max2)})}"""
60         if copied is True:
61             return self._minmax_dict_by_name.copy()
62         else:
63             return self._minmax_dict_by_name
64
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)
68
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)
72
73     def select_threshold_from_sufficient(self, amulet_name, sufficient_val):
74         u""" お守り名と充足値から、スロットごとの判定値を得る
75             return (slot1_th, slot2_th, slot3_th)
76         """
77         return self._acc_sufficient.select_thresholds_by_name(amulet_name, sufficient_val)
78
79     def select_names_from_seed2(self, seed2):
80         u""" 指定されたSeed2に対応するテーブルNo, 通しNo,
81         お守り名ごとの第2スキル名(1-7枠)、
82         判定値1(1-7枠)、判定値2(1-7枠)を返す
83         return: table_no, no, {amu_name:(skill2_names)}, threshold1s, threshold2s
84         """
85         #table no, no
86         table_no, no = self._acc_seed2no.get_table_no_from_seed2(seed2)
87         # skill2 dict
88         skill_dict = self._acc_seed2skill2.select_skill_names_by_seed2(seed2)
89         # threshold1s
90         th1s = self._acc_seed2threshold.select_thresholds_from_seed2(seed2, 1)
91         # threshold2s
92         th2s = self._acc_seed2threshold.select_thresholds_from_seed2(seed2, 2)
93
94         return table_no, no, skill_dict, th1s, th2s
95
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)
99
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         の辞書を得る。存在しない場所は空文字列で置き換えてある。
104         """
105         return self._acc_seed1tenun.select_names_from_seed1(seed1, key_alchemy)
106
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)
111
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)を辞書として返す。
115         ただし辞書のキーは通し番号とする。
116         値が存在しない場所は空文字列で埋める。
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)
119
120     def get_sufficient_value(self, amulet_name, skill1_name, skill2_name, skill1_val, skill2_val):
121         u""" 充足値を計算する。
122         指定したスキルが見つからない場合や、充足値を計算できない場合はNoneを返す 
123         skill2_nameが存在しないスキルであればskill1のみから計算する
124         return sufficient_val
125         """
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
131             else:
132                 # cannot find skill1
133                 return None
134
135             if skill2_name in skill2_minmax:
136                 max2 = skill2_minmax[skill2_name]
137                 skill2_val = 0 if skill2_val < 0 else skill2_val
138             else:
139                 max2 = 1
140                 skill2_val = 0
141
142             if skill1_val > max1 or skill2_val > max2:
143                 # over value
144                 return None
145
146             suff_val = (10 * skill1_val) // max1 + (10 * skill2_val) // max2
147             return suff_val
148         else:
149             return None
150
151     u""" お守り検索 """
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)
159
160     u""" 錬金シミュレーター """
161     def simulate_nazo(self, seed1, seed2):
162         u""" なぞの錬金
163         return (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
164         """
165         return self._simulator.alchemy_nazo_name(seed1, seed2)
166
167     def simulate_komyou(self, seed1, seed2):
168         u""" 光明の錬金
169         return (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
170         """
171         return self._simulator.alchemy_komyou_name(seed1, seed2)
172
173     def simulate_inishie(self, seed1, seed2):
174         u""" いにしえの錬金
175         return (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
176         """
177         return self._simulator.alchemy_inishie_name(seed1, seed2)
178
179     def simulate_tenun(self, seed1, seed2, alchemy_key):
180         u""" 天運の錬金
181         return list of (skill1_name, skill1_val, skill2_name, skill2_val, slot_num, type_name)
182         """
183         return self._simulator.alchemy_tenun_name(seed1, seed2, alchemy_key)
184
185     def close(self):
186         u""" close database accessor """
187         self._cursor.close()
188         self._connect.close()
189
190 if __name__ == "__main__":
191     db = DataBaseAccessor("test.sqlite3")
192     #db._print_dicts()
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)
201
202     print "seeds: ", seeds
203     print "amu_id to seed2skill dict: ", skill_dic
204     print "seed2slot dict", slot_dic
205     db.close()