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 <fstream>
00036 #include <cstring>
00037
00038 #include "MainFrame.hh"
00039 #include "../hack4u.hh"
00040
00041 using namespace hack4u;
00042
00043 const wxString MainFrame::CITY_NAMES[] = {
00044 wxT("Moonglow"), wxT("Britain"), wxT("Jhelom"), wxT("Yew"),
00045 wxT("Minoc"), wxT("Trinsic"), wxT("Skara Brae"), wxT("Magincia")
00046 };
00047
00048 const wxString MainFrame::CHARACTER_NAMES[] = {
00049 wxT("Mage"), wxT("Bard"), wxT("Fighter"), wxT("Druid"),
00050 wxT("Tinker"), wxT("Paladin"), wxT("Ranger"), wxT("Shepherd")
00051 };
00052
00053 const char *MainFrame::ICON[] = {
00054 "16 16 5 1",
00055 " c None",
00056 "! c #BCBCBC",
00057 "# c #747474",
00058 "$ c #FCFCFC",
00059 "% c black",
00060 "!!!!!#$$$$$$!!!!",
00061 "!!!!#!$$$$$$$!!!",
00062 "!!!#!!######$$!!",
00063 "!!!%!##%%%%##$!!",
00064 "!!!%###!!!%##$!!",
00065 "!!!%%##!!!%##%!!",
00066 "!!!!%%##!%##%!!!",
00067 "#%$$$$%####$$$$$",
00068 "!%!$$$$$##$$$$$$",
00069 "!%#############$",
00070 "!%%%%%%%##%%%%%$",
00071 "!!!!!!%%##!!!!!!",
00072 "!!%%%%%%##!!!!!!",
00073 "%%%%%%%%##!!!!!!",
00074 "!%%%%%%%%%!!!!!!",
00075 "!!!!!!!!!!!!!!!!"
00076 };
00077
00078 IMPLEMENT_DYNAMIC_CLASS(MainFrame, wxFrame)
00079
00080 BEGIN_EVENT_TABLE(MainFrame, wxFrame)
00081 EVT_CLOSE(MainFrame::windowClosing)
00082
00083 EVT_MENU(XRCID("IDM_FILE_OPEN"), MainFrame::fileOpen)
00084 EVT_MENU(XRCID("IDM_FILE_SAVE"), MainFrame::fileSave)
00085 EVT_MENU(XRCID("IDM_FILE_SAVE_AS"), MainFrame::fileSaveAs)
00086 EVT_MENU(XRCID("IDM_FILE_CLOSE"), MainFrame::fileClose)
00087 EVT_MENU(XRCID("IDM_FILE_EXIT"), MainFrame::fileExit)
00088
00089 EVT_MENU(XRCID("IDM_GAME_GAME1"), MainFrame::gameChange)
00090 EVT_MENU(XRCID("IDM_GAME_GAME2"), MainFrame::gameChange)
00091 EVT_MENU(XRCID("IDM_GAME_GAME3"), MainFrame::gameChange)
00092
00093 EVT_MENU(XRCID("IDM_HELP_ABOUT"), MainFrame::helpAbout)
00094
00095 EVT_TEXT(XRCID("ID_GENERAL_HEROSNAME"), MainFrame::herosNameChange)
00096
00097 EVT_CHOICE(XRCID("ID_GENERAL_PARTY1"), MainFrame::memberClassChange)
00098 EVT_CHOICE(XRCID("ID_GENERAL_PARTY2"), MainFrame::memberClassChange)
00099 EVT_CHOICE(XRCID("ID_GENERAL_PARTY3"), MainFrame::memberClassChange)
00100 EVT_CHOICE(XRCID("ID_GENERAL_PARTY4"), MainFrame::memberClassChange)
00101
00102 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_HONESTY"), MainFrame::virtueChange)
00103 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_COMPASSION"), MainFrame::virtueChange)
00104 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_VALOR"), MainFrame::virtueChange)
00105 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_JUSTICE"), MainFrame::virtueChange)
00106 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_SACRIFICE"), MainFrame::virtueChange)
00107 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_HONOR"), MainFrame::virtueChange)
00108 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_SPIRITUALITY"), MainFrame::virtueChange)
00109 EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_HUMILITY"), MainFrame::virtueChange)
00110
00111 EVT_CHECKBOX(XRCID("ID_GENERAL_LIGHT"), MainFrame::magicChange)
00112 EVT_CHECKBOX(XRCID("ID_GENERAL_MISSILE"), MainFrame::magicChange)
00113 EVT_CHECKBOX(XRCID("ID_GENERAL_AWAKEN"), MainFrame::magicChange)
00114 EVT_CHECKBOX(XRCID("ID_GENERAL_CURE"), MainFrame::magicChange)
00115 EVT_CHECKBOX(XRCID("ID_GENERAL_WIND"), MainFrame::magicChange)
00116 EVT_CHECKBOX(XRCID("ID_GENERAL_HEAL"), MainFrame::magicChange)
00117 EVT_CHECKBOX(XRCID("ID_GENERAL_FIRE"), MainFrame::magicChange)
00118 EVT_CHECKBOX(XRCID("ID_GENERAL_EXIT"), MainFrame::magicChange)
00119 EVT_CHECKBOX(XRCID("ID_GENERAL_DISPEL"), MainFrame::magicChange)
00120 EVT_CHECKBOX(XRCID("ID_GENERAL_VIEW"), MainFrame::magicChange)
00121 EVT_CHECKBOX(XRCID("ID_GENERAL_PROTECT"), MainFrame::magicChange)
00122 EVT_CHECKBOX(XRCID("ID_GENERAL_ICE"), MainFrame::magicChange)
00123 EVT_CHECKBOX(XRCID("ID_GENERAL_BLINK"), MainFrame::magicChange)
00124 EVT_CHECKBOX(XRCID("ID_GENERAL_ENERGY"), MainFrame::magicChange)
00125 EVT_CHECKBOX(XRCID("ID_GENERAL_QUICK"), MainFrame::magicChange)
00126 EVT_CHECKBOX(XRCID("ID_GENERAL_SLEEP"), MainFrame::magicChange)
00127 EVT_CHECKBOX(XRCID("ID_GENERAL_REFLECT"), MainFrame::magicChange)
00128 EVT_CHECKBOX(XRCID("ID_GENERAL_NEGATE"), MainFrame::magicChange)
00129 EVT_CHECKBOX(XRCID("ID_GENERAL_DESTROY"), MainFrame::magicChange)
00130 EVT_CHECKBOX(XRCID("ID_GENERAL_JINX"), MainFrame::magicChange)
00131 EVT_CHECKBOX(XRCID("ID_GENERAL_SQUISH"), MainFrame::magicChange)
00132 EVT_CHECKBOX(XRCID("ID_GENERAL_GATE"), MainFrame::magicChange)
00133 EVT_CHECKBOX(XRCID("ID_GENERAL_TREMOR"), MainFrame::magicChange)
00134 EVT_CHECKBOX(XRCID("ID_GENERAL_LIFE"), MainFrame::magicChange)
00135 EVT_CHECKBOX(XRCID("ID_GENERAL_DEFEAT"), MainFrame::magicChange)
00136
00137 EVT_CHOICE(XRCID("ID_GENERAL_TRAMMEL"), MainFrame::phaseChange)
00138 EVT_CHOICE(XRCID("ID_GENERAL_FELUCCA"), MainFrame::phaseChange)
00139
00140 EVT_TEXT(XRCID("ID_INVENTORY_GOLD"), MainFrame::goldChange)
00141
00142 EVT_COMMAND_SCROLL(XRCID("ID_INVENTORY_ASH"), MainFrame::herbChange)
00143 EVT_COMMAND_SCROLL(XRCID("ID_INVENTORY_GINSENG"), MainFrame::herbChange)
00144 EVT_COMMAND_SCROLL(XRCID("ID_INVENTORY_GARLIC"), MainFrame::herbChange)
00145 EVT_COMMAND_SCROLL(XRCID("ID_INVENTORY_SILKWEB"), MainFrame::herbChange)
00146 EVT_COMMAND_SCROLL(XRCID("ID_INVENTORY_MOSS"), MainFrame::herbChange)
00147 EVT_COMMAND_SCROLL(XRCID("ID_INVENTORY_PEARL"), MainFrame::herbChange)
00148 EVT_COMMAND_SCROLL(XRCID("ID_INVENTORY_FUNGUS"), MainFrame::herbChange)
00149 EVT_COMMAND_SCROLL(XRCID("ID_INVENTORY_MANROOT"), MainFrame::herbChange)
00150
00151 EVT_CHECKBOX(XRCID("ID_INVENTORY_HONESTY"), MainFrame::runeChange)
00152 EVT_CHECKBOX(XRCID("ID_INVENTORY_COMPASSION"), MainFrame::runeChange)
00153 EVT_CHECKBOX(XRCID("ID_INVENTORY_VALOR"), MainFrame::runeChange)
00154 EVT_CHECKBOX(XRCID("ID_INVENTORY_JUSTICE"), MainFrame::runeChange)
00155 EVT_CHECKBOX(XRCID("ID_INVENTORY_SACRIFICE"), MainFrame::runeChange)
00156 EVT_CHECKBOX(XRCID("ID_INVENTORY_HONOR"), MainFrame::runeChange)
00157 EVT_CHECKBOX(XRCID("ID_INVENTORY_SPIRITUALITY"), MainFrame::runeChange)
00158 EVT_CHECKBOX(XRCID("ID_INVENTORY_HUMILITY"), MainFrame::runeChange)
00159
00160 EVT_CHECKBOX(XRCID("ID_INVENTORY_BLUE"), MainFrame::stoneChange)
00161 EVT_CHECKBOX(XRCID("ID_INVENTORY_YELLOW"), MainFrame::stoneChange)
00162 EVT_CHECKBOX(XRCID("ID_INVENTORY_RED"), MainFrame::stoneChange)
00163 EVT_CHECKBOX(XRCID("ID_INVENTORY_GREEN"), MainFrame::stoneChange)
00164 EVT_CHECKBOX(XRCID("ID_INVENTORY_ORANGE"), MainFrame::stoneChange)
00165 EVT_CHECKBOX(XRCID("ID_INVENTORY_PURPLE"), MainFrame::stoneChange)
00166 EVT_CHECKBOX(XRCID("ID_INVENTORY_WHITE"), MainFrame::stoneChange)
00167 EVT_CHECKBOX(XRCID("ID_INVENTORY_BLACK"), MainFrame::stoneChange)
00168
00169 EVT_COMMAND_SCROLL(XRCID("ID_INVENTORY_TORCH"), MainFrame::toolQuantityChange)
00170 EVT_COMMAND_SCROLL(XRCID("ID_INVENTORY_GEM"), MainFrame::toolQuantityChange)
00171 EVT_COMMAND_SCROLL(XRCID("ID_INVENTORY_OIL"), MainFrame::toolQuantityChange)
00172
00173 EVT_CHECKBOX(XRCID("ID_INVENTORY_KEY"), MainFrame::toolHaveChange)
00174 EVT_CHECKBOX(XRCID("ID_INVENTORY_SEXTANT"), MainFrame::toolHaveChange)
00175 EVT_CHECKBOX(XRCID("ID_INVENTORY_SCALE"), MainFrame::toolHaveChange)
00176 EVT_CHECKBOX(XRCID("ID_INVENTORY_FLUTE"), MainFrame::toolHaveChange)
00177 EVT_CHECKBOX(XRCID("ID_INVENTORY_CANDLE"), MainFrame::toolHaveChange)
00178 EVT_CHECKBOX(XRCID("ID_INVENTORY_BOOK"), MainFrame::toolHaveChange)
00179 EVT_CHECKBOX(XRCID("ID_INVENTORY_BELL"), MainFrame::toolHaveChange)
00180 EVT_CHECKBOX(XRCID("ID_INVENTORY_HORN"), MainFrame::toolHaveChange)
00181 EVT_CHECKBOX(XRCID("ID_INVENTORY_SKULL"), MainFrame::toolHaveChange)
00182 EVT_CHECKBOX(XRCID("ID_INVENTORY_TRUTHKEY"), MainFrame::toolHaveChange)
00183 EVT_CHECKBOX(XRCID("ID_INVENTORY_COURAGEKEY"), MainFrame::toolHaveChange)
00184 EVT_CHECKBOX(XRCID("ID_INVENTORY_LOVEKEY"), MainFrame::toolHaveChange)
00185 EVT_CHECKBOX(XRCID("ID_INVENTORY_WHEEL"), MainFrame::toolHaveChange)
00186
00187 EVT_CHOICE(XRCID("ID_CHARACTER_CHARACTER"), MainFrame::characterChange)
00188
00189 EVT_TEXT(XRCID("ID_CHARACTER_LEVEL"), MainFrame::statChange)
00190 EVT_TEXT(XRCID("ID_CHARACTER_EXPERIENCE"), MainFrame::statChange)
00191 EVT_TEXT(XRCID("ID_CHARACTER_CURRENTHP"), MainFrame::statChange)
00192 EVT_TEXT(XRCID("ID_CHARACTER_CURRENTMP"), MainFrame::statChange)
00193 EVT_TEXT(XRCID("ID_CHARACTER_MAXHP"), MainFrame::statChange)
00194 EVT_TEXT(XRCID("ID_CHARACTER_MAXMP"), MainFrame::statChange)
00195 EVT_TEXT(XRCID("ID_CHARACTER_STRENGTH"), MainFrame::statChange)
00196 EVT_TEXT(XRCID("ID_CHARACTER_INTELLIGENCE"), MainFrame::statChange)
00197 EVT_TEXT(XRCID("ID_CHARACTER_DEXTERITY"), MainFrame::statChange)
00198
00199 EVT_CHOICE(XRCID("ID_CHARACTER_FIRST"), MainFrame::equipmentChange)
00200 EVT_CHOICE(XRCID("ID_CHARACTER_SECOND"), MainFrame::equipmentChange)
00201 EVT_CHOICE(XRCID("ID_CHARACTER_THIRD"), MainFrame::equipmentChange)
00202 EVT_CHOICE(XRCID("ID_CHARACTER_FOURTH"), MainFrame::equipmentChange)
00203 EVT_CHOICE(XRCID("ID_CHARACTER_FIFTH"), MainFrame::equipmentChange)
00204 EVT_CHOICE(XRCID("ID_CHARACTER_SIXTH"), MainFrame::equipmentChange)
00205
00206 EVT_CHECKBOX(XRCID("ID_CHARACTER_FIRSTEQUIPPED"), MainFrame::equippedChange)
00207 EVT_CHECKBOX(XRCID("ID_CHARACTER_SECONDEQUIPPED"), MainFrame::equippedChange)
00208 EVT_CHECKBOX(XRCID("ID_CHARACTER_THIRDEQUIPPED"), MainFrame::equippedChange)
00209 EVT_CHECKBOX(XRCID("ID_CHARACTER_FOURTHEQUIPPED"), MainFrame::equippedChange)
00210 EVT_CHECKBOX(XRCID("ID_CHARACTER_FIFTHEQUIPPED"), MainFrame::equippedChange)
00211 EVT_CHECKBOX(XRCID("ID_CHARACTER_SIXTHEQUIPPED"), MainFrame::equippedChange)
00212 END_EVENT_TABLE()
00213
00214 MainFrame::MainFrame() {
00215 currentSlot = -1;
00216
00217 SetParent(NULL);
00218 CreateControls();
00219 Centre();
00220
00221 SetDropTarget(new FileDropTarget(this));
00222 }
00223
00224 void MainFrame::CreateControls() {
00225 wxXmlResource::Get()->LoadFrame(this, GetParent(), wxT("ID_MAIN_FRAME"));
00226 SetIcon(ICON);
00227
00228 notebook = XRCCTRL(*this, "ID_NOTEBOOK", wxNotebook);
00229 notebook->Show(false);
00230
00231 wxMenuBar &menubar = *GetMenuBar();
00232
00233 games[0] = menubar.FindItem(XRCID("IDM_GAME_GAME1"));
00234 games[0]->Enable(false);
00235
00236 games[1] = menubar.FindItem(XRCID("IDM_GAME_GAME2"));
00237 games[1]->Enable(false);
00238
00239 games[2] = menubar.FindItem(XRCID("IDM_GAME_GAME3"));
00240 games[2]->Enable(false);
00241
00242 fileSaveItem = menubar.FindItem(XRCID("IDM_FILE_SAVE"));
00243 fileSaveAsItem = menubar.FindItem(XRCID("IDM_FILE_SAVE_AS"));
00244 fileCloseItem = menubar.FindItem(XRCID("IDM_FILE_CLOSE"));
00245
00246 setOpen(false);
00247
00248 wxStringList letters("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
00249 "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
00250 "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g",
00251 "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
00252 "s", "t", "u", "v", "w", "x", "y", "z", "!", "-", "_",
00253 NULL);
00254
00255 wxTextValidator herosNameValidator(wxFILTER_INCLUDE_CHAR_LIST);
00256 herosNameValidator.SetIncludeList(letters);
00257
00258 herosNameText = XRCCTRL(*this, "ID_GENERAL_HEROSNAME", wxTextCtrl);
00259 herosNameText->SetMaxLength(5);
00260 herosNameText->SetValidator(herosNameValidator);
00261
00262 memberClass[0] = XRCCTRL(*this, "ID_GENERAL_PARTY1", wxChoice);
00263 memberClass[1] = XRCCTRL(*this, "ID_GENERAL_PARTY2", wxChoice);
00264 memberClass[2] = XRCCTRL(*this, "ID_GENERAL_PARTY3", wxChoice);
00265 memberClass[3] = XRCCTRL(*this, "ID_GENERAL_PARTY4", wxChoice);
00266
00267 honestySlider = XRCCTRL(*this, "ID_GENERAL_HONESTY", wxSlider);
00268 compassionSlider = XRCCTRL(*this, "ID_GENERAL_COMPASSION", wxSlider);
00269 valorSlider = XRCCTRL(*this, "ID_GENERAL_VALOR", wxSlider);
00270 justiceSlider = XRCCTRL(*this, "ID_GENERAL_JUSTICE", wxSlider);
00271 sacrificeSlider = XRCCTRL(*this, "ID_GENERAL_SACRIFICE", wxSlider);
00272 honorSlider = XRCCTRL(*this, "ID_GENERAL_HONOR", wxSlider);
00273 spiritualitySlider = XRCCTRL(*this, "ID_GENERAL_SPIRITUALITY", wxSlider);
00274 humilitySlider = XRCCTRL(*this, "ID_GENERAL_HUMILITY", wxSlider);
00275
00276 lightSpellCheck = XRCCTRL(*this, "ID_GENERAL_LIGHT", wxCheckBox);
00277 missileSpellCheck = XRCCTRL(*this, "ID_GENERAL_MISSILE", wxCheckBox);
00278 awakenSpellCheck = XRCCTRL(*this, "ID_GENERAL_AWAKEN", wxCheckBox);
00279 cureSpellCheck = XRCCTRL(*this, "ID_GENERAL_CURE", wxCheckBox);
00280 windSpellCheck = XRCCTRL(*this, "ID_GENERAL_WIND", wxCheckBox);
00281 healSpellCheck = XRCCTRL(*this, "ID_GENERAL_HEAL", wxCheckBox);
00282 fireSpellCheck = XRCCTRL(*this, "ID_GENERAL_FIRE", wxCheckBox);
00283 exitSpellCheck = XRCCTRL(*this, "ID_GENERAL_EXIT", wxCheckBox);
00284 dispelSpellCheck = XRCCTRL(*this, "ID_GENERAL_DISPEL", wxCheckBox);
00285 viewSpellCheck = XRCCTRL(*this, "ID_GENERAL_VIEW", wxCheckBox);
00286 protectSpellCheck = XRCCTRL(*this, "ID_GENERAL_PROTECT", wxCheckBox);
00287 iceSpellCheck = XRCCTRL(*this, "ID_GENERAL_ICE", wxCheckBox);
00288 blinkSpellCheck = XRCCTRL(*this, "ID_GENERAL_BLINK", wxCheckBox);
00289 energySpellCheck = XRCCTRL(*this, "ID_GENERAL_ENERGY", wxCheckBox);
00290 quickSpellCheck = XRCCTRL(*this, "ID_GENERAL_QUICK", wxCheckBox);
00291 sleepSpellCheck = XRCCTRL(*this, "ID_GENERAL_SLEEP", wxCheckBox);
00292 reflectSpellCheck = XRCCTRL(*this, "ID_GENERAL_REFLECT", wxCheckBox);
00293 negateSpellCheck = XRCCTRL(*this, "ID_GENERAL_NEGATE", wxCheckBox);
00294 destroySpellCheck = XRCCTRL(*this, "ID_GENERAL_DESTROY", wxCheckBox);
00295 jinxSpellCheck = XRCCTRL(*this, "ID_GENERAL_JINX", wxCheckBox);
00296 squishSpellCheck = XRCCTRL(*this, "ID_GENERAL_SQUISH", wxCheckBox);
00297 gateSpellCheck = XRCCTRL(*this, "ID_GENERAL_GATE", wxCheckBox);
00298 tremorSpellCheck = XRCCTRL(*this, "ID_GENERAL_TREMOR", wxCheckBox);
00299 lifeSpellCheck = XRCCTRL(*this, "ID_GENERAL_LIFE", wxCheckBox);
00300 defeatSpellCheck = XRCCTRL(*this, "ID_GENERAL_DEFEAT", wxCheckBox);
00301
00302 trammelChoice = XRCCTRL(*this, "ID_GENERAL_TRAMMEL", wxChoice);
00303 feluccaChoice = XRCCTRL(*this, "ID_GENERAL_FELUCCA", wxChoice);
00304
00305 wxTextValidator numberValidator(wxFILTER_NUMERIC);
00306 goldText = XRCCTRL(*this, "ID_INVENTORY_GOLD", wxTextCtrl);
00307 goldText->SetValidator(numberValidator);
00308 goldText->SetMaxLength(4);
00309
00310 ashSlider = XRCCTRL(*this, "ID_INVENTORY_ASH", wxSlider);
00311 ginsengSlider = XRCCTRL(*this, "ID_INVENTORY_GINSENG", wxSlider);
00312 garlicSlider = XRCCTRL(*this, "ID_INVENTORY_GARLIC", wxSlider);
00313 silkwebSlider = XRCCTRL(*this, "ID_INVENTORY_SILKWEB", wxSlider);
00314 mossSlider = XRCCTRL(*this, "ID_INVENTORY_MOSS", wxSlider);
00315 pearlSlider = XRCCTRL(*this, "ID_INVENTORY_PEARL", wxSlider);
00316 fungusSlider = XRCCTRL(*this, "ID_INVENTORY_FUNGUS", wxSlider);
00317 manrootSlider = XRCCTRL(*this, "ID_INVENTORY_MANROOT", wxSlider);
00318
00319 honestyRuneCheck = XRCCTRL(*this, "ID_INVENTORY_HONESTY", wxCheckBox);
00320 compassionRuneCheck = XRCCTRL(*this, "ID_INVENTORY_COMPASSION", wxCheckBox);
00321 valorRuneCheck = XRCCTRL(*this, "ID_INVENTORY_VALOR", wxCheckBox);
00322 justiceRuneCheck = XRCCTRL(*this, "ID_INVENTORY_JUSTICE", wxCheckBox);
00323 sacrificeRuneCheck = XRCCTRL(*this, "ID_INVENTORY_SACRIFICE", wxCheckBox);
00324 honorRuneCheck = XRCCTRL(*this, "ID_INVENTORY_HONOR", wxCheckBox);
00325 spiritualityRuneCheck = XRCCTRL(*this, "ID_INVENTORY_SPIRITUALITY", wxCheckBox);
00326 humilityRuneCheck = XRCCTRL(*this, "ID_INVENTORY_HUMILITY", wxCheckBox);
00327
00328 blueStoneCheck = XRCCTRL(*this, "ID_INVENTORY_BLUE", wxCheckBox);
00329 yellowStoneCheck = XRCCTRL(*this, "ID_INVENTORY_YELLOW", wxCheckBox);
00330 redStoneCheck = XRCCTRL(*this, "ID_INVENTORY_RED", wxCheckBox);
00331 greenStoneCheck = XRCCTRL(*this, "ID_INVENTORY_GREEN", wxCheckBox);
00332 orangeStoneCheck = XRCCTRL(*this, "ID_INVENTORY_ORANGE", wxCheckBox);
00333 purpleStoneCheck = XRCCTRL(*this, "ID_INVENTORY_PURPLE", wxCheckBox);
00334 whiteStoneCheck = XRCCTRL(*this, "ID_INVENTORY_WHITE", wxCheckBox);
00335 blackStoneCheck = XRCCTRL(*this, "ID_INVENTORY_BLACK", wxCheckBox);
00336
00337 torchSlider = XRCCTRL(*this, "ID_INVENTORY_TORCH", wxSlider);
00338 gemSlider = XRCCTRL(*this, "ID_INVENTORY_GEM", wxSlider);
00339 oilSlider = XRCCTRL(*this, "ID_INVENTORY_OIL", wxSlider);
00340
00341 keyCheck = XRCCTRL(*this, "ID_INVENTORY_KEY", wxCheckBox);
00342 sextantCheck = XRCCTRL(*this, "ID_INVENTORY_SEXTANT", wxCheckBox);
00343 scaleCheck = XRCCTRL(*this, "ID_INVENTORY_SCALE", wxCheckBox);
00344 fluteCheck = XRCCTRL(*this, "ID_INVENTORY_FLUTE", wxCheckBox);
00345 candleCheck = XRCCTRL(*this, "ID_INVENTORY_CANDLE", wxCheckBox);
00346 bookCheck = XRCCTRL(*this, "ID_INVENTORY_BOOK", wxCheckBox);
00347 bellCheck = XRCCTRL(*this, "ID_INVENTORY_BELL", wxCheckBox);
00348 hornCheck = XRCCTRL(*this, "ID_INVENTORY_HORN", wxCheckBox);
00349 skullCheck = XRCCTRL(*this, "ID_INVENTORY_SKULL", wxCheckBox);
00350 truthKeyCheck = XRCCTRL(*this, "ID_INVENTORY_TRUTHKEY", wxCheckBox);
00351 courageKeyCheck = XRCCTRL(*this, "ID_INVENTORY_COURAGEKEY", wxCheckBox);
00352 loveKeyCheck = XRCCTRL(*this, "ID_INVENTORY_LOVEKEY", wxCheckBox);
00353 wheelCheck = XRCCTRL(*this, "ID_INVENTORY_WHEEL", wxCheckBox);
00354
00355 characterChoice = XRCCTRL(*this, "ID_CHARACTER_CHARACTER", wxChoice);
00356
00357 wxStringList numbers("2", "3", "4", "5", "6", "7", "8", NULL);
00358 wxTextValidator levelValidator(wxFILTER_INCLUDE_CHAR_LIST);
00359 levelValidator.SetIncludeList(numbers);
00360
00361 levelText = XRCCTRL(*this, "ID_CHARACTER_LEVEL", wxTextCtrl);
00362 levelText->SetValidator(levelValidator);
00363 levelText->SetMaxLength(1);
00364
00365 experienceText = XRCCTRL(*this, "ID_CHARACTER_EXPERIENCE", wxTextCtrl);
00366 experienceText->SetValidator(numberValidator);
00367 experienceText->SetMaxLength(4);
00368
00369 currentHPText = XRCCTRL(*this, "ID_CHARACTER_CURRENTHP", wxTextCtrl);
00370 currentHPText->SetValidator(numberValidator);
00371 currentHPText->SetMaxLength(3);
00372
00373 currentMPText = XRCCTRL(*this, "ID_CHARACTER_CURRENTMP", wxTextCtrl);
00374 currentMPText->SetValidator(numberValidator);
00375 currentMPText->SetMaxLength(2);
00376
00377 maxHPText = XRCCTRL(*this, "ID_CHARACTER_MAXHP", wxTextCtrl);
00378 maxHPText->SetValidator(numberValidator);
00379 maxHPText->SetMaxLength(3);
00380
00381 maxMPText = XRCCTRL(*this, "ID_CHARACTER_MAXMP", wxTextCtrl);
00382 maxMPText->SetValidator(numberValidator);
00383 maxMPText->SetMaxLength(2);
00384
00385 strengthText = XRCCTRL(*this, "ID_CHARACTER_STRENGTH", wxTextCtrl);
00386 strengthText->SetValidator(numberValidator);
00387 strengthText->SetMaxLength(2);
00388
00389 intelligenceText = XRCCTRL(*this, "ID_CHARACTER_INTELLIGENCE", wxTextCtrl);
00390 intelligenceText->SetValidator(numberValidator);
00391 intelligenceText->SetMaxLength(2);
00392
00393 dexterityText = XRCCTRL(*this, "ID_CHARACTER_DEXTERITY", wxTextCtrl);
00394 dexterityText->SetValidator(numberValidator);
00395 dexterityText->SetMaxLength(2);
00396
00397 itemChoice[0] = XRCCTRL(*this, "ID_CHARACTER_FIRST", wxChoice);
00398 itemEquippedCheck[0] = XRCCTRL(*this, "ID_CHARACTER_FIRSTEQUIPPED", wxCheckBox);
00399 itemChoice[1] = XRCCTRL(*this, "ID_CHARACTER_SECOND", wxChoice);
00400 itemEquippedCheck[1] = XRCCTRL(*this, "ID_CHARACTER_SECONDEQUIPPED", wxCheckBox);
00401 itemChoice[2] = XRCCTRL(*this, "ID_CHARACTER_THIRD", wxChoice);
00402 itemEquippedCheck[2] = XRCCTRL(*this, "ID_CHARACTER_THIRDEQUIPPED", wxCheckBox);
00403 itemChoice[3] = XRCCTRL(*this, "ID_CHARACTER_FOURTH", wxChoice);
00404 itemEquippedCheck[3] = XRCCTRL(*this, "ID_CHARACTER_FOURTHEQUIPPED", wxCheckBox);
00405 itemChoice[4] = XRCCTRL(*this, "ID_CHARACTER_FIFTH", wxChoice);
00406 itemEquippedCheck[4] = XRCCTRL(*this, "ID_CHARACTER_FIFTHEQUIPPED", wxCheckBox);
00407 itemChoice[5] = XRCCTRL(*this, "ID_CHARACTER_SIXTH", wxChoice);
00408 itemEquippedCheck[5] = XRCCTRL(*this, "ID_CHARACTER_SIXTHEQUIPPED", wxCheckBox);
00409 }
00410
00411 void MainFrame::setFeluccaOptions(int trammel) {
00412 feluccaChoice->Clear();
00413
00414 switch (trammel) {
00415 case MOONGLOW:
00416 feluccaChoice->Append(CITY_NAMES[MOONGLOW]);
00417 feluccaChoice->Append(CITY_NAMES[BRITAIN]);
00418 feluccaChoice->Append(CITY_NAMES[JHELOM]);
00419 break;
00420 case BRITAIN:
00421 feluccaChoice->Append(CITY_NAMES[YEW]);
00422 feluccaChoice->Append(CITY_NAMES[MINOC]);
00423 feluccaChoice->Append(CITY_NAMES[TRINSIC]);
00424 break;
00425 case JHELOM:
00426 feluccaChoice->Append(CITY_NAMES[SKARABRAE]);
00427 feluccaChoice->Append(CITY_NAMES[MAGINCIA]);
00428 feluccaChoice->Append(CITY_NAMES[MOONGLOW]);
00429 break;
00430 case YEW:
00431 feluccaChoice->Append(CITY_NAMES[BRITAIN]);
00432 feluccaChoice->Append(CITY_NAMES[JHELOM]);
00433 feluccaChoice->Append(CITY_NAMES[YEW]);
00434 break;
00435 case MINOC:
00436 feluccaChoice->Append(CITY_NAMES[MINOC]);
00437 feluccaChoice->Append(CITY_NAMES[TRINSIC]);
00438 feluccaChoice->Append(CITY_NAMES[SKARABRAE]);
00439 break;
00440 case TRINSIC:
00441 feluccaChoice->Append(CITY_NAMES[MAGINCIA]);
00442 feluccaChoice->Append(CITY_NAMES[MOONGLOW]);
00443 feluccaChoice->Append(CITY_NAMES[BRITAIN]);
00444 break;
00445 case SKARABRAE:
00446 feluccaChoice->Append(CITY_NAMES[JHELOM]);
00447 feluccaChoice->Append(CITY_NAMES[YEW]);
00448 feluccaChoice->Append(CITY_NAMES[MINOC]);
00449 break;
00450 case MAGINCIA:
00451 feluccaChoice->Append(CITY_NAMES[TRINSIC]);
00452 feluccaChoice->Append(CITY_NAMES[SKARABRAE]);
00453 feluccaChoice->Append(CITY_NAMES[MAGINCIA]);
00454 break;
00455 }
00456
00457 feluccaChoice->SetSelection(0);
00458 }
00459
00460 void MainFrame::loadStats(SaveSlot &slot, int character) {
00461 wxString str;
00462
00463 int temp = currentSlot;
00464 currentSlot = -1;
00465
00466 str.Printf("%d", slot.getLevel(character));
00467 levelText->SetValue(str);
00468
00469 str.Printf("%d", slot.getExperience(character));
00470 experienceText->SetValue(str);
00471
00472 str.Printf("%d", slot.getCurrentHP(character));
00473 currentHPText->SetValue(str);
00474
00475 str.Printf("%d", slot.getCurrentMP(character));
00476 currentMPText->SetValue(str);
00477
00478 str.Printf("%d", slot.getMaxHP(character));
00479 maxHPText->SetValue(str);
00480
00481 str.Printf("%d", slot.getMaxMP(character));
00482 maxMPText->SetValue(str);
00483
00484 str.Printf("%d", slot.getStrength(character));
00485 strengthText->SetValue(str);
00486
00487 str.Printf("%d", slot.getIntelligence(character));
00488 intelligenceText->SetValue(str);
00489
00490 str.Printf("%d", slot.getDexterity(character));
00491 dexterityText->SetValue(str);
00492
00493 for (int index = 0; index < 6; index++) {
00494 int item = slot.getEquipment(character, index);
00495
00496 itemChoice[index]->SetSelection(item & 0x7F);
00497 itemEquippedCheck[index]->SetValue(item & 0x80);
00498 }
00499
00500 currentSlot = temp;
00501 }
00502
00503 void MainFrame::loadGame(int game) {
00504 SaveSlot &slot = *saveslot[game];
00505
00506 slot.modified = false;
00507 herosNameText->SetValue(slot.getHerosName());
00508
00509 memberClass[0]->SetSelection(slot.getMember(0) - 1);
00510 memberClass[1]->SetSelection(slot.getMember(1));
00511 memberClass[2]->SetSelection(slot.getMember(2));
00512 memberClass[3]->SetSelection(slot.getMember(3));
00513
00514 honestySlider->SetValue(slot.getVirtue(HONESTY));
00515 compassionSlider->SetValue(slot.getVirtue(COMPASSION));
00516 valorSlider->SetValue(slot.getVirtue(VALOR));
00517 justiceSlider->SetValue(slot.getVirtue(JUSTICE));
00518 sacrificeSlider->SetValue(slot.getVirtue(SACRIFICE));
00519 honorSlider->SetValue(slot.getVirtue(HONOR));
00520 spiritualitySlider->SetValue(slot.getVirtue(SPIRITUALITY));
00521 humilitySlider->SetValue(slot.getVirtue(HUMILITY));
00522
00523 lightSpellCheck->SetValue(slot.hasMagic(LIGHT));
00524 missileSpellCheck->SetValue(slot.hasMagic(MISSILE));
00525 awakenSpellCheck->SetValue(slot.hasMagic(AWAKEN));
00526 cureSpellCheck->SetValue(slot.hasMagic(CURE));
00527 windSpellCheck->SetValue(slot.hasMagic(WIND));
00528 healSpellCheck->SetValue(slot.hasMagic(HEAL));
00529 fireSpellCheck->SetValue(slot.hasMagic(FIRE));
00530 exitSpellCheck->SetValue(slot.hasMagic(EXIT));
00531 dispelSpellCheck->SetValue(slot.hasMagic(DISPEL));
00532 viewSpellCheck->SetValue(slot.hasMagic(VIEW));
00533 protectSpellCheck->SetValue(slot.hasMagic(PROTECT));
00534 iceSpellCheck->SetValue(slot.hasMagic(ICE));
00535 blinkSpellCheck->SetValue(slot.hasMagic(BLINK));
00536 energySpellCheck->SetValue(slot.hasMagic(ENERGY));
00537 quickSpellCheck->SetValue(slot.hasMagic(QUICK));
00538 sleepSpellCheck->SetValue(slot.hasMagic(SLEEP));
00539 reflectSpellCheck->SetValue(slot.hasMagic(REFLECT));
00540 negateSpellCheck->SetValue(slot.hasMagic(NEGATE));
00541 destroySpellCheck->SetValue(slot.hasMagic(DESTROY));
00542 jinxSpellCheck->SetValue(slot.hasMagic(JINX));
00543 squishSpellCheck->SetValue(slot.hasMagic(SQUISH));
00544 gateSpellCheck->SetValue(slot.hasMagic(GATE));
00545 tremorSpellCheck->SetValue(slot.hasMagic(TREMOR));
00546 lifeSpellCheck->SetValue(slot.hasMagic(LIFE));
00547 defeatSpellCheck->SetValue(slot.hasMagic(DEFEAT));
00548
00549 trammelChoice->SetSelection(slot.getPhase(TRAMMEL));
00550 setFeluccaOptions(slot.getPhase(TRAMMEL));
00551 feluccaChoice->SetSelection(slot.getPhase(FELUCCA));
00552
00553 wxString gold;
00554 gold.Printf("%d", slot.getGold());
00555 goldText->SetValue(gold);
00556
00557 ashSlider->SetValue(slot.getHerb(ASH));
00558 ginsengSlider->SetValue(slot.getHerb(GINSENG));
00559 garlicSlider->SetValue(slot.getHerb(GARLIC));
00560 silkwebSlider->SetValue(slot.getHerb(SILKWEB));
00561 mossSlider->SetValue(slot.getHerb(MOSS));
00562 pearlSlider->SetValue(slot.getHerb(PEARL));
00563 fungusSlider->SetValue(slot.getHerb(FUNGUS));
00564 manrootSlider->SetValue(slot.getHerb(MANROOT));
00565
00566 honestyRuneCheck->SetValue(slot.hasRune(HONESTY));
00567 compassionRuneCheck->SetValue(slot.hasRune(COMPASSION));
00568 valorRuneCheck->SetValue(slot.hasRune(VALOR));
00569 justiceRuneCheck->SetValue(slot.hasRune(JUSTICE));
00570 sacrificeRuneCheck->SetValue(slot.hasRune(SACRIFICE));
00571 honorRuneCheck->SetValue(slot.hasRune(HONOR));
00572 spiritualityRuneCheck->SetValue(slot.hasRune(SPIRITUALITY));
00573 humilityRuneCheck->SetValue(slot.hasRune(HUMILITY));
00574
00575 blueStoneCheck->SetValue(slot.hasStone(HONESTY));
00576 yellowStoneCheck->SetValue(slot.hasStone(COMPASSION));
00577 redStoneCheck->SetValue(slot.hasStone(VALOR));
00578 greenStoneCheck->SetValue(slot.hasStone(JUSTICE));
00579 orangeStoneCheck->SetValue(slot.hasStone(SACRIFICE));
00580 purpleStoneCheck->SetValue(slot.hasStone(HONOR));
00581 whiteStoneCheck->SetValue(slot.hasStone(SPIRITUALITY));
00582 blackStoneCheck->SetValue(slot.hasStone(HUMILITY));
00583
00584 torchSlider->SetValue(slot.getTool(TORCH));
00585 gemSlider->SetValue(slot.getTool(GEM));
00586 oilSlider->SetValue(slot.getTool(OIL));
00587
00588 keyCheck->SetValue(slot.getTool(KEY));
00589 sextantCheck->SetValue(slot.getTool(SEXTANT));
00590 scaleCheck->SetValue(slot.getTool(SCALE));
00591 fluteCheck->SetValue(slot.getTool(FLUTE));
00592 candleCheck->SetValue(slot.getTool(CANDLE));
00593 bookCheck->SetValue(slot.getTool(BOOK));
00594 bellCheck->SetValue(slot.getTool(BELL));
00595 hornCheck->SetValue(slot.getTool(HORN));
00596 skullCheck->SetValue(slot.getTool(SKULL));
00597 truthKeyCheck->SetValue(slot.getTool(TRUTHKEY));
00598 courageKeyCheck->SetValue(slot.getTool(COURAGEKEY));
00599 loveKeyCheck->SetValue(slot.getTool(LOVEKEY));
00600 wheelCheck->SetValue(slot.getTool(WHEEL));
00601
00602 loadStats(slot, characterChoice->GetSelection());
00603
00604 currentSlot = game;
00605 notebook->SetSelection(0);
00606 notebook->Show(true);
00607 }
00608
00609 void MainFrame::load(wxString &filename) {
00610 if (isOpen()) {
00611 if (!close()) {
00612 return;
00613 }
00614 }
00615
00616 char nvram[SAVE_SIZE];
00617
00618 sram = new char[SRAM_SIZE];
00619 std::ifstream in(filename.mb_str(), std::ios::in | std::ios::binary);
00620
00621 if (!in) {
00622
00623 wxMessageBox(wxT("Unable to open the SRAM file."),
00624 wxT("File Open Error"), wxOK | wxICON_ERROR);
00625
00626 delete sram;
00627 return;
00628 }
00629
00630 in.read(sram, SRAM_SIZE);
00631
00632 if (in.rdstate() & std::ios::failbit) {
00633 wxMessageBox(wxT("Unable to read the SRAM file."),
00634 wxT("File I/O Error"), wxOK | wxICON_ERROR);
00635
00636 in.close();
00637 return;
00638 }
00639
00640 in.close();
00641
00642 for (int slot = 0; slot < 3; slot++) {
00643 memcpy(nvram, (sram + SRAM_OFFSET + (slot * SAVE_SIZE)), SAVE_SIZE);
00644 saveslot[slot] = new SaveSlot((const unsigned char *)nvram);
00645 games[slot]->Enable(saveslot[slot]->isValid());
00646
00647 if (saveslot[slot]->isValid()) {
00648 games[slot]->Enable(true);
00649 } else {
00650 games[0]->Enable(false);
00651 }
00652 }
00653
00654 setOpen(true);
00655
00656 if (saveslot[0]->isValid()) {
00657 loadGame(0);
00658 } else if (saveslot[1]->isValid()) {
00659 loadGame(1);
00660 } else if (saveslot[2]->isValid()) {
00661 loadGame(2);
00662 } else {
00663 setOpen(false);
00664
00665 wxMessageBox(wxT("No Ultima: Quest of the Avatar games exist in the SRAM file you loaded."),
00666 wxT("Error: No Games Found"), wxOK | wxICON_ERROR);
00667 }
00668
00669 if (isOpen()) {
00670 wxString bakfile = filename + ".bak";
00671 std::ofstream out(bakfile.mb_str(), std::ios::out | std::ios::binary);
00672
00673 if (out) {
00674 out.write(sram, SRAM_SIZE);
00675 out.close();
00676 }
00677 }
00678 }
00679
00680 void MainFrame::fileOpen(wxCommandEvent &) {
00681 static wxFileDialog *dlg = new wxFileDialog(this,
00682 wxT("Choose a .SAV File"), "", "",
00683 wxT("NES SRAM File (*.sav)|*.sav"), (wxOPEN | wxCHANGE_DIR));
00684
00685 int value = dlg->ShowModal();
00686
00687 if (value == wxID_OK) {
00688 sramFile = dlg->GetPath();
00689 load(sramFile);
00690 }
00691 }
00692
00693 bool MainFrame::isValidParty() const {
00694 char members = 0;
00695 bool end = false;
00696
00697 for (int i = 0; i < 4; i++) {
00698 int member = memberClass[i]->GetSelection();
00699
00700 if (i > 0) {
00701 member--;
00702 }
00703
00704 if (member == -1) {
00705 end = true;
00706 } else {
00707 if (members & (1 << member)) {
00708 return false;
00709 }
00710
00711 if (end) {
00712 return false;
00713 }
00714
00715 members |= (1 << member);
00716 }
00717 }
00718
00719 return true;
00720 }
00721
00722 bool MainFrame::hasValidEquipment(int character) const {
00723 bool bow = false;
00724 bool weapon = false;
00725 bool armor = false;
00726
00727 SaveSlot &slot = *(saveslot[currentSlot]);
00728
00729 for (int i = 0; i < 6; i++) {
00730 int item = slot.getEquipment(character, i);
00731
00732 if (item & 0x80) {
00733 item &= 0x7F;
00734
00735 if ((item > 0x1) && (item <= 0x4)) {
00736 if (bow) {
00737 return false;
00738 }
00739
00740 bow = true;
00741 } else if ((item > 0x4) && (item <= 0xF)) {
00742 if (weapon) {
00743 return false;
00744 }
00745
00746 weapon = true;
00747 } else if ((item > 0xF) && (item <= 0x19)) {
00748 if (armor) {
00749 return false;
00750 }
00751
00752 armor = true;
00753 }
00754 }
00755 }
00756
00757 return true;
00758 }
00759
00760 bool MainFrame::save(wxString &filename) {
00761 if (!isValidParty()) {
00762 int choice = wxMessageBox(wxT("Duplicate or missing party members selected.\nContinue Saving?"),
00763 wxT("Warning: Invalid Party"),
00764 wxYES_NO | wxICON_QUESTION,
00765 this);
00766
00767 if (choice != wxYES) {
00768 return false;
00769 }
00770 }
00771
00772 for (int character = MAGE; character < SHEPHERD; character++) {
00773 if (!hasValidEquipment(character)) {
00774 int choice = wxMessageBox(CHARACTER_NAMES[character] +
00775 wxT(" has more than one equipped item of the same type.\nContinue Saving?"),
00776 wxT("Warning: Invalid Equipment"),
00777 wxYES_NO | wxICON_QUESTION,
00778 this);
00779
00780 if (choice != wxYES) {
00781 return false;
00782 }
00783 }
00784 }
00785
00786 for (int offset = 0; offset < 3; offset++) {
00787 char *nvram = (char *)saveslot[offset]->nvram;
00788 char *save = (sram + SRAM_OFFSET + (offset * SAVE_SIZE));
00789
00790 memcpy(save, nvram, SAVE_SIZE);
00791
00792 for (int byte = 0; byte < 3; byte++) {
00793 char *checksum = (sram + SANITY_OFFSET + offset + (byte * 3));
00794
00795 switch (byte) {
00796 case 0:
00797 *checksum = nvram[0];
00798 break;
00799 case 1:
00800 *checksum = (nvram[0] ^ SANITY_XOR1);
00801 break;
00802 case 2:
00803 *checksum = (nvram[0] ^ SANITY_XOR2);
00804 break;
00805 }
00806 }
00807 }
00808
00809 std::ofstream out(filename.mb_str(), std::ios::binary | std::ios::out);
00810
00811 if (!out) {
00812 wxMessageBox(wxT("Unable to open the SRAM file."),
00813 wxT("File Open Error"), wxOK | wxICON_ERROR);
00814
00815 return false;
00816 }
00817
00818 out.write(sram, SRAM_SIZE);
00819
00820 if (out.rdstate() & std::ios::failbit) {
00821 wxMessageBox(wxT("Unable to write to the SRAM file."),
00822 wxT("File I/O error"), wxOK | wxICON_ERROR);
00823
00824 out.close();
00825 return false;
00826 }
00827
00828 out.close();
00829
00830 saveslot[0]->setModified(false);
00831 saveslot[1]->setModified(false);
00832 saveslot[2]->setModified(false);
00833
00834 return true;
00835 }
00836
00837 void MainFrame::fileSave(wxCommandEvent &) {
00838 save(sramFile);
00839 }
00840
00841 void MainFrame::fileSaveAs(wxCommandEvent &) {
00842 static wxFileDialog *dlg = new wxFileDialog(this,
00843 wxT("Choose a .SAV File"), "", "",
00844 wxT("NES SRAM File (*.sav)|*.sav"), (wxSAVE | wxCHANGE_DIR));
00845
00846 int value = dlg->ShowModal();
00847
00848 if (value == wxID_OK) {
00849 sramFile = dlg->GetPath();
00850 save(sramFile);
00851 }
00852 }
00853
00854 void MainFrame::setOpen(bool open) {
00855 fileSaveItem->Enable(open);
00856 fileSaveAsItem->Enable(open);
00857 fileCloseItem->Enable(open);
00858
00859 if (!open && (currentSlot != -1)) {
00860 currentSlot = -1;
00861
00862 delete saveslot[0];
00863 delete saveslot[1];
00864 delete saveslot[2];
00865 delete sram;
00866 }
00867
00868 this->open = open;
00869 }
00870
00871 bool MainFrame::close() {
00872 if (saveslot[0]->isModified() ||
00873 saveslot[1]->isModified() ||
00874 saveslot[2]->isModified()) {
00875 int choice = wxMessageBox(wxT("Save Game File Before Closing?"),
00876 wxT("Warning: Unsaved Changes"),
00877 wxYES_NO | wxCANCEL | wxICON_QUESTION,
00878 this);
00879
00880 if (choice == wxYES) {
00881 if (!save(sramFile)) {
00882 return false;
00883 }
00884 } else if (choice == wxCANCEL) {
00885 return false;
00886 }
00887 }
00888
00889 notebook->Show(false);
00890
00891 games[0]->Check(true);
00892 games[0]->Enable(false);
00893 games[1]->Enable(false);
00894 games[2]->Enable(false);
00895
00896 setOpen(false);
00897
00898 return true;
00899 }
00900
00901 void MainFrame::fileClose(wxCommandEvent &) {
00902 close();
00903 }
00904
00905 void MainFrame::fileExit(wxCommandEvent &) {
00906 if (isOpen()) {
00907 if (close()) {
00908 Close(true);
00909 }
00910 } else {
00911 Close(true);
00912 }
00913 }
00914
00915 void MainFrame::windowClosing(wxCloseEvent &event) {
00916 if (event.CanVeto()) {
00917 if (isOpen()) {
00918 if (!close()) {
00919 event.Veto();
00920 return;
00921 }
00922 }
00923 }
00924
00925 Destroy();
00926 }
00927
00928 void MainFrame::gameChange(wxCommandEvent &event) {
00929 int id = event.GetId();
00930
00931 currentSlot = -1;
00932
00933 if (id == XRCID("IDM_GAME_GAME1")) {
00934 loadGame(0);
00935 } else if (id == XRCID("IDM_GAME_GAME2")) {
00936 loadGame(1);
00937 } else if (id == XRCID("IDM_GAME_GAME3")) {
00938 loadGame(2);
00939 }
00940 }
00941
00942 void MainFrame::helpAbout(wxCommandEvent &) {
00943 wxMessageDialog dlg(this, *Hack4u::APP_NAME + wxT(' ') +
00944 *Hack4u::APP_VERSION + wxT('\n') +
00945 *Hack4u::APP_COPYRIGHT + wxT('\n') +
00946 *Hack4u::APP_URL, wxT("About ") +
00947 *Hack4u::APP_NAME + wxT("..."),
00948 wxOK | wxICON_INFORMATION);
00949 dlg.ShowModal();
00950 }
00951
00952 void MainFrame::herosNameChange(wxCommandEvent &) {
00953 if (currentSlot == -1) {
00954 return;
00955 }
00956
00957 wxString string = herosNameText->GetValue();
00958 saveslot[currentSlot]->setHerosName(string);
00959 }
00960
00961 void MainFrame::memberClassChange(wxCommandEvent &event) {
00962 if (currentSlot == -1) {
00963 return;
00964 }
00965
00966 wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00967 int character = ctrl->GetSelection();
00968 int member = 3;
00969
00970 if (ctrl == memberClass[0]) {
00971 member = 0;
00972 } else if (ctrl == memberClass[1]) {
00973 member = 1;
00974 } else if (ctrl == memberClass[2]) {
00975 member = 2;
00976 }
00977
00978 saveslot[currentSlot]->setMember(member, ((member == 0) ?
00979 (character + 1) : character));
00980 }
00981
00982 void MainFrame::virtueChange(wxScrollEvent &event) {
00983 if (currentSlot == -1) {
00984 return;
00985 }
00986
00987 wxSlider *ctrl = (wxSlider *)event.GetEventObject();
00988 int virtue = HUMILITY;
00989
00990 if (ctrl == honestySlider) {
00991 virtue = HONESTY;
00992 } else if (ctrl == compassionSlider) {
00993 virtue = COMPASSION;
00994 } else if (ctrl == valorSlider) {
00995 virtue = VALOR;
00996 } else if (ctrl == justiceSlider) {
00997 virtue = JUSTICE;
00998 } else if (ctrl == sacrificeSlider) {
00999 virtue = SACRIFICE;
01000 } else if (ctrl == honorSlider) {
01001 virtue = HONOR;
01002 } else if (ctrl == spiritualitySlider) {
01003 virtue = SPIRITUALITY;
01004 }
01005
01006 saveslot[currentSlot]->setVirtue(virtue, ctrl->GetValue());
01007 }
01008
01009 void MainFrame::magicChange(wxCommandEvent &event) {
01010 if (currentSlot == -1) {
01011 return;
01012 }
01013
01014 wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
01015 int magic = DEFEAT;
01016
01017 if (ctrl == lightSpellCheck) {
01018 magic = LIGHT;
01019 } else if (ctrl == missileSpellCheck) {
01020 magic = MISSILE;
01021 } else if (ctrl == awakenSpellCheck) {
01022 magic = AWAKEN;
01023 } else if (ctrl == cureSpellCheck) {
01024 magic = CURE;
01025 } else if (ctrl == windSpellCheck) {
01026 magic = WIND;
01027 } else if (ctrl == healSpellCheck) {
01028 magic = HEAL;
01029 } else if (ctrl == fireSpellCheck) {
01030 magic = FIRE;
01031 } else if (ctrl == exitSpellCheck) {
01032 magic = EXIT;
01033 } else if (ctrl == dispelSpellCheck) {
01034 magic = DISPEL;
01035 } else if (ctrl == viewSpellCheck) {
01036 magic = VIEW;
01037 } else if (ctrl == protectSpellCheck) {
01038 magic = PROTECT;
01039 } else if (ctrl == iceSpellCheck) {
01040 magic = ICE;
01041 } else if (ctrl == blinkSpellCheck) {
01042 magic = BLINK;
01043 } else if (ctrl == energySpellCheck) {
01044 magic = ENERGY;
01045 } else if (ctrl == quickSpellCheck) {
01046 magic = QUICK;
01047 } else if (ctrl == sleepSpellCheck) {
01048 magic = SLEEP;
01049 } else if (ctrl == reflectSpellCheck) {
01050 magic = REFLECT;
01051 } else if (ctrl == negateSpellCheck) {
01052 magic = NEGATE;
01053 } else if (ctrl == destroySpellCheck) {
01054 magic = DESTROY;
01055 } else if (ctrl == jinxSpellCheck) {
01056 magic = JINX;
01057 } else if (ctrl == squishSpellCheck) {
01058 magic = SQUISH;
01059 } else if (ctrl == gateSpellCheck) {
01060 magic = GATE;
01061 } else if (ctrl == tremorSpellCheck) {
01062 magic = TREMOR;
01063 } else if (ctrl == lifeSpellCheck) {
01064 magic = LIFE;
01065 }
01066
01067 saveslot[currentSlot]->setMagic(magic, ctrl->IsChecked());
01068 }
01069
01070 void MainFrame::phaseChange(wxCommandEvent &event) {
01071 if (currentSlot == -1) {
01072 return;
01073 }
01074
01075 wxChoice *ctrl = (wxChoice *)event.GetEventObject();
01076 int trammel, felucca;
01077
01078 if (ctrl == trammelChoice) {
01079 trammel = ctrl->GetSelection();
01080 setFeluccaOptions(trammel);
01081 } else {
01082 trammel = trammelChoice->GetSelection();
01083 }
01084
01085 felucca = feluccaChoice->GetSelection();
01086
01087 saveslot[currentSlot]->setPhase(trammel, felucca);
01088 }
01089
01090 void MainFrame::goldChange(wxCommandEvent &) {
01091 if (currentSlot == -1) {
01092 return;
01093 }
01094
01095 saveslot[currentSlot]->setGold(atoi(goldText->GetValue()));
01096 }
01097
01098 void MainFrame::herbChange(wxScrollEvent &event) {
01099 if (currentSlot == -1) {
01100 return;
01101 }
01102
01103 wxSlider *ctrl = (wxSlider *)event.GetEventObject();
01104 int herb = MANROOT;
01105
01106 if (ctrl == ashSlider) {
01107 herb = ASH;
01108 } else if (ctrl == ginsengSlider) {
01109 herb = GINSENG;
01110 } else if (ctrl == garlicSlider) {
01111 herb = GARLIC;
01112 } else if (ctrl == silkwebSlider) {
01113 herb = SILKWEB;
01114 } else if (ctrl == mossSlider) {
01115 herb = MOSS;
01116 } else if (ctrl == pearlSlider) {
01117 herb = PEARL;
01118 } else if (ctrl == fungusSlider) {
01119 herb = FUNGUS;
01120 }
01121
01122 saveslot[currentSlot]->setHerb(herb, ctrl->GetValue());
01123 }
01124
01125 void MainFrame::runeChange(wxCommandEvent &event) {
01126 if (currentSlot == -1) {
01127 return;
01128 }
01129
01130 wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
01131 int rune = HUMILITY;
01132
01133 if (ctrl == honestyRuneCheck) {
01134 rune = HONESTY;
01135 } else if (ctrl == compassionRuneCheck) {
01136 rune = COMPASSION;
01137 } else if (ctrl == valorRuneCheck) {
01138 rune = VALOR;
01139 } else if (ctrl == justiceRuneCheck) {
01140 rune = JUSTICE;
01141 } else if (ctrl == sacrificeRuneCheck) {
01142 rune = SACRIFICE;
01143 } else if (ctrl == honorRuneCheck) {
01144 rune = HONOR;
01145 } else if (ctrl == spiritualityRuneCheck) {
01146 rune = SPIRITUALITY;
01147 }
01148
01149 saveslot[currentSlot]->setRune(rune, ctrl->IsChecked());
01150 }
01151
01152 void MainFrame::stoneChange(wxCommandEvent &event) {
01153 if (currentSlot == -1) {
01154 return;
01155 }
01156
01157 wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
01158 int stone = HUMILITY;
01159
01160 if (ctrl == blueStoneCheck) {
01161 stone = HONESTY;
01162 } else if (ctrl == yellowStoneCheck) {
01163 stone = COMPASSION;
01164 } else if (ctrl == redStoneCheck) {
01165 stone = VALOR;
01166 } else if (ctrl == greenStoneCheck) {
01167 stone = JUSTICE;
01168 } else if (ctrl == orangeStoneCheck) {
01169 stone = SACRIFICE;
01170 } else if (ctrl == purpleStoneCheck) {
01171 stone = HONOR;
01172 } else if (ctrl == whiteStoneCheck) {
01173 stone = SPIRITUALITY;
01174 }
01175
01176 saveslot[currentSlot]->setStone(stone, ctrl->IsChecked());
01177 }
01178
01179 void MainFrame::toolQuantityChange(wxScrollEvent &event) {
01180 if (currentSlot == -1) {
01181 return;
01182 }
01183
01184 wxSlider *ctrl = (wxSlider *)event.GetEventObject();
01185 int tool = OIL;
01186
01187 if (ctrl == torchSlider) {
01188 tool = TORCH;
01189 } else if (ctrl == gemSlider) {
01190 tool = GEM;
01191 }
01192
01193 saveslot[currentSlot]->setTool(tool, ctrl->GetValue());
01194 }
01195
01196 void MainFrame::toolHaveChange(wxCommandEvent &event) {
01197 if (currentSlot == -1) {
01198 return;
01199 }
01200
01201 wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
01202 int tool = WHEEL;
01203
01204 if (ctrl == keyCheck) {
01205 tool = KEY;
01206 } else if (ctrl == sextantCheck) {
01207 tool = SEXTANT;
01208 } else if (ctrl == scaleCheck) {
01209 tool = SCALE;
01210 } else if (ctrl == fluteCheck) {
01211 tool = FLUTE;
01212 } else if (ctrl == candleCheck) {
01213 tool = CANDLE;
01214 } else if (ctrl == bookCheck) {
01215 tool = BOOK;
01216 } else if (ctrl == bellCheck) {
01217 tool = BELL;
01218 } else if (ctrl == hornCheck) {
01219 tool = HORN;
01220 } else if (ctrl == skullCheck) {
01221 tool = SKULL;
01222 } else if (ctrl == truthKeyCheck) {
01223 tool = TRUTHKEY;
01224 } else if (ctrl == courageKeyCheck) {
01225 tool = COURAGEKEY;
01226 } else if (ctrl == loveKeyCheck) {
01227 tool = LOVEKEY;
01228 }
01229
01230 saveslot[currentSlot]->setTool(tool, (ctrl->IsChecked() ? 1 : 0));
01231 }
01232
01233 void MainFrame::characterChange(wxCommandEvent &) {
01234 if (currentSlot == -1) {
01235 return;
01236 }
01237
01238 loadStats((*(saveslot[currentSlot])), characterChoice->GetSelection());
01239 }
01240
01241 void MainFrame::statChange(wxCommandEvent &event) {
01242 if (currentSlot == -1) {
01243 return;
01244 }
01245
01246 wxTextCtrl *ctrl = (wxTextCtrl *)event.GetEventObject();
01247 int character = characterChoice->GetSelection();
01248
01249 if (ctrl == levelText) {
01250 saveslot[currentSlot]->setLevel(character, atoi(ctrl->GetValue()));
01251 } else if (ctrl == experienceText) {
01252 saveslot[currentSlot]->setExperience(character, atoi(ctrl->GetValue()));
01253 } else if (ctrl == currentHPText) {
01254 saveslot[currentSlot]->setCurrentHP(character, atoi(ctrl->GetValue()));
01255 } else if (ctrl == currentMPText) {
01256 saveslot[currentSlot]->setCurrentMP(character, atoi(ctrl->GetValue()));
01257 } else if (ctrl == maxHPText) {
01258 saveslot[currentSlot]->setMaxHP(character, atoi(ctrl->GetValue()));
01259 } else if (ctrl == maxMPText) {
01260 saveslot[currentSlot]->setMaxMP(character, atoi(ctrl->GetValue()));
01261 } else if (ctrl == strengthText) {
01262 saveslot[currentSlot]->setStrength(character, atoi(ctrl->GetValue()));
01263 } else if (ctrl == intelligenceText) {
01264 saveslot[currentSlot]->setIntelligence(character, atoi(ctrl->GetValue()));
01265 } else if (ctrl == dexterityText) {
01266 saveslot[currentSlot]->setDexterity(character, atoi(ctrl->GetValue()));
01267 }
01268 }
01269
01270 void MainFrame::setEquipment(int slot) {
01271 int character = characterChoice->GetSelection();
01272 int item = itemChoice[slot]->GetSelection();
01273
01274 if (itemEquippedCheck[slot]->IsChecked()) {
01275
01276 if (item != 0) {
01277 item |= 0x80;
01278 }
01279 }
01280
01281 saveslot[currentSlot]->setEquipment(character, slot, item);
01282 }
01283
01284 void MainFrame::equipmentChange(wxCommandEvent &event) {
01285 if (currentSlot == -1) {
01286 return;
01287 }
01288
01289 wxChoice *ctrl = (wxChoice *)event.GetEventObject();
01290 int slot;
01291
01292 for (slot = 0; slot < 6; slot++) {
01293 if (ctrl == itemChoice[slot]) {
01294 break;
01295 }
01296 }
01297
01298 setEquipment(slot);
01299 }
01300
01301 void MainFrame::equippedChange(wxCommandEvent &event) {
01302 if (currentSlot == -1) {
01303 return;
01304 }
01305
01306 wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
01307 int slot;
01308
01309 for (slot = 0; slot < 6; slot++) {
01310 if (ctrl == itemEquippedCheck[slot]) {
01311 break;
01312 }
01313 }
01314
01315 setEquipment(slot);
01316 }
01317