Frame.cc

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

Generated on Thu Feb 22 21:33:27 2007 for Super Metroid SRAM Editor by  doxygen 1.5.1-p1