# 2013/12/04 written by kei9
import sqlite3
+import sys
import db_supports
from amuletskillsholder import AmuletSkillsHolder
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 """
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
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):
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]
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,
"""
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():
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:
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:
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)
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 """