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