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.45 2005/10/04 02:32:56 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     
00769     if (id == XRCID("IDC_ITEMS_MARUMARI")) {
00770         b1 = MARUMARI;
00771         b2 = MARUMARI_TAKEN;
00772     } else if (id == XRCID("IDC_ITEMS_LONGBEAM")) {
00773         b1 = LONGBEAM;
00774     } else if (id == XRCID("IDC_ITEMS_WAVEBEAM")) {
00775         b1 = WAVEBEAM;
00776     } else if (id == XRCID("IDC_ITEMS_ICEBEAM")) {
00777         b1 = ICEBEAM;
00778     } else if (id == XRCID("IDC_ITEMS_BOMBS")) {
00779         b1 = BOMBS;
00780         b2 = BOMBS_TAKEN;
00781     } else if (id == XRCID("IDC_ITEMS_HIGHJUMPBOOTS")) {
00782         b1 = HIGHJUMPBOOTS;
00783         b2 = HIGHJUMPBOOTS_TAKEN;
00784     } else if (id == XRCID("IDC_ITEMS_SCREWATTACK")) {
00785         b1 = SCREWATTACK;
00786         b2 = SCREWATTACK_TAKEN;
00787     } else {
00788         b1 = VARIA;
00789         b2 = VARIA_TAKEN;
00790     }
00791     
00792     wxCheckListBox *ctrl = XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox);
00793     ctrl->Check(b1, state);
00794     password.setBit(b1, state);
00795     
00796     if (b2 != -1) {
00797         ctrl->Check(b2, state);
00798         password.setBit(b2, state);
00799     }
00800     
00801     updatePasswordText();
00802     warnOnDebugPassword(password.getEncoded());
00803 }
00804 
00805 void MPGFrame::onMissileContainerChanged(wxCommandEvent &event) {
00806     int id = event.GetId();
00807     bool state = event.IsChecked();
00808     int bit;
00809     
00810     if (id == XRCID("IDC_ITEMS_MC_BS1")) {
00811         bit = MISSILE_BS1;
00812     } else if (id == XRCID("IDC_ITEMS_MC_BS2")) {
00813         bit = MISSILE_BS2;
00814     } else if (id == XRCID("IDC_ITEMS_MC_KL1")) {
00815         bit = MISSILE_KL1;
00816     } else if (id == XRCID("IDC_ITEMS_MC_KL2")) {
00817         bit = MISSILE_KL2;
00818     } else if (id == XRCID("IDC_ITEMS_MC_KL3")) {
00819         bit = MISSILE_KL3;
00820     } else if (id == XRCID("IDC_ITEMS_MC_KL4")) {
00821         bit = MISSILE_KL4;
00822     } else if (id == XRCID("IDC_ITEMS_MC_NF1")) {
00823         bit = MISSILE_NF1;
00824     } else if (id == XRCID("IDC_ITEMS_MC_NF2")) {
00825         bit = MISSILE_NF2;
00826     } else if (id == XRCID("IDC_ITEMS_MC_NF3")) {
00827         bit = MISSILE_NF3;
00828     } else if (id == XRCID("IDC_ITEMS_MC_NF4")) {
00829         bit = MISSILE_NF4;
00830     } else if (id == XRCID("IDC_ITEMS_MC_NF5")) {
00831         bit = MISSILE_NF5;
00832     } else if (id == XRCID("IDC_ITEMS_MC_NF6")) {
00833         bit = MISSILE_NF6;
00834     } else if (id == XRCID("IDC_ITEMS_MC_NF7")) {
00835         bit = MISSILE_NF7;
00836     } else if (id == XRCID("IDC_ITEMS_MC_NF8")) {
00837         bit = MISSILE_NF8;
00838     } else if (id == XRCID("IDC_ITEMS_MC_NF9")) {
00839         bit = MISSILE_NF9;
00840     } else if (id == XRCID("IDC_ITEMS_MC_NF10")) {
00841         bit = MISSILE_NF10;
00842     } else if (id == XRCID("IDC_ITEMS_MC_NF11")) {
00843         bit = MISSILE_NF11;
00844     } else if (id == XRCID("IDC_ITEMS_MC_NF12")) {
00845         bit = MISSILE_NF12;
00846     } else if (id == XRCID("IDC_ITEMS_MC_RL1")) {
00847         bit = MISSILE_RL1;
00848     } else if (id == XRCID("IDC_ITEMS_MC_RL2")) {
00849         bit = MISSILE_RL2;
00850     } else {
00851         bit = MISSILE_RL3;
00852     }
00853     
00854     XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox)->Check(bit, state);
00855     password.setBit(bit, state);
00856     
00857     updatePasswordText();
00858     warnOnDebugPassword(password.getEncoded());
00859 }
00860 
00861 void MPGFrame::onMissilesSpinner(wxSpinEvent &event) {
00862     ignoreTextEvent = true;
00863     XRCCTRL(*this, "IDT_ITEMS_MISSILES",
00864             wxTextCtrl)->SetValue(wxString::Format(wxT("%d"),
00865                                                    event.GetPosition()));
00866     ignoreTextEvent = false;
00867     
00868     unsigned char missiles = static_cast<unsigned char>(event.GetPosition());
00869     password.setMissiles(missiles);
00870     
00871     updateRawMissiles(missiles);
00872     updatePasswordText();
00873     warnOnDebugPassword(password.getEncoded());
00874 }
00875 
00876 void MPGFrame::onMissilesTextChanged(wxCommandEvent &event) {
00877     if (ignoreTextEvent) {
00878         return;
00879     }
00880     
00881     wxString text = event.GetString();
00882     unsigned char missiles;
00883     unsigned long value;
00884     
00885     if (text.ToULong(&value)) {
00886         if (value > 255) {
00887             missiles = 255;
00888         } else {
00889             missiles = static_cast<unsigned char>(value);
00890         }
00891         
00892         password.setMissiles(missiles);
00893         
00894         updateRawMissiles(missiles);
00895         updatePasswordText();
00896         warnOnDebugPassword(password.getEncoded());
00897         
00898         ignoreTextEvent = true;
00899         XRCCTRL(*this, "IDSB_ITEMS_MISSILES", wxSpinButton)->SetValue(missiles);
00900         ignoreTextEvent = false;
00901     }
00902 }
00903 
00904 void MPGFrame::onPasswordChanged(wxCommandEvent &event) {
00905     if (ignoreTextEvent) {
00906         return;
00907     }
00908     
00909     wxTextCtrl *ctrl = dynamic_cast<wxTextCtrl *>(event.GetEventObject());
00910     wxString text = ctrl->GetValue();
00911     
00912     warnOnDebugPassword(text);
00913                      
00914     try {
00915         password = Password(text);
00916         
00917         updatePasswordText(false);
00918         updateControls();
00919     } catch (InvalidPasswordException &e) {
00920         if (e.getError() == INVALID_CHECKSUM) {
00921             fixChecksumButton->Enable(true);
00922         }
00923     }
00924 }
00925 
00926 void MPGFrame::onPasswordDebugPassword(wxCommandEvent &) {  
00927     wxMessageBox(wxT("The debug password is NARPAS SWORD0 000000 000000\n"
00928                      "It is hard coded and cannot be edited."),
00929                  wxT("Debug Password"), wxICON_INFORMATION | wxOK);
00930 }
00931 
00932 void MPGFrame::onPasswordEnding(wxCommandEvent &event) {
00933     wxTextCtrl *ctrl = XRCCTRL(*this, "IDT_MISC_GAMETIME", wxTextCtrl);
00934     int id = event.GetId();
00935     
00936     if (id == XRCID("IDM_PASSWORD_ENDING1")) {
00937         ctrl->SetValue(wxT("0"));
00938     } else if (id == XRCID("IDM_PASSWORD_ENDING2")) {
00939         ctrl->SetValue(wxT("1024"));
00940     } else if (id == XRCID("IDM_PASSWORD_ENDING3")) {
00941         ctrl->SetValue(wxT("2560"));
00942     } else if (id == XRCID("IDM_PASSWORD_ENDING4")) {
00943         ctrl->SetValue(wxT("5632"));
00944     } else {
00945         ctrl->SetValue(wxT("31232"));
00946     }
00947 }
00948 
00949 void MPGFrame::onPasswordGiveBosses(wxCommandEvent &) {
00950     password.setBit(KRAID);
00951     password.setBit(RIDLEY);
00952     password.setBit(MOTHERBRAIN);
00953     
00954     updatePasswordText();
00955     updateControls();
00956 }
00957 
00958 void MPGFrame::onPasswordGiveDoors(wxCommandEvent &) {
00959     password.setBit(REDDOOR_BS_LONGBEAM);
00960     password.setBit(REDDOOR_BS_TOURIANBRIDGE);
00961     password.setBit(REDDOOR_BS_BOMBS);
00962     password.setBit(REDDOOR_BS_ICEBEAM);
00963     password.setBit(REDDOOR_BS_VARIA);
00964     
00965     password.setBit(REDDOOR_KL1);
00966     password.setBit(REDDOOR_KL2);
00967     password.setBit(REDDOOR_KL3);
00968     password.setBit(REDDOOR_KL4);
00969     password.setBit(REDDOOR_KL_KRAID);
00970     
00971     password.setBit(REDDOOR_NF_HIGHJUMPBOOTS);
00972     password.setBit(REDDOOR_NF_SCREWATTACK);
00973     password.setBit(REDDOOR_NF_WAVEBEAM);
00974     password.setBit(REDDOOR_NF_ICEBEAM);
00975     
00976     password.setBit(REDDOOR_RL);
00977     password.setBit(REDDOOR_RL_RIDLEY);
00978     
00979     password.setBit(REDDOOR_T1);
00980     password.setBit(REDDOOR_T2);
00981     password.setBit(REDDOOR_T3);
00982     
00983     updatePasswordText();
00984     updateControls();
00985 }
00986 
00987 void MPGFrame::onPasswordGiveEnergyTanks(wxCommandEvent &) {
00988     password.setBit(ENERGYTANK_BS1);
00989     password.setBit(ENERGYTANK_BS2);
00990     password.setBit(ENERGYTANK_BS3);
00991     
00992     password.setBit(ENERGYTANK_NF);
00993     
00994     password.setBit(ENERGYTANK_KL);
00995     password.setBit(ENERGYTANK_KL_KRAID);
00996     
00997     password.setBit(ENERGYTANK_RL);
00998     password.setBit(ENERGYTANK_RL_RIDLEY);
00999     
01000     updatePasswordText();
01001     updateControls();
01002 }
01003 
01004 void MPGFrame::onPasswordGiveItems(wxCommandEvent &) {
01005     password.setBit(MARUMARI);
01006     password.setBit(MARUMARI_TAKEN);
01007     
01008     password.setBit(LONGBEAM);
01009     password.setBit(WAVEBEAM);
01010     password.setBit(ICEBEAM);
01011     
01012     password.setBit(BOMBS);
01013     password.setBit(BOMBS_TAKEN);
01014     
01015     password.setBit(HIGHJUMPBOOTS);
01016     password.setBit(HIGHJUMPBOOTS_TAKEN);
01017     
01018     password.setBit(SCREWATTACK);
01019     password.setBit(SCREWATTACK_TAKEN);
01020     
01021     password.setBit(VARIA);
01022     password.setBit(VARIA_TAKEN);
01023     
01024     updatePasswordText();
01025     updateControls();
01026 }
01027 
01028 void MPGFrame::onPasswordGiveMissiles(wxCommandEvent &) {
01029     int count = 0;
01030     
01031     if (password.getBit(MISSILE_BS1)) ++count;
01032     if (password.getBit(MISSILE_BS2)) ++count;
01033     if (password.getBit(MISSILE_KL1)) ++count;
01034     if (password.getBit(MISSILE_KL2)) ++count;
01035     if (password.getBit(MISSILE_KL3)) ++count;
01036     if (password.getBit(MISSILE_KL4)) ++count;
01037     if (password.getBit(MISSILE_NF1)) ++count;
01038     if (password.getBit(MISSILE_NF2)) ++count;
01039     if (password.getBit(MISSILE_NF3)) ++count;
01040     if (password.getBit(MISSILE_NF4)) ++count;
01041     if (password.getBit(MISSILE_NF5)) ++count;
01042     if (password.getBit(MISSILE_NF6)) ++count;
01043     if (password.getBit(MISSILE_NF7)) ++count;
01044     if (password.getBit(MISSILE_NF8)) ++count;
01045     if (password.getBit(MISSILE_NF9)) ++count;
01046     if (password.getBit(MISSILE_NF10)) ++count;
01047     if (password.getBit(MISSILE_NF11)) ++count;
01048     if (password.getBit(MISSILE_NF12)) ++count;
01049     if (password.getBit(MISSILE_RL1)) ++count;
01050     if (password.getBit(MISSILE_RL2)) ++count;
01051     if (password.getBit(MISSILE_RL3)) ++count;
01052     if (password.getBit(KRAID) || password.getBit(KRAID_STATUE)) count += 15;
01053     if (password.getBit(RIDLEY) || password.getBit(RIDLEY_STATUE)) count += 15;
01054     
01055     XRCCTRL(*this, "IDT_ITEMS_MISSILES",
01056             wxTextCtrl)->SetValue(wxString::Format(wxT("%d"), count *= 5));
01057 }
01058 
01059 void MPGFrame::onPasswordGiveMissileContainers(wxCommandEvent &) {
01060     password.setBit(MISSILE_BS1);
01061     password.setBit(MISSILE_BS2);
01062     
01063     password.setBit(MISSILE_KL1);
01064     password.setBit(MISSILE_KL2);
01065     password.setBit(MISSILE_KL3);
01066     password.setBit(MISSILE_KL4);
01067     
01068     password.setBit(MISSILE_NF1);
01069     password.setBit(MISSILE_NF2);
01070     password.setBit(MISSILE_NF3);
01071     password.setBit(MISSILE_NF4);
01072     password.setBit(MISSILE_NF5);
01073     password.setBit(MISSILE_NF6);
01074     password.setBit(MISSILE_NF7);
01075     password.setBit(MISSILE_NF8);
01076     password.setBit(MISSILE_NF9);
01077     password.setBit(MISSILE_NF10);
01078     password.setBit(MISSILE_NF11);
01079     password.setBit(MISSILE_NF12);
01080     
01081     password.setBit(MISSILE_RL1);
01082     password.setBit(MISSILE_RL2);
01083     password.setBit(MISSILE_RL3);
01084     
01085     updatePasswordText();
01086     updateControls();
01087 }
01088 
01089 void MPGFrame::onPasswordGiveStatues(wxCommandEvent &) {
01090     password.setBit(KRAID_STATUE);
01091     password.setBit(RIDLEY_STATUE);
01092     
01093     updatePasswordText();
01094     updateControls();
01095 }
01096 
01097 void MPGFrame::onPasswordGiveZebetites(wxCommandEvent &) {
01098     password.setBit(ZEBETITE1);
01099     password.setBit(ZEBETITE2);
01100     password.setBit(ZEBETITE3);
01101     password.setBit(ZEBETITE4);
01102     password.setBit(ZEBETITE5);
01103     
01104     updatePasswordText();
01105     updateControls();
01106 }
01107 
01108 void MPGFrame::onPasswordPerfectGame(wxCommandEvent &) {
01109     password = Password();
01110     
01111     // Start Location
01112     password.setBit(START_NF);
01113     password.setBit(START_KL);
01114     
01115     // Statues
01116     password.setBit(KRAID_STATUE);
01117     password.setBit(RIDLEY_STATUE);
01118     
01119     // Swimsuit Samus
01120     password.setBit(SWIMSUIT);
01121     
01122     // Bosses
01123     password.setBit(KRAID);
01124     password.setBit(RIDLEY);
01125     
01126     // Items
01127     wxCommandEvent event1(wxEVT_COMMAND_MENU_SELECTED,
01128                           XRCID("IDM_PASSWORD_GIVE_ITEMS"));
01129     GetEventHandler()->ProcessEvent(event1);
01130     
01131     // remove the wave beam
01132     password.setBit(WAVEBEAM, false);
01133     
01134     // Missile Containers
01135     wxCommandEvent event2(wxEVT_COMMAND_MENU_SELECTED,
01136                           XRCID("IDM_PASSWORD_GIVE_MC"));
01137     GetEventHandler()->ProcessEvent(event2);
01138     
01139     // Missiles
01140     wxCommandEvent event3(wxEVT_COMMAND_MENU_SELECTED,
01141                           XRCID("IDM_PASSWORD_GIVE_MISSILES"));
01142     GetEventHandler()->ProcessEvent(event3);
01143     
01144     // Energy Tanks
01145     wxCommandEvent event4(wxEVT_COMMAND_MENU_SELECTED,
01146                           XRCID("IDM_PASSWORD_GIVE_ET"));
01147     GetEventHandler()->ProcessEvent(event4);
01148     
01149     // Red & Yellow Doors
01150     wxCommandEvent event5(wxEVT_COMMAND_MENU_SELECTED,
01151                           XRCID("IDM_PASSWORD_GIVE_DOORS"));
01152     GetEventHandler()->ProcessEvent(event5);
01153     
01154     // Zebetites
01155     wxCommandEvent event6(wxEVT_COMMAND_MENU_SELECTED,
01156                           XRCID("IDM_PASSWORD_GIVE_ZEBETITES"));
01157     GetEventHandler()->ProcessEvent(event6);
01158 }
01159 
01160 void MPGFrame::onPasswordReset(wxCommandEvent &) {
01161     int answer = wxMessageBox(wxT("Really Reset Password?"),
01162                               wxT("Confirm: Reset Password"),
01163                               wxYES_NO | wxICON_QUESTION);
01164                               
01165     if (answer == wxYES) {
01166         password = Password();
01167         
01168         updatePasswordText();
01169         updateControls();
01170     }
01171 }
01172 
01173 void MPGFrame::onRawBitChanged(wxCommandEvent &event) {
01174     wxCheckListBox *ptr = 
01175         dynamic_cast<wxCheckListBox *>(event.GetEventObject());
01176     int bit = event.GetSelection();
01177     bool state = ptr->IsChecked(bit);
01178     
01179     password.setBit(bit, state);
01180     
01181     switch (bit) {
01182         case MARUMARI:
01183         case MARUMARI_TAKEN:
01184             // Maru Mari not valid unless it's both taken and equipped
01185             state = password.getBit(MARUMARI) &&
01186                     password.getBit(MARUMARI_TAKEN);
01187             XRCCTRL(*this, "IDC_ITEMS_MARUMARI", wxCheckBox)->SetValue(state);
01188             break;
01189             
01190         case MISSILE_BS1:
01191             XRCCTRL(*this, "IDC_ITEMS_MC_BS1", wxCheckBox)->SetValue(state);
01192             break;
01193             
01194         case REDDOOR_BS_LONGBEAM:
01195             XRCCTRL(*this, "IDC_MISC_DOORS_BS_LONGBEAM",
01196                     wxCheckBox)->SetValue(state);
01197             break;
01198             
01199         case REDDOOR_BS_TOURIANBRIDGE:
01200             XRCCTRL(*this, "IDC_MISC_DOORS_BS_TOURIANBRIDGE",
01201                     wxCheckBox)->SetValue(state);
01202             break;
01203             
01204         case ENERGYTANK_BS1:
01205             XRCCTRL(*this, "IDC_ITEMS_ET_BS1", wxCheckBox)->SetValue(state);
01206             break;
01207             
01208         case REDDOOR_BS_BOMBS:
01209             XRCCTRL(*this, "IDC_MISC_DOORS_BS_BOMBS",
01210                     wxCheckBox)->SetValue(state);
01211             break;
01212             
01213         case BOMBS:
01214         case BOMBS_TAKEN:
01215             // Bombs not valid unless it's both taken and equipped
01216             state = password.getBit(BOMBS) && password.getBit(BOMBS_TAKEN);
01217             XRCCTRL(*this, "IDC_ITEMS_BOMBS", wxCheckBox)->SetValue(state);
01218             break;
01219             
01220         case REDDOOR_BS_ICEBEAM:
01221             XRCCTRL(*this, "IDC_MISC_DOORS_BS_ICEBEAM",
01222                     wxCheckBox)->SetValue(state);
01223             break;
01224             
01225         case MISSILE_BS2:
01226             XRCCTRL(*this, "IDC_ITEMS_MC_BS2", wxCheckBox)->SetValue(state);
01227             break;
01228             
01229         case ENERGYTANK_BS2:
01230             XRCCTRL(*this, "IDC_ITEMS_ET_BS2", wxCheckBox)->SetValue(state);
01231             break;
01232             
01233         case REDDOOR_BS_VARIA:
01234             XRCCTRL(*this, "IDC_MISC_DOORS_BS_VARIA",
01235                     wxCheckBox)->SetValue(state);
01236             break;
01237             
01238         case VARIA:
01239         case VARIA_TAKEN:
01240             // Varia not valid unless it's both taken and equipped
01241             state = password.getBit(VARIA) && password.getBit(VARIA_TAKEN);
01242             XRCCTRL(*this, "IDC_ITEMS_VARIA", wxCheckBox)->SetValue(state);
01243             break;
01244             
01245         case ENERGYTANK_BS3:
01246             XRCCTRL(*this, "IDC_ITEMS_ET_BS3", wxCheckBox)->SetValue(state);
01247             break;
01248             
01249         case MISSILE_NF1:
01250             XRCCTRL(*this, "IDC_ITEMS_MC_NF1", wxCheckBox)->SetValue(state);
01251             break;
01252             
01253         case MISSILE_NF2:
01254             XRCCTRL(*this, "IDC_ITEMS_MC_NF2", wxCheckBox)->SetValue(state);
01255             break;
01256             
01257         case REDDOOR_NF_ICEBEAM:
01258             XRCCTRL(*this, "IDC_MISC_DOORS_NF_ICEBEAM",
01259                     wxCheckBox)->SetValue(state);
01260             break;
01261             
01262         case MISSILE_NF3:
01263             XRCCTRL(*this, "IDC_ITEMS_MC_NF3", wxCheckBox)->SetValue(state);
01264             break;
01265             
01266         case MISSILE_NF4:
01267             XRCCTRL(*this, "IDC_ITEMS_MC_NF4", wxCheckBox)->SetValue(state);
01268             break;
01269             
01270         case MISSILE_NF5:
01271             XRCCTRL(*this, "IDC_ITEMS_MC_NF5", wxCheckBox)->SetValue(state);
01272             break;
01273             
01274         case MISSILE_NF6:
01275             XRCCTRL(*this, "IDC_ITEMS_MC_NF6", wxCheckBox)->SetValue(state);
01276             break;
01277             
01278         case MISSILE_NF7:
01279             XRCCTRL(*this, "IDC_ITEMS_MC_NF7", wxCheckBox)->SetValue(state);
01280             break;
01281             
01282         case MISSILE_NF8:
01283             XRCCTRL(*this, "IDC_ITEMS_MC_NF8", wxCheckBox)->SetValue(state);
01284             break;
01285             
01286         case MISSILE_NF9:
01287             XRCCTRL(*this, "IDC_ITEMS_MC_NF9", wxCheckBox)->SetValue(state);
01288             break;
01289             
01290         case REDDOOR_NF_HIGHJUMPBOOTS:
01291             XRCCTRL(*this, "IDC_MISC_DOORS_NF_HIGHJUMPBOOTS",
01292                     wxCheckBox)->SetValue(state);
01293             break;
01294             
01295         case HIGHJUMPBOOTS:
01296         case HIGHJUMPBOOTS_TAKEN:
01297             // High Jump Boots not valid unless both taken and equipped
01298             state = password.getBit(HIGHJUMPBOOTS) &&
01299                     password.getBit(HIGHJUMPBOOTS_TAKEN);
01300             XRCCTRL(*this, "IDC_ITEMS_HIGHJUMPBOOTS",
01301                     wxCheckBox)->SetValue(state);
01302             break;
01303             
01304         case REDDOOR_NF_SCREWATTACK:
01305             XRCCTRL(*this, "IDC_MISC_DOORS_NF_SCREWATTACK",
01306                     wxCheckBox)->SetValue(state);
01307             break;
01308             
01309         case SCREWATTACK:
01310         case SCREWATTACK_TAKEN:
01311             // Screw Attack not valid unless both taken and equipped
01312             state = password.getBit(SCREWATTACK) &&
01313                     password.getBit(SCREWATTACK_TAKEN);
01314             XRCCTRL(*this, "IDC_ITEMS_SCREWATTACK",
01315                     wxCheckBox)->SetValue(state);
01316             break;
01317             
01318         case MISSILE_NF10:
01319             XRCCTRL(*this, "IDC_ITEMS_MC_NF10", wxCheckBox)->SetValue(state);
01320             break;
01321             
01322         case MISSILE_NF11:
01323             XRCCTRL(*this, "IDC_ITEMS_MC_NF11", wxCheckBox)->SetValue(state);
01324             break;
01325             
01326         case REDDOOR_NF_WAVEBEAM:
01327             XRCCTRL(*this, "IDC_MISC_DOORS_NF_WAVEBEAM",
01328                     wxCheckBox)->SetValue(state);
01329             break;
01330             
01331         case ENERGYTANK_NF:
01332             XRCCTRL(*this, "IDC_ITEMS_ET_NF", wxCheckBox)->SetValue(state);
01333             break;
01334             
01335         case MISSILE_NF12:
01336             XRCCTRL(*this, "IDC_ITEMS_MC_NF12", wxCheckBox)->SetValue(state);
01337             break;
01338             
01339         case REDDOOR_KL1:
01340             XRCCTRL(*this, "IDC_MISC_DOORS_KL1", wxCheckBox)->SetValue(state);
01341             break;
01342             
01343         case MISSILE_KL1:
01344             XRCCTRL(*this, "IDC_ITEMS_MC_KL1", wxCheckBox)->SetValue(state);
01345             break;
01346             
01347         case MISSILE_KL2:
01348             XRCCTRL(*this, "IDC_ITEMS_MC_KL2", wxCheckBox)->SetValue(state);
01349             break;
01350             
01351         case REDDOOR_KL2:
01352             XRCCTRL(*this, "IDC_MISC_DOORS_KL2", wxCheckBox)->SetValue(state);
01353             break;
01354             
01355         case ENERGYTANK_KL:
01356             XRCCTRL(*this, "IDC_ITEMS_ET_KL", wxCheckBox)->SetValue(state);
01357             break;
01358             
01359         case REDDOOR_KL3:
01360             XRCCTRL(*this, "IDC_MISC_DOORS_KL3", wxCheckBox)->SetValue(state);
01361             break;
01362             
01363         case REDDOOR_KL4:
01364             XRCCTRL(*this, "IDC_MISC_DOORS_KL4", wxCheckBox)->SetValue(state);
01365             break;
01366             
01367         case MISSILE_KL3:
01368             XRCCTRL(*this, "IDC_ITEMS_MC_KL3", wxCheckBox)->SetValue(state);
01369             break;
01370             
01371         case MISSILE_KL4:
01372             XRCCTRL(*this, "IDC_ITEMS_MC_KL4", wxCheckBox)->SetValue(state);
01373             break;
01374             
01375         case REDDOOR_KL_KRAID:
01376             XRCCTRL(*this, "IDC_MISC_DOORS_KL_KRAID",
01377                     wxCheckBox)->SetValue(state);
01378             break;
01379             
01380         case ENERGYTANK_KL_KRAID:
01381             XRCCTRL(*this, "IDC_ITEMS_ET_KL_KRAID",
01382                     wxCheckBox)->SetValue(state);
01383             break;
01384             
01385         case MISSILE_RL1:
01386             XRCCTRL(*this, "IDC_ITEMS_MC_RL1", wxCheckBox)->SetValue(state);
01387             break;
01388             
01389         case REDDOOR_RL:
01390             XRCCTRL(*this, "IDC_MISC_DOORS_RL", wxCheckBox)->SetValue(state);
01391             break;
01392             
01393         case ENERGYTANK_RL:
01394             XRCCTRL(*this, "IDC_ITEMS_ET_RL", wxCheckBox)->SetValue(state);
01395             break;
01396             
01397         case MISSILE_RL2:
01398             XRCCTRL(*this, "IDC_ITEMS_MC_RL2", wxCheckBox)->SetValue(state);
01399             break;
01400             
01401         case REDDOOR_RL_RIDLEY:
01402             XRCCTRL(*this, "IDC_MISC_DOORS_RL_RIDLEY",
01403                     wxCheckBox)->SetValue(state);
01404             break;
01405             
01406         case ENERGYTANK_RL_RIDLEY:
01407             XRCCTRL(*this, "IDC_ITEMS_ET_RL_RIDLEY",
01408                     wxCheckBox)->SetValue(state);
01409             break;
01410             
01411         case MISSILE_RL3:
01412             XRCCTRL(*this, "IDC_ITEMS_MC_RL3", wxCheckBox)->SetValue(state);
01413             break;
01414             
01415         case REDDOOR_T1:
01416             XRCCTRL(*this, "IDC_MISC_DOORS_T1", wxCheckBox)->SetValue(state);
01417             break;
01418             
01419         case REDDOOR_T2:
01420             XRCCTRL(*this, "IDC_MISC_DOORS_T2", wxCheckBox)->SetValue(state);
01421             break;
01422             
01423         case REDDOOR_T3:
01424             XRCCTRL(*this, "IDC_MISC_DOORS_T3", wxCheckBox)->SetValue(state);
01425             break;
01426             
01427         case ZEBETITE1:
01428             XRCCTRL(*this, "IDC_MISC_ZEBETITE1", wxCheckBox)->SetValue(state);
01429             break;
01430             
01431         case ZEBETITE2:
01432             XRCCTRL(*this, "IDC_MISC_ZEBETITE2", wxCheckBox)->SetValue(state);
01433             break;
01434             
01435         case ZEBETITE3:
01436             XRCCTRL(*this, "IDC_MISC_ZEBETITE3", wxCheckBox)->SetValue(state);
01437             break;
01438             
01439         case ZEBETITE4:
01440             XRCCTRL(*this, "IDC_MISC_ZEBETITE4", wxCheckBox)->SetValue(state);
01441             break;
01442             
01443         case ZEBETITE5:
01444             XRCCTRL(*this, "IDC_MISC_ZEBETITE5", wxCheckBox)->SetValue(state);
01445             break;
01446             
01447         case MOTHERBRAIN:
01448             XRCCTRL(*this, "IDC_MISC_BOSS_MOTHERBRAIN",
01449                     wxCheckBox)->SetValue(state);
01450             break;
01451             
01452         case START_NF:
01453         case START_KL:
01454         case START_RL:
01455             updateStartLocation();
01456             break;
01457             
01458         case RESET:
01459             if (state) {
01460                 wxMessageBox(wxT("This bit will produce an invalid password."),
01461                              wxT("Warning: Invalid Password"),
01462                              wxICON_EXCLAMATION | wxOK);
01463             }
01464             
01465             break;
01466         
01467         case SWIMSUIT:
01468             XRCCTRL(*this, "IDRB_MISC_ARMOR",
01469                     wxRadioBox)->SetSelection(state ? 1 : 0);
01470             break;
01471 
01472         case LONGBEAM:
01473             XRCCTRL(*this, "IDC_ITEMS_LONGBEAM", wxCheckBox)->SetValue(state);
01474             break;
01475             
01476         case WAVEBEAM:
01477             XRCCTRL(*this, "IDC_ITEMS_WAVEBEAM", wxCheckBox)->SetValue(state);
01478             break;
01479             
01480         case ICEBEAM:
01481             XRCCTRL(*this, "IDC_ITEMS_ICEBEAM", wxCheckBox)->SetValue(state);
01482             break;
01483             
01484         case MISSILES:
01485         case MISSILES + 1:
01486         case MISSILES + 2:
01487         case MISSILES + 3:
01488         case MISSILES + 4:
01489         case MISSILES + 5:
01490         case MISSILES + 6:
01491         case MISSILES + 7:
01492             ignoreTextEvent = true;
01493             XRCCTRL(*this, "IDT_ITEMS_MISSILES",
01494                     wxTextCtrl)->SetValue(
01495                         wxString::Format(wxT("%d"), password.getMissiles()));
01496             ignoreTextEvent = false;
01497             
01498             break;
01499         
01500         case GAMETIME: 
01501         case GAMETIME + 1:
01502         case GAMETIME + 2:
01503         case GAMETIME + 3:
01504         case GAMETIME + 4:
01505         case GAMETIME + 5:
01506         case GAMETIME + 6:
01507         case GAMETIME + 7:
01508         case GAMETIME + 8:
01509         case GAMETIME + 9:
01510         case GAMETIME + 10:
01511         case GAMETIME + 11:
01512         case GAMETIME + 12:
01513         case GAMETIME + 13:
01514         case GAMETIME + 14:
01515         case GAMETIME + 15:
01516         case GAMETIME + 16:
01517         case GAMETIME + 17:
01518         case GAMETIME + 18:
01519         case GAMETIME + 19:
01520         case GAMETIME + 20:
01521         case GAMETIME + 21:
01522         case GAMETIME + 22:
01523         case GAMETIME + 23:
01524         case GAMETIME + 24:
01525         case GAMETIME + 25:
01526         case GAMETIME + 26:
01527         case GAMETIME + 27:
01528         case GAMETIME + 28:
01529         case GAMETIME + 29:
01530         case GAMETIME + 30:
01531         case GAMETIME + 31:
01532             {
01533                 unsigned long value =
01534                     static_cast<unsigned long>(password.getGameTime());
01535                 
01536                 ignoreTextEvent = true;
01537                 XRCCTRL(*this, "IDT_MISC_GAMETIME",
01538                         wxTextCtrl)->SetValue(wxString::Format(wxT("%lu"),
01539                                               value));
01540                 ignoreTextEvent = false;
01541                 
01542                 // update the real time value, too
01543                 updateRealTime();
01544             }
01545             
01546             break;
01547             
01548         case RIDLEY:
01549             XRCCTRL(*this, "IDC_MISC_BOSS_RIDLEY", wxCheckBox)->SetValue(state);
01550             break;
01551             
01552         case RIDLEY_STATUE:
01553             XRCCTRL(*this, "IDC_MISC_STATUE_RIDLEY",
01554                     wxCheckBox)->SetValue(state);
01555             break;
01556             
01557         case KRAID:
01558             XRCCTRL(*this, "IDC_MISC_BOSS_KRAID", wxCheckBox)->SetValue(state);
01559             break;
01560             
01561         case KRAID_STATUE:
01562             XRCCTRL(*this, "IDC_MISC_STATUE_KRAID",
01563                     wxCheckBox)->SetValue(state);
01564             break;
01565             
01566         default:
01567             // one of the unknowns -- do nothing
01568             break;
01569     }
01570     
01571     updatePasswordText();
01572     warnOnDebugPassword(password.getEncoded());
01573 }
01574 
01575 void MPGFrame::onShiftSpinner(wxSpinEvent &event) {
01576     ignoreTextEvent = true;
01577     XRCCTRL(*this, "IDT_RAW_SHIFT",
01578             wxTextCtrl)->SetValue(wxString::Format(wxT("%d"),
01579                                                    event.GetPosition()));
01580     ignoreTextEvent = false;
01581     
01582     unsigned char shift = static_cast<unsigned char>(event.GetPosition());
01583     password.setShift(shift);
01584     
01585     updatePasswordText();
01586     warnOnDebugPassword(password.getEncoded());
01587 }
01588 
01589 void MPGFrame::onShiftTextChanged(wxCommandEvent &event) {
01590     if (ignoreTextEvent) {
01591         return;
01592     }
01593     
01594     wxString text = event.GetString();
01595     unsigned char shift;
01596     unsigned long value;
01597     
01598     if (text.ToULong(&value)) {
01599         if (value > 255) {
01600             shift = 255;
01601         } else {
01602             shift = static_cast<unsigned char>(value);
01603         }
01604         
01605         password.setShift(shift);
01606         
01607         updatePasswordText();
01608         warnOnDebugPassword(password.getEncoded());
01609         
01610         ignoreTextEvent = true;
01611         XRCCTRL(*this, "IDSB_RAW_SHIFT", wxSpinButton)->SetValue(shift);
01612         ignoreTextEvent = false;
01613     }
01614 }
01615 
01616 void MPGFrame::onStartLocationChanged(wxCommandEvent &event) {
01617     wxRadioBox *ptr = dynamic_cast<wxRadioBox *>(event.GetEventObject());
01618     int location = ptr->GetSelection();
01619     bool nf, kl, rl;
01620     
01621     switch (location) {
01622         case 0:
01623             // Brinstar
01624             nf = false;
01625             kl = false;
01626             rl = false;
01627             break;
01628             
01629         case 1:
01630             // Kraid's Lair
01631             nf = false;
01632             kl = true;
01633             rl = false;
01634             break;
01635             
01636         case 2:
01637             // Norfair
01638             nf = true;
01639             kl = false;
01640             rl = false;
01641             break;
01642             
01643         case 3:
01644             // Ridley's Lair
01645             nf = false;
01646             kl = false;
01647             rl = true;
01648             break;
01649             
01650         default:
01651             // Tourian
01652             nf = true;
01653             kl = true;
01654             rl = false;
01655             break;
01656     };
01657     
01658     wxCheckListBox *ctrl = XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox);
01659     ctrl->Check(START_NF, nf);
01660     ctrl->Check(START_KL, kl);
01661     ctrl->Check(START_RL, rl);
01662     
01663     password.setBit(START_NF, nf);
01664     password.setBit(START_KL, kl);
01665     password.setBit(START_RL, rl);
01666     
01667     updatePasswordText();
01668     warnOnDebugPassword(password.getEncoded());
01669 }
01670 
01671 void MPGFrame::onStatueChanged(wxCommandEvent &event) {
01672     int id = event.GetId();
01673     bool state = event.IsChecked();
01674     int bit;
01675     
01676     if (id == XRCID("IDC_MISC_STATUE_KRAID")) {
01677         bit = KRAID_STATUE;
01678     } else {
01679         bit = RIDLEY_STATUE;
01680     }
01681     
01682     XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox)->Check(bit, state);
01683     password.setBit(bit, state);
01684     
01685     updatePasswordText();
01686     warnOnDebugPassword(password.getEncoded());
01687 }
01688 
01689 void MPGFrame::onZebetiteChanged(wxCommandEvent &event) {
01690     int id = event.GetId();
01691     bool state = event.IsChecked();
01692     int bit;
01693     
01694     if (id == XRCID("IDC_MISC_ZEBETITE1")) {
01695         bit = ZEBETITE1;
01696     } else if (id == XRCID("IDC_MISC_ZEBETITE2")) {
01697         bit = ZEBETITE2;
01698     } else if (id == XRCID("IDC_MISC_ZEBETITE3")) {
01699         bit = ZEBETITE3;
01700     } else if (id == XRCID("IDC_MISC_ZEBETITE4")) {
01701         bit = ZEBETITE4;
01702     } else {
01703         bit = ZEBETITE5;
01704     }
01705     
01706     XRCCTRL(*this, "IDCLB_RAW_BITS", wxCheckListBox)->Check(bit, state);
01707     password.setBit(bit, state);
01708     
01709     updatePasswordText();
01710     warnOnDebugPassword(password.getEncoded());
01711 }
01712 
01713 IMPLEMENT_CLASS(MPGFrame, wxFrame)
01714 

Generated on Mon Oct 3 21:26:27 2005 for Metroid Password Generator by  doxygen 1.4.2