MainFrame.cc

Go to the documentation of this file.
00001 /*
00002  * hack4u
00003  * Copyright (C) 2004-2008 emuWorks
00004  * http://games.technoplaza.net/
00005  *
00006  * This file is part of hack4u.
00007  *
00008  * hack4u is free software; you can redistribute it and/or modify
00009  * it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2 of the License, or
00011  * (at your option) any later version.
00012  *
00013  * hack4u is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  * GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  * along with hack4u; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00021  */
00022 
00023 // $Id: MainFrame.cc,v 1.56 2008/12/16 23:02:04 jdratlif Exp $
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     // we must be open to close
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             // unable to open file
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             // must be a bad checksum if we're here
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     // load hero's name
00411     XRCCTRL(*this, "IDT_HERO_NAME", wxTextCtrl)->
00412         SetValue(saveslot->getHerosName());
00413         
00414     // load virtues
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     // load party's start location
00433     XRCCTRL(*this, "IDC_PARTY_START", wxChoice)->
00434         SetSelection(INN_INDEX[saveslot->getStartLocation()]);
00435         
00436     // load party's gold
00437     XRCCTRL(*this, "IDT_PARTY_GOLD", wxTextCtrl)->
00438         SetValue(wxString::Format(wxT("%d"), saveslot->getGold()));
00439         
00440     // load party members
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     // load joined members
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     // load known magic
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     // load herb inventory
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     // load rune inventory
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     // load stone inventory
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     // load tool inventory
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     // load moongates
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     // load Balloon location
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     // load Whirlpool location
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     // load pirate ship locations
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     // load character stats
00665     loadStats(static_cast<enum Character>(
00666         XRCCTRL(*this, "IDRB_CHARACTER_SELECT", wxRadioBox)->GetSelection()));
00667                       
00668     // show the notebook
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     // ignore events we're about to generate
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             // we must be an FIE_IOERROR
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         // we must be longitude if we're here
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         // we must be the last box if we're here
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             // we must be game 3 if we're here
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         // we must be shepherd if we're here
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         // we must be Cove if we're here
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         // we must be ship 4 if we're here
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             // remove subsequent members
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             // remove subsequent members
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         // we must be 4 if we're here
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     // no need to save unless we have an open modified game
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         // we must be the last ship if we're here
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         // we must be the fourth ship's longitude if we're here
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         // we must be the fourth ship
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         // we must be longitude if we're here
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 

Generated on Mon Dec 29 01:19:01 2008 for hack4u by  doxygen 1.5.4