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