00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifdef HAVE_CONFIG_H
00026 #include <config.h>
00027 #endif
00028
00029 #include <wx/wxprec.h>
00030
00031 #ifndef WX_PRECOMP
00032 #include <wx/wx.h>
00033 #endif
00034
00035 #include <wx/xrc/xmlres.h>
00036
00037 #include <fstream>
00038 #include <cstring>
00039
00040 #include "ffse.hh"
00041 #include "model/SaveSlot.hh"
00042 #include "res/orb32x32.xpm"
00043 #include "view/FileDropTarget.hh"
00044 #include "view/MainFrame.hh"
00045
00046 using namespace ffse;
00047
00048 MainFrame::MainFrame() {
00049 SetParent(NULL);
00050 CreateControls();
00051 GetSizer()->SetSizeHints(this);
00052 Centre();
00053
00054 XRCCTRL(*this, "IDN_FFSE", wxNotebook)->Show(false);
00055
00056 SetDropTarget(new FileDropTarget(this));
00057 }
00058
00059 void MainFrame::CreateControls() {
00060 wxXmlResource::Get()->LoadFrame(this, GetParent(), wxT("IDF_FRAME"));
00061 SetIcon(orb32x32_xpm);
00062
00063 wxMenuBar *menubar = GetMenuBar();
00064
00065 memberItems[0] = menubar->FindItem(XRCID("IDM_MEMBER_ONE"));
00066 memberItems[0]->Enable(false);
00067
00068 memberItems[1] = menubar->FindItem(XRCID("IDM_MEMBER_TWO"));
00069 memberItems[1]->Enable(false);
00070
00071 memberItems[2] = menubar->FindItem(XRCID("IDM_MEMBER_THREE"));
00072 memberItems[2]->Enable(false);
00073
00074 memberItems[3] = menubar->FindItem(XRCID("IDM_MEMBER_FOUR"));
00075 memberItems[3]->Enable(false);
00076
00077 fileCloseItem = menubar->FindItem(wxID_CLOSE);
00078 fileSaveItem = menubar->FindItem(wxID_SAVE);
00079 fileSaveAsItem = menubar->FindItem(wxID_SAVEAS);
00080
00081 wxTextValidator numberValidator(wxFILTER_NUMERIC);
00082 goldText = XRCCTRL(*this, "IDT_GENERAL_GOLD", wxTextCtrl);
00083 goldText->SetValidator(numberValidator);
00084
00085 healSlider = XRCCTRL(*this, "IDS_GENERAL_HEAL", wxSlider);
00086 pureSlider = XRCCTRL(*this, "IDS_GENERAL_PURE", wxSlider);
00087 softSlider = XRCCTRL(*this, "IDS_GENERAL_SOFT", wxSlider);
00088 tentSlider = XRCCTRL(*this, "IDS_GENERAL_TENT", wxSlider);
00089 cabinSlider = XRCCTRL(*this, "IDS_GENERAL_CABIN", wxSlider);
00090 houseSlider = XRCCTRL(*this, "IDS_GENERAL_HOUSE", wxSlider);
00091
00092 wxArrayString letters;
00093 letters.Add(wxT("A")); letters.Add(wxT("B")); letters.Add(wxT("C"));
00094 letters.Add(wxT("D")); letters.Add(wxT("E")); letters.Add(wxT("F"));
00095 letters.Add(wxT("G")); letters.Add(wxT("H")); letters.Add(wxT("I"));
00096 letters.Add(wxT("J")); letters.Add(wxT("K")); letters.Add(wxT("L"));
00097 letters.Add(wxT("M")); letters.Add(wxT("N")); letters.Add(wxT("O"));
00098 letters.Add(wxT("P")); letters.Add(wxT("Q")); letters.Add(wxT("R"));
00099 letters.Add(wxT("S")); letters.Add(wxT("T")); letters.Add(wxT("U"));
00100 letters.Add(wxT("V")); letters.Add(wxT("W")); letters.Add(wxT("X"));
00101 letters.Add(wxT("Y")); letters.Add(wxT("Z")); letters.Add(wxT("a"));
00102 letters.Add(wxT("b")); letters.Add(wxT("c")); letters.Add(wxT("d"));
00103 letters.Add(wxT("e")); letters.Add(wxT("f")); letters.Add(wxT("g"));
00104 letters.Add(wxT("h")); letters.Add(wxT("i")); letters.Add(wxT("j"));
00105 letters.Add(wxT("k")); letters.Add(wxT("l")); letters.Add(wxT("m"));
00106 letters.Add(wxT("n")); letters.Add(wxT("o")); letters.Add(wxT("p"));
00107 letters.Add(wxT("q")); letters.Add(wxT("r")); letters.Add(wxT("s"));
00108 letters.Add(wxT("t")); letters.Add(wxT("u")); letters.Add(wxT("v"));
00109 letters.Add(wxT("w")); letters.Add(wxT("x")); letters.Add(wxT("y"));
00110 letters.Add(wxT("z")); letters.Add(wxT("0")); letters.Add(wxT("1"));
00111 letters.Add(wxT("2")); letters.Add(wxT("3")); letters.Add(wxT("4"));
00112 letters.Add(wxT("5")); letters.Add(wxT("6")); letters.Add(wxT("7"));
00113 letters.Add(wxT("8")); letters.Add(wxT("9")); letters.Add(wxT("'"));
00114 letters.Add(wxT(",")); letters.Add(wxT(".")); letters.Add(wxT("-"));
00115 letters.Add(wxT(":")); letters.Add(wxT("!")); letters.Add(wxT("?"));
00116
00117 wxTextValidator nameValidator(wxFILTER_INCLUDE_CHAR_LIST);
00118 nameValidator.SetIncludes(letters);
00119
00120 nameText = XRCCTRL(*this, "IDT_CHARACTER_NAME", wxTextCtrl);
00121 nameText->SetValidator(nameValidator);
00122
00123 classChoice = XRCCTRL(*this, "IDC_CHARACTER_CLASS", wxChoice);
00124 conditionChoice = XRCCTRL(*this, "IDC_CHARACTER_CONDITION", wxChoice);
00125
00126 currentHPText = XRCCTRL(*this, "IDT_CHARACTER_CURRENT_HP", wxTextCtrl);
00127 currentHPText->SetValidator(numberValidator);
00128
00129 maxHPText = XRCCTRL(*this, "IDT_CHARACTER_MAX_HP", wxTextCtrl);
00130 maxHPText->SetValidator(numberValidator);
00131
00132 experienceText = XRCCTRL(*this, "IDT_CHARACTER_EXPERIENCE", wxTextCtrl);
00133 experienceText->SetValidator(numberValidator);
00134
00135 strengthText = XRCCTRL(*this, "IDT_CHARACTER_STRENGTH", wxTextCtrl);
00136 strengthText->SetValidator(numberValidator);
00137
00138 agilityText = XRCCTRL(*this, "IDT_CHARACTER_AGILITY", wxTextCtrl);
00139 agilityText->SetValidator(numberValidator);
00140
00141 intelligenceText = XRCCTRL(*this, "IDT_CHARACTER_INTELLIGENCE", wxTextCtrl);
00142 intelligenceText->SetValidator(numberValidator);
00143
00144 vitalityText = XRCCTRL(*this, "IDT_CHARACTER_VITALITY", wxTextCtrl);
00145 vitalityText->SetValidator(numberValidator);
00146
00147 luckText = XRCCTRL(*this, "IDT_CHARACTER_LUCK", wxTextCtrl);
00148 luckText->SetValidator(numberValidator);
00149
00150 damageText = XRCCTRL(*this, "IDT_CHARACTER_DAMAGE", wxTextCtrl);
00151 damageText->SetValidator(numberValidator);
00152
00153 hitPercentText = XRCCTRL(*this, "IDT_CHARACTER_HIT_PERCENT", wxTextCtrl);
00154 hitPercentText->SetValidator(numberValidator);
00155
00156 weaponChoice[0] = XRCCTRL(*this, "IDC_CHARACTER_WEAPON1", wxChoice);
00157 weaponEquippedCheck[0] =
00158 XRCCTRL(*this, "IDC_CHARACTER_WEAPON_EQUIPPED1", wxCheckBox);
00159 weaponChoice[1] = XRCCTRL(*this, "IDC_CHARACTER_WEAPON2", wxChoice);
00160 weaponEquippedCheck[1] =
00161 XRCCTRL(*this, "IDC_CHARACTER_WEAPON_EQUIPPED2", wxCheckBox);
00162 weaponChoice[2] = XRCCTRL(*this, "IDC_CHARACTER_WEAPON3", wxChoice);
00163 weaponEquippedCheck[2] =
00164 XRCCTRL(*this, "IDC_CHARACTER_WEAPON_EQUIPPED3", wxCheckBox);
00165 weaponChoice[3] = XRCCTRL(*this, "IDC_CHARACTER_WEAPON4", wxChoice);
00166 weaponEquippedCheck[3] =
00167 XRCCTRL(*this, "IDC_CHARACTER_WEAPON_EQUIPPED4", wxCheckBox);
00168
00169 armorChoice[0] = XRCCTRL(*this, "IDC_CHARACTER_ARMOR1", wxChoice);
00170 armorEquippedCheck[0] =
00171 XRCCTRL(*this, "IDC_CHARACTER_ARMOR_EQUIPPED1", wxCheckBox);
00172 armorChoice[1] = XRCCTRL(*this, "IDC_CHARACTER_ARMOR2", wxChoice);
00173 armorEquippedCheck[1] =
00174 XRCCTRL(*this, "IDC_CHARACTER_ARMOR_EQUIPPED2", wxCheckBox);
00175 armorChoice[2] = XRCCTRL(*this, "IDC_CHARACTER_ARMOR3", wxChoice);
00176 armorEquippedCheck[2] =
00177 XRCCTRL(*this, "IDC_CHARACTER_ARMOR_EQUIPPED3", wxCheckBox);
00178 armorChoice[3] = XRCCTRL(*this, "IDC_CHARACTER_ARMOR4", wxChoice);
00179 armorEquippedCheck[3] =
00180 XRCCTRL(*this, "IDC_CHARACTER_ARMOR_EQUIPPED4", wxCheckBox);
00181
00182 currentMagicSlider[0] = XRCCTRL(*this, "IDS_MAGIC_CURRENT1", wxSlider);
00183 maxMagicSlider[0] = XRCCTRL(*this, "IDS_MAGIC_MAX1", wxSlider);
00184 currentMagicSlider[1] = XRCCTRL(*this, "IDS_MAGIC_CURRENT2", wxSlider);
00185 maxMagicSlider[1] = XRCCTRL(*this, "IDS_MAGIC_MAX2", wxSlider);
00186 currentMagicSlider[2] = XRCCTRL(*this, "IDS_MAGIC_CURRENT3", wxSlider);
00187 maxMagicSlider[2] = XRCCTRL(*this, "IDS_MAGIC_MAX3", wxSlider);
00188 currentMagicSlider[3] = XRCCTRL(*this, "IDS_MAGIC_CURRENT4", wxSlider);
00189 maxMagicSlider[3] = XRCCTRL(*this, "IDS_MAGIC_MAX4", wxSlider);
00190 currentMagicSlider[4] = XRCCTRL(*this, "IDS_MAGIC_CURRENT5", wxSlider);
00191 maxMagicSlider[4] = XRCCTRL(*this, "IDS_MAGIC_MAX5", wxSlider);
00192 currentMagicSlider[5] = XRCCTRL(*this, "IDS_MAGIC_CURRENT6", wxSlider);
00193 maxMagicSlider[5] = XRCCTRL(*this, "IDS_MAGIC_MAX6", wxSlider);
00194 currentMagicSlider[6] = XRCCTRL(*this, "IDS_MAGIC_CURRENT7", wxSlider);
00195 maxMagicSlider[6] = XRCCTRL(*this, "IDS_MAGIC_MAX7", wxSlider);
00196 currentMagicSlider[7] = XRCCTRL(*this, "IDS_MAGIC_CURRENT8", wxSlider);
00197 maxMagicSlider[7] = XRCCTRL(*this, "IDS_MAGIC_MAX8", wxSlider);
00198
00199 knownMagicChoice[0][0] = XRCCTRL(*this, "IDC_MAGIC_KNOWN11", wxChoice);
00200 knownMagicChoice[0][1] = XRCCTRL(*this, "IDC_MAGIC_KNOWN12", wxChoice);
00201 knownMagicChoice[0][2] = XRCCTRL(*this, "IDC_MAGIC_KNOWN13", wxChoice);
00202 knownMagicChoice[1][0] = XRCCTRL(*this, "IDC_MAGIC_KNOWN21", wxChoice);
00203 knownMagicChoice[1][1] = XRCCTRL(*this, "IDC_MAGIC_KNOWN22", wxChoice);
00204 knownMagicChoice[1][2] = XRCCTRL(*this, "IDC_MAGIC_KNOWN23", wxChoice);
00205 knownMagicChoice[2][0] = XRCCTRL(*this, "IDC_MAGIC_KNOWN31", wxChoice);
00206 knownMagicChoice[2][1] = XRCCTRL(*this, "IDC_MAGIC_KNOWN32", wxChoice);
00207 knownMagicChoice[2][2] = XRCCTRL(*this, "IDC_MAGIC_KNOWN33", wxChoice);
00208 knownMagicChoice[3][0] = XRCCTRL(*this, "IDC_MAGIC_KNOWN41", wxChoice);
00209 knownMagicChoice[3][1] = XRCCTRL(*this, "IDC_MAGIC_KNOWN42", wxChoice);
00210 knownMagicChoice[3][2] = XRCCTRL(*this, "IDC_MAGIC_KNOWN43", wxChoice);
00211 knownMagicChoice[4][0] = XRCCTRL(*this, "IDC_MAGIC_KNOWN51", wxChoice);
00212 knownMagicChoice[4][1] = XRCCTRL(*this, "IDC_MAGIC_KNOWN52", wxChoice);
00213 knownMagicChoice[4][2] = XRCCTRL(*this, "IDC_MAGIC_KNOWN53", wxChoice);
00214 knownMagicChoice[5][0] = XRCCTRL(*this, "IDC_MAGIC_KNOWN61", wxChoice);
00215 knownMagicChoice[5][1] = XRCCTRL(*this, "IDC_MAGIC_KNOWN62", wxChoice);
00216 knownMagicChoice[5][2] = XRCCTRL(*this, "IDC_MAGIC_KNOWN63", wxChoice);
00217 knownMagicChoice[6][0] = XRCCTRL(*this, "IDC_MAGIC_KNOWN71", wxChoice);
00218 knownMagicChoice[6][1] = XRCCTRL(*this, "IDC_MAGIC_KNOWN72", wxChoice);
00219 knownMagicChoice[6][2] = XRCCTRL(*this, "IDC_MAGIC_KNOWN73", wxChoice);
00220 knownMagicChoice[7][0] = XRCCTRL(*this, "IDC_MAGIC_KNOWN81", wxChoice);
00221 knownMagicChoice[7][1] = XRCCTRL(*this, "IDC_MAGIC_KNOWN82", wxChoice);
00222 knownMagicChoice[7][2] = XRCCTRL(*this, "IDC_MAGIC_KNOWN83", wxChoice);
00223
00224 setOpen(false);
00225 }
00226
00227 void MainFrame::setOpen(bool open) {
00228 fileSaveItem->Enable(open);
00229 fileSaveAsItem->Enable(open);
00230 fileCloseItem->Enable(open);
00231
00232 for (int i = 0; i < 4; i++) {
00233 memberItems[i]->Enable(open);
00234 }
00235
00236 this->open = open;
00237 }
00238
00239 void MainFrame::loadCharacterData(int member) {
00240 this->member = member;
00241
00242 wxString str = game->getName(member);
00243 nameText->SetValue(str);
00244
00245 classChoice->SetSelection(game->getClass(member));
00246 conditionChoice->SetSelection(game->getCondition(member));
00247
00248 str.Printf(wxT("%d"), game->getCurrentHP(member));
00249 currentHPText->SetValue(str);
00250
00251 str.Printf(wxT("%d"), game->getMaxHP(member));
00252 maxHPText->SetValue(str);
00253
00254 str.Printf(wxT("%d"), game->getExperience(member));
00255 experienceText->SetValue(str);
00256
00257 str.Printf(wxT("%d"), game->getStrength(member));
00258 strengthText->SetValue(str);
00259
00260 str.Printf(wxT("%d"), game->getAgility(member));
00261 agilityText->SetValue(str);
00262
00263 str.Printf(wxT("%d"), game->getIntelligence(member));
00264 intelligenceText->SetValue(str);
00265
00266 str.Printf(wxT("%d"), game->getVitality(member));
00267 vitalityText->SetValue(str);
00268
00269 str.Printf(wxT("%d"), game->getLuck(member));
00270 luckText->SetValue(str);
00271
00272 str.Printf(wxT("%d"), game->getDamage(member));
00273 damageText->SetValue(str);
00274
00275 str.Printf(wxT("%d"), game->getHitPercent(member));
00276 hitPercentText->SetValue(str);
00277
00278 for (int pos = 0; pos < 4; pos++) {
00279 int weapon = game->getWeapon(member, pos);
00280 int armor = game->getArmor(member, pos);
00281
00282 weaponChoice[pos]->SetSelection(weapon & 0x7F);
00283 armorChoice[pos]->SetSelection(armor & 0x7F);
00284
00285 weaponEquippedCheck[pos]->SetValue((weapon & 0x80) ? true : false);
00286 armorEquippedCheck[pos]->SetValue((armor & 0x80) ? true : false);
00287 }
00288
00289 for (int level = 0; level < 8; level++) {
00290 int current = game->getCurrentMagic(member, level);
00291 int max = game->getMaxMagic(member, level);
00292
00293 currentMagicSlider[level]->SetValue(current);
00294 maxMagicSlider[level]->SetValue(max);
00295
00296 for (int slot = 0; slot < 3; slot++) {
00297 int magic = game->getMagic(member, level, slot);
00298 knownMagicChoice[level][slot]->SetSelection(magic);
00299 }
00300 }
00301 }
00302
00303 void MainFrame::loadGameData() {
00304 wxString str;
00305 str.Printf(wxT("%d"), game->getGold());
00306
00307 goldText->SetValue(str);
00308
00309 healSlider->SetValue(game->getItem(HEALP));
00310 pureSlider->SetValue(game->getItem(PUREP));
00311 softSlider->SetValue(game->getItem(SOFTP));
00312
00313 tentSlider->SetValue(game->getItem(TENT));
00314 cabinSlider->SetValue(game->getItem(CABIN));
00315 houseSlider->SetValue(game->getItem(HOUSE));
00316
00317 XRCCTRL(*this, "IDC_GENERAL_LUTE", wxCheckBox)->
00318 SetValue((game->getItem(LUTE) == 1) ? true : false);
00319 XRCCTRL(*this, "IDC_GENERAL_CROWN", wxCheckBox)->
00320 SetValue((game->getItem(CROWN) == 1) ? true : false);
00321 XRCCTRL(*this, "IDC_GENERAL_CRYSTAL", wxCheckBox)->
00322 SetValue((game->getItem(CRYSTAL) == 1) ? true : false);
00323 XRCCTRL(*this, "IDC_GENERAL_HERB", wxCheckBox)->
00324 SetValue((game->getItem(HERB) == 1) ? true : false);
00325 XRCCTRL(*this, "IDC_GENERAL_KEY", wxCheckBox)->
00326 SetValue((game->getItem(KEY) == 1) ? true : false);
00327 XRCCTRL(*this, "IDC_GENERAL_TNT", wxCheckBox)->
00328 SetValue((game->getItem(TNT) == 1) ? true : false);
00329 XRCCTRL(*this, "IDC_GENERAL_ADAMENT", wxCheckBox)->
00330 SetValue((game->getItem(ADAMENT) == 1) ? true : false);
00331 XRCCTRL(*this, "IDC_GENERAL_SLAB", wxCheckBox)->
00332 SetValue((game->getItem(SLAB) == 1) ? true : false);
00333 XRCCTRL(*this, "IDC_GENERAL_RUBY", wxCheckBox)->
00334 SetValue((game->getItem(RUBY) == 1) ? true : false);
00335 XRCCTRL(*this, "IDC_GENERAL_ROD", wxCheckBox)->
00336 SetValue((game->getItem(ROD) == 1) ? true : false);
00337 XRCCTRL(*this, "IDC_GENERAL_FLOATER", wxCheckBox)->
00338 SetValue((game->getItem(FLOATER) == 1) ? true : false);
00339 XRCCTRL(*this, "IDC_GENERAL_CHIME", wxCheckBox)->
00340 SetValue((game->getItem(CHIME) == 1) ? true : false);
00341 XRCCTRL(*this, "IDC_GENERAL_TAIL", wxCheckBox)->
00342 SetValue((game->getItem(TAIL) == 1) ? true : false);
00343 XRCCTRL(*this, "IDC_GENERAL_CUBE", wxCheckBox)->
00344 SetValue((game->getItem(CUBE) == 1) ? true : false);
00345 XRCCTRL(*this, "IDC_GENERAL_BOTTLE", wxCheckBox)->
00346 SetValue((game->getItem(BOTTLE) == 1) ? true : false);
00347 XRCCTRL(*this, "IDC_GENERAL_OXYALE", wxCheckBox)->
00348 SetValue((game->getItem(OXYALE) == 1) ? true : false);
00349 XRCCTRL(*this, "IDC_GENERAL_CANOE", wxCheckBox)->
00350 SetValue((game->getItem(CANOE) == 1) ? true : false);
00351 XRCCTRL(*this, "IDC_GENERAL_FIRE_ORB", wxCheckBox)->
00352 SetValue((game->getItem(FIREORB) == 1) ? true : false);
00353 XRCCTRL(*this, "IDC_GENERAL_WATER_ORB", wxCheckBox)->
00354 SetValue((game->getItem(WATERORB) == 1) ? true : false);
00355 XRCCTRL(*this, "IDC_GENERAL_WIND_ORB", wxCheckBox)->
00356 SetValue((game->getItem(WINDORB) == 1) ? true : false);
00357 XRCCTRL(*this, "IDC_GENERAL_EARTH_ORB", wxCheckBox)->
00358 SetValue((game->getItem(EARTHORB) == 1) ? true : false);
00359
00360 loadCharacterData();
00361
00362 XRCCTRL(*this, "IDN_FFSE", wxNotebook)->Show(true);
00363 }
00364
00365 void MainFrame::load(wxString &filename) {
00366 if (!close()) {
00367 return;
00368 }
00369
00370 char nvram[GAME_SIZE];
00371 sram = new char[SRAM_SIZE];
00372
00373 std::ifstream in(filename.mb_str(), std::ios::in | std::ios::binary);
00374
00375 if (!in) {
00376
00377 wxMessageBox(wxT("Unable to open the selected file."),
00378 wxT("File I/O Error"), wxOK | wxICON_ERROR);
00379 return;
00380 }
00381
00382 in.read(sram, SRAM_SIZE);
00383
00384 if (in.rdstate() & std::ios::failbit) {
00385
00386 wxMessageBox(wxT("Unable to read the selected file."),
00387 wxT("File I/O Error"), wxOK | wxICON_ERROR);
00388 return;
00389 }
00390
00391 in.close();
00392
00393 memcpy(nvram, (sram + GAME_OFFSET), GAME_SIZE);
00394 game = new SaveSlot(nvram);
00395
00396 if (game->isValid()) {
00397 loadGameData();
00398 setOpen(true);
00399
00400 wxString bakfile = filename + wxT(".bak");
00401 std::ofstream out(bakfile.mb_str(), std::ios::out | std::ios::binary);
00402
00403 if (out) {
00404 out.write(sram, SRAM_SIZE);
00405 out.close();
00406 }
00407 } else {
00408 wxMessageBox(wxT("No game data found in the file you loaded."),
00409 wxT("Error: No Data Found"), wxOK | wxICON_ERROR);
00410
00411 delete sram;
00412 delete game;
00413 }
00414 }
00415
00416 void MainFrame::fileOpen(wxCommandEvent &) {
00417 static wxFileDialog *dlg = new wxFileDialog(this,
00418 wxT("Choose a .SAV File"), wxT(""), wxT(""),
00419 wxT("NES SRAM File (*.sav)|*.sav"), (wxOPEN | wxCHANGE_DIR));
00420
00421 int value = dlg->ShowModal();
00422
00423 if (value == wxID_OK) {
00424 sramFile = dlg->GetPath();
00425 load(sramFile);
00426 }
00427 }
00428
00429 bool MainFrame::close() {
00430 if (!isOpen()) {
00431 return true;
00432 }
00433
00434 if (game->isModified()) {
00435 int choice = wxMessageBox(wxT("Save Game File Before Closing?"),
00436 wxT("Warning: Unsaved Changes"),
00437 wxYES_NO | wxCANCEL | wxICON_QUESTION,
00438 this);
00439
00440 if (choice == wxYES) {
00441 if (!save(sramFile)) {
00442 return false;
00443 }
00444 } else if (choice == wxCANCEL) {
00445 return false;
00446 }
00447 }
00448
00449 delete game;
00450 delete sram;
00451
00452 memberItems[0]->Check(true);
00453 XRCCTRL(*this, "IDN_FFSE", wxNotebook)->Show(false);
00454
00455 setOpen(false);
00456
00457 return true;
00458 }
00459
00460 void MainFrame::fileClose(wxCommandEvent &) {
00461 close();
00462 }
00463
00464 bool MainFrame::isValidEquipment() {
00465 bool weapon;
00466 bool armor;
00467 bool shield;
00468 bool helmet;
00469 bool gauntlet;
00470
00471 for (int member = 0; member < 4; member++) {
00472 weapon = false;
00473 armor = false;
00474 shield = false;
00475 helmet = false;
00476 gauntlet = false;
00477
00478 for (int slot = 0; slot < 4; slot++) {
00479 int item = game->getWeapon(member, slot);
00480
00481 if ((item >= 0x81) && (item <= 0xA8)) {
00482 if (weapon) {
00483 return false;
00484 }
00485
00486 weapon = true;
00487 }
00488
00489 item = game->getArmor(member, slot);
00490
00491 if ((item >= 0x81) && (item <= 0x90)) {
00492 if (armor) {
00493 return false;
00494 }
00495
00496 armor = true;
00497 } else if ((item >= 0x91) && (item <= 0x99)) {
00498 if (shield) {
00499 return false;
00500 }
00501
00502 shield = true;
00503 } else if ((item >= 0x9A) && (item <= 0xA0)) {
00504 if (helmet) {
00505 return false;
00506 }
00507
00508 helmet = true;
00509 } else if ((item >= 0xA1) && (item <= 0xA8)) {
00510 if (gauntlet) {
00511 return false;
00512 }
00513
00514 gauntlet = true;
00515 }
00516 }
00517 }
00518
00519 return true;
00520 }
00521
00522 bool MainFrame::save(wxString &filename) {
00523 if (!isValidEquipment()) {
00524 int choice = wxMessageBox(
00525 wxT("At least one party member has duplicate equipment.\n")
00526 wxT("Continue Saving?"), wxT("Error: Invalid Equipment"),
00527 wxYES | wxNO | wxICON_QUESTION);
00528
00529 if (choice != wxYES) {
00530 return false;
00531 }
00532 }
00533
00534 memcpy((sram + GAME_OFFSET), game->nvram, GAME_SIZE);
00535
00536 std::ofstream out(filename.mb_str(), std::ios::binary | std::ios::out);
00537
00538 if (!out) {
00539 wxMessageBox(wxT("Unable to open the SRAM file."),
00540 wxT("File Open Error"), wxOK | wxICON_ERROR);
00541 return false;
00542 }
00543
00544 out.write(sram, SRAM_SIZE);
00545
00546 if (out.rdstate() && std::ios::failbit) {
00547 wxMessageBox(wxT("Unable to write to the SRAM file."),
00548 wxT("File I/O Error"), wxOK | wxICON_ERROR);
00549 out.close();
00550 return false;
00551 }
00552
00553 out.close();
00554
00555 game->setModified(false);
00556
00557 return true;
00558 }
00559
00560 void MainFrame::fileSave(wxCommandEvent &) {
00561 save(sramFile);
00562 }
00563
00564 void MainFrame::fileSaveAs(wxCommandEvent &) {
00565 static wxFileDialog *dlg = new wxFileDialog(this,
00566 wxT("Choose a .SAV File"), wxT(""), wxT(""),
00567 wxT("NES SRAM File (*.sav)|*.sav"), (wxSAVE | wxCHANGE_DIR));
00568
00569 int value = dlg->ShowModal();
00570
00571 if (value == wxID_OK) {
00572 sramFile = dlg->GetPath();
00573 save(sramFile);
00574 }
00575 }
00576
00577 void MainFrame::fileExit(wxCommandEvent &) {
00578 if (close()) {
00579 Close(true);
00580 }
00581 }
00582
00583 void MainFrame::windowClosing(wxCloseEvent &event) {
00584 if (event.CanVeto()) {
00585 if (!close()) {
00586 event.Veto();
00587 return;
00588 }
00589 }
00590
00591 Destroy();
00592 }
00593
00594 void MainFrame::memberChange(wxCommandEvent &event) {
00595 setOpen(false);
00596
00597 int id = event.GetId();
00598
00599 if (id == XRCID("IDM_MEMBER_ONE")) {
00600 loadCharacterData(0);
00601 } else if (id == XRCID("IDM_MEMBER_TWO")) {
00602 loadCharacterData(1);
00603 } else if (id == XRCID("IDM_MEMBER_THREE")) {
00604 loadCharacterData(2);
00605 } else if (id == XRCID("IDM_MEMBER_FOUR")) {
00606 loadCharacterData(3);
00607 }
00608
00609 setOpen(true);
00610 }
00611
00612 void MainFrame::helpAbout(wxCommandEvent &) {
00613 wxString msg = wxString(*ffseApp::APP_NAME + wxT(' ') +
00614 *ffseApp::APP_VERSION + wxT('\n') +
00615 *ffseApp::APP_COPYRIGHT + wxT('\n') +
00616 *ffseApp::APP_URL);
00617 wxString title = wxString(wxT("About ") + *ffseApp::APP_NAME + wxT("..."));
00618
00619 wxMessageBox(msg, title, wxOK | wxICON_INFORMATION, this);
00620 }
00621
00622 void MainFrame::goldChange(wxCommandEvent &) {
00623 if (!isOpen()) {
00624 return;
00625 }
00626
00627 game->setGold(atoi(goldText->GetValue().mb_str()));
00628 }
00629
00630 void MainFrame::itemQuantityChange(wxScrollEvent &event) {
00631 if (!isOpen()) {
00632 return;
00633 }
00634
00635 wxSlider *ctrl = (wxSlider *)event.GetEventObject();
00636 int item = HOUSE;
00637
00638 if (ctrl == healSlider) {
00639 item = HEALP;
00640 } else if (ctrl == pureSlider) {
00641 item = PUREP;
00642 } else if (ctrl == softSlider) {
00643 item = SOFTP;
00644 } else if (ctrl == tentSlider) {
00645 item = TENT;
00646 } else if (ctrl == cabinSlider) {
00647 item = CABIN;
00648 }
00649
00650 game->setItem(item, ctrl->GetValue());
00651 }
00652
00653 void MainFrame::itemHaveChange(wxCommandEvent &event) {
00654 if (!isOpen()) {
00655 return;
00656 }
00657
00658 wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
00659 int item = LUTE;
00660
00661 if (ctrl == XRCCTRL(*this, "IDC_GENERAL_CROWN", wxCheckBox)) {
00662 item = CROWN;
00663 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_CRYSTAL", wxCheckBox)) {
00664 item = CRYSTAL;
00665 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_HERB", wxCheckBox)) {
00666 item = HERB;
00667 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_KEY", wxCheckBox)) {
00668 item = KEY;
00669 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_TNT", wxCheckBox)) {
00670 item = TNT;
00671 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_ADAMENT", wxCheckBox)) {
00672 item = ADAMENT;
00673 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_SLAB", wxCheckBox)) {
00674 item = SLAB;
00675 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_RUBY", wxCheckBox)) {
00676 item = RUBY;
00677 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_ROD", wxCheckBox)) {
00678 item = ROD;
00679 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_FLOATER", wxCheckBox)) {
00680 item = FLOATER;
00681 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_CHIME", wxCheckBox)) {
00682 item = CHIME;
00683 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_TAIL", wxCheckBox)) {
00684 item = TAIL;
00685 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_CUBE", wxCheckBox)) {
00686 item = CUBE;
00687 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_BOTTLE", wxCheckBox)) {
00688 item = BOTTLE;
00689 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_OXYALE", wxCheckBox)) {
00690 item = OXYALE;
00691 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_CANOE", wxCheckBox)) {
00692 item = CANOE;
00693 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_FIRE_ORB", wxCheckBox)) {
00694 item = FIREORB;
00695 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_WATER_ORB", wxCheckBox)) {
00696 item = WATERORB;
00697 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_WIND_ORB", wxCheckBox)) {
00698 item = WINDORB;
00699 } else if (ctrl == XRCCTRL(*this, "IDC_GENERAL_EARTH_ORB", wxCheckBox)) {
00700 item = EARTHORB;
00701 }
00702
00703 game->setItem(item, ctrl->IsChecked());
00704 }
00705
00706 void MainFrame::nameChange(wxCommandEvent &) {
00707 if (!isOpen()) {
00708 return;
00709 }
00710
00711 wxString value = nameText->GetValue();
00712 game->setName(member, value);
00713 }
00714
00715 void MainFrame::conditionChange(wxCommandEvent &event) {
00716 if (!isOpen()) {
00717 return;
00718 }
00719
00720 wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00721
00722 if (ctrl == classChoice) {
00723 game->setClass(member, ctrl->GetSelection());
00724 } else if (ctrl == conditionChoice) {
00725 game->setCondition(member, ctrl->GetSelection());
00726 }
00727 }
00728
00729 void MainFrame::statChange(wxCommandEvent &event) {
00730 if (!isOpen()) {
00731 return;
00732 }
00733
00734 wxTextCtrl *ctrl = (wxTextCtrl *)event.GetEventObject();
00735 int value = atoi(ctrl->GetValue().mb_str());
00736
00737 if (ctrl == currentHPText) {
00738 game->setCurrentHP(member, value);
00739 } else if (ctrl == maxHPText) {
00740 game->setMaxHP(member, value);
00741 } else if (ctrl == experienceText) {
00742 game->setExperience(member, value);
00743 } else if (ctrl == strengthText) {
00744 game->setStrength(member, value);
00745 } else if (ctrl == agilityText) {
00746 game->setAgility(member, value);
00747 } else if (ctrl == intelligenceText) {
00748 game->setIntelligence(member, value);
00749 } else if (ctrl == vitalityText) {
00750 game->setVitality(member, value);
00751 } else if (ctrl == luckText) {
00752 game->setLuck(member, value);
00753 } else if (ctrl == damageText) {
00754 game->setDamage(member, ((value > 255) ? 255 : value));
00755 } else if (ctrl == hitPercentText) {
00756 game->setHitPercent(member, ((value > 255) ? 255 : value));
00757 }
00758 }
00759
00760 void MainFrame::weaponChange(wxCommandEvent &event) {
00761 if (!isOpen()) {
00762 return;
00763 }
00764
00765 wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00766 int slot;
00767
00768 for (slot = 0; slot < 4; slot++) {
00769 if (ctrl == weaponChoice[slot]) {
00770 break;
00771 }
00772 }
00773
00774 int weapon = ctrl->GetSelection();
00775
00776 if (weaponEquippedCheck[slot]->IsChecked()) {
00777 weapon |= 0x80;
00778 }
00779
00780 game->setWeapon(member, slot, weapon);
00781 }
00782
00783 void MainFrame::weaponEquippedChange(wxCommandEvent &event) {
00784 if (!isOpen()) {
00785 return;
00786 }
00787
00788 wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
00789 int slot;
00790
00791 for (slot = 0; slot < 4; slot++) {
00792 if (ctrl == weaponEquippedCheck[slot]) {
00793 break;
00794 }
00795 }
00796
00797 int weapon = weaponChoice[slot]->GetSelection();
00798
00799 if (ctrl->IsChecked()) {
00800 weapon |= 0x80;
00801 }
00802
00803 game->setWeapon(member, slot, weapon);
00804 }
00805
00806 void MainFrame::armorChange(wxCommandEvent &event) {
00807 if (!isOpen()) {
00808 return;
00809 }
00810
00811 wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00812 int slot;
00813
00814 for (slot = 0; slot < 4; slot++) {
00815 if (ctrl == armorChoice[slot]) {
00816 break;
00817 }
00818 }
00819
00820 int armor = ctrl->GetSelection();
00821
00822 if (armorEquippedCheck[slot]->IsChecked()) {
00823 armor |= 0x80;
00824 }
00825
00826 game->setArmor(member, slot, armor);
00827 }
00828
00829 void MainFrame::armorEquippedChange(wxCommandEvent &event) {
00830 if (!isOpen()) {
00831 return;
00832 }
00833
00834 wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
00835 int slot;
00836
00837 for (slot = 0; slot < 4; slot++) {
00838 if (ctrl == armorEquippedCheck[slot]) {
00839 break;
00840 }
00841 }
00842
00843 int armor = armorChoice[slot]->GetSelection();
00844
00845 if (ctrl->IsChecked()) {
00846 armor |= 0x80;
00847 }
00848
00849 game->setArmor(member, slot, armor);
00850 }
00851
00852 void MainFrame::currentMagicChange(wxScrollEvent &event) {
00853 if (!isOpen()) {
00854 return;
00855 }
00856
00857 wxSlider *ctrl = (wxSlider *)event.GetEventObject();
00858 int level;
00859
00860 for (level = 0; level < 8; level++) {
00861 if (ctrl == currentMagicSlider[level]) {
00862 break;
00863 }
00864 }
00865
00866 game->setCurrentMagic(member, level, ctrl->GetValue());
00867 }
00868
00869 void MainFrame::maxMagicChange(wxScrollEvent &event) {
00870 if (!isOpen()) {
00871 return;
00872 }
00873
00874 wxSlider *ctrl = (wxSlider *)event.GetEventObject();
00875 int level;
00876
00877 for (level = 0; level < 8; level++) {
00878 if (ctrl == maxMagicSlider[level]) {
00879 break;
00880 }
00881 }
00882
00883 game->setMaxMagic(member, level, ctrl->GetValue());
00884 }
00885
00886 void MainFrame::knownMagicChange(wxCommandEvent &event) {
00887 if (!isOpen()) {
00888 return;
00889 }
00890
00891 wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00892 int level, slot;
00893
00894 for (level = 0; level < 8; level++) {
00895 bool match = false;
00896
00897 for (slot = 0; slot < 3; slot++) {
00898 if (ctrl == knownMagicChoice[level][slot]) {
00899 match = true;
00900 break;
00901 }
00902 }
00903
00904 if (match) {
00905 break;
00906 }
00907 }
00908
00909 game->setMagic(member, level, slot, ctrl->GetSelection());
00910 }
00911
00912 IMPLEMENT_DYNAMIC_CLASS(MainFrame, wxFrame)
00913
00914 BEGIN_EVENT_TABLE(MainFrame, wxFrame)
00915 EVT_CLOSE(MainFrame::windowClosing)
00916
00917 EVT_MENU(wxID_OPEN, MainFrame::fileOpen)
00918 EVT_MENU(wxID_CLOSE, MainFrame::fileClose)
00919 EVT_MENU(wxID_SAVE, MainFrame::fileSave)
00920 EVT_MENU(wxID_SAVEAS, MainFrame::fileSaveAs)
00921 EVT_MENU(wxID_EXIT, MainFrame::fileExit)
00922
00923 EVT_MENU(XRCID("IDM_MEMBER_ONE"), MainFrame::memberChange)
00924 EVT_MENU(XRCID("IDM_MEMBER_TWO"), MainFrame::memberChange)
00925 EVT_MENU(XRCID("IDM_MEMBER_THREE"), MainFrame::memberChange)
00926 EVT_MENU(XRCID("IDM_MEMBER_FOUR"), MainFrame::memberChange)
00927
00928 EVT_MENU(wxID_ABOUT, MainFrame::helpAbout)
00929
00930 EVT_TEXT(XRCID("IDT_GENERAL_GOLD"), MainFrame::goldChange)
00931
00932 EVT_COMMAND_SCROLL(XRCID("IDS_GENERAL_HEAL"), MainFrame::itemQuantityChange)
00933 EVT_COMMAND_SCROLL(XRCID("IDS_GENERAL_PURE"), MainFrame::itemQuantityChange)
00934 EVT_COMMAND_SCROLL(XRCID("IDS_GENERAL_SOFT"), MainFrame::itemQuantityChange)
00935 EVT_COMMAND_SCROLL(XRCID("IDS_GENERAL_TENT"), MainFrame::itemQuantityChange)
00936 EVT_COMMAND_SCROLL(XRCID("IDS_GENERAL_CABIN"), MainFrame::itemQuantityChange)
00937 EVT_COMMAND_SCROLL(XRCID("IDS_GENERAL_HOUSE"), MainFrame::itemQuantityChange)
00938
00939 EVT_CHECKBOX(XRCID("IDC_GENERAL_LUTE"), MainFrame::itemHaveChange)
00940 EVT_CHECKBOX(XRCID("IDC_GENERAL_CROWN"), MainFrame::itemHaveChange)
00941 EVT_CHECKBOX(XRCID("IDC_GENERAL_CRYSTAL"), MainFrame::itemHaveChange)
00942 EVT_CHECKBOX(XRCID("IDC_GENERAL_HERB"), MainFrame::itemHaveChange)
00943 EVT_CHECKBOX(XRCID("IDC_GENERAL_KEY"), MainFrame::itemHaveChange)
00944 EVT_CHECKBOX(XRCID("IDC_GENERAL_TNT"), MainFrame::itemHaveChange)
00945 EVT_CHECKBOX(XRCID("IDC_GENERAL_ADAMENT"), MainFrame::itemHaveChange)
00946 EVT_CHECKBOX(XRCID("IDC_GENERAL_SLAB"), MainFrame::itemHaveChange)
00947 EVT_CHECKBOX(XRCID("IDC_GENERAL_RUBY"), MainFrame::itemHaveChange)
00948 EVT_CHECKBOX(XRCID("IDC_GENERAL_ROD"), MainFrame::itemHaveChange)
00949 EVT_CHECKBOX(XRCID("IDC_GENERAL_FLOATER"), MainFrame::itemHaveChange)
00950 EVT_CHECKBOX(XRCID("IDC_GENERAL_CHIME"), MainFrame::itemHaveChange)
00951 EVT_CHECKBOX(XRCID("IDC_GENERAL_TAIL"), MainFrame::itemHaveChange)
00952 EVT_CHECKBOX(XRCID("IDC_GENERAL_CUBE"), MainFrame::itemHaveChange)
00953 EVT_CHECKBOX(XRCID("IDC_GENERAL_BOTTLE"), MainFrame::itemHaveChange)
00954 EVT_CHECKBOX(XRCID("IDC_GENERAL_OXYALE"), MainFrame::itemHaveChange)
00955 EVT_CHECKBOX(XRCID("IDC_GENERAL_CANOE"), MainFrame::itemHaveChange)
00956 EVT_CHECKBOX(XRCID("IDC_GENERAL_FIRE_ORB"), MainFrame::itemHaveChange)
00957 EVT_CHECKBOX(XRCID("IDC_GENERAL_WATER_ORB"), MainFrame::itemHaveChange)
00958 EVT_CHECKBOX(XRCID("IDC_GENERAL_WIND_ORB"), MainFrame::itemHaveChange)
00959 EVT_CHECKBOX(XRCID("IDC_GENERAL_EARTH_ORB"), MainFrame::itemHaveChange)
00960
00961 EVT_TEXT(XRCID("IDT_CHARACTER_NAME"), MainFrame::nameChange)
00962
00963 EVT_CHOICE(XRCID("IDC_CHARACTER_CLASS"), MainFrame::conditionChange)
00964 EVT_CHOICE(XRCID("IDC_CHARACTER_CONDITION"), MainFrame::conditionChange)
00965
00966 EVT_TEXT(XRCID("IDT_CHARACTER_CURRENT_HP"), MainFrame::statChange)
00967 EVT_TEXT(XRCID("IDT_CHARACTER_MAX_HP"), MainFrame::statChange)
00968 EVT_TEXT(XRCID("IDT_CHARACTER_EXPERIENCE"), MainFrame::statChange)
00969 EVT_TEXT(XRCID("IDT_CHARACTER_STRENGTH"), MainFrame::statChange)
00970 EVT_TEXT(XRCID("IDT_CHARACTER_AGILITY"), MainFrame::statChange)
00971 EVT_TEXT(XRCID("IDT_CHARACTER_INTELLIGENCE"), MainFrame::statChange)
00972 EVT_TEXT(XRCID("IDT_CHARACTER_VITALITY"), MainFrame::statChange)
00973 EVT_TEXT(XRCID("IDT_CHARACTER_LUCK"), MainFrame::statChange)
00974 EVT_TEXT(XRCID("IDT_CHARACTER_DAMAGE"), MainFrame::statChange)
00975 EVT_TEXT(XRCID("IDT_CHARACTER_HIT_PERCENT"), MainFrame::statChange)
00976
00977 EVT_CHOICE(XRCID("IDC_CHARACTER_WEAPON1"), MainFrame::weaponChange)
00978 EVT_CHOICE(XRCID("IDC_CHARACTER_WEAPON2"), MainFrame::weaponChange)
00979 EVT_CHOICE(XRCID("IDC_CHARACTER_WEAPON3"), MainFrame::weaponChange)
00980 EVT_CHOICE(XRCID("IDC_CHARACTER_WEAPON4"), MainFrame::weaponChange)
00981
00982 EVT_CHECKBOX(XRCID("IDC_CHARACTER_WEAPON_EQUIPPED1"),
00983 MainFrame::weaponEquippedChange)
00984 EVT_CHECKBOX(XRCID("IDC_CHARACTER_WEAPON_EQUIPPED2"),
00985 MainFrame::weaponEquippedChange)
00986 EVT_CHECKBOX(XRCID("IDC_CHARACTER_WEAPON_EQUIPPED3"),
00987 MainFrame::weaponEquippedChange)
00988 EVT_CHECKBOX(XRCID("IDC_CHARACTER_WEAPON_EQUIPPED4"),
00989 MainFrame::weaponEquippedChange)
00990
00991 EVT_CHOICE(XRCID("IDC_CHARACTER_ARMOR1"), MainFrame::armorChange)
00992 EVT_CHOICE(XRCID("IDC_CHARACTER_ARMOR2"), MainFrame::armorChange)
00993 EVT_CHOICE(XRCID("IDC_CHARACTER_ARMOR3"), MainFrame::armorChange)
00994 EVT_CHOICE(XRCID("IDC_CHARACTER_ARMOR4"), MainFrame::armorChange)
00995
00996 EVT_CHECKBOX(XRCID("IDC_CHARACTER_ARMOR_EQUIPPED1"),
00997 MainFrame::armorEquippedChange)
00998 EVT_CHECKBOX(XRCID("IDC_CHARACTER_ARMOR_EQUIPPED2"),
00999 MainFrame::armorEquippedChange)
01000 EVT_CHECKBOX(XRCID("IDC_CHARACTER_ARMOR_EQUIPPED3"),
01001 MainFrame::armorEquippedChange)
01002 EVT_CHECKBOX(XRCID("IDC_CHARACTER_ARMOR_EQUIPPED4"),
01003 MainFrame::armorEquippedChange)
01004
01005 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_CURRENT1"),
01006 MainFrame::currentMagicChange)
01007 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_CURRENT2"),
01008 MainFrame::currentMagicChange)
01009 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_CURRENT3"),
01010 MainFrame::currentMagicChange)
01011 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_CURRENT4"),
01012 MainFrame::currentMagicChange)
01013 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_CURRENT5"),
01014 MainFrame::currentMagicChange)
01015 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_CURRENT6"),
01016 MainFrame::currentMagicChange)
01017 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_CURRENT7"),
01018 MainFrame::currentMagicChange)
01019 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_CURRENT8"),
01020 MainFrame::currentMagicChange)
01021
01022 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_MAX1"), MainFrame::maxMagicChange)
01023 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_MAX2"), MainFrame::maxMagicChange)
01024 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_MAX3"), MainFrame::maxMagicChange)
01025 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_MAX4"), MainFrame::maxMagicChange)
01026 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_MAX5"), MainFrame::maxMagicChange)
01027 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_MAX6"), MainFrame::maxMagicChange)
01028 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_MAX7"), MainFrame::maxMagicChange)
01029 EVT_COMMAND_SCROLL(XRCID("IDS_MAGIC_MAX8"), MainFrame::maxMagicChange)
01030
01031 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN11"), MainFrame::knownMagicChange)
01032 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN12"), MainFrame::knownMagicChange)
01033 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN13"), MainFrame::knownMagicChange)
01034 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN21"), MainFrame::knownMagicChange)
01035 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN22"), MainFrame::knownMagicChange)
01036 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN23"), MainFrame::knownMagicChange)
01037 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN31"), MainFrame::knownMagicChange)
01038 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN32"), MainFrame::knownMagicChange)
01039 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN33"), MainFrame::knownMagicChange)
01040 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN41"), MainFrame::knownMagicChange)
01041 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN42"), MainFrame::knownMagicChange)
01042 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN43"), MainFrame::knownMagicChange)
01043 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN51"), MainFrame::knownMagicChange)
01044 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN52"), MainFrame::knownMagicChange)
01045 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN53"), MainFrame::knownMagicChange)
01046 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN61"), MainFrame::knownMagicChange)
01047 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN62"), MainFrame::knownMagicChange)
01048 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN63"), MainFrame::knownMagicChange)
01049 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN71"), MainFrame::knownMagicChange)
01050 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN72"), MainFrame::knownMagicChange)
01051 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN73"), MainFrame::knownMagicChange)
01052 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN81"), MainFrame::knownMagicChange)
01053 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN82"), MainFrame::knownMagicChange)
01054 EVT_CHOICE(XRCID("IDC_MAGIC_KNOWN83"), MainFrame::knownMagicChange)
01055 END_EVENT_TABLE()
01056