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

Generated on Thu Sep 29 02:09:38 2005 for Metroid Password Generator by  doxygen 1.4.2