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 Centre();
00052
00053 SetDropTarget(new FileDropTarget(this));
00054 }
00055
00056 void MainFrame::CreateControls() {
00057 wxXmlResource::Get()->LoadFrame(this, GetParent(), wxT("ID_FRAME"));
00058 SetIcon(orb32x32_xpm);
00059
00060 XRCCTRL(*this, "ID_NOTEBOOK", wxNotebook)->Show(false);
00061
00062 wxMenuBar *menubar = GetMenuBar();
00063
00064 memberItems[0] = menubar->FindItem(XRCID("IDM_MEMBER_ONE"));
00065 memberItems[0]->Enable(false);
00066
00067 memberItems[1] = menubar->FindItem(XRCID("IDM_MEMBER_TWO"));
00068 memberItems[1]->Enable(false);
00069
00070 memberItems[2] = menubar->FindItem(XRCID("IDM_MEMBER_THREE"));
00071 memberItems[2]->Enable(false);
00072
00073 memberItems[3] = menubar->FindItem(XRCID("IDM_MEMBER_FOUR"));
00074 memberItems[3]->Enable(false);
00075
00076 fileCloseItem = menubar->FindItem(XRCID("IDM_FILE_CLOSE"));
00077 fileSaveItem = menubar->FindItem(XRCID("IDM_FILE_SAVE"));
00078 fileSaveAsItem = menubar->FindItem(XRCID("IDM_FILE_SAVE_AS"));
00079
00080 wxTextValidator numberValidator(wxFILTER_NUMERIC);
00081 goldText = XRCCTRL(*this, "ID_GENERAL_GOLD", wxTextCtrl);
00082 goldText->SetValidator(numberValidator);
00083 goldText->SetMaxLength(6);
00084
00085 healSlider = XRCCTRL(*this, "ID_GENERAL_HEAL", wxSlider);
00086 pureSlider = XRCCTRL(*this, "ID_GENERAL_PURE", wxSlider);
00087 softSlider = XRCCTRL(*this, "ID_GENERAL_SOFT", wxSlider);
00088 tentSlider = XRCCTRL(*this, "ID_GENERAL_TENT", wxSlider);
00089 cabinSlider = XRCCTRL(*this, "ID_GENERAL_CABIN", wxSlider);
00090 houseSlider = XRCCTRL(*this, "ID_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, "ID_CHARACTER_NAME", wxTextCtrl);
00121 nameText->SetValidator(nameValidator);
00122 nameText->SetMaxLength(4);
00123
00124 classChoice = XRCCTRL(*this, "ID_CHARACTER_CLASS", wxChoice);
00125 conditionChoice = XRCCTRL(*this, "ID_CHARACTER_CONDITION", wxChoice);
00126
00127 currentHPText = XRCCTRL(*this, "ID_CHARACTER_CURRENT_HP", wxTextCtrl);
00128 currentHPText->SetValidator(numberValidator);
00129 currentHPText->SetMaxLength(3);
00130
00131 maxHPText = XRCCTRL(*this, "ID_CHARACTER_MAX_HP", wxTextCtrl);
00132 maxHPText->SetValidator(numberValidator);
00133 maxHPText->SetMaxLength(3);
00134
00135 experienceText = XRCCTRL(*this, "ID_CHARACTER_EXPERIENCE", wxTextCtrl);
00136 experienceText->SetValidator(numberValidator);
00137 experienceText->SetMaxLength(6);
00138
00139 strengthText = XRCCTRL(*this, "ID_CHARACTER_STRENGTH", wxTextCtrl);
00140 strengthText->SetValidator(numberValidator);
00141 strengthText->SetMaxLength(2);
00142
00143 agilityText = XRCCTRL(*this, "ID_CHARACTER_AGILITY", wxTextCtrl);
00144 agilityText->SetValidator(numberValidator);
00145 agilityText->SetMaxLength(2);
00146
00147 intelligenceText = XRCCTRL(*this, "ID_CHARACTER_INTELLIGENCE", wxTextCtrl);
00148 intelligenceText->SetValidator(numberValidator);
00149 intelligenceText->SetMaxLength(2);
00150
00151 vitalityText = XRCCTRL(*this, "ID_CHARACTER_VITALITY", wxTextCtrl);
00152 vitalityText->SetValidator(numberValidator);
00153 vitalityText->SetMaxLength(2);
00154
00155 luckText = XRCCTRL(*this, "ID_CHARACTER_LUCK", wxTextCtrl);
00156 luckText->SetValidator(numberValidator);
00157 luckText->SetMaxLength(2);
00158
00159 damageText = XRCCTRL(*this, "ID_CHARACTER_DAMAGE", wxTextCtrl);
00160 damageText->SetValidator(numberValidator);
00161 damageText->SetMaxLength(3);
00162
00163 hitPercentText = XRCCTRL(*this, "ID_CHARACTER_HIT_PERCENT", wxTextCtrl);
00164 hitPercentText->SetValidator(numberValidator);
00165 hitPercentText->SetMaxLength(3);
00166
00167 weaponChoice[0] = XRCCTRL(*this, "ID_CHARACTER_WEAPON1", wxChoice);
00168 weaponEquippedCheck[0] =
00169 XRCCTRL(*this, "ID_CHARACTER_WEAPON_EQUIPPED1", wxCheckBox);
00170 weaponChoice[1] = XRCCTRL(*this, "ID_CHARACTER_WEAPON2", wxChoice);
00171 weaponEquippedCheck[1] =
00172 XRCCTRL(*this, "ID_CHARACTER_WEAPON_EQUIPPED2", wxCheckBox);
00173 weaponChoice[2] = XRCCTRL(*this, "ID_CHARACTER_WEAPON3", wxChoice);
00174 weaponEquippedCheck[2] =
00175 XRCCTRL(*this, "ID_CHARACTER_WEAPON_EQUIPPED3", wxCheckBox);
00176 weaponChoice[3] = XRCCTRL(*this, "ID_CHARACTER_WEAPON4", wxChoice);
00177 weaponEquippedCheck[3] =
00178 XRCCTRL(*this, "ID_CHARACTER_WEAPON_EQUIPPED4", wxCheckBox);
00179
00180 armorChoice[0] = XRCCTRL(*this, "ID_CHARACTER_ARMOR1", wxChoice);
00181 armorEquippedCheck[0] =
00182 XRCCTRL(*this, "ID_CHARACTER_ARMOR_EQUIPPED1", wxCheckBox);
00183 armorChoice[1] = XRCCTRL(*this, "ID_CHARACTER_ARMOR2", wxChoice);
00184 armorEquippedCheck[1] =
00185 XRCCTRL(*this, "ID_CHARACTER_ARMOR_EQUIPPED2", wxCheckBox);
00186 armorChoice[2] = XRCCTRL(*this, "ID_CHARACTER_ARMOR3", wxChoice);
00187 armorEquippedCheck[2] =
00188 XRCCTRL(*this, "ID_CHARACTER_ARMOR_EQUIPPED3", wxCheckBox);
00189 armorChoice[3] = XRCCTRL(*this, "ID_CHARACTER_ARMOR4", wxChoice);
00190 armorEquippedCheck[3] =
00191 XRCCTRL(*this, "ID_CHARACTER_ARMOR_EQUIPPED4", wxCheckBox);
00192
00193 currentMagicSlider[0] = XRCCTRL(*this, "ID_MAGIC_CURRENT1", wxSlider);
00194 maxMagicSlider[0] = XRCCTRL(*this, "ID_MAGIC_MAX1", wxSlider);
00195 currentMagicSlider[1] = XRCCTRL(*this, "ID_MAGIC_CURRENT2", wxSlider);
00196 maxMagicSlider[1] = XRCCTRL(*this, "ID_MAGIC_MAX2", wxSlider);
00197 currentMagicSlider[2] = XRCCTRL(*this, "ID_MAGIC_CURRENT3", wxSlider);
00198 maxMagicSlider[2] = XRCCTRL(*this, "ID_MAGIC_MAX3", wxSlider);
00199 currentMagicSlider[3] = XRCCTRL(*this, "ID_MAGIC_CURRENT4", wxSlider);
00200 maxMagicSlider[3] = XRCCTRL(*this, "ID_MAGIC_MAX4", wxSlider);
00201 currentMagicSlider[4] = XRCCTRL(*this, "ID_MAGIC_CURRENT5", wxSlider);
00202 maxMagicSlider[4] = XRCCTRL(*this, "ID_MAGIC_MAX5", wxSlider);
00203 currentMagicSlider[5] = XRCCTRL(*this, "ID_MAGIC_CURRENT6", wxSlider);
00204 maxMagicSlider[5] = XRCCTRL(*this, "ID_MAGIC_MAX6", wxSlider);
00205 currentMagicSlider[6] = XRCCTRL(*this, "ID_MAGIC_CURRENT7", wxSlider);
00206 maxMagicSlider[6] = XRCCTRL(*this, "ID_MAGIC_MAX7", wxSlider);
00207 currentMagicSlider[7] = XRCCTRL(*this, "ID_MAGIC_CURRENT8", wxSlider);
00208 maxMagicSlider[7] = XRCCTRL(*this, "ID_MAGIC_MAX8", wxSlider);
00209
00210 knownMagicChoice[0][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN11", wxChoice);
00211 knownMagicChoice[0][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN12", wxChoice);
00212 knownMagicChoice[0][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN13", wxChoice);
00213 knownMagicChoice[1][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN21", wxChoice);
00214 knownMagicChoice[1][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN22", wxChoice);
00215 knownMagicChoice[1][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN23", wxChoice);
00216 knownMagicChoice[2][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN31", wxChoice);
00217 knownMagicChoice[2][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN32", wxChoice);
00218 knownMagicChoice[2][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN33", wxChoice);
00219 knownMagicChoice[3][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN41", wxChoice);
00220 knownMagicChoice[3][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN42", wxChoice);
00221 knownMagicChoice[3][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN43", wxChoice);
00222 knownMagicChoice[4][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN51", wxChoice);
00223 knownMagicChoice[4][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN52", wxChoice);
00224 knownMagicChoice[4][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN53", wxChoice);
00225 knownMagicChoice[5][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN61", wxChoice);
00226 knownMagicChoice[5][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN62", wxChoice);
00227 knownMagicChoice[5][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN63", wxChoice);
00228 knownMagicChoice[6][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN71", wxChoice);
00229 knownMagicChoice[6][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN72", wxChoice);
00230 knownMagicChoice[6][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN73", wxChoice);
00231 knownMagicChoice[7][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN81", wxChoice);
00232 knownMagicChoice[7][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN82", wxChoice);
00233 knownMagicChoice[7][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN83", wxChoice);
00234
00235 setOpen(false);
00236 }
00237
00238 void MainFrame::setOpen(bool open) {
00239 fileSaveItem->Enable(open);
00240 fileSaveAsItem->Enable(open);
00241 fileCloseItem->Enable(open);
00242
00243 for (int i = 0; i < 4; i++) {
00244 memberItems[i]->Enable(open);
00245 }
00246
00247 this->open = open;
00248 }
00249
00250 void MainFrame::loadCharacterData(int member) {
00251 this->member = member;
00252
00253 wxString str = game->getName(member);
00254 nameText->SetValue(str);
00255
00256 classChoice->SetSelection(game->getClass(member));
00257 conditionChoice->SetSelection(game->getCondition(member));
00258
00259 str.Printf(wxT("%d"), game->getCurrentHP(member));
00260 currentHPText->SetValue(str);
00261
00262 str.Printf(wxT("%d"), game->getMaxHP(member));
00263 maxHPText->SetValue(str);
00264
00265 str.Printf(wxT("%d"), game->getExperience(member));
00266 experienceText->SetValue(str);
00267
00268 str.Printf(wxT("%d"), game->getStrength(member));
00269 strengthText->SetValue(str);
00270
00271 str.Printf(wxT("%d"), game->getAgility(member));
00272 agilityText->SetValue(str);
00273
00274 str.Printf(wxT("%d"), game->getIntelligence(member));
00275 intelligenceText->SetValue(str);
00276
00277 str.Printf(wxT("%d"), game->getVitality(member));
00278 vitalityText->SetValue(str);
00279
00280 str.Printf(wxT("%d"), game->getLuck(member));
00281 luckText->SetValue(str);
00282
00283 str.Printf(wxT("%d"), game->getDamage(member));
00284 damageText->SetValue(str);
00285
00286 str.Printf(wxT("%d"), game->getHitPercent(member));
00287 hitPercentText->SetValue(str);
00288
00289 for (int pos = 0; pos < 4; pos++) {
00290 int weapon = game->getWeapon(member, pos);
00291 int armor = game->getArmor(member, pos);
00292
00293 weaponChoice[pos]->SetSelection(weapon & 0x7F);
00294 armorChoice[pos]->SetSelection(armor & 0x7F);
00295
00296 weaponEquippedCheck[pos]->SetValue((weapon & 0x80) ? true : false);
00297 armorEquippedCheck[pos]->SetValue((armor & 0x80) ? true : false);
00298 }
00299
00300 for (int level = 0; level < 8; level++) {
00301 int current = game->getCurrentMagic(member, level);
00302 int max = game->getMaxMagic(member, level);
00303
00304 currentMagicSlider[level]->SetValue(current);
00305 maxMagicSlider[level]->SetValue(max);
00306
00307 for (int slot = 0; slot < 3; slot++) {
00308 int magic = game->getMagic(member, level, slot);
00309 knownMagicChoice[level][slot]->SetSelection(magic);
00310 }
00311 }
00312 }
00313
00314 void MainFrame::loadGameData() {
00315 wxString str;
00316 str.Printf(wxT("%d"), game->getGold());
00317
00318 goldText->SetValue(str);
00319
00320 healSlider->SetValue(game->getItem(HEALP));
00321 pureSlider->SetValue(game->getItem(PUREP));
00322 softSlider->SetValue(game->getItem(SOFTP));
00323
00324 tentSlider->SetValue(game->getItem(TENT));
00325 cabinSlider->SetValue(game->getItem(CABIN));
00326 houseSlider->SetValue(game->getItem(HOUSE));
00327
00328 XRCCTRL(*this, "ID_GENERAL_LUTE", wxCheckBox)->
00329 SetValue((game->getItem(LUTE) == 1) ? true : false);
00330 XRCCTRL(*this, "ID_GENERAL_CROWN", wxCheckBox)->
00331 SetValue((game->getItem(CROWN) == 1) ? true : false);
00332 XRCCTRL(*this, "ID_GENERAL_CRYSTAL", wxCheckBox)->
00333 SetValue((game->getItem(CRYSTAL) == 1) ? true : false);
00334 XRCCTRL(*this, "ID_GENERAL_HERB", wxCheckBox)->
00335 SetValue((game->getItem(HERB) == 1) ? true : false);
00336 XRCCTRL(*this, "ID_GENERAL_KEY", wxCheckBox)->
00337 SetValue((game->getItem(KEY) == 1) ? true : false);
00338 XRCCTRL(*this, "ID_GENERAL_TNT", wxCheckBox)->
00339 SetValue((game->getItem(TNT) == 1) ? true : false);
00340 XRCCTRL(*this, "ID_GENERAL_ADAMENT", wxCheckBox)->
00341 SetValue((game->getItem(ADAMENT) == 1) ? true : false);
00342 XRCCTRL(*this, "ID_GENERAL_SLAB", wxCheckBox)->
00343 SetValue((game->getItem(SLAB) == 1) ? true : false);
00344 XRCCTRL(*this, "ID_GENERAL_RUBY", wxCheckBox)->
00345 SetValue((game->getItem(RUBY) == 1) ? true : false);
00346 XRCCTRL(*this, "ID_GENERAL_ROD", wxCheckBox)->
00347 SetValue((game->getItem(ROD) == 1) ? true : false);
00348 XRCCTRL(*this, "ID_GENERAL_FLOATER", wxCheckBox)->
00349 SetValue((game->getItem(FLOATER) == 1) ? true : false);
00350 XRCCTRL(*this, "ID_GENERAL_CHIME", wxCheckBox)->
00351 SetValue((game->getItem(CHIME) == 1) ? true : false);
00352 XRCCTRL(*this, "ID_GENERAL_TAIL", wxCheckBox)->
00353 SetValue((game->getItem(TAIL) == 1) ? true : false);
00354 XRCCTRL(*this, "ID_GENERAL_CUBE", wxCheckBox)->
00355 SetValue((game->getItem(CUBE) == 1) ? true : false);
00356 XRCCTRL(*this, "ID_GENERAL_BOTTLE", wxCheckBox)->
00357 SetValue((game->getItem(BOTTLE) == 1) ? true : false);
00358 XRCCTRL(*this, "ID_GENERAL_OXYALE", wxCheckBox)->
00359 SetValue((game->getItem(OXYALE) == 1) ? true : false);
00360 XRCCTRL(*this, "ID_GENERAL_CANOE", wxCheckBox)->
00361 SetValue((game->getItem(CANOE) == 1) ? true : false);
00362 XRCCTRL(*this, "ID_GENERAL_FIRE_ORB", wxCheckBox)->
00363 SetValue((game->getItem(FIREORB) == 1) ? true : false);
00364 XRCCTRL(*this, "ID_GENERAL_WATER_ORB", wxCheckBox)->
00365 SetValue((game->getItem(WATERORB) == 1) ? true : false);
00366 XRCCTRL(*this, "ID_GENERAL_WIND_ORB", wxCheckBox)->
00367 SetValue((game->getItem(WINDORB) == 1) ? true : false);
00368 XRCCTRL(*this, "ID_GENERAL_EARTH_ORB", wxCheckBox)->
00369 SetValue((game->getItem(EARTHORB) == 1) ? true : false);
00370
00371 loadCharacterData();
00372
00373 XRCCTRL(*this, "ID_NOTEBOOK", wxNotebook)->Show(true);
00374 }
00375
00376 void MainFrame::load(wxString &filename) {
00377 if (!close()) {
00378 return;
00379 }
00380
00381 char nvram[GAME_SIZE];
00382 sram = new char[SRAM_SIZE];
00383
00384 std::ifstream in(filename.mb_str(), std::ios::in | std::ios::binary);
00385
00386 if (!in) {
00387
00388 wxMessageBox(wxT("Unable to open the selected file."),
00389 wxT("File I/O Error"), wxOK | wxICON_ERROR);
00390 return;
00391 }
00392
00393 in.read(sram, SRAM_SIZE);
00394
00395 if (in.rdstate() & std::ios::failbit) {
00396
00397 wxMessageBox(wxT("Unable to read the selected file."),
00398 wxT("File I/O Error"), wxOK | wxICON_ERROR);
00399 return;
00400 }
00401
00402 in.close();
00403
00404 memcpy(nvram, (sram + GAME_OFFSET), GAME_SIZE);
00405 game = new SaveSlot(nvram);
00406
00407 if (game->isValid()) {
00408 loadGameData();
00409 setOpen(true);
00410
00411 wxString bakfile = filename + wxT(".bak");
00412 std::ofstream out(bakfile.mb_str(), std::ios::out | std::ios::binary);
00413
00414 if (out) {
00415 out.write(sram, SRAM_SIZE);
00416 out.close();
00417 }
00418 } else {
00419 wxMessageBox(wxT("No game data found in the file you loaded."),
00420 wxT("Error: No Data Found"), wxOK | wxICON_ERROR);
00421
00422 delete sram;
00423 delete game;
00424 }
00425 }
00426
00427 void MainFrame::fileOpen(wxCommandEvent &) {
00428 static wxFileDialog *dlg = new wxFileDialog(this,
00429 wxT("Choose a .SAV File"), wxT(""), wxT(""),
00430 wxT("NES SRAM File (*.sav)|*.sav"), (wxOPEN | wxCHANGE_DIR));
00431
00432 int value = dlg->ShowModal();
00433
00434 if (value == wxID_OK) {
00435 sramFile = dlg->GetPath();
00436 load(sramFile);
00437 }
00438 }
00439
00440 bool MainFrame::close() {
00441 if (!isOpen()) {
00442 return true;
00443 }
00444
00445 if (game->isModified()) {
00446 int choice = wxMessageBox(wxT("Save Game File Before Closing?"),
00447 wxT("Warning: Unsaved Changes"),
00448 wxYES_NO | wxCANCEL | wxICON_QUESTION,
00449 this);
00450
00451 if (choice == wxYES) {
00452 if (!save(sramFile)) {
00453 return false;
00454 }
00455 } else if (choice == wxCANCEL) {
00456 return false;
00457 }
00458 }
00459
00460 delete game;
00461 delete sram;
00462
00463 memberItems[0]->Check(true);
00464 XRCCTRL(*this, "ID_NOTEBOOK", wxNotebook)->Show(false);
00465
00466 setOpen(false);
00467
00468 return true;
00469 }
00470
00471 void MainFrame::fileClose(wxCommandEvent &) {
00472 close();
00473 }
00474
00475 bool MainFrame::isValidEquipment() {
00476 bool weapon;
00477 bool armor;
00478 bool shield;
00479 bool helmet;
00480 bool gauntlet;
00481
00482 for (int member = 0; member < 4; member++) {
00483 weapon = false;
00484 armor = false;
00485 shield = false;
00486 helmet = false;
00487 gauntlet = false;
00488
00489 for (int slot = 0; slot < 4; slot++) {
00490 int item = game->getWeapon(member, slot);
00491
00492 if ((item >= 0x81) && (item <= 0xA8)) {
00493 if (weapon) {
00494 return false;
00495 }
00496
00497 weapon = true;
00498 }
00499
00500 item = game->getArmor(member, slot);
00501
00502 if ((item >= 0x81) && (item <= 0x90)) {
00503 if (armor) {
00504 return false;
00505 }
00506
00507 armor = true;
00508 } else if ((item >= 0x91) && (item <= 0x99)) {
00509 if (shield) {
00510 return false;
00511 }
00512
00513 shield = true;
00514 } else if ((item >= 0x9A) && (item <= 0xA0)) {
00515 if (helmet) {
00516 return false;
00517 }
00518
00519 helmet = true;
00520 } else if ((item >= 0xA1) && (item <= 0xA8)) {
00521 if (gauntlet) {
00522 return false;
00523 }
00524
00525 gauntlet = true;
00526 }
00527 }
00528 }
00529
00530 return true;
00531 }
00532
00533 bool MainFrame::save(wxString &filename) {
00534 if (!isValidEquipment()) {
00535 int choice = wxMessageBox(
00536 wxT("At least one party member has duplicate equipment.\n")
00537 wxT("Continue Saving?"), wxT("Error: Invalid Equipment"),
00538 wxYES | wxNO | wxICON_QUESTION);
00539
00540 if (choice != wxYES) {
00541 return false;
00542 }
00543 }
00544
00545 memcpy((sram + GAME_OFFSET), game->nvram, GAME_SIZE);
00546
00547 std::ofstream out(filename.mb_str(), std::ios::binary | std::ios::out);
00548
00549 if (!out) {
00550 wxMessageBox(wxT("Unable to open the SRAM file."),
00551 wxT("File Open Error"), wxOK | wxICON_ERROR);
00552 return false;
00553 }
00554
00555 out.write(sram, SRAM_SIZE);
00556
00557 if (out.rdstate() && std::ios::failbit) {
00558 wxMessageBox(wxT("Unable to write to the SRAM file."),
00559 wxT("File I/O Error"), wxOK | wxICON_ERROR);
00560 out.close();
00561 return false;
00562 }
00563
00564 out.close();
00565
00566 game->setModified(false);
00567
00568 return true;
00569 }
00570
00571 void MainFrame::fileSave(wxCommandEvent &) {
00572 save(sramFile);
00573 }
00574
00575 void MainFrame::fileSaveAs(wxCommandEvent &) {
00576 static wxFileDialog *dlg = new wxFileDialog(this,
00577 wxT("Choose a .SAV File"), wxT(""), wxT(""),
00578 wxT("NES SRAM File (*.sav)|*.sav"), (wxSAVE | wxCHANGE_DIR));
00579
00580 int value = dlg->ShowModal();
00581
00582 if (value == wxID_OK) {
00583 sramFile = dlg->GetPath();
00584 save(sramFile);
00585 }
00586 }
00587
00588 void MainFrame::fileExit(wxCommandEvent &) {
00589 if (close()) {
00590 Close(true);
00591 }
00592 }
00593
00594 void MainFrame::windowClosing(wxCloseEvent &event) {
00595 if (event.CanVeto()) {
00596 if (!close()) {
00597 event.Veto();
00598 return;
00599 }
00600 }
00601
00602 Destroy();
00603 }
00604
00605 void MainFrame::memberChange(wxCommandEvent &event) {
00606 setOpen(false);
00607
00608 int id = event.GetId();
00609
00610 if (id == XRCID("IDM_MEMBER_ONE")) {
00611 loadCharacterData(0);
00612 } else if (id == XRCID("IDM_MEMBER_TWO")) {
00613 loadCharacterData(1);
00614 } else if (id == XRCID("IDM_MEMBER_THREE")) {
00615 loadCharacterData(2);
00616 } else if (id == XRCID("IDM_MEMBER_FOUR")) {
00617 loadCharacterData(3);
00618 }
00619
00620 setOpen(true);
00621 }
00622
00623 void MainFrame::helpAbout(wxCommandEvent &) {
00624 wxString msg = wxString(*ffseApp::APP_NAME + wxT(' ') +
00625 *ffseApp::APP_VERSION + wxT('\n') +
00626 *ffseApp::APP_COPYRIGHT);
00627 wxString title = wxString(wxT("About ") + *ffseApp::APP_NAME + wxT("..."));
00628
00629 wxMessageBox(msg, title, wxOK | wxICON_INFORMATION, this);
00630 }
00631
00632 void MainFrame::goldChange(wxCommandEvent &) {
00633 if (!isOpen()) {
00634 return;
00635 }
00636
00637 game->setGold(atoi(goldText->GetValue().mb_str()));
00638 }
00639
00640 void MainFrame::itemQuantityChange(wxScrollEvent &event) {
00641 if (!isOpen()) {
00642 return;
00643 }
00644
00645 wxSlider *ctrl = (wxSlider *)event.GetEventObject();
00646 int item = HOUSE;
00647
00648 if (ctrl == healSlider) {
00649 item = HEALP;
00650 } else if (ctrl == pureSlider) {
00651 item = PUREP;
00652 } else if (ctrl == softSlider) {
00653 item = SOFTP;
00654 } else if (ctrl == tentSlider) {
00655 item = TENT;
00656 } else if (ctrl == cabinSlider) {
00657 item = CABIN;
00658 }
00659
00660 game->setItem(item, ctrl->GetValue());
00661 }
00662
00663 void MainFrame::itemHaveChange(wxCommandEvent &event) {
00664 if (!isOpen()) {
00665 return;
00666 }
00667
00668 wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
00669 int item = LUTE;
00670
00671 if (ctrl == XRCCTRL(*this, "ID_GENERAL_CROWN", wxCheckBox)) {
00672 item = CROWN;
00673 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_CRYSTAL", wxCheckBox)) {
00674 item = CRYSTAL;
00675 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_HERB", wxCheckBox)) {
00676 item = HERB;
00677 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_KEY", wxCheckBox)) {
00678 item = KEY;
00679 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_TNT", wxCheckBox)) {
00680 item = TNT;
00681 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_ADAMENT", wxCheckBox)) {
00682 item = ADAMENT;
00683 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_SLAB", wxCheckBox)) {
00684 item = SLAB;
00685 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_RUBY", wxCheckBox)) {
00686 item = RUBY;
00687 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_ROD", wxCheckBox)) {
00688 item = ROD;
00689 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_FLOATER", wxCheckBox)) {
00690 item = FLOATER;
00691 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_CHIME", wxCheckBox)) {
00692 item = CHIME;
00693 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_TAIL", wxCheckBox)) {
00694 item = TAIL;
00695 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_CUBE", wxCheckBox)) {
00696 item = CUBE;
00697 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_BOTTLE", wxCheckBox)) {
00698 item = BOTTLE;
00699 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_OXYALE", wxCheckBox)) {
00700 item = OXYALE;
00701 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_CANOE", wxCheckBox)) {
00702 item = CANOE;
00703 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_FIRE_ORB", wxCheckBox)) {
00704 item = FIREORB;
00705 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_WATER_ORB", wxCheckBox)) {
00706 item = WATERORB;
00707 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_WIND_ORB", wxCheckBox)) {
00708 item = WINDORB;
00709 } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_EARTH_ORB", wxCheckBox)) {
00710 item = EARTHORB;
00711 }
00712
00713 game->setItem(item, ctrl->IsChecked());
00714 }
00715
00716 void MainFrame::nameChange(wxCommandEvent &) {
00717 if (!isOpen()) {
00718 return;
00719 }
00720
00721 wxString value = nameText->GetValue();
00722 game->setName(member, value);
00723 }
00724
00725 void MainFrame::conditionChange(wxCommandEvent &event) {
00726 if (!isOpen()) {
00727 return;
00728 }
00729
00730 wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00731
00732 if (ctrl == classChoice) {
00733 game->setClass(member, ctrl->GetSelection());
00734 } else if (ctrl == conditionChoice) {
00735 game->setCondition(member, ctrl->GetSelection());
00736 }
00737 }
00738
00739 void MainFrame::statChange(wxCommandEvent &event) {
00740 if (!isOpen()) {
00741 return;
00742 }
00743
00744 wxTextCtrl *ctrl = (wxTextCtrl *)event.GetEventObject();
00745 int value = atoi(ctrl->GetValue().mb_str());
00746
00747 if (ctrl == currentHPText) {
00748 game->setCurrentHP(member, value);
00749 } else if (ctrl == maxHPText) {
00750 game->setMaxHP(member, value);
00751 } else if (ctrl == experienceText) {
00752 game->setExperience(member, value);
00753 } else if (ctrl == strengthText) {
00754 game->setStrength(member, value);
00755 } else if (ctrl == agilityText) {
00756 game->setAgility(member, value);
00757 } else if (ctrl == intelligenceText) {
00758 game->setIntelligence(member, value);
00759 } else if (ctrl == vitalityText) {
00760 game->setVitality(member, value);
00761 } else if (ctrl == luckText) {
00762 game->setLuck(member, value);
00763 } else if (ctrl == damageText) {
00764 game->setDamage(member, ((value > 255) ? 255 : value));
00765 } else if (ctrl == hitPercentText) {
00766 game->setHitPercent(member, ((value > 255) ? 255 : value));
00767 }
00768 }
00769
00770 void MainFrame::weaponChange(wxCommandEvent &event) {
00771 if (!isOpen()) {
00772 return;
00773 }
00774
00775 wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00776 int slot;
00777
00778 for (slot = 0; slot < 4; slot++) {
00779 if (ctrl == weaponChoice[slot]) {
00780 break;
00781 }
00782 }
00783
00784 int weapon = ctrl->GetSelection();
00785
00786 if (weaponEquippedCheck[slot]->IsChecked()) {
00787 weapon |= 0x80;
00788 }
00789
00790 game->setWeapon(member, slot, weapon);
00791 }
00792
00793 void MainFrame::weaponEquippedChange(wxCommandEvent &event) {
00794 if (!isOpen()) {
00795 return;
00796 }
00797
00798 wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
00799 int slot;
00800
00801 for (slot = 0; slot < 4; slot++) {
00802 if (ctrl == weaponEquippedCheck[slot]) {
00803 break;
00804 }
00805 }
00806
00807 int weapon = weaponChoice[slot]->GetSelection();
00808
00809 if (ctrl->IsChecked()) {
00810 weapon |= 0x80;
00811 }
00812
00813 game->setWeapon(member, slot, weapon);
00814 }
00815
00816 void MainFrame::armorChange(wxCommandEvent &event) {
00817 if (!isOpen()) {
00818 return;
00819 }
00820
00821 wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00822 int slot;
00823
00824 for (slot = 0; slot < 4; slot++) {
00825 if (ctrl == armorChoice[slot]) {
00826 break;
00827 }
00828 }
00829
00830 int armor = ctrl->GetSelection();
00831
00832 if (armorEquippedCheck[slot]->IsChecked()) {
00833 armor |= 0x80;
00834 }
00835
00836 game->setArmor(member, slot, armor);
00837 }
00838
00839 void MainFrame::armorEquippedChange(wxCommandEvent &event) {
00840 if (!isOpen()) {
00841 return;
00842 }
00843
00844 wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
00845 int slot;
00846
00847 for (slot = 0; slot < 4; slot++) {
00848 if (ctrl == armorEquippedCheck[slot]) {
00849 break;
00850 }
00851 }
00852
00853 int armor = armorChoice[slot]->GetSelection();
00854
00855 if (ctrl->IsChecked()) {
00856 armor |= 0x80;
00857 }
00858
00859 game->setArmor(member, slot, armor);
00860 }
00861
00862 void MainFrame::currentMagicChange(wxScrollEvent &event) {
00863 if (!isOpen()) {
00864 return;
00865 }
00866
00867 wxSlider *ctrl = (wxSlider *)event.GetEventObject();
00868 int level;
00869
00870 for (level = 0; level < 8; level++) {
00871 if (ctrl == currentMagicSlider[level]) {
00872 break;
00873 }
00874 }
00875
00876 game->setCurrentMagic(member, level, ctrl->GetValue());
00877 }
00878
00879 void MainFrame::maxMagicChange(wxScrollEvent &event) {
00880 if (!isOpen()) {
00881 return;
00882 }
00883
00884 wxSlider *ctrl = (wxSlider *)event.GetEventObject();
00885 int level;
00886
00887 for (level = 0; level < 8; level++) {
00888 if (ctrl == maxMagicSlider[level]) {
00889 break;
00890 }
00891 }
00892
00893 game->setMaxMagic(member, level, ctrl->GetValue());
00894 }
00895
00896 void MainFrame::knownMagicChange(wxCommandEvent &event) {
00897 if (!isOpen()) {
00898 return;
00899 }
00900
00901 wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00902 int level, slot;
00903
00904 for (level = 0; level < 8; level++) {
00905 bool match = false;
00906
00907 for (slot = 0; slot < 3; slot++) {
00908 if (ctrl == knownMagicChoice[level][slot]) {
00909 match = true;
00910 break;
00911 }
00912 }
00913
00914 if (match) {
00915 break;
00916 }
00917 }
00918
00919 game->setMagic(member, level, slot, ctrl->GetSelection());
00920 }
00921
00922 IMPLEMENT_DYNAMIC_CLASS(MainFrame, wxFrame)
00923
00924 BEGIN_EVENT_TABLE(MainFrame, wxFrame)
00925 EVT_CLOSE(MainFrame::windowClosing)
00926
00927 EVT_MENU(XRCID("IDM_FILE_OPEN"), MainFrame::fileOpen)
00928 EVT_MENU(XRCID("IDM_FILE_CLOSE"), MainFrame::fileClose)
00929 EVT_MENU(XRCID("IDM_FILE_SAVE"), MainFrame::fileSave)
00930 EVT_MENU(XRCID("IDM_FILE_SAVE_AS"), MainFrame::fileSaveAs)
00931 EVT_MENU(XRCID("IDM_FILE_EXIT"), MainFrame::fileExit)
00932
00933 EVT_MENU(XRCID("IDM_MEMBER_ONE"), MainFrame::memberChange)
00934 EVT_MENU(XRCID("IDM_MEMBER_TWO"), MainFrame::memberChange)
00935 EVT_MENU(XRCID("IDM_MEMBER_THREE"), MainFrame::memberChange)
00936 EVT_MENU(XRCID("IDM_MEMBER_FOUR"), MainFrame::memberChange)
00937
00938 EVT_MENU(XRCID("IDM_HELP_ABOUT"), MainFrame::helpAbout)
00939
00940 EVT_TEXT(XRCID("ID_GENERAL_GOLD"), MainFrame::goldChange)
00941
00942 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_HEAL"), MainFrame::itemQuantityChange)
00943 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_PURE"), MainFrame::itemQuantityChange)
00944 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_SOFT"), MainFrame::itemQuantityChange)
00945 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_TENT"), MainFrame::itemQuantityChange)
00946 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_CABIN"), MainFrame::itemQuantityChange)
00947 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_HOUSE"), MainFrame::itemQuantityChange)
00948
00949 EVT_CHECKBOX(XRCID("ID_GENERAL_LUTE"), MainFrame::itemHaveChange)
00950 EVT_CHECKBOX(XRCID("ID_GENERAL_CROWN"), MainFrame::itemHaveChange)
00951 EVT_CHECKBOX(XRCID("ID_GENERAL_CRYSTAL"), MainFrame::itemHaveChange)
00952 EVT_CHECKBOX(XRCID("ID_GENERAL_HERB"), MainFrame::itemHaveChange)
00953 EVT_CHECKBOX(XRCID("ID_GENERAL_KEY"), MainFrame::itemHaveChange)
00954 EVT_CHECKBOX(XRCID("ID_GENERAL_TNT"), MainFrame::itemHaveChange)
00955 EVT_CHECKBOX(XRCID("ID_GENERAL_ADAMENT"), MainFrame::itemHaveChange)
00956 EVT_CHECKBOX(XRCID("ID_GENERAL_SLAB"), MainFrame::itemHaveChange)
00957 EVT_CHECKBOX(XRCID("ID_GENERAL_RUBY"), MainFrame::itemHaveChange)
00958 EVT_CHECKBOX(XRCID("ID_GENERAL_ROD"), MainFrame::itemHaveChange)
00959 EVT_CHECKBOX(XRCID("ID_GENERAL_FLOATER"), MainFrame::itemHaveChange)
00960 EVT_CHECKBOX(XRCID("ID_GENERAL_CHIME"), MainFrame::itemHaveChange)
00961 EVT_CHECKBOX(XRCID("ID_GENERAL_TAIL"), MainFrame::itemHaveChange)
00962 EVT_CHECKBOX(XRCID("ID_GENERAL_CUBE"), MainFrame::itemHaveChange)
00963 EVT_CHECKBOX(XRCID("ID_GENERAL_BOTTLE"), MainFrame::itemHaveChange)
00964 EVT_CHECKBOX(XRCID("ID_GENERAL_OXYALE"), MainFrame::itemHaveChange)
00965 EVT_CHECKBOX(XRCID("ID_GENERAL_CANOE"), MainFrame::itemHaveChange)
00966 EVT_CHECKBOX(XRCID("ID_GENERAL_FIRE_ORB"), MainFrame::itemHaveChange)
00967 EVT_CHECKBOX(XRCID("ID_GENERAL_WATER_ORB"), MainFrame::itemHaveChange)
00968 EVT_CHECKBOX(XRCID("ID_GENERAL_WIND_ORB"), MainFrame::itemHaveChange)
00969 EVT_CHECKBOX(XRCID("ID_GENERAL_EARTH_ORB"), MainFrame::itemHaveChange)
00970
00971 EVT_TEXT(XRCID("ID_CHARACTER_NAME"), MainFrame::nameChange)
00972
00973 EVT_CHOICE(XRCID("ID_CHARACTER_CLASS"), MainFrame::conditionChange)
00974 EVT_CHOICE(XRCID("ID_CHARACTER_CONDITION"), MainFrame::conditionChange)
00975
00976 EVT_TEXT(XRCID("ID_CHARACTER_CURRENT_HP"), MainFrame::statChange)
00977 EVT_TEXT(XRCID("ID_CHARACTER_MAX_HP"), MainFrame::statChange)
00978 EVT_TEXT(XRCID("ID_CHARACTER_EXPERIENCE"), MainFrame::statChange)
00979 EVT_TEXT(XRCID("ID_CHARACTER_STRENGTH"), MainFrame::statChange)
00980 EVT_TEXT(XRCID("ID_CHARACTER_AGILITY"), MainFrame::statChange)
00981 EVT_TEXT(XRCID("ID_CHARACTER_INTELLIGENCE"), MainFrame::statChange)
00982 EVT_TEXT(XRCID("ID_CHARACTER_VITALITY"), MainFrame::statChange)
00983 EVT_TEXT(XRCID("ID_CHARACTER_LUCK"), MainFrame::statChange)
00984 EVT_TEXT(XRCID("ID_CHARACTER_DAMAGE"), MainFrame::statChange)
00985 EVT_TEXT(XRCID("ID_CHARACTER_HIT_PERCENT"), MainFrame::statChange)
00986
00987 EVT_CHOICE(XRCID("ID_CHARACTER_WEAPON1"), MainFrame::weaponChange)
00988 EVT_CHOICE(XRCID("ID_CHARACTER_WEAPON2"), MainFrame::weaponChange)
00989 EVT_CHOICE(XRCID("ID_CHARACTER_WEAPON3"), MainFrame::weaponChange)
00990 EVT_CHOICE(XRCID("ID_CHARACTER_WEAPON4"), MainFrame::weaponChange)
00991
00992 EVT_CHECKBOX(XRCID("ID_CHARACTER_WEAPON_EQUIPPED1"),
00993 MainFrame::weaponEquippedChange)
00994 EVT_CHECKBOX(XRCID("ID_CHARACTER_WEAPON_EQUIPPED2"),
00995 MainFrame::weaponEquippedChange)
00996 EVT_CHECKBOX(XRCID("ID_CHARACTER_WEAPON_EQUIPPED3"),
00997 MainFrame::weaponEquippedChange)
00998 EVT_CHECKBOX(XRCID("ID_CHARACTER_WEAPON_EQUIPPED4"),
00999 MainFrame::weaponEquippedChange)
01000
01001 EVT_CHOICE(XRCID("ID_CHARACTER_ARMOR1"), MainFrame::armorChange)
01002 EVT_CHOICE(XRCID("ID_CHARACTER_ARMOR2"), MainFrame::armorChange)
01003 EVT_CHOICE(XRCID("ID_CHARACTER_ARMOR3"), MainFrame::armorChange)
01004 EVT_CHOICE(XRCID("ID_CHARACTER_ARMOR4"), MainFrame::armorChange)
01005
01006 EVT_CHECKBOX(XRCID("ID_CHARACTER_ARMOR_EQUIPPED1"),
01007 MainFrame::armorEquippedChange)
01008 EVT_CHECKBOX(XRCID("ID_CHARACTER_ARMOR_EQUIPPED2"),
01009 MainFrame::armorEquippedChange)
01010 EVT_CHECKBOX(XRCID("ID_CHARACTER_ARMOR_EQUIPPED3"),
01011 MainFrame::armorEquippedChange)
01012 EVT_CHECKBOX(XRCID("ID_CHARACTER_ARMOR_EQUIPPED4"),
01013 MainFrame::armorEquippedChange)
01014
01015 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT1"),
01016 MainFrame::currentMagicChange)
01017 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT2"),
01018 MainFrame::currentMagicChange)
01019 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT3"),
01020 MainFrame::currentMagicChange)
01021 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT4"),
01022 MainFrame::currentMagicChange)
01023 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT5"),
01024 MainFrame::currentMagicChange)
01025 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT6"),
01026 MainFrame::currentMagicChange)
01027 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT7"),
01028 MainFrame::currentMagicChange)
01029 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT8"),
01030 MainFrame::currentMagicChange)
01031
01032 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX1"), MainFrame::maxMagicChange)
01033 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX2"), MainFrame::maxMagicChange)
01034 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX3"), MainFrame::maxMagicChange)
01035 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX4"), MainFrame::maxMagicChange)
01036 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX5"), MainFrame::maxMagicChange)
01037 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX6"), MainFrame::maxMagicChange)
01038 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX7"), MainFrame::maxMagicChange)
01039 EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX8"), MainFrame::maxMagicChange)
01040
01041 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN11"), MainFrame::knownMagicChange)
01042 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN12"), MainFrame::knownMagicChange)
01043 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN13"), MainFrame::knownMagicChange)
01044 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN21"), MainFrame::knownMagicChange)
01045 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN22"), MainFrame::knownMagicChange)
01046 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN23"), MainFrame::knownMagicChange)
01047 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN31"), MainFrame::knownMagicChange)
01048 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN32"), MainFrame::knownMagicChange)
01049 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN33"), MainFrame::knownMagicChange)
01050 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN41"), MainFrame::knownMagicChange)
01051 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN42"), MainFrame::knownMagicChange)
01052 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN43"), MainFrame::knownMagicChange)
01053 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN51"), MainFrame::knownMagicChange)
01054 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN52"), MainFrame::knownMagicChange)
01055 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN53"), MainFrame::knownMagicChange)
01056 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN61"), MainFrame::knownMagicChange)
01057 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN62"), MainFrame::knownMagicChange)
01058 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN63"), MainFrame::knownMagicChange)
01059 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN71"), MainFrame::knownMagicChange)
01060 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN72"), MainFrame::knownMagicChange)
01061 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN73"), MainFrame::knownMagicChange)
01062 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN81"), MainFrame::knownMagicChange)
01063 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN82"), MainFrame::knownMagicChange)
01064 EVT_CHOICE(XRCID("ID_MAGIC_KNOWN83"), MainFrame::knownMagicChange)
01065 END_EVENT_TABLE()
01066