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

Generated on Wed Sep 28 03:19:06 2005 for Metroid Password Generator by  doxygen 1.4.2