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

Generated on Sun Oct 2 01:02:58 2005 for Metroid Password Generator by  doxygen 1.4.2