OSDN Git Service

implemet almost gui events
[amulettoolsmh4/main.git] / model / db_accessor.py
index a44ffb9..42000b1 100644 (file)
@@ -4,6 +4,7 @@
 # 2013/12/04 written by kei9 
 
 import sqlite3
+import sys
 
 import db_supports
 from amuletskillsholder import AmuletSkillsHolder
@@ -19,7 +20,10 @@ class DataBaseAccessor(object):
         self._cursor = self._connect.cursor()
 
         self._skill_id2name_dict, self._skill_name2id_dict = self._get_skill_dict()
-        self._amulet_id2name_dict, self._amulet_name2id_dict, self._amulet_id2minmax_dict, self._amulet_id2second_dict, self._amulet_id2suff_dict = self._get_amulet_dict()
+        (self._amulet_id2name_dict, self._amulet_name2id_dict, 
+            self._amulet_id2minmax_table_dict, self._amulet_id2second_table_dict,
+            self._amulet_id2suff_table_dict,
+            self._amulet_id2skill1_id_dict, self._amulet_id2skill2_id_dict) = self._get_amulet_dict()
 
     def _print_dicts(self):
         u""" for debug """
@@ -27,9 +31,11 @@ class DataBaseAccessor(object):
         print self._skill_name2id_dict
         print self._amulet_id2name_dict
         print self._amulet_name2id_dict
-        print self._amulet_id2minmax_dict
-        print self._amulet_id2second_dict
-        print self._amulet_id2suff_dict
+        print self._amulet_id2minmax_table_dict
+        print self._amulet_id2second_table_dict
+        print self._amulet_id2suff_table_dict
+        print self._amulet_id2skill1_id_dict
+        print self._amulet_id2skill2_id_dict
 
     def get_dicts(self, clone_enable=False):
         u""" get all dicts 
@@ -38,25 +44,22 @@ class DataBaseAccessor(object):
 
             returns (skill_id2name_dict, skill_name2id_dict, 
                 amulet_id2name_dict, amulet_name2id_dict,
-                amulet_id2minmax_dict, amulet_id2second_dict,
-                amulet_id2stuff_dict)
+                amulet_id2skill_ids)
         """
         if clone_enable:
             return (dict(self._skill_id2name_dict), 
                     dict(self._skill_name2id_dict),
                     dict(self._amulet_id2name_dict), 
                     dict(self._amulet_name2id_dict),
-                    dict(self._amulet_id2minmax_dict),
-                    dict(self._amulet_id2second_dict),
-                    dict(self._amulet_id2stuff_dict))
+                    dict(self._amulet_id2skill1_id_dict),
+                    dict(self._amulet_id2skill2_id_dict))
         else:
             return (self._skill_id2name_dict, 
                     self._skill_name2id_dict,
                     self._amulet_id2name_dict, 
                     self._amulet_name2id_dict,
-                    self._amulet_id2minmax_dict, 
-                    self._amulet_id2second_dict,
-                    self._amulet_id2suff_dict)
+                    self._amulet_id2skill1_id_dict,
+                    self._amulet_id2skill2_id_dict)
 
 
     def _get_skill_dict(self):
@@ -73,11 +76,14 @@ class DataBaseAccessor(object):
         return skill_id2name_dict, skill_name2id_dict
 
     def _get_amulet_dict(self):
-        u""" create id2name, name2id, id2minmax, id2second, id2suff dict of amulet 
-            return (dict_id2name, dict_name2id, id2minmax, id2second, id2suff)
+        u""" create id2name, name2id, id2minmax_table, id2second_table, id2suff_table,
+            id2skill1_ids, id2skill2_id dict of amulet 
+        return (dict_id2name, dict_name2id, 
+            id2minmax_table, id2second_table, id2suff_table, id2skill1_ids, id2skill2_ids)
         """
         amulet_id2name_dict, amulet_name2id_dict = {}, {}
-        id2minmax, id2second, id2suff = {}, {}, {}
+        id2minmax_table, id2second_table, id2suff_table = {}, {}, {}
+        id2skill1_ids, id2skill2_ids = {}, {}
         self._cursor.execute(db_supports.AMULET_TABLE_SELECT_ALL_SQL)
         for val in self._cursor.fetchall():
             amulet_id, name = val[0], val[1]
@@ -88,21 +94,37 @@ class DataBaseAccessor(object):
         self._cursor.execute(db_supports.MIN_MAX_MASTER_TABLE_SELECT_ALL_SQL)
         for val in self._cursor.fetchall():
             amulet_id, table = val[0], val[1]
-            id2minmax[amulet_id] = table
+            id2minmax_table[amulet_id] = table
  
         # id 2 second table name
         self._cursor.execute(db_supports.SECOND_MASTER_TABLE_SELECT_ALL_SQL)
         for val in self._cursor.fetchall():
             amulet_id, table = val[0], val[1]
-            id2second[amulet_id] = table
+            id2second_table[amulet_id] = table
 
         # id 2 sufficient table name
-        self._cursor.execute(db_supports.MIN_MAX_MASTER_TABLE_SELECT_ALL_SQL)
+        self._cursor.execute(db_supports.SUFFICIENT_MASTER_TABLE_SELECT_ALL_SQL)
         for val in self._cursor.fetchall():
             amulet_id, table = val[0], val[1]
-            id2suff[amulet_id] = table
+            id2suff_table[amulet_id] = table
+
+        # id 2 non zero skill1 ids
+        # id 2 non zero skill2 ids
+        for amu_id in amulet_id2name_dict.keys():
+            table = id2minmax_table[amu_id]
+            sql = db_supports.MIN_MAX_TABLE_SELECT_NON_ZERO_SKILL1_ID_SQL.format(table_name=table)
+            self._cursor.execute(sql)
+            ls = [x[0] for x in self._cursor.fetchall()]
+            id2skill1_ids[amu_id] = tuple(ls)
+
+            sql = db_supports.MIN_MAX_TABLE_SELECT_NON_ZERO_SKILL2_ID_SQL.format(table_name=table)
+            self._cursor.execute(sql)
+            ls = [x[0] for x in self._cursor.fetchall()]
+            id2skill2_ids[amu_id] = tuple(ls)
 
-        return amulet_id2name_dict, amulet_name2id_dict, id2minmax, id2second, id2suff
+        return (amulet_id2name_dict, amulet_name2id_dict, 
+                id2minmax_table, id2second_table, id2suff_table,
+                id2skill1_ids, id2skill2_ids)
 
     def select_seeds(self, amu_id2skill_id_list_dict):
         u""" from dict of amulet_id to skill_id_list,
@@ -110,8 +132,8 @@ class DataBaseAccessor(object):
         """
         seed_set = None
         for key, val in amu_id2skill_id_list_dict.items():
-            if key in self._amulet_id2second_dict:
-                second_skill_table = self._amulet_id2second_dict[key]
+            if key in self._amulet_id2second_table_dict:
+                second_skill_table = self._amulet_id2second_table_dict[key]
                 amulet_skill = AmuletSkillsHolder(val)
 
                 if amulet_skill.is_empty():
@@ -130,11 +152,37 @@ class DataBaseAccessor(object):
         else:
             return seed_set
 
+    def select_seeds_from_sufficient_val(self, amu_id, sufficient_val, slot_num, skill2_id):
+        u""" get seeds set from slot number, skill2_id, amulet id, sufficient value
+        """
+        if amu_id in self._amulet_id2name_dict.keys():
+            table = self._amulet_id2suff_table_dict[amu_id]
+            sql = db_supports.SUFFICIENT_TABLE_SELECT_THRESHOLDS_SQL.format(
+                    table_name=table, sufficient_val=sufficient_val)
+            self._cursor.execute(sql)
+            try:
+                threshold2 = self._cursor.fetchone()[slot_num-1]
+            except TypeError, e:
+                threshold2 = None
+
+            if threshold2 is not None:
+                table = self._amulet_id2second_table_dict[amu_id]
+                sql = db_supports.SECOND_SLOT_TABLE_SELECT_SEEDS_FROM_THRESHOLD_AND_SKILL2_SQL.format(
+                        threshold=threshold2,
+                        skill_table=table,
+                        skill_id=skill2_id)
+                self._cursor.execute(sql)
+                return set([x[0] for x in self._cursor.fetchall()])
+            else:
+                return set()
+        else:
+            return set()
+
     def select_minmax_from_skill_ids(self, amulet_id, skill_ids):
         u""" お守りのidとスキルidのリストから、スキルIDと取りうるスキルの最大最小値の辞書を得る
             return dict{skill_id:(min1, max1, min2, max2)}
         """
-        minmax_table = self._amulet_id2minmax_dict[amulet_id]
+        minmax_table = self._amulet_id2minmax_table_dict[amulet_id]
         amulet_skill = AmuletSkillsHolder(skill_ids)
         result_dict = {}
         if amulet_skill.is_empty() is False:
@@ -142,14 +190,14 @@ class DataBaseAccessor(object):
             self._cursor.execute(sql)
 
             for row in self._cursor.fetchall():
-                result_dict[row[0]] = tuple(row[1])
+                result_dict[row[0]] = tuple(row[1:])
         return result_dict
 
     def select_threshold_from_sufficient(self, amulet_id, sufficient_vals):
         u""" お守りのidと充足値のリストから、充足値とスロットごとの判定値の辞書を得る
             return dict({sufficient_val:(slot1_th, slot2_th, slot3_th)})
         """
-        suff_table = self._amulet_id2suff_dict[amulet_id]
+        suff_table = self._amulet_id2suff_table_dict[amulet_id]
         amulet_skill = SufficientsHolder(sufficient_vals)
         result_dict = {}
         if amulet_skill.is_empty() is False:
@@ -162,14 +210,14 @@ class DataBaseAccessor(object):
 
     def select_skills_from_seeds(self, seed_set):
         u""" get amulet id to (random_seed to skill ids dict) dict,
-        and rendom_seed to slot value dict
+        and random_seed to slot value dict
         return: skill_dict, slot_dict
         """
         skill_dict, slot_dict = {}, {}
 
         # skill dict
         seeds = RandomSeedsHolder(seed_set)
-        for amu_id, table in self._amulet_id2second_dict.items():
+        for amu_id, table in self._amulet_id2second_table_dict.items():
             sql = db_supports.SECOND_TABLE_SELECT_ALL_SQL.format(
                     table_name=table) + seeds.get_where_sql()
             self._cursor.execute(sql)
@@ -186,6 +234,91 @@ class DataBaseAccessor(object):
 
         return skill_dict, slot_dict
 
+    def get_sufficient_value(self, amu_id, skill1_id, skill2_id, skill1_val, skill2_val):
+        u""" 充足値を計算する。
+        指定したスキルが見つからない場合はNoneを返す 
+        return (sufficient_val, max1, max2)
+        """
+        
+        if amu_id in self._amulet_id2minmax_table_dict:
+            table = self._amulet_id2minmax_table_dict[amu_id]
+            sql = db_supports.MIN_MAX_TABLE_SELECT_MAX1_OF_SKILL_SQL.format(
+                    table_name=table,skill_id=skill1_id)
+            self._cursor.execute(sql)
+            max1 = self._cursor.fetchone()[0]
+            sql = db_supports.MIN_MAX_TABLE_SELECT_MAX2_OF_SKILL_SQL.format(
+                    table_name=table,skill_id=skill2_id)
+            self._cursor.execute(sql)
+            max2 = self._cursor.fetchone()[0]
+
+            if max1 is None or max2 is None:
+                return None
+
+            #print skill1_val, "/", max1 , skill2_val, "/", max2
+            try:
+                skill1_val = max1 if skill1_val > max1 else skill1_val
+                skill2_val = max2 if skill2_val > max2 else skill2_val
+                val1 = (10 * skill1_val) // max1 if skill1_val >= 0 else 0
+                val2 = (10 * skill2_val) // max2 if skill2_val >= 0 else 0
+            except TypeError, e:
+                return None
+            except ZeroDivisionError, e:
+                return None
+            else:
+                return  (val1 + val2, max1, max2)
+
+        else:
+            return None
+
+    def get_skill_minmax(self):
+        u""" 全てのお守りのスキルにおいて、その最大値と最小値を返す 
+            return (min1, max1, min2, max2)
+        """
+        min1_ls, max1_ls, min2_ls, max2_ls = [],[],[],[]
+        # get min max of each amulet
+        for amu_id, table in self._amulet_id2minmax_table_dict.items():
+            sql = db_supports.MIN_MAX_TABLE_SELECT_MIN1_SQL.format(table_name=table)
+            self._cursor.execute(sql)
+            min1_ls.append(self._cursor.fetchone()[0])
+
+            sql = db_supports.MIN_MAX_TABLE_SELECT_MAX1_SQL.format(table_name=table)
+            self._cursor.execute(sql)
+            max1_ls.append(self._cursor.fetchone()[0])
+
+            sql = db_supports.MIN_MAX_TABLE_SELECT_MIN2_SQL.format(table_name=table)
+            self._cursor.execute(sql)
+            min2_ls.append(self._cursor.fetchone()[0])
+
+            sql = db_supports.MIN_MAX_TABLE_SELECT_MAX2_SQL.format(table_name=table)
+            self._cursor.execute(sql)
+            max2_ls.append(self._cursor.fetchone()[0])
+
+        return (min(min1_ls), max(max1_ls), min(min2_ls), max(max2_ls))
+
+    def get_skill_ids(self, amulet_id):
+        u""" 全てのお守りのスキルにおいて、その最大値と最小値を返す 
+            return (min1, max1, min2, max2)
+        """
+        min1_ls, max1_ls, min2_ls, max2_ls = [],[],[],[]
+        # get min max of each amulet
+        for amu_id, table in self._amulet_id2minmax_table_dict.items():
+            sql = db_supports.MIN_MAX_TABLE_SELECT_MIN1_SQL.format(table_name=table)
+            self._cursor.execute(sql)
+            min1_ls.append(self._cursor.fetchone()[0])
+
+            sql = db_supports.MIN_MAX_TABLE_SELECT_MAX1_SQL.format(table_name=table)
+            self._cursor.execute(sql)
+            max1_ls.append(self._cursor.fetchone()[0])
+
+            sql = db_supports.MIN_MAX_TABLE_SELECT_MIN2_SQL.format(table_name=table)
+            self._cursor.execute(sql)
+            min2_ls.append(self._cursor.fetchone()[0])
+
+            sql = db_supports.MIN_MAX_TABLE_SELECT_MAX2_SQL.format(table_name=table)
+            self._cursor.execute(sql)
+            max2_ls.append(self._cursor.fetchone()[0])
+
+        return (min(min1_ls), max(max1_ls), min(min2_ls), max(max2_ls))
 
     def close(self):
         u""" close database accessor """