Main Page | Namespace List | Class List | Directories | File List | Namespace Members | Class Members | File Members

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

Generated on Thu Oct 13 02:25:02 2005 for Super Metroid SRAM Editor by  doxygen 1.4.2