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