Main Page | Namespace List | Class List | File List | Namespace Members | Class Members | File Members

source/view/MainFrame.cc

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2004 emuWorks
00003  * http://games.technoplaza.net/
00004  *
00005  * This program is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU General Public License
00007  * as published by the Free Software Foundation; either version 2
00008  * of the License, or (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00018  */
00019 
00020 // $Id: MainFrame.cc,v 1.24 2004/12/05 02:59:28 technoplaza Exp $
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         // can't equip nothing
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 

Generated on Sat Dec 4 23:06:36 2004 for hack4u by  doxygen 1.3.9.1