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

MainFrame.cc

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

Generated on Wed Aug 3 20:38:52 2005 for hack4u by  doxygen 1.4.4