MPGFrame.cc

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

Generated on Tue Dec 16 20:16:57 2008 for Metroid Password Generator by  doxygen 1.5.4