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 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
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
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
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
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
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
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
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
00247 XRCCTRL(*this, "IDRB_MISC_ARMOR",
00248 wxRadioBox)->SetSelection(password.getBit(SWIMSUIT) ? 1 : 0);
00249
00250
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
00271 updateRealTime();
00272
00273
00274 updateStartLocation();
00275
00276
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
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
00350 ctrl->SetSelection(BRINSTAR);
00351 } else if (!nf && kl && !rl) {
00352
00353 ctrl->SetSelection(KRAIDSLAIR);
00354 } else if (nf && !kl && !rl) {
00355
00356 ctrl->SetSelection(NORFAIR);
00357 } else if (!nf && !kl && rl) {
00358
00359 ctrl->SetSelection(RIDLEYSLAIR);
00360 } else if (nf && kl && !rl) {
00361
00362 ctrl->SetSelection(TOURIAN);
00363 } else {
00364
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
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
00956 password.setBit(START_NF);
00957 password.setBit(START_KL);
00958
00959
00960 password.setBit(KRAID_STATUE);
00961 password.setBit(RIDLEY_STATUE);
00962
00963
00964 password.setBit(SWIMSUIT);
00965
00966
00967 password.setBit(KRAID);
00968 password.setBit(RIDLEY);
00969
00970
00971 wxCommandEvent event1(wxEVT_COMMAND_MENU_SELECTED,
00972 XRCID("IDM_PASSWORD_GIVE_ITEMS"));
00973 GetEventHandler()->ProcessEvent(event1);
00974
00975
00976 password.setBit(WAVEBEAM, false);
00977
00978
00979 wxCommandEvent event2(wxEVT_COMMAND_MENU_SELECTED,
00980 XRCID("IDM_PASSWORD_GIVE_MC"));
00981 GetEventHandler()->ProcessEvent(event2);
00982
00983
00984 wxCommandEvent event3(wxEVT_COMMAND_MENU_SELECTED,
00985 XRCID("IDM_PASSWORD_GIVE_MISSILES"));
00986 GetEventHandler()->ProcessEvent(event3);
00987
00988
00989 wxCommandEvent event4(wxEVT_COMMAND_MENU_SELECTED,
00990 XRCID("IDM_PASSWORD_GIVE_ET"));
00991 GetEventHandler()->ProcessEvent(event4);
00992
00993
00994 wxCommandEvent event5(wxEVT_COMMAND_MENU_SELECTED,
00995 XRCID("IDM_PASSWORD_GIVE_DOORS"));
00996 GetEventHandler()->ProcessEvent(event5);
00997
00998
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
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
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
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
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
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
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
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
01468 nf = false;
01469 kl = false;
01470 rl = false;
01471 break;
01472
01473 case 1:
01474
01475 nf = false;
01476 kl = true;
01477 rl = false;
01478 break;
01479
01480 case 2:
01481
01482 nf = true;
01483 kl = false;
01484 rl = false;
01485 break;
01486
01487 case 3:
01488
01489 nf = false;
01490 kl = false;
01491 rl = true;
01492 break;
01493
01494 default:
01495
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