*.swp
*.sqlite3
*.bak
+settings
import threading
import time
import os.path
+import pickle
+import sqlite3
import wx
import view
import model
+SETTING_FILE = u"settings"
+SETTING_THRESHOLD = u"threshold"
+SETTING_SKILLS = u"skills"
class AmuletToolController(wx.App):
u""" アプリケーションの制御クラス """
def OnInit(self):
+ self._read_settings()
self.frame_view = view.MainFrameView("view")
-
+
self._init_events()
self.frame_view.Show()
+ self.frame_view.DisableNoteBook()
+
self._init_database()
+ self._set_views()
+
+ self.frame_view.EnableNoteBook()
return True
def _init_events(self):
# menu event
frame.Bind(wx.EVT_MENU, self.OnClose, id=self.frame_view.ID_MENU_ITEM_EXIT)
frame.Bind(wx.EVT_MENU, self.OnAboutBox, id=self.frame_view.ID_MENU_ITEM_ABOUT)
+ frame.Bind(wx.EVT_CLOSE, self.CloseHandler)
+
+ # button event
+ frame.Bind(wx.EVT_BUTTON, self.OnClickSeedSearch, id=self.frame_view.ID_BUTTON_SEED_SEARCH)
+ frame.Bind(wx.EVT_BUTTON, self.OnClickSeedClear, id=self.frame_view.ID_BUTTON_SEED_CLEAR)
+ frame.Bind(wx.EVT_BUTTON, self.OnClickSkillSearchFromSeed, id=self.frame_view.ID_BUTTON_SKILL_FROM_SEED_SEARCH)
+ frame.Bind(wx.EVT_BUTTON, self.OnClickSkillSearch, id=self.frame_view.ID_BUTTON_SKILL_SEARCH)
+ frame.Bind(wx.EVT_BUTTON, self.OnClickSkillClear, id=self.frame_view.ID_BUTTON_SKILL_CLEAR)
+ frame.Bind(wx.EVT_BUTTON, self.OnClickAmuletSearch, id=self.frame_view.ID_BUTTON_AMULET_SEARCH_SEARCH)
+ frame.Bind(wx.EVT_BUTTON, self.OnClickAmuletClear, id=self.frame_view.ID_BUTTON_AMULET_SEARCH_CLEAR)
+ frame.Bind(wx.EVT_BUTTON, self.OnClickSkillSearchFromAmulet, id=self.frame_view.ID_BUTTON_AMULET_SEARCH_SKILL)
+ frame.Bind(wx.EVT_BUTTON, self.OnClickSettingOK, id=self.frame_view.ID_BUTTON_SETTING_OK)
+ frame.Bind(wx.EVT_BUTTON, self.OnClickSettingClear, id=self.frame_view.ID_BUTTON_SETTING_CLEAR)
+
+ # radio button event
+ frame.Bind(wx.EVT_RADIOBUTTON, self.OnClickAmuletRadio, id=self.frame_view.ID_RADIO_BUTTON_AMULET1)
+ frame.Bind(wx.EVT_RADIOBUTTON, self.OnClickAmuletRadio, id=self.frame_view.ID_RADIO_BUTTON_AMULET2)
+ frame.Bind(wx.EVT_RADIOBUTTON, self.OnClickAmuletRadio, id=self.frame_view.ID_RADIO_BUTTON_AMULET3)
+
+ # combo box event
+ frame.Bind(wx.EVT_COMBOBOX, self.OnClickAmuletCombo, id=self.frame_view.ID_COMBO_BOX_AMULET_SEARCH_SKILL1)
+ frame.Bind(wx.EVT_COMBOBOX, self.OnClickAmuletCombo, id=self.frame_view.ID_COMBO_BOX_AMULET_SEARCH_SKILL2)
def _init_database(self):
u""" DBの初期設定 """
if not os.path.exists(model.DB_FILE_NAME):
u""" DBが存在しない時は再生成する """
frame = self.frame_view.frame
- generator = model.DataBaseGenerator(model.DB_FILE_NAME)
- #generator = model.DataBaseGenerator()
-
- dlg_view = view.GaugeDialogView("view")
- def _loop():
- while t1.is_alive():
- dlg_view.gauge.Pulse()
- time.sleep(0.2)
- dlg_view.finish_generation()
-
- t1 = threading.Thread(target=generator.generate_db)
- t2 = threading.Thread(target=_loop)
- t1.start()
- t2.start()
-
- dlg_view.ShowModal()
- t1.join()
- t2.join()
- dlg_view.Destroy()
+ try:
+ generator = model.DataBaseGenerator(model.DB_FILE_NAME)
+ #generator = model.DataBaseGenerator()
+
+ dlg_view = view.GaugeDialogView("view")
+ def _loop():
+ while t1.is_alive():
+ dlg_view.gauge.Pulse()
+ time.sleep(0.2)
+ dlg_view.finish_generation()
+
+ t1 = threading.Thread(target=generator.generate_db)
+ t2 = threading.Thread(target=_loop)
+ t1.start()
+ t2.start()
+
+ dlg_view.ShowModal()
+ t1.join()
+ t2.join()
+ dlg_view.Destroy()
+ except sqlite3.Error as e:
+ self._show_error_dialog(u"データベース生成中にエラーが発生しました")
# access to db
- db_accessor = model.DataBaseAccessor(model.DB_FILE_NAME)
+ try:
+ self.db_accessor = model.DataBaseAccessor(model.DB_FILE_NAME)
+ except sqlite3.Error as e:
+ self._show_error_dialog(u"データベースが壊れています")
+
+ # get dictionaries
+ (self._skill_id2name_dict,
+ self._skill_name2id_dict,
+ self._amulet_id2name_dict,
+ self._amulet_name2id_dict,
+ self._amulet_id2skill1_id_dict,
+ self._amulet_id2skill2_id_dict) = self.db_accessor.get_dicts()
+
+
+ def _set_views(self):
+ u""" GUIにDBの各種値をセットする """
+ self._set_combo_views()
+ self._set_spin_views()
+ self._set_check_list_views()
+
+ def _set_combo_views(self):
+ u""" ComboBoxの値をセットする """
+ combo_dict = self.frame_view.combo_box_skill_dict
+
+ u" 各種お守りの第2スキル選択 "
+ for amu_key, amu_name in zip([view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3],
+ [view.NAME_AMULET1, view.NAME_AMULET2, view.NAME_AMULET3]):
+ amu_id = self._amulet_name2id_dict[amu_name]
+ skill_ids = self._amulet_id2skill2_id_dict[amu_id]
+ skill_names = [self._skill_id2name_dict[x] for x in skill_ids]
+ for combo in combo_dict[amu_key]:
+ combo.Clear()
+ combo.Append(u"なし")
+ for name in skill_names:
+ combo.Append(name)
+ combo.SetSelection(0)
+
+ # amulet search
+ amu_id = self._amulet_name2id_dict[view.NAME_AMULET1]
+ self._set_skill_list_from_amulet(amu_id)
+ self.frame_view.amulet2radio_button_dict[view.NAME_AMULET1].SetValue(True)
+
+ def _set_skill_list_from_amulet(self, amulet_id):
+ u""" お守り種類の選択が変わった時の動作 """
+ skill_selected = []
+ for i, (combo, skill_dict) in enumerate(zip(
+ [self.frame_view.combo_box_amulet_search_skill1,
+ self.frame_view.combo_box_amulet_search_skill2],
+ [self._amulet_id2skill1_id_dict, self._amulet_id2skill2_id_dict]
+ )):
+ combo.Clear()
+ skill_ids = skill_dict[amulet_id]
+ for skill_id in skill_ids:
+ combo.Append(self._skill_id2name_dict[skill_id])
+ skill_selected.append(skill_ids[i])
+ combo.SetSelection(i)
+ self._set_spin_range(amulet_id, skill_selected[0], skill_selected[1])
+
+ def _set_spin_views(self):
+ u""" Spin Ctrlの最大最小をセット"""
+ min1, max1, min2, max2 = self.db_accessor.get_skill_minmax()
+ self.frame_view.spin_ctrl_amulet_search_slot_num.SetRange(view.SLOT_MIN, view.SLOT_MAX)
+ self.frame_view.spin_ctrl_highlight.SetRange(view.THRESHOLD2_MIN, view.THRESHOLD2_MAX)
+ self.frame_view.spin_ctrl_highlight.SetValue(self._highlight_threshold)
+
+ def _set_check_list_views(self):
+ u""" CheckListBoxの値のセット """
+ checklist = self.frame_view.check_list_box_highlight_skill
+ checklist.SetItems(self._skill_name2id_dict.keys())
+ checklist.SetCheckedStrings([self._skill_id2name_dict[x] for x in self._highlight_skills])
+
+ def _set_spin_range(self, amulet_id, skill1_id, skill2_id):
+ u""" スキルに応じてSpinCtrlの最大最小をセットする """
+ minmax_dict = self.db_accessor.select_minmax_from_skill_ids(amulet_id, [skill1_id, skill2_id])
+ min1, max1 = minmax_dict[skill1_id][0], minmax_dict[skill1_id][1]
+ min2, max2 = minmax_dict[skill2_id][2], minmax_dict[skill2_id][3]
+ self.frame_view.spin_ctrl_amulet_search_skill1_val.SetRange(min1, max1)
+ self.frame_view.spin_ctrl_amulet_search_skill2_val.SetRange(min2, max2)
+
+ def OnClickSeedSearch(self, evt):
+ u""" search seeds from selected skills """
+ amu_id2skill_id_list_dict = {}
+ for amu_key, amu_name in zip([view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3],
+ [view.NAME_AMULET1, view.NAME_AMULET2, view.NAME_AMULET3]):
+ amu_id = self._amulet_name2id_dict[amu_name]
+ ls = []
+ for combo in self.frame_view.combo_box_skill_dict[amu_key]:
+ name = combo.GetStringSelection()
+ if name not in self._skill_name2id_dict:
+ ls.append(None)
+ else:
+ ls.append(self._skill_name2id_dict[name])
+ amu_id2skill_id_list_dict[amu_id] = ls
+ seed_sets = self.db_accessor.select_seeds(amu_id2skill_id_list_dict)
+ self.frame_view.text_ctrl_seed_result.SetValue(u"""Seedの候補は{0}個です。""".format(len(seed_sets)))
+ if len(seed_sets) > 0:
+ for seed in seed_sets:
+ self.frame_view.list_box_seed.Append(u"{0}".format(seed))
+ self.frame_view.list_box_seed.SetSelection(0)
+ self.frame_view.button_skill_from_seed_search.Enable()
+ def OnClickSeedClear(self, evt):
+ u""" reset seed search settings of combo box"""
+ combo_dict = self.frame_view.combo_box_skill_dict
+ for amu_key in [view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3]:
+ for combo in combo_dict[amu_key]:
+ combo.SetSelection(0)
+ self.frame_view.button_skill_from_seed_search.Disable()
+ self.frame_view.list_box_seed.Clear()
+ def OnClickSkillSearchFromSeed(self, evt):
+ u""" change page to skill search from seed"""
+ seed = self.frame_view.list_box_seed.GetStringSelection()
+ if seed.isdigit():
+ self.frame_view.text_ctrl_seed_select.SetValue(seed)
+ self.frame_view.note_book.SetSelection(view.SKILL_SEARCH_PAGE)
+ self.OnClickSkillSearch(evt)
+
+ def OnClickSkillSearch(self, evt):
+ u""" skill search from seed"""
+ seed = self.frame_view.text_ctrl_seed_select.GetValue()
+ if seed.isdigit():
+ seed = int(seed)
+ skill_dict, threshold2_dict = self.db_accessor.select_skills_from_seeds([seed])
+
+ try:
+ text_ctrl_dict = self.frame_view.text_ctrl_seed_skill_dict
+ for amu_key, amu_name in zip([view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3],
+ [view.NAME_AMULET1, view.NAME_AMULET2, view.NAME_AMULET3]):
+ amu_id = self._amulet_name2id_dict[amu_name]
+ for txt_ctr, skill_id in zip(text_ctrl_dict[amu_key], skill_dict[amu_id][seed]):
+ txt_ctr.SetValue(self._skill_id2name_dict[skill_id])
+ for txt_ctr, threshold2 in zip(text_ctrl_dict[view.KEY_THRESHOLD2], threshold2_dict[seed]):
+ txt_ctr.SetValue(u"{0}".format(threshold2))
+ self._update_highlight()
+
+ except KeyError, e:
+ self._show_message_dialog(message=u"指定されたSeed値は存在しません")
+ else:
+ self._show_message_dialog(message=u"Seed値には数字を入力してください")
+
+ def OnClickSkillClear(self, evt):
+ u""" clear skills from seed """
+ text_ctrl_dict = self.frame_view.text_ctrl_seed_skill_dict
+ for amu_key, amu_name in zip([view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3],
+ [view.NAME_AMULET1, view.NAME_AMULET2, view.NAME_AMULET3]):
+ amu_id = self._amulet_name2id_dict[amu_name]
+ for txt_ctr in text_ctrl_dict[amu_key]:
+ txt_ctr.Clear()
+ for txt_ctr in text_ctrl_dict[view.KEY_THRESHOLD2]:
+ txt_ctr.Clear()
+ self.frame_view.list_box_seed_skill_amulet_prospect.Clear()
+
+ def OnClickAmuletRadio(self, evt):
+ u""" switch skill lists by amulet id """
+ btn_id = evt.GetId()
+ if btn_id == self.frame_view.ID_RADIO_BUTTON_AMULET1:
+ amu_id = self._amulet_name2id_dict[view.NAME_AMULET1]
+ elif btn_id == self.frame_view.ID_RADIO_BUTTON_AMULET2:
+ amu_id = self._amulet_name2id_dict[view.NAME_AMULET2]
+ elif btn_id == self.frame_view.ID_RADIO_BUTTON_AMULET3:
+ amu_id = self._amulet_name2id_dict[view.NAME_AMULET3]
+ else:
+ return
+ self._set_skill_list_from_amulet(amu_id)
+
+ def OnClickAmuletCombo(self, evt):
+ u""" switch skill minmax by amulet id and skill_id"""
+ skill1_name = self.frame_view.combo_box_amulet_search_skill1.GetStringSelection()
+ skill2_name = self.frame_view.combo_box_amulet_search_skill2.GetStringSelection()
+ skill1_id = self._skill_name2id_dict[skill1_name]
+ skill2_id = self._skill_name2id_dict[skill2_name]
+ if self.frame_view.amulet2radio_button_dict[view.NAME_AMULET1].GetValue():
+ amu_id = self._amulet_name2id_dict[view.NAME_AMULET1]
+ elif self.frame_view.amulet2radio_button_dict[view.NAME_AMULET2].GetValue():
+ amu_id = self._amulet_name2id_dict[view.NAME_AMULET2]
+ elif self.frame_view.amulet2radio_button_dict[view.NAME_AMULET3].GetValue():
+ amu_id = self._amulet_name2id_dict[view.NAME_AMULET3]
+ else:
+ raise IndexError(u"amulet id is unknown")
+ self._set_spin_range(amu_id, skill1_id, skill2_id)
+
+
+ def OnClickAmuletSearch(self, evt):
+ u""" search seeds from amulet condition """
+ skill1_name = self.frame_view.combo_box_amulet_search_skill1.GetStringSelection()
+ skill2_name = self.frame_view.combo_box_amulet_search_skill2.GetStringSelection()
+ skill1_val = self.frame_view.spin_ctrl_amulet_search_skill1_val.GetValue()
+ skill2_val = self.frame_view.spin_ctrl_amulet_search_skill2_val.GetValue()
+ slot_val = self.frame_view.spin_ctrl_amulet_search_slot_num.GetValue()
+ if self.frame_view.amulet2radio_button_dict[view.NAME_AMULET1].GetValue():
+ amu_id = self._amulet_name2id_dict[view.NAME_AMULET1]
+ elif self.frame_view.amulet2radio_button_dict[view.NAME_AMULET2].GetValue():
+ amu_id = self._amulet_name2id_dict[view.NAME_AMULET2]
+ elif self.frame_view.amulet2radio_button_dict[view.NAME_AMULET3].GetValue():
+ amu_id = self._amulet_name2id_dict[view.NAME_AMULET3]
+ else:
+ raise IndexError(u"amulet id is unknown")
+
+ list_box = self.frame_view.list_box_amulet_search_seeds
+ if skill1_name == skill2_name:
+ self._show_message_dialog(message=u"異なるスキルを選択してください")
+ elif skill1_val == 0 or skill2_val == 0:
+ self._show_message_dialog(message=u"スキルの値には0以外を指定してください")
+ else:
+ skill1_id = self._skill_name2id_dict[skill1_name]
+ skill2_id = self._skill_name2id_dict[skill2_name]
+ suff_dict = {}
+ tup = self.db_accessor.get_sufficient_value(
+ amu_id, skill1_id, skill2_id, skill1_val, skill2_val)
+ if tup is not None:
+ suff_val = tup[0]
+ seeds_set = self.db_accessor.select_seeds_from_sufficient_val(amu_id, suff_val, slot_val, skill2_id)
+ if len(seeds_set) > 0:
+ self.frame_view.text_ctrl_amulet_search_result.SetValue(
+ u"{0}個のSeedで出現するお守りです".format(len(seeds_set)))
+ list_box.Clear()
+ for seed in seeds_set:
+ list_box.Append(u"{0}".format(seed))
+ list_box.SetSelection(0)
+ self.frame_view.button_amulet_search_skill.Enable()
+ else:
+ self.frame_view.text_ctrl_amulet_search_result.SetValue(
+ u"指定されたお守りは見つかりませんでした")
+ self.frame_view.button_amulet_search_skill.Disable()
+ list_box.Clear()
+ else:
+ self.frame_view.text_ctrl_amulet_search_result.SetValue(
+ u"指定されたお守りは見つかりませんでした")
+ self.frame_view.button_amulet_search_skill.Disable()
+ list_box.Clear()
+
+ def OnClickAmuletClear(self, evt):
+ u""" clear amulet conditions """
+ amu_id = self._amulet_name2id_dict[view.NAME_AMULET1]
+ self._set_skill_list_from_amulet(amu_id)
+ self.frame_view.amulet2radio_button_dict[view.NAME_AMULET1].SetValue(True)
+ self.frame_view.button_amulet_search_skill.Disable()
+ self.frame_view.text_ctrl_amulet_search_result.SetValue(u"")
+ self.frame_view.list_box_amulet_search_seeds.Clear()
+
+ def OnClickSkillSearchFromAmulet(self, evt):
+ u""" change page to skill search from amulet"""
+ seed = self.frame_view.list_box_amulet_search_seeds.GetStringSelection()
+ if seed.isdigit():
+ self.frame_view.text_ctrl_seed_select.SetValue(seed)
+ self.frame_view.note_book.SetSelection(view.SKILL_SEARCH_PAGE)
+ self.OnClickSkillSearch(evt)
+
+ def OnClickSettingOK(self, evt):
+ u""" get settings of setting tab """
+ self._highlight_threshold = self.frame_view.spin_ctrl_highlight.GetValue()
+ self._highlight_skills = set([self._skill_name2id_dict[x] for x in
+ self.frame_view.check_list_box_highlight_skill.GetCheckedStrings()
+ if x in self._skill_name2id_dict])
+ self._update_highlight()
+
+ def OnClickSettingClear(self, evt):
+ u""" reset settings of setting tab """
+ self._highlight_threshold = view.HIGHLIGHT_THRESHOLD
+ self.frame_view.spin_ctrl_highlight.SetValue(view.HIGHLIGHT_THRESHOLD)
+ self._highlight_skills = set()
+ for idx in self.frame_view.check_list_box_highlight_skill.GetChecked():
+ self.frame_view.check_list_box_highlight_skill.Check(idx, False)
+ self._update_highlight()
+
+ def _update_highlight(self):
+ u""" update highlight cells """
+ text_dict = self.frame_view.text_ctrl_seed_skill_dict
+ for key in [view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3]:
+ for text_ctrl in text_dict[key]:
+ val = text_ctrl.GetValue()
+ if (val in self._skill_name2id_dict and
+ self._skill_name2id_dict[val] in self._highlight_skills):
+ text_ctrl.SetBackgroundColour("Yellow")
+ else:
+ text_ctrl.SetBackgroundColour(wx.NullColor)
+ for text_ctrl in text_dict[view.KEY_THRESHOLD2]:
+ val = text_ctrl.GetValue()
+ if val.isdigit() and int(val) >= self._highlight_threshold:
+ text_ctrl.SetBackgroundColour("Yellow")
+ else:
+ text_ctrl.SetBackgroundColour(wx.NullColor)
+
+
+ def _show_error_dialog(self, message=u"予期せぬエラーが発生しました", caption=u"エラー"):
+ u""" エラーダイアログを表示し、
+ OKボタンが押されたらアプリケーションを終了する
+ """
+ dlg = wx.MessageDialog(self.frame_view.frame,
+ message,
+ caption, wx.OK | wx.ICON_ERROR)
+ dlg.ShowModal()
+ dlg.Destroy()
+ wx.Exit()
+
+ def _show_message_dialog(self, message, caption=u"メッセージ"):
+ u""" メッセージダイアログを表示する
+ """
+ dlg = wx.MessageDialog(self.frame_view.frame,
+ message,
+ caption, wx.OK | wx.ICON_INFORMATION)
+ dlg.ShowModal()
+ dlg.Destroy()
+
+ def CloseHandler(self, evt):
+ dlg = wx.MessageDialog(parent = self.frame_view.frame,
+ message = u"終了します。よろしいですか?",
+ caption = u"終了確認",
+ style = wx.YES_NO)
+ result = dlg.ShowModal()
+ dlg.Destroy()
+ if result == wx.ID_YES:
+ self._write_settings()
+ wx.Exit()
def OnClose(self, evt):
self.frame_view.Close()
info = self.frame_view.GetAboutInfo()
wx.AboutBox(info)
+ def _write_settings(self):
+ with open(SETTING_FILE, mode="w") as f:
+ data = {SETTING_THRESHOLD:self._highlight_threshold,
+ SETTING_SKILLS:self._highlight_skills}
+ pickle.dump(data, f)
+
+ def _read_settings(self):
+ if os.path.exists(SETTING_FILE):
+ with open(SETTING_FILE, mode="r") as f:
+ try:
+ data = pickle.load(f)
+ self._highlight_threshold = data[SETTING_THRESHOLD]
+ self._highlight_skills = data[SETTING_SKILLS]
+ except EOFError, e:
+ self._highlight_threshold = view.HIGHLIGHT_THRESHOLD
+ self._highlight_skills = set()
+ else:
+ self._highlight_threshold = view.HIGHLIGHT_THRESHOLD
+ self._highlight_skills = set()
+
if __name__ == "__main__":
app = AmuletToolController(False)
app.MainLoop()
+
# 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 """
max1=MIN_MAX_COL_MAX1,
min2=MIN_MAX_COL_MIN2,
max2=MIN_MAX_COL_MAX2)
-
+MIN_MAX_TABLE_SELECT_NON_ZERO_SKILL1_ID_SQL = u"""select {skill_id} from {{table_name}}
+ where {min1} != 0 and {max1} != 0""".format(
+ skill_id=MIN_MAX_COL_SKILL_ID,
+ min1=MIN_MAX_COL_MIN1,
+ max1=MIN_MAX_COL_MAX1)
+MIN_MAX_TABLE_SELECT_NON_ZERO_SKILL2_ID_SQL = u"""select {skill_id} from {{table_name}}
+ where {min2} != 0 and {max2} != 0""".format(
+ skill_id=MIN_MAX_COL_SKILL_ID,
+ min2=MIN_MAX_COL_MIN2,
+ max2=MIN_MAX_COL_MAX2)
+MIN_MAX_TABLE_SELECT_MIN1_SQL = u"""select min({col}) from {{table_name}} """.format(
+ col=MIN_MAX_COL_MIN1)
+MIN_MAX_TABLE_SELECT_MAX1_SQL = u"""select max({col}) from {{table_name}} """.format(
+ col=MIN_MAX_COL_MAX1)
+MIN_MAX_TABLE_SELECT_MIN2_SQL = u"""select min({col}) from {{table_name}} """.format(
+ col=MIN_MAX_COL_MIN2)
+MIN_MAX_TABLE_SELECT_MAX2_SQL = u"""select max({col}) from {{table_name}} """.format(
+ col=MIN_MAX_COL_MAX2)
+MIN_MAX_TABLE_SELECT_MAX1_OF_SKILL_SQL = u"""select max({col}) from {{table_name}}
+ where skill_id={{skill_id}}""".format(
+ col=MIN_MAX_COL_MAX1)
+MIN_MAX_TABLE_SELECT_MAX2_OF_SKILL_SQL = u"""select max({col}) from {{table_name}}
+ where skill_id={{skill_id}}""".format(
+ col=MIN_MAX_COL_MAX2)
# for Second skill
SECOND_MASTER_TABLE_NAME = u"skill_second_master"
slot5=SECOND_COL_SLOT5,
slot6=SECOND_COL_SLOT6,
slot7=SECOND_COL_SLOT7)
+SECOND_SLOT_TABLE_SELECT_SEEDS_FROM_THRESHOLD_AND_SKILL2_SQL = u"""
+ select {slot_table}.{seed} from {slot_table}
+ inner join {{skill_table}} on {slot_table}.{seed} = {{skill_table}}.{seed}
+ where ({{skill_table}}.{skill_id1} == {{skill_id}} and {slot_table}.{slot1} >= {{threshold}}) or
+ ({{skill_table}}.{skill_id2} == {{skill_id}} and {slot_table}.{slot2} >= {{threshold}}) or
+ ({{skill_table}}.{skill_id3} == {{skill_id}} and {slot_table}.{slot3} >= {{threshold}}) or
+ ({{skill_table}}.{skill_id4} == {{skill_id}} and {slot_table}.{slot4} >= {{threshold}}) or
+ ({{skill_table}}.{skill_id5} == {{skill_id}} and {slot_table}.{slot5} >= {{threshold}}) or
+ ({{skill_table}}.{skill_id6} == {{skill_id}} and {slot_table}.{slot6} >= {{threshold}}) or
+ ({{skill_table}}.{skill_id7} == {{skill_id}} and {slot_table}.{slot7} >= {{threshold}})
+ """.format(
+ slot_table=SECOND_SLOT_TABLE_NAME,
+ seed=SECOND_COL_RANDOM_SEED,
+ skill_id1=SECOND_COL_SKILL_ID1,
+ skill_id2=SECOND_COL_SKILL_ID2,
+ skill_id3=SECOND_COL_SKILL_ID3,
+ skill_id4=SECOND_COL_SKILL_ID4,
+ skill_id5=SECOND_COL_SKILL_ID5,
+ skill_id6=SECOND_COL_SKILL_ID6,
+ skill_id7=SECOND_COL_SKILL_ID7,
+ slot1=SECOND_COL_SLOT1,
+ slot2=SECOND_COL_SLOT2,
+ slot3=SECOND_COL_SLOT3,
+ slot4=SECOND_COL_SLOT4,
+ slot5=SECOND_COL_SLOT5,
+ slot6=SECOND_COL_SLOT6,
+ slot7=SECOND_COL_SLOT7)
# for sufficient value for slots
SUFFICIENT_MASTER_TABLE_NAME = u"sufficient_master"
slot1_val=SUFFICIENT_COL_SLOT1_THRESHOLD,
slot2_val=SUFFICIENT_COL_SLOT2_THRESHOLD,
slot3_val=SUFFICIENT_COL_SLOT3_THRESHOLD)
+SUFFICIENT_TABLE_SELECT_THRESHOLDS_SQL = u"""select {slot1_val}, {slot2_val}, {slot3_val} from {{table_name}}
+ where {sufficient_val}={{sufficient_val}}""".format(
+ sufficient_val=SUFFICIENT_COL_SUFFICIENT_VALUE,
+ slot1_val=SUFFICIENT_COL_SLOT1_THRESHOLD,
+ slot2_val=SUFFICIENT_COL_SLOT2_THRESHOLD,
+ slot3_val=SUFFICIENT_COL_SLOT3_THRESHOLD)
+
# 2013/12/05 written by kei9
# for dict
-KEY_AMULET1 = "amulet1"
-KEY_AMULET2 = "amulet1"
-KEY_AMULET3 = "amulet1"
-KEY_THRESHOLD2 = "threshold2"
+NAME_AMULET1 = u"光るお守り"
+NAME_AMULET2 = u"古びたお守り"
+NAME_AMULET3 = u"歪んだお守り"
+KEY_AMULET1 = u"amulet1"
+KEY_AMULET2 = u"amulet2"
+KEY_AMULET3 = u"amulet3"
+KEY_THRESHOLD2 = u"threshold2"
+
+SKILL_SEARCH_PAGE = 1
+
+# skill vals
+SLOT_MIN = 1
+SLOT_MAX = 3
+
+HIGHLIGHT_THRESHOLD = 90
+THRESHOLD2_MIN = 0
+THRESHOLD2_MAX = 100
# xrc file
-XRC_GAUGE_DIALOG = "gaugedialog.xrc"
-XRC_MAIN_FRAME = "mainframe.xrc"
+XRC_GAUGE_DIALOG = u"gaugedialog.xrc"
+XRC_MAIN_FRAME = u"mainframe.xrc"
# for about
NAME = u"Amulet Tools MH4"
<label>Help</label>
</object>
</object>
- <object class="wxNotebook" name="NoteBookSeed">
+ <object class="wxNotebook" name="NoteBookMain">
<object class="notebookpage">
<object class="wxPanel" name="NoteBookPanelSeed">
<object class="wxBoxSizer">
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet1_1"/>
+ <object class="wxComboBox" name="ComboBoxAmulet1_1">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet1_2"/>
+ <object class="wxComboBox" name="ComboBoxAmulet1_2">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet1_3"/>
+ <object class="wxComboBox" name="ComboBoxAmulet1_3">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet1_4"/>
+ <object class="wxComboBox" name="ComboBoxAmulet1_4">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet1_5"/>
+ <object class="wxComboBox" name="ComboBoxAmulet1_5">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet1_6"/>
+ <object class="wxComboBox" name="ComboBoxAmulet1_6">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet1_7"/>
+ <object class="wxComboBox" name="ComboBoxAmulet1_7">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet2_1"/>
+ <object class="wxComboBox" name="ComboBoxAmulet2_1">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet2_2"/>
+ <object class="wxComboBox" name="ComboBoxAmulet2_2">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet2_3"/>
+ <object class="wxComboBox" name="ComboBoxAmulet2_3">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet2_4"/>
+ <object class="wxComboBox" name="ComboBoxAmulet2_4">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet2_5"/>
+ <object class="wxComboBox" name="ComboBoxAmulet2_5">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet2_6"/>
+ <object class="wxComboBox" name="ComboBoxAmulet2_6">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet2_7"/>
+ <object class="wxComboBox" name="ComboBoxAmulet2_7">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet3_1"/>
+ <object class="wxComboBox" name="ComboBoxAmulet3_1">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet3_2"/>
+ <object class="wxComboBox" name="ComboBoxAmulet3_2">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet3_3"/>
+ <object class="wxComboBox" name="ComboBoxAmulet3_3">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet3_4"/>
+ <object class="wxComboBox" name="ComboBoxAmulet3_4">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet3_5"/>
+ <object class="wxComboBox" name="ComboBoxAmulet3_5">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet3_6"/>
+ <object class="wxComboBox" name="ComboBoxAmulet3_6">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<border>3</border>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmulet3_7"/>
+ <object class="wxComboBox" name="ComboBoxAmulet3_7">
+ <style>wxCB_READONLY</style>
+ </object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
</object>
</object>
<label>Seed値の特定</label>
- <selected>1</selected>
</object>
<object class="notebookpage">
<object class="wxPanel" name="NoteBookPanelSkill">
</object>
<object class="sizeritem">
<object class="wxStaticBoxSizer">
- <label>お守り候補</label>
- <orient>wxVERTICAL</orient>
<object class="sizeritem">
<object class="wxListBox" name="ListBoxSeedSkillAmuletProspect"/>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
+ <label>お守り候補(未実装)</label>
+ <orient>wxVERTICAL</orient>
</object>
<option>1</option>
<flag>wxBOTTOM|wxRIGHT|wxEXPAND</flag>
<object class="sizeritem">
<object class="wxStaticBoxSizer">
<object class="sizeritem">
+ <object class="wxStaticBoxSizer">
+ <object class="sizeritem">
+ <object class="wxRadioButton" name="RadioButtonAmulet1">
+ <label>光るお守り</label>
+ <value>1</value>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <object class="wxRadioButton" name="RadioButtonAmulet2">
+ <label>古びたお守り</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <object class="wxRadioButton" name="RadioButtonAmulet3">
+ <label>歪んだお守り</label>
+ </object>
+ </object>
+ <label>種類</label>
+ <orient>wxHORIZONTAL</orient>
+ </object>
+ <flag>wxALL|wxEXPAND</flag>
+ <border>5</border>
+ </object>
+ <object class="sizeritem">
<object class="wxFlexGridSizer">
<object class="sizeritem">
<object class="wxStaticText" name="LabelAmuletSearchSkill1">
</object>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmuletSearchSkill1"/>
+ <object class="wxComboBox" name="ComboBoxAmuletSearchSkill1">
+ <style>wxCB_READONLY</style>
+ </object>
</object>
<object class="sizeritem">
<object class="wxSpinCtrl" name="SpinCtrlAmuletSearchSkill1Value"/>
</object>
</object>
<object class="sizeritem">
- <object class="wxComboBox" name="ComboBoxAmuletSearchSkill2"/>
+ <object class="wxComboBox" name="ComboBoxAmuletSearchSkill2">
+ <style>wxCB_READONLY</style>
+ </object>
</object>
<object class="sizeritem">
<object class="wxSpinCtrl" name="SpinCtrlAmuletSearchSkill2Value"/>
<hgap>3</hgap>
</object>
<option>0</option>
- <flag>wxEXPAND</flag>
+ <flag>wxALL|wxEXPAND</flag>
+ <border>5</border>
</object>
<object class="sizeritem">
<object class="wxBoxSizer">
</object>
<orient>wxHORIZONTAL</orient>
</object>
- <flag>wxEXPAND</flag>
+ <flag>wxALL|wxEXPAND</flag>
+ <border>5</border>
</object>
<label>お守り指定</label>
<orient>wxVERTICAL</orient>
<style>wxTE_MULTILINE|wxTE_READONLY</style>
</object>
<option>1</option>
- <flag>wxEXPAND</flag>
+ <flag>wxALL|wxEXPAND</flag>
+ <border>5</border>
</object>
<object class="sizeritem">
<object class="wxListBox" name="ListBoxAmuletSearchSeeds"/>
<option>2</option>
- <flag>wxEXPAND</flag>
+ <flag>wxBOTTOM|wxLEFT|wxRIGHT|wxEXPAND</flag>
+ <border>5</border>
</object>
<label>Seed候補</label>
<orient>wxVERTICAL</orient>
+ <object class="sizeritem">
+ <object class="wxBoxSizer">
+ <object class="sizeritem">
+ <object class="wxPanel"/>
+ <option>1</option>
+ <flag>wxEXPAND</flag>
+ </object>
+ <object class="sizeritem">
+ <object class="wxButton" name="ButtonAmuletSearchSkill">
+ <label>対応スキル検索</label>
+ <enabled>0</enabled>
+ </object>
+ </object>
+ <orient>wxHORIZONTAL</orient>
+ </object>
+ <flag>wxALL|wxEXPAND</flag>
+ <border>5</border>
+ </object>
</object>
<option>1</option>
<flag>wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND</flag>
<label>第2スキル固定手順</label>
</object>
<object class="notebookpage">
- <object class="wxPanel" name="NoteBookPanelSettings"/>
+ <object class="wxPanel" name="NoteBookPanelSettings">
+ <object class="wxBoxSizer">
+ <orient>wxVERTICAL</orient>
+ <object class="sizeritem">
+ <object class="wxBoxSizer">
+ <object class="sizeritem">
+ <object class="wxStaticBoxSizer">
+ <label>ハイライトするスキル</label>
+ <orient>wxVERTICAL</orient>
+ <object class="sizeritem">
+ <object class="wxPanel" name="CheckListBoxPos"/>
+ <option>1</option>
+ <flag>wxEXPAND</flag>
+ </object>
+ </object>
+ <option>1</option>
+ <flag>wxALL|wxEXPAND</flag>
+ <border>5</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxStaticBoxSizer">
+ <object class="sizeritem">
+ <object class="wxSpinCtrl" name="SpinCtrlHighlightThreshold">
+ <min>0</min>
+ <max>100</max>
+ </object>
+ <flag>wxEXPAND</flag>
+ </object>
+ <object class="sizeritem">
+ <object class="wxStaticText">
+ <label>以上</label>
+ </object>
+ <flag>wxLEFT</flag>
+ <border>3</border>
+ </object>
+ <label>ハイライトする判定値</label>
+ <orient>wxHORIZONTAL</orient>
+ </object>
+ <option>0</option>
+ <flag>wxTOP|wxBOTTOM|wxRIGHT</flag>
+ <border>5</border>
+ </object>
+ <orient>wxHORIZONTAL</orient>
+ </object>
+ <option>1</option>
+ <flag>wxTOP|wxLEFT|wxRIGHT|wxEXPAND</flag>
+ <border>10</border>
+ </object>
+ <object class="sizeritem">
+ <object class="wxBoxSizer">
+ <object class="sizeritem">
+ <object class="wxPanel"/>
+ <option>1</option>
+ <flag>wxEXPAND</flag>
+ </object>
+ <object class="sizeritem">
+ <object class="wxButton" name="ButtonSettingOK">
+ <label>決定</label>
+ </object>
+ </object>
+ <object class="sizeritem">
+ <object class="wxButton" name="ButtonSettingClear">
+ <label>クリア</label>
+ </object>
+ </object>
+ <orient>wxHORIZONTAL</orient>
+ </object>
+ <flag>wxALL|wxEXPAND</flag>
+ <border>5</border>
+ </object>
+ </object>
+ </object>
<label>設定</label>
</object>
</object>
import wx
from wx import xrc
+import wx.lib.intctrl
import constnumbers
# load controls
self.frame = self.res.LoadFrame(None, "MainFrame")
+ self.note_book = xrc.XRCCTRL(self.frame, "NoteBookMain")
+
# buttons
self.button_seed_seaerch = xrc.XRCCTRL(self.frame, "ButtonSeedSearch")
self.button_seed_clear = xrc.XRCCTRL(self.frame, "ButtonSeedClear")
self.button_skill_from_seed_search = xrc.XRCCTRL(self.frame, "ButtonSkillFromSeedSearch")
- self.button_skill_search = xrc.XRCCTRL(self.frame, "ButtonSkillSearch")
- self.button_skill_clear = xrc.XRCCTRL(self.frame, "ButtonSkillClear")
+ self.button_skill_search = xrc.XRCCTRL(self.frame, "ButtonSeedSkillSearch")
+ self.button_skill_clear = xrc.XRCCTRL(self.frame, "ButtonSeedSkillClear")
self.button_amulet_search_seaerch = xrc.XRCCTRL(self.frame, "ButtonAmuletSearchSearch")
self.button_amulet_search_clear = xrc.XRCCTRL(self.frame, "ButtonAmuletSearchClear")
+ self.button_amulet_search_skill = xrc.XRCCTRL(self.frame, "ButtonAmuletSearchSkill")
+ self.button_setting_ok = xrc.XRCCTRL(self.frame, "ButtonSettingOK")
+ self.button_setting_clear = xrc.XRCCTRL(self.frame, "ButtonSettingClear")
+
+ self.ID_BUTTON_SEED_SEARCH = xrc.XRCID("ButtonSeedSearch")
+ self.ID_BUTTON_SEED_CLEAR = xrc.XRCID("ButtonSeedClear")
+ self.ID_BUTTON_SKILL_FROM_SEED_SEARCH = xrc.XRCID("ButtonSkillFromSeedSearch")
+ self.ID_BUTTON_SKILL_SEARCH = xrc.XRCID("ButtonSeedSkillSearch")
+ self.ID_BUTTON_SKILL_CLEAR = xrc.XRCID("ButtonSeedSkillClear")
+ self.ID_BUTTON_AMULET_SEARCH_SEARCH = xrc.XRCID("ButtonAmuletSearchSearch")
+ self.ID_BUTTON_AMULET_SEARCH_CLEAR = xrc.XRCID("ButtonAmuletSearchClear")
+ self.ID_BUTTON_AMULET_SEARCH_SKILL = xrc.XRCID("ButtonAmuletSearchSkill")
+ self.ID_BUTTON_SETTING_OK = xrc.XRCID("ButtonSettingOK")
+ self.ID_BUTTON_SETTING_CLEAR = xrc.XRCID("ButtonSettingClear")
+
+ # radio button
+ self.radio_button_amulet1 = xrc.XRCCTRL(self.frame, "RadioButtonAmulet1")
+ self.radio_button_amulet2 = xrc.XRCCTRL(self.frame, "RadioButtonAmulet2")
+ self.radio_button_amulet3 = xrc.XRCCTRL(self.frame, "RadioButtonAmulet3")
+ self.ID_RADIO_BUTTON_AMULET1 = xrc.XRCID("RadioButtonAmulet1")
+ self.ID_RADIO_BUTTON_AMULET2 = xrc.XRCID("RadioButtonAmulet2")
+ self.ID_RADIO_BUTTON_AMULET3 = xrc.XRCID("RadioButtonAmulet3")
+ self.amulet2radio_button_dict = {}
+ self.amulet2radio_button_dict[constnumbers.NAME_AMULET1] = self.radio_button_amulet1
+ self.amulet2radio_button_dict[constnumbers.NAME_AMULET2] = self.radio_button_amulet2
+ self.amulet2radio_button_dict[constnumbers.NAME_AMULET3] = self.radio_button_amulet3
+ self.amulet2radio_id_dict = {}
+ self.amulet2radio_id_dict[constnumbers.NAME_AMULET1] = self.ID_RADIO_BUTTON_AMULET1
+ self.amulet2radio_id_dict[constnumbers.NAME_AMULET2] = self.ID_RADIO_BUTTON_AMULET2
+ self.amulet2radio_id_dict[constnumbers.NAME_AMULET3] = self.ID_RADIO_BUTTON_AMULET3
# menu
self.ID_MENU_ITEM_EXIT = xrc.XRCID("wxID_EXIT") # same as wx.ID_EXIT
self._load_combo_boxes()
# load list box
+ self.list_box_seed = xrc.XRCCTRL(self.frame, "ListBoxSeed")
self.list_box_amulet_search_seeds = xrc.XRCCTRL(self.frame, "ListBoxAmuletSearchSeeds")
self.list_box_seed_skill_amulet_prospect = xrc.XRCCTRL(self.frame, "ListBoxSeedSkillAmuletProspect")
+ self.ID_LIST_BOX_SEED = xrc.XRCID("ListBoxSeed")
+ self.ID_LIST_BOX_AMULET_SEARCH_SEEDS = xrc.XRCID("ListBoxAmuletSearchSeeds")
+ self.ID_LIST_BOX_SEED_SKILL_AMULET_PROSPECT = xrc.XRCID("ListBoxSeedSkillAmuletProspect")
# load spin ctrl
self.spin_ctrl_amulet_search_skill1_val = xrc.XRCCTRL(self.frame, "SpinCtrlAmuletSearchSkill1Value")
self.spin_ctrl_amulet_search_skill2_val = xrc.XRCCTRL(self.frame, "SpinCtrlAmuletSearchSkill2Value")
self.spin_ctrl_amulet_search_slot_num = xrc.XRCCTRL(self.frame, "SpinCtrlAmuletSearchSlotNumber")
+ self.ID_SPIN_CTRL_AMULET_SKILL1_VAL = xrc.XRCID("SpinCtrlAmuletSearchSkill1Value")
+ self.ID_SPIN_CTRL_AMULET_SKILL2_VAL = xrc.XRCID("SpinCtrlAmuletSearchSkill2Value")
+ self.spin_ctrl_highlight = xrc.XRCCTRL(self.frame, "SpinCtrlHighlightThreshold")
+
+ # load custom ctrl
+ panel = xrc.XRCCTRL(self.frame, "CheckListBoxPos")
+ #panel = xrc.XRCCTRL(self.frame, "NoteBookPanelSettings")
+ self.ID_CHECK_LIST_BOX_HIGHLIGHT_SKILL = wx.NewId()
+ #self.check_list_box_highlight_skill = wx.CheckListBox(self.frame, self.ID_CHECK_LIST_BOX_HIGHLIGHT_SKILL)
+ self.check_list_box_highlight_skill = wx.CheckListBox(panel, id=self.ID_CHECK_LIST_BOX_HIGHLIGHT_SKILL,
+ name="CheckListBoxHighlightSkills")
+ #self.res.AttachUnknownControl("CheckListBoxHighlightSkills", self.check_list_box_highlight_skill, panel) # list isn't shown. why?
+
+ vbox = wx.BoxSizer(wx.VERTICAL)
+ vbox.Add(self.check_list_box_highlight_skill, 1, wx.EXPAND)
+ panel.SetSizer(vbox)
+
+ #panel.Fit()
# set explanation text
self.text_ctrl_seed_explain.SetValue(constnumbers.SEED_DECISION_EXPLANATION)
self.combo_box_skill_dict = {}
self.combo_box_skill_dict[constnumbers.KEY_AMULET1] = [
xrc.XRCCTRL(self.frame, "ComboBoxAmulet1_1"),
+ xrc.XRCCTRL(self.frame, "ComboBoxAmulet1_2"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet1_3"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet1_4"),
- xrc.XRCCTRL(self.frame, "ComboBoxAmulet1_4"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet1_5"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet1_6"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet1_7")]
self.combo_box_skill_dict[constnumbers.KEY_AMULET2] = [
xrc.XRCCTRL(self.frame, "ComboBoxAmulet2_1"),
+ xrc.XRCCTRL(self.frame, "ComboBoxAmulet2_2"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet2_3"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet2_4"),
- xrc.XRCCTRL(self.frame, "ComboBoxAmulet2_4"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet2_5"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet2_6"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet2_7")]
self.combo_box_skill_dict[constnumbers.KEY_AMULET3] = [
xrc.XRCCTRL(self.frame, "ComboBoxAmulet3_1"),
+ xrc.XRCCTRL(self.frame, "ComboBoxAmulet3_2"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet3_3"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet3_4"),
- xrc.XRCCTRL(self.frame, "ComboBoxAmulet3_4"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet3_5"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet3_6"),
xrc.XRCCTRL(self.frame, "ComboBoxAmulet3_7")]
self.combo_box_amulet_search_skill1 = xrc.XRCCTRL(self.frame, "ComboBoxAmuletSearchSkill1")
self.combo_box_amulet_search_skill2 = xrc.XRCCTRL(self.frame, "ComboBoxAmuletSearchSkill2")
+ self.ID_COMBO_BOX_AMULET_SEARCH_SKILL1 = xrc.XRCID("ComboBoxAmuletSearchSkill1")
+ self.ID_COMBO_BOX_AMULET_SEARCH_SKILL2 = xrc.XRCID("ComboBoxAmuletSearchSkill2")
def _load_text_ctrls(self):
# load text ctrls
def Close(self):
self.frame.Close(True)
+ def DisableNoteBook(self):
+ self.note_book.Disable()
+
+ def EnableNoteBook(self):
+ self.note_book.Enable()
+
def OnAboutBox(self, evt):
u""" Show About Box """
info = wx.AboutDialogInfo()