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

MPGFrame.cc

Go to the documentation of this file.
00001 /*
00002  * Metroid Password Generator
00003  * Copyright (C) 2005 emuWorks
00004  * http://games.technoplaza.net/
00005  *
00006  * This file is part of Metroid Password Generator.
00007  *
00008  * Metroid Password Generator 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  * Metroid Password Generator 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 Metroid Password Generator; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00021  */
00022  
00023 // $Id: MPGFrame.cc,v 1.35 2005/09/30 06:52:41 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/xrc/xmlres.h>
00036 
00037 #include "AppConstants.hh"
00038 #include "exceptions/InvalidPasswordException.hh"
00039 #include "res/icon32x32.xpm"
00040 #include "view/MPGFrame.hh"
00041 #include "view/PasswordPanel.hh"
00042 
00043 using namespace mpg;
00044 
00045 BEGIN_EVENT_TABLE(MPGFrame, wxFrame)
00046     EVT_BUTTON(XRCID("IDB_CHECKSUM"), MPGFrame::onFixChecksum)
00047 
00048     EVT_CHECKBOX(XRCID("IDC_ITEMS_MARUMARI"), MPGFrame::onItemChanged)
00049     EVT_CHECKBOX(XRCID("IDC_ITEMS_LONGBEAM"), MPGFrame::onItemChanged)
00050     EVT_CHECKBOX(XRCID("IDC_ITEMS_WAVEBEAM"), MPGFrame::onItemChanged)
00051     EVT_CHECKBOX(XRCID("IDC_ITEMS_ICEBEAM"), MPGFrame::onItemChanged)
00052     EVT_CHECKBOX(XRCID("IDC_ITEMS_BOMBS"), MPGFrame::onItemChanged)
00053     EVT_CHECKBOX(XRCID("IDC_ITEMS_HIGHJUMPBOOTS"), MPGFrame::onItemChanged)
00054     EVT_CHECKBOX(XRCID("IDC_ITEMS_SCREWATTACK"), MPGFrame::onItemChanged)
00055     EVT_CHECKBOX(XRCID("IDC_ITEMS_VARIA"), MPGFrame::onItemChanged)
00056     
00057     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_BS1"), MPGFrame::onMissileContainerChanged)
00058     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_BS2"), MPGFrame::onMissileContainerChanged)
00059     
00060     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_KL1"), MPGFrame::onMissileContainerChanged)
00061     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_KL2"), MPGFrame::onMissileContainerChanged)
00062     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_KL3"), MPGFrame::onMissileContainerChanged)
00063     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_KL4"), MPGFrame::onMissileContainerChanged)
00064     
00065     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF1"), MPGFrame::onMissileContainerChanged)
00066     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF2"), MPGFrame::onMissileContainerChanged)
00067     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF3"), MPGFrame::onMissileContainerChanged)
00068     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF4"), MPGFrame::onMissileContainerChanged)
00069     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF5"), MPGFrame::onMissileContainerChanged)
00070     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF6"), MPGFrame::onMissileContainerChanged)
00071     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF7"), MPGFrame::onMissileContainerChanged)
00072     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF8"), MPGFrame::onMissileContainerChanged)
00073     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF9"), MPGFrame::onMissileContainerChanged)
00074     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF10"), 
00075                  MPGFrame::onMissileContainerChanged)
00076     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF11"),
00077                  MPGFrame::onMissileContainerChanged)
00078     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_NF12"),
00079                  MPGFrame::onMissileContainerChanged)
00080     
00081     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_RL1"), MPGFrame::onMissileContainerChanged)
00082     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_RL2"), MPGFrame::onMissileContainerChanged)
00083     EVT_CHECKBOX(XRCID("IDC_ITEMS_MC_RL3"), MPGFrame::onMissileContainerChanged)
00084     
00085     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_BS1"), MPGFrame::onEnergyTankChanged)
00086     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_BS2"), MPGFrame::onEnergyTankChanged)
00087     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_BS3"), MPGFrame::onEnergyTankChanged)
00088     
00089     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_NF"), MPGFrame::onEnergyTankChanged)
00090     
00091     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_KL"), MPGFrame::onEnergyTankChanged)
00092     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_KL_KRAID"), MPGFrame::onEnergyTankChanged)
00093     
00094     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_RL"), MPGFrame::onEnergyTankChanged)
00095     EVT_CHECKBOX(XRCID("IDC_ITEMS_ET_RL_RIDLEY"), MPGFrame::onEnergyTankChanged)
00096     
00097     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_BS_LONGBEAM"), MPGFrame::onDoorChanged)
00098     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_BS_TOURIANBRIDGE"),
00099                  MPGFrame::onDoorChanged)
00100     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_BS_BOMBS"), MPGFrame::onDoorChanged)
00101     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_BS_ICEBEAM"), MPGFrame::onDoorChanged)
00102     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_BS_VARIA"), MPGFrame::onDoorChanged)
00103     
00104     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_KL1"), MPGFrame::onDoorChanged)
00105     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_KL2"), MPGFrame::onDoorChanged)
00106     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_KL3"), MPGFrame::onDoorChanged)
00107     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_KL4"), MPGFrame::onDoorChanged)
00108     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_KL_KRAID"), MPGFrame::onDoorChanged)
00109     
00110     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_NF_HIGHJUMPBOOTS"),
00111                  MPGFrame::onDoorChanged)
00112     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_NF_SCREWATTACK"),
00113                  MPGFrame::onDoorChanged)
00114     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_NF_WAVEBEAM"), MPGFrame::onDoorChanged)
00115     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_NF_ICEBEAM"), MPGFrame::onDoorChanged)
00116     
00117     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_RL"), MPGFrame::onDoorChanged)
00118     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_RL_RIDLEY"), MPGFrame::onDoorChanged)
00119     
00120     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_T1"), MPGFrame::onDoorChanged)
00121     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_T2"), MPGFrame::onDoorChanged)
00122     EVT_CHECKBOX(XRCID("IDC_MISC_DOORS_T3"), MPGFrame::onDoorChanged)
00123     
00124     EVT_CHECKBOX(XRCID("IDC_MISC_STATUE_KRAID"), MPGFrame::onStatueChanged)
00125     EVT_CHECKBOX(XRCID("IDC_MISC_STATUE_RIDLEY"), MPGFrame::onStatueChanged)
00126     
00127     EVT_CHECKBOX(XRCID("IDC_MISC_ZEBETITE1"), MPGFrame::onZebetiteChanged)
00128     EVT_CHECKBOX(XRCID("IDC_MISC_ZEBETITE2"), MPGFrame::onZebetiteChanged)
00129     EVT_CHECKBOX(XRCID("IDC_MISC_ZEBETITE3"), MPGFrame::onZebetiteChanged)
00130     EVT_CHECKBOX(XRCID("IDC_MISC_ZEBETITE4"), MPGFrame::onZebetiteChanged)
00131     EVT_CHECKBOX(XRCID("IDC_MISC_ZEBETITE5"), MPGFrame::onZebetiteChanged)
00132     
00133     EVT_CHECKBOX(XRCID("IDC_MISC_BOSS_KRAID"), MPGFrame::onBossChanged)
00134     EVT_CHECKBOX(XRCID("IDC_MISC_BOSS_RIDLEY"), MPGFrame::onBossChanged)
00135     EVT_CHECKBOX(XRCID("IDC_MISC_BOSS_MOTHERBRAIN"), MPGFrame::onBossChanged)
00136     
00137     EVT_CHECKLISTBOX(XRCID("IDCLB_RAW_BITS"), MPGFrame::onRawBitChanged)
00138     
00139     EVT_MENU(wxID_EXIT, MPGFrame::onFileExit)
00140     
00141     EVT_MENU(XRCID("IDM_PASSWORD_PERFECTGAME"),
00142         MPGFrame::onPasswordPerfectGame)
00143     EVT_MENU(XRCID("IDM_PASSWORD_DEBUGPASSWORD"),
00144         MPGFrame::onPasswordDebugPassword)
00145     EVT_MENU(XRCID("IDM_PASSWORD_RESET"), MPGFrame::onPasswordReset)
00146     
00147     EVT_MENU(XRCID("IDM_PASSWORD_ENDING1"), MPGFrame::onPasswordEnding)
00148     EVT_MENU(XRCID("IDM_PASSWORD_ENDING2"), MPGFrame::onPasswordEnding)
00149     EVT_MENU(XRCID("IDM_PASSWORD_ENDING3"), MPGFrame::onPasswordEnding)
00150     EVT_MENU(XRCID("IDM_PASSWORD_ENDING4"), MPGFrame::onPasswordEnding)
00151     EVT_MENU(XRCID("IDM_PASSWORD_ENDING5"), MPGFrame::onPasswordEnding)
00152     
00153     EVT_MENU(XRCID("IDM_PASSWORD_GIVE_MISSILES"),
00154         MPGFrame::onPasswordGiveMissiles)
00155     EVT_MENU(XRCID("IDM_PASSWORD_GIVE_ITEMS"), MPGFrame::onPasswordGiveItems)
00156     EVT_MENU(XRCID("IDM_PASSWORD_GIVE_MC"),
00157         MPGFrame::onPasswordGiveMissileContainers)
00158     EVT_MENU(XRCID("IDM_PASSWORD_GIVE_ET"),
00159         MPGFrame::onPasswordGiveEnergyTanks)
00160     EVT_MENU(XRCID("IDM_PASSWORD_GIVE_DOORS"), MPGFrame::onPasswordGiveDoors)
00161     EVT_MENU(XRCID("IDM_PASSWORD_GIVE_STATUES"),
00162         MPGFrame::onPasswordGiveStatues)
00163     EVT_MENU(XRCID("IDM_PASSWORD_GIVE_ZEBETITES"),
00164         MPGFrame::onPasswordGiveZebetites)
00165     EVT_MENU(XRCID("IDM_PASSWORD_GIVE_BOSSES"), MPGFrame::onPasswordGiveBosses)
00166     
00167     EVT_MENU(XRCID("IDM_GAME_NTSC"), MPGFrame::onGameSystem)
00168     EVT_MENU(XRCID("IDM_GAME_PAL"), MPGFrame::onGameSystem)
00169     
00170     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT1"), MPGFrame::onChecksumShift)
00171     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT2"), MPGFrame::onChecksumShift)
00172     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT3"), MPGFrame::onChecksumShift)
00173     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT4"), MPGFrame::onChecksumShift)
00174     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT5"), MPGFrame::onChecksumShift)
00175     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT6"), MPGFrame::onChecksumShift)
00176     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT7"), MPGFrame::onChecksumShift)
00177     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT8"), MPGFrame::onChecksumShift)
00178     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT9"), MPGFrame::onChecksumShift)
00179     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT10"), MPGFrame::onChecksumShift)
00180     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT11"), MPGFrame::onChecksumShift)
00181     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT12"), MPGFrame::onChecksumShift)
00182     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT13"), MPGFrame::onChecksumShift)
00183     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT14"), MPGFrame::onChecksumShift)
00184     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT15"), MPGFrame::onChecksumShift)
00185     EVT_MENU(XRCID("IDM_PASSWORD_SHIFT16"), MPGFrame::onChecksumShift)
00186     
00187     EVT_MENU(wxID_ABOUT, MPGFrame::onHelpAbout)
00188     
00189     EVT_RADIOBOX(XRCID("IDRB_MISC_START"), MPGFrame::onStartLocationChanged)
00190     EVT_RADIOBOX(XRCID("IDRB_MISC_ARMOR"), MPGFrame::onArmorChanged)
00191     
00192     EVT_TEXT(XRCID("IDSC_ITEMS_MISSILES"), MPGFrame::onMissilesTextChanged)
00193     EVT_TEXT(XRCID("IDT_MISC_GAMETIME"), MPGFrame::onGameTimeChanged)
00194     EVT_TEXT(XRCID("IDSC_RAW_SHIFT"), MPGFrame::onShiftTextChanged)
00195     EVT_TEXT(XRCID("IDT_PASSWORD"), MPGFrame::onPasswordChanged)
00196 END_EVENT_TABLE()
00197 
00198 MPGFrame::MPGFrame() : fixChecksumButton(NULL),
00199                        ignoreTextEvent(true),
00200                        pal(false) {
00201     SetParent(NULL);
00202     
00203     CreateControls();
00204     GetSizer()->SetSizeHints(this);
00205     Centre();
00206 }
00207 
00208 void MPGFrame::CreateControls() {
00209     wxXmlResource::Get()->LoadFrame(this, GetParent(), wxT("IDF_MPG"));
00210     SetIcon(wxIcon(icon32x32_xpm));
00211     
00212     wxTextCtrl *ctrl = XRCCTRL(*this, "IDT_PASSWORD", wxTextCtrl);
00213     ctrl->SetMaxLength(27);
00214     ctrl->SetValue(wxT("000000000000000000000000"));
00215     
00216     XRCCTRL(*this, "IDP_PASSWORD", PasswordPanel)->setPassword(&password);
00217     
00218     wxTextCtrl *gameTime = XRCCTRL(*this, "IDT_MISC_GAMETIME", wxTextCtrl);
00219     gameTime->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
00220     gameTime->SetMaxLength(10);
00221     
00222     fixChecksumButton = XRCCTRL(*this, "IDB_CHECKSUM", wxButton);
00223     
00224     updateTextCtrlSizes();
00225     
00226     ignoreTextEvent = false;
00227 }
00228 
00229 void MPGFrame::updateControls() {
00230     // update the item controls
00231     XRCCTRL(*this, "IDC_ITEMS_MARUMARI",
00232             wxCheckBox)->SetValue(password.getBit(MARUMARI) &&
00233                                   password.getBit(MARUMARI_TAKEN));
00234     XRCCTRL(*this, "IDC_ITEMS_LONGBEAM",
00235             wxCheckBox)->SetValue(password.getBit(LONGBEAM));
00236     XRCCTRL(*this, "IDC_ITEMS_WAVEBEAM",
00237             wxCheckBox)->SetValue(password.getBit(WAVEBEAM));
00238     XRCCTRL(*this, "IDC_ITEMS_ICEBEAM",
00239             wxCheckBox)->SetValue(password.getBit(ICEBEAM));
00240     XRCCTRL(*this, "IDC_ITEMS_BOMBS",
00241             wxCheckBox)->SetValue(password.getBit(BOMBS) &&
00242                                   password.getBit(BOMBS_TAKEN));
00243     XRCCTRL(*this, "IDC_ITEMS_HIGHJUMPBOOTS",
00244             wxCheckBox)->SetValue(password.getBit(HIGHJUMPBOOTS) &&
00245                                   password.getBit(HIGHJUMPBOOTS_TAKEN));
00246     XRCCTRL(*this, "IDC_ITEMS_SCREWATTACK",
00247             wxCheckBox)->SetValue(password.getBit(SCREWATTACK) &&
00248                                   password.getBit(SCREWATTACK_TAKEN));
00249     XRCCTRL(*this, "IDC_ITEMS_VARIA",
00250             wxCheckBox)->SetValue(password.getBit(VARIA) &&
00251                                   password.getBit(VARIA_TAKEN));
00252     
00253     // update the missile container controls
00254     XRCCTRL(*this, "IDC_ITEMS_MC_BS1",
00255             wxCheckBox)->SetValue(password.getBit(MISSILE_BS1));
00256     XRCCTRL(*this, "IDC_ITEMS_MC_BS2",
00257             wxCheckBox)->SetValue(password.getBit(MISSILE_BS2));
00258     
00259     XRCCTRL(*this, "IDC_ITEMS_MC_KL1",
00260             wxCheckBox)->SetValue(password.getBit(MISSILE_KL1));
00261     XRCCTRL(*this, "IDC_ITEMS_MC_KL2",
00262             wxCheckBox)->SetValue(password.getBit(MISSILE_KL2));
00263     XRCCTRL(*this, "IDC_ITEMS_MC_KL3",
00264             wxCheckBox)->SetValue(password.getBit(MISSILE_KL3));
00265     XRCCTRL(*this, "IDC_ITEMS_MC_KL4",
00266             wxCheckBox)->SetValue(password.getBit(MISSILE_KL4));
00267     
00268     XRCCTRL(*this, "IDC_ITEMS_MC_NF1",
00269             wxCheckBox)->SetValue(password.getBit(MISSILE_NF1));
00270     XRCCTRL(*this, "IDC_ITEMS_MC_NF2",
00271             wxCheckBox)->SetValue(password.getBit(MISSILE_NF2));
00272     XRCCTRL(*this, "IDC_ITEMS_MC_NF3",
00273             wxCheckBox)->SetValue(password.getBit(MISSILE_NF3));
00274     XRCCTRL(*this, "IDC_ITEMS_MC_NF4",
00275             wxCheckBox)->SetValue(password.getBit(MISSILE_NF4));
00276     XRCCTRL(*this, "IDC_ITEMS_MC_NF5",
00277             wxCheckBox)->SetValue(password.getBit(MISSILE_NF5));
00278     XRCCTRL(*this, "IDC_ITEMS_MC_NF6",
00279             wxCheckBox)->SetValue(password.getBit(MISSILE_NF6));
00280     XRCCTRL(*this, "IDC_ITEMS_MC_NF7",
00281             wxCheckBox)->SetValue(password.getBit(MISSILE_NF7));
00282     XRCCTRL(*this, "IDC_ITEMS_MC_NF8",
00283             wxCheckBox)->SetValue(password.getBit(MISSILE_NF8));
00284     XRCCTRL(*this, "IDC_ITEMS_MC_NF9",
00285             wxCheckBox)->SetValue(password.getBit(MISSILE_NF9));
00286     XRCCTRL(*this, "IDC_ITEMS_MC_NF10",
00287             wxCheckBox)->SetValue(password.getBit(MISSILE_NF10));
00288     XRCCTRL(*this, "IDC_ITEMS_MC_NF11",
00289             wxCheckBox)->SetValue(password.getBit(MISSILE_NF11));
00290     XRCCTRL(*this, "IDC_ITEMS_MC_NF12",
00291             wxCheckBox)->SetValue(password.getBit(MISSILE_NF12));
00292     
00293     XRCCTRL(*this, "IDC_ITEMS_MC_RL1",
00294             wxCheckBox)->SetValue(password.getBit(MISSILE_RL1));
00295     XRCCTRL(*this, "IDC_ITEMS_MC_RL2",
00296             wxCheckBox)->SetValue(password.getBit(MISSILE_RL2));
00297     XRCCTRL(*this, "IDC_ITEMS_MC_RL3",
00298             wxCheckBox)->SetValue(password.getBit(MISSILE_RL3));
00299     
00300     // update the energy tank controls
00301     XRCCTRL(*this, "IDC_ITEMS_ET_BS1",
00302             wxCheckBox)->SetValue(password.getBit(ENERGYTANK_BS1));
00303     XRCCTRL(*this, "IDC_ITEMS_ET_BS2",
00304             wxCheckBox)->SetValue(password.getBit(ENERGYTANK_BS2));
00305     XRCCTRL(*this, "IDC_ITEMS_ET_BS3",
00306             wxCheckBox)->SetValue(password.getBit(ENERGYTANK_BS3));
00307     
00308     XRCCTRL(*this, "IDC_ITEMS_ET_NF",
00309             wxCheckBox)->SetValue(password.getBit(ENERGYTANK_NF));
00310     
00311     XRCCTRL(*this, "IDC_ITEMS_ET_KL",
00312             wxCheckBox)->SetValue(password.getBit(ENERGYTANK_KL));
00313     XRCCTRL(*this, "IDC_ITEMS_ET_KL_KRAID",
00314             wxCheckBox)->SetValue(password.getBit(ENERGYTANK_KL_KRAID));
00315     
00316     XRCCTRL(*this, "IDC_ITEMS_ET_RL",
00317             wxCheckBox)->SetValue(password.getBit(ENERGYTANK_RL));
00318     XRCCTRL(*this, "IDC_ITEMS_ET_RL_RIDLEY",
00319             wxCheckBox)->SetValue(password.getBit(ENERGYTANK_RL_RIDLEY));
00320     
00321     // update the red & yellow door controls
00322     XRCCTRL(*this, "IDC_MISC_DOORS_BS_LONGBEAM",
00323             wxCheckBox)->SetValue(password.getBit(REDDOOR_BS_LONGBEAM));
00324     XRCCTRL(*this, "IDC_MISC_DOORS_BS_TOURIANBRIDGE",
00325             wxCheckBox)->SetValue(password.getBit(REDDOOR_BS_TOURIANBRIDGE));
00326     XRCCTRL(*this, "IDC_MISC_DOORS_BS_BOMBS",
00327             wxCheckBox)->SetValue(password.getBit(REDDOOR_BS_BOMBS));
00328     XRCCTRL(*this, "IDC_MISC_DOORS_BS_ICEBEAM",
00329             wxCheckBox)->SetValue(password.getBit(REDDOOR_BS_ICEBEAM));
00330     XRCCTRL(*this, "IDC_MISC_DOORS_BS_VARIA",
00331             wxCheckBox)->SetValue(password.getBit(REDDOOR_BS_VARIA));
00332     
00333     XRCCTRL(*this, "IDC_MISC_DOORS_KL1",
00334             wxCheckBox)->SetValue(password.getBit(REDDOOR_KL1));
00335     XRCCTRL(*this, "IDC_MISC_DOORS_KL2",
00336             wxCheckBox)->SetValue(password.getBit(REDDOOR_KL2));
00337     XRCCTRL(*this, "IDC_MISC_DOORS_KL3",
00338             wxCheckBox)->SetValue(password.getBit(REDDOOR_KL3));
00339     XRCCTRL(*this, "IDC_MISC_DOORS_KL4",
00340             wxCheckBox)->SetValue(password.getBit(REDDOOR_KL4));
00341     XRCCTRL(*this, "IDC_MISC_DOORS_KL_KRAID",
00342             wxCheckBox)->SetValue(password.getBit(REDDOOR_KL_KRAID));
00343     
00344     XRCCTRL(*this, "IDC_MISC_DOORS_NF_HIGHJUMPBOOTS",
00345             wxCheckBox)->SetValue(password.getBit(REDDOOR_NF_HIGHJUMPBOOTS));
00346     XRCCTRL(*this, "IDC_MISC_DOORS_NF_SCREWATTACK",
00347             wxCheckBox)->SetValue(password.getBit(REDDOOR_NF_SCREWATTACK));
00348     XRCCTRL(*this, "IDC_MISC_DOORS_NF_WAVEBEAM",
00349             wxCheckBox)->SetValue(password.getBit(REDDOOR_NF_WAVEBEAM));
00350     XRCCTRL(*this, "IDC_MISC_DOORS_NF_ICEBEAM",
00351             wxCheckBox)->SetValue(password.getBit(REDDOOR_NF_ICEBEAM));
00352     
00353     XRCCTRL(*this, "IDC_MISC_DOORS_RL",
00354             wxCheckBox)->SetValue(password.getBit(REDDOOR_RL));
00355     XRCCTRL(*this, "IDC_MISC_DOORS_RL_RIDLEY",
00356             wxCheckBox)->SetValue(password.getBit(REDDOOR_RL_RIDLEY));
00357     
00358     XRCCTRL(*this, "IDC_MISC_DOORS_T1",
00359             wxCheckBox)->SetValue(password.getBit(REDDOOR_T1));
00360     XRCCTRL(*this, "IDC_MISC_DOORS_T2",
00361             wxCheckBox)->SetValue(password.getBit(REDDOOR_T2));
00362     XRCCTRL(*this, "IDC_MISC_DOORS_T3",
00363             wxCheckBox)->SetValue(password.getBit(REDDOOR_T3));
00364     
00365     // update the statue controls
00366     XRCCTRL(*this, "IDC_MISC_STATUE_KRAID",
00367             wxCheckBox)->SetValue(password.getBit(KRAID_STATUE));
00368     XRCCTRL(*this, "IDC_MISC_STATUE_RIDLEY",
00369             wxCheckBox)->SetValue(password.getBit(RIDLEY_STATUE));
00370     
00371     // update the zebetite controls
00372     XRCCTRL(*this, "IDC_MISC_ZEBETITE1",
00373             wxCheckBox)->SetValue(password.getBit(ZEBETITE1));
00374     XRCCTRL(*this, "IDC_MISC_ZEBETITE2",
00375             wxCheckBox)->SetValue(password.getBit(ZEBETITE2));
00376     XRCCTRL(*this, "IDC_MISC_ZEBETITE3",
00377             wxCheckBox)->SetValue(password.getBit(ZEBETITE3));
00378     XRCCTRL(*this, "IDC_MISC_ZEBETITE4",
00379             wxCheckBox)->SetValue(password.getBit(ZEBETITE4));
00380     XRCCTRL(*this, "IDC_MISC_ZEBETITE5",
00381             wxCheckBox)->SetValue(password.getBit(ZEBETITE5));
00382     
00383     // update the boss controls
00384     XRCCTRL(*this, "IDC_MISC_BOSS_KRAID",
00385             wxCheckBox)->SetValue(password.getBit(KRAID));
00386     XRCCTRL(*this, "IDC_MISC_BOSS_RIDLEY",
00387             wxCheckBox)->SetValue(password.getBit(RIDLEY));
00388     XRCCTRL(*this, "IDC_MISC_BOSS_MOTHERBRAIN",
00389             wxCheckBox)->SetValue(password.getBit(MOTHERBRAIN));
00390             
00391     // update the armor control
00392     XRCCTRL(*this, "IDRB_MISC_ARMOR",
00393             wxRadioBox)->SetSelection(password.getBit(SWIMSUIT) ? 1 : 0);
00394     
00395     // update the missile count, gametime, and shift byte controls
00396     unsigned long value = static_cast<unsigned long>(password.getGameTime());
00397     
00398     ignoreTextEvent = true;
00399     XRCCTRL(*this, "IDSC_ITEMS_MISSILES",
00400             wxSpinCtrl)->SetValue(password.getMissiles());
00401     XRCCTRL(*this, "IDT_MISC_GAMETIME",
00402             wxTextCtrl)->SetValue(wxString::Format(wxT("%lu"), value));
00403     XRCCTRL(*this, "IDSC_RAW_SHIFT",
00404             wxSpinCtrl)->SetValue(password.getShift());
00405     ignoreTextEvent = false;
00406     
00407     // update the real time value
00408     updateRealTime();
00409     
00410     // update the start location
00411     updateStartLocation();
00412     
00413     // update the raw password data control
00414     for (int i = 0; i < PASSWORD_BITS; ++i) {
00415         XRCCTRL(*this, "IDCLB_RAW_BITS",
00416                 wxCheckListBox)->Check(i, password.getBit(i));
00417     }
00418     
00419     // warn about invalid passwords due to reset bit
00420     if (password.getBit(RESET)) {
00421         wxMessageBox(wxT("This password is invalid: reset bit is set"),
00422                      wxT("Warning: Invalid Password"),
00423                      wxICON_EXCLAMATION | wxOK);
00424     }
00425 }
00426 
00427 void MPGFrame::updatePasswordText(bool updateCtrl) {
00428     if (updateCtrl) {
00429         ignoreTextEvent = true;
00430         XRCCTRL(*this, "IDT_PASSWORD", wxTextCtrl)->SetValue(password.getEncoded());
00431         ignoreTextEvent = false;
00432     }
00433     
00434     XRCCTRL(*this, "IDP_PASSWORD", PasswordPanel)->Refresh(false);
00435     
00436     // warn if they have entered the debug password
00437     if (password.getEncoded().StartsWith(wxT("NARPASSWORD00000"))) {
00438         wxMessageBox(wxT("This password triggers debug mode.\n"
00439                          "Because it is Hard Coded, any change will disable "
00440                          "debug mode effects."),
00441                      wxT("Debug Password"), wxICON_EXCLAMATION | wxOK);
00442     }
00443 }
00444 
00445 void MPGFrame::updateRawGameTime(wxUint32 value) {
00446     wxCheckListBox *ctrl = XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox);
00447     
00448     for (int i = 0; i < 32; ++i) {
00449         ctrl->Check(GAMETIME + i, (value & (1 << i)));
00450     }
00451 }
00452 
00453 void MPGFrame::updateRawMissiles(unsigned char value) {
00454     wxCheckListBox *ctrl = XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox);
00455     
00456     for (int i = 0; i < 8; ++i) {
00457         ctrl->Check(MISSILES + i, (value & (1 << i)));
00458     }
00459 }
00460 
00461 void MPGFrame::updateRealTime() {
00462     wxUint32 ticks = password.getGameTime();
00463     unsigned char lsb = (ticks & 0xFF);
00464     
00465     if (lsb >= 0xD0) {
00466         lsb = 0xCF;
00467     }
00468     
00469     ticks = (((ticks & 0xFFFFFF00) >> 8) * 0xD0) + lsb;
00470     
00471     double factor = (pal ? (256.0 / 50.0) : (256.0 / 60.0));
00472     double time = ticks * factor;
00473 
00474     int hours = static_cast<int>(time / 3600);
00475     int minutes = static_cast<int>(fmod(time / 60, 60));
00476     int seconds = static_cast<int>(fmod(time, 60));
00477     
00478     XRCCTRL(*this, "IDST_MISC_GAMETIME", wxStaticText)->SetLabel(
00479         wxString::Format(wxT("Approx %d Hr %d Min %d Sec"),
00480         hours, minutes, seconds));
00481 }
00482 
00483 void MPGFrame::updateStartLocation() {
00484     bool nf = password.getBit(START_NF);
00485     bool kl = password.getBit(START_KL);
00486     bool rl = password.getBit(START_RL);
00487     
00488     wxRadioBox *ctrl = XRCCTRL(*this, "IDRB_MISC_START", wxRadioBox);
00489     
00490     if (!nf && !kl && !rl) {
00491         // Brinstar
00492         ctrl->SetSelection(BRINSTAR);
00493     } else if (!nf && kl && !rl) {
00494         // Kraid's Lair
00495         ctrl->SetSelection(KRAIDSLAIR);
00496     } else if (nf && !kl && !rl) {
00497         // Norfair
00498         ctrl->SetSelection(NORFAIR);
00499     } else if (!nf && !kl && rl) {
00500         // Ridley's Lair
00501         ctrl->SetSelection(RIDLEYSLAIR);
00502     } else if (nf && kl && !rl) {
00503         // Tourian
00504         ctrl->SetSelection(TOURIAN);
00505     } else {
00506         // invalid start location
00507         wxMessageBox(wxT("This password has an invalid start location."),
00508                      wxT("Warning: Invalid Password"),
00509                      wxICON_EXCLAMATION | wxOK);
00510     }
00511 }
00512 
00513 void MPGFrame::updateTextCtrlSizes() {
00514     wxClientDC dc(this);
00515     wxTextCtrl *ctrl;
00516     wxCoord width, height;
00517     
00518     ctrl = XRCCTRL(*this, "IDT_MISC_GAMETIME", wxTextCtrl);
00519     dc.SetFont(ctrl->GetFont());
00520     dc.GetTextExtent(wxT("04294967296"), &width, &height);
00521     
00522     wxSize size(width + 10, height + 5);
00523     ctrl->SetSize(size);
00524     ctrl->SetMinSize(size);
00525     ctrl->SetMaxSize(size);
00526     
00527     ctrl = XRCCTRL(*this, "IDT_PASSWORD", wxTextCtrl);
00528     dc.SetFont(ctrl->GetFont());
00529     dc.GetTextExtent(wxT("000000 000000 000000 000000"), &width, &height);
00530     
00531     size = wxSize(width + 10, height + 5);
00532     ctrl->SetSize(size);
00533     ctrl->SetMinSize(size);
00534     ctrl->SetMaxSize(size);
00535 }
00536 
00537 void MPGFrame::onArmorChanged(wxCommandEvent &event) {
00538     wxRadioBox *ptr = dynamic_cast<wxRadioBox *>(event.GetEventObject());
00539     bool state = (ptr->GetSelection() == 1);
00540     
00541     XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox)->Check(SWIMSUIT, state);
00542     password.setBit(SWIMSUIT, state);
00543     
00544     updatePasswordText();
00545 }
00546 
00547 void MPGFrame::onBossChanged(wxCommandEvent &event) {
00548     int id = event.GetId();
00549     bool state = event.IsChecked();
00550     int bit;
00551     
00552     if (id == XRCID("IDC_MISC_BOSS_KRAID")) {
00553         bit = KRAID;
00554     } else if (id == XRCID("IDC_MISC_BOSS_RIDLEY")) {
00555         bit = RIDLEY;
00556     } else {
00557         bit = MOTHERBRAIN;
00558     }
00559     
00560     XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox)->Check(bit, state);
00561     password.setBit(bit, state);
00562     
00563     updatePasswordText();
00564 }
00565 
00566 void MPGFrame::onChecksumShift(wxCommandEvent &event) {
00567     int id = event.GetId();
00568     wxChar ch;
00569     
00570     if (id == XRCID("IDM_PASSWORD_SHIFT1")) {
00571         ch = wxT('0');
00572     } else if (id == XRCID("IDM_PASSWORD_SHIFT2")) {
00573         ch = wxT('4');
00574     } else if (id == XRCID("IDM_PASSWORD_SHIFT3")) {
00575         ch = wxT('8');
00576     } else if (id == XRCID("IDM_PASSWORD_SHIFT4")) {
00577         ch = wxT('C');
00578     } else if (id == XRCID("IDM_PASSWORD_SHIFT5")) {
00579         ch = wxT('G');
00580     } else if (id == XRCID("IDM_PASSWORD_SHIFT6")) {
00581         ch = wxT('K');
00582     } else if (id == XRCID("IDM_PASSWORD_SHIFT7")) {
00583         ch = wxT('O');
00584     } else if (id == XRCID("IDM_PASSWORD_SHIFT8")) {
00585         ch = wxT('S');
00586     } else if (id == XRCID("IDM_PASSWORD_SHIFT9")) {
00587         ch = wxT('W');
00588     } else if (id == XRCID("IDM_PASSWORD_SHIFT10")) {
00589         ch = wxT('a');
00590     } else if (id == XRCID("IDM_PASSWORD_SHIFT11")) {
00591         ch = wxT('e');
00592     } else if (id == XRCID("IDM_PASSWORD_SHIFT12")) {
00593         ch = wxT('i');
00594     } else if (id == XRCID("IDM_PASSWORD_SHIFT13")) {
00595         ch = wxT('m');
00596     } else if (id == XRCID("IDM_PASSWORD_SHIFT14")) {
00597         ch = wxT('q');
00598     } else if (id == XRCID("IDM_PASSWORD_SHIFT15")) {
00599         ch = wxT('u');
00600     } else {
00601         ch = wxT('y');
00602     }
00603     
00604     wxTextCtrl *ctrl = XRCCTRL(*this, "IDT_PASSWORD", wxTextCtrl);
00605     wxString text = ctrl->GetValue();
00606     
00607     text[22] = ch;
00608     ctrl->SetValue(text);
00609     
00610     wxCommandEvent evt(wxEVT_COMMAND_BUTTON_CLICKED, XRCID("IDB_CHECKSUM"));
00611     GetEventHandler()->AddPendingEvent(evt);
00612 }
00613 
00614 void MPGFrame::onDoorChanged(wxCommandEvent &event) {
00615     int id = event.GetId();
00616     bool state = event.IsChecked();
00617     int bit;
00618     
00619     if (id == XRCID("IDC_MISC_DOORS_BS_LONGBEAM")) {
00620         bit = REDDOOR_BS_LONGBEAM;
00621     } else if (id == XRCID("IDC_MISC_DOORS_BS_TOURIANBRIDGE")) {
00622         bit = REDDOOR_BS_TOURIANBRIDGE;
00623     } else if (id == XRCID("IDC_MISC_DOORS_BS_BOMBS")) {
00624         bit = REDDOOR_BS_BOMBS;
00625     } else if (id == XRCID("IDC_MISC_DOORS_BS_ICEBEAM")) {
00626         bit = REDDOOR_BS_ICEBEAM;
00627     } else if (id == XRCID("IDC_MISC_DOORS_BS_VARIA")) {
00628         bit = REDDOOR_BS_VARIA;
00629     } else if (id == XRCID("IDC_MISC_DOORS_KL1")) {
00630         bit = REDDOOR_KL1;
00631     } else if (id == XRCID("IDC_MISC_DOORS_KL2")) {
00632         bit = REDDOOR_KL2;
00633     } else if (id == XRCID("IDC_MISC_DOORS_KL3")) {
00634         bit = REDDOOR_KL3;
00635     } else if (id == XRCID("IDC_MISC_DOORS_KL4")) {
00636         bit = REDDOOR_KL4;
00637     } else if (id == XRCID("IDC_MISC_DOORS_KL_KRAID")) {
00638         bit = REDDOOR_KL_KRAID;
00639     } else if (id == XRCID("IDC_MISC_DOORS_NF_HIGHJUMPBOOTS")) {
00640         bit = REDDOOR_NF_HIGHJUMPBOOTS;
00641     } else if (id == XRCID("IDC_MISC_DOORS_NF_SCREWATTACK")) {
00642         bit = REDDOOR_NF_SCREWATTACK;
00643     } else if (id == XRCID("IDC_MISC_DOORS_NF_WAVEBEAM")) {
00644         bit = REDDOOR_NF_WAVEBEAM;
00645     } else if (id == XRCID("IDC_MISC_DOORS_NF_ICEBEAM")) {
00646         bit = REDDOOR_NF_ICEBEAM;
00647     } else if (id == XRCID("IDC_MISC_DOORS_RL")) {
00648         bit = REDDOOR_RL;
00649     } else if (id == XRCID("IDC_MISC_DOORS_RL_RIDLEY")) {
00650         bit = REDDOOR_RL_RIDLEY;
00651     } else if (id == XRCID("IDC_MISC_DOORS_T1")) {
00652         bit = REDDOOR_T1;
00653     } else if (id == XRCID("IDC_MISC_DOORS_T2")) {
00654         bit = REDDOOR_T2;
00655     } else {
00656         bit = REDDOOR_T3;
00657     }
00658     
00659     XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox)->Check(bit, state);
00660     password.setBit(bit, state);
00661     
00662     updatePasswordText();
00663 }
00664 
00665 void MPGFrame::onEnergyTankChanged(wxCommandEvent &event) {
00666     int id = event.GetId();
00667     bool state = event.IsChecked();
00668     int bit;
00669     
00670     if (id == XRCID("IDC_ITEMS_ET_BS1")) {
00671         bit = ENERGYTANK_BS1;
00672     } else if (id == XRCID("IDC_ITEMS_ET_BS2")) {
00673         bit = ENERGYTANK_BS2;
00674     } else if (id == XRCID("IDC_ITEMS_ET_BS3")) {
00675         bit = ENERGYTANK_BS3;
00676     } else if (id == XRCID("IDC_ITEMS_ET_NF")) {
00677         bit = ENERGYTANK_NF;
00678     } else if (id == XRCID("IDC_ITEMS_ET_KL")) {
00679         bit = ENERGYTANK_KL;
00680     } else if (id == XRCID("IDC_ITEMS_ET_KL_KRAID")) {
00681         bit = ENERGYTANK_KL_KRAID;
00682     } else if (id == XRCID("IDC_ITEMS_ET_RL")) {
00683         bit = ENERGYTANK_RL;
00684     } else {
00685         bit = ENERGYTANK_RL_RIDLEY;
00686     }
00687     
00688     XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox)->Check(bit, state);
00689     password.setBit(bit, state);
00690     
00691     updatePasswordText();
00692 }
00693 
00694 void MPGFrame::onFixChecksum(wxCommandEvent &) {
00695     wxString text = XRCCTRL(*this, "IDT_PASSWORD", wxTextCtrl)->GetValue();
00696     
00697     password = Password(text, true);
00698     updatePasswordText();
00699     updateControls();
00700 }
00701 
00702 void MPGFrame::onGameSystem(wxCommandEvent &event) {
00703     pal = (event.GetId() == XRCID("IDM_GAME_PAL"));
00704     
00705     updateRealTime();
00706 }
00707 
00708 void MPGFrame::onGameTimeChanged(wxCommandEvent &event) {
00709     if (ignoreTextEvent) {
00710         return;
00711     }
00712     
00713     unsigned long value;
00714     
00715     if (event.GetString().ToULong(&value)) {
00716         wxUint32 ticks = static_cast<wxUint32>(value);
00717         
00718         updateRawGameTime(ticks);
00719         password.setGameTime(ticks);
00720         
00721         updateRealTime();
00722         updatePasswordText();
00723     }
00724 }
00725 
00726 void MPGFrame::onHelpAbout(wxCommandEvent &) {
00727     wxString message = APP_NAME + wxT(' ') + APP_VERSION + wxT('\n') +
00728                        APP_COPYRIGHT + wxT('\n') + APP_URL;
00729     wxString title = wxT("About ") + APP_NAME + wxT("...");
00730     
00731     wxMessageBox(message, title, wxICON_INFORMATION | wxOK);
00732 }
00733 
00734 void MPGFrame::onItemChanged(wxCommandEvent &event) {
00735     int id = event.GetId();
00736     bool state = event.IsChecked();
00737     int b1, b2 = -1;
00738     wxCheckListBox *ctrl = XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox);
00739     
00740     if (id == XRCID("IDC_ITEMS_MARUMARI")) {
00741         b1 = MARUMARI;
00742         b2 = MARUMARI_TAKEN;
00743     } else if (id == XRCID("IDC_ITEMS_LONGBEAM")) {
00744         b1 = LONGBEAM;
00745     } else if (id == XRCID("IDC_ITEMS_WAVEBEAM")) {
00746         b1 = WAVEBEAM;
00747         
00748         // can't use wave beam and ice beam simultaneously
00749         XRCCTRL(*this, "IDC_ITEMS_ICEBEAM", wxCheckBox)->SetValue(false);
00750         ctrl->Check(ICEBEAM, false);
00751         password.setBit(ICEBEAM, false);
00752     } else if (id == XRCID("IDC_ITEMS_ICEBEAM")) {
00753         b1 = ICEBEAM;
00754         
00755         // can't use wave beam and ice beam simultaneously
00756         XRCCTRL(*this, "IDC_ITEMS_WAVEBEAM", wxCheckBox)->SetValue(false);
00757         ctrl->Check(WAVEBEAM, false);
00758         password.setBit(WAVEBEAM, false);
00759     } else if (id == XRCID("IDC_ITEMS_BOMBS")) {
00760         b1 = BOMBS;
00761         b2 = BOMBS_TAKEN;
00762     } else if (id == XRCID("IDC_ITEMS_HIGHJUMPBOOTS")) {
00763         b1 = HIGHJUMPBOOTS;
00764         b2 = HIGHJUMPBOOTS_TAKEN;
00765     } else if (id == XRCID("IDC_ITEMS_SCREWATTACK")) {
00766         b1 = SCREWATTACK;
00767         b2 = SCREWATTACK_TAKEN;
00768     } else {
00769         b1 = VARIA;
00770         b2 = VARIA_TAKEN;
00771     }
00772     
00773     ctrl->Check(b1, state);
00774     password.setBit(b1, state);
00775     
00776     if (b2 != -1) {
00777         ctrl->Check(b2, state);
00778         password.setBit(b2, state);
00779     }
00780     
00781     updatePasswordText();
00782 }
00783 
00784 void MPGFrame::onMissileContainerChanged(wxCommandEvent &event) {
00785     int id = event.GetId();
00786     bool state = event.IsChecked();
00787     int bit;
00788     
00789     if (id == XRCID("IDC_ITEMS_MC_BS1")) {
00790         bit = MISSILE_BS1;
00791     } else if (id == XRCID("IDC_ITEMS_MC_BS2")) {
00792         bit = MISSILE_BS2;
00793     } else if (id == XRCID("IDC_ITEMS_MC_KL1")) {
00794         bit = MISSILE_KL1;
00795     } else if (id == XRCID("IDC_ITEMS_MC_KL2")) {
00796         bit = MISSILE_KL2;
00797     } else if (id == XRCID("IDC_ITEMS_MC_KL3")) {
00798         bit = MISSILE_KL3;
00799     } else if (id == XRCID("IDC_ITEMS_MC_KL4")) {
00800         bit = MISSILE_KL4;
00801     } else if (id == XRCID("IDC_ITEMS_MC_NF1")) {
00802         bit = MISSILE_NF1;
00803     } else if (id == XRCID("IDC_ITEMS_MC_NF2")) {
00804         bit = MISSILE_NF2;
00805     } else if (id == XRCID("IDC_ITEMS_MC_NF3")) {
00806         bit = MISSILE_NF3;
00807     } else if (id == XRCID("IDC_ITEMS_MC_NF4")) {
00808         bit = MISSILE_NF4;
00809     } else if (id == XRCID("IDC_ITEMS_MC_NF5")) {
00810         bit = MISSILE_NF5;
00811     } else if (id == XRCID("IDC_ITEMS_MC_NF6")) {
00812         bit = MISSILE_NF6;
00813     } else if (id == XRCID("IDC_ITEMS_MC_NF7")) {
00814         bit = MISSILE_NF7;
00815     } else if (id == XRCID("IDC_ITEMS_MC_NF8")) {
00816         bit = MISSILE_NF8;
00817     } else if (id == XRCID("IDC_ITEMS_MC_NF9")) {
00818         bit = MISSILE_NF9;
00819     } else if (id == XRCID("IDC_ITEMS_MC_NF10")) {
00820         bit = MISSILE_NF10;
00821     } else if (id == XRCID("IDC_ITEMS_MC_NF11")) {
00822         bit = MISSILE_NF11;
00823     } else if (id == XRCID("IDC_ITEMS_MC_NF12")) {
00824         bit = MISSILE_NF12;
00825     } else if (id == XRCID("IDC_ITEMS_MC_RL1")) {
00826         bit = MISSILE_RL1;
00827     } else if (id == XRCID("IDC_ITEMS_MC_RL2")) {
00828         bit = MISSILE_RL2;
00829     } else {
00830         bit = MISSILE_RL3;
00831     }
00832     
00833     XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox)->Check(bit, state);
00834     password.setBit(bit, state);
00835     
00836     updatePasswordText();
00837 }
00838 
00839 void MPGFrame::onMissilesTextChanged(wxCommandEvent &) {
00840     if (ignoreTextEvent) {
00841         return;
00842     }
00843     
00844     wxSpinCtrl *ctrl = XRCCTRL(*this, "IDSC_ITEMS_MISSILES", wxSpinCtrl);
00845     unsigned char value = static_cast<unsigned char>(ctrl->GetValue());
00846     
00847     password.setMissiles(value);
00848     
00849     updateRawMissiles(value);
00850     updatePasswordText();
00851 }
00852 
00853 void MPGFrame::onPasswordChanged(wxCommandEvent &) {
00854     if (fixChecksumButton) {
00855         fixChecksumButton->Enable(false);
00856     }
00857     
00858     if (ignoreTextEvent) {
00859         return;
00860     }
00861     
00862     wxString text = XRCCTRL(*this, "IDT_PASSWORD", wxTextCtrl)->GetValue();
00863                      
00864     try {
00865         password = Password(text);
00866         
00867         updatePasswordText(false);
00868         updateControls();
00869     } catch (InvalidPasswordException &e) {
00870         if (e.getError() == INVALID_CHECKSUM) {
00871             fixChecksumButton->Enable(true);
00872         }
00873     }
00874 }
00875 
00876 void MPGFrame::onPasswordDebugPassword(wxCommandEvent &) {  
00877     wxMessageBox(wxT("The debug password is NARPAS SWORD0 000000 000000\n"
00878                      "It is Hard Coded and cannot be edited."),
00879                  wxT("Debug Password"), wxICON_INFORMATION | wxOK);
00880 }
00881 
00882 void MPGFrame::onPasswordEnding(wxCommandEvent &event) {
00883     wxTextCtrl *ctrl = XRCCTRL(*this, "IDT_MISC_GAMETIME", wxTextCtrl);
00884     int id = event.GetId();
00885     
00886     if (id == XRCID("IDM_PASSWORD_ENDING1")) {
00887         ctrl->SetValue(wxT("0"));
00888     } else if (id == XRCID("IDM_PASSWORD_ENDING2")) {
00889         ctrl->SetValue(wxT("1024"));
00890     } else if (id == XRCID("IDM_PASSWORD_ENDING3")) {
00891         ctrl->SetValue(wxT("2560"));
00892     } else if (id == XRCID("IDM_PASSWORD_ENDING4")) {
00893         ctrl->SetValue(wxT("5632"));
00894     } else {
00895         ctrl->SetValue(wxT("31232"));
00896     }
00897 }
00898 
00899 void MPGFrame::onPasswordGiveBosses(wxCommandEvent &) {
00900     password.setBit(KRAID);
00901     password.setBit(RIDLEY);
00902     password.setBit(MOTHERBRAIN);
00903     
00904     updatePasswordText();
00905     updateControls();
00906 }
00907 
00908 void MPGFrame::onPasswordGiveDoors(wxCommandEvent &) {
00909     password.setBit(REDDOOR_BS_LONGBEAM);
00910     password.setBit(REDDOOR_BS_TOURIANBRIDGE);
00911     password.setBit(REDDOOR_BS_BOMBS);
00912     password.setBit(REDDOOR_BS_ICEBEAM);
00913     password.setBit(REDDOOR_BS_VARIA);
00914     
00915     password.setBit(REDDOOR_KL1);
00916     password.setBit(REDDOOR_KL2);
00917     password.setBit(REDDOOR_KL3);
00918     password.setBit(REDDOOR_KL4);
00919     password.setBit(REDDOOR_KL_KRAID);
00920     
00921     password.setBit(REDDOOR_NF_HIGHJUMPBOOTS);
00922     password.setBit(REDDOOR_NF_SCREWATTACK);
00923     password.setBit(REDDOOR_NF_WAVEBEAM);
00924     password.setBit(REDDOOR_NF_ICEBEAM);
00925     
00926     password.setBit(REDDOOR_RL);
00927     password.setBit(REDDOOR_RL_RIDLEY);
00928     
00929     password.setBit(REDDOOR_T1);
00930     password.setBit(REDDOOR_T2);
00931     password.setBit(REDDOOR_T3);
00932     
00933     updatePasswordText();
00934     updateControls();
00935 }
00936 
00937 void MPGFrame::onPasswordGiveEnergyTanks(wxCommandEvent &) {
00938     password.setBit(ENERGYTANK_BS1);
00939     password.setBit(ENERGYTANK_BS2);
00940     password.setBit(ENERGYTANK_BS3);
00941     
00942     password.setBit(ENERGYTANK_NF);
00943     
00944     password.setBit(ENERGYTANK_KL);
00945     password.setBit(ENERGYTANK_KL_KRAID);
00946     
00947     password.setBit(ENERGYTANK_RL);
00948     password.setBit(ENERGYTANK_RL_RIDLEY);
00949     
00950     updatePasswordText();
00951     updateControls();
00952 }
00953 
00954 void MPGFrame::onPasswordGiveItems(wxCommandEvent &) {
00955     password.setBit(MARUMARI);
00956     password.setBit(MARUMARI_TAKEN);
00957     
00958     password.setBit(LONGBEAM);
00959     password.setBit(WAVEBEAM, false);
00960     password.setBit(ICEBEAM);
00961     
00962     password.setBit(BOMBS);
00963     password.setBit(BOMBS_TAKEN);
00964     
00965     password.setBit(HIGHJUMPBOOTS);
00966     password.setBit(HIGHJUMPBOOTS_TAKEN);
00967     
00968     password.setBit(SCREWATTACK);
00969     password.setBit(SCREWATTACK_TAKEN);
00970     
00971     password.setBit(VARIA);
00972     password.setBit(VARIA_TAKEN);
00973     
00974     updatePasswordText();
00975     updateControls();
00976 }
00977 
00978 void MPGFrame::onPasswordGiveMissiles(wxCommandEvent &) {
00979     int count = 0;
00980     
00981     if (password.getBit(MISSILE_BS1)) ++count;
00982     if (password.getBit(MISSILE_BS2)) ++count;
00983     if (password.getBit(MISSILE_KL1)) ++count;
00984     if (password.getBit(MISSILE_KL2)) ++count;
00985     if (password.getBit(MISSILE_KL3)) ++count;
00986     if (password.getBit(MISSILE_KL4)) ++count;
00987     if (password.getBit(MISSILE_NF1)) ++count;
00988     if (password.getBit(MISSILE_NF2)) ++count;
00989     if (password.getBit(MISSILE_NF3)) ++count;
00990     if (password.getBit(MISSILE_NF4)) ++count;
00991     if (password.getBit(MISSILE_NF5)) ++count;
00992     if (password.getBit(MISSILE_NF6)) ++count;
00993     if (password.getBit(MISSILE_NF7)) ++count;
00994     if (password.getBit(MISSILE_NF8)) ++count;
00995     if (password.getBit(MISSILE_NF9)) ++count;
00996     if (password.getBit(MISSILE_NF10)) ++count;
00997     if (password.getBit(MISSILE_NF11)) ++count;
00998     if (password.getBit(MISSILE_NF12)) ++count;
00999     if (password.getBit(MISSILE_RL1)) ++count;
01000     if (password.getBit(MISSILE_RL2)) ++count;
01001     if (password.getBit(MISSILE_RL3)) ++count;
01002     if (password.getBit(KRAID) || password.getBit(KRAID_STATUE)) count += 15;
01003     if (password.getBit(RIDLEY) || password.getBit(RIDLEY_STATUE)) count += 15;
01004     
01005     XRCCTRL(*this, "IDSC_ITEMS_MISSILES", wxSpinCtrl)->SetValue(count *= 5);
01006     
01007     #ifndef __WXMSW__
01008         // SetValue of a wxSpinCtrl on Windows also generates a EVT_TEXT event,
01009         // but on wxGTK it doesn't, so we need to update manually
01010         password.setMissiles(count);
01011         
01012         updateRawMissiles(count);
01013         updatePasswordText();
01014     #endif
01015 }
01016 
01017 void MPGFrame::onPasswordGiveMissileContainers(wxCommandEvent &) {
01018     password.setBit(MISSILE_BS1);
01019     password.setBit(MISSILE_BS2);
01020     
01021     password.setBit(MISSILE_KL1);
01022     password.setBit(MISSILE_KL2);
01023     password.setBit(MISSILE_KL3);
01024     password.setBit(MISSILE_KL4);
01025     
01026     password.setBit(MISSILE_NF1);
01027     password.setBit(MISSILE_NF2);
01028     password.setBit(MISSILE_NF3);
01029     password.setBit(MISSILE_NF4);
01030     password.setBit(MISSILE_NF5);
01031     password.setBit(MISSILE_NF6);
01032     password.setBit(MISSILE_NF7);
01033     password.setBit(MISSILE_NF8);
01034     password.setBit(MISSILE_NF9);
01035     password.setBit(MISSILE_NF10);
01036     password.setBit(MISSILE_NF11);
01037     password.setBit(MISSILE_NF12);
01038     
01039     password.setBit(MISSILE_RL1);
01040     password.setBit(MISSILE_RL2);
01041     password.setBit(MISSILE_RL3);
01042     
01043     updatePasswordText();
01044     updateControls();
01045 }
01046 
01047 void MPGFrame::onPasswordGiveStatues(wxCommandEvent &) {
01048     password.setBit(KRAID_STATUE);
01049     password.setBit(RIDLEY_STATUE);
01050     
01051     updatePasswordText();
01052     updateControls();
01053 }
01054 
01055 void MPGFrame::onPasswordGiveZebetites(wxCommandEvent &) {
01056     password.setBit(ZEBETITE1);
01057     password.setBit(ZEBETITE2);
01058     password.setBit(ZEBETITE3);
01059     password.setBit(ZEBETITE4);
01060     password.setBit(ZEBETITE5);
01061     
01062     updatePasswordText();
01063     updateControls();
01064 }
01065 
01066 void MPGFrame::onPasswordPerfectGame(wxCommandEvent &) {
01067     password = Password();
01068 
01069     // Missile Inventory
01070     password.setMissiles(MAX_MISSILES);
01071     
01072     // Start Location
01073     password.setBit(START_NF);
01074     password.setBit(START_KL);
01075     
01076     // Statues
01077     password.setBit(KRAID_STATUE);
01078     password.setBit(RIDLEY_STATUE);
01079     
01080     // Swimsuit Samus
01081     password.setBit(SWIMSUIT);
01082     
01083     // Bosses
01084     password.setBit(KRAID);
01085     password.setBit(RIDLEY);
01086     
01087     // Items
01088     wxCommandEvent event1(wxEVT_COMMAND_MENU_SELECTED,
01089                           XRCID("IDM_PASSWORD_GIVE_ITEMS"));
01090     GetEventHandler()->AddPendingEvent(event1);
01091     
01092     // Missile Containers
01093     wxCommandEvent event2(wxEVT_COMMAND_MENU_SELECTED,
01094                           XRCID("IDM_PASSWORD_GIVE_MC"));
01095     GetEventHandler()->AddPendingEvent(event2);
01096     
01097     // Energy Tanks
01098     wxCommandEvent event3(wxEVT_COMMAND_MENU_SELECTED,
01099                           XRCID("IDM_PASSWORD_GIVE_ET"));
01100     GetEventHandler()->AddPendingEvent(event3);
01101     
01102     // Red & Yellow Doors
01103     wxCommandEvent event4(wxEVT_COMMAND_MENU_SELECTED,
01104                           XRCID("IDM_PASSWORD_GIVE_DOORS"));
01105     GetEventHandler()->AddPendingEvent(event4);
01106     
01107     // Zebetites
01108     wxCommandEvent event5(wxEVT_COMMAND_MENU_SELECTED,
01109                           XRCID("IDM_PASSWORD_GIVE_ZEBETITES"));
01110     GetEventHandler()->AddPendingEvent(event5);
01111 }
01112 
01113 void MPGFrame::onPasswordReset(wxCommandEvent &) {
01114     int answer = wxMessageBox(wxT("Really Reset Password?"),
01115                               wxT("Confirm: Reset Password"),
01116                               wxYES_NO | wxICON_QUESTION);
01117                               
01118     if (answer == wxYES) {
01119         password = Password();
01120         
01121         updatePasswordText();
01122         updateControls();
01123     }
01124 }
01125 
01126 void MPGFrame::onRawBitChanged(wxCommandEvent &event) {
01127     wxCheckListBox *ptr = 
01128         dynamic_cast<wxCheckListBox *>(event.GetEventObject());
01129     int bit = event.GetSelection();
01130     bool state = ptr->IsChecked(bit);
01131     
01132     password.setBit(bit, state);
01133     
01134     switch (bit) {
01135         case MARUMARI:
01136         case MARUMARI_TAKEN:
01137             // Maru Mari not valid unless it's both taken and equipped
01138             state = password.getBit(MARUMARI) &&
01139                     password.getBit(MARUMARI_TAKEN);
01140             XRCCTRL(*this, "IDC_ITEMS_MARUMARI", wxCheckBox)->SetValue(state);
01141             break;
01142             
01143         case MISSILE_BS1:
01144             XRCCTRL(*this, "IDC_ITEMS_MC_BS1", wxCheckBox)->SetValue(state);
01145             break;
01146             
01147         case REDDOOR_BS_LONGBEAM:
01148             XRCCTRL(*this, "IDC_MISC_DOORS_BS_LONGBEAM",
01149                     wxCheckBox)->SetValue(state);
01150             break;
01151             
01152         case REDDOOR_BS_TOURIANBRIDGE:
01153             XRCCTRL(*this, "IDC_MISC_DOORS_BS_TOURIANBRIDGE",
01154                     wxCheckBox)->SetValue(state);
01155             break;
01156             
01157         case ENERGYTANK_BS1:
01158             XRCCTRL(*this, "IDC_ITEMS_ET_BS1", wxCheckBox)->SetValue(state);
01159             break;
01160             
01161         case REDDOOR_BS_BOMBS:
01162             XRCCTRL(*this, "IDC_MISC_DOORS_BS_BOMBS",
01163                     wxCheckBox)->SetValue(state);
01164             break;
01165             
01166         case BOMBS:
01167         case BOMBS_TAKEN:
01168             // Bombs not valid unless it's both taken and equipped
01169             state = password.getBit(BOMBS) && password.getBit(BOMBS_TAKEN);
01170             XRCCTRL(*this, "IDC_ITEMS_BOMBS", wxCheckBox)->SetValue(state);
01171             break;
01172             
01173         case REDDOOR_BS_ICEBEAM:
01174             XRCCTRL(*this, "IDC_MISC_DOORS_BS_ICEBEAM",
01175                     wxCheckBox)->SetValue(state);
01176             break;
01177             
01178         case MISSILE_BS2:
01179             XRCCTRL(*this, "IDC_ITEMS_MC_BS2", wxCheckBox)->SetValue(state);
01180             break;
01181             
01182         case ENERGYTANK_BS2:
01183             XRCCTRL(*this, "IDC_ITEMS_ET_BS2", wxCheckBox)->SetValue(state);
01184             break;
01185             
01186         case REDDOOR_BS_VARIA:
01187             XRCCTRL(*this, "IDC_MISC_DOORS_BS_VARIA",
01188                     wxCheckBox)->SetValue(state);
01189             break;
01190             
01191         case VARIA:
01192         case VARIA_TAKEN:
01193             // Varia not valid unless it's both taken and equipped
01194             state = password.getBit(VARIA) && password.getBit(VARIA_TAKEN);
01195             XRCCTRL(*this, "IDC_ITEMS_VARIA", wxCheckBox)->SetValue(state);
01196             break;
01197             
01198         case ENERGYTANK_BS3:
01199             XRCCTRL(*this, "IDC_ITEMS_ET_BS3", wxCheckBox)->SetValue(state);
01200             break;
01201             
01202         case MISSILE_NF1:
01203             XRCCTRL(*this, "IDC_ITEMS_MC_NF1", wxCheckBox)->SetValue(state);
01204             break;
01205             
01206         case MISSILE_NF2:
01207             XRCCTRL(*this, "IDC_ITEMS_MC_NF2", wxCheckBox)->SetValue(state);
01208             break;
01209             
01210         case REDDOOR_NF_ICEBEAM:
01211             XRCCTRL(*this, "IDC_MISC_DOORS_NF_ICEBEAM",
01212                     wxCheckBox)->SetValue(state);
01213             break;
01214             
01215         case MISSILE_NF3:
01216             XRCCTRL(*this, "IDC_ITEMS_MC_NF3", wxCheckBox)->SetValue(state);
01217             break;
01218             
01219         case MISSILE_NF4:
01220             XRCCTRL(*this, "IDC_ITEMS_MC_NF4", wxCheckBox)->SetValue(state);
01221             break;
01222             
01223         case MISSILE_NF5:
01224             XRCCTRL(*this, "IDC_ITEMS_MC_NF5", wxCheckBox)->SetValue(state);
01225             break;
01226             
01227         case MISSILE_NF6:
01228             XRCCTRL(*this, "IDC_ITEMS_MC_NF6", wxCheckBox)->SetValue(state);
01229             break;
01230             
01231         case MISSILE_NF7:
01232             XRCCTRL(*this, "IDC_ITEMS_MC_NF7", wxCheckBox)->SetValue(state);
01233             break;
01234             
01235         case MISSILE_NF8:
01236             XRCCTRL(*this, "IDC_ITEMS_MC_NF8", wxCheckBox)->SetValue(state);
01237             break;
01238             
01239         case MISSILE_NF9:
01240             XRCCTRL(*this, "IDC_ITEMS_MC_NF9", wxCheckBox)->SetValue(state);
01241             break;
01242             
01243         case REDDOOR_NF_HIGHJUMPBOOTS:
01244             XRCCTRL(*this, "IDC_MISC_DOORS_NF_HIGHJUMPBOOTS",
01245                     wxCheckBox)->SetValue(state);
01246             break;
01247             
01248         case HIGHJUMPBOOTS:
01249         case HIGHJUMPBOOTS_TAKEN:
01250             // High Jump Boots not valid unless both taken and equipped
01251             state = password.getBit(HIGHJUMPBOOTS) &&
01252                     password.getBit(HIGHJUMPBOOTS_TAKEN);
01253             XRCCTRL(*this, "IDC_ITEMS_HIGHJUMPBOOTS",
01254                     wxCheckBox)->SetValue(state);
01255             break;
01256             
01257         case REDDOOR_NF_SCREWATTACK:
01258             XRCCTRL(*this, "IDC_MISC_DOORS_NF_SCREWATTACK",
01259                     wxCheckBox)->SetValue(state);
01260             break;
01261             
01262         case SCREWATTACK:
01263         case SCREWATTACK_TAKEN:
01264             // Screw Attack not valid unless both taken and equipped
01265             state = password.getBit(SCREWATTACK) &&
01266                     password.getBit(SCREWATTACK_TAKEN);
01267             XRCCTRL(*this, "IDC_ITEMS_SCREWATTACK",
01268                     wxCheckBox)->SetValue(state);
01269             break;
01270             
01271         case MISSILE_NF10:
01272             XRCCTRL(*this, "IDC_ITEMS_MC_NF10", wxCheckBox)->SetValue(state);
01273             break;
01274             
01275         case MISSILE_NF11:
01276             XRCCTRL(*this, "IDC_ITEMS_MC_NF11", wxCheckBox)->SetValue(state);
01277             break;
01278             
01279         case REDDOOR_NF_WAVEBEAM:
01280             XRCCTRL(*this, "IDC_MISC_DOORS_NF_WAVEBEAM",
01281                     wxCheckBox)->SetValue(state);
01282             break;
01283             
01284         case ENERGYTANK_NF:
01285             XRCCTRL(*this, "IDC_ITEMS_ET_NF", wxCheckBox)->SetValue(state);
01286             break;
01287             
01288         case MISSILE_NF12:
01289             XRCCTRL(*this, "IDC_ITEMS_MC_NF12", wxCheckBox)->SetValue(state);
01290             break;
01291             
01292         case REDDOOR_KL1:
01293             XRCCTRL(*this, "IDC_MISC_DOORS_KL1", wxCheckBox)->SetValue(state);
01294             break;
01295             
01296         case MISSILE_KL1:
01297             XRCCTRL(*this, "IDC_ITEMS_MC_KL1", wxCheckBox)->SetValue(state);
01298             break;
01299             
01300         case MISSILE_KL2:
01301             XRCCTRL(*this, "IDC_ITEMS_MC_KL2", wxCheckBox)->SetValue(state);
01302             break;
01303             
01304         case REDDOOR_KL2:
01305             XRCCTRL(*this, "IDC_MISC_DOORS_KL2", wxCheckBox)->SetValue(state);
01306             break;
01307             
01308         case ENERGYTANK_KL:
01309             XRCCTRL(*this, "IDC_ITEMS_ET_KL", wxCheckBox)->SetValue(state);
01310             break;
01311             
01312         case REDDOOR_KL3:
01313             XRCCTRL(*this, "IDC_MISC_DOORS_KL3", wxCheckBox)->SetValue(state);
01314             break;
01315             
01316         case REDDOOR_KL4:
01317             XRCCTRL(*this, "IDC_MISC_DOORS_KL4", wxCheckBox)->SetValue(state);
01318             break;
01319             
01320         case MISSILE_KL3:
01321             XRCCTRL(*this, "IDC_ITEMS_MC_KL3", wxCheckBox)->SetValue(state);
01322             break;
01323             
01324         case MISSILE_KL4:
01325             XRCCTRL(*this, "IDC_ITEMS_MC_KL4", wxCheckBox)->SetValue(state);
01326             break;
01327             
01328         case REDDOOR_KL_KRAID:
01329             XRCCTRL(*this, "IDC_MISC_DOORS_KL_KRAID",
01330                     wxCheckBox)->SetValue(state);
01331             break;
01332             
01333         case ENERGYTANK_KL_KRAID:
01334             XRCCTRL(*this, "IDC_ITEMS_ET_KL_KRAID",
01335                     wxCheckBox)->SetValue(state);
01336             break;
01337             
01338         case MISSILE_RL1:
01339             XRCCTRL(*this, "IDC_ITEMS_MC_RL1", wxCheckBox)->SetValue(state);
01340             break;
01341             
01342         case REDDOOR_RL:
01343             XRCCTRL(*this, "IDC_MISC_DOORS_RL", wxCheckBox)->SetValue(state);
01344             break;
01345             
01346         case ENERGYTANK_RL:
01347             XRCCTRL(*this, "IDC_ITEMS_ET_RL", wxCheckBox)->SetValue(state);
01348             break;
01349             
01350         case MISSILE_RL2:
01351             XRCCTRL(*this, "IDC_ITEMS_MC_RL2", wxCheckBox)->SetValue(state);
01352             break;
01353             
01354         case REDDOOR_RL_RIDLEY:
01355             XRCCTRL(*this, "IDC_MISC_DOORS_RL_RIDLEY",
01356                     wxCheckBox)->SetValue(state);
01357             break;
01358             
01359         case ENERGYTANK_RL_RIDLEY:
01360             XRCCTRL(*this, "IDC_ITEMS_ET_RL_RIDLEY",
01361                     wxCheckBox)->SetValue(state);
01362             break;
01363             
01364         case MISSILE_RL3:
01365             XRCCTRL(*this, "IDC_ITEMS_MC_RL3", wxCheckBox)->SetValue(state);
01366             break;
01367             
01368         case REDDOOR_T1:
01369             XRCCTRL(*this, "IDC_MISC_DOORS_T1", wxCheckBox)->SetValue(state);
01370             break;
01371             
01372         case REDDOOR_T2:
01373             XRCCTRL(*this, "IDC_MISC_DOORS_T2", wxCheckBox)->SetValue(state);
01374             break;
01375             
01376         case REDDOOR_T3:
01377             XRCCTRL(*this, "IDC_MISC_DOORS_T3", wxCheckBox)->SetValue(state);
01378             break;
01379             
01380         case ZEBETITE1:
01381             XRCCTRL(*this, "IDC_MISC_ZEBETITE1", wxCheckBox)->SetValue(state);
01382             break;
01383             
01384         case ZEBETITE2:
01385             XRCCTRL(*this, "IDC_MISC_ZEBETITE2", wxCheckBox)->SetValue(state);
01386             break;
01387             
01388         case ZEBETITE3:
01389             XRCCTRL(*this, "IDC_MISC_ZEBETITE3", wxCheckBox)->SetValue(state);
01390             break;
01391             
01392         case ZEBETITE4:
01393             XRCCTRL(*this, "IDC_MISC_ZEBETITE4", wxCheckBox)->SetValue(state);
01394             break;
01395             
01396         case ZEBETITE5:
01397             XRCCTRL(*this, "IDC_MISC_ZEBETITE5", wxCheckBox)->SetValue(state);
01398             break;
01399             
01400         case MOTHERBRAIN:
01401             XRCCTRL(*this, "IDC_MISC_BOSS_MOTHERBRAIN",
01402                     wxCheckBox)->SetValue(state);
01403             break;
01404             
01405         case START_NF:
01406         case START_KL:
01407         case START_RL:
01408             updateStartLocation();
01409             break;
01410             
01411         case RESET:
01412             if (state) {
01413                 wxMessageBox(wxT("This bit will produce an invalid password."),
01414                              wxT("Warning: Invalid Password"),
01415                              wxICON_EXCLAMATION | wxOK);
01416             }
01417             
01418             break;
01419         
01420         case SWIMSUIT:
01421             XRCCTRL(*this, "IDRB_MISC_ARMOR",
01422                     wxRadioBox)->SetSelection(state ? 1 : 0);
01423             break;
01424 
01425         case LONGBEAM:
01426             XRCCTRL(*this, "IDC_ITEMS_LONGBEAM", wxCheckBox)->SetValue(state);
01427             break;
01428             
01429         case WAVEBEAM:
01430             XRCCTRL(*this, "IDC_ITEMS_WAVEBEAM", wxCheckBox)->SetValue(state);
01431             break;
01432             
01433         case ICEBEAM:
01434             XRCCTRL(*this, "IDC_ITEMS_ICEBEAM", wxCheckBox)->SetValue(state);
01435             break;
01436             
01437         case MISSILES:
01438         case MISSILES + 1:
01439         case MISSILES + 2:
01440         case MISSILES + 3:
01441         case MISSILES + 4:
01442         case MISSILES + 5:
01443         case MISSILES + 6:
01444         case MISSILES + 7:
01445             ignoreTextEvent = true;
01446             XRCCTRL(*this, "IDSC_ITEMS_MISSILES",
01447                     wxSpinCtrl)->SetValue(password.getMissiles());
01448             ignoreTextEvent = false;
01449             
01450             break;
01451         
01452         case GAMETIME: 
01453         case GAMETIME + 1:
01454         case GAMETIME + 2:
01455         case GAMETIME + 3:
01456         case GAMETIME + 4:
01457         case GAMETIME + 5:
01458         case GAMETIME + 6:
01459         case GAMETIME + 7:
01460         case GAMETIME + 8:
01461         case GAMETIME + 9:
01462         case GAMETIME + 10:
01463         case GAMETIME + 11:
01464         case GAMETIME + 12:
01465         case GAMETIME + 13:
01466         case GAMETIME + 14:
01467         case GAMETIME + 15:
01468         case GAMETIME + 16:
01469         case GAMETIME + 17:
01470         case GAMETIME + 18:
01471         case GAMETIME + 19:
01472         case GAMETIME + 20:
01473         case GAMETIME + 21:
01474         case GAMETIME + 22:
01475         case GAMETIME + 23:
01476         case GAMETIME + 24:
01477         case GAMETIME + 25:
01478         case GAMETIME + 26:
01479         case GAMETIME + 27:
01480         case GAMETIME + 28:
01481         case GAMETIME + 29:
01482         case GAMETIME + 30:
01483         case GAMETIME + 31:
01484             {
01485                 unsigned long value =
01486                     static_cast<unsigned long>(password.getGameTime());
01487                 
01488                 ignoreTextEvent = true;
01489                 XRCCTRL(*this, "IDT_MISC_GAMETIME",
01490                         wxTextCtrl)->SetValue(wxString::Format(wxT("%lu"),
01491                                               value));
01492                 ignoreTextEvent = false;
01493                 
01494                 // update the real time value, too
01495                 updateRealTime();
01496             }
01497             
01498             break;
01499             
01500         case RIDLEY:
01501             XRCCTRL(*this, "IDC_MISC_BOSS_RIDLEY", wxCheckBox)->SetValue(state);
01502             break;
01503             
01504         case RIDLEY_STATUE:
01505             XRCCTRL(*this, "IDC_MISC_STATUE_RIDLEY",
01506                     wxCheckBox)->SetValue(state);
01507             break;
01508             
01509         case KRAID:
01510             XRCCTRL(*this, "IDC_MISC_BOSS_KRAID", wxCheckBox)->SetValue(state);
01511             break;
01512             
01513         case KRAID_STATUE:
01514             XRCCTRL(*this, "IDC_MISC_STATUE_KRAID",
01515                     wxCheckBox)->SetValue(state);
01516             break;
01517             
01518         default:
01519             // one of the unknowns -- do nothing
01520             break;
01521     }
01522     
01523     updatePasswordText();
01524 }
01525 
01526 void MPGFrame::onShiftTextChanged(wxCommandEvent &) {
01527     if (ignoreTextEvent) {
01528         return;
01529     }
01530     
01531     wxSpinCtrl *ctrl = XRCCTRL(*this, "IDSC_RAW_SHIFT", wxSpinCtrl);
01532     unsigned char value = static_cast<unsigned char>(ctrl->GetValue());
01533     
01534     password.setShift(value);
01535     
01536     updatePasswordText();
01537 }
01538 
01539 void MPGFrame::onStartLocationChanged(wxCommandEvent &event) {
01540     wxRadioBox *ptr = dynamic_cast<wxRadioBox *>(event.GetEventObject());
01541     int location = ptr->GetSelection();
01542     bool nf, kl, rl;
01543     
01544     switch (location) {
01545         case 0:
01546             // Brinstar
01547             nf = false;
01548             kl = false;
01549             rl = false;
01550             break;
01551             
01552         case 1:
01553             // Kraid's Lair
01554             nf = false;
01555             kl = true;
01556             rl = false;
01557             break;
01558             
01559         case 2:
01560             // Norfair
01561             nf = true;
01562             kl = false;
01563             rl = false;
01564             break;
01565             
01566         case 3:
01567             // Ridley's Lair
01568             nf = false;
01569             kl = false;
01570             rl = true;
01571             break;
01572             
01573         default:
01574             // Tourian
01575             nf = true;
01576             kl = true;
01577             rl = false;
01578             break;
01579     };
01580     
01581     wxCheckListBox *ctrl = XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox);
01582     ctrl->Check(START_NF, nf);
01583     ctrl->Check(START_KL, kl);
01584     ctrl->Check(START_RL, rl);
01585     
01586     password.setBit(START_NF, nf);
01587     password.setBit(START_KL, kl);
01588     password.setBit(START_RL, rl);
01589     
01590     updatePasswordText();
01591 }
01592 
01593 void MPGFrame::onStatueChanged(wxCommandEvent &event) {
01594     int id = event.GetId();
01595     bool state = event.IsChecked();
01596     int bit;
01597     
01598     if (id == XRCID("IDC_MISC_STATUE_KRAID")) {
01599         bit = KRAID_STATUE;
01600     } else {
01601         bit = RIDLEY_STATUE;
01602     }
01603     
01604     XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox)->Check(bit, state);
01605     password.setBit(bit, state);
01606     
01607     updatePasswordText();
01608 }
01609 
01610 void MPGFrame::onZebetiteChanged(wxCommandEvent &event) {
01611     int id = event.GetId();
01612     bool state = event.IsChecked();
01613     int bit;
01614     
01615     if (id == XRCID("IDC_MISC_ZEBETITE1")) {
01616         bit = ZEBETITE1;
01617     } else if (id == XRCID("IDC_MISC_ZEBETITE2")) {
01618         bit = ZEBETITE2;
01619     } else if (id == XRCID("IDC_MISC_ZEBETITE3")) {
01620         bit = ZEBETITE3;
01621     } else if (id == XRCID("IDC_MISC_ZEBETITE4")) {
01622         bit = ZEBETITE4;
01623     } else {
01624         bit = ZEBETITE5;
01625     }
01626     
01627     XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox)->Check(bit, state);
01628     password.setBit(bit, state);
01629     
01630     updatePasswordText();
01631 }
01632 
01633 IMPLEMENT_CLASS(MPGFrame, wxFrame)
01634 

Generated on Fri Sep 30 04:56:20 2005 for Metroid Password Generator by  doxygen 1.4.2