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