OSDN Git Service

marshal database generator & accessor
[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
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()
28
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)
38
39         self._minmax_dict_by_name = self._acc_minmax.get_minmax_by_name()
40
41     def select_seed2s(self, amu_name2skill_names):
42         u""" お守り名とスキル名のリストの辞書からSeed2を特定する 
43         skill_names: (skill_name1, skill_name2, ...., skill_name7)
44         不明であればNoneあるいはNO_DATAを入れておくものとする。
45         """
46         return self._acc_seed2skill2.select_seed2s_by_name(amu_name2skill_names)
47
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)
52
53
54     def get_minmax_dict(self, copied=False):
55         u""" お守り名と第1.第2スキル名ごとのの最大値を関連付けた辞書を返す
56         return {amulet_name:({skill1_name:(min1,max1)}, {skill2_name:(min2,max2)})}"""
57         if copied is True:
58             return self._minmax_dict_by_name.copy()
59         else:
60             return self._minmax_dict_by_name
61
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)
65
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)
69
70     def select_threshold_from_sufficient(self, amulet_name, sufficient_val):
71         u""" お守り名と充足値から、スロットごとの判定値を得る
72             return (slot1_th, slot2_th, slot3_th)
73         """
74         return self._acc_sufficient.select_thresholds_by_name(amulet_name, sufficient_val)
75
76     def select_names_from_seed2(self, seed2):
77         u""" 指定されたSeed2に対応するテーブルNo, 通しNo,
78         お守り名ごとの第2スキル名(1-7枠)、
79         判定値1(1-7枠)、判定値2(1-7枠)を返す
80         return: table_no, no, {amu_name:(skill2_names)}, threshold1s, threshold2s
81         """
82         #table no, no
83         table_no, no = self._acc_seed2no.get_table_no_from_seed2(seed2)
84         # skill2 dict
85         skill_dict = self._acc_seed2skill2.select_skill_names_by_seed2(seed2)
86         # threshold1s
87         th1s = self._acc_seed2threshold.select_thresholds_from_seed2(seed2, 1)
88         # threshold2s
89         th2s = self._acc_seed2threshold.select_thresholds_from_seed2(seed2, 2)
90
91         return table_no, no, skill_dict, th1s, th2s
92
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)
96
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         の辞書を得る。存在しない場所は空文字列で置き換えてある。
101         """
102         return self._acc_seed1tenun.select_names_from_seed1(seed1, key_alchemy)
103
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)
108
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)を辞書として返す。
112         ただし辞書のキーは通し番号とする。
113         値が存在しない場所は空文字列で埋める。
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)
116
117     def get_sufficient_value(self, amulet_name, skill1_name, skill2_name, skill1_val, skill2_val):
118         u""" 充足値を計算する。
119         指定したスキルが見つからない場合や、充足値を計算できない場合はNoneを返す 
120         skill2_nameが存在しないスキルであればskill1のみから計算する
121         return sufficient_val
122         """
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
128             else:
129                 # cannot find skill1
130                 return None
131
132             if skill2_name in skill2_minmax:
133                 max2 = skill2_minmax[skill2_name]
134                 skill2_val = 0 if skill2_val < 0 else skill2_val
135             else:
136                 max2 = 1
137                 skill2_val = 0
138
139             if skill1_val > max1 or skill2_val > max2:
140                 # over value
141                 return None
142
143             suff_val = (10 * skill1_val) // max1 + (10 * skill2_val) // max2
144             return suff_val
145         else:
146             return None
147
148     def close(self):
149         u""" close database accessor """
150         self._cursor.close()
151         self._connect.close()
152
153 if __name__ == "__main__":
154     db = DataBaseAccessor("test.sqlite3")
155     #db._print_dicts()
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)
164
165     print "seeds: ", seeds
166     print "amu_id to seed2skill dict: ", skill_dic
167     print "seed2slot dict", slot_dic
168     db.close()