Frame.cc

Go to the documentation of this file.
00001 /*
00002  * Super Metroid SRAM Editor
00003  * Copyright (C) 2005,2007-2008 emuWorks
00004  * http://games.technoplaza.net/
00005  *
00006  * This file is part of Super Metroid SRAM Editor.
00007  *
00008  * Super Metroid SRAM Editor is free software; you can redistribute it and/or
00009  * modify 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  * Super Metroid SRAM Editor 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 Super Metroid SRAM Editor; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00021  */
00022  
00023 // $Id: Frame.cc,v 1.54 2008/12/17 04:56:18 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/notebook.h>
00036 #include <wx/regex.h>
00037 #include <wx/xrc/xmlres.h>
00038 
00039 #include "exceptions/InvalidSRAMDataException.hh"
00040 #include "res/icon32x32.xpm"
00041 #include "model/SRAMFile.hh"
00042 #include "view/Frame.hh"
00043 #include "view/SRAMFileTarget.hh"
00044 
00045 using namespace smse;
00046 
00047 Frame::Frame() : timer(this, ID_SBTIMER), sram(NULL), ignoreTextEvents(true) {
00048     SetParent(NULL);
00049     
00050     CreateControls();
00051     GetSizer()->SetSizeHints(this);
00052     Centre();
00053     
00054     // hide the notebook
00055     XRCCTRL(*this, "IDN_SMSE", wxNotebook)->Show(false);
00056     
00057     // stop ignoring text events
00058     ignoreTextEvents = false;
00059     
00060     // add the file drop target
00061     SetDropTarget(new SRAMFileTarget(this));
00062 }
00063 
00064 void Frame::CreateControls() {
00065     wxXmlResource::Get()->LoadFrame(this, GetParent(), wxT("IDF_SMSE"));
00066     SetIcon(wxIcon(icon32x32_xpm));
00067     
00068     wxTextValidator nv(wxFILTER_NUMERIC);
00069     
00070     XRCCTRL(*this, "IDT_GAME_ENERGY", wxTextCtrl)->SetValidator(nv);
00071     XRCCTRL(*this, "IDT_GAME_RESERVE", wxTextCtrl)->SetValidator(nv);
00072     XRCCTRL(*this, "IDT_GAME_MISSILES", wxTextCtrl)->SetValidator(nv);
00073     XRCCTRL(*this, "IDT_GAME_SMISSILES", wxTextCtrl)->SetValidator(nv);
00074     XRCCTRL(*this, "IDT_GAME_PBOMBS", wxTextCtrl)->SetValidator(nv);
00075 }
00076 
00077 bool Frame::close(bool save) {
00078     // ensure we have an open SRAMFile
00079     wxASSERT(sram);
00080     
00081     if (save && !this->save()) {
00082         return false;
00083     }
00084     
00085     delete sram;
00086     sram = NULL;
00087     
00088     enableMenus();
00089     
00090     return true;
00091 }
00092 
00093 void Frame::enableMenus() {
00094     wxMenuBar *mb = GetMenuBar();
00095     
00096     mb->FindItem(wxID_CLOSE)->Enable(sram);
00097     mb->FindItem(wxID_SAVE)->Enable(sram);
00098     mb->FindItem(wxID_SAVEAS)->Enable(sram);
00099     
00100     mb->FindItem(XRCID("IDM_GAME_GAMEA"))->Enable(sram && sram->isValidGame(0));
00101     mb->FindItem(XRCID("IDM_GAME_GAMEB"))->Enable(sram && sram->isValidGame(1));
00102     mb->FindItem(XRCID("IDM_GAME_GAMEC"))->Enable(sram && sram->isValidGame(2));
00103     
00104     mb->FindItem(XRCID("IDM_GAME_ENDING"))->Enable(sram);
00105     mb->FindItem(XRCID("IDM_GAME_GIVE"))->Enable(sram);
00106 }
00107 
00108 void Frame::load(int game) {
00109     // ensure we have a valid game
00110     wxASSERT((game >= 0) && (game < SRAMFile::GAMES));
00111     
00112     // ensure we have an open SRAMFile and valid game
00113     wxASSERT(sram && sram->isValidGame(game));
00114     
00115     // select the proper game in the SRAM
00116     sram->setGame(game);
00117     
00118     this->game = game;
00119     
00120     try {
00121         loadGameTab();
00122         loadMiscTab();
00123         loadItemsTab();
00124         loadColorDoorsTab();
00125         loadSpecialDoorsTab();
00126         
00127         enableMenus();
00128     } catch (InvalidSRAMDataException &e) {
00129         wxString message(e.what(), wxConvLibc);
00130         
00131         wxMessageBox(message, wxT("Error: Invalid Super Metroid SRAM"),
00132                      wxOK | wxICON_ERROR);
00133                      
00134         close();
00135     }
00136 }
00137 
00138 void Frame::loadBosses() {
00139     // ensure we have an open SRAMFile
00140     wxASSERT(sram);
00141     
00142     // Kraid + Statue
00143     XRCCTRL(*this, "IDC_GAME_BOSS_KRAID",
00144         wxCheckBox)->SetValue(sram->getBoss(BOSS_KRAID));
00145     XRCCTRL(*this, "IDC_GAME_STATUE_KRAID",
00146         wxCheckBox)->SetValue(sram->getStatue(STATUE_KRAID));
00147     
00148     // Phantoon + Statue
00149     XRCCTRL(*this, "IDC_GAME_BOSS_PHANTOON",
00150         wxCheckBox)->SetValue(sram->getBoss(BOSS_PHANTOON));
00151     XRCCTRL(*this, "IDC_GAME_STATUE_PHANTOON",
00152         wxCheckBox)->SetValue(sram->getStatue(STATUE_PHANTOON));
00153     
00154     // Draygon + Statue
00155     XRCCTRL(*this, "IDC_GAME_BOSS_DRAYGON",
00156         wxCheckBox)->SetValue(sram->getBoss(BOSS_DRAYGON));
00157     XRCCTRL(*this, "IDC_GAME_STATUE_DRAYGON",
00158         wxCheckBox)->SetValue(sram->getStatue(STATUE_DRAYGON));
00159     
00160     // Ridley + Statue
00161     XRCCTRL(*this, "IDC_GAME_BOSS_RIDLEY",
00162         wxCheckBox)->SetValue(sram->getBoss(BOSS_RIDLEY));
00163     XRCCTRL(*this, "IDC_GAME_STATUE_RIDLEY",
00164         wxCheckBox)->SetValue(sram->getStatue(STATUE_RIDLEY));
00165 }
00166 
00167 void Frame::loadColorDoorsTab() {
00168     loadRedDoors();
00169     loadGreenDoors();
00170     loadYellowDoors();
00171 }
00172 
00173 void Frame::loadControllerConfig() {
00174     // ensure we have an open SRAMFile
00175     wxASSERT(sram);
00176     
00177     XRCCTRL(*this, "IDC_MISC_DASH",
00178         wxChoice)->SetSelection(sram->getButton(ACTION_DASH));
00179     XRCCTRL(*this, "IDC_MISC_JUMP",
00180         wxChoice)->SetSelection(sram->getButton(ACTION_JUMP));
00181     XRCCTRL(*this, "IDC_MISC_ITEMCANCEL",
00182         wxChoice)->SetSelection(sram->getButton(ACTION_ITEMCANCEL));
00183     XRCCTRL(*this, "IDC_MISC_SHOT",
00184         wxChoice)->SetSelection(sram->getButton(ACTION_SHOT));
00185     XRCCTRL(*this, "IDC_MISC_ANGLEUP",
00186         wxChoice)->SetSelection(sram->getButton(ACTION_ANGLEUP));
00187     XRCCTRL(*this, "IDC_MISC_ANGLEDOWN",
00188         wxChoice)->SetSelection(sram->getButton(ACTION_ANGLEDOWN));
00189     XRCCTRL(*this, "IDC_MISC_ITEMSELECT",
00190         wxChoice)->SetSelection(sram->getButton(ACTION_ITEMSELECT));
00191 }
00192 
00193 void Frame::loadEnergy() {
00194     // ensure we have an open SRAMFile
00195     wxASSERT(sram);
00196     
00197     ignoreTextEvents = true;
00198     
00199     int energy = sram->getEnergy();
00200     
00201     // primary energy
00202     XRCCTRL(*this, "IDT_GAME_ENERGY",
00203         wxTextCtrl)->SetValue(wxString::Format(wxT("%d"), energy));
00204     
00205     // reserve energy
00206     energy = sram->getReserveEnergy();
00207     
00208     XRCCTRL(*this, "IDT_GAME_RESERVE",
00209         wxTextCtrl)->SetValue(wxString::Format(wxT("%d"), energy));
00210         
00211     ignoreTextEvents = false;
00212 }
00213 
00214 void Frame::loadEnergyTanks() {
00215     // ensure we have an open SRAMFile
00216     wxASSERT(sram);
00217     
00218     XRCCTRL(*this, "IDC_ITEMS_ET_C1",
00219         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_CETANKS));
00220     XRCCTRL(*this, "IDC_ITEMS_ET_C2",
00221         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_CETANKS + 1));
00222     XRCCTRL(*this, "IDC_ITEMS_ET_BS1",
00223         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_BSETANKS));
00224     XRCCTRL(*this, "IDC_ITEMS_ET_BS2",
00225         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_BSETANKS + 1));
00226     XRCCTRL(*this, "IDC_ITEMS_ET_BS3",
00227         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_BSETANKS + 2));
00228     XRCCTRL(*this, "IDC_ITEMS_ET_BS4",
00229         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_BSETANKS + 3));
00230     XRCCTRL(*this, "IDC_ITEMS_ET_BS5",
00231         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_BSETANKS + 4));
00232     XRCCTRL(*this, "IDC_ITEMS_ET_NF1",
00233         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_NFETANKS));
00234     XRCCTRL(*this, "IDC_ITEMS_ET_NF2",
00235         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_NFETANKS + 1));
00236     XRCCTRL(*this, "IDC_ITEMS_ET_NF3",
00237         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_NFETANKS + 2));
00238     XRCCTRL(*this, "IDC_ITEMS_ET_NF4",
00239         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_NFETANKS + 3));
00240     XRCCTRL(*this, "IDC_ITEMS_ET_WS",
00241         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_WSETANKS));
00242     XRCCTRL(*this, "IDC_ITEMS_ET_M1",
00243         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_METANKS));
00244     XRCCTRL(*this, "IDC_ITEMS_ET_M2",
00245         wxCheckBox)->SetValue(sram->hasEnergyTank(SO_METANKS + 1));
00246 }
00247 
00248 void Frame::loadEyeDoors() {
00249     // ensure we have an open SRAMFile
00250     wxASSERT(sram);
00251     
00252     XRCCTRL(*this, "IDC_EYEDOOR_KRAID",
00253         wxCheckBox)->SetValue(sram->getDoor(ED_KRAID));
00254     XRCCTRL(*this, "IDC_EYEDOOR_RIDLEY",
00255         wxCheckBox)->SetValue(sram->getDoor(ED_RIDLEY));
00256     XRCCTRL(*this, "IDC_EYEDOOR_PHANTOON",
00257         wxCheckBox)->SetValue(sram->getDoor(ED_PHANTOON));
00258     XRCCTRL(*this, "IDC_EYEDOOR_DRAYGON",
00259         wxCheckBox)->SetValue(sram->getDoor(ED_DRAYGON));
00260     XRCCTRL(*this, "IDC_EYEDOOR_T",
00261         wxCheckBox)->SetValue(sram->getDoor(ED_T));
00262 }
00263 
00264 void Frame::loadGameConfig() {
00265     // ensure we have an open SRAMFile
00266     wxASSERT(sram);
00267     
00268     XRCCTRL(*this, "IDRB_MISC_LANGUAGE",
00269         wxRadioBox)->SetSelection(sram->getMiscBit(MB_LANGUAGE));
00270     XRCCTRL(*this, "IDRB_MISC_MOONWALK",
00271         wxRadioBox)->SetSelection(sram->getMiscBit(MB_MOONWALK));
00272     XRCCTRL(*this, "IDRB_MISC_ICONCANCEL",
00273         wxRadioBox)->SetSelection(sram->getMiscBit(MB_ICONCANCEL));
00274 }
00275 
00276 void Frame::loadGameStatus() {
00277     // ensure we have an open SRAMFile
00278     wxASSERT(sram);
00279     
00280     XRCCTRL(*this, "IDC_MISC_MTUBEBROKEN",
00281         wxCheckBox)->SetValue(sram->getMiscBit(MB_MTUBEBROKEN));
00282     XRCCTRL(*this, "IDC_MISC_RESCUEDANIMALS",
00283         wxCheckBox)->SetValue(sram->getMiscBit(MB_RESCUEDANIMALS));
00284 }
00285 
00286 void Frame::loadGameTab() {
00287     loadEnergy();
00288     loadInventory();
00289     
00290     loadBosses();
00291     loadMiniBosses();
00292     loadMetroidRooms();
00293     loadZebetites();
00294     
00295     loadSavePoint();
00296     loadMaps();
00297 }
00298 
00299 void Frame::loadGameTime() {
00300     // ensure we have an open SRAMFile
00301     wxASSERT(sram);
00302     
00303     ignoreTextEvents = true;
00304     
00305     int hours = sram->getGameHours();
00306     int minutes = sram->getGameMinutes();
00307     
00308     XRCCTRL(*this, "IDT_MISC_GAMETIME",
00309         wxTextCtrl)->SetValue(wxString::Format(wxT("%d:%02d"), hours, minutes));
00310         
00311     ignoreTextEvents = false;
00312 }
00313 
00314 void Frame::loadGreenDoors() {
00315     // ensure we have an open SRAMFile
00316     wxASSERT(sram);
00317     
00318     // Crateria Green Doors
00319     XRCCTRL(*this, "IDC_GREENDOOR_C1",
00320         wxCheckBox)->SetValue(sram->getDoor(GD_C1));
00321     XRCCTRL(*this, "IDC_GREENDOOR_C_WS",
00322         wxCheckBox)->SetValue(sram->getDoor(GD_C_WS));
00323         
00324     // Brinstar Green Doors
00325     XRCCTRL(*this, "IDC_GREENDOOR_BS1",
00326         wxCheckBox)->SetValue(sram->getDoor(GD_BS1));
00327     XRCCTRL(*this, "IDC_GREENDOOR_BS2",
00328         wxCheckBox)->SetValue(sram->getDoor(GD_BS2));
00329     XRCCTRL(*this, "IDC_GREENDOOR_BS3",
00330         wxCheckBox)->SetValue(sram->getDoor(GD_BS3));
00331     XRCCTRL(*this, "IDC_GREENDOOR_BS4",
00332         wxCheckBox)->SetValue(sram->getDoor(GD_BS4));
00333     XRCCTRL(*this, "IDC_GREENDOOR_BS5",
00334         wxCheckBox)->SetValue(sram->getDoor(GD_BS5));
00335     XRCCTRL(*this, "IDC_GREENDOOR_BS6",
00336         wxCheckBox)->SetValue(sram->getDoor(GD_BS6));
00337     XRCCTRL(*this, "IDC_GREENDOOR_BS7",
00338         wxCheckBox)->SetValue(sram->getDoor(GD_BS7));
00339     XRCCTRL(*this, "IDC_GREENDOOR_BS8",
00340         wxCheckBox)->SetValue(sram->getDoor(GD_BS8));
00341     XRCCTRL(*this, "IDC_GREENDOOR_BS_SPAZER",
00342         wxCheckBox)->SetValue(sram->getDoor(GD_BS_SPAZER));
00343     XRCCTRL(*this, "IDC_GREENDOOR_BS_SPORESPAWNEXIT",
00344         wxCheckBox)->SetValue(sram->getDoor(GD_BS_SPORESPAWNEXIT));
00345         
00346     // Norfair Green Doors
00347     XRCCTRL(*this, "IDC_GREENDOOR_NF1",
00348         wxCheckBox)->SetValue(sram->getDoor(GD_NF1));
00349     XRCCTRL(*this, "IDC_GREENDOOR_NF2",
00350         wxCheckBox)->SetValue(sram->getDoor(GD_NF2));
00351     XRCCTRL(*this, "IDC_GREENDOOR_NF3",
00352         wxCheckBox)->SetValue(sram->getDoor(GD_NF3));
00353     XRCCTRL(*this, "IDC_GREENDOOR_NF4",
00354         wxCheckBox)->SetValue(sram->getDoor(GD_NF4));
00355     XRCCTRL(*this, "IDC_GREENDOOR_NF_ICEBEAM",
00356         wxCheckBox)->SetValue(sram->getDoor(GD_NF_ICEBEAM));
00357     XRCCTRL(*this, "IDC_GREENDOOR_NF_SPEEDBOOSTER",
00358         wxCheckBox)->SetValue(sram->getDoor(GD_NF_SPEEDBOOSTER));
00359         
00360     // Wrecked Ship Green Door
00361     XRCCTRL(*this, "IDC_GREENDOOR_WS",
00362         wxCheckBox)->SetValue(sram->getDoor(GD_WS));
00363         
00364     // Maridia Green Doors
00365     XRCCTRL(*this, "IDC_GREENDOOR_M1",
00366         wxCheckBox)->SetValue(sram->getDoor(GD_M1));
00367     XRCCTRL(*this, "IDC_GREENDOOR_M2",
00368         wxCheckBox)->SetValue(sram->getDoor(GD_M2));
00369     XRCCTRL(*this, "IDC_GREENDOOR_M3",
00370         wxCheckBox)->SetValue(sram->getDoor(GD_M3));
00371     XRCCTRL(*this, "IDC_GREENDOOR_M_DRAYGON",
00372         wxCheckBox)->SetValue(sram->getDoor(GD_M_DRAYGON));
00373 }
00374 
00375 void Frame::loadInventory() {
00376     // ensure we have an open SRAMFile
00377     wxASSERT(sram);
00378     
00379     ignoreTextEvents = true;
00380     
00381     int missiles = sram->getMissiles();
00382     
00383     // missiles
00384     XRCCTRL(*this, "IDT_GAME_MISSILES",
00385         wxTextCtrl)->SetValue(wxString::Format(wxT("%d"), missiles));
00386     XRCCTRL(*this, "IDSB_GAME_MISSILES", wxSpinButton)->SetValue(missiles);
00387     
00388     // super missiles
00389     missiles = sram->getSuperMissiles();
00390     
00391     XRCCTRL(*this, "IDT_GAME_SMISSILES",
00392         wxTextCtrl)->SetValue(wxString::Format(wxT("%d"), missiles));
00393     XRCCTRL(*this, "IDSB_GAME_SMISSILES", wxSpinButton)->SetValue(missiles);
00394         
00395     // power bombs
00396     int bombs = sram->getPowerBombs();
00397     
00398     XRCCTRL(*this, "IDT_GAME_PBOMBS",
00399         wxTextCtrl)->SetValue(wxString::Format(wxT("%d"), bombs));
00400     XRCCTRL(*this, "IDSB_GAME_PBOMBS", wxSpinButton)->SetValue(bombs);
00401     
00402     ignoreTextEvents = false;
00403 }
00404 
00405 void Frame::loadItems() {
00406     // ensure we have an open SRAMFile
00407     wxASSERT(sram);
00408     
00409     XRCCTRL(*this, "IDC_ITEMS_MORPHINGBALL",
00410         wxCheckBox)->SetValue(sram->hasItem(ITEM_MORPHINGBALL));
00411     XRCCTRL(*this, "IDC_ITEMS_MORPHINGBALL_EQUIPPED",
00412         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_MORPHINGBALL));
00413     
00414     XRCCTRL(*this, "IDC_ITEMS_BOMBS",
00415         wxCheckBox)->SetValue(sram->hasItem(ITEM_BOMBS));
00416     XRCCTRL(*this, "IDC_ITEMS_BOMBS_EQUIPPED",
00417         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_BOMBS));
00418         
00419     XRCCTRL(*this, "IDC_ITEMS_SPRINGBALL",
00420         wxCheckBox)->SetValue(sram->hasItem(ITEM_SPRINGBALL));
00421     XRCCTRL(*this, "IDC_ITEMS_SPRINGBALL_EQUIPPED",
00422         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_SPRINGBALL));
00423         
00424     XRCCTRL(*this, "IDC_ITEMS_SCREWATTACK",
00425         wxCheckBox)->SetValue(sram->hasItem(ITEM_SCREWATTACK));
00426     XRCCTRL(*this, "IDC_ITEMS_SCREWATTACK_EQUIPPED",
00427         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_SCREWATTACK));
00428         
00429     XRCCTRL(*this, "IDC_ITEMS_VARIASUIT",
00430         wxCheckBox)->SetValue(sram->hasItem(ITEM_VARIASUIT));
00431     XRCCTRL(*this, "IDC_ITEMS_VARIASUIT_EQUIPPED",
00432         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_VARIASUIT));
00433         
00434     XRCCTRL(*this, "IDC_ITEMS_GRAVITYSUIT",
00435         wxCheckBox)->SetValue(sram->hasItem(ITEM_GRAVITYSUIT));
00436     XRCCTRL(*this, "IDC_ITEMS_GRAVITYSUIT_EQUIPPED",
00437         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_GRAVITYSUIT));
00438         
00439     XRCCTRL(*this, "IDC_ITEMS_HJBOOTS",
00440         wxCheckBox)->SetValue(sram->hasItem(ITEM_HJBOOTS));
00441     XRCCTRL(*this, "IDC_ITEMS_HJBOOTS_EQUIPPED",
00442         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_HJBOOTS));
00443         
00444     XRCCTRL(*this, "IDC_ITEMS_SPACEJUMP",
00445         wxCheckBox)->SetValue(sram->hasItem(ITEM_SPACEJUMP));
00446     XRCCTRL(*this, "IDC_ITEMS_SPACEJUMP_EQUIPPED",
00447         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_SPACEJUMP));
00448         
00449     XRCCTRL(*this, "IDC_ITEMS_SPEEDBOOSTER",
00450         wxCheckBox)->SetValue(sram->hasItem(ITEM_SPEEDBOOSTER));
00451     XRCCTRL(*this, "IDC_ITEMS_SPEEDBOOSTER_EQUIPPED",
00452         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_SPEEDBOOSTER));
00453         
00454     XRCCTRL(*this, "IDC_ITEMS_CHARGEBEAM",
00455         wxCheckBox)->SetValue(sram->hasItem(ITEM_CHARGEBEAM));
00456     XRCCTRL(*this, "IDC_ITEMS_CHARGEBEAM_EQUIPPED",
00457         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_CHARGEBEAM));
00458         
00459     XRCCTRL(*this, "IDC_ITEMS_ICEBEAM",
00460         wxCheckBox)->SetValue(sram->hasItem(ITEM_ICEBEAM));
00461     XRCCTRL(*this, "IDC_ITEMS_ICEBEAM_EQUIPPED",
00462         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_ICEBEAM));
00463         
00464     XRCCTRL(*this, "IDC_ITEMS_WAVEBEAM",
00465         wxCheckBox)->SetValue(sram->hasItem(ITEM_WAVEBEAM));
00466     XRCCTRL(*this, "IDC_ITEMS_WAVEBEAM_EQUIPPED",
00467         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_WAVEBEAM));
00468         
00469     XRCCTRL(*this, "IDC_ITEMS_SPAZER",
00470         wxCheckBox)->SetValue(sram->hasItem(ITEM_SPAZER));
00471     XRCCTRL(*this, "IDC_ITEMS_SPAZER_EQUIPPED",
00472         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_SPAZER));
00473         
00474     XRCCTRL(*this, "IDC_ITEMS_PLASMA",
00475         wxCheckBox)->SetValue(sram->hasItem(ITEM_PLASMA));
00476     XRCCTRL(*this, "IDC_ITEMS_PLASMA_EQUIPPED",
00477         wxCheckBox)->SetValue(sram->isItemEquipped(ITEM_PLASMA));
00478         
00479     XRCCTRL(*this, "IDC_ITEMS_GRAPPLINGBEAM",
00480         wxCheckBox)->SetValue(sram->hasItem(ITEM_GRAPPLINGBEAM));
00481         
00482     XRCCTRL(*this, "IDC_ITEMS_XRAYSCOPE",
00483         wxCheckBox)->SetValue(sram->hasItem(ITEM_XRAYSCOPE));
00484 }
00485 
00486 void Frame::loadItemsTab() {
00487     loadItems();
00488     
00489     loadMissilePacks();
00490     loadSuperMissilePacks();
00491     loadPowerBombPacks();
00492     
00493     loadEnergyTanks();
00494     loadReserveTanks();
00495 }
00496 
00497 void Frame::loadMaps() {
00498     // ensure we have an open SRAMFile
00499     wxASSERT(sram);
00500     
00501     XRCCTRL(*this, "IDC_GAME_MAP_C",
00502         wxCheckBox)->SetValue(sram->hasMap(AREA_C));
00503     XRCCTRL(*this, "IDC_GAME_MAP_BS",
00504         wxCheckBox)->SetValue(sram->hasMap(AREA_BS));
00505     XRCCTRL(*this, "IDC_GAME_MAP_NF",
00506         wxCheckBox)->SetValue(sram->hasMap(AREA_NF));
00507     XRCCTRL(*this, "IDC_GAME_MAP_WS",
00508         wxCheckBox)->SetValue(sram->hasMap(AREA_WS));
00509     XRCCTRL(*this, "IDC_GAME_MAP_M",
00510         wxCheckBox)->SetValue(sram->hasMap(AREA_M));
00511     XRCCTRL(*this, "IDC_GAME_MAP_T",
00512         wxCheckBox)->SetValue(sram->hasMap(AREA_T));
00513 }
00514 
00515 void Frame::loadMetalDoors() {
00516     // ensure we have an open SRAMFile
00517     wxASSERT(sram);
00518     
00519     // Crateria Metal Door
00520     XRCCTRL(*this, "IDC_METALDOOR_C_BOMBSEXIT",
00521         wxCheckBox)->SetValue(sram->getDoor(MD_C_BOMBSEXIT));
00522         
00523     // Brinstar Metal Doors
00524     XRCCTRL(*this, "IDC_METALDOOR_BS1",
00525         wxCheckBox)->SetValue(sram->getDoor(MD_BS1));
00526     XRCCTRL(*this, "IDC_METALDOOR_BS2",
00527         wxCheckBox)->SetValue(sram->getDoor(MD_BS2));
00528     XRCCTRL(*this, "IDC_METALDOOR_BS3",
00529         wxCheckBox)->SetValue(sram->getDoor(MD_BS3));
00530     XRCCTRL(*this, "IDC_METALDOOR_BS4",
00531         wxCheckBox)->SetValue(sram->getDoor(MD_BS4));
00532     XRCCTRL(*this, "IDC_METALDOOR_BS5",
00533         wxCheckBox)->SetValue(sram->getDoor(MD_BS5));
00534     XRCCTRL(*this, "IDC_METALDOOR_BS6",
00535         wxCheckBox)->SetValue(sram->getDoor(MD_BS6));
00536     XRCCTRL(*this, "IDC_METALDOOR_BS7",
00537         wxCheckBox)->SetValue(sram->getDoor(MD_BS7));
00538     XRCCTRL(*this, "IDC_METALDOOR_BS8",
00539         wxCheckBox)->SetValue(sram->getDoor(MD_BS8));
00540     XRCCTRL(*this, "IDC_METALDOOR_BS9",
00541         wxCheckBox)->SetValue(sram->getDoor(MD_BS9));
00542     XRCCTRL(*this, "IDC_METALDOOR_BS_MAPEXIT",
00543         wxCheckBox)->SetValue(sram->getDoor(MD_BS_MAPEXIT));
00544     XRCCTRL(*this, "IDC_METALDOOR_BS_OLDTLEFT",
00545         wxCheckBox)->SetValue(sram->getDoor(MD_BS_OLDTLEFT));
00546     XRCCTRL(*this, "IDC_METALDOOR_BS_OLDTRIGHT",
00547         wxCheckBox)->SetValue(sram->getDoor(MD_BS_OLDTRIGHT));
00548     XRCCTRL(*this, "IDC_METALDOOR_BS_MINIKRAIDLEFT",
00549         wxCheckBox)->SetValue(sram->getDoor(MD_BS_MINIKRAIDLEFT));
00550     XRCCTRL(*this, "IDC_METALDOOR_BS_MINIKRAIDRIGHT",
00551         wxCheckBox)->SetValue(sram->getDoor(MD_BS_MINIKRAIDRIGHT));
00552     XRCCTRL(*this, "IDC_METALDOOR_BS_VARIASUIT",
00553         wxCheckBox)->SetValue(sram->getDoor(MD_BS_VARIASUIT));
00554     XRCCTRL(*this, "IDC_METALDOOR_BS_KRAIDEXIT",
00555         wxCheckBox)->SetValue(sram->getDoor(MD_BS_KRAIDEXIT));
00556         
00557     // Norfair Metal Doors
00558     XRCCTRL(*this, "IDC_METALDOOR_NF_HJBOOTSEXIT",
00559         wxCheckBox)->SetValue(sram->getDoor(MD_NF_HJBOOTSEXIT));
00560     XRCCTRL(*this, "IDC_METALDOOR_NF_CROCOMIREEXIT",
00561         wxCheckBox)->SetValue(sram->getDoor(MD_NF_CROCOMIREEXIT));
00562     XRCCTRL(*this, "IDC_METALDOOR_NF_SCREWATTACK",
00563         wxCheckBox)->SetValue(sram->getDoor(MD_NF_SCREWATTACK));
00564     XRCCTRL(*this, "IDC_METALDOOR_NF_GOLDSPACEPIRATES",
00565         wxCheckBox)->SetValue(sram->getDoor(MD_NF_GOLDSPACEPIRATES));
00566     XRCCTRL(*this, "IDC_METALDOOR_NF_RIDLEYLEFT",
00567         wxCheckBox)->SetValue(sram->getDoor(MD_NF_RIDLEYLEFT));
00568     XRCCTRL(*this, "IDC_METALDOOR_NF_RIDLEYEXIT",
00569         wxCheckBox)->SetValue(sram->getDoor(MD_NF_RIDLEYEXIT));
00570         
00571     // Wrecked Ship Metal Doors
00572     XRCCTRL(*this, "IDC_METALDOOR_WS1",
00573         wxCheckBox)->SetValue(sram->getDoor(MD_WS1));
00574     XRCCTRL(*this, "IDC_METALDOOR_WS2",
00575         wxCheckBox)->SetValue(sram->getDoor(MD_WS2));
00576     XRCCTRL(*this, "IDC_METALDOOR_WS3",
00577         wxCheckBox)->SetValue(sram->getDoor(MD_WS3));
00578     XRCCTRL(*this, "IDC_METALDOOR_WS4",
00579         wxCheckBox)->SetValue(sram->getDoor(MD_WS4));
00580     XRCCTRL(*this, "IDC_METALDOOR_WS_PHANTOONEXIT",
00581         wxCheckBox)->SetValue(sram->getDoor(MD_WS_PHANTOONEXIT));
00582         
00583     // Maridia Metal Doors
00584     XRCCTRL(*this, "IDC_METALDOOR_M1",
00585         wxCheckBox)->SetValue(sram->getDoor(MD_M1));
00586     XRCCTRL(*this, "IDC_METALDOOR_M2",
00587         wxCheckBox)->SetValue(sram->getDoor(MD_M2));
00588     XRCCTRL(*this, "IDC_METALDOOR_M_BOTWOONEXIT",
00589         wxCheckBox)->SetValue(sram->getDoor(MD_M_BOTWOONEXIT));
00590     XRCCTRL(*this, "IDC_METALDOOR_M_SPACEJUMP",
00591         wxCheckBox)->SetValue(sram->getDoor(MD_M_SPACEJUMP));
00592     XRCCTRL(*this, "IDC_METALDOOR_M_DRAYGONEXIT",
00593         wxCheckBox)->SetValue(sram->getDoor(MD_M_DRAYGONEXIT));
00594     XRCCTRL(*this, "IDC_METALDOOR_M_PLASMA",
00595         wxCheckBox)->SetValue(sram->getDoor(MD_M_PLASMA));
00596     XRCCTRL(*this, "IDC_METALDOOR_M_PLASMAEXIT",
00597         wxCheckBox)->SetValue(sram->getDoor(MD_M_PLASMAEXIT));
00598         
00599     // Tourian Metal Doors
00600     XRCCTRL(*this, "IDC_METALDOOR_T1",
00601         wxCheckBox)->SetValue(sram->getDoor(MD_T1));
00602     XRCCTRL(*this, "IDC_METALDOOR_T2",
00603         wxCheckBox)->SetValue(sram->getDoor(MD_T2));
00604     XRCCTRL(*this, "IDC_METALDOOR_T3",
00605         wxCheckBox)->SetValue(sram->getDoor(MD_T3));
00606     XRCCTRL(*this, "IDC_METALDOOR_T4",
00607         wxCheckBox)->SetValue(sram->getDoor(MD_T4));
00608     XRCCTRL(*this, "IDC_METALDOOR_T5",
00609         wxCheckBox)->SetValue(sram->getDoor(MD_T5));
00610 }
00611 
00612 void Frame::loadMetroidRooms() {
00613     // ensure we have an open SRAMFile
00614     wxASSERT(sram);
00615     
00616     XRCCTRL(*this, "IDC_GAME_METROIDROOM1",
00617         wxCheckBox)->SetValue(sram->getMetroidRoom(MR1));
00618     XRCCTRL(*this, "IDC_GAME_METROIDROOM2",
00619         wxCheckBox)->SetValue(sram->getMetroidRoom(MR2));
00620     XRCCTRL(*this, "IDC_GAME_METROIDROOM3",
00621         wxCheckBox)->SetValue(sram->getMetroidRoom(MR3));
00622     XRCCTRL(*this, "IDC_GAME_METROIDROOM4",
00623         wxCheckBox)->SetValue(sram->getMetroidRoom(MR4));
00624 }
00625 
00626 void Frame::loadMiniBosses() {
00627     // ensure we have an open SRAMFile
00628     wxASSERT(sram);
00629     
00630     // Silver Torizo
00631     XRCCTRL(*this, "IDC_GAME_MINIBOSS_SILVERTORIZO",
00632         wxCheckBox)->SetValue(sram->getBoss(BOSS_SILVERTORIZO));
00633     
00634     // Spore Spawn
00635     XRCCTRL(*this, "IDC_GAME_MINIBOSS_SPORESPAWN",
00636         wxCheckBox)->SetValue(sram->getBoss(BOSS_SPORESPAWN));
00637     
00638     // Botwoon
00639     XRCCTRL(*this, "IDC_GAME_MINIBOSS_BOTWOON",
00640         wxCheckBox)->SetValue(sram->getBoss(BOSS_BOTWOON));
00641     
00642     // Crocomire
00643     XRCCTRL(*this, "IDC_GAME_MINIBOSS_CROCOMIRE",
00644         wxCheckBox)->SetValue(sram->getBoss(BOSS_CROCOMIRE));
00645     
00646     // Golden Torizo
00647     XRCCTRL(*this, "IDC_GAME_MINIBOSS_GOLDENTORIZO",
00648         wxCheckBox)->SetValue(sram->getBoss(BOSS_GOLDENTORIZO));
00649 }
00650 
00651 void Frame::loadMiscTab() {
00652     loadGameTime();
00653     loadGameStatus();
00654     loadControllerConfig();
00655     loadGameConfig();
00656 }
00657 
00658 void Frame::loadMissilePacks() {
00659     // ensure we have an open SRAMFile
00660     wxASSERT(sram);
00661     
00662     // Crateria Missile Packs
00663     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_C1",
00664         wxCheckBox)->SetValue(sram->hasMissilePack(SO_CMISSILEPACKS));
00665     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_C2",
00666         wxCheckBox)->SetValue(sram->hasMissilePack(SO_CMISSILEPACKS + 1));
00667     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_C3",
00668         wxCheckBox)->SetValue(sram->hasMissilePack(SO_CMISSILEPACKS + 2));
00669     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_C4",
00670         wxCheckBox)->SetValue(sram->hasMissilePack(SO_CMISSILEPACKS + 3));
00671     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_C5",
00672         wxCheckBox)->SetValue(sram->hasMissilePack(SO_CMISSILEPACKS + 4));
00673     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_C6",
00674         wxCheckBox)->SetValue(sram->hasMissilePack(SO_CMISSILEPACKS + 5));
00675     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_C7",
00676         wxCheckBox)->SetValue(sram->hasMissilePack(SO_CMISSILEPACKS + 6));
00677     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_C8",
00678         wxCheckBox)->SetValue(sram->hasMissilePack(SO_CMISSILEPACKS + 7));
00679         
00680     // Brinstar Missile Packs
00681     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS1",
00682         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS ));
00683     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS2",
00684         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS + 1));
00685     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS3",
00686         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS + 2));
00687     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS4",
00688         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS + 3));
00689     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS5",
00690         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS + 4));
00691     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS6",
00692         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS + 5));
00693     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS7",
00694         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS + 6));
00695     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS8",
00696         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS + 7));
00697     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS9",
00698         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS + 8));
00699     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS10",
00700         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS + 9));
00701     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS11",
00702         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS + 10));
00703     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_BS12",
00704         wxCheckBox)->SetValue(sram->hasMissilePack(SO_BSMISSILEPACKS + 11));
00705         
00706     // Norfair Missile Packs
00707     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF1",
00708         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS));
00709     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF2",
00710         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 1));
00711     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF3",
00712         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 2));
00713     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF4",
00714         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 3));
00715     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF5",
00716         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 4));
00717     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF6",
00718         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 5));
00719     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF7",
00720         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 6));
00721     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF8",
00722         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 7));
00723     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF9",
00724         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 8));
00725     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF10",
00726         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 9));
00727     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF11",
00728         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 10));
00729     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF12",
00730         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 11));
00731     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF13",
00732         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 12));
00733     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF14",
00734         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 13));
00735     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_NF15",
00736         wxCheckBox)->SetValue(sram->hasMissilePack(SO_NFMISSILEPACKS + 14));
00737         
00738     // Wrecked Ship Missile Packs
00739     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_WS1",
00740         wxCheckBox)->SetValue(sram->hasMissilePack(SO_WSMISSILEPACKS));
00741     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_WS2",
00742         wxCheckBox)->SetValue(sram->hasMissilePack(SO_WSMISSILEPACKS + 1));
00743     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_WS3",
00744         wxCheckBox)->SetValue(sram->hasMissilePack(SO_WSMISSILEPACKS + 2));
00745         
00746     // Maridia Missile Packs
00747     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_M1",
00748         wxCheckBox)->SetValue(sram->hasMissilePack(SO_MMISSILEPACKS));
00749     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_M2",
00750         wxCheckBox)->SetValue(sram->hasMissilePack(SO_MMISSILEPACKS + 1));
00751     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_M3",
00752         wxCheckBox)->SetValue(sram->hasMissilePack(SO_MMISSILEPACKS + 2));
00753     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_M4",
00754         wxCheckBox)->SetValue(sram->hasMissilePack(SO_MMISSILEPACKS + 3));
00755     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_M5",
00756         wxCheckBox)->SetValue(sram->hasMissilePack(SO_MMISSILEPACKS + 4));
00757     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_M6",
00758         wxCheckBox)->SetValue(sram->hasMissilePack(SO_MMISSILEPACKS + 5));
00759     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_M7",
00760         wxCheckBox)->SetValue(sram->hasMissilePack(SO_MMISSILEPACKS + 6));
00761     XRCCTRL(*this, "IDC_PICKUPS_MISSILE_M8",
00762         wxCheckBox)->SetValue(sram->hasMissilePack(SO_MMISSILEPACKS + 7));
00763 }
00764 
00765 void Frame::loadPowerBombPacks() {
00766     // ensure we have an open SRAMFile
00767     wxASSERT(sram);
00768     
00769     // Crateria Power Bomb Pack
00770     XRCCTRL(*this, "IDC_PICKUPS_PBOMB_C",
00771         wxCheckBox)->SetValue(sram->hasPowerBombPack(SO_CPBOMBPACKS));
00772         
00773     // Brinstar Power Bomb Packs
00774     XRCCTRL(*this, "IDC_PICKUPS_PBOMB_BS1",
00775         wxCheckBox)->SetValue(sram->hasPowerBombPack(SO_BSPBOMBPACKS));
00776     XRCCTRL(*this, "IDC_PICKUPS_PBOMB_BS2",
00777         wxCheckBox)->SetValue(sram->hasPowerBombPack(SO_BSPBOMBPACKS + 1));
00778     XRCCTRL(*this, "IDC_PICKUPS_PBOMB_BS3",
00779         wxCheckBox)->SetValue(sram->hasPowerBombPack(SO_BSPBOMBPACKS + 2));
00780     XRCCTRL(*this, "IDC_PICKUPS_PBOMB_BS4",
00781         wxCheckBox)->SetValue(sram->hasPowerBombPack(SO_BSPBOMBPACKS + 3));
00782     XRCCTRL(*this, "IDC_PICKUPS_PBOMB_BS5",
00783         wxCheckBox)->SetValue(sram->hasPowerBombPack(SO_BSPBOMBPACKS + 4));
00784         
00785     // Norfair Power Bombs Packs
00786     XRCCTRL(*this, "IDC_PICKUPS_PBOMB_NF1",
00787         wxCheckBox)->SetValue(sram->hasPowerBombPack(SO_NFPBOMBPACKS));
00788     XRCCTRL(*this, "IDC_PICKUPS_PBOMB_NF2",
00789         wxCheckBox)->SetValue(sram->hasPowerBombPack(SO_NFPBOMBPACKS + 1));
00790     XRCCTRL(*this, "IDC_PICKUPS_PBOMB_NF3",
00791         wxCheckBox)->SetValue(sram->hasPowerBombPack(SO_NFPBOMBPACKS + 2));
00792         
00793     // Maridia Power Bomb Pack
00794     XRCCTRL(*this, "IDC_PICKUPS_PBOMB_M",
00795         wxCheckBox)->SetValue(sram->hasPowerBombPack(SO_MPBOMBPACKS));
00796 }
00797 
00798 void Frame::loadRedDoors() {
00799     // ensure we have an open SRAMFile
00800     wxASSERT(sram);
00801     
00802     XRCCTRL(*this, "IDC_REDDOOR_C_MAP",
00803         wxCheckBox)->SetValue(sram->getDoor(RD_C_MAP));
00804     XRCCTRL(*this, "IDC_REDDOOR_C_BOMBS",
00805         wxCheckBox)->SetValue(sram->getDoor(RD_C_BOMBS));
00806     XRCCTRL(*this, "IDC_REDDOOR_C_TELEVATOR",
00807         wxCheckBox)->SetValue(sram->getDoor(RD_C_TELEVATOR));
00808         
00809     XRCCTRL(*this, "IDC_REDDOOR_BS1",
00810         wxCheckBox)->SetValue(sram->getDoor(RD_BS1));
00811     XRCCTRL(*this, "IDC_REDDOOR_BS2",
00812         wxCheckBox)->SetValue(sram->getDoor(RD_BS2));
00813     XRCCTRL(*this, "IDC_REDDOOR_BS3",
00814         wxCheckBox)->SetValue(sram->getDoor(RD_BS3));
00815     XRCCTRL(*this, "IDC_REDDOOR_BS4",
00816         wxCheckBox)->SetValue(sram->getDoor(RD_BS4));
00817     XRCCTRL(*this, "IDC_REDDOOR_BS5",
00818         wxCheckBox)->SetValue(sram->getDoor(RD_BS5));
00819     XRCCTRL(*this, "IDC_REDDOOR_BS6",
00820         wxCheckBox)->SetValue(sram->getDoor(RD_BS6));
00821     XRCCTRL(*this, "IDC_REDDOOR_BS_MAP",
00822         wxCheckBox)->SetValue(sram->getDoor(RD_BS_MAP));
00823     XRCCTRL(*this, "IDC_REDDOOR_BS_RTANK",
00824         wxCheckBox)->SetValue(sram->getDoor(RD_BS_RTANK));
00825     XRCCTRL(*this, "IDC_REDDOOR_BS_SPORESPAWN",
00826         wxCheckBox)->SetValue(sram->getDoor(RD_BS_SPORESPAWN));
00827     XRCCTRL(*this, "IDC_REDDOOR_BS_XRAYSCOPE",
00828         wxCheckBox)->SetValue(sram->getDoor(RD_BS_XRAYSCOPE));
00829         
00830     XRCCTRL(*this, "IDC_REDDOOR_NF1",
00831         wxCheckBox)->SetValue(sram->getDoor(RD_NF1));
00832     XRCCTRL(*this, "IDC_REDDOOR_NF2",
00833         wxCheckBox)->SetValue(sram->getDoor(RD_NF2));
00834     XRCCTRL(*this, "IDC_REDDOOR_NF3",
00835         wxCheckBox)->SetValue(sram->getDoor(RD_NF3));
00836     XRCCTRL(*this, "IDC_REDDOOR_NF4",
00837         wxCheckBox)->SetValue(sram->getDoor(RD_NF4));
00838     XRCCTRL(*this, "IDC_REDDOOR_NF_HJBOOTS",
00839         wxCheckBox)->SetValue(sram->getDoor(RD_NF_HJBOOTS));
00840     XRCCTRL(*this, "IDC_REDDOOR_NF_SPEEDBOOSTER",
00841         wxCheckBox)->SetValue(sram->getDoor(RD_NF_SPEEDBOOSTER));
00842     XRCCTRL(*this, "IDC_REDDOOR_NF_WAVEBEAM",
00843         wxCheckBox)->SetValue(sram->getDoor(RD_NF_WAVEBEAM));
00844         
00845     XRCCTRL(*this, "IDC_REDDOOR_WS_RTANK",
00846         wxCheckBox)->SetValue(sram->getDoor(RD_WS_RTANK));
00847         
00848     XRCCTRL(*this, "IDC_REDDOOR_M1",
00849         wxCheckBox)->SetValue(sram->getDoor(RD_M1));
00850     XRCCTRL(*this, "IDC_REDDOOR_M2",
00851         wxCheckBox)->SetValue(sram->getDoor(RD_M2));
00852     XRCCTRL(*this, "IDC_REDDOOR_M3",
00853         wxCheckBox)->SetValue(sram->getDoor(RD_M3));
00854     XRCCTRL(*this, "IDC_REDDOOR_M4",
00855         wxCheckBox)->SetValue(sram->getDoor(RD_M4));
00856     XRCCTRL(*this, "IDC_REDDOOR_M5",
00857         wxCheckBox)->SetValue(sram->getDoor(RD_M5));
00858     XRCCTRL(*this, "IDC_REDDOOR_M6",
00859         wxCheckBox)->SetValue(sram->getDoor(RD_M6));
00860     XRCCTRL(*this, "IDC_REDDOOR_M_MAP",
00861         wxCheckBox)->SetValue(sram->getDoor(RD_M_MAP));
00862         
00863     XRCCTRL(*this, "IDC_REDDOOR_T1",
00864         wxCheckBox)->SetValue(sram->getDoor(RD_T1));
00865     XRCCTRL(*this, "IDC_REDDOOR_T_MB",
00866         wxCheckBox)->SetValue(sram->getDoor(RD_T_MB));
00867 }
00868 
00869 void Frame::loadReserveTanks() {
00870     // ensure we have an open SRAMFile
00871     wxASSERT(sram);
00872     
00873     XRCCTRL(*this, "IDC_ITEMS_RTANK_BS",
00874         wxCheckBox)->SetValue(sram->hasReserveTank(SO_BSRTANK));
00875     XRCCTRL(*this, "IDC_ITEMS_RTANK_NF",
00876         wxCheckBox)->SetValue(sram->hasReserveTank(SO_NFRTANK));
00877     XRCCTRL(*this, "IDC_ITEMS_RTANK_WS",
00878         wxCheckBox)->SetValue(sram->hasReserveTank(SO_WSRTANK));
00879     XRCCTRL(*this, "IDC_ITEMS_RTANK_M",
00880         wxCheckBox)->SetValue(sram->hasReserveTank(SO_MRTANK));
00881 }
00882 
00883 void Frame::loadSavePoint() {
00884     // ensure we have an open SRAMFile
00885     wxASSERT(sram);
00886     
00887     std::pair<enum Area, int> save = sram->getSavePoint();
00888     XRCCTRL(*this, "IDRB_GAME_SAVEAREA", wxRadioBox)->SetSelection(save.first);
00889     
00890     switch (save.second) {
00891         case 0:
00892             XRCCTRL(*this, "IDR_GAME_SP1", wxRadioButton)->SetValue(true);
00893             break;
00894         
00895         case 1:
00896             XRCCTRL(*this, "IDR_GAME_SP2", wxRadioButton)->SetValue(true);
00897             break;
00898             
00899         case 2:
00900             XRCCTRL(*this, "IDR_GAME_SP3", wxRadioButton)->SetValue(true);
00901             break;
00902             
00903         case 3:
00904             XRCCTRL(*this, "IDR_GAME_SP4", wxRadioButton)->SetValue(true);
00905             break;
00906             
00907         case 4:
00908             XRCCTRL(*this, "IDR_GAME_SP5", wxRadioButton)->SetValue(true);
00909             break;
00910             
00911         case 5:
00912             XRCCTRL(*this, "IDR_GAME_SP6", wxRadioButton)->SetValue(true);
00913             break;
00914         
00915         default:
00916             // this should NEVER happen
00917             throw InvalidSRAMDataException("Invalid save point");
00918     }
00919 }
00920 
00921 void Frame::loadSpecialDoorsTab() {
00922     loadEyeDoors();
00923     loadMetalDoors();
00924 }
00925 
00926 void Frame::loadSuperMissilePacks() {
00927     // ensure we have an open SRAMFile
00928     wxASSERT(sram);
00929     
00930     // Crateria Super Missile Pack
00931     XRCCTRL(*this, "IDC_PICKUPS_SMISSILE_C", wxCheckBox)->
00932         SetValue(sram->hasSuperMissilePack(SO_CSMISSILEPACKS));
00933         
00934     // Brinstar Super Missile Packs
00935     XRCCTRL(*this, "IDC_PICKUPS_SMISSILE_BS1", wxCheckBox)->
00936         SetValue(sram->hasSuperMissilePack(SO_BSSMISSILEPACKS));
00937     XRCCTRL(*this, "IDC_PICKUPS_SMISSILE_BS2", wxCheckBox)->
00938         SetValue(sram->hasSuperMissilePack(SO_BSSMISSILEPACKS + 1));
00939     XRCCTRL(*this, "IDC_PICKUPS_SMISSILE_BS3", wxCheckBox)->
00940         SetValue(sram->hasSuperMissilePack(SO_BSSMISSILEPACKS + 2));
00941         
00942     // Norfair Super Missile Pack
00943     XRCCTRL(*this, "IDC_PICKUPS_SMISSILE_NF", wxCheckBox)->
00944         SetValue(sram->hasSuperMissilePack(SO_NFSMISSILEPACKS));
00945         
00946     // Wrecked Ship Super Missile Packs
00947     XRCCTRL(*this, "IDC_PICKUPS_SMISSILE_WS1", wxCheckBox)->
00948         SetValue(sram->hasSuperMissilePack(SO_WSSMISSILEPACKS));
00949     XRCCTRL(*this, "IDC_PICKUPS_SMISSILE_WS2", wxCheckBox)->
00950         SetValue(sram->hasSuperMissilePack(SO_WSSMISSILEPACKS + 1));
00951         
00952     // Maridia Super Missile Packs
00953     XRCCTRL(*this, "IDC_PICKUPS_SMISSILE_M1", wxCheckBox)->
00954         SetValue(sram->hasSuperMissilePack(SO_MSMISSILEPACKS));
00955     XRCCTRL(*this, "IDC_PICKUPS_SMISSILE_M2", wxCheckBox)->
00956         SetValue(sram->hasSuperMissilePack(SO_MSMISSILEPACKS + 1));
00957     XRCCTRL(*this, "IDC_PICKUPS_SMISSILE_M3", wxCheckBox)->
00958         SetValue(sram->hasSuperMissilePack(SO_MSMISSILEPACKS + 2));
00959 }
00960 
00961 void Frame::loadYellowDoors() {
00962     // ensure we have an open SRAMFile
00963     wxASSERT(sram);
00964     
00965     // Crateria Yellow Doors
00966     XRCCTRL(*this, "IDC_YELLOWDOOR_C1",
00967         wxCheckBox)->SetValue(sram->getDoor(YD_C1));
00968     XRCCTRL(*this, "IDC_YELLOWDOOR_C2",
00969         wxCheckBox)->SetValue(sram->getDoor(YD_C2));
00970     XRCCTRL(*this, "IDC_YELLOWDOOR_C3",
00971         wxCheckBox)->SetValue(sram->getDoor(YD_C3));
00972     XRCCTRL(*this, "IDC_YELLOWDOOR_C4",
00973         wxCheckBox)->SetValue(sram->getDoor(YD_C4));
00974     XRCCTRL(*this, "IDC_YELLOWDOOR_C5",
00975         wxCheckBox)->SetValue(sram->getDoor(YD_C5));
00976     XRCCTRL(*this, "IDC_YELLOWDOOR_C6",
00977         wxCheckBox)->SetValue(sram->getDoor(YD_C6));
00978     
00979     // Brinstar Yellow Doors
00980     XRCCTRL(*this, "IDC_YELLOWDOOR_BS1",
00981         wxCheckBox)->SetValue(sram->getDoor(YD_BS1));
00982     XRCCTRL(*this, "IDC_YELLOWDOOR_BS2",
00983         wxCheckBox)->SetValue(sram->getDoor(YD_BS2));
00984     XRCCTRL(*this, "IDC_YELLOWDOOR_BS3",
00985         wxCheckBox)->SetValue(sram->getDoor(YD_BS3));
00986     XRCCTRL(*this, "IDC_YELLOWDOOR_BS_XRAYSCOPE",
00987         wxCheckBox)->SetValue(sram->getDoor(YD_BS_XRAYSCOPE));
00988     
00989     // Norfair
00990     XRCCTRL(*this, "IDC_YELLOWDOOR_NF1",
00991         wxCheckBox)->SetValue(sram->getDoor(YD_NF1));
00992     XRCCTRL(*this, "IDC_YELLOWDOOR_NF2",
00993         wxCheckBox)->SetValue(sram->getDoor(YD_NF2));
00994     XRCCTRL(*this, "IDC_YELLOWDOOR_NF_MAP",
00995         wxCheckBox)->SetValue(sram->getDoor(YD_NF_MAP));
00996 }
00997 
00998 void Frame::loadZebetites() {
00999     // ensure we have an open SRAMFile
01000     wxASSERT(sram);
01001     
01002     unsigned int zebetites = sram->getZebetites();
01003     
01004     if (zebetites < 5) {
01005         XRCCTRL(*this, "IDRB_GAME_ZEBETITES",
01006             wxRadioBox)->SetSelection(zebetites);
01007     } else {
01008         // this should NEVER happen
01009         throw InvalidSRAMDataException("Invalid destroyed zebetite count");
01010     }
01011 }
01012 
01013 void Frame::open(const wxString &filename) {
01014     try {
01015         SRAMFile *temp = new SRAMFile(filename);
01016         
01017         if (sram) {
01018             close();
01019         }
01020         
01021         sram = temp;
01022         
01023         for (unsigned int i = 0; i < SRAMFile::GAMES; ++i) {
01024             if (sram->isValidGame(i)) {
01025                 load(i);
01026                 break;
01027             }
01028         }
01029     } catch (InvalidSRAMFileException &e) {
01030         wxString error(e.what(), wxConvLibc);
01031         
01032         wxMessageBox(error,
01033             wxT("Error: Invalid Super Metroid SRAM file"),
01034             wxOK | wxICON_ERROR);
01035     }
01036     
01037     XRCCTRL(*this, "IDN_SMSE", wxNotebook)->Show(sram);
01038 }
01039 
01040 bool Frame::save(const wxString &filename) {
01041     try {
01042         sram->save(filename);
01043     } catch (FileIOException &e) {
01044         wxMessageBox(wxT("Unable to write SRAM file"),
01045                      wxT("Error: Unable to save SRAM"),
01046                      wxOK | wxICON_ERROR);
01047         
01048         return false;
01049     }
01050     
01051     return true;
01052 }
01053 
01054 void Frame::onBossChange(wxCommandEvent &event) {
01055     // ensure we have an open SRAMFile
01056     wxASSERT(sram);
01057     
01058     enum Statue statue;
01059     
01060     if (event.GetId() == XRCID("IDC_GAME_BOSS_KRAID")) {
01061         sram->setBoss(BOSS_KRAID, event.IsChecked());
01062         statue = STATUE_KRAID;
01063     } else if (event.GetId() == XRCID("IDC_GAME_BOSS_PHANTOON")) {
01064         sram->setBoss(BOSS_PHANTOON, event.IsChecked());
01065         statue = STATUE_PHANTOON;
01066     } else if (event.GetId() == XRCID("IDC_GAME_BOSS_DRAYGON")) {
01067         sram->setBoss(BOSS_DRAYGON, event.IsChecked());
01068         statue = STATUE_DRAYGON;
01069     } else {
01070         // ensure we have ridley
01071         wxASSERT(event.GetId() == XRCID("IDC_GAME_BOSS_RIDLEY"));
01072         
01073         sram->setBoss(BOSS_RIDLEY, event.IsChecked());
01074         statue = STATUE_RIDLEY;
01075     }
01076     
01077     if (!event.IsChecked()) {
01078         sram->setStatue(statue, false);
01079         sram->setMiscBit(MB_TELEVATOR, false);
01080     }
01081 }
01082 
01083 void Frame::onControllerChange(wxCommandEvent &event) {
01084     // ensure we have an open SRAMFile
01085     wxASSERT(sram);
01086     
01087     enum Button button = static_cast<enum Button>(event.GetSelection());
01088     
01089     if (event.GetId() == XRCID("IDC_MISC_DASH")) {
01090         sram->setButton(ACTION_DASH, button);
01091     } else if (event.GetId() == XRCID("IDC_MISC_JUMP")) {
01092         sram->setButton(ACTION_JUMP, button);
01093     } else if (event.GetId() == XRCID("IDC_MISC_ITEMCANCEL")) {
01094         sram->setButton(ACTION_ITEMCANCEL, button);
01095     } else if (event.GetId() == XRCID("IDC_MISC_SHOT")) {
01096         sram->setButton(ACTION_SHOT, button);
01097     } else if (event.GetId() == XRCID("IDC_MISC_ANGLEUP")) {
01098         button = static_cast<enum Button>(event.GetSelection() + BUTTON_L);
01099         sram->setButton(ACTION_ANGLEUP, button);
01100     } else if (event.GetId() == XRCID("IDC_MISC_ANGLEDOWN")) {
01101         button = static_cast<enum Button>(event.GetSelection() + BUTTON_L);
01102         sram->setButton(ACTION_ANGLEDOWN, button);
01103     } else {
01104         // ensure item select if we're here
01105         wxASSERT(event.GetId() == XRCID("IDC_MISC_ITEMSELECT"));
01106         
01107         sram->setButton(ACTION_ITEMSELECT, button);
01108     }
01109 }
01110 
01111 void Frame::onEnergyChange(wxCommandEvent &event) {
01112     if (!ignoreTextEvents) {
01113         // ensure we have an open SRAMFile
01114         wxASSERT(sram);
01115         
01116         unsigned long value;
01117         
01118         if (event.GetString().ToULong(&value)) {
01119             wxUint16 energy = static_cast<wxUint16>(value);
01120 
01121             if (event.GetId() == XRCID("IDT_GAME_ENERGY")) {
01122                 unsigned int max = sram->getMaxEnergy();
01123                 
01124                 if (value > max) {
01125                     value = max;
01126                     
01127                     GetStatusBar()->SetStatusText(wxString::Format
01128                         (wxT("Warning: Samus' max energy is %d"), max));
01129                     timer.Start(CLEAR_DELAY, true);
01130                 }
01131                 
01132                 sram->setEnergy(energy);
01133             } else {
01134                 // ensure we are dealing with reserve energy
01135                 wxASSERT(event.GetId() == XRCID("IDT_GAME_RESERVE"));
01136                 
01137                 unsigned int max = sram->getMaxReserveEnergy();
01138                 
01139                 if (value > max) {
01140                     value = max;
01141                     
01142                     GetStatusBar()->SetStatusText(wxString::Format
01143                         (wxT("Warning: Samus' max reserve energy is %d"), max));
01144                     timer.Start(CLEAR_DELAY, true);
01145                 }
01146                 
01147                 sram->setReserveEnergy(energy);
01148             }
01149         }
01150     }
01151 }
01152 
01153 void Frame::onEnergyTankChange(wxCommandEvent &event) {
01154     // ensure we have an open SRAMFile
01155     wxASSERT(sram);
01156     
01157     if (event.GetId() == XRCID("IDC_ITEMS_ET_C1")) {
01158         sram->setEnergyTank(SO_CETANKS, event.IsChecked());
01159     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_C2")) {
01160         sram->setEnergyTank(SO_CETANKS + 1, event.IsChecked());
01161     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_BS1")) {
01162         sram->setEnergyTank(SO_BSETANKS, event.IsChecked());
01163     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_BS2")) {
01164         sram->setEnergyTank(SO_BSETANKS + 1, event.IsChecked());
01165     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_BS3")) {
01166         sram->setEnergyTank(SO_BSETANKS + 2, event.IsChecked());
01167     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_BS4")) {
01168         sram->setEnergyTank(SO_BSETANKS + 3, event.IsChecked());
01169     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_BS5")) {
01170         sram->setEnergyTank(SO_BSETANKS + 4, event.IsChecked());
01171     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_NF1")) {
01172         sram->setEnergyTank(SO_NFETANKS, event.IsChecked());
01173     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_NF2")) {
01174         sram->setEnergyTank(SO_NFETANKS + 1, event.IsChecked());
01175     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_NF3")) {
01176         sram->setEnergyTank(SO_NFETANKS + 2, event.IsChecked());
01177     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_NF4")) {
01178         sram->setEnergyTank(SO_NFETANKS + 3, event.IsChecked());
01179     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_WS")) {
01180         sram->setEnergyTank(SO_WSETANKS, event.IsChecked());
01181     } else if (event.GetId() == XRCID("IDC_ITEMS_ET_M1")) {
01182         sram->setEnergyTank(SO_METANKS, event.IsChecked());
01183     } else {
01184         // ensure we have maridia energy tank 2 if we're here
01185         wxASSERT(event.GetId() == XRCID("IDC_ITEMS_ET_M2"));
01186         
01187         sram->setEnergyTank(SO_METANKS + 1, event.IsChecked());
01188     }
01189     
01190     wxTextCtrl *ctrl = XRCCTRL(*this, "IDT_GAME_ENERGY", wxTextCtrl);
01191     unsigned long value;
01192     
01193     if (ctrl->GetValue().ToULong(&value)) {
01194         wxUint16 max = sram->getMaxEnergy();
01195         
01196         if (value > max) {
01197             ignoreTextEvents = true;
01198             ctrl->SetValue(wxString::Format(wxT("%d"), max));
01199             ignoreTextEvents = false;
01200         }
01201     }
01202 }
01203 
01204 void Frame::onEyeDoorChange(wxCommandEvent &event) {
01205     // ensure we have an open SRAMFile
01206     wxASSERT(sram);
01207     
01208     if (event.GetId() == XRCID("IDC_EYEDOOR_KRAID")) {
01209         sram->setDoor(ED_KRAID, event.IsChecked());
01210     } else if (event.GetId() == XRCID("IDC_EYEDOOR_PHANTOON")) {
01211         sram->setDoor(ED_PHANTOON, event.IsChecked());
01212     } else if (event.GetId() == XRCID("IDC_EYEDOOR_DRAYGON")) {
01213         sram->setDoor(ED_DRAYGON, event.IsChecked());
01214     } else if (event.GetId() == XRCID("IDC_EYEDOOR_RIDLEY")) {
01215         sram->setDoor(ED_RIDLEY, event.IsChecked());
01216     } else {
01217         // make sure we have the Tourian eye door if we're here
01218         wxASSERT(event.GetId() == XRCID("IDC_EYEDOOR_T"));
01219         
01220         sram->setDoor(ED_T, event.IsChecked());
01221     }
01222 }
01223 
01224 void Frame::onFileClose(wxCommandEvent &) {
01225     // ensure we are not trying to close a file we never opened
01226     wxASSERT(sram);
01227     
01228     if (sram->isModified()) {
01229         int answer = wxMessageBox(wxT("Save SRAM before closing?"),
01230                                   wxT("Warning: Unsaved SRAM file"),
01231                                   wxYES_NO | wxCANCEL | wxICON_QUESTION);
01232                                   
01233         if (answer == wxYES) {
01234             close(true);
01235             
01236             return;
01237         } else if (answer == wxCANCEL) {
01238             return;
01239         }
01240     }
01241     
01242     close();
01243 }
01244 
01245 void Frame::onFileOpen(wxCommandEvent &) {
01246     // save current SRAMFile
01247     if (sram && sram->isModified()) {
01248         int answer = wxMessageBox(wxT("Save current SRAM?"),
01249                                   wxT("Warning: Unsaved SRAM file"),
01250                                   wxYES_NO | wxICON_QUESTION);
01251                                   
01252         if (answer == wxYES) {
01253             if (!save()) {
01254                 return;
01255             }
01256         }
01257     }
01258     
01259     wxFileDialog dlg(this, wxT("Select a Super Metroid SRAM file"),
01260                      wxEmptyString, wxEmptyString,
01261                      wxT("SRAM Files (*.srm)|*.srm"), wxFD_OPEN);
01262                      
01263     if (dlg.ShowModal() == wxID_OK) {
01264         open(dlg.GetPath());
01265     }
01266 }
01267 
01268 void Frame::onFileSave(wxCommandEvent &) {
01269     // ensure we have an open modified SRAMFile
01270     wxASSERT(sram && sram->isModified());
01271     
01272     save();
01273 }
01274 
01275 void Frame::onFileSaveAs(wxCommandEvent &) {
01276     // ensure we have an open modified SRAMFile
01277     wxASSERT(sram && sram->isModified());
01278     
01279     wxFileDialog dlg(this, wxT("Select a Super Metroid SRAM file"),
01280                      wxEmptyString, wxEmptyString,
01281                      wxT("SRAM Files (*.srm)|*.srm"), wxFD_SAVE);
01282                      
01283     if (dlg.ShowModal() == wxID_OK) {
01284         sram->save(dlg.GetPath());
01285     }
01286 }
01287 
01288 void Frame::onFileSaveUpdate(wxUpdateUIEvent &) {
01289     bool enable = (sram && sram->isModified());
01290     
01291     wxMenuItem *item = GetMenuBar()->FindItem(wxID_SAVE);
01292     item->Enable(enable);
01293     
01294     item = GetMenuBar()->FindItem(wxID_SAVEAS);
01295     item->Enable(enable);
01296 }
01297 
01298 void Frame::onGame(wxCommandEvent &event) {
01299     if (event.GetId() == XRCID("IDM_GAME_GAMEA")) {
01300         load(0);
01301     } else if (event.GetId() == XRCID("IDM_GAME_GAMEB")) {
01302         load(1);
01303     } else {
01304         // ensure we are only getting the third game here
01305         wxASSERT(event.GetId() == XRCID("IDM_GAME_GAMEC"));
01306         
01307         load(2);
01308     }
01309 }
01310 
01311 void Frame::onGameClear(wxCommandEvent &event) {
01312     // ensure we have an open SRAMFile
01313     wxASSERT(sram);
01314     
01315     int game;
01316     wxChar ch;
01317     
01318     if (event.GetId() == XRCID("IDM_GAME_CLEARA")) {
01319         game = 0;
01320         ch = wxT('A');
01321     } else if (event.GetId() == XRCID("IDM_GAME_CLEARB")) {
01322         game = 1;
01323         ch = wxT('B');
01324     } else {
01325         // ensure we got game C if we're here
01326         wxASSERT(event.GetId() == XRCID("IDM_GAME_CLEARC"));
01327         
01328         game = 2;
01329         ch = wxT('C');
01330     }
01331     
01332     int answer = wxMessageBox(wxString::Format
01333         (wxT("Are you sure you want to erase Game %c?"), ch),
01334         wxT("Really erase game?"), wxYES_NO | wxICON_QUESTION);
01335         
01336     if (answer == wxYES) {
01337         // make copy of the SRAMFile
01338         SRAMFile *temp = new SRAMFile(*sram);
01339         
01340         // erase the old game
01341         sram->clear(game);
01342         
01343         if (this->game == game) {
01344             // time to change games
01345             int game = -1;
01346             
01347             for (unsigned int i = 0; i < SRAMFile::GAMES; ++i) {
01348                 if (sram->isValidGame(i)) {
01349                     game = i;
01350                     break;
01351                 }
01352             }
01353             
01354             if (game == -1) {
01355                 // we deleted the only valid game
01356                 if (!close(true)) {
01357                     // we can't save the file, so we'll have to revert
01358                     delete sram;
01359                     
01360                     sram = temp;
01361                 }
01362             } else {
01363                 // no need for the copy anymore
01364                 delete temp;
01365                 
01366                 load(game);
01367             }
01368         }
01369         
01370         enableMenus();
01371     }
01372 }
01373 
01374 void Frame::onGameClearUpdate(wxUpdateUIEvent &event) {
01375     if (event.GetId() == XRCID("IDM_GAME_CLEAR")) {
01376         event.Enable(sram);
01377     } else if (event.GetId() == XRCID("IDM_GAME_CLEARA")) {
01378         event.Enable(sram && sram->isValidGame(0));
01379     } else if (event.GetId() == XRCID("IDM_GAME_CLEARB")) {
01380         event.Enable(sram && sram->isValidGame(1));
01381     } else {
01382         // ensure we have clear C if we're here
01383         wxASSERT(event.GetId() == XRCID("IDM_GAME_CLEARC"));
01384         
01385         event.Enable(sram && sram->isValidGame(2));
01386     }
01387 }
01388 
01389 void Frame::onGameCopy(wxCommandEvent &event) {
01390     // ensure we have an open SRAMFile
01391     wxASSERT(sram);
01392     
01393     int src, dest;
01394     wxChar sch, dch;
01395     
01396     if (event.GetId() == XRCID("IDM_GAME_COPYAB")) {
01397         src = 0;
01398         dest = 1;
01399         sch = wxT('A');
01400         dch = wxT('B');
01401     } else if (event.GetId() == XRCID("IDM_GAME_COPYAC")) {
01402         src = 0;
01403         dest = 2;
01404         sch = wxT('A');
01405         dch = wxT('C');
01406     } else if (event.GetId() == XRCID("IDM_GAME_COPYBA")) {
01407         src = 1;
01408         dest = 0;
01409         sch = wxT('B');
01410         dch = wxT('A');
01411     } else if (event.GetId() == XRCID("IDM_GAME_COPYBC")) {
01412         src = 1;
01413         dest = 2;
01414         sch = wxT('B');
01415         dch = wxT('C');
01416     } else if (event.GetId() == XRCID("IDM_GAME_COPYCA")) {
01417         src = 2;
01418         dest = 0;
01419         sch = wxT('C');
01420         dch = wxT('A');
01421     } else {
01422         // ensure we have copy C->B if we're here
01423         wxASSERT(event.GetId() == XRCID("IDM_GAME_COPYCB"));
01424         
01425         src = 2;
01426         dest = 1;
01427         sch = wxT('C');
01428         dch = wxT('B');
01429     }
01430     
01431     int answer = wxMessageBox(wxString::Format
01432         (wxT("Are you sure you want to copy Game %c over Game %c?"), sch, dch),
01433         wxT("Really copy game?"), wxYES_NO | wxICON_QUESTION);
01434         
01435     if (answer == wxYES) {
01436         sram->copy(src, dest);
01437         enableMenus();
01438     }
01439 }
01440 
01441 void Frame::onGameCopyUpdate(wxUpdateUIEvent &event) {
01442     if (event.GetId() == XRCID("IDM_GAME_COPY")) {
01443         event.Enable(sram);
01444     } else if (event.GetId() == XRCID("IDM_GAME_COPYA")) {
01445         event.Enable(sram && sram->isValidGame(0));
01446     } else if (event.GetId() == XRCID("IDM_GAME_COPYB")) {
01447         event.Enable(sram && sram->isValidGame(1));
01448     } else {
01449         // ensure we have copy C->B if we're here
01450         wxASSERT(event.GetId() == XRCID("IDM_GAME_COPYC"));
01451         
01452         event.Enable(sram && sram->isValidGame(2));
01453     }
01454 }
01455 
01456 void Frame::onGameEnding(wxCommandEvent &event) {
01457     // ensure we have an open SRAMFile
01458     wxASSERT(sram);
01459     
01460     wxTextCtrl *ctrl = XRCCTRL(*this, "IDT_MISC_GAMETIME", wxTextCtrl);
01461     
01462     if (event.GetId() == XRCID("IDM_GAME_ENDING1")) {
01463         ctrl->SetValue(wxT("0:00"));
01464     } else if (event.GetId() == XRCID("IDM_GAME_ENDING2")) {
01465         ctrl->SetValue(wxT("3:00"));
01466     } else {
01467         // ensure we have the third ending if we're here
01468         wxASSERT(event.GetId() == XRCID("IDM_GAME_ENDING3"));
01469         
01470         ctrl->SetValue(wxT("10:00"));
01471     }
01472 }
01473 
01474 void Frame::onGameGiveBosses(wxCommandEvent &) {
01475     // ensure we have an open SRAMFile
01476     wxASSERT(sram);
01477     
01478     sram->setBoss(BOSS_KRAID);
01479     sram->setStatue(STATUE_KRAID);
01480     
01481     sram->setBoss(BOSS_RIDLEY);
01482     sram->setStatue(STATUE_RIDLEY);
01483     
01484     sram->setBoss(BOSS_PHANTOON);
01485     sram->setStatue(STATUE_PHANTOON);
01486     
01487     sram->setBoss(BOSS_DRAYGON);
01488     sram->setStatue(STATUE_DRAYGON);
01489     
01490     sram->setMiscBit(MB_TELEVATOR);
01491     
01492     loadBosses();
01493 }
01494 
01495 void Frame::onGameGiveEnergy(wxCommandEvent &) {
01496     // ensure we have an open SRAMFile
01497     wxASSERT(sram);
01498     
01499     sram->setEnergy();
01500     sram->setReserveEnergy();
01501     loadEnergy();
01502 }
01503 
01504 void Frame::onGameGiveEnergyTanks(wxCommandEvent &) {
01505     // ensure we have an open SRAMFile
01506     wxASSERT(sram);
01507     
01508     for (int i = 0; i < ETANKS; ++i) {
01509         sram->setEnergyTank(i + SO_CETANKS);
01510     }
01511     
01512     loadEnergyTanks();
01513 }
01514 
01515 void Frame::onGameGiveEverything(wxCommandEvent &) {
01516     // ensure we have an open SRAMFile
01517     wxASSERT(sram);
01518     
01519     wxCommandEvent event1(wxEVT_COMMAND_MENU_SELECTED,
01520         XRCID("IDM_GAME_GIVE_BOSSES"));
01521     GetEventHandler()->ProcessEvent(event1);
01522     
01523     wxCommandEvent event2(wxEVT_COMMAND_MENU_SELECTED,
01524         XRCID("IDM_GAME_GIVE_MINIBOSSES"));
01525     GetEventHandler()->ProcessEvent(event2);
01526     
01527     wxCommandEvent event3(wxEVT_COMMAND_MENU_SELECTED,
01528         XRCID("IDM_GAME_GIVE_METROIDROOMS"));
01529     GetEventHandler()->ProcessEvent(event3);
01530     
01531     wxCommandEvent event4(wxEVT_COMMAND_MENU_SELECTED,
01532         XRCID("IDM_GAME_GIVE_ZEBETITES"));
01533     GetEventHandler()->ProcessEvent(event4);
01534     
01535     wxCommandEvent event5(wxEVT_COMMAND_MENU_SELECTED,
01536         XRCID("IDM_GAME_GIVE_MAPS"));
01537     GetEventHandler()->ProcessEvent(event5);
01538     
01539     wxCommandEvent event6(wxEVT_COMMAND_MENU_SELECTED,
01540         XRCID("IDM_GAME_GIVE_ITEMS"));
01541     GetEventHandler()->ProcessEvent(event6);
01542     
01543     wxCommandEvent event7(wxEVT_COMMAND_MENU_SELECTED,
01544         XRCID("IDM_GAME_GIVE_MISSILES"));
01545     GetEventHandler()->ProcessEvent(event7);
01546     
01547     wxCommandEvent event8(wxEVT_COMMAND_MENU_SELECTED,
01548         XRCID("IDM_GAME_GIVE_SMISSILES"));
01549     GetEventHandler()->ProcessEvent(event8);
01550     
01551     wxCommandEvent event9(wxEVT_COMMAND_MENU_SELECTED,
01552         XRCID("IDM_GAME_GIVE_PBOMBS"));
01553     GetEventHandler()->ProcessEvent(event9);
01554     
01555     wxCommandEvent event10(wxEVT_COMMAND_MENU_SELECTED,
01556         XRCID("IDM_GAME_GIVE_ETANKS"));
01557     GetEventHandler()->ProcessEvent(event10);
01558     
01559     wxCommandEvent event11(wxEVT_COMMAND_MENU_SELECTED,
01560         XRCID("IDM_GAME_GIVE_RTANKS"));
01561     GetEventHandler()->ProcessEvent(event11);
01562     
01563     wxCommandEvent event12(wxEVT_COMMAND_MENU_SELECTED,
01564         XRCID("IDM_GAME_GIVE_REDDOORS"));
01565     GetEventHandler()->ProcessEvent(event12);
01566     
01567     wxCommandEvent event13(wxEVT_COMMAND_MENU_SELECTED,
01568         XRCID("IDM_GAME_GIVE_GREENDOORS"));
01569     GetEventHandler()->ProcessEvent(event13);
01570     
01571     wxCommandEvent event14(wxEVT_COMMAND_MENU_SELECTED,
01572         XRCID("IDM_GAME_GIVE_YELLOWDOORS"));
01573     GetEventHandler()->ProcessEvent(event14);
01574     
01575     wxCommandEvent event15(wxEVT_COMMAND_MENU_SELECTED,
01576         XRCID("IDM_GAME_GIVE_EYEDOORS"));
01577     GetEventHandler()->ProcessEvent(event15);
01578     
01579     wxCommandEvent event16(wxEVT_COMMAND_MENU_SELECTED,
01580         XRCID("IDM_GAME_GIVE_METALDOORS"));
01581     GetEventHandler()->ProcessEvent(event16);
01582     
01583     wxCommandEvent event17(wxEVT_COMMAND_MENU_SELECTED,
01584         XRCID("IDM_GAME_GIVE_ENERGY"));
01585     GetEventHandler()->ProcessEvent(event17);
01586     
01587     wxCommandEvent event18(wxEVT_COMMAND_MENU_SELECTED,
01588         XRCID("IDM_GAME_GIVE_INVENTORY"));
01589     GetEventHandler()->ProcessEvent(event18);
01590 }
01591 
01592 void Frame::onGameGiveEyeDoors(wxCommandEvent &) {
01593     // ensure we have an open SRAMFile
01594     wxASSERT(sram);
01595     
01596     for (int i = 0; i < EYEDOORS; ++i) {
01597         sram->setDoor(i + ED_KRAID);
01598     }
01599     
01600     loadEyeDoors();
01601 }
01602 
01603 void Frame::onGameGiveGreenDoors(wxCommandEvent &) {
01604     // ensure we have an open SRAMFile
01605     wxASSERT(sram);
01606     
01607     for (int i = 0; i < GREENDOORS; ++i) {
01608         sram->setDoor(i + GD_C1);
01609     }
01610     
01611     loadGreenDoors();
01612 }
01613 
01614 void Frame::onGameGiveInventory(wxCommandEvent &) {
01615     // ensure we have an open SRAMFile
01616     wxASSERT(sram);
01617     
01618     sram->setMissiles();
01619     sram->setSuperMissiles();
01620     sram->setPowerBombs();
01621     loadInventory();
01622 }
01623 
01624 void Frame::onGameGiveItems(wxCommandEvent &) {
01625     // ensure we have an open SRAMFile
01626     wxASSERT(sram);
01627     
01628     sram->setItem(ITEM_MORPHINGBALL);
01629     sram->setItemEquipped(ITEM_MORPHINGBALL);
01630     
01631     sram->setItem(ITEM_BOMBS);
01632     sram->setItemEquipped(ITEM_BOMBS);
01633     
01634     sram->setItem(ITEM_SPRINGBALL);
01635     sram->setItemEquipped(ITEM_SPRINGBALL);
01636     
01637     sram->setItem(ITEM_SCREWATTACK);
01638     sram->setItemEquipped(ITEM_SCREWATTACK);
01639     
01640     sram->setItem(ITEM_VARIASUIT);
01641     sram->setItemEquipped(ITEM_VARIASUIT);
01642     
01643     sram->setItem(ITEM_GRAVITYSUIT);
01644     sram->setItemEquipped(ITEM_GRAVITYSUIT);
01645     
01646     sram->setItem(ITEM_HJBOOTS);
01647     sram->setItemEquipped(ITEM_HJBOOTS);
01648     
01649     sram->setItem(ITEM_SPACEJUMP);
01650     sram->setItemEquipped(ITEM_SPACEJUMP);
01651     
01652     sram->setItem(ITEM_SPEEDBOOSTER);
01653     sram->setItemEquipped(ITEM_SPEEDBOOSTER);
01654     
01655     sram->setItem(ITEM_CHARGEBEAM);
01656     sram->setItemEquipped(ITEM_CHARGEBEAM);
01657     
01658     sram->setItem(ITEM_ICEBEAM);
01659     sram->setItemEquipped(ITEM_ICEBEAM);
01660     
01661     sram->setItem(ITEM_WAVEBEAM);
01662     sram->setItemEquipped(ITEM_WAVEBEAM);
01663     
01664     sram->setItem(ITEM_SPAZER);
01665     sram->setItemEquipped(ITEM_SPAZER, false);
01666     
01667     sram->setItem(ITEM_PLASMA);
01668     sram->setItemEquipped(ITEM_PLASMA);
01669     
01670     sram->setItem(ITEM_GRAPPLINGBEAM);
01671     sram->setItemEquipped(ITEM_GRAPPLINGBEAM);
01672     
01673     sram->setItem(ITEM_XRAYSCOPE);
01674     sram->setItemEquipped(ITEM_XRAYSCOPE);
01675     
01676     loadItems();
01677 }
01678 
01679 void Frame::onGameGiveMaps(wxCommandEvent &) {
01680     // ensure we have an open SRAMFile
01681     wxASSERT(sram);
01682     
01683     sram->setMap(AREA_C);
01684     sram->setMap(AREA_BS);
01685     sram->setMap(AREA_NF);
01686     sram->setMap(AREA_WS);
01687     sram->setMap(AREA_M);
01688     sram->setMap(AREA_T);
01689     
01690     loadMaps();
01691 }
01692 
01693 void Frame::onGameGiveMetalDoors(wxCommandEvent &) {
01694     // ensure we have an open SRAMFile
01695     wxASSERT(sram);
01696     
01697     for (int i = 0; i < METALDOORS; ++i) {
01698         sram->setDoor(i + MD_C_BOMBSEXIT);
01699     }
01700     
01701     loadMetalDoors();
01702 }
01703 
01704 void Frame::onGameGiveMetroidRooms(wxCommandEvent &) {
01705     // ensure we have an open SRAMFile
01706     wxASSERT(sram);
01707     
01708     sram->setMetroidRoom(MR1);
01709     sram->setMetroidRoom(MR2);
01710     sram->setMetroidRoom(MR3);
01711     sram->setMetroidRoom(MR4);
01712     
01713     loadMetroidRooms();
01714 }
01715 
01716 void Frame::onGameGiveMiniBosses(wxCommandEvent &) {
01717     // ensure we have an open SRAMFile
01718     wxASSERT(sram);
01719     
01720     sram->setBoss(BOSS_SILVERTORIZO);
01721     sram->setBoss(BOSS_SPORESPAWN);
01722     sram->setBoss(BOSS_BOTWOON);
01723     sram->setBoss(BOSS_CROCOMIRE);
01724     sram->setBoss(BOSS_GOLDENTORIZO);
01725     
01726     loadMiniBosses();
01727 }
01728 
01729 void Frame::onGameGiveMissilePacks(wxCommandEvent &) {
01730     // ensure we have an open SRAMFile
01731     wxASSERT(sram);
01732     
01733     for (int i = 0; i < MISSILE_PACKS; ++i) {
01734         sram->setMissilePack(i + SO_CMISSILEPACKS);
01735     }
01736     
01737     loadMissilePacks();
01738 }
01739 
01740 void Frame::onGameGivePowerBombPacks(wxCommandEvent &) {
01741     // ensure we have an open SRAMFile
01742     wxASSERT(sram);
01743     
01744     for (int i = 0; i < PBOMB_PACKS; ++i) {
01745         sram->setPowerBombPack(i + SO_CPBOMBPACKS);
01746     }
01747     
01748     loadPowerBombPacks();
01749 }
01750 
01751 void Frame::onGameGiveRedDoors(wxCommandEvent &) {
01752     // ensure we have an open SRAMFile
01753     wxASSERT(sram);
01754     
01755     for (int i = 0; i < REDDOORS; ++i) {
01756         sram->setDoor(i + RD_C_MAP);
01757     }
01758     
01759     loadRedDoors();
01760 }
01761 
01762 void Frame::onGameGiveReserveTanks(wxCommandEvent &) {
01763     // ensure we have an open SRAMFile
01764     wxASSERT(sram);
01765     
01766     for (int i = 0; i < RTANKS; ++i) {
01767         sram->setReserveTank(i + SO_BSRTANK);
01768     }
01769     
01770     loadReserveTanks();
01771 }
01772 
01773 void Frame::onGameGiveSuperMissilePacks(wxCommandEvent &) {
01774     // ensure we have an open SRAMFile
01775     wxASSERT(sram);
01776     
01777     for (int i = 0; i < SMISSILE_PACKS; ++i) {
01778         sram->setSuperMissilePack(i + SO_CSMISSILEPACKS);
01779     }
01780     
01781     loadSuperMissilePacks();
01782 }
01783 
01784 void Frame::onGameGiveYellowDoors(wxCommandEvent &) {
01785     // ensure we have an open SRAMFile
01786     wxASSERT(sram);
01787     
01788     for (int i = 0; i < YELLOWDOORS; ++i) {
01789         sram->setDoor(i + YD_C1);
01790     }
01791     
01792     loadYellowDoors();
01793 }
01794 
01795 void Frame::onGameGiveZebetites(wxCommandEvent &) {
01796     // ensure we have an open SRAMFile
01797     wxASSERT(sram);
01798     
01799     sram->setZebetites();
01800     loadZebetites();
01801 }
01802 
01803 void Frame::onGameTimeChange(wxCommandEvent &event) {
01804     if (!ignoreTextEvents) {
01805         // ensure we have an open SRAMFile
01806         wxASSERT(sram);
01807         
01808         wxRegEx regex(wxT("^([0-9]{1,2}):([0-9]{2,2})$"));
01809         
01810         // ensure our regular expression is valid
01811         wxASSERT(regex.IsValid());
01812         
01813         wxString value = event.GetString();
01814         
01815         if (regex.Matches(value)) {
01816             long hours, minutes;
01817             
01818             regex.GetMatch(value, 1).ToLong(&hours);
01819             regex.GetMatch(value, 2).ToLong(&minutes);
01820             
01821             if (minutes < 60) {
01822                 sram->setGameHours(static_cast<unsigned char>(hours));
01823                 sram->setGameMinutes(static_cast<unsigned char>(minutes));
01824                 
01825                 GetStatusBar()->SetStatusText(wxEmptyString);
01826             } else {
01827                 GetStatusBar()->SetStatusText
01828                     (wxT("Warning: Game Minutes cannot exceed 60"));
01829                 timer.Start(CLEAR_DELAY, true);
01830             }
01831         } else {
01832             GetStatusBar()->SetStatusText
01833                 (wxT("Warning: Game time must be of the form HH:MM"));
01834             timer.Start(CLEAR_DELAY, true);
01835         }
01836     }
01837 }
01838 
01839 void Frame::onGameUpdate(wxUpdateUIEvent &event) {
01840     if (sram) {
01841         int game;
01842     
01843         if (event.GetId() == XRCID("IDM_GAME_GAMEA")) {
01844             game = 0;
01845         } else if (event.GetId() == XRCID("IDM_GAME_GAMEB")) {
01846             game = 1;
01847         } else {
01848             // ensure we are only getting the third game here
01849             wxASSERT(event.GetId() == XRCID("IDM_GAME_GAMEC"));
01850             
01851             game = 2;
01852         }
01853         
01854         if (game == sram->getGame()) {
01855             event.Check(true);
01856         }
01857         
01858         event.Enable(sram->isValidGame(game));
01859     }
01860 }
01861 
01862 void Frame::onGreenDoorChange(wxCommandEvent &event) {
01863     // ensure we have an open SRAMFile
01864     wxASSERT(sram);
01865     
01866     if (event.GetId() == XRCID("IDC_GREENDOOR_C1")) {
01867         sram->setDoor(GD_C1, event.IsChecked());
01868     } else if (event.GetId() == XRCID("IDC_GREENDOOR_C_WS")) {
01869         sram->setDoor(GD_C_WS, event.IsChecked());
01870     } else if (event.GetId() == XRCID("IDC_GREENDOOR_BS1")) {
01871         sram->setDoor(GD_BS1, event.IsChecked());
01872     } else if (event.GetId() == XRCID("IDC_GREENDOOR_BS2")) {
01873         sram->setDoor(GD_BS2, event.IsChecked());
01874     } else if (event.GetId() == XRCID("IDC_GREENDOOR_BS3")) {
01875         sram->setDoor(GD_BS3, event.IsChecked());
01876     } else if (event.GetId() == XRCID("IDC_GREENDOOR_BS4")) {
01877         sram->setDoor(GD_BS4, event.IsChecked());
01878     } else if (event.GetId() == XRCID("IDC_GREENDOOR_BS5")) {
01879         sram->setDoor(GD_BS5, event.IsChecked());
01880     } else if (event.GetId() == XRCID("IDC_GREENDOOR_BS6")) {
01881         sram->setDoor(GD_BS6, event.IsChecked());
01882     } else if (event.GetId() == XRCID("IDC_GREENDOOR_BS7")) {
01883         sram->setDoor(GD_BS7, event.IsChecked());
01884     } else if (event.GetId() == XRCID("IDC_GREENDOOR_BS8")) {
01885         sram->setDoor(GD_BS8, event.IsChecked());
01886     } else if (event.GetId() == XRCID("IDC_GREENDOOR_BS_SPAZER")) {
01887         sram->setDoor(GD_BS_SPAZER, event.IsChecked());
01888     } else if (event.GetId() == XRCID("IDC_GREENDOOR_BS_SPORESPAWNEXIT")) {
01889         sram->setDoor(GD_BS_SPORESPAWNEXIT, event.IsChecked());
01890     } else if (event.GetId() == XRCID("IDC_GREENDOOR_NF1")) {
01891         sram->setDoor(GD_NF1, event.IsChecked());
01892     } else if (event.GetId() == XRCID("IDC_GREENDOOR_NF2")) {
01893         sram->setDoor(GD_NF2, event.IsChecked());
01894     } else if (event.GetId() == XRCID("IDC_GREENDOOR_NF3")) {
01895         sram->setDoor(GD_NF3, event.IsChecked());
01896     } else if (event.GetId() == XRCID("IDC_GREENDOOR_NF4")) {
01897         sram->setDoor(GD_NF4, event.IsChecked());
01898     } else if (event.GetId() == XRCID("IDC_GREENDOOR_NF_ICEBEAM")) {
01899         sram->setDoor(GD_NF_ICEBEAM, event.IsChecked());
01900     } else if (event.GetId() == XRCID("IDC_GREENDOOR_NF_SPEEDBOOSTER")) {
01901         sram->setDoor(GD_NF_SPEEDBOOSTER, event.IsChecked());
01902     } else if (event.GetId() == XRCID("IDC_GREENDOOR_WS")) {
01903         sram->setDoor(GD_WS, event.IsChecked());
01904     } else if (event.GetId() == XRCID("IDC_GREENDOOR_M1")) {
01905         sram->setDoor(GD_M1, event.IsChecked());
01906     } else if (event.GetId() == XRCID("IDC_GREENDOOR_M2")) {
01907         sram->setDoor(GD_M2, event.IsChecked());
01908     } else if (event.GetId() == XRCID("IDC_GREENDOOR_M3")) {
01909         sram->setDoor(GD_M3, event.IsChecked());
01910     } else {
01911         // ensure we have Draygon's green door if we're here
01912         wxASSERT(event.GetId() == XRCID("IDC_GREENDOOR_M_DRAYGON"));
01913         
01914         sram->setDoor(GD_M_DRAYGON, event.IsChecked());
01915     }
01916 }
01917 
01918 void Frame::onHelpAbout(wxCommandEvent &) {
01919     wxString message = APP_NAME + wxT(' ') + APP_VERSION + wxT('\n') +
01920                        APP_COPYRIGHT + wxT('\n') + APP_URL;
01921     wxString title = wxT("About ") + APP_NAME + wxT("...");
01922     
01923     wxMessageBox(message, title, wxOK | wxICON_INFORMATION);
01924 }
01925 
01926 void Frame::onItemChange(wxCommandEvent &event) {
01927     // ensure we have an open SRAMFile
01928     wxASSERT(sram);
01929     
01930     enum Item item;
01931     
01932     if (event.GetId() == XRCID("IDC_ITEMS_MORPHINGBALL")) {
01933         item = ITEM_MORPHINGBALL;
01934     } else if (event.GetId() == XRCID("IDC_ITEMS_BOMBS")) {
01935         item = ITEM_BOMBS;
01936     } else if (event.GetId() == XRCID("IDC_ITEMS_SPRINGBALL")) {
01937         item = ITEM_SPRINGBALL;
01938     } else if (event.GetId() == XRCID("IDC_ITEMS_SCREWATTACK")) {
01939         item = ITEM_SCREWATTACK;
01940     } else if (event.GetId() == XRCID("IDC_ITEMS_VARIASUIT")) {
01941         item = ITEM_VARIASUIT;
01942     } else if (event.GetId() == XRCID("IDC_ITEMS_GRAVITYSUIT")) {
01943         item = ITEM_GRAVITYSUIT;
01944     } else if (event.GetId() == XRCID("IDC_ITEMS_HJBOOTS")) {
01945         item = ITEM_HJBOOTS;
01946     } else if (event.GetId() == XRCID("IDC_ITEMS_SPACEJUMP")) {
01947         item = ITEM_SPACEJUMP;
01948     } else if (event.GetId() == XRCID("IDC_ITEMS_SPEEDBOOSTER")) {
01949         item = ITEM_SPEEDBOOSTER;
01950     } else if (event.GetId() == XRCID("IDC_ITEMS_CHARGEBEAM")) {
01951         item = ITEM_CHARGEBEAM;
01952     } else if (event.GetId() == XRCID("IDC_ITEMS_ICEBEAM")) {
01953         item = ITEM_ICEBEAM;
01954     } else if (event.GetId() == XRCID("IDC_ITEMS_WAVEBEAM")) {
01955         item = ITEM_WAVEBEAM;
01956     } else if (event.GetId() == XRCID("IDC_ITEMS_SPAZER")) {
01957         item = ITEM_SPAZER;
01958     } else if (event.GetId() == XRCID("IDC_ITEMS_PLASMA")) {
01959         item = ITEM_PLASMA;
01960     } else if (event.GetId() == XRCID("IDC_ITEMS_XRAYSCOPE")) {
01961         item = ITEM_XRAYSCOPE;
01962         sram->setItemEquipped(item, event.IsChecked());
01963     } else {
01964         // ensure we have the grappling beam control at this point
01965         wxASSERT(event.GetId() == XRCID("IDC_ITEMS_GRAPPLINGBEAM"));
01966         
01967         item = ITEM_GRAPPLINGBEAM;
01968         sram->setItemEquipped(ITEM_GRAPPLINGBEAM, event.IsChecked());
01969     }
01970     
01971     sram->setItem(item, event.IsChecked());
01972     
01973     if (!event.IsChecked()) {
01974         sram->setItemEquipped(item, false);
01975     }
01976 }
01977 
01978 void Frame::onItemEquippedChange(wxCommandEvent &event) {
01979     // ensure we have an open SRAMFile
01980     wxASSERT(sram);
01981     
01982     if (event.GetId() == XRCID("IDC_ITEMS_MORPHINGBALL_EQUIPPED")) {
01983         sram->setItemEquipped(ITEM_MORPHINGBALL, event.IsChecked());
01984     } else if (event.GetId() == XRCID("IDC_ITEMS_BOMBS_EQUIPPED")) {
01985         sram->setItemEquipped(ITEM_BOMBS, event.IsChecked());
01986     } else if (event.GetId() == XRCID("IDC_ITEMS_SPRINGBALL_EQUIPPED")) {
01987         sram->setItemEquipped(ITEM_SPRINGBALL, event.IsChecked());
01988     } else if (event.GetId() == XRCID("IDC_ITEMS_SCREWATTACK_EQUIPPED")) {
01989         sram->setItemEquipped(ITEM_SCREWATTACK, event.IsChecked());
01990     } else if (event.GetId() == XRCID("IDC_ITEMS_VARIASUIT_EQUIPPED")) {
01991         sram->setItemEquipped(ITEM_VARIASUIT, event.IsChecked());
01992     } else if (event.GetId() == XRCID("IDC_ITEMS_GRAVITYSUIT_EQUIPPED")) {
01993         sram->setItemEquipped(ITEM_GRAVITYSUIT, event.IsChecked());
01994     } else if (event.GetId() == XRCID("IDC_ITEMS_HJBOOTS_EQUIPPED")) {
01995         sram->setItemEquipped(ITEM_HJBOOTS, event.IsChecked());
01996     } else if (event.GetId() == XRCID("IDC_ITEMS_SPACEJUMP_EQUIPPED")) {
01997         sram->setItemEquipped(ITEM_SPACEJUMP, event.IsChecked());
01998     } else if (event.GetId() == XRCID("IDC_ITEMS_SPEEDBOOSTER_EQUIPPED")) {
01999         sram->setItemEquipped(ITEM_SPEEDBOOSTER, event.IsChecked());
02000     } else if (event.GetId() == XRCID("IDC_ITEMS_CHARGEBEAM_EQUIPPED")) {
02001         sram->setItemEquipped(ITEM_CHARGEBEAM, event.IsChecked());
02002     } else if (event.GetId() == XRCID("IDC_ITEMS_ICEBEAM_EQUIPPED")) {
02003         sram->setItemEquipped(ITEM_ICEBEAM, event.IsChecked());
02004     } else if (event.GetId() == XRCID("IDC_ITEMS_WAVEBEAM_EQUIPPED")) {
02005         sram->setItemEquipped(ITEM_WAVEBEAM, event.IsChecked());
02006     } else if (event.GetId() == XRCID("IDC_ITEMS_SPAZER_EQUIPPED")) {
02007         sram->setItemEquipped(ITEM_SPAZER, event.IsChecked());
02008         
02009         if (event.IsChecked()) {
02010             sram->setItemEquipped(ITEM_PLASMA, false);
02011         }
02012     } else {
02013         // ensure we have the plasma control at this point
02014         wxASSERT(event.GetId() == XRCID("IDC_ITEMS_PLASMA_EQUIPPED"));
02015         
02016         sram->setItemEquipped(ITEM_PLASMA, event.IsChecked());
02017         
02018         if (event.IsChecked()) {
02019             sram->setItemEquipped(ITEM_SPAZER, false);
02020         }
02021     }
02022 }
02023 
02024 void Frame::onItemEquippedUpdate(wxUpdateUIEvent &event) {
02025     if (sram) {
02026         enum Item item;
02027         
02028         if (event.GetId() == XRCID("IDC_ITEMS_MORPHINGBALL_EQUIPPED")) {
02029             item = ITEM_MORPHINGBALL;
02030         } else if (event.GetId() == XRCID("IDC_ITEMS_BOMBS_EQUIPPED")) {
02031             item = ITEM_BOMBS;
02032         } else if (event.GetId() == XRCID("IDC_ITEMS_SPRINGBALL_EQUIPPED")) {
02033             item = ITEM_SPRINGBALL;
02034         } else if (event.GetId() == XRCID("IDC_ITEMS_HJBOOTS_EQUIPPED")) {
02035             item = ITEM_HJBOOTS;
02036         } else if (event.GetId() == XRCID("IDC_ITEMS_VARIASUIT_EQUIPPED")) {
02037             item = ITEM_VARIASUIT;
02038         } else if (event.GetId() == XRCID("IDC_ITEMS_GRAVITYSUIT_EQUIPPED")) {
02039             item = ITEM_GRAVITYSUIT;
02040         } else if (event.GetId() == XRCID("IDC_ITEMS_SPEEDBOOSTER_EQUIPPED")) {
02041             item = ITEM_SPEEDBOOSTER;
02042         } else if (event.GetId() == XRCID("IDC_ITEMS_SPACEJUMP_EQUIPPED")) {
02043             item = ITEM_SPACEJUMP;
02044         } else if (event.GetId() == XRCID("IDC_ITEMS_SCREWATTACK_EQUIPPED")) {
02045             item = ITEM_SCREWATTACK;
02046         } else if (event.GetId() == XRCID("IDC_ITEMS_CHARGEBEAM_EQUIPPED")) {
02047             item = ITEM_CHARGEBEAM;
02048         } else if (event.GetId() == XRCID("IDC_ITEMS_ICEBEAM_EQUIPPED")) {
02049             item = ITEM_ICEBEAM;
02050         } else if (event.GetId() == XRCID("IDC_ITEMS_WAVEBEAM_EQUIPPED")) {
02051             item = ITEM_WAVEBEAM;
02052         } else if (event.GetId() == XRCID("IDC_ITEMS_SPAZER_EQUIPPED")) {
02053             item = ITEM_SPAZER;
02054             
02055             if (sram->isItemEquipped(ITEM_PLASMA)) {
02056                 event.Check(false);
02057             }
02058         } else {
02059             // ensure we are really getting the plasma
02060             wxASSERT(event.GetId() == XRCID("IDC_ITEMS_PLASMA_EQUIPPED"));
02061             
02062             item = ITEM_PLASMA;
02063             
02064             if (sram->isItemEquipped(ITEM_SPAZER)) {
02065                 event.Check(false);
02066             }
02067         }
02068         
02069         event.Enable(sram->hasItem(item));
02070         
02071         if (!sram->hasItem(item)) {
02072             event.Check(false);
02073         }
02074     }
02075 }
02076 
02077 void Frame::onMapChange(wxCommandEvent &event) {
02078     // ensure we have an open SRAMFile
02079     wxASSERT(sram);
02080     
02081     if (event.GetId() == XRCID("IDC_GAME_MAP_C")) {
02082         sram->setMap(AREA_C, event.IsChecked());
02083     } else if (event.GetId() == XRCID("IDC_GAME_MAP_BS")) {
02084         sram->setMap(AREA_BS, event.IsChecked());
02085     } else if (event.GetId() == XRCID("IDC_GAME_MAP_NF")) {
02086         sram->setMap(AREA_NF, event.IsChecked());
02087     } else if (event.GetId() == XRCID("IDC_GAME_MAP_WS")) {
02088         sram->setMap(AREA_WS, event.IsChecked());
02089     } else if (event.GetId() == XRCID("IDC_GAME_MAP_M")) {
02090         sram->setMap(AREA_M, event.IsChecked());
02091     } else {
02092         // ensure we are getting the Tourian Map at this point
02093         wxASSERT(event.GetId() == XRCID("IDC_GAME_MAP_T"));
02094         
02095         sram->setMap(AREA_T, event.IsChecked());
02096     }
02097 }
02098 
02099 void Frame::onMetalDoorChange(wxCommandEvent &event) {
02100     // ensure we have an open SRAMFile
02101     wxASSERT(sram);
02102     
02103     if (event.GetId() == XRCID("IDC_METALDOOR_C_BOMBSEXIT")) {
02104         sram->setDoor(MD_C_BOMBSEXIT, event.IsChecked());
02105     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS1")) {
02106         sram->setDoor(MD_BS1, event.IsChecked());
02107     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS2")) {
02108         sram->setDoor(MD_BS2, event.IsChecked());
02109     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS3")) {
02110         sram->setDoor(MD_BS3, event.IsChecked());
02111     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS4")) {
02112         sram->setDoor(MD_BS4, event.IsChecked());
02113     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS5")) {
02114         sram->setDoor(MD_BS5, event.IsChecked());
02115     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS6")) {
02116         sram->setDoor(MD_BS6, event.IsChecked());
02117     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS7")) {
02118         sram->setDoor(MD_BS7, event.IsChecked());
02119     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS8")) {
02120         sram->setDoor(MD_BS8, event.IsChecked());
02121     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS9")) {
02122         sram->setDoor(MD_BS9, event.IsChecked());
02123     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS_MAPEXIT")) {
02124         sram->setDoor(MD_BS_MAPEXIT, event.IsChecked());
02125     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS_OLDTLEFT")) {
02126         sram->setDoor(MD_BS_OLDTLEFT, event.IsChecked());
02127     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS_OLDTRIGHT")) {
02128         sram->setDoor(MD_BS_OLDTRIGHT, event.IsChecked());
02129     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS_MINIKRAIDLEFT")) {
02130         sram->setDoor(MD_BS_MINIKRAIDLEFT, event.IsChecked());
02131     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS_MINIKRAIDRIGHT")) {
02132         sram->setDoor(MD_BS_MINIKRAIDRIGHT, event.IsChecked());
02133     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS_VARIASUIT")) {
02134         sram->setDoor(MD_BS_VARIASUIT, event.IsChecked());
02135     } else if (event.GetId() == XRCID("IDC_METALDOOR_BS_KRAIDEXIT")) {
02136         sram->setDoor(MD_BS_KRAIDEXIT, event.IsChecked());
02137     } else if (event.GetId() == XRCID("IDC_METALDOOR_NF_HJBOOTSEXIT")) {
02138         sram->setDoor(MD_NF_HJBOOTSEXIT, event.IsChecked());
02139     } else if (event.GetId() == XRCID("IDC_METALDOOR_NF_CROCOMIREEXIT")) {
02140         sram->setDoor(MD_NF_CROCOMIREEXIT, event.IsChecked());
02141     } else if (event.GetId() == XRCID("IDC_METALDOOR_NF_SCREWATTACK")) {
02142         sram->setDoor(MD_NF_SCREWATTACK, event.IsChecked());
02143     } else if (event.GetId() == XRCID("IDC_METALDOOR_NF_GOLDSPACEPIRATES")) {
02144         sram->setDoor(MD_NF_GOLDSPACEPIRATES, event.IsChecked());
02145     } else if (event.GetId() == XRCID("IDC_METALDOOR_NF_RIDLEYLEFT")) {
02146         sram->setDoor(MD_NF_RIDLEYLEFT, event.IsChecked());
02147     } else if (event.GetId() == XRCID("IDC_METALDOOR_NF_RIDLEYEXIT")) {
02148         sram->setDoor(MD_NF_RIDLEYEXIT, event.IsChecked());
02149     } else if (event.GetId() == XRCID("IDC_METALDOOR_WS1")) {
02150         sram->setDoor(MD_WS1, event.IsChecked());
02151     } else if (event.GetId() == XRCID("IDC_METALDOOR_WS2")) {
02152         sram->setDoor(MD_WS2, event.IsChecked());
02153     } else if (event.GetId() == XRCID("IDC_METALDOOR_WS3")) {
02154         sram->setDoor(MD_WS3, event.IsChecked());
02155     } else if (event.GetId() == XRCID("IDC_METALDOOR_WS4")) {
02156         sram->setDoor(MD_WS4, event.IsChecked());
02157     } else if (event.GetId() == XRCID("IDC_METALDOOR_WS_PHANTOONEXIT")) {
02158         sram->setDoor(MD_WS_PHANTOONEXIT, event.IsChecked());
02159     } else if (event.GetId() == XRCID("IDC_METALDOOR_M1")) {
02160         sram->setDoor(MD_M1, event.IsChecked());
02161     } else if (event.GetId() == XRCID("IDC_METALDOOR_M2")) {
02162         sram->setDoor(MD_M2, event.IsChecked());
02163     } else if (event.GetId() == XRCID("IDC_METALDOOR_M_BOTWOONEXIT")) {
02164         sram->setDoor(MD_M_BOTWOONEXIT, event.IsChecked());
02165     } else if (event.GetId() == XRCID("IDC_METALDOOR_M_SPACEJUMP")) {
02166         sram->setDoor(MD_M_SPACEJUMP, event.IsChecked());
02167     } else if (event.GetId() == XRCID("IDC_METALDOOR_M_DRAYGONEXIT")) {
02168         sram->setDoor(MD_M_DRAYGONEXIT, event.IsChecked());
02169     } else if (event.GetId() == XRCID("IDC_METALDOOR_M_PLASMA")) {
02170         sram->setDoor(MD_M_PLASMA, event.IsChecked());
02171     } else if (event.GetId() == XRCID("IDC_METALDOOR_M_PLASMAEXIT")) {
02172         sram->setDoor(MD_M_PLASMAEXIT, event.IsChecked());
02173     } else if (event.GetId() == XRCID("IDC_METALDOOR_T1")) {
02174         sram->setDoor(MD_T1, event.IsChecked());
02175     } else if (event.GetId() == XRCID("IDC_METALDOOR_T2")) {
02176         sram->setDoor(MD_T2, event.IsChecked());
02177     } else if (event.GetId() == XRCID("IDC_METALDOOR_T3")) {
02178         sram->setDoor(MD_T3, event.IsChecked());
02179     } else if (event.GetId() == XRCID("IDC_METALDOOR_T4")) {
02180         sram->setDoor(MD_T4, event.IsChecked());
02181     } else {
02182         // ensure we have tourian metal door 5 if we're here
02183         wxASSERT(event.GetId() == XRCID("IDC_METALDOOR_T5"));
02184         
02185         sram->setDoor(MD_T5, event.IsChecked());
02186     }
02187 }
02188 
02189 void Frame::onMetroidRoomChange(wxCommandEvent &event) {
02190     // ensure we have an open SRAMFile
02191     wxASSERT(sram);
02192     
02193     if (event.GetId() == XRCID("IDC_GAME_METROIDROOM1")) {
02194         sram->setMetroidRoom(MR1, event.IsChecked());
02195     } else if (event.GetId() == XRCID("IDC_GAME_METROIDROOM2")) {
02196         sram->setMetroidRoom(MR2, event.IsChecked());
02197     } else if (event.GetId() == XRCID("IDC_GAME_METROIDROOM3")) {
02198         sram->setMetroidRoom(MR3, event.IsChecked());
02199     } else {
02200         // ensure we have metroid room 5 if we're here
02201         wxASSERT(event.GetId() == XRCID("IDC_GAME_METROIDROOM4"));
02202         
02203         sram->setMetroidRoom(MR4, event.IsChecked());
02204     }
02205 }
02206 
02207 void Frame::onMiniBossChange(wxCommandEvent &event) {
02208     // ensure we have an open SRAMFile
02209     wxASSERT(sram);
02210     
02211     if (event.GetId() == XRCID("IDC_GAME_MINIBOSS_SILVERTORIZO")) {
02212         sram->setBoss(BOSS_SILVERTORIZO, event.IsChecked());
02213     } else if (event.GetId() == XRCID("IDC_GAME_MINIBOSS_SPORESPAWN")) {
02214         sram->setBoss(BOSS_SPORESPAWN, event.IsChecked());
02215     } else if (event.GetId() == XRCID("IDC_GAME_MINIBOSS_BOTWOON")) {
02216         sram->setBoss(BOSS_BOTWOON, event.IsChecked());
02217     } else if (event.GetId() == XRCID("IDC_GAME_MINIBOSS_CROCOMIRE")) {
02218         sram->setBoss(BOSS_CROCOMIRE, event.IsChecked());
02219     } else {
02220         // ensure we came from the Golden Torizo mini-boss control
02221         wxASSERT(event.GetId() == XRCID("IDC_GAME_MINIBOSS_GOLDENTORIZO"));
02222         
02223         sram->setBoss(BOSS_GOLDENTORIZO, event.IsChecked());
02224     }
02225 }
02226 
02227 void Frame::onMiscConfigChange(wxCommandEvent &event) {
02228     // ensure we have an open SRAMFile
02229     wxASSERT(sram);
02230     
02231     if (event.GetId() == XRCID("IDRB_MISC_LANGUAGE")) {
02232         sram->setMiscBit(MB_LANGUAGE, event.GetSelection());
02233     } else if (event.GetId() == XRCID("IDRB_MISC_MOONWALK")) {
02234         sram->setMiscBit(MB_MOONWALK, event.GetSelection());
02235     } else {
02236         // ensure we have icon cancel at this point
02237         wxASSERT(event.GetId() == XRCID("IDRB_MISC_ICONCANCEL"));
02238         
02239         sram->setMiscBit(MB_ICONCANCEL, event.GetSelection());
02240     }
02241 }
02242 
02243 void Frame::onMiscStatChange(wxCommandEvent &event) {
02244     // ensure we have an open SRAMFile
02245     wxASSERT(sram);
02246     
02247     if (event.GetId() == XRCID("IDC_MISC_MTUBEBROKEN")) {
02248         sram->setMiscBit(MB_MTUBEBROKEN, event.IsChecked());
02249     } else {
02250         // ensure only rescued animals control here
02251         wxASSERT(event.GetId() == XRCID("IDC_MISC_RESCUEDANIMALS"));
02252         
02253         sram->setMiscBit(MB_RESCUEDANIMALS, event.IsChecked());
02254     }
02255 }
02256 
02257 void Frame::onMissilePackChange(wxCommandEvent &event) {
02258     // ensure we have an open SRAMFile
02259     wxASSERT(sram);
02260     
02261     if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_C1")) {
02262         sram->setMissilePack(SO_CMISSILEPACKS, event.IsChecked());
02263     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_C2")) {
02264         sram->setMissilePack(SO_CMISSILEPACKS + 1, event.IsChecked());
02265     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_C3")) {
02266         sram->setMissilePack(SO_CMISSILEPACKS + 2, event.IsChecked());
02267     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_C4")) {
02268         sram->setMissilePack(SO_CMISSILEPACKS + 3, event.IsChecked());
02269     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_C5")) {
02270         sram->setMissilePack(SO_CMISSILEPACKS + 4, event.IsChecked());
02271     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_C6")) {
02272         sram->setMissilePack(SO_CMISSILEPACKS + 5, event.IsChecked());
02273     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_C7")) {
02274         sram->setMissilePack(SO_CMISSILEPACKS + 6, event.IsChecked());
02275     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_C8")) {
02276         sram->setMissilePack(SO_CMISSILEPACKS + 7, event.IsChecked());
02277     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS1")) {
02278         sram->setMissilePack(SO_BSMISSILEPACKS, event.IsChecked());
02279     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS2")) {
02280         sram->setMissilePack(SO_BSMISSILEPACKS + 1, event.IsChecked());
02281     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS3")) {
02282         sram->setMissilePack(SO_BSMISSILEPACKS + 2, event.IsChecked());
02283     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS4")) {
02284         sram->setMissilePack(SO_BSMISSILEPACKS + 3, event.IsChecked());
02285     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS5")) {
02286         sram->setMissilePack(SO_BSMISSILEPACKS + 4, event.IsChecked());
02287     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS6")) {
02288         sram->setMissilePack(SO_BSMISSILEPACKS + 5, event.IsChecked());
02289     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS7")) {
02290         sram->setMissilePack(SO_BSMISSILEPACKS + 6, event.IsChecked());
02291     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS8")) {
02292         sram->setMissilePack(SO_BSMISSILEPACKS + 7, event.IsChecked());
02293     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS9")) {
02294         sram->setMissilePack(SO_BSMISSILEPACKS + 8, event.IsChecked());
02295     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS10")) {
02296         sram->setMissilePack(SO_BSMISSILEPACKS + 9, event.IsChecked());
02297     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS11")) {
02298         sram->setMissilePack(SO_BSMISSILEPACKS + 10, event.IsChecked());
02299     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_BS12")) {
02300         sram->setMissilePack(SO_BSMISSILEPACKS + 11, event.IsChecked());
02301     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF1")) {
02302         sram->setMissilePack(SO_NFMISSILEPACKS, event.IsChecked());
02303     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF2")) {
02304         sram->setMissilePack(SO_NFMISSILEPACKS + 1, event.IsChecked());
02305     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF3")) {
02306         sram->setMissilePack(SO_NFMISSILEPACKS + 2, event.IsChecked());
02307     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF4")) {
02308         sram->setMissilePack(SO_NFMISSILEPACKS + 3, event.IsChecked());
02309     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF5")) {
02310         sram->setMissilePack(SO_NFMISSILEPACKS + 4, event.IsChecked());
02311     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF6")) {
02312         sram->setMissilePack(SO_NFMISSILEPACKS + 5, event.IsChecked());
02313     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF7")) {
02314         sram->setMissilePack(SO_NFMISSILEPACKS + 6, event.IsChecked());
02315     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF8")) {
02316         sram->setMissilePack(SO_NFMISSILEPACKS + 7, event.IsChecked());
02317     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF9")) {
02318         sram->setMissilePack(SO_NFMISSILEPACKS + 8, event.IsChecked());
02319     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF10")) {
02320         sram->setMissilePack(SO_NFMISSILEPACKS + 9, event.IsChecked());
02321     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF11")) {
02322         sram->setMissilePack(SO_NFMISSILEPACKS + 10, event.IsChecked());
02323     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF12")) {
02324         sram->setMissilePack(SO_NFMISSILEPACKS + 11, event.IsChecked());
02325     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF13")) {
02326         sram->setMissilePack(SO_NFMISSILEPACKS + 12, event.IsChecked());
02327     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF14")) {
02328         sram->setMissilePack(SO_NFMISSILEPACKS + 13, event.IsChecked());
02329     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_NF15")) {
02330         sram->setMissilePack(SO_NFMISSILEPACKS + 14, event.IsChecked());
02331     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_WS1")) {
02332         sram->setMissilePack(SO_WSMISSILEPACKS, event.IsChecked());
02333     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_WS2")) {
02334         sram->setMissilePack(SO_WSMISSILEPACKS + 1, event.IsChecked());
02335     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_WS3")) {
02336         sram->setMissilePack(SO_WSMISSILEPACKS + 2, event.IsChecked());
02337     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_M1")) {
02338         sram->setMissilePack(SO_MMISSILEPACKS, event.IsChecked());
02339     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_M2")) {
02340         sram->setMissilePack(SO_MMISSILEPACKS + 1, event.IsChecked());
02341     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_M3")) {
02342         sram->setMissilePack(SO_MMISSILEPACKS + 2, event.IsChecked());
02343     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_M4")) {
02344         sram->setMissilePack(SO_MMISSILEPACKS + 3, event.IsChecked());
02345     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_M5")) {
02346         sram->setMissilePack(SO_MMISSILEPACKS + 4, event.IsChecked());
02347     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_M6")) {
02348         sram->setMissilePack(SO_MMISSILEPACKS + 5, event.IsChecked());
02349     } else if (event.GetId() == XRCID("IDC_PICKUPS_MISSILE_M7")) {
02350         sram->setMissilePack(SO_MMISSILEPACKS + 6, event.IsChecked());
02351     } else {
02352         // ensure we have maridia pack 8 if we're here
02353         wxASSERT(event.GetId() == XRCID("IDC_PICKUPS_MISSILE_M8"));
02354         
02355         sram->setMissilePack(SO_MMISSILEPACKS + 7, event.IsChecked());
02356     }
02357     
02358     wxTextCtrl *ctrl = XRCCTRL(*this, "IDT_GAME_MISSILES", wxTextCtrl);
02359     unsigned long value;
02360     
02361     if (ctrl->GetValue().ToULong(&value)) {
02362         unsigned char max = sram->getMaxMissiles();
02363         
02364         if (value > max) {
02365             ignoreTextEvents = true;
02366             ctrl->SetValue(wxString::Format(wxT("%d"), max));
02367             ignoreTextEvents = false;
02368         }
02369     }
02370 }
02371 
02372 void Frame::onMissilesSpinner(wxSpinEvent &event) {
02373     // ensure we are only called for the missiles spinner
02374     wxASSERT(event.GetId() == XRCID("IDSB_GAME_MISSILES"));
02375     
02376     // ensure we have an open SRAMFile
02377     wxASSERT(sram);
02378     
02379     int missiles = event.GetPosition();
02380     int max = sram->getMaxMissiles();
02381     
02382     if (missiles > max) {
02383         missiles = max;
02384         
02385         wxSpinButton *ptr =
02386             dynamic_cast<wxSpinButton *>(event.GetEventObject());
02387             
02388         // ensure we got a wxSpinButton from that cast
02389         wxASSERT(ptr);
02390         
02391         ptr->SetValue(max);
02392     }
02393     
02394     sram->setMissiles(missiles);
02395     
02396     ignoreTextEvents = true;
02397     XRCCTRL(*this, "IDT_GAME_MISSILES",
02398         wxTextCtrl)->SetValue(wxString::Format(wxT("%d"), missiles));
02399     ignoreTextEvents = false;
02400 }
02401 
02402 void Frame::onMissilesChange(wxCommandEvent &event) {
02403     // ensure we are only called for the missiles text control
02404     wxASSERT(event.GetId() == XRCID("IDT_GAME_MISSILES"));
02405     
02406     if (!ignoreTextEvents) {
02407         // ensure we have an open SRAMFile
02408         wxASSERT(sram);
02409     
02410         unsigned long value;
02411         
02412         if (event.GetString().ToULong(&value)) {
02413             unsigned char missiles = static_cast<unsigned char>(value);
02414             unsigned char max = sram->getMaxMissiles();
02415             
02416             if (value > max) {
02417                 missiles = max;
02418                 
02419                 GetStatusBar()->SetStatusText(wxString::Format
02420                     (wxT("Warning: Samus' missile capacity is %d"), max));
02421                 timer.Start(CLEAR_DELAY, true);
02422             }
02423             
02424             sram->setMissiles(missiles);
02425             
02426             XRCCTRL(*this, "IDSB_GAME_MISSILES",
02427                 wxSpinButton)->SetValue(missiles);
02428         }
02429     }
02430 }
02431 
02432 void Frame::onNotebookUpdate(wxUpdateUIEvent &event) {
02433     wxNotebook *notebook = dynamic_cast<wxNotebook *>(event.GetEventObject());
02434     
02435     // ensure we got a notebook on the cast
02436     wxASSERT(notebook);
02437     
02438     notebook->Show(sram);
02439     
02440     if (!sram) {
02441         notebook->SetSelection(0);
02442     }
02443 }
02444 
02445 void Frame::onPowerBombPackChange(wxCommandEvent &event) {
02446     // ensure we have an open SRAMFile
02447     wxASSERT(sram);
02448     
02449     if (event.GetId() == XRCID("IDC_PICKUPS_PBOMB_C")) {
02450         sram->setPowerBombPack(SO_CPBOMBPACKS, event.IsChecked());
02451     } else if (event.GetId() == XRCID("IDC_PICKUPS_PBOMB_BS1")) {
02452         sram->setPowerBombPack(SO_BSPBOMBPACKS, event.IsChecked());
02453     } else if (event.GetId() == XRCID("IDC_PICKUPS_PBOMB_BS2")) {
02454         sram->setPowerBombPack(SO_BSPBOMBPACKS + 1, event.IsChecked());
02455     } else if (event.GetId() == XRCID("IDC_PICKUPS_PBOMB_BS3")) {
02456         sram->setPowerBombPack(SO_BSPBOMBPACKS + 2, event.IsChecked());
02457     } else if (event.GetId() == XRCID("IDC_PICKUPS_PBOMB_BS4")) {
02458         sram->setPowerBombPack(SO_BSPBOMBPACKS + 3, event.IsChecked());
02459     } else if (event.GetId() == XRCID("IDC_PICKUPS_PBOMB_BS5")) {
02460         sram->setPowerBombPack(SO_BSPBOMBPACKS + 4, event.IsChecked());
02461     } else if (event.GetId() == XRCID("IDC_PICKUPS_PBOMB_NF1")) {
02462         sram->setPowerBombPack(SO_NFPBOMBPACKS, event.IsChecked());
02463     } else if (event.GetId() == XRCID("IDC_PICKUPS_PBOMB_NF2")) {
02464         sram->setPowerBombPack(SO_NFPBOMBPACKS + 1, event.IsChecked());
02465     } else if (event.GetId() == XRCID("IDC_PICKUPS_PBOMB_NF3")) {
02466         sram->setPowerBombPack(SO_NFPBOMBPACKS + 2, event.IsChecked());
02467     } else {
02468         // ensure we have the maridia power bomb pack if we're here
02469         wxASSERT(event.GetId() == XRCID("IDC_PICKUPS_PBOMB_M"));
02470         
02471         sram->setPowerBombPack(SO_MPBOMBPACKS, event.IsChecked());
02472     }
02473     
02474     wxTextCtrl *ctrl = XRCCTRL(*this, "IDT_GAME_PBOMBS", wxTextCtrl);
02475     unsigned long value;
02476     
02477     if (ctrl->GetValue().ToULong(&value)) {
02478         unsigned char max = sram->getMaxPowerBombs();
02479         
02480         if (value > max) {
02481             ignoreTextEvents = true;
02482             ctrl->SetValue(wxString::Format(wxT("%d"), max));
02483             ignoreTextEvents = false;
02484         }
02485     }
02486 }
02487 
02488 void Frame::onPowerBombsSpinner(wxSpinEvent &event) {
02489     // ensure we are only called for the power bombs spinner
02490     wxASSERT(event.GetId() == XRCID("IDSB_GAME_PBOMBS"));
02491     
02492     // ensure we have an open SRAMFile
02493     wxASSERT(sram);
02494     
02495     int bombs = event.GetPosition();
02496     int max = sram->getMaxPowerBombs();
02497     
02498     if (bombs > max) {
02499         bombs = max;
02500         
02501         wxSpinButton *ptr =
02502             dynamic_cast<wxSpinButton *>(event.GetEventObject());
02503             
02504         // ensure we got a wxSpinButton from that cast
02505         wxASSERT(ptr);
02506             
02507         ptr->SetValue(max);
02508     }
02509     
02510     sram->setPowerBombs(bombs);
02511     
02512     ignoreTextEvents = true;
02513     XRCCTRL(*this, "IDT_GAME_PBOMBS",
02514         wxTextCtrl)->SetValue(wxString::Format(wxT("%d"), bombs));
02515     ignoreTextEvents = false;
02516 }
02517 
02518 void Frame::onPowerBombsChange(wxCommandEvent &event) {
02519     // ensure we are only called for the power bombs text control
02520     wxASSERT(event.GetId() == XRCID("IDT_GAME_PBOMBS"));
02521     
02522     if (!ignoreTextEvents) {
02523         // ensure we have an open SRAMFile
02524         wxASSERT(sram);
02525     
02526         unsigned long value;
02527         
02528         if (event.GetString().ToULong(&value)) {
02529             unsigned char bombs = static_cast<unsigned char>(value);
02530             unsigned char max = sram->getMaxPowerBombs();
02531             
02532             if (value > max) {
02533                 bombs = max;
02534                 
02535                 GetStatusBar()->SetStatusText(wxString::Format
02536                     (wxT("Warning: Samus' power bomb capacity is %d"), max));
02537                 timer.Start(CLEAR_DELAY, true);
02538             }
02539             
02540             sram->setPowerBombs(bombs);
02541             
02542             XRCCTRL(*this, "IDSB_GAME_PBOMBS",
02543                 wxSpinButton)->SetValue(bombs);
02544         }
02545     }
02546 }
02547 
02548 void Frame::onRedDoorChange(wxCommandEvent &event) {
02549     // ensure we have an open SRAMFile
02550     wxASSERT(sram);
02551     
02552     if (event.GetId() == XRCID("IDC_REDDOOR_C_MAP")) {
02553         sram->setDoor(RD_C_MAP, event.IsChecked());
02554     } else if (event.GetId() == XRCID("IDC_REDDOOR_C_BOMBS")) {
02555         sram->setDoor(RD_C_BOMBS, event.IsChecked());
02556     } else if (event.GetId() == XRCID("IDC_REDDOOR_C_TELEVATOR")) {
02557         sram->setDoor(RD_C_TELEVATOR, event.IsChecked());
02558     } else if (event.GetId() == XRCID("IDC_REDDOOR_BS1")) {
02559         sram->setDoor(RD_BS1, event.IsChecked());
02560     } else if (event.GetId() == XRCID("IDC_REDDOOR_BS2")) {
02561         sram->setDoor(RD_BS2, event.IsChecked());
02562     } else if (event.GetId() == XRCID("IDC_REDDOOR_BS3")) {
02563         sram->setDoor(RD_BS3, event.IsChecked());
02564     } else if (event.GetId() == XRCID("IDC_REDDOOR_BS4")) {
02565         sram->setDoor(RD_BS4, event.IsChecked());
02566     } else if (event.GetId() == XRCID("IDC_REDDOOR_BS5")) {
02567         sram->setDoor(RD_BS5, event.IsChecked());
02568     } else if (event.GetId() == XRCID("IDC_REDDOOR_BS6")) {
02569         sram->setDoor(RD_BS6, event.IsChecked());
02570     } else if (event.GetId() == XRCID("IDC_REDDOOR_BS_MAP")) {
02571         sram->setDoor(RD_BS_MAP, event.IsChecked());
02572     } else if (event.GetId() == XRCID("IDC_REDDOOR_BS_RTANK")) {
02573         sram->setDoor(RD_BS_RTANK, event.IsChecked());
02574     } else if (event.GetId() == XRCID("IDC_REDDOOR_BS_SPORESPAWN")) {
02575         sram->setDoor(RD_BS_SPORESPAWN, event.IsChecked());
02576     } else if (event.GetId() == XRCID("IDC_REDDOOR_BS_XRAYSCOPE")) {
02577         sram->setDoor(RD_BS_XRAYSCOPE, event.IsChecked());
02578     } else if (event.GetId() == XRCID("IDC_REDDOOR_NF1")) {
02579         sram->setDoor(RD_NF1, event.IsChecked());
02580     } else if (event.GetId() == XRCID("IDC_REDDOOR_NF2")) {
02581         sram->setDoor(RD_NF2, event.IsChecked());
02582     } else if (event.GetId() == XRCID("IDC_REDDOOR_NF3")) {
02583         sram->setDoor(RD_NF3, event.IsChecked());
02584     } else if (event.GetId() == XRCID("IDC_REDDOOR_NF4")) {
02585         sram->setDoor(RD_NF4, event.IsChecked());
02586     } else if (event.GetId() == XRCID("IDC_REDDOOR_NF_HJBOOTS")) {
02587         sram->setDoor(RD_NF_HJBOOTS, event.IsChecked());
02588     } else if (event.GetId() == XRCID("IDC_REDDOOR_NF_SPEEDBOOSTER")) {
02589         sram->setDoor(RD_NF_SPEEDBOOSTER, event.IsChecked());
02590     } else if (event.GetId() == XRCID("IDC_REDDOOR_NF_WAVEBEAM")) {
02591         sram->setDoor(RD_NF_WAVEBEAM, event.IsChecked());
02592     } else if (event.GetId() == XRCID("IDC_REDDOOR_WS_RTANK")) {
02593         sram->setDoor(RD_WS_RTANK, event.IsChecked());
02594     } else if (event.GetId() == XRCID("IDC_REDDOOR_M1")) {
02595         sram->setDoor(RD_M1, event.IsChecked());
02596     } else if (event.GetId() == XRCID("IDC_REDDOOR_M2")) {
02597         sram->setDoor(RD_M2, event.IsChecked());
02598     } else if (event.GetId() == XRCID("IDC_REDDOOR_M3")) {
02599         sram->setDoor(RD_M3, event.IsChecked());
02600     } else if (event.GetId() == XRCID("IDC_REDDOOR_M4")) {
02601         sram->setDoor(RD_M4, event.IsChecked());
02602     } else if (event.GetId() == XRCID("IDC_REDDOOR_M5")) {
02603         sram->setDoor(RD_M5, event.IsChecked());
02604     } else if (event.GetId() == XRCID("IDC_REDDOOR_M6")) {
02605         sram->setDoor(RD_M6, event.IsChecked());
02606     } else if (event.GetId() == XRCID("IDC_REDDOOR_M_MAP")) {
02607         sram->setDoor(RD_M_MAP, event.IsChecked());
02608     } else if (event.GetId() == XRCID("IDC_REDDOOR_T1")) {
02609         sram->setDoor(RD_T1, event.IsChecked());
02610     } else {
02611         // ensure we have the red door to mother brain if we're here
02612         wxASSERT(event.GetId() == XRCID("IDC_REDDOOR_T_MB"));
02613         
02614         sram->setDoor(RD_T_MB, event.IsChecked());
02615     }
02616 }
02617 
02618 void Frame::onReserveTankChange(wxCommandEvent &event) {
02619     // ensure we have an open SRAMFile
02620     wxASSERT(sram);
02621     
02622     if (event.GetId() == XRCID("IDC_ITEMS_RTANK_BS")) {
02623         sram->setReserveTank(SO_BSRTANK, event.IsChecked());
02624     } else if (event.GetId() == XRCID("IDC_ITEMS_RTANK_NF")) {
02625         sram->setReserveTank(SO_NFRTANK, event.IsChecked());
02626     } else if (event.GetId() == XRCID("IDC_ITEMS_RTANK_WS")) {
02627         sram->setReserveTank(SO_WSRTANK, event.IsChecked());
02628     } else {
02629         // ensure we have the maridia reserve tank if we're here
02630         wxASSERT(event.GetId() == XRCID("IDC_ITEMS_RTANK_M"));
02631         
02632         sram->setReserveTank(SO_MRTANK, event.IsChecked());
02633     }
02634     
02635     wxTextCtrl *ctrl = XRCCTRL(*this, "IDT_GAME_RESERVE", wxTextCtrl);
02636     unsigned long value;
02637     
02638     if (ctrl->GetValue().ToULong(&value)) {
02639         wxUint16 max = sram->getMaxReserveEnergy();
02640         
02641         if (value > max) {
02642             ignoreTextEvents = true;
02643             ctrl->SetValue(wxString::Format(wxT("%d"), max));
02644             ignoreTextEvents = false;
02645         }
02646     }
02647 }
02648 
02649 void Frame::onSaveAreaChange(wxCommandEvent &event) {
02650     // ensure we have an open SRAMFile
02651     wxASSERT(sram);
02652     
02653     enum Area area = static_cast<enum Area>(event.GetSelection());
02654     sram->setSavePoint(area);
02655     
02656     XRCCTRL(*this, "IDR_GAME_SP1", wxRadioButton)->SetValue(true);
02657 }
02658 
02659 void Frame::onSavePointChange(wxCommandEvent &event) {
02660     // ensure we have an open SRAMFile
02661     wxASSERT(sram);
02662     
02663     std::pair<enum Area, int> sp = sram->getSavePoint();
02664     
02665     if (event.GetId() == XRCID("IDR_GAME_SP1")) {
02666         sp.second = 0;
02667     } else if (event.GetId() == XRCID("IDR_GAME_SP2")) {
02668         sp.second = 1;
02669     } else if (event.GetId() == XRCID("IDR_GAME_SP3")) {
02670         sp.second = 2;
02671     } else if (event.GetId() == XRCID("IDR_GAME_SP4")) {
02672         sp.second = 3;
02673     } else if (event.GetId() == XRCID("IDR_GAME_SP5")) {
02674         sp.second = 4;
02675     } else {
02676         // ensure we have SP6 at this point
02677         wxASSERT(event.GetId() == XRCID("IDR_GAME_SP6"));
02678         
02679         sp.second = 5;
02680     }
02681     
02682     sram->setSavePoint(sp.first, sp.second);
02683 }
02684 
02685 void Frame::onSavePointUpdate(wxUpdateUIEvent &event) {
02686     if (sram) {
02687         int points = 0;
02688         std::pair<enum Area, int> save = sram->getSavePoint();
02689         
02690         switch (save.first) {
02691             case AREA_C:
02692                 points = C_SAVEPOINTS;
02693                 break;
02694                 
02695             case AREA_BS:
02696                 points = BS_SAVEPOINTS;
02697                 break;
02698                 
02699             case AREA_NF:
02700                 points = NF_SAVEPOINTS;
02701                 break;
02702                 
02703             case AREA_WS:
02704                 points = WS_SAVEPOINTS;
02705                 break;
02706                 
02707             case AREA_M:
02708                 points = M_SAVEPOINTS;
02709                 break;
02710                 
02711             case AREA_T:
02712                 points = T_SAVEPOINTS;
02713                 break;
02714         }
02715         
02716         int point;
02717         
02718         if (event.GetId() == XRCID("IDR_GAME_SP1")) {
02719             point = 0;
02720         } else if (event.GetId() == XRCID("IDR_GAME_SP2")) {
02721             point = 1;
02722         } else if (event.GetId() == XRCID("IDR_GAME_SP3")) {
02723             point = 2;
02724         } else if (event.GetId() == XRCID("IDR_GAME_SP4")) {
02725             point = 3;
02726         } else if (event.GetId() == XRCID("IDR_GAME_SP5")) {
02727             point = 4;
02728         } else {
02729             // ensure we have SP6
02730             wxASSERT(event.GetId() == XRCID("IDR_GAME_SP6"));
02731             
02732             point = 5;
02733         }
02734         
02735         event.Enable(point < points);
02736     }
02737 }
02738 
02739 void Frame::onStatueChange(wxCommandEvent &event) {
02740     // ensure we have an open SRAMFile
02741     wxASSERT(sram);
02742     
02743     if (event.GetId() == XRCID("IDC_GAME_STATUE_KRAID")) {
02744         sram->setStatue(STATUE_KRAID, event.IsChecked());
02745     } else if (event.GetId() == XRCID("IDC_GAME_STATUE_PHANTOON")) {
02746         sram->setStatue(STATUE_PHANTOON, event.IsChecked());
02747     } else if (event.GetId() == XRCID("IDC_GAME_STATUE_DRAYGON")) {
02748         sram->setStatue(STATUE_DRAYGON, event.IsChecked());
02749     } else {
02750         // ensure we have ridley's statue
02751         wxASSERT(event.GetId() == XRCID("IDC_GAME_STATUE_RIDLEY"));
02752         
02753         sram->setStatue(STATUE_RIDLEY, event.IsChecked());
02754     }
02755     
02756     if (event.IsChecked()) {
02757         if (sram->getStatue(STATUE_KRAID) && sram->getStatue(STATUE_PHANTOON) &&
02758             sram->getStatue(STATUE_DRAYGON) && sram->getStatue(STATUE_RIDLEY)) {
02759             sram->setMiscBit(MB_TELEVATOR);
02760         }
02761     } else {
02762         sram->setMiscBit(MB_TELEVATOR, false);
02763     }
02764 }
02765 
02766 void Frame::onStatueUpdate(wxUpdateUIEvent &event) {
02767     if (sram) {
02768         bool value;
02769         
02770         if (event.GetId() == XRCID("IDC_GAME_STATUE_KRAID")) {
02771             value = sram->getBoss(BOSS_KRAID);
02772         } else if (event.GetId() == XRCID("IDC_GAME_STATUE_PHANTOON")) {
02773             value = sram->getBoss(BOSS_PHANTOON);
02774         } else if (event.GetId() == XRCID("IDC_GAME_STATUE_DRAYGON")) {
02775             value = sram->getBoss(BOSS_DRAYGON);
02776         } else {
02777             // ensure we have Ridley's statue
02778             wxASSERT(event.GetId() == XRCID("IDC_GAME_STATUE_RIDLEY"));
02779             
02780             value = sram->getBoss(BOSS_RIDLEY);
02781         }
02782         
02783         event.Enable(value);
02784         
02785         if (!value) {
02786             event.Check(false);
02787         }
02788     }
02789 }
02790 
02791 void Frame::onStatusBarTimer(wxTimerEvent &) {
02792     GetStatusBar()->SetStatusText(wxEmptyString);
02793 }
02794 
02795 void Frame::onSuperMissilePackChange(wxCommandEvent &event) {
02796     // ensure we have an open SRAMFile
02797     wxASSERT(sram);
02798     
02799     if (event.GetId() == XRCID("IDC_PICKUPS_SMISSILE_C")) {
02800         sram->setSuperMissilePack(SO_CSMISSILEPACKS, event.IsChecked());
02801     } else if (event.GetId() == XRCID("IDC_PICKUPS_SMISSILE_BS1")) {
02802         sram->setSuperMissilePack(SO_BSSMISSILEPACKS, event.IsChecked());
02803     } else if (event.GetId() == XRCID("IDC_PICKUPS_SMISSILE_BS2")) {
02804         sram->setSuperMissilePack(SO_BSSMISSILEPACKS + 1, event.IsChecked());
02805     } else if (event.GetId() == XRCID("IDC_PICKUPS_SMISSILE_BS3")) {
02806         sram->setSuperMissilePack(SO_BSSMISSILEPACKS + 2, event.IsChecked());
02807     } else if (event.GetId() == XRCID("IDC_PICKUPS_SMISSILE_NF")) {
02808         sram->setSuperMissilePack(SO_NFSMISSILEPACKS, event.IsChecked());
02809     } else if (event.GetId() == XRCID("IDC_PICKUPS_SMISSILE_WS1")) {
02810         sram->setSuperMissilePack(SO_WSSMISSILEPACKS, event.IsChecked());
02811     } else if (event.GetId() == XRCID("IDC_PICKUPS_SMISSILE_WS2")) {
02812         sram->setSuperMissilePack(SO_WSSMISSILEPACKS + 1, event.IsChecked());
02813     } else if (event.GetId() == XRCID("IDC_PICKUPS_SMISSILE_M1")) {
02814         sram->setSuperMissilePack(SO_MSMISSILEPACKS, event.IsChecked());
02815     } else if (event.GetId() == XRCID("IDC_PICKUPS_SMISSILE_M2")) {
02816         sram->setSuperMissilePack(SO_MSMISSILEPACKS + 1, event.IsChecked());
02817     } else {
02818         // ensure we have maridia 3 super missile pack if we're here
02819         wxASSERT(event.GetId() == XRCID("IDC_PICKUPS_SMISSILE_M3"));
02820         
02821         sram->setSuperMissilePack(SO_MSMISSILEPACKS + 2, event.IsChecked());
02822     }
02823     
02824     wxTextCtrl *ctrl = XRCCTRL(*this, "IDT_GAME_SMISSILES", wxTextCtrl);
02825     unsigned long value;
02826     
02827     if (ctrl->GetValue().ToULong(&value)) {
02828         unsigned char max = sram->getMaxSuperMissiles();
02829         
02830         if (value > max) {
02831             ignoreTextEvents = true;
02832             ctrl->SetValue(wxString::Format(wxT("%d"), max));
02833             ignoreTextEvents = false;
02834         }
02835     }
02836 }
02837 
02838 void Frame::onSuperMissilesSpinner(wxSpinEvent &event) {
02839     // ensure we are only called for the super missiles spinner
02840     wxASSERT(event.GetId() == XRCID("IDSB_GAME_SMISSILES"));
02841     
02842     // ensure we have an open SRAMFile
02843     wxASSERT(sram);
02844     
02845     int missiles = event.GetPosition();
02846     int max = sram->getMaxSuperMissiles();
02847     
02848     if (missiles > max) {
02849         missiles = max;
02850         
02851         wxSpinButton *ptr =
02852             dynamic_cast<wxSpinButton *>(event.GetEventObject());
02853             
02854         // ensure we got a wxSpinButton from that cast
02855         wxASSERT(ptr);
02856             
02857         ptr->SetValue(max);
02858     }
02859     
02860     sram->setSuperMissiles(missiles);
02861     
02862     ignoreTextEvents = true;
02863     XRCCTRL(*this, "IDT_GAME_SMISSILES",
02864         wxTextCtrl)->SetValue(wxString::Format(wxT("%d"), missiles));
02865     ignoreTextEvents = false;
02866 }
02867 
02868 void Frame::onSuperMissilesChange(wxCommandEvent &event) {
02869     // ensure we are only called for the super missiles text control
02870     wxASSERT(event.GetId() == XRCID("IDT_GAME_SMISSILES"));
02871     
02872     if (!ignoreTextEvents) {
02873         // ensure we have an open SRAMFile
02874         wxASSERT(sram);
02875     
02876         unsigned long value;
02877         
02878         if (event.GetString().ToULong(&value)) {
02879             unsigned char missiles = static_cast<unsigned char>(value);
02880             unsigned char max = sram->getMaxSuperMissiles();
02881             
02882             if (value > max) {
02883                 missiles = max;
02884                 
02885                 GetStatusBar()->SetStatusText(wxString::Format
02886                     (wxT("Warning: Samus' super missile capacity is %d"), max));
02887                 timer.Start(CLEAR_DELAY, true);
02888             }
02889             
02890             sram->setSuperMissiles(missiles);
02891             
02892             XRCCTRL(*this, "IDSB_GAME_SMISSILES",
02893                 wxSpinButton)->SetValue(missiles);
02894         }
02895     }
02896 }
02897 
02898 void Frame::onWindowClosing(wxCloseEvent &event) {
02899     // if we can ignore the close and have a modified SRAMFile
02900     if (event.CanVeto() && sram && sram->isModified()) {
02901         int answer = wxMessageBox(wxT("Save before exit?"),
02902                                   wxT("Warning: SRAM has been modified"),
02903                                   wxYES_NO | wxCANCEL | wxICON_QUESTION);
02904                                   
02905         if (answer == wxYES) {
02906             if (!close(true)) {
02907                 event.Veto();
02908                 return;
02909             }
02910         } else if (answer == wxCANCEL) {
02911             event.Veto();
02912             return;
02913         }
02914     }
02915     
02916     Destroy();
02917 }
02918 
02919 void Frame::onYellowDoorChange(wxCommandEvent &event) {
02920     // ensure we have an open SRAMFile
02921     wxASSERT(sram);
02922     
02923     if (event.GetId() == XRCID("IDC_YELLOWDOOR_C1")) {
02924         sram->setDoor(YD_C1, event.IsChecked());
02925     } else if (event.GetId() == XRCID("IDC_YELLOWDOOR_C2")) {
02926         sram->setDoor(YD_C2, event.IsChecked());
02927     } else if (event.GetId() == XRCID("IDC_YELLOWDOOR_C3")) {
02928         sram->setDoor(YD_C3, event.IsChecked());
02929     } else if (event.GetId() == XRCID("IDC_YELLOWDOOR_C4")) {
02930         sram->setDoor(YD_C4, event.IsChecked());
02931     } else if (event.GetId() == XRCID("IDC_YELLOWDOOR_C5")) {
02932         sram->setDoor(YD_C5, event.IsChecked());
02933     } else if (event.GetId() == XRCID("IDC_YELLOWDOOR_C6")) {
02934         sram->setDoor(YD_C6, event.IsChecked());
02935     } else if (event.GetId() == XRCID("IDC_YELLOWDOOR_BS1")) {
02936         sram->setDoor(YD_BS1, event.IsChecked());
02937     } else if (event.GetId() == XRCID("IDC_YELLOWDOOR_BS2")) {
02938         sram->setDoor(YD_BS2, event.IsChecked());
02939     } else if (event.GetId() == XRCID("IDC_YELLOWDOOR_BS3")) {
02940         sram->setDoor(YD_BS3, event.IsChecked());
02941     } else if (event.GetId() == XRCID("IDC_YELLOWDOOR_BS_XRAYSCOPE")) {
02942         sram->setDoor(YD_BS_XRAYSCOPE, event.IsChecked());
02943     } else if (event.GetId() == XRCID("IDC_YELLOWDOOR_NF1")) {
02944         sram->setDoor(YD_NF1, event.IsChecked());
02945     } else if (event.GetId() == XRCID("IDC_YELLOWDOOR_NF2")) {
02946         sram->setDoor(YD_NF2, event.IsChecked());
02947     } else {
02948         // ensure we have the norfair map yellow door if we're here
02949         wxASSERT(event.GetId() == XRCID("IDC_YELLOWDOOR_NF_MAP"));
02950         
02951         sram->setDoor(YD_NF_MAP, event.IsChecked());
02952     }
02953 }
02954 
02955 void Frame::onZebetitesChange(wxCommandEvent &event) {
02956     // ensure we have an open SRAMFile
02957     wxASSERT(sram);
02958     
02959     sram->setZebetites(event.GetSelection());
02960 }
02961 
02962 BEGIN_EVENT_TABLE(Frame, wxFrame)
02963     EVT_CHECKBOX(XRCID("IDC_GAME_BOSS_KRAID"), Frame::onBossChange)
02964     EVT_CHECKBOX(XRCID("IDC_GAME_BOSS_PHANTOON"), Frame::onBossChange)
02965     EVT_CHECKBOX(XRCID("IDC_GAME_BOSS_DRAYGON"), Frame::onBossChange)
02966     EVT_CHECKBOX(XRCID("IDC_GAME_BOSS_RIDLEY"), Frame::onBossChange)
02967     
02968     EVT_CHECKBOX(XRCID("IDC_GAME_STATUE_KRAID"), Frame::onStatueChange)
02969     EVT_CHECKBOX(XRCID("IDC_GAME_STATUE_PHANTOON"), Frame::onStatueChange)
02970     EVT_CHECKBOX(XRCID("IDC_GAME_STATUE_DRAYGON"), Frame::onStatueChange)
02971     EVT_CHECKBOX(XRCID("IDC_GAME_STATUE_RIDLEY"), Frame::onStatueChange)
02972     
02973     EVT_CHECKBOX(XRCID("IDC_GAME_MINIBOSS_SILVERTORIZO"),
02974         Frame::onMiniBossChange)
02975     EVT_CHECKBOX(XRCID("IDC_GAME_MINIBOSS_SPORESPAWN"), Frame::onMiniBossChange)
02976     EVT_CHECKBOX(XRCID("IDC_GAME_MINIBOSS_BOTWOON"), Frame::onMiniBossChange)
02977     EVT_CHECKBOX(XRCID("IDC_GAME_MINIBOSS_CROCOMIRE"), Frame::onMiniBossChange)
02978     EVT_CHECKBOX(XRCID("IDC_GAME_MINIBOSS_GOLDENTORIZO"),
02979         Frame::onMiniBossChange)
02980         
02981     EVT_CHECKBOX(XRCID("IDC_GAME_METROIDROOM1"), Frame::onMetroidRoomChange)
02982     EVT_CHECKBOX(XRCID("IDC_GAME_METROIDROOM2"), Frame::onMetroidRoomChange)
02983     EVT_CHECKBOX(XRCID("IDC_GAME_METROIDROOM3"), Frame::onMetroidRoomChange)
02984     EVT_CHECKBOX(XRCID("IDC_GAME_METROIDROOM4"), Frame::onMetroidRoomChange)
02985         
02986     EVT_CHECKBOX(XRCID("IDC_GAME_MAP_C"), Frame::onMapChange)
02987     EVT_CHECKBOX(XRCID("IDC_GAME_MAP_BS"), Frame::onMapChange)
02988     EVT_CHECKBOX(XRCID("IDC_GAME_MAP_NF"), Frame::onMapChange)
02989     EVT_CHECKBOX(XRCID("IDC_GAME_MAP_WS"), Frame::onMapChange)
02990     EVT_CHECKBOX(XRCID("IDC_GAME_MAP_M"), Frame::onMapChange)
02991     EVT_CHECKBOX(XRCID("IDC_GAME_MAP_T"), Frame::onMapChange)
02992     
02993     EVT_CHECKBOX(XRCID("IDC_MISC_MTUBEBROKEN"), Frame::onMiscStatChange)
02994     EVT_CHECKBOX(XRCID("IDC_MISC_RESCUEDANIMALS"), Frame::onMiscStatChange)
02995     
02996     EVT_CHECKBOX(XRCID("IDC_ITEMS_MORPHINGBALL"), Frame::onItemChange)
02997     EVT_CHECKBOX(XRCID("IDC_ITEMS_BOMBS"), Frame::onItemChange)
02998     EVT_CHECKBOX(XRCID("IDC_ITEMS_SPRINGBALL"), Frame::onItemChange)
02999     EVT_CHECKBOX(XRCID("IDC_ITEMS_SCREWATTACK"), Frame::onItemChange)
03000     EVT_CHECKBOX(XRCID("IDC_ITEMS_VARIASUIT"), Frame::onItemChange)
03001     EVT_CHECKBOX(XRCID("IDC_ITEMS_GRAVITYSUIT"), Frame::onItemChange)
03002     EVT_CHECKBOX(XRCID("IDC_ITEMS_HJBOOTS"), Frame::onItemChange)
03003     EVT_CHECKBOX(XRCID("IDC_ITEMS_SPACEJUMP"), Frame::onItemChange)
03004     EVT_CHECKBOX(XRCID("IDC_ITEMS_SPEEDBOOSTER"), Frame::onItemChange)
03005     EVT_CHECKBOX(XRCID("IDC_ITEMS_CHARGEBEAM"), Frame::onItemChange)
03006     EVT_CHECKBOX(XRCID("IDC_ITEMS_ICEBEAM"), Frame::onItemChange)
03007     EVT_CHECKBOX(XRCID("IDC_ITEMS_WAVEBEAM"), Frame::onItemChange)
03008     EVT_CHECKBOX(XRCID("IDC_ITEMS_SPAZER"), Frame::onItemChange)
03009     EVT_CHECKBOX(XRCID("IDC_ITEMS_PLASMA"), Frame::onItemChange)
03010     EVT_CHECKBOX(XRCID("IDC_ITEMS_XRAYSCOPE"), Frame::onItemChange)
03011     EVT_CHECKBOX(XRCID("IDC_ITEMS_GRAPPLINGBEAM"), Frame::onItemChange)
03012     
03013     EVT_CHECKBOX(XRCID("IDC_ITEMS_MORPHINGBALL_EQUIPPED"),
03014         Frame::onItemEquippedChange)
03015     EVT_CHECKBOX(XRCID("IDC_ITEMS_BOMBS_EQUIPPED"),
03016         Frame::onItemEquippedChange)
03017     EVT_CHECKBOX(XRCID("IDC_ITEMS_SPRINGBALL_EQUIPPED"),
03018         Frame::onItemEquippedChange)
03019     EVT_CHECKBOX(XRCID("IDC_ITEMS_SCREWATTACK_EQUIPPED"),
03020         Frame::onItemEquippedChange)
03021     EVT_CHECKBOX(XRCID("IDC_ITEMS_VARIASUIT_EQUIPPED"),
03022         Frame::onItemEquippedChange)
03023     EVT_CHECKBOX(XRCID("IDC_ITEMS_GRAVITYSUIT_EQUIPPED"),
03024         Frame::onItemEquippedChange)
03025     EVT_CHECKBOX(XRCID("IDC_ITEMS_HJBOOTS_EQUIPPED"),
03026         Frame::onItemEquippedChange)
03027     EVT_CHECKBOX(XRCID("IDC_ITEMS_SPACEJUMP_EQUIPPED"),
03028         Frame::onItemEquippedChange)
03029     EVT_CHECKBOX(XRCID("IDC_ITEMS_SPEEDBOOSTER_EQUIPPED"),
03030         Frame::onItemEquippedChange)
03031     EVT_CHECKBOX(XRCID("IDC_ITEMS_CHARGEBEAM_EQUIPPED"),
03032         Frame::onItemEquippedChange)
03033     EVT_CHECKBOX(XRCID("IDC_ITEMS_ICEBEAM_EQUIPPED"),
03034         Frame::onItemEquippedChange)
03035     EVT_CHECKBOX(XRCID("IDC_ITEMS_WAVEBEAM_EQUIPPED"),
03036         Frame::onItemEquippedChange)
03037     EVT_CHECKBOX(XRCID("IDC_ITEMS_SPAZER_EQUIPPED"),
03038         Frame::onItemEquippedChange)
03039     EVT_CHECKBOX(XRCID("IDC_ITEMS_PLASMA_EQUIPPED"),
03040         Frame::onItemEquippedChange)
03041         
03042     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_C1"), Frame::onEnergyTankChange)
03043     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_C2"), Frame::onEnergyTankChange)
03044     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_BS1"), Frame::onEnergyTankChange)
03045     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_BS2"), Frame::onEnergyTankChange)
03046     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_BS3"), Frame::onEnergyTankChange)
03047     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_BS4"), Frame::onEnergyTankChange)
03048     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_BS5"), Frame::onEnergyTankChange)
03049     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_NF1"), Frame::onEnergyTankChange)
03050     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_NF2"), Frame::onEnergyTankChange)
03051     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_NF3"), Frame::onEnergyTankChange)
03052     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_NF4"), Frame::onEnergyTankChange)
03053     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_WS"), Frame::onEnergyTankChange)
03054     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_M1"), Frame::onEnergyTankChange)
03055     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_M2"), Frame::onEnergyTankChange)
03056     
03057     EVT_CHECKBOX(XRCID("IDC_ITEMS_RTANK_BS"), Frame::onReserveTankChange)
03058     EVT_CHECKBOX(XRCID("IDC_ITEMS_RTANK_NF"), Frame::onReserveTankChange)
03059     EVT_CHECKBOX(XRCID("IDC_ITEMS_RTANK_WS"), Frame::onReserveTankChange)
03060     EVT_CHECKBOX(XRCID("IDC_ITEMS_RTANK_M"), Frame::onReserveTankChange)
03061     
03062     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_C1"), Frame::onMissilePackChange)
03063     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_C2"), Frame::onMissilePackChange)
03064     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_C3"), Frame::onMissilePackChange)
03065     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_C4"), Frame::onMissilePackChange)
03066     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_C5"), Frame::onMissilePackChange)
03067     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_C6"), Frame::onMissilePackChange)
03068     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_C7"), Frame::onMissilePackChange)
03069     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_C8"), Frame::onMissilePackChange)
03070     
03071     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS1"), Frame::onMissilePackChange)
03072     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS2"), Frame::onMissilePackChange)
03073     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS3"), Frame::onMissilePackChange)
03074     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS4"), Frame::onMissilePackChange)
03075     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS5"), Frame::onMissilePackChange)
03076     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS6"), Frame::onMissilePackChange)
03077     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS7"), Frame::onMissilePackChange)
03078     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS8"), Frame::onMissilePackChange)
03079     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS9"), Frame::onMissilePackChange)
03080     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS10"), Frame::onMissilePackChange)
03081     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS11"), Frame::onMissilePackChange)
03082     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_BS12"), Frame::onMissilePackChange)
03083     
03084     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF1"), Frame::onMissilePackChange)
03085     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF2"), Frame::onMissilePackChange)
03086     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF3"), Frame::onMissilePackChange)
03087     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF4"), Frame::onMissilePackChange)
03088     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF5"), Frame::onMissilePackChange)
03089     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF6"), Frame::onMissilePackChange)
03090     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF7"), Frame::onMissilePackChange)
03091     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF8"), Frame::onMissilePackChange)
03092     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF9"), Frame::onMissilePackChange)
03093     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF10"), Frame::onMissilePackChange)
03094     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF11"), Frame::onMissilePackChange)
03095     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF12"), Frame::onMissilePackChange)
03096     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF13"), Frame::onMissilePackChange)
03097     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF14"), Frame::onMissilePackChange)
03098     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_NF15"), Frame::onMissilePackChange)
03099     
03100     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_WS1"), Frame::onMissilePackChange)
03101     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_WS2"), Frame::onMissilePackChange)
03102     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_WS3"), Frame::onMissilePackChange)
03103     
03104     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_M1"), Frame::onMissilePackChange)
03105     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_M2"), Frame::onMissilePackChange)
03106     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_M3"), Frame::onMissilePackChange)
03107     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_M4"), Frame::onMissilePackChange)
03108     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_M5"), Frame::onMissilePackChange)
03109     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_M6"), Frame::onMissilePackChange)
03110     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_M7"), Frame::onMissilePackChange)
03111     EVT_CHECKBOX(XRCID("IDC_PICKUPS_MISSILE_M8"), Frame::onMissilePackChange)
03112     
03113     EVT_CHECKBOX(XRCID("IDC_PICKUPS_SMISSILE_C"),
03114         Frame::onSuperMissilePackChange)
03115     EVT_CHECKBOX(XRCID("IDC_PICKUPS_SMISSILE_BS1"),
03116         Frame::onSuperMissilePackChange)
03117     EVT_CHECKBOX(XRCID("IDC_PICKUPS_SMISSILE_BS2"),
03118         Frame::onSuperMissilePackChange)
03119     EVT_CHECKBOX(XRCID("IDC_PICKUPS_SMISSILE_BS3"),
03120         Frame::onSuperMissilePackChange)
03121     EVT_CHECKBOX(XRCID("IDC_PICKUPS_SMISSILE_NF"),
03122         Frame::onSuperMissilePackChange)
03123     EVT_CHECKBOX(XRCID("IDC_PICKUPS_SMISSILE_WS1"),
03124         Frame::onSuperMissilePackChange)
03125     EVT_CHECKBOX(XRCID("IDC_PICKUPS_SMISSILE_WS2"),
03126         Frame::onSuperMissilePackChange)
03127     EVT_CHECKBOX(XRCID("IDC_PICKUPS_SMISSILE_M1"),
03128         Frame::onSuperMissilePackChange)
03129     EVT_CHECKBOX(XRCID("IDC_PICKUPS_SMISSILE_M2"),
03130         Frame::onSuperMissilePackChange)
03131     EVT_CHECKBOX(XRCID("IDC_PICKUPS_SMISSILE_M3"),
03132         Frame::onSuperMissilePackChange)
03133         
03134     EVT_CHECKBOX(XRCID("IDC_PICKUPS_PBOMB_C"), Frame::onPowerBombPackChange)
03135     EVT_CHECKBOX(XRCID("IDC_PICKUPS_PBOMB_BS1"), Frame::onPowerBombPackChange)
03136     EVT_CHECKBOX(XRCID("IDC_PICKUPS_PBOMB_BS2"), Frame::onPowerBombPackChange)
03137     EVT_CHECKBOX(XRCID("IDC_PICKUPS_PBOMB_BS3"), Frame::onPowerBombPackChange)
03138     EVT_CHECKBOX(XRCID("IDC_PICKUPS_PBOMB_BS4"), Frame::onPowerBombPackChange)
03139     EVT_CHECKBOX(XRCID("IDC_PICKUPS_PBOMB_BS5"), Frame::onPowerBombPackChange)
03140     EVT_CHECKBOX(XRCID("IDC_PICKUPS_PBOMB_NF1"), Frame::onPowerBombPackChange)
03141     EVT_CHECKBOX(XRCID("IDC_PICKUPS_PBOMB_NF2"), Frame::onPowerBombPackChange)
03142     EVT_CHECKBOX(XRCID("IDC_PICKUPS_PBOMB_NF3"), Frame::onPowerBombPackChange)
03143     EVT_CHECKBOX(XRCID("IDC_PICKUPS_PBOMB_M"), Frame::onPowerBombPackChange)
03144     
03145     EVT_CHECKBOX(XRCID("IDC_REDDOOR_C_MAP"), Frame::onRedDoorChange)
03146     EVT_CHECKBOX(XRCID("IDC_REDDOOR_C_BOMBS"), Frame::onRedDoorChange)
03147     EVT_CHECKBOX(XRCID("IDC_REDDOOR_C_TELEVATOR"), Frame::onRedDoorChange)
03148     EVT_CHECKBOX(XRCID("IDC_REDDOOR_BS1"), Frame::onRedDoorChange)
03149     EVT_CHECKBOX(XRCID("IDC_REDDOOR_BS2"), Frame::onRedDoorChange)
03150     EVT_CHECKBOX(XRCID("IDC_REDDOOR_BS3"), Frame::onRedDoorChange)
03151     EVT_CHECKBOX(XRCID("IDC_REDDOOR_BS4"), Frame::onRedDoorChange)
03152     EVT_CHECKBOX(XRCID("IDC_REDDOOR_BS5"), Frame::onRedDoorChange)
03153     EVT_CHECKBOX(XRCID("IDC_REDDOOR_BS6"), Frame::onRedDoorChange)
03154     EVT_CHECKBOX(XRCID("IDC_REDDOOR_BS_MAP"), Frame::onRedDoorChange)
03155     EVT_CHECKBOX(XRCID("IDC_REDDOOR_BS_RTANK"), Frame::onRedDoorChange)
03156     EVT_CHECKBOX(XRCID("IDC_REDDOOR_BS_SPORESPAWN"), Frame::onRedDoorChange)
03157     EVT_CHECKBOX(XRCID("IDC_REDDOOR_BS_XRAYSCOPE"), Frame::onRedDoorChange)
03158     EVT_CHECKBOX(XRCID("IDC_REDDOOR_NF1"), Frame::onRedDoorChange)
03159     EVT_CHECKBOX(XRCID("IDC_REDDOOR_NF2"), Frame::onRedDoorChange)
03160     EVT_CHECKBOX(XRCID("IDC_REDDOOR_NF3"), Frame::onRedDoorChange)
03161     EVT_CHECKBOX(XRCID("IDC_REDDOOR_NF4"), Frame::onRedDoorChange)
03162     EVT_CHECKBOX(XRCID("IDC_REDDOOR_NF_HJBOOTS"), Frame::onRedDoorChange)
03163     EVT_CHECKBOX(XRCID("IDC_REDDOOR_NF_SPEEDBOOSTER"), Frame::onRedDoorChange)
03164     EVT_CHECKBOX(XRCID("IDC_REDDOOR_NF_WAVEBEAM"), Frame::onRedDoorChange)
03165     EVT_CHECKBOX(XRCID("IDC_REDDOOR_WS_RTANK"), Frame::onRedDoorChange)
03166     EVT_CHECKBOX(XRCID("IDC_REDDOOR_M1"), Frame::onRedDoorChange)
03167     EVT_CHECKBOX(XRCID("IDC_REDDOOR_M2"), Frame::onRedDoorChange)
03168     EVT_CHECKBOX(XRCID("IDC_REDDOOR_M3"), Frame::onRedDoorChange)
03169     EVT_CHECKBOX(XRCID("IDC_REDDOOR_M4"), Frame::onRedDoorChange)
03170     EVT_CHECKBOX(XRCID("IDC_REDDOOR_M5"), Frame::onRedDoorChange)
03171     EVT_CHECKBOX(XRCID("IDC_REDDOOR_M6"), Frame::onRedDoorChange)
03172     EVT_CHECKBOX(XRCID("IDC_REDDOOR_M_MAP"), Frame::onRedDoorChange)
03173     EVT_CHECKBOX(XRCID("IDC_REDDOOR_T1"), Frame::onRedDoorChange)
03174     EVT_CHECKBOX(XRCID("IDC_REDDOOR_T_MB"), Frame::onRedDoorChange)
03175     
03176     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_C1"), Frame::onGreenDoorChange)
03177     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_C_WS"), Frame::onGreenDoorChange)
03178     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_BS1"), Frame::onGreenDoorChange)
03179     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_BS2"), Frame::onGreenDoorChange)
03180     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_BS3"), Frame::onGreenDoorChange)
03181     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_BS4"), Frame::onGreenDoorChange)
03182     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_BS5"), Frame::onGreenDoorChange)
03183     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_BS6"), Frame::onGreenDoorChange)
03184     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_BS7"), Frame::onGreenDoorChange)
03185     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_BS8"), Frame::onGreenDoorChange)
03186     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_BS_SPAZER"), Frame::onGreenDoorChange)
03187     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_BS_SPORESPAWNEXIT"),
03188         Frame::onGreenDoorChange)
03189     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_NF1"), Frame::onGreenDoorChange)
03190     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_NF2"), Frame::onGreenDoorChange)
03191     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_NF3"), Frame::onGreenDoorChange)
03192     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_NF4"), Frame::onGreenDoorChange)
03193     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_NF_ICEBEAM"), Frame::onGreenDoorChange)
03194     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_NF_SPEEDBOOSTER"),
03195         Frame::onGreenDoorChange)
03196     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_WS"), Frame::onGreenDoorChange)
03197     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_M1"), Frame::onGreenDoorChange)
03198     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_M2"), Frame::onGreenDoorChange)
03199     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_M3"), Frame::onGreenDoorChange)
03200     EVT_CHECKBOX(XRCID("IDC_GREENDOOR_M_DRAYGON"), Frame::onGreenDoorChange)
03201     
03202     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_C1"), Frame::onYellowDoorChange)
03203     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_C2"), Frame::onYellowDoorChange)
03204     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_C3"), Frame::onYellowDoorChange)
03205     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_C4"), Frame::onYellowDoorChange)
03206     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_C5"), Frame::onYellowDoorChange)
03207     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_C6"), Frame::onYellowDoorChange)
03208     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_BS1"), Frame::onYellowDoorChange)
03209     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_BS2"), Frame::onYellowDoorChange)
03210     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_BS3"), Frame::onYellowDoorChange)
03211     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_BS_XRAYSCOPE"),
03212         Frame::onYellowDoorChange)
03213     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_NF1"), Frame::onYellowDoorChange)
03214     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_NF2"), Frame::onYellowDoorChange)
03215     EVT_CHECKBOX(XRCID("IDC_YELLOWDOOR_NF_MAP"), Frame::onYellowDoorChange)
03216     
03217     EVT_CHECKBOX(XRCID("IDC_EYEDOOR_KRAID"), Frame::onEyeDoorChange)
03218     EVT_CHECKBOX(XRCID("IDC_EYEDOOR_PHANTOON"), Frame::onEyeDoorChange)
03219     EVT_CHECKBOX(XRCID("IDC_EYEDOOR_DRAYGON"), Frame::onEyeDoorChange)
03220     EVT_CHECKBOX(XRCID("IDC_EYEDOOR_RIDLEY"), Frame::onEyeDoorChange)
03221     EVT_CHECKBOX(XRCID("IDC_EYEDOOR_T"), Frame::onEyeDoorChange)
03222     
03223     EVT_CHECKBOX(XRCID("IDC_METALDOOR_C_BOMBSEXIT"), Frame::onMetalDoorChange)
03224     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS1"), Frame::onMetalDoorChange)
03225     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS2"), Frame::onMetalDoorChange)
03226     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS3"), Frame::onMetalDoorChange)
03227     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS4"), Frame::onMetalDoorChange)
03228     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS5"), Frame::onMetalDoorChange)
03229     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS6"), Frame::onMetalDoorChange)
03230     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS7"), Frame::onMetalDoorChange)
03231     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS8"), Frame::onMetalDoorChange)
03232     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS9"), Frame::onMetalDoorChange)
03233     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS_MAPEXIT"), Frame::onMetalDoorChange)
03234     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS_OLDTLEFT"), Frame::onMetalDoorChange)
03235     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS_OLDTRIGHT"), Frame::onMetalDoorChange)
03236     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS_MINIKRAIDLEFT"),
03237         Frame::onMetalDoorChange)
03238     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS_MINIKRAIDRIGHT"),
03239         Frame::onMetalDoorChange)
03240     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS_VARIASUIT"), Frame::onMetalDoorChange)
03241     EVT_CHECKBOX(XRCID("IDC_METALDOOR_BS_KRAIDEXIT"), Frame::onMetalDoorChange)
03242     EVT_CHECKBOX(XRCID("IDC_METALDOOR_NF_HJBOOTSEXIT"),
03243         Frame::onMetalDoorChange)
03244     EVT_CHECKBOX(XRCID("IDC_METALDOOR_NF_CROCOMIREEXIT"),
03245         Frame::onMetalDoorChange)
03246     EVT_CHECKBOX(XRCID("IDC_METALDOOR_NF_SCREWATTACK"),
03247         Frame::onMetalDoorChange)
03248     EVT_CHECKBOX(XRCID("IDC_METALDOOR_NF_GOLDSPACEPIRATES"),
03249         Frame::onMetalDoorChange)
03250     EVT_CHECKBOX(XRCID("IDC_METALDOOR_NF_RIDLEYLEFT"), Frame::onMetalDoorChange)
03251     EVT_CHECKBOX(XRCID("IDC_METALDOOR_NF_RIDLEYEXIT"), Frame::onMetalDoorChange)
03252     EVT_CHECKBOX(XRCID("IDC_METALDOOR_WS1"), Frame::onMetalDoorChange)
03253     EVT_CHECKBOX(XRCID("IDC_METALDOOR_WS2"), Frame::onMetalDoorChange)
03254     EVT_CHECKBOX(XRCID("IDC_METALDOOR_WS3"), Frame::onMetalDoorChange)
03255     EVT_CHECKBOX(XRCID("IDC_METALDOOR_WS4"), Frame::onMetalDoorChange)
03256     EVT_CHECKBOX(XRCID("IDC_METALDOOR_WS_PHANTOONEXIT"),
03257         Frame::onMetalDoorChange)
03258     EVT_CHECKBOX(XRCID("IDC_METALDOOR_M1"), Frame::onMetalDoorChange)
03259     EVT_CHECKBOX(XRCID("IDC_METALDOOR_M2"), Frame::onMetalDoorChange)
03260     EVT_CHECKBOX(XRCID("IDC_METALDOOR_M_BOTWOONEXIT"), Frame::onMetalDoorChange)
03261     EVT_CHECKBOX(XRCID("IDC_METALDOOR_M_SPACEJUMP"), Frame::onMetalDoorChange)
03262     EVT_CHECKBOX(XRCID("IDC_METALDOOR_M_DRAYGONEXIT"), Frame::onMetalDoorChange)
03263     EVT_CHECKBOX(XRCID("IDC_METALDOOR_M_PLASMA"), Frame::onMetalDoorChange)
03264     EVT_CHECKBOX(XRCID("IDC_METALDOOR_M_PLASMAEXIT"), Frame::onMetalDoorChange)
03265     EVT_CHECKBOX(XRCID("IDC_METALDOOR_T1"), Frame::onMetalDoorChange)
03266     EVT_CHECKBOX(XRCID("IDC_METALDOOR_T2"), Frame::onMetalDoorChange)
03267     EVT_CHECKBOX(XRCID("IDC_METALDOOR_T3"), Frame::onMetalDoorChange)
03268     EVT_CHECKBOX(XRCID("IDC_METALDOOR_T4"), Frame::onMetalDoorChange)
03269     EVT_CHECKBOX(XRCID("IDC_METALDOOR_T5"), Frame::onMetalDoorChange)
03270     
03271     EVT_CHOICE(XRCID("IDC_MISC_DASH"), Frame::onControllerChange)
03272     EVT_CHOICE(XRCID("IDC_MISC_JUMP"), Frame::onControllerChange)
03273     EVT_CHOICE(XRCID("IDC_MISC_ITEMCANCEL"), Frame::onControllerChange)
03274     EVT_CHOICE(XRCID("IDC_MISC_SHOT"), Frame::onControllerChange)
03275     EVT_CHOICE(XRCID("IDC_MISC_ANGLEUP"), Frame::onControllerChange)
03276     EVT_CHOICE(XRCID("IDC_MISC_ANGLEDOWN"), Frame::onControllerChange)
03277     EVT_CHOICE(XRCID("IDC_MISC_ITEMSELECT"), Frame::onControllerChange)
03278 
03279     EVT_CLOSE(Frame::onWindowClosing)
03280     
03281     EVT_MENU(wxID_OPEN, Frame::onFileOpen)
03282     EVT_MENU(wxID_CLOSE, Frame::onFileClose)
03283     EVT_MENU(wxID_SAVE, Frame::onFileSave)
03284     EVT_MENU(wxID_SAVEAS, Frame::onFileSaveAs)
03285     EVT_MENU(wxID_EXIT, Frame::onFileExit)
03286     
03287     EVT_MENU(XRCID("IDM_GAME_GAMEA"), Frame::onGame)
03288     EVT_MENU(XRCID("IDM_GAME_GAMEB"), Frame::onGame)
03289     EVT_MENU(XRCID("IDM_GAME_GAMEC"), Frame::onGame)
03290     
03291     EVT_MENU(XRCID("IDM_GAME_ENDING1"), Frame::onGameEnding)
03292     EVT_MENU(XRCID("IDM_GAME_ENDING2"), Frame::onGameEnding)
03293     EVT_MENU(XRCID("IDM_GAME_ENDING3"), Frame::onGameEnding)
03294     
03295     EVT_MENU(XRCID("IDM_GAME_GIVE_EVERYTHING"), Frame::onGameGiveEverything)
03296     
03297     EVT_MENU(XRCID("IDM_GAME_GIVE_ENERGY"), Frame::onGameGiveEnergy)
03298     EVT_MENU(XRCID("IDM_GAME_GIVE_INVENTORY"), Frame::onGameGiveInventory)
03299     
03300     EVT_MENU(XRCID("IDM_GAME_GIVE_BOSSES"), Frame::onGameGiveBosses)
03301     EVT_MENU(XRCID("IDM_GAME_GIVE_MINIBOSSES"), Frame::onGameGiveMiniBosses)
03302     EVT_MENU(XRCID("IDM_GAME_GIVE_METROIDROOMS"), Frame::onGameGiveMetroidRooms)
03303     EVT_MENU(XRCID("IDM_GAME_GIVE_ZEBETITES"), Frame::onGameGiveZebetites)
03304     
03305     EVT_MENU(XRCID("IDM_GAME_GIVE_MAPS"), Frame::onGameGiveMaps)
03306     
03307     EVT_MENU(XRCID("IDM_GAME_GIVE_ITEMS"), Frame::onGameGiveItems)
03308     
03309     EVT_MENU(XRCID("IDM_GAME_GIVE_MISSILES"), Frame::onGameGiveMissilePacks)
03310     EVT_MENU(XRCID("IDM_GAME_GIVE_SMISSILES"),
03311         Frame::onGameGiveSuperMissilePacks)
03312     EVT_MENU(XRCID("IDM_GAME_GIVE_PBOMBS"), Frame::onGameGivePowerBombPacks)
03313     
03314     EVT_MENU(XRCID("IDM_GAME_GIVE_ETANKS"), Frame::onGameGiveEnergyTanks)
03315     EVT_MENU(XRCID("IDM_GAME_GIVE_RTANKS"), Frame::onGameGiveReserveTanks)
03316     
03317     EVT_MENU(XRCID("IDM_GAME_GIVE_REDDOORS"), Frame::onGameGiveRedDoors)
03318     EVT_MENU(XRCID("IDM_GAME_GIVE_GREENDOORS"), Frame::onGameGiveGreenDoors)
03319     EVT_MENU(XRCID("IDM_GAME_GIVE_YELLOWDOORS"), Frame::onGameGiveYellowDoors)
03320     EVT_MENU(XRCID("IDM_GAME_GIVE_EYEDOORS"), Frame::onGameGiveEyeDoors)
03321     EVT_MENU(XRCID("IDM_GAME_GIVE_METALDOORS"), Frame::onGameGiveMetalDoors)
03322     
03323     EVT_MENU(XRCID("IDM_GAME_COPYAB"), Frame::onGameCopy)
03324     EVT_MENU(XRCID("IDM_GAME_COPYAC"), Frame::onGameCopy)
03325     EVT_MENU(XRCID("IDM_GAME_COPYBA"), Frame::onGameCopy)
03326     EVT_MENU(XRCID("IDM_GAME_COPYBC"), Frame::onGameCopy)
03327     EVT_MENU(XRCID("IDM_GAME_COPYCA"), Frame::onGameCopy)
03328     EVT_MENU(XRCID("IDM_GAME_COPYCB"), Frame::onGameCopy)
03329     
03330     EVT_MENU(XRCID("IDM_GAME_CLEARA"), Frame::onGameClear)
03331     EVT_MENU(XRCID("IDM_GAME_CLEARB"), Frame::onGameClear)
03332     EVT_MENU(XRCID("IDM_GAME_CLEARC"), Frame::onGameClear)
03333     
03334     EVT_MENU(wxID_ABOUT, Frame::onHelpAbout)
03335     
03336     EVT_RADIOBOX(XRCID("IDRB_GAME_ZEBETITES"), Frame::onZebetitesChange)
03337     EVT_RADIOBOX(XRCID("IDRB_GAME_SAVEAREA"), Frame::onSaveAreaChange)
03338     
03339     EVT_RADIOBOX(XRCID("IDRB_MISC_LANGUAGE"), Frame::onMiscConfigChange)
03340     EVT_RADIOBOX(XRCID("IDRB_MISC_MOONWALK"), Frame::onMiscConfigChange)
03341     EVT_RADIOBOX(XRCID("IDRB_MISC_ICONCANCEL"), Frame::onMiscConfigChange)
03342     
03343     EVT_RADIOBUTTON(XRCID("IDR_GAME_SP1"), Frame::onSavePointChange)
03344     EVT_RADIOBUTTON(XRCID("IDR_GAME_SP2"), Frame::onSavePointChange)
03345     EVT_RADIOBUTTON(XRCID("IDR_GAME_SP3"), Frame::onSavePointChange)
03346     EVT_RADIOBUTTON(XRCID("IDR_GAME_SP4"), Frame::onSavePointChange)
03347     EVT_RADIOBUTTON(XRCID("IDR_GAME_SP5"), Frame::onSavePointChange)
03348     EVT_RADIOBUTTON(XRCID("IDR_GAME_SP6"), Frame::onSavePointChange)
03349     
03350     EVT_SPIN(XRCID("IDSB_GAME_MISSILES"), Frame::onMissilesSpinner)
03351     EVT_SPIN(XRCID("IDSB_GAME_SMISSILES"), Frame::onSuperMissilesSpinner)
03352     EVT_SPIN(XRCID("IDSB_GAME_PBOMBS"), Frame::onPowerBombsSpinner)
03353     
03354     EVT_TEXT(XRCID("IDT_GAME_ENERGY"), Frame::onEnergyChange)
03355     EVT_TEXT(XRCID("IDT_GAME_RESERVE"), Frame::onEnergyChange)
03356     
03357     EVT_TEXT(XRCID("IDT_GAME_MISSILES"), Frame::onMissilesChange)
03358     EVT_TEXT(XRCID("IDT_GAME_SMISSILES"), Frame::onSuperMissilesChange)
03359     EVT_TEXT(XRCID("IDT_GAME_PBOMBS"), Frame::onPowerBombsChange)
03360     
03361     EVT_TEXT(XRCID("IDT_MISC_GAMETIME"), Frame::onGameTimeChange)
03362     
03363     EVT_TIMER(ID_SBTIMER, Frame::onStatusBarTimer)
03364     
03365     EVT_UPDATE_UI(wxID_CLOSE, Frame::onFileCloseUpdate)
03366     EVT_UPDATE_UI(wxID_SAVE, Frame::onFileSaveUpdate)
03367     EVT_UPDATE_UI(wxID_SAVEAS, Frame::onFileSaveUpdate)
03368     
03369     EVT_UPDATE_UI(XRCID("IDM_GAME_GAMEA"), Frame::onGameUpdate)
03370     EVT_UPDATE_UI(XRCID("IDM_GAME_GAMEB"), Frame::onGameUpdate)
03371     EVT_UPDATE_UI(XRCID("IDM_GAME_GAMEC"), Frame::onGameUpdate)
03372     
03373     EVT_UPDATE_UI(XRCID("IDM_GAME_ENDING"), Frame::onGameEndingUpdate)
03374     EVT_UPDATE_UI(XRCID("IDM_GAME_GIVE"), Frame::onGameGiveUpdate)
03375     
03376     EVT_UPDATE_UI(XRCID("IDM_GAME_COPY"), Frame::onGameCopyUpdate)
03377     EVT_UPDATE_UI(XRCID("IDM_GAME_COPYA"), Frame::onGameCopyUpdate)
03378     EVT_UPDATE_UI(XRCID("IDM_GAME_COPYB"), Frame::onGameCopyUpdate)
03379     EVT_UPDATE_UI(XRCID("IDM_GAME_COPYC"), Frame::onGameCopyUpdate)
03380     
03381     EVT_UPDATE_UI(XRCID("IDM_GAME_CLEAR"), Frame::onGameClearUpdate)
03382     EVT_UPDATE_UI(XRCID("IDM_GAME_CLEARA"), Frame::onGameClearUpdate)
03383     EVT_UPDATE_UI(XRCID("IDM_GAME_CLEARB"), Frame::onGameClearUpdate)
03384     EVT_UPDATE_UI(XRCID("IDM_GAME_CLEARC"), Frame::onGameClearUpdate)
03385     
03386     EVT_UPDATE_UI(XRCID("IDN_SMSE"), Frame::onNotebookUpdate)
03387     
03388     EVT_UPDATE_UI(XRCID("IDC_GAME_STATUE_KRAID"), Frame::onStatueUpdate)
03389     EVT_UPDATE_UI(XRCID("IDC_GAME_STATUE_PHANTOON"), Frame::onStatueUpdate)
03390     EVT_UPDATE_UI(XRCID("IDC_GAME_STATUE_DRAYGON"), Frame::onStatueUpdate)
03391     EVT_UPDATE_UI(XRCID("IDC_GAME_STATUE_RIDLEY"), Frame::onStatueUpdate)
03392     
03393     EVT_UPDATE_UI(XRCID("IDR_GAME_SP1"), Frame::onSavePointUpdate)
03394     EVT_UPDATE_UI(XRCID("IDR_GAME_SP2"), Frame::onSavePointUpdate)
03395     EVT_UPDATE_UI(XRCID("IDR_GAME_SP3"), Frame::onSavePointUpdate)
03396     EVT_UPDATE_UI(XRCID("IDR_GAME_SP4"), Frame::onSavePointUpdate)
03397     EVT_UPDATE_UI(XRCID("IDR_GAME_SP5"), Frame::onSavePointUpdate)
03398     EVT_UPDATE_UI(XRCID("IDR_GAME_SP6"), Frame::onSavePointUpdate)
03399     
03400     EVT_UPDATE_UI(XRCID("IDC_ITEMS_MORPHINGBALL_EQUIPPED"),
03401         Frame::onItemEquippedUpdate)
03402     EVT_UPDATE_UI(XRCID("IDC_ITEMS_BOMBS_EQUIPPED"),
03403         Frame::onItemEquippedUpdate)
03404     EVT_UPDATE_UI(XRCID("IDC_ITEMS_SPRINGBALL_EQUIPPED"),
03405         Frame::onItemEquippedUpdate)
03406     EVT_UPDATE_UI(XRCID("IDC_ITEMS_SCREWATTACK_EQUIPPED"),
03407         Frame::onItemEquippedUpdate)
03408     EVT_UPDATE_UI(XRCID("IDC_ITEMS_VARIASUIT_EQUIPPED"),
03409         Frame::onItemEquippedUpdate)
03410     EVT_UPDATE_UI(XRCID("IDC_ITEMS_GRAVITYSUIT_EQUIPPED"),
03411         Frame::onItemEquippedUpdate)
03412     EVT_UPDATE_UI(XRCID("IDC_ITEMS_HJBOOTS_EQUIPPED"),
03413         Frame::onItemEquippedUpdate)
03414     EVT_UPDATE_UI(XRCID("IDC_ITEMS_SPACEJUMP_EQUIPPED"),
03415         Frame::onItemEquippedUpdate)
03416     EVT_UPDATE_UI(XRCID("IDC_ITEMS_SPEEDBOOSTER_EQUIPPED"),
03417         Frame::onItemEquippedUpdate)
03418     EVT_UPDATE_UI(XRCID("IDC_ITEMS_CHARGEBEAM_EQUIPPED"),
03419         Frame::onItemEquippedUpdate)
03420     EVT_UPDATE_UI(XRCID("IDC_ITEMS_ICEBEAM_EQUIPPED"),
03421         Frame::onItemEquippedUpdate)
03422     EVT_UPDATE_UI(XRCID("IDC_ITEMS_WAVEBEAM_EQUIPPED"),
03423         Frame::onItemEquippedUpdate)
03424     EVT_UPDATE_UI(XRCID("IDC_ITEMS_SPAZER_EQUIPPED"),
03425         Frame::onItemEquippedUpdate)
03426     EVT_UPDATE_UI(XRCID("IDC_ITEMS_PLASMA_EQUIPPED"),
03427         Frame::onItemEquippedUpdate)
03428 END_EVENT_TABLE()
03429 
03430 IMPLEMENT_CLASS(Frame, wxFrame)
03431 

Generated on Mon Dec 29 01:15:54 2008 for Super Metroid SRAM Editor by  doxygen 1.5.4