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