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 <cstring>
00038 #include <fstream>
00039
00040 #include "hack4u.hh"
00041 #include "exceptions/FileIOException.hh"
00042 #include "exceptions/InvalidSRAMException.hh"
00043 #include "res/icon16x16.xpm"
00044 #include "model/SaveSlot.hh"
00045 #include "view/FileDropTarget.hh"
00046 #include "view/MainFrame.hh"
00047
00048 using namespace hack4u;
00049
00050 const wxString MainFrame::CHARACTER_NAMES[] = {
00051 wxT("Mage"), wxT("Bard"), wxT("Fighter"), wxT("Druid"),
00052 wxT("Tinker"), wxT("Paladin"), wxT("Ranger"), wxT("Shepherd")
00053 };
00054
00055 const wxString MainFrame::CITY_NAMES[] = {
00056 wxT("Moonglow"), wxT("Britain"), wxT("Jhelom"), wxT("Yew"),
00057 wxT("Minoc"), wxT("Trinsic"), wxT("Skara Brae"), wxT("Magincia")
00058 };
00059
00060 const std::pair<int, int> MainFrame::BALLOON_LOCATIONS[] = {
00061 std::pair<int, int>(131, 224), std::pair<int, int>(108, 84),
00062 std::pair<int, int>(218, 38), std::pair<int, int>(45, 57),
00063 std::pair<int, int>(22, 159), std::pair<int, int>(186, 104),
00064 std::pair<int, int>(130, 22), std::pair<int, int>(171, 188),
00065
00066 std::pair<int, int>(106, 216), std::pair<int, int>(50, 26),
00067 std::pair<int, int>(244, 147),
00068
00069 std::pair<int, int>(148, 96), std::pair<int, int>(59, 199),
00070 std::pair<int, int>(159, 136), std::pair<int, int>(92, 137)
00071 };
00072
00073 const std::pair<int, int> MainFrame::PIRATESHIP_LOCATIONS[] = {
00074 std::pair<int, int>(134, 230), std::pair<int, int>(109, 84),
00075 std::pair<int, int>(222, 40), std::pair<int, int>(18, 57),
00076 std::pair<int, int>(19, 168), std::pair<int, int>(184, 108),
00077 std::pair<int, int>(127, 19), std::pair<int, int>(169, 190),
00078
00079 std::pair<int, int>(108, 216), std::pair<int, int>(47, 26),
00080 std::pair<int, int>(242, 148),
00081
00082 std::pair<int, int>(145, 96), std::pair<int, int>(59, 196),
00083 std::pair<int, int>(158, 134), std::pair<int, int>(92, 135)
00084 };
00085
00086 const int MainFrame::INN_INDEX[] = {
00087 1, 1, 1, 1, 1, 0, 1, 2, 3, 4, 5, 6, 1, 1, 7
00088 };
00089
00090 MainFrame::MainFrame() : saveslot(0), sram(0), location(LMOONGLOW),
00091 ignoreEvents(false), open(false) {
00092 SetParent(NULL);
00093 CreateControls();
00094 GetSizer()->SetSizeHints(this);
00095 Centre();
00096
00097 XRCCTRL(*this, "IDN_HACK4U", wxNotebook)->Show(false);
00098
00099 SetDropTarget(new FileDropTarget(this));
00100 }
00101
00102 void MainFrame::CreateControls() {
00103 wxXmlResource::Get()->LoadFrame(this, GetParent(), wxT("IDF_HACK4U"));
00104 SetIcon(wxIcon(icon16x16_xpm));
00105
00106 wxMenuBar *mb = GetMenuBar();
00107 gameMenu = mb->FindMenu(wxT("Game"));
00108 locationMenu = mb->FindMenu(wxT("Location"));
00109
00110 mb->EnableTop(gameMenu, false);
00111 mb->EnableTop(locationMenu, false);
00112
00113 wxArrayString letters;
00114 letters.Add(wxT("A")); letters.Add(wxT("B")); letters.Add(wxT("C"));
00115 letters.Add(wxT("D")); letters.Add(wxT("E")); letters.Add(wxT("F"));
00116 letters.Add(wxT("G")); letters.Add(wxT("H")); letters.Add(wxT("I"));
00117 letters.Add(wxT("J")); letters.Add(wxT("K")); letters.Add(wxT("L"));
00118 letters.Add(wxT("M")); letters.Add(wxT("N")); letters.Add(wxT("O"));
00119 letters.Add(wxT("P")); letters.Add(wxT("Q")); letters.Add(wxT("R"));
00120 letters.Add(wxT("S")); letters.Add(wxT("T")); letters.Add(wxT("U"));
00121 letters.Add(wxT("V")); letters.Add(wxT("W")); letters.Add(wxT("X"));
00122 letters.Add(wxT("Y")); letters.Add(wxT("Z")); letters.Add(wxT("a"));
00123 letters.Add(wxT("b")); letters.Add(wxT("c")); letters.Add(wxT("d"));
00124 letters.Add(wxT("e")); letters.Add(wxT("f")); letters.Add(wxT("g"));
00125 letters.Add(wxT("h")); letters.Add(wxT("i")); letters.Add(wxT("j"));
00126 letters.Add(wxT("k")); letters.Add(wxT("l")); letters.Add(wxT("m"));
00127 letters.Add(wxT("n")); letters.Add(wxT("o")); letters.Add(wxT("p"));
00128 letters.Add(wxT("q")); letters.Add(wxT("r")); letters.Add(wxT("s"));
00129 letters.Add(wxT("t")); letters.Add(wxT("u")); letters.Add(wxT("v"));
00130 letters.Add(wxT("w")); letters.Add(wxT("x")); letters.Add(wxT("y"));
00131 letters.Add(wxT("z")); letters.Add(wxT("!")); letters.Add(wxT("-"));
00132 letters.Add(wxT("_"));
00133
00134 wxTextValidator herosNameValidator(wxFILTER_INCLUDE_CHAR_LIST);
00135 herosNameValidator.SetIncludes(letters);
00136
00137 XRCCTRL(*this, "IDT_HERO_NAME", wxTextCtrl)->
00138 SetValidator(herosNameValidator);
00139
00140 wxTextValidator numberValidator(wxFILTER_NUMERIC);
00141
00142 XRCCTRL(*this, "IDT_PARTY_GOLD", wxTextCtrl)->SetValidator(numberValidator);
00143 XRCCTRL(*this, "IDT_CHARACTER_HP", wxTextCtrl)->
00144 SetValidator(numberValidator);
00145 XRCCTRL(*this, "IDT_CHARACTER_MP", wxTextCtrl)->
00146 SetValidator(numberValidator);
00147 XRCCTRL(*this, "IDT_CHARACTER_EXPERIENCE", wxTextCtrl)->
00148 SetValidator(numberValidator);
00149 XRCCTRL(*this, "IDT_CHARACTER_MAXHP", wxTextCtrl)->
00150 SetValidator(numberValidator);
00151 XRCCTRL(*this, "IDT_CHARACTER_MAXMP", wxTextCtrl)->
00152 SetValidator(numberValidator);
00153 XRCCTRL(*this, "IDT_CHARACTER_STRENGTH", wxTextCtrl)->
00154 SetValidator(numberValidator);
00155 XRCCTRL(*this, "IDT_CHARACTER_INTELLIGENCE", wxTextCtrl)->
00156 SetValidator(numberValidator);
00157 XRCCTRL(*this, "IDT_CHARACTER_DEXTERITY", wxTextCtrl)->
00158 SetValidator(numberValidator);
00159
00160 wxArrayString numbers;
00161 numbers.Add(wxT("2")); numbers.Add(wxT("3")); numbers.Add(wxT("4"));
00162 numbers.Add(wxT("5")); numbers.Add(wxT("6")); numbers.Add(wxT("7"));
00163 numbers.Add(wxT("8"));
00164
00165 wxTextValidator levelValidator(wxFILTER_INCLUDE_CHAR_LIST);
00166 levelValidator.SetIncludes(numbers);
00167
00168 XRCCTRL(*this, "IDT_CHARACTER_LEVEL", wxTextCtrl)->
00169 SetValidator(levelValidator);
00170
00171 memberChoice[0] = XRCCTRL(*this, "IDC_PARTY_MEMBER1", wxChoice);
00172 memberChoice[1] = XRCCTRL(*this, "IDC_PARTY_MEMBER2", wxChoice);
00173 memberChoice[2] = XRCCTRL(*this, "IDC_PARTY_MEMBER3", wxChoice);
00174 memberChoice[3] = XRCCTRL(*this, "IDC_PARTY_MEMBER4", wxChoice);
00175
00176 itemChoice[0] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT1", wxChoice);
00177 itemEquippedCheck[0] =
00178 XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED1", wxCheckBox);
00179
00180 itemChoice[1] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT2", wxChoice);
00181 itemEquippedCheck[1] =
00182 XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED2", wxCheckBox);
00183
00184 itemChoice[2] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT3", wxChoice);
00185 itemEquippedCheck[2] =
00186 XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED3", wxCheckBox);
00187
00188 itemChoice[3] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT4", wxChoice);
00189 itemEquippedCheck[3] =
00190 XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED4", wxCheckBox);
00191
00192 itemChoice[4] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT5", wxChoice);
00193 itemEquippedCheck[4] =
00194 XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED5", wxCheckBox);
00195
00196 itemChoice[5] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT6", wxChoice);
00197 itemEquippedCheck[5] =
00198 XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED6", wxCheckBox);
00199 }
00200
00201 void MainFrame::setEquipment(int slot) {
00202 enum Character character = static_cast<enum Character>
00203 (XRCCTRL(*this, "IDRB_CHARACTER_SELECT", wxRadioBox)->GetSelection());
00204 int item = itemChoice[slot]->GetSelection();
00205
00206 if (itemEquippedCheck[slot]->IsChecked() && (item > 0)) {
00207 item |= 0x80;
00208 }
00209
00210 saveslot->setEquipment(character, slot, item);
00211 }
00212
00213 void MainFrame::setFeluccaOptions(enum City trammel) {
00214 wxChoice *feluccaChoice =
00215 XRCCTRL(*this, "IDC_TRANSPORTATION_FELUCCA", wxChoice);
00216 feluccaChoice->Clear();
00217
00218 switch (trammel) {
00219 case MOONGLOW:
00220 feluccaChoice->Append(CITY_NAMES[MOONGLOW]);
00221 feluccaChoice->Append(CITY_NAMES[BRITAIN]);
00222 feluccaChoice->Append(CITY_NAMES[JHELOM]);
00223 break;
00224 case BRITAIN:
00225 feluccaChoice->Append(CITY_NAMES[YEW]);
00226 feluccaChoice->Append(CITY_NAMES[MINOC]);
00227 feluccaChoice->Append(CITY_NAMES[TRINSIC]);
00228 break;
00229 case JHELOM:
00230 feluccaChoice->Append(CITY_NAMES[SKARABRAE]);
00231 feluccaChoice->Append(CITY_NAMES[MAGINCIA]);
00232 feluccaChoice->Append(CITY_NAMES[MOONGLOW]);
00233 break;
00234 case YEW:
00235 feluccaChoice->Append(CITY_NAMES[BRITAIN]);
00236 feluccaChoice->Append(CITY_NAMES[JHELOM]);
00237 feluccaChoice->Append(CITY_NAMES[YEW]);
00238 break;
00239 case MINOC:
00240 feluccaChoice->Append(CITY_NAMES[MINOC]);
00241 feluccaChoice->Append(CITY_NAMES[TRINSIC]);
00242 feluccaChoice->Append(CITY_NAMES[SKARABRAE]);
00243 break;
00244 case TRINSIC:
00245 feluccaChoice->Append(CITY_NAMES[MAGINCIA]);
00246 feluccaChoice->Append(CITY_NAMES[MOONGLOW]);
00247 feluccaChoice->Append(CITY_NAMES[BRITAIN]);
00248 break;
00249 case SKARABRAE:
00250 feluccaChoice->Append(CITY_NAMES[JHELOM]);
00251 feluccaChoice->Append(CITY_NAMES[YEW]);
00252 feluccaChoice->Append(CITY_NAMES[MINOC]);
00253 break;
00254 case MAGINCIA:
00255 feluccaChoice->Append(CITY_NAMES[TRINSIC]);
00256 feluccaChoice->Append(CITY_NAMES[SKARABRAE]);
00257 feluccaChoice->Append(CITY_NAMES[MAGINCIA]);
00258 break;
00259 }
00260
00261 feluccaChoice->SetSelection(0);
00262 }
00263
00264 bool MainFrame::hasValidEquipment(enum Character character) const {
00265 bool bow = false;
00266 bool weapon = false;
00267 bool armor = false;
00268
00269 for (int i = 0; i < 6; ++i) {
00270 int item = saveslot->getEquipment(character, i);
00271
00272 if (item & 0x80) {
00273 item &= 0x7F;
00274
00275 if ((item > 0x1) && (item <= 0x4)) {
00276 if (bow) {
00277 return false;
00278 }
00279
00280 bow = true;
00281 } else if ((item > 0x4) && (item <= 0xF)) {
00282 if (weapon) {
00283 return false;
00284 }
00285
00286 weapon = true;
00287 } else if ((item > 0xF) && (item <= 0x19)) {
00288 if (armor) {
00289 return false;
00290 }
00291
00292 armor = true;
00293 }
00294 }
00295 }
00296
00297 return true;
00298 }
00299
00300 bool MainFrame::isValidParty() const {
00301 char members = 0;
00302 bool end = false;
00303
00304 for (int i = 0; i < 4; ++i) {
00305 int member = memberChoice[i]->GetSelection();
00306
00307 if (i > 0) {
00308 member--;
00309 }
00310
00311 if (member == -1) {
00312 end = true;
00313 } else {
00314 if (members & (1 << member)) {
00315 return false;
00316 }
00317
00318 if (end) {
00319 return false;
00320 }
00321
00322 members |= (1 << member);
00323 }
00324 }
00325
00326 return true;
00327 }
00328
00329 bool MainFrame::close() {
00330
00331 wxASSERT(isOpen());
00332
00333 if (sram->isModified()) {
00334 int choice = wxMessageBox(wxT("Save Game File Before Closing?"),
00335 wxT("Warning: Unsaved Changes"),
00336 wxYES_NO | wxCANCEL | wxICON_QUESTION,
00337 this);
00338
00339 if (choice == wxYES) {
00340 if (!save(sramFile)) {
00341 return false;
00342 }
00343 } else if (choice == wxCANCEL) {
00344 return false;
00345 }
00346 }
00347
00348 XRCCTRL(*this, "IDN_HACK4U", wxNotebook)->Show(false);
00349 GetMenuBar()->FindItem(XRCID("IDM_GAME_GAME1"))->Check();
00350
00351 open = false;
00352
00353 delete sram;
00354 sram = 0;
00355
00356 GetMenuBar()->EnableTop(gameMenu, false);
00357 GetMenuBar()->EnableTop(locationMenu, false);
00358
00359 return true;
00360 }
00361
00362 void MainFrame::load(const wxString &filename) {
00363 if (isOpen()) {
00364 if (!close()) {
00365 return;
00366 }
00367 }
00368
00369 try {
00370 sram = new SRAMFile(filename);
00371 } catch (InvalidSRAMException &e) {
00372 if (e.getError() == ISE_NOSUCHFILE) {
00373
00374 wxMessageBox(wxT("Unable to open the SRAM file."),
00375 wxT("File Open Error"), wxOK | wxICON_ERROR);
00376 } else if (e.getError() == ISE_IOERROR) {
00377 wxMessageBox(wxT("Unable to read the SRAM file."),
00378 wxT("File I/O Error"), wxOK | wxICON_ERROR);
00379 } else {
00380
00381 wxASSERT(e.getError() == ISE_BADCHECKSUM);
00382
00383 wxMessageBox(wxT("No Ultima: Quest of the Avatar games"
00384 " exist in the SRAM file you loaded."),
00385 wxT("Error: No Games Found"), wxOK | wxICON_ERROR);
00386 }
00387
00388 return;
00389 }
00390
00391 for (int i = 0; i < 3; ++i) {
00392 if (sram->isValid(i)) {
00393 loadGame(i);
00394 break;
00395 }
00396 }
00397
00398 open = true;
00399
00400 GetMenuBar()->EnableTop(gameMenu, true);
00401 GetMenuBar()->EnableTop(locationMenu, true);
00402 }
00403
00404 void MainFrame::loadGame(int game) {
00405 saveslot = sram->getSaveSlot(game);
00406
00407 ignoreEvents = true;
00408
00409
00410 XRCCTRL(*this, "IDT_HERO_NAME", wxTextCtrl)->
00411 SetValue(saveslot->getHerosName());
00412
00413
00414 XRCCTRL(*this, "IDS_HERO_HONESTY", wxSlider)->
00415 SetValue(saveslot->getVirtue(HONESTY));
00416 XRCCTRL(*this, "IDS_HERO_COMPASSION", wxSlider)->
00417 SetValue(saveslot->getVirtue(COMPASSION));
00418 XRCCTRL(*this, "IDS_HERO_VALOR", wxSlider)->
00419 SetValue(saveslot->getVirtue(VALOR));
00420 XRCCTRL(*this, "IDS_HERO_JUSTICE", wxSlider)->
00421 SetValue(saveslot->getVirtue(JUSTICE));
00422 XRCCTRL(*this, "IDS_HERO_SACRIFICE", wxSlider)->
00423 SetValue(saveslot->getVirtue(SACRIFICE));
00424 XRCCTRL(*this, "IDS_HERO_HONOR", wxSlider)->
00425 SetValue(saveslot->getVirtue(HONOR));
00426 XRCCTRL(*this, "IDS_HERO_SPIRITUALITY", wxSlider)->
00427 SetValue(saveslot->getVirtue(SPIRITUALITY));
00428 XRCCTRL(*this, "IDS_HERO_HUMILITY", wxSlider)->
00429 SetValue(saveslot->getVirtue(HUMILITY));
00430
00431
00432 XRCCTRL(*this, "IDC_PARTY_START", wxChoice)->
00433 SetSelection(INN_INDEX[saveslot->getStartLocation()]);
00434
00435
00436 XRCCTRL(*this, "IDT_PARTY_GOLD", wxTextCtrl)->
00437 SetValue(wxString::Format(wxT("%d"), saveslot->getGold()));
00438
00439
00440 XRCCTRL(*this, "IDC_PARTY_MEMBER1", wxChoice)->
00441 SetSelection(saveslot->getMember(0) - 1);
00442 XRCCTRL(*this, "IDC_PARTY_MEMBER2", wxChoice)->
00443 SetSelection(saveslot->getMember(1));
00444 XRCCTRL(*this, "IDC_PARTY_MEMBER3", wxChoice)->
00445 SetSelection(saveslot->getMember(2));
00446 XRCCTRL(*this, "IDC_PARTY_MEMBER4", wxChoice)->
00447 SetSelection(saveslot->getMember(3));
00448
00449
00450 XRCCTRL(*this, "IDC_PARTY_MAGE", wxCheckBox)->
00451 SetValue(saveslot->hasJoined(MAGE));
00452 XRCCTRL(*this, "IDC_PARTY_BARD", wxCheckBox)->
00453 SetValue(saveslot->hasJoined(BARD));
00454 XRCCTRL(*this, "IDC_PARTY_FIGHTER", wxCheckBox)->
00455 SetValue(saveslot->hasJoined(FIGHTER));
00456 XRCCTRL(*this, "IDC_PARTY_DRUID", wxCheckBox)->
00457 SetValue(saveslot->hasJoined(DRUID));
00458 XRCCTRL(*this, "IDC_PARTY_TINKER", wxCheckBox)->
00459 SetValue(saveslot->hasJoined(TINKER));
00460 XRCCTRL(*this, "IDC_PARTY_PALADIN", wxCheckBox)->
00461 SetValue(saveslot->hasJoined(PALADIN));
00462 XRCCTRL(*this, "IDC_PARTY_RANGER", wxCheckBox)->
00463 SetValue(saveslot->hasJoined(RANGER));
00464 XRCCTRL(*this, "IDC_PARTY_SHEPHERD", wxCheckBox)->
00465 SetValue(saveslot->hasJoined(SHEPHERD));
00466
00467
00468 XRCCTRL(*this, "IDC_PARTY_LIGHT", wxCheckBox)->
00469 SetValue(saveslot->hasMagic(LIGHT));
00470 XRCCTRL(*this, "IDC_PARTY_MISSILE", wxCheckBox)->
00471 SetValue(saveslot->hasMagic(MISSILE));
00472 XRCCTRL(*this, "IDC_PARTY_AWAKEN", wxCheckBox)->
00473 SetValue(saveslot->hasMagic(AWAKEN));
00474 XRCCTRL(*this, "IDC_PARTY_CURE", wxCheckBox)->
00475 SetValue(saveslot->hasMagic(CURE));
00476 XRCCTRL(*this, "IDC_PARTY_WIND", wxCheckBox)->
00477 SetValue(saveslot->hasMagic(WIND));
00478 XRCCTRL(*this, "IDC_PARTY_HEAL", wxCheckBox)->
00479 SetValue(saveslot->hasMagic(HEAL));
00480 XRCCTRL(*this, "IDC_PARTY_FIRE", wxCheckBox)->
00481 SetValue(saveslot->hasMagic(FIRE));
00482 XRCCTRL(*this, "IDC_PARTY_EXIT", wxCheckBox)->
00483 SetValue(saveslot->hasMagic(EXIT));
00484 XRCCTRL(*this, "IDC_PARTY_DISPEL", wxCheckBox)->
00485 SetValue(saveslot->hasMagic(DISPEL));
00486 XRCCTRL(*this, "IDC_PARTY_VIEW", wxCheckBox)->
00487 SetValue(saveslot->hasMagic(VIEW));
00488 XRCCTRL(*this, "IDC_PARTY_PROTECT", wxCheckBox)->
00489 SetValue(saveslot->hasMagic(PROTECT));
00490 XRCCTRL(*this, "IDC_PARTY_ICE", wxCheckBox)->
00491 SetValue(saveslot->hasMagic(ICE));
00492 XRCCTRL(*this, "IDC_PARTY_BLINK", wxCheckBox)->
00493 SetValue(saveslot->hasMagic(BLINK));
00494 XRCCTRL(*this, "IDC_PARTY_ENERGY", wxCheckBox)->
00495 SetValue(saveslot->hasMagic(ENERGY));
00496 XRCCTRL(*this, "IDC_PARTY_QUICK", wxCheckBox)->
00497 SetValue(saveslot->hasMagic(QUICK));
00498 XRCCTRL(*this, "IDC_PARTY_SLEEP", wxCheckBox)->
00499 SetValue(saveslot->hasMagic(SLEEP));
00500 XRCCTRL(*this, "IDC_PARTY_REFLECT", wxCheckBox)->
00501 SetValue(saveslot->hasMagic(REFLECT));
00502 XRCCTRL(*this, "IDC_PARTY_NEGATE", wxCheckBox)->
00503 SetValue(saveslot->hasMagic(NEGATE));
00504 XRCCTRL(*this, "IDC_PARTY_DESTROY", wxCheckBox)->
00505 SetValue(saveslot->hasMagic(DESTROY));
00506 XRCCTRL(*this, "IDC_PARTY_JINX", wxCheckBox)->
00507 SetValue(saveslot->hasMagic(JINX));
00508 XRCCTRL(*this, "IDC_PARTY_SQUISH", wxCheckBox)->
00509 SetValue(saveslot->hasMagic(SQUISH));
00510 XRCCTRL(*this, "IDC_PARTY_GATE", wxCheckBox)->
00511 SetValue(saveslot->hasMagic(GATE));
00512 XRCCTRL(*this, "IDC_PARTY_TREMOR", wxCheckBox)->
00513 SetValue(saveslot->hasMagic(TREMOR));
00514 XRCCTRL(*this, "IDC_PARTY_LIFE", wxCheckBox)->
00515 SetValue(saveslot->hasMagic(LIFE));
00516 XRCCTRL(*this, "IDC_PARTY_DEFEAT", wxCheckBox)->
00517 SetValue(saveslot->hasMagic(DEFEAT));
00518
00519
00520 XRCCTRL(*this, "IDS_INVENTORY_ASH", wxSlider)->
00521 SetValue(saveslot->getHerb(ASH));
00522 XRCCTRL(*this, "IDS_INVENTORY_GINSENG", wxSlider)->
00523 SetValue(saveslot->getHerb(GINSENG));
00524 XRCCTRL(*this, "IDS_INVENTORY_GARLIC", wxSlider)->
00525 SetValue(saveslot->getHerb(GARLIC));
00526 XRCCTRL(*this, "IDS_INVENTORY_SILKWEB", wxSlider)->
00527 SetValue(saveslot->getHerb(SILKWEB));
00528 XRCCTRL(*this, "IDS_INVENTORY_MOSS", wxSlider)->
00529 SetValue(saveslot->getHerb(MOSS));
00530 XRCCTRL(*this, "IDS_INVENTORY_PEARL", wxSlider)->
00531 SetValue(saveslot->getHerb(PEARL));
00532 XRCCTRL(*this, "IDS_INVENTORY_FUNGUS", wxSlider)->
00533 SetValue(saveslot->getHerb(FUNGUS));
00534 XRCCTRL(*this, "IDS_INVENTORY_MANROOT", wxSlider)->
00535 SetValue(saveslot->getHerb(MANROOT));
00536
00537
00538 XRCCTRL(*this, "IDC_INVENTORY_HONESTY", wxCheckBox)->
00539 SetValue(saveslot->hasRune(HONESTY));
00540 XRCCTRL(*this, "IDC_INVENTORY_COMPASSION", wxCheckBox)->
00541 SetValue(saveslot->hasRune(COMPASSION));
00542 XRCCTRL(*this, "IDC_INVENTORY_VALOR", wxCheckBox)->
00543 SetValue(saveslot->hasRune(VALOR));
00544 XRCCTRL(*this, "IDC_INVENTORY_JUSTICE", wxCheckBox)->
00545 SetValue(saveslot->hasRune(JUSTICE));
00546 XRCCTRL(*this, "IDC_INVENTORY_SACRIFICE", wxCheckBox)->
00547 SetValue(saveslot->hasRune(SACRIFICE));
00548 XRCCTRL(*this, "IDC_INVENTORY_HONOR", wxCheckBox)->
00549 SetValue(saveslot->hasRune(HONOR));
00550 XRCCTRL(*this, "IDC_INVENTORY_SPIRITUALITY", wxCheckBox)->
00551 SetValue(saveslot->hasRune(SPIRITUALITY));
00552 XRCCTRL(*this, "IDC_INVENTORY_HUMILITY", wxCheckBox)->
00553 SetValue(saveslot->hasRune(HUMILITY));
00554
00555
00556 XRCCTRL(*this, "IDC_INVENTORY_BLUE", wxCheckBox)->
00557 SetValue(saveslot->hasStone(HONESTY));
00558 XRCCTRL(*this, "IDC_INVENTORY_YELLOW", wxCheckBox)->
00559 SetValue(saveslot->hasStone(COMPASSION));
00560 XRCCTRL(*this, "IDC_INVENTORY_RED", wxCheckBox)->
00561 SetValue(saveslot->hasStone(VALOR));
00562 XRCCTRL(*this, "IDC_INVENTORY_GREEN", wxCheckBox)->
00563 SetValue(saveslot->hasStone(JUSTICE));
00564 XRCCTRL(*this, "IDC_INVENTORY_ORANGE", wxCheckBox)->
00565 SetValue(saveslot->hasStone(SACRIFICE));
00566 XRCCTRL(*this, "IDC_INVENTORY_PURPLE", wxCheckBox)->
00567 SetValue(saveslot->hasStone(HONOR));
00568 XRCCTRL(*this, "IDC_INVENTORY_WHITE", wxCheckBox)->
00569 SetValue(saveslot->hasStone(SPIRITUALITY));
00570 XRCCTRL(*this, "IDC_INVENTORY_BLACK", wxCheckBox)->
00571 SetValue(saveslot->hasStone(HUMILITY));
00572
00573
00574 XRCCTRL(*this, "IDS_INVENTORY_TORCH", wxSlider)->
00575 SetValue(saveslot->getTool(TORCH));
00576 XRCCTRL(*this, "IDS_INVENTORY_GEM", wxSlider)->
00577 SetValue(saveslot->getTool(GEM));
00578 XRCCTRL(*this, "IDS_INVENTORY_OIL", wxSlider)->
00579 SetValue(saveslot->getTool(OIL));
00580
00581 XRCCTRL(*this, "IDC_INVENTORY_KEY", wxCheckBox)->
00582 SetValue(saveslot->getTool(KEY));
00583 XRCCTRL(*this, "IDC_INVENTORY_SEXTANT", wxCheckBox)->
00584 SetValue(saveslot->getTool(SEXTANT));
00585 XRCCTRL(*this, "IDC_INVENTORY_SCALE", wxCheckBox)->
00586 SetValue(saveslot->getTool(SCALE));
00587 XRCCTRL(*this, "IDC_INVENTORY_FLUTE", wxCheckBox)->
00588 SetValue(saveslot->getTool(FLUTE));
00589 XRCCTRL(*this, "IDC_INVENTORY_CANDLE", wxCheckBox)->
00590 SetValue(saveslot->getTool(CANDLE));
00591 XRCCTRL(*this, "IDC_INVENTORY_BOOK", wxCheckBox)->
00592 SetValue(saveslot->getTool(BOOK));
00593 XRCCTRL(*this, "IDC_INVENTORY_BELL", wxCheckBox)->
00594 SetValue(saveslot->getTool(BELL));
00595 XRCCTRL(*this, "IDC_INVENTORY_HORN", wxCheckBox)->
00596 SetValue(saveslot->getTool(HORN));
00597 XRCCTRL(*this, "IDC_INVENTORY_SKULL", wxCheckBox)->
00598 SetValue(saveslot->getTool(SKULL));
00599 XRCCTRL(*this, "IDC_INVENTORY_TRUTHKEY", wxCheckBox)->
00600 SetValue(saveslot->getTool(TRUTHKEY));
00601 XRCCTRL(*this, "IDC_INVENTORY_LOVEKEY", wxCheckBox)->
00602 SetValue(saveslot->getTool(LOVEKEY));
00603 XRCCTRL(*this, "IDC_INVENTORY_COURAGEKEY", wxCheckBox)->
00604 SetValue(saveslot->getTool(COURAGEKEY));
00605 XRCCTRL(*this, "IDC_INVENTORY_WHEEL", wxCheckBox)->
00606 SetValue(saveslot->getTool(WHEEL));
00607
00608
00609 XRCCTRL(*this, "IDC_TRANSPORTATION_TRAMMEL", wxChoice)->
00610 SetSelection(saveslot->getPhase(TRAMMEL));
00611 setFeluccaOptions(static_cast<enum City>(saveslot->getPhase(TRAMMEL)));
00612 XRCCTRL(*this, "IDC_TRANSPORTATION_FELUCCA", wxChoice)->
00613 SetSelection(saveslot->getPhase(FELUCCA));
00614
00615
00616 std::pair<int, int> balloon = saveslot->getBalloonLocation();
00617 XRCCTRL(*this, "IDT_TRANSPORTATION_BALLOONLATITUDE", wxTextCtrl)->
00618 SetValue(wxString::Format(wxT("%d"), balloon.first));
00619 XRCCTRL(*this, "IDT_TRANSPORTATION_BALLOONLONGITUDE", wxTextCtrl)->
00620 SetValue(wxString::Format(wxT("%d"), balloon.second));
00621
00622
00623 std::pair<int, int> whirlpool = saveslot->getWhirlpoolLocation();
00624 XRCCTRL(*this, "IDT_TRANSPORTATION_WHIRLPOOLLATITUDE", wxTextCtrl)->
00625 SetValue(wxString::Format(wxT("%d"), whirlpool.first));
00626 XRCCTRL(*this, "IDT_TRANSPORTATION_WHIRLPOOLLONGITUDE", wxTextCtrl)->
00627 SetValue(wxString::Format(wxT("%d"), whirlpool.second));
00628
00629
00630 XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP1", wxCheckBox)->
00631 SetValue(saveslot->hasPirateShip(SHIP1));
00632 XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP2", wxCheckBox)->
00633 SetValue(saveslot->hasPirateShip(SHIP2));
00634 XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP3", wxCheckBox)->
00635 SetValue(saveslot->hasPirateShip(SHIP3));
00636 XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP4", wxCheckBox)->
00637 SetValue(saveslot->hasPirateShip(SHIP4));
00638
00639 std::pair<int, int> ship = saveslot->getPirateShipLocation(SHIP1);
00640 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP1LATITUDE", wxTextCtrl)->
00641 SetValue(wxString::Format(wxT("%d"), ship.first));
00642 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP1LONGITUDE", wxTextCtrl)->
00643 SetValue(wxString::Format(wxT("%d"), ship.second));
00644
00645 ship = saveslot->getPirateShipLocation(SHIP2);
00646 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP2LATITUDE", wxTextCtrl)->
00647 SetValue(wxString::Format(wxT("%d"), ship.first));
00648 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP2LONGITUDE", wxTextCtrl)->
00649 SetValue(wxString::Format(wxT("%d"), ship.second));
00650
00651 ship = saveslot->getPirateShipLocation(SHIP3);
00652 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP3LATITUDE", wxTextCtrl)->
00653 SetValue(wxString::Format(wxT("%d"), ship.first));
00654 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP3LONGITUDE", wxTextCtrl)->
00655 SetValue(wxString::Format(wxT("%d"), ship.second));
00656
00657 ship = saveslot->getPirateShipLocation(SHIP4);
00658 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP4LATITUDE", wxTextCtrl)->
00659 SetValue(wxString::Format(wxT("%d"), ship.first));
00660 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP4LONGITUDE", wxTextCtrl)->
00661 SetValue(wxString::Format(wxT("%d"), ship.second));
00662
00663
00664 loadStats(static_cast<enum Character>(
00665 XRCCTRL(*this, "IDRB_CHARACTER_SELECT", wxRadioBox)->GetSelection()));
00666
00667
00668 wxNotebook *notebook = XRCCTRL(*this, "IDN_HACK4U", wxNotebook);
00669 notebook->SetSelection(0);
00670 notebook->Show(true);
00671
00672 ignoreEvents = false;
00673 }
00674
00675 void MainFrame::loadStats(enum Character character) {
00676
00677 ignoreEvents = true;
00678
00679 XRCCTRL(*this, "IDT_CHARACTER_LEVEL", wxTextCtrl)->
00680 SetValue(wxString::Format(wxT("%d"), saveslot->getLevel(character)));
00681 XRCCTRL(*this, "IDT_CHARACTER_HP", wxTextCtrl)->
00682 SetValue(wxString::Format(wxT("%d"),
00683 saveslot->getCurrentHP(character)));
00684 XRCCTRL(*this, "IDT_CHARACTER_MP", wxTextCtrl)->
00685 SetValue(wxString::Format(wxT("%d"),
00686 saveslot->getCurrentMP(character)));
00687 XRCCTRL(*this, "IDT_CHARACTER_EXPERIENCE", wxTextCtrl)->
00688 SetValue(wxString::Format(wxT("%d"),
00689 saveslot->getExperience(character)));
00690 XRCCTRL(*this, "IDT_CHARACTER_MAXHP", wxTextCtrl)->
00691 SetValue(wxString::Format(wxT("%d"), saveslot->getMaxHP(character)));
00692 XRCCTRL(*this, "IDT_CHARACTER_MAXMP", wxTextCtrl)->
00693 SetValue(wxString::Format(wxT("%d"), saveslot->getMaxMP(character)));
00694 XRCCTRL(*this, "IDT_CHARACTER_STRENGTH", wxTextCtrl)->
00695 SetValue(wxString::Format(wxT("%d"), saveslot->getStrength(character)));
00696 XRCCTRL(*this, "IDT_CHARACTER_INTELLIGENCE", wxTextCtrl)->
00697 SetValue(wxString::Format(wxT("%d"),
00698 saveslot->getIntelligence(character)));
00699 XRCCTRL(*this, "IDT_CHARACTER_DEXTERITY", wxTextCtrl)->
00700 SetValue(wxString::Format(wxT("%d"),
00701 saveslot->getDexterity(character)));
00702
00703 for (int index = 0; index < 6; ++index) {
00704 int item = saveslot->getEquipment(character, index);
00705
00706 itemChoice[index]->SetSelection(item & 0x7F);
00707 itemEquippedCheck[index]->SetValue(item & 0x80);
00708 }
00709
00710 ignoreEvents = false;
00711 }
00712
00713 bool MainFrame::save(const wxString &filename) {
00714 if (!isValidParty()) {
00715 int choice = wxMessageBox(wxT("Duplicate or missing party members"
00716 " selected.\nContinue Saving?"),
00717 wxT("Warning: Invalid Party"),
00718 wxYES_NO | wxICON_QUESTION,
00719 this);
00720
00721 if (choice != wxYES) {
00722 return false;
00723 }
00724 }
00725
00726 for (int character = MAGE; character < SHEPHERD; ++character) {
00727 if (!hasValidEquipment(static_cast<enum Character>(character))) {
00728 int choice = wxMessageBox(CHARACTER_NAMES[character] +
00729 wxT(" has more than one equipped item of "
00730 "the same type.\nContinue Saving?"),
00731 wxT("Warning: Invalid Equipment"),
00732 wxYES_NO | wxICON_QUESTION,
00733 this);
00734
00735 if (choice != wxYES) {
00736 return false;
00737 }
00738 }
00739 }
00740
00741 try {
00742 sram->save(filename);
00743 } catch (FileIOException &e) {
00744 if (e.getError() == FIE_CANNOTOPEN) {
00745 wxMessageBox(wxT("Unable to open the SRAM file."),
00746 wxT("File Open Error"), wxOK | wxICON_ERROR);
00747
00748 return false;
00749 } else {
00750
00751 wxASSERT(e.getError() == FIE_IOERROR);
00752
00753 wxMessageBox(wxT("Unable to write to the SRAM file."),
00754 wxT("File I/O error"), wxOK | wxICON_ERROR);
00755
00756 return false;
00757 }
00758 }
00759
00760 return true;
00761 }
00762
00763 void MainFrame::onBalloonChange(wxCommandEvent &event) {
00764 if (ignoreEvents) {
00765 return;
00766 }
00767
00768 wxTextCtrl *ctrl = dynamic_cast<wxTextCtrl *>(event.GetEventObject());
00769 int value = std::atoi(ctrl->GetValue());
00770 std::pair<int, int> location = saveslot->getBalloonLocation();
00771
00772 if (event.GetId() == XRCID("IDT_TRANSPORTATION_BALLOONLATITUDE")) {
00773 location.first = value;
00774 } else {
00775
00776 wxASSERT(event.GetId() == XRCID("IDT_TRANSPORTATION_BALLOONLONGITUDE"));
00777
00778 location.second = value;
00779 }
00780
00781 saveslot->setBalloonLocation(location);
00782 }
00783
00784 void MainFrame::onEquipmentChange(wxCommandEvent &event) {
00785 wxChoice *ctrl = dynamic_cast<wxChoice *>(event.GetEventObject());
00786 int slot;
00787
00788 for (slot = 0; slot < 6; ++slot) {
00789 if (ctrl == itemChoice[slot]) {
00790 break;
00791 }
00792 }
00793
00794 setEquipment(slot);
00795 }
00796
00797 void MainFrame::onEquippedChange(wxCommandEvent &event) {
00798 wxCheckBox *ctrl = dynamic_cast<wxCheckBox *>(event.GetEventObject());
00799 int slot;
00800
00801 for (slot = 0; slot < 6; ++slot) {
00802 if (ctrl == itemEquippedCheck[slot]) {
00803 break;
00804 }
00805 }
00806
00807 setEquipment(slot);
00808 }
00809
00810 void MainFrame::onEquippedUpdate(wxUpdateUIEvent &event) {
00811 if (event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED1")) {
00812 event.Enable(itemChoice[0]->GetSelection() > 0);
00813
00814 if (itemChoice[0]->GetSelection() == 0) {
00815 event.Check(false);
00816 }
00817 } else if (event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED2")) {
00818 event.Enable(itemChoice[1]->GetSelection() > 0);
00819
00820 if (itemChoice[1]->GetSelection() == 0) {
00821 event.Check(false);
00822 }
00823 } else if (event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED3")) {
00824 event.Enable(itemChoice[2]->GetSelection() > 0);
00825
00826 if (itemChoice[2]->GetSelection() == 0) {
00827 event.Check(false);
00828 }
00829 } else if (event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED4")) {
00830 event.Enable(itemChoice[3]->GetSelection() > 0);
00831
00832 if (itemChoice[3]->GetSelection() == 0) {
00833 event.Check(false);
00834 }
00835 } else if (event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED5")) {
00836 event.Enable(itemChoice[4]->GetSelection() > 0);
00837
00838 if (itemChoice[4]->GetSelection() == 0) {
00839 event.Check(false);
00840 }
00841 } else {
00842
00843 wxASSERT(event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED6"));
00844
00845 event.Enable(itemChoice[5]->GetSelection() > 0);
00846
00847 if (itemChoice[5]->GetSelection() == 0) {
00848 event.Check(false);
00849 }
00850 }
00851 }
00852
00853 void MainFrame::onFileExit(wxCommandEvent &) {
00854 if (isOpen()) {
00855 if (close()) {
00856 Close(true);
00857 }
00858 } else {
00859 Close(true);
00860 }
00861 }
00862
00863 void MainFrame::onFileOpen(wxCommandEvent &) {
00864 static wxFileDialog *dlg = new wxFileDialog(this,
00865 wxT("Choose a .SAV File"), "", "",
00866 wxT("NES SRAM File (*.sav)|*.sav"), (wxOPEN | wxCHANGE_DIR));
00867
00868 int value = dlg->ShowModal();
00869
00870 if (value == wxID_OK) {
00871 sramFile = dlg->GetPath();
00872 load(sramFile);
00873 }
00874 }
00875
00876 void MainFrame::onFileSaveAs(wxCommandEvent &) {
00877 static wxFileDialog *dlg = new wxFileDialog(this,
00878 wxT("Choose a .SAV File"), "", "",
00879 wxT("NES SRAM File (*.sav)|*.sav"), (wxSAVE | wxCHANGE_DIR));
00880
00881 int value = dlg->ShowModal();
00882
00883 if (value == wxID_OK) {
00884 sramFile = dlg->GetPath();
00885 save(sramFile);
00886 }
00887 }
00888
00889 void MainFrame::onGameChange(wxCommandEvent &event) {
00890 if (event.GetId() == XRCID("IDM_GAME_GAME1")) {
00891 loadGame(0);
00892 } else if (event.GetId() == XRCID("IDM_GAME_GAME2")) {
00893 loadGame(1);
00894 } else if (event.GetId() == XRCID("IDM_GAME_GAME3")) {
00895 loadGame(2);
00896 }
00897 }
00898
00899 void MainFrame::onGameMenuUpdate(wxUpdateUIEvent &event) {
00900 if (isOpen()) {
00901 if (event.GetId() == XRCID("IDM_GAME_GAME1")) {
00902 event.Enable(sram->isValid(0));
00903 } else if (event.GetId() == XRCID("IDM_GAME_GAME2")) {
00904 event.Enable(sram->isValid(1));
00905 } else {
00906
00907 wxASSERT(event.GetId() == XRCID("IDM_GAME_GAME3"));
00908
00909 event.Enable(sram->isValid(2));
00910 }
00911 } else {
00912 event.Enable(false);
00913 }
00914 }
00915
00916 void MainFrame::onGoldChange(wxCommandEvent &) {
00917 if (ignoreEvents) {
00918 return;
00919 }
00920
00921 saveslot->setGold(std::atoi(XRCCTRL(*this,
00922 "IDT_PARTY_GOLD",
00923 wxTextCtrl)->GetValue()));
00924 }
00925
00926 void MainFrame::onHelpAbout(wxCommandEvent &) {
00927 wxMessageDialog dlg(this, *Hack4u::APP_NAME + wxT(' ') +
00928 *Hack4u::APP_VERSION + wxT('\n') +
00929 *Hack4u::APP_COPYRIGHT + wxT('\n') +
00930 *Hack4u::APP_URL, wxT("About ") +
00931 *Hack4u::APP_NAME + wxT("..."),
00932 wxOK | wxICON_INFORMATION);
00933 dlg.ShowModal();
00934 }
00935
00936 void MainFrame::onHerbChange(wxScrollEvent &event) {
00937 enum Herb herb = MANROOT;
00938
00939 if (event.GetId() == XRCID("IDS_INVENTORY_ASH")) {
00940 herb = ASH;
00941 } else if (event.GetId() == XRCID("IDS_INVENTORY_GINSENG")) {
00942 herb = GINSENG;
00943 } else if (event.GetId() == XRCID("IDS_INVENTORY_GARLIC")) {
00944 herb = GARLIC;
00945 } else if (event.GetId() == XRCID("IDS_INVENTORY_SILKWEB")) {
00946 herb = SILKWEB;
00947 } else if (event.GetId() == XRCID("IDS_INVENTORY_MOSS")) {
00948 herb = MOSS;
00949 } else if (event.GetId() == XRCID("IDS_INVENTORY_PEARL")) {
00950 herb = PEARL;
00951 } else if (event.GetId() == XRCID("IDS_INVENTORY_FUNGUS")) {
00952 herb = FUNGUS;
00953 }
00954
00955 saveslot->setHerb(herb, event.GetPosition());
00956 }
00957
00958 void MainFrame::onHerosNameChange(wxCommandEvent &) {
00959 if (ignoreEvents) {
00960 return;
00961 }
00962
00963 saveslot->setHerosName(XRCCTRL(*this,
00964 "IDT_HERO_NAME",
00965 wxTextCtrl)->GetValue());
00966 }
00967
00968 void MainFrame::onJoinedChange(wxCommandEvent &event) {
00969 if (event.GetId() == XRCID("IDC_PARTY_MAGE")) {
00970 saveslot->setJoined(MAGE, event.IsChecked());
00971 } else if (event.GetId() == XRCID("IDC_PARTY_BARD")) {
00972 saveslot->setJoined(BARD, event.IsChecked());
00973 } else if (event.GetId() == XRCID("IDC_PARTY_FIGHTER")) {
00974 saveslot->setJoined(FIGHTER, event.IsChecked());
00975 } else if (event.GetId() == XRCID("IDC_PARTY_DRUID")) {
00976 saveslot->setJoined(DRUID, event.IsChecked());
00977 } else if (event.GetId() == XRCID("IDC_PARTY_TINKER")) {
00978 saveslot->setJoined(TINKER, event.IsChecked());
00979 } else if (event.GetId() == XRCID("IDC_PARTY_PALADIN")) {
00980 saveslot->setJoined(PALADIN, event.IsChecked());
00981 } else if (event.GetId() == XRCID("IDC_PARTY_RANGER")) {
00982 saveslot->setJoined(RANGER, event.IsChecked());
00983 } else {
00984
00985 wxASSERT(event.GetId() == XRCID("IDC_PARTY_SHEPHERD"));
00986
00987 saveslot->setJoined(SHEPHERD, event.IsChecked());
00988 }
00989 }
00990
00991 void MainFrame::onLocationBalloon(wxCommandEvent &) {
00992 const std::pair<int, int> &balloon = BALLOON_LOCATIONS[location];
00993
00994 XRCCTRL(*this, "IDT_TRANSPORTATION_BALLOONLATITUDE", wxTextCtrl)->
00995 SetValue(wxString::Format(wxT("%d"), balloon.first));
00996 XRCCTRL(*this, "IDT_TRANSPORTATION_BALLOONLONGITUDE", wxTextCtrl)->
00997 SetValue(wxString::Format(wxT("%d"), balloon.second));
00998 }
00999
01000 void MainFrame::onLocationPlaceChange(wxCommandEvent &event) {
01001 if (event.GetId() == XRCID("IDM_LOCATION_PLACE_MOONGLOW")) {
01002 location = LMOONGLOW;
01003 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_BRITAIN")) {
01004 location = LBRITAIN;
01005 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_JHELOM")) {
01006 location = LJHELOM;
01007 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_YEW")) {
01008 location = LYEW;
01009 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_MINOC")) {
01010 location = LMINOC;
01011 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_TRINSIC")) {
01012 location = LTRINSIC;
01013 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_SKARABRAE")) {
01014 location = LSKARABRAE;
01015 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_MAGINCIA")) {
01016 location = LMAGINCIA;
01017 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_LYCAEUM")) {
01018 location = LLYCAEUM;
01019 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_EMPATHABBEY")) {
01020 location = LEMPATHABBEY;
01021 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_SERPENTSHOLD")) {
01022 location = LSERPENTSHOLD;
01023 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_PAWS")) {
01024 location = LPAWS;
01025 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_VESPER")) {
01026 location = LVESPER;
01027 } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_BUCCANEERSDEN")) {
01028 location = LBUCCANEERSDEN;
01029 } else {
01030
01031 wxASSERT(event.GetId() == XRCID("IDM_LOCATION_PLACE_COVE"));
01032
01033 location = LCOVE;
01034 }
01035 }
01036
01037 void MainFrame::onLocationShip(wxCommandEvent &event) {
01038 wxCheckBox *check;
01039 wxTextCtrl *latitude, *longitude;
01040 enum PirateShip ship;
01041
01042 if (event.GetId() == XRCID("IDM_LOCATION_SHIP1")) {
01043 ship = SHIP1;
01044 check = XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP1", wxCheckBox);
01045 latitude =
01046 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP1LATITUDE", wxTextCtrl);
01047 longitude =
01048 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP1LONGITUDE", wxTextCtrl);
01049 } else if (event.GetId() == XRCID("IDM_LOCATION_SHIP2")) {
01050 ship = SHIP2;
01051 check = XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP2", wxCheckBox);
01052 latitude =
01053 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP2LATITUDE", wxTextCtrl);
01054 longitude =
01055 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP2LONGITUDE", wxTextCtrl);
01056 } else if (event.GetId() == XRCID("IDM_LOCATION_SHIP3")) {
01057 ship = SHIP3;
01058 check = XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP3", wxCheckBox);
01059 latitude =
01060 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP3LATITUDE", wxTextCtrl);
01061 longitude =
01062 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP3LONGITUDE", wxTextCtrl);
01063 } else {
01064
01065 wxASSERT(event.GetId() == XRCID("IDM_LOCATION_SHIP4"));
01066
01067 ship = SHIP4;
01068 check = XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP4", wxCheckBox);
01069 latitude =
01070 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP4LATITUDE", wxTextCtrl);
01071 longitude =
01072 XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP4LONGITUDE", wxTextCtrl);
01073 }
01074
01075 const std::pair<int, int> &loc = PIRATESHIP_LOCATIONS[location];
01076
01077 check->SetValue(true);
01078 latitude->SetValue(wxString::Format(wxT("%d"), loc.first));
01079 longitude->SetValue(wxString::Format(wxT("%d"), loc.second));
01080
01081 saveslot->setPirateShip(ship, true);
01082 }
01083
01084 void MainFrame::onMagicChange(wxCommandEvent &event) {
01085 enum Magic magic = DEFEAT;
01086
01087 if (event.GetId() == XRCID("IDC_PARTY_LIGHT")) {
01088 magic = LIGHT;
01089 } else if (event.GetId() == XRCID("IDC_PARTY_MISSILE")) {
01090 magic = MISSILE;
01091 } else if (event.GetId() == XRCID("IDC_PARTY_AWAKEN")) {
01092 magic = AWAKEN;
01093 } else if (event.GetId() == XRCID("IDC_PARTY_CURE")) {
01094 magic = CURE;
01095 } else if (event.GetId() == XRCID("IDC_PARTY_WIND")) {
01096 magic = WIND;
01097 } else if (event.GetId() == XRCID("IDC_PARTY_HEAL")) {
01098 magic = HEAL;
01099 } else if (event.GetId() == XRCID("IDC_PARTY_FIRE")) {
01100 magic = FIRE;
01101 } else if (event.GetId() == XRCID("IDC_PARTY_EXIT")) {
01102 magic = EXIT;
01103 } else if (event.GetId() == XRCID("IDC_PARTY_DISPEL")) {
01104 magic = DISPEL;
01105 } else if (event.GetId() == XRCID("IDC_PARTY_VIEW")) {
01106 magic = VIEW;
01107 } else if (event.GetId() == XRCID("IDC_PARTY_PROTECT")) {
01108 magic = PROTECT;
01109 } else if (event.GetId() == XRCID("IDC_PARTY_ICE")) {
01110 magic = ICE;
01111 } else if (event.GetId() == XRCID("IDC_PARTY_BLINK")) {
01112 magic = BLINK;
01113 } else if (event.GetId() == XRCID("IDC_PARTY_ENERGY")) {
01114 magic = ENERGY;
01115 } else if (event.GetId() == XRCID("IDC_PARTY_QUICK")) {
01116 magic = QUICK;
01117 } else if (event.GetId() == XRCID("IDC_PARTY_SLEEP")) {
01118 magic = SLEEP;
01119 } else if (event.GetId() == XRCID("IDC_PARTY_REFLECT")) {
01120 magic = REFLECT;
01121 } else if (event.GetId() == XRCID("IDC_PARTY_NEGATE")) {
01122 magic = NEGATE;
01123 } else if (event.GetId() == XRCID("IDC_PARTY_DESTROY")) {
01124 magic = DESTROY;
01125 } else if (event.GetId() == XRCID("IDC_PARTY_JINX")) {
01126 magic = JINX;
01127 } else if (event.GetId() == XRCID("IDC_PARTY_SQUISH")) {
01128 magic = SQUISH;
01129 } else if (event.GetId() == XRCID("IDC_PARTY_GATE")) {
01130 magic = GATE;
01131 } else if (event.GetId() == XRCID("IDC_PARTY_TREMOR")) {
01132 magic = TREMOR;
01133 } else if (event.GetId() == XRCID("IDC_PARTY_LIFE")) {
01134 magic = LIFE;
01135 }
01136
01137 saveslot->setMagic(magic, event.IsChecked());
01138 }
01139
01140 void MainFrame::onMemberClassChange(wxCommandEvent &event) {
01141 int character = event.GetSelection();
01142 int member = 3;
01143
01144 if (event.GetId() == XRCID("IDC_PARTY_MEMBER1")) {
01145 member = 0;
01146 } else if (event.GetId() == XRCID("IDC_PARTY_MEMBER2")) {
01147 member = 1;
01148
01149 if (character == 0) {
01150
01151 wxCommandEvent evt(wxEVT_COMMAND_CHOICE_SELECTED,
01152 XRCID("IDC_PARTY_MEMBER3"));
01153 evt.SetEventObject(memberChoice[2]);
01154 evt.SetInt(0);
01155 AddPendingEvent(evt);
01156
01157 memberChoice[2]->SetSelection(0);
01158 }
01159 } else if (event.GetId() == XRCID("IDC_PARTY_MEMBER3")) {
01160 member = 2;
01161
01162 if (character == 0) {
01163
01164 wxCommandEvent evt(wxEVT_COMMAND_CHOICE_SELECTED,
01165 XRCID("IDC_PARTY_MEMBER4"));
01166 evt.SetEventObject(memberChoice[3]);
01167 evt.SetInt(0);
01168 AddPendingEvent(evt);
01169
01170 memberChoice[3]->SetSelection(0);
01171 }
01172 }
01173
01174 saveslot->setMember(member, ((member == 0) ?
01175 (character + 1) : character));
01176 }
01177
01178 void MainFrame::onMemberUpdate(wxUpdateUIEvent &event) {
01179 if (event.GetId() == XRCID("IDC_PARTY_MEMBER3")) {
01180 event.Enable(memberChoice[1]->GetSelection() > 0);
01181 } else {
01182
01183 wxASSERT(event.GetId() == XRCID("IDC_PARTY_MEMBER4"));
01184
01185 event.Enable(memberChoice[2]->GetSelection() > 0);
01186 }
01187 }
01188
01189 void MainFrame::onPhaseChange(wxCommandEvent &event) {
01190 enum City trammel;
01191 int felucca;
01192
01193 if (event.GetId() == XRCID("IDC_TRANSPORTATION_TRAMMEL")) {
01194 trammel = static_cast<enum City>(event.GetSelection());
01195 setFeluccaOptions(trammel);
01196 } else {
01197 trammel = static_cast<enum City>
01198 (XRCCTRL(*this,
01199 "IDC_TRANSPORTATION_TRAMMEL",
01200 wxChoice)->GetSelection());
01201 }
01202
01203 felucca =
01204 XRCCTRL(*this, "IDC_TRANSPORTATION_FELUCCA", wxChoice)->GetSelection();
01205 saveslot->setPhase(trammel, felucca);
01206 }
01207
01208 void MainFrame::onRuneChange(wxCommandEvent &event) {
01209 enum Virtue rune = HUMILITY;
01210
01211 if (event.GetId() == XRCID("IDC_INVENTORY_HONESTY")) {
01212 rune = HONESTY;
01213 } else if (event.GetId() == XRCID("IDC_INVENTORY_COMPASSION")) {
01214 rune = COMPASSION;
01215 } else if (event.GetId() == XRCID("IDC_INVENTORY_VALOR")) {
01216 rune = VALOR;
01217 } else if (event.GetId() == XRCID("IDC_INVENTORY_JUSTICE")) {
01218 rune = JUSTICE;
01219 } else if (event.GetId() == XRCID("IDC_INVENTORY_SACRIFICE")) {
01220 rune = SACRIFICE;
01221 } else if (event.GetId() == XRCID("IDC_INVENTORY_HONOR")) {
01222 rune = HONOR;
01223 } else if (event.GetId() == XRCID("IDC_INVENTORY_SPIRITUALITY")) {
01224 rune = SPIRITUALITY;
01225 }
01226
01227 saveslot->setRune(rune, event.IsChecked());
01228 }
01229
01230 void MainFrame::onSaveUpdate(wxUpdateUIEvent &event) {
01231
01232 event.Enable(isOpen() &&
01233 (sram->getSaveSlot(0)->isModified() ||
01234 sram->getSaveSlot(1)->isModified() ||
01235 sram->getSaveSlot(2)->isModified()));
01236 }
01237
01238 void MainFrame::onShipChange(wxCommandEvent &event) {
01239 enum PirateShip ship;
01240
01241 if (event.GetId() == XRCID("IDC_TRANSPORTATION_SHIP1")) {
01242 ship = SHIP1;
01243 } else if (event.GetId() == XRCID("IDC_TRANSPORTATION_SHIP2")) {
01244 ship = SHIP2;
01245 } else if (event.GetId() == XRCID("IDC_TRANSPORTATION_SHIP3")) {
01246 ship = SHIP3;
01247 } else {
01248
01249 wxASSERT(event.GetId() == XRCID("IDC_TRANSPORTATION_SHIP4"));
01250
01251 ship = SHIP4;
01252 }
01253
01254 saveslot->setPirateShip(ship, event.IsChecked());
01255 }
01256
01257 void MainFrame::onShipLocationChange(wxCommandEvent &event) {
01258 if (ignoreEvents) {
01259 return;
01260 }
01261
01262 wxTextCtrl *ctrl = dynamic_cast<wxTextCtrl *>(event.GetEventObject());
01263 int value = std::atoi(ctrl->GetValue());
01264 enum PirateShip ship;
01265 std::pair<int, int> location;
01266
01267 if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP1LATITUDE")) {
01268 ship = SHIP1;
01269 location = saveslot->getPirateShipLocation(ship);
01270 location.first = value;
01271 } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP2LATITUDE")) {
01272 ship = SHIP2;
01273 location = saveslot->getPirateShipLocation(ship);
01274 location.first = value;
01275 } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP3LATITUDE")) {
01276 ship = SHIP3;
01277 location = saveslot->getPirateShipLocation(ship);
01278 location.first = value;
01279 } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP4LATITUDE")) {
01280 ship = SHIP4;
01281 location = saveslot->getPirateShipLocation(ship);
01282 location.first = value;
01283 } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP1LONGITUDE")) {
01284 ship = SHIP1;
01285 location = saveslot->getPirateShipLocation(ship);
01286 location.second = value;
01287 } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP2LONGITUDE")) {
01288 ship = SHIP2;
01289 location = saveslot->getPirateShipLocation(ship);
01290 location.second = value;
01291 } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP3LONGITUDE")) {
01292 ship = SHIP3;
01293 location = saveslot->getPirateShipLocation(ship);
01294 location.second = value;
01295 } else {
01296
01297 wxASSERT(event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP4LONGITUDE"));
01298
01299 ship = SHIP4;
01300 location = saveslot->getPirateShipLocation(ship);
01301 location.second = value;
01302 }
01303
01304 saveslot->setPirateShipLocation(ship, location);
01305 }
01306
01307 void MainFrame::onShipUpdate(wxUpdateUIEvent &event) {
01308 if ((event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP1LATITUDE")) ||
01309 (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP1LONGITUDE"))) {
01310 event.Enable(XRCCTRL(*this,
01311 "IDC_TRANSPORTATION_SHIP1",
01312 wxCheckBox)->IsChecked());
01313 } else if ((event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP2LATITUDE")) ||
01314 (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP2LONGITUDE"))) {
01315 event.Enable(XRCCTRL(*this,
01316 "IDC_TRANSPORTATION_SHIP2",
01317 wxCheckBox)->IsChecked());
01318 } else if ((event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP3LATITUDE")) ||
01319 (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP3LONGITUDE"))) {
01320 event.Enable(XRCCTRL(*this,
01321 "IDC_TRANSPORTATION_SHIP3",
01322 wxCheckBox)->IsChecked());
01323 } else {
01324
01325 wxASSERT((event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP4LATITUDE")) ||
01326 (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP4LONGITUDE")));
01327
01328 event.Enable(XRCCTRL(*this,
01329 "IDC_TRANSPORTATION_SHIP4",
01330 wxCheckBox)->IsChecked());
01331 }
01332 }
01333
01334 void MainFrame::onStartLocationChange(wxCommandEvent &event) {
01335 int city = event.GetSelection();
01336
01337 for (int i = MOONGLOW_INN; i <= VESPER_INN; ++i) {
01338 if (city == INN_INDEX[i]) {
01339 saveslot->setStartLocation(static_cast<enum StartLocation>(i));
01340 break;
01341 }
01342 }
01343 }
01344
01345 void MainFrame::onStatChange(wxCommandEvent &event) {
01346 if (ignoreEvents) {
01347 return;
01348 }
01349
01350 wxTextCtrl *ctrl = dynamic_cast<wxTextCtrl *>(event.GetEventObject());
01351 enum Character character = static_cast<enum Character>
01352 (XRCCTRL(*this, "IDRB_CHARACTER_SELECT", wxRadioBox)->GetSelection());
01353 int value = std::atoi(ctrl->GetValue());
01354
01355 if (event.GetId() == XRCID("IDT_CHARACTER_LEVEL")) {
01356 saveslot->setLevel(character, value);
01357 } else if (event.GetId() == XRCID("IDT_CHARACTER_HP")) {
01358 saveslot->setCurrentHP(character, value);
01359 } else if (event.GetId() == XRCID("IDT_CHARACTER_MP")) {
01360 saveslot->setCurrentMP(character, value);
01361 } else if (event.GetId() == XRCID("IDT_CHARACTER_EXPERIENCE")) {
01362 saveslot->setExperience(character, value);
01363 } else if (event.GetId() == XRCID("IDT_CHARACTER_MAXHP")) {
01364 saveslot->setMaxHP(character, value);
01365 } else if (event.GetId() == XRCID("IDT_CHARACTER_MAXMP")) {
01366 saveslot->setMaxMP(character, value);
01367 } else if (event.GetId() == XRCID("IDT_CHARACTER_STRENGTH")) {
01368 saveslot->setStrength(character, value);
01369 } else if (event.GetId() == XRCID("IDT_CHARACTER_INTELLIGENCE")) {
01370 saveslot->setIntelligence(character, value);
01371 } else if (event.GetId() == XRCID("IDT_CHARACTER_DEXTERITY")) {
01372 saveslot->setDexterity(character, value);
01373 }
01374 }
01375
01376 void MainFrame::onStoneChange(wxCommandEvent &event) {
01377 enum Virtue stone = HUMILITY;
01378
01379 if (event.GetId() == XRCID("IDC_INVENTORY_BLUE")) {
01380 stone = HONESTY;
01381 } else if (event.GetId() == XRCID("IDC_INVENTORY_YELLOW")) {
01382 stone = COMPASSION;
01383 } else if (event.GetId() == XRCID("IDC_INVENTORY_RED")) {
01384 stone = VALOR;
01385 } else if (event.GetId() == XRCID("IDC_INVENTORY_GREEN")) {
01386 stone = JUSTICE;
01387 } else if (event.GetId() == XRCID("IDC_INVENTORY_ORANGE")) {
01388 stone = SACRIFICE;
01389 } else if (event.GetId() == XRCID("IDC_INVENTORY_PURPLE")) {
01390 stone = HONOR;
01391 } else if (event.GetId() == XRCID("IDC_INVENTORY_WHITE")) {
01392 stone = SPIRITUALITY;
01393 }
01394
01395 saveslot->setStone(stone, event.IsChecked());
01396 }
01397
01398 void MainFrame::onToolHaveChange(wxCommandEvent &event) {
01399 enum Tool tool = WHEEL;
01400
01401 if (event.GetId() == XRCID("IDC_INVENTORY_KEY")) {
01402 tool = KEY;
01403 } else if (event.GetId() == XRCID("IDC_INVENTORY_SEXTANT")) {
01404 tool = SEXTANT;
01405 } else if (event.GetId() == XRCID("IDC_INVENTORY_SCALE")) {
01406 tool = SCALE;
01407 } else if (event.GetId() == XRCID("IDC_INVENTORY_FLUTE")) {
01408 tool = FLUTE;
01409 } else if (event.GetId() == XRCID("IDC_INVENTORY_CANDLE")) {
01410 tool = CANDLE;
01411 } else if (event.GetId() == XRCID("IDC_INVENTORY_BOOK")) {
01412 tool = BOOK;
01413 } else if (event.GetId() == XRCID("IDC_INVENTORY_BELL")) {
01414 tool = BELL;
01415 } else if (event.GetId() == XRCID("IDC_INVENTORY_HORN")) {
01416 tool = HORN;
01417 } else if (event.GetId() == XRCID("IDC_INVENTORY_SKULL")) {
01418 tool = SKULL;
01419 } else if (event.GetId() == XRCID("IDC_INVENTORY_TRUTHKEY")) {
01420 tool = TRUTHKEY;
01421 } else if (event.GetId() == XRCID("IDC_INVENTORY_LOVEKEY")) {
01422 tool = LOVEKEY;
01423 } else if (event.GetId() == XRCID("IDC_INVENTORY_COURAGEKEY")) {
01424 tool = COURAGEKEY;
01425 }
01426
01427 saveslot->setTool(tool, (event.IsChecked() ? 1 : 0));
01428 }
01429
01430 void MainFrame::onToolQuantityChange(wxScrollEvent &event) {
01431 enum Tool tool = OIL;
01432
01433 if (event.GetId() == XRCID("IDS_INVENTORY_TORCH")) {
01434 tool = TORCH;
01435 } else if (event.GetId() == XRCID("IDS_INVENTORY_GEM")) {
01436 tool = GEM;
01437 }
01438
01439 saveslot->setTool(tool, event.GetPosition());
01440 }
01441
01442 void MainFrame::onVirtueChange(wxScrollEvent &event) {
01443 enum Virtue virtue = HUMILITY;
01444
01445 if (event.GetId() == XRCID("IDS_HERO_HONESTY")) {
01446 virtue = HONESTY;
01447 } else if (event.GetId() == XRCID("IDS_HERO_COMPASSION")) {
01448 virtue = COMPASSION;
01449 } else if (event.GetId() == XRCID("IDS_HERO_VALOR")) {
01450 virtue = VALOR;
01451 } else if (event.GetId() == XRCID("IDS_HERO_JUSTICE")) {
01452 virtue = JUSTICE;
01453 } else if (event.GetId() == XRCID("IDS_HERO_SACRIFICE")) {
01454 virtue = SACRIFICE;
01455 } else if (event.GetId() == XRCID("IDS_HERO_HONOR")) {
01456 virtue = HONOR;
01457 } else if (event.GetId() == XRCID("IDS_HERO_SPIRITUALITY")) {
01458 virtue = SPIRITUALITY;
01459 }
01460
01461 saveslot->setVirtue(virtue, event.GetPosition());
01462 }
01463
01464 void MainFrame::onWhirlpoolChange(wxCommandEvent &event) {
01465 if (ignoreEvents) {
01466 return;
01467 }
01468
01469 wxTextCtrl *ctrl = dynamic_cast<wxTextCtrl *>(event.GetEventObject());
01470 std::pair<int, int> location = saveslot->getWhirlpoolLocation();
01471 int value = std::atoi(ctrl->GetValue());
01472
01473 if (event.GetId() == XRCID("IDT_TRANSPORTATION_WHIRLPOOLLATITUDE")) {
01474 location.first = value;
01475 } else {
01476
01477 wxASSERT(event.GetId() ==
01478 XRCID("IDT_TRANSPORTATION_WHIRLPOOLLONGITUDE"));
01479
01480 location.second = value;
01481 }
01482
01483 saveslot->setWhirlpoolLocation(location);
01484 }
01485
01486 void MainFrame::onWindowClosing(wxCloseEvent &event) {
01487 if (event.CanVeto()) {
01488 if (isOpen()) {
01489 if (!close()) {
01490 event.Veto();
01491 return;
01492 }
01493 }
01494 }
01495
01496 Destroy();
01497 }
01498
01499 BEGIN_EVENT_TABLE(MainFrame, wxFrame)
01500 EVT_CHECKBOX(XRCID("IDC_PARTY_MAGE"), MainFrame::onJoinedChange)
01501 EVT_CHECKBOX(XRCID("IDC_PARTY_BARD"), MainFrame::onJoinedChange)
01502 EVT_CHECKBOX(XRCID("IDC_PARTY_FIGHTER"), MainFrame::onJoinedChange)
01503 EVT_CHECKBOX(XRCID("IDC_PARTY_DRUID"), MainFrame::onJoinedChange)
01504 EVT_CHECKBOX(XRCID("IDC_PARTY_TINKER"), MainFrame::onJoinedChange)
01505 EVT_CHECKBOX(XRCID("IDC_PARTY_PALADIN"), MainFrame::onJoinedChange)
01506 EVT_CHECKBOX(XRCID("IDC_PARTY_RANGER"), MainFrame::onJoinedChange)
01507 EVT_CHECKBOX(XRCID("IDC_PARTY_SHEPHERD"), MainFrame::onJoinedChange)
01508
01509 EVT_CHECKBOX(XRCID("IDC_PARTY_LIGHT"), MainFrame::onMagicChange)
01510 EVT_CHECKBOX(XRCID("IDC_PARTY_MISSILE"), MainFrame::onMagicChange)
01511 EVT_CHECKBOX(XRCID("IDC_PARTY_AWAKEN"), MainFrame::onMagicChange)
01512 EVT_CHECKBOX(XRCID("IDC_PARTY_CURE"), MainFrame::onMagicChange)
01513 EVT_CHECKBOX(XRCID("IDC_PARTY_WIND"), MainFrame::onMagicChange)
01514 EVT_CHECKBOX(XRCID("IDC_PARTY_HEAL"), MainFrame::onMagicChange)
01515 EVT_CHECKBOX(XRCID("IDC_PARTY_FIRE"), MainFrame::onMagicChange)
01516 EVT_CHECKBOX(XRCID("IDC_PARTY_EXIT"), MainFrame::onMagicChange)
01517 EVT_CHECKBOX(XRCID("IDC_PARTY_DISPEL"), MainFrame::onMagicChange)
01518 EVT_CHECKBOX(XRCID("IDC_PARTY_VIEW"), MainFrame::onMagicChange)
01519 EVT_CHECKBOX(XRCID("IDC_PARTY_PROTECT"), MainFrame::onMagicChange)
01520 EVT_CHECKBOX(XRCID("IDC_PARTY_ICE"), MainFrame::onMagicChange)
01521 EVT_CHECKBOX(XRCID("IDC_PARTY_BLINK"), MainFrame::onMagicChange)
01522 EVT_CHECKBOX(XRCID("IDC_PARTY_ENERGY"), MainFrame::onMagicChange)
01523 EVT_CHECKBOX(XRCID("IDC_PARTY_QUICK"), MainFrame::onMagicChange)
01524 EVT_CHECKBOX(XRCID("IDC_PARTY_SLEEP"), MainFrame::onMagicChange)
01525 EVT_CHECKBOX(XRCID("IDC_PARTY_REFLECT"), MainFrame::onMagicChange)
01526 EVT_CHECKBOX(XRCID("IDC_PARTY_NEGATE"), MainFrame::onMagicChange)
01527 EVT_CHECKBOX(XRCID("IDC_PARTY_DESTROY"), MainFrame::onMagicChange)
01528 EVT_CHECKBOX(XRCID("IDC_PARTY_JINX"), MainFrame::onMagicChange)
01529 EVT_CHECKBOX(XRCID("IDC_PARTY_SQUISH"), MainFrame::onMagicChange)
01530 EVT_CHECKBOX(XRCID("IDC_PARTY_GATE"), MainFrame::onMagicChange)
01531 EVT_CHECKBOX(XRCID("IDC_PARTY_TREMOR"), MainFrame::onMagicChange)
01532 EVT_CHECKBOX(XRCID("IDC_PARTY_LIFE"), MainFrame::onMagicChange)
01533 EVT_CHECKBOX(XRCID("IDC_PARTY_DEFEAT"), MainFrame::onMagicChange)
01534
01535 EVT_CHECKBOX(XRCID("IDC_INVENTORY_HONESTY"), MainFrame::onRuneChange)
01536 EVT_CHECKBOX(XRCID("IDC_INVENTORY_COMPASSION"), MainFrame::onRuneChange)
01537 EVT_CHECKBOX(XRCID("IDC_INVENTORY_VALOR"), MainFrame::onRuneChange)
01538 EVT_CHECKBOX(XRCID("IDC_INVENTORY_JUSTICE"), MainFrame::onRuneChange)
01539 EVT_CHECKBOX(XRCID("IDC_INVENTORY_SACRIFICE"), MainFrame::onRuneChange)
01540 EVT_CHECKBOX(XRCID("IDC_INVENTORY_HONOR"), MainFrame::onRuneChange)
01541 EVT_CHECKBOX(XRCID("IDC_INVENTORY_SPIRITUALITY"), MainFrame::onRuneChange)
01542 EVT_CHECKBOX(XRCID("IDC_INVENTORY_HUMILITY"), MainFrame::onRuneChange)
01543
01544 EVT_CHECKBOX(XRCID("IDC_INVENTORY_BLUE"), MainFrame::onStoneChange)
01545 EVT_CHECKBOX(XRCID("IDC_INVENTORY_YELLOW"), MainFrame::onStoneChange)
01546 EVT_CHECKBOX(XRCID("IDC_INVENTORY_RED"), MainFrame::onStoneChange)
01547 EVT_CHECKBOX(XRCID("IDC_INVENTORY_GREEN"), MainFrame::onStoneChange)
01548 EVT_CHECKBOX(XRCID("IDC_INVENTORY_ORANGE"), MainFrame::onStoneChange)
01549 EVT_CHECKBOX(XRCID("IDC_INVENTORY_PURPLE"), MainFrame::onStoneChange)
01550 EVT_CHECKBOX(XRCID("IDC_INVENTORY_WHITE"), MainFrame::onStoneChange)
01551 EVT_CHECKBOX(XRCID("IDC_INVENTORY_BLACK"), MainFrame::onStoneChange)
01552
01553 EVT_CHECKBOX(XRCID("IDC_INVENTORY_KEY"), MainFrame::onToolHaveChange)
01554 EVT_CHECKBOX(XRCID("IDC_INVENTORY_SEXTANT"), MainFrame::onToolHaveChange)
01555 EVT_CHECKBOX(XRCID("IDC_INVENTORY_SCALE"), MainFrame::onToolHaveChange)
01556 EVT_CHECKBOX(XRCID("IDC_INVENTORY_FLUTE"), MainFrame::onToolHaveChange)
01557 EVT_CHECKBOX(XRCID("IDC_INVENTORY_CANDLE"), MainFrame::onToolHaveChange)
01558 EVT_CHECKBOX(XRCID("IDC_INVENTORY_BOOK"), MainFrame::onToolHaveChange)
01559 EVT_CHECKBOX(XRCID("IDC_INVENTORY_BELL"), MainFrame::onToolHaveChange)
01560 EVT_CHECKBOX(XRCID("IDC_INVENTORY_HORN"), MainFrame::onToolHaveChange)
01561 EVT_CHECKBOX(XRCID("IDC_INVENTORY_SKULL"), MainFrame::onToolHaveChange)
01562 EVT_CHECKBOX(XRCID("IDC_INVENTORY_TRUTHKEY"), MainFrame::onToolHaveChange)
01563 EVT_CHECKBOX(XRCID("IDC_INVENTORY_COURAGEKEY"), MainFrame::onToolHaveChange)
01564 EVT_CHECKBOX(XRCID("IDC_INVENTORY_LOVEKEY"), MainFrame::onToolHaveChange)
01565 EVT_CHECKBOX(XRCID("IDC_INVENTORY_WHEEL"), MainFrame::onToolHaveChange)
01566
01567 EVT_CHECKBOX(XRCID("IDC_TRANSPORTATION_SHIP1"), MainFrame::onShipChange)
01568 EVT_CHECKBOX(XRCID("IDC_TRANSPORTATION_SHIP2"), MainFrame::onShipChange)
01569 EVT_CHECKBOX(XRCID("IDC_TRANSPORTATION_SHIP3"), MainFrame::onShipChange)
01570 EVT_CHECKBOX(XRCID("IDC_TRANSPORTATION_SHIP4"), MainFrame::onShipChange)
01571
01572 EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED1"),
01573 MainFrame::onEquippedChange)
01574 EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED2"),
01575 MainFrame::onEquippedChange)
01576 EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED3"),
01577 MainFrame::onEquippedChange)
01578 EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED4"),
01579 MainFrame::onEquippedChange)
01580 EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED5"),
01581 MainFrame::onEquippedChange)
01582 EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED6"),
01583 MainFrame::onEquippedChange)
01584
01585 EVT_CHOICE(XRCID("IDC_PARTY_START"), MainFrame::onStartLocationChange)
01586
01587 EVT_CHOICE(XRCID("IDC_PARTY_MEMBER1"), MainFrame::onMemberClassChange)
01588 EVT_CHOICE(XRCID("IDC_PARTY_MEMBER2"), MainFrame::onMemberClassChange)
01589 EVT_CHOICE(XRCID("IDC_PARTY_MEMBER3"), MainFrame::onMemberClassChange)
01590 EVT_CHOICE(XRCID("IDC_PARTY_MEMBER4"), MainFrame::onMemberClassChange)
01591
01592 EVT_CHOICE(XRCID("IDC_TRANSPORTATION_TRAMMEL"), MainFrame::onPhaseChange)
01593 EVT_CHOICE(XRCID("IDC_TRANSPORTATION_FELUCCA"), MainFrame::onPhaseChange)
01594
01595 EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT1"), MainFrame::onEquipmentChange)
01596 EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT2"), MainFrame::onEquipmentChange)
01597 EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT3"), MainFrame::onEquipmentChange)
01598 EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT4"), MainFrame::onEquipmentChange)
01599 EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT5"), MainFrame::onEquipmentChange)
01600 EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT6"), MainFrame::onEquipmentChange)
01601
01602 EVT_CLOSE(MainFrame::onWindowClosing)
01603
01604 EVT_COMMAND_SCROLL(XRCID("IDS_HERO_HONESTY"), MainFrame::onVirtueChange)
01605 EVT_COMMAND_SCROLL(XRCID("IDS_HERO_COMPASSION"), MainFrame::onVirtueChange)
01606 EVT_COMMAND_SCROLL(XRCID("IDS_HERO_VALOR"), MainFrame::onVirtueChange)
01607 EVT_COMMAND_SCROLL(XRCID("IDS_HERO_JUSTICE"), MainFrame::onVirtueChange)
01608 EVT_COMMAND_SCROLL(XRCID("IDS_HERO_SACRIFICE"), MainFrame::onVirtueChange)
01609 EVT_COMMAND_SCROLL(XRCID("IDS_HERO_HONOR"), MainFrame::onVirtueChange)
01610 EVT_COMMAND_SCROLL(XRCID("IDS_HERO_SPIRITUALITY"),MainFrame::onVirtueChange)
01611 EVT_COMMAND_SCROLL(XRCID("IDS_HERO_HUMILITY"), MainFrame::onVirtueChange)
01612
01613 EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_ASH"), MainFrame::onHerbChange)
01614 EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_GINSENG"), MainFrame::onHerbChange)
01615 EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_GARLIC"), MainFrame::onHerbChange)
01616 EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_SILKWEB"), MainFrame::onHerbChange)
01617 EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_MOSS"), MainFrame::onHerbChange)
01618 EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_PEARL"), MainFrame::onHerbChange)
01619 EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_FUNGUS"), MainFrame::onHerbChange)
01620 EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_MANROOT"), MainFrame::onHerbChange)
01621
01622 EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_TORCH"),
01623 MainFrame::onToolQuantityChange)
01624 EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_GEM"),
01625 MainFrame::onToolQuantityChange)
01626 EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_OIL"),
01627 MainFrame::onToolQuantityChange)
01628
01629 EVT_MENU(wxID_OPEN, MainFrame::onFileOpen)
01630 EVT_MENU(wxID_SAVE, MainFrame::onFileSave)
01631 EVT_MENU(wxID_SAVEAS, MainFrame::onFileSaveAs)
01632 EVT_MENU(wxID_CLOSE, MainFrame::onFileClose)
01633 EVT_MENU(wxID_EXIT, MainFrame::onFileExit)
01634
01635 EVT_MENU(XRCID("IDM_GAME_GAME1"), MainFrame::onGameChange)
01636 EVT_MENU(XRCID("IDM_GAME_GAME2"), MainFrame::onGameChange)
01637 EVT_MENU(XRCID("IDM_GAME_GAME3"), MainFrame::onGameChange)
01638
01639 EVT_MENU(XRCID("IDM_LOCATION_PLACE_MOONGLOW"),
01640 MainFrame::onLocationPlaceChange)
01641 EVT_MENU(XRCID("IDM_LOCATION_PLACE_BRITAIN"),
01642 MainFrame::onLocationPlaceChange)
01643 EVT_MENU(XRCID("IDM_LOCATION_PLACE_JHELOM"),
01644 MainFrame::onLocationPlaceChange)
01645 EVT_MENU(XRCID("IDM_LOCATION_PLACE_YEW"),
01646 MainFrame::onLocationPlaceChange)
01647 EVT_MENU(XRCID("IDM_LOCATION_PLACE_MINOC"),
01648 MainFrame::onLocationPlaceChange)
01649 EVT_MENU(XRCID("IDM_LOCATION_PLACE_TRINSIC"),
01650 MainFrame::onLocationPlaceChange)
01651 EVT_MENU(XRCID("IDM_LOCATION_PLACE_SKARABRAE"),
01652 MainFrame::onLocationPlaceChange)
01653 EVT_MENU(XRCID("IDM_LOCATION_PLACE_MAGINCIA"),
01654 MainFrame::onLocationPlaceChange)
01655
01656 EVT_MENU(XRCID("IDM_LOCATION_PLACE_LYCAEUM"),
01657 MainFrame::onLocationPlaceChange)
01658 EVT_MENU(XRCID("IDM_LOCATION_PLACE_EMPATHABBEY"),
01659 MainFrame::onLocationPlaceChange)
01660 EVT_MENU(XRCID("IDM_LOCATION_PLACE_SERPENTSHOLD"),
01661 MainFrame::onLocationPlaceChange)
01662
01663 EVT_MENU(XRCID("IDM_LOCATION_PLACE_PAWS"),
01664 MainFrame::onLocationPlaceChange)
01665 EVT_MENU(XRCID("IDM_LOCATION_PLACE_VESPER"),
01666 MainFrame::onLocationPlaceChange)
01667 EVT_MENU(XRCID("IDM_LOCATION_PLACE_BUCCANEERSDEN"),
01668 MainFrame::onLocationPlaceChange)
01669 EVT_MENU(XRCID("IDM_LOCATION_PLACE_COVE"),
01670 MainFrame::onLocationPlaceChange)
01671
01672 EVT_MENU(XRCID("IDM_LOCATION_BALLOON"), MainFrame::onLocationBalloon)
01673
01674 EVT_MENU(XRCID("IDM_LOCATION_SHIP1"), MainFrame::onLocationShip)
01675 EVT_MENU(XRCID("IDM_LOCATION_SHIP2"), MainFrame::onLocationShip)
01676 EVT_MENU(XRCID("IDM_LOCATION_SHIP3"), MainFrame::onLocationShip)
01677 EVT_MENU(XRCID("IDM_LOCATION_SHIP4"), MainFrame::onLocationShip)
01678
01679 EVT_MENU(wxID_ABOUT, MainFrame::onHelpAbout)
01680
01681 EVT_RADIOBOX(XRCID("IDRB_CHARACTER_SELECT"), MainFrame::onCharacterChange)
01682
01683 EVT_TEXT(XRCID("IDT_HERO_NAME"), MainFrame::onHerosNameChange)
01684
01685 EVT_TEXT(XRCID("IDT_PARTY_GOLD"), MainFrame::onGoldChange)
01686
01687 EVT_TEXT(XRCID("IDT_TRANSPORTATION_BALLOONLATITUDE"),
01688 MainFrame::onBalloonChange)
01689 EVT_TEXT(XRCID("IDT_TRANSPORTATION_BALLOONLONGITUDE"),
01690 MainFrame::onBalloonChange)
01691
01692 EVT_TEXT(XRCID("IDT_TRANSPORTATION_WHIRLPOOLLATITUDE"),
01693 MainFrame::onWhirlpoolChange)
01694 EVT_TEXT(XRCID("IDT_TRANSPORTATION_WHIRLPOOLLONGITUDE"),
01695 MainFrame::onWhirlpoolChange)
01696
01697 EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP1LATITUDE"),
01698 MainFrame::onShipLocationChange)
01699 EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP1LONGITUDE"),
01700 MainFrame::onShipLocationChange)
01701 EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP2LATITUDE"),
01702 MainFrame::onShipLocationChange)
01703 EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP2LONGITUDE"),
01704 MainFrame::onShipLocationChange)
01705 EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP3LATITUDE"),
01706 MainFrame::onShipLocationChange)
01707 EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP3LONGITUDE"),
01708 MainFrame::onShipLocationChange)
01709 EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP4LATITUDE"),
01710 MainFrame::onShipLocationChange)
01711 EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP4LONGITUDE"),
01712 MainFrame::onShipLocationChange)
01713
01714 EVT_TEXT(XRCID("IDT_CHARACTER_LEVEL"), MainFrame::onStatChange)
01715 EVT_TEXT(XRCID("IDT_CHARACTER_EXPERIENCE"), MainFrame::onStatChange)
01716 EVT_TEXT(XRCID("IDT_CHARACTER_HP"), MainFrame::onStatChange)
01717 EVT_TEXT(XRCID("IDT_CHARACTER_MP"), MainFrame::onStatChange)
01718 EVT_TEXT(XRCID("IDT_CHARACTER_MAXHP"), MainFrame::onStatChange)
01719 EVT_TEXT(XRCID("IDT_CHARACTER_MAXMP"), MainFrame::onStatChange)
01720 EVT_TEXT(XRCID("IDT_CHARACTER_STRENGTH"), MainFrame::onStatChange)
01721 EVT_TEXT(XRCID("IDT_CHARACTER_INTELLIGENCE"), MainFrame::onStatChange)
01722 EVT_TEXT(XRCID("IDT_CHARACTER_DEXTERITY"), MainFrame::onStatChange)
01723
01724 EVT_UPDATE_UI(wxID_CLOSE, MainFrame::onSaveCloseUpdate)
01725 EVT_UPDATE_UI(wxID_SAVE, MainFrame::onSaveUpdate)
01726 EVT_UPDATE_UI(wxID_SAVEAS, MainFrame::onSaveCloseUpdate)
01727
01728 EVT_UPDATE_UI(XRCID("IDM_GAME_GAME1"), MainFrame::onGameMenuUpdate)
01729 EVT_UPDATE_UI(XRCID("IDM_GAME_GAME2"), MainFrame::onGameMenuUpdate)
01730 EVT_UPDATE_UI(XRCID("IDM_GAME_GAME3"), MainFrame::onGameMenuUpdate)
01731
01732 EVT_UPDATE_UI(XRCID("IDC_PARTY_MEMBER3"), MainFrame::onMemberUpdate)
01733 EVT_UPDATE_UI(XRCID("IDC_PARTY_MEMBER4"), MainFrame::onMemberUpdate)
01734
01735 EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP1LATITUDE"),
01736 MainFrame::onShipUpdate)
01737 EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP2LATITUDE"),
01738 MainFrame::onShipUpdate)
01739 EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP3LATITUDE"),
01740 MainFrame::onShipUpdate)
01741 EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP4LATITUDE"),
01742 MainFrame::onShipUpdate)
01743
01744 EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP1LONGITUDE"),
01745 MainFrame::onShipUpdate)
01746 EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP2LONGITUDE"),
01747 MainFrame::onShipUpdate)
01748 EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP3LONGITUDE"),
01749 MainFrame::onShipUpdate)
01750 EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP4LONGITUDE"),
01751 MainFrame::onShipUpdate)
01752
01753 EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED1"), MainFrame::onEquippedUpdate)
01754 EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED2"), MainFrame::onEquippedUpdate)
01755 EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED3"), MainFrame::onEquippedUpdate)
01756 EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED4"), MainFrame::onEquippedUpdate)
01757 EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED5"), MainFrame::onEquippedUpdate)
01758 EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED6"), MainFrame::onEquippedUpdate)
01759 END_EVENT_TABLE()
01760
01761 IMPLEMENT_CLASS(MainFrame, wxFrame)
01762