MainFrame.cc

Go to the documentation of this file.
00001 /*
00002  * ffse
00003  * Copyright (C) 2004-2005 emuWorks
00004  * http://games.technoplaza.net/
00005  *
00006  * This file is part of ffse.
00007  *
00008  * ffse 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  * ffse 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 ffse; 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.17 2007/02/18 22:02:58 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 <wx/xrc/xmlres.h>
00036 
00037 #include <fstream>
00038 #include <cstring>
00039 
00040 #include "ffse.hh"
00041 #include "model/SaveSlot.hh"
00042 #include "res/orb32x32.xpm"
00043 #include "view/FileDropTarget.hh"
00044 #include "view/MainFrame.hh"
00045 
00046 using namespace ffse;
00047 
00048 MainFrame::MainFrame() {
00049     SetParent(NULL);
00050     CreateControls();
00051     Centre();
00052     
00053     SetDropTarget(new FileDropTarget(this));
00054 }
00055 
00056 void MainFrame::CreateControls() {
00057     wxXmlResource::Get()->LoadFrame(this, GetParent(), wxT("ID_FRAME"));
00058     SetIcon(orb32x32_xpm);
00059     
00060     XRCCTRL(*this, "ID_NOTEBOOK", wxNotebook)->Show(false);
00061     
00062     wxMenuBar *menubar = GetMenuBar();
00063     
00064     memberItems[0] = menubar->FindItem(XRCID("IDM_MEMBER_ONE"));
00065     memberItems[0]->Enable(false);
00066     
00067     memberItems[1] = menubar->FindItem(XRCID("IDM_MEMBER_TWO"));
00068     memberItems[1]->Enable(false);
00069     
00070     memberItems[2] = menubar->FindItem(XRCID("IDM_MEMBER_THREE"));
00071     memberItems[2]->Enable(false);
00072     
00073     memberItems[3] = menubar->FindItem(XRCID("IDM_MEMBER_FOUR"));
00074     memberItems[3]->Enable(false);
00075     
00076     fileCloseItem = menubar->FindItem(XRCID("IDM_FILE_CLOSE"));
00077     fileSaveItem = menubar->FindItem(XRCID("IDM_FILE_SAVE"));
00078     fileSaveAsItem = menubar->FindItem(XRCID("IDM_FILE_SAVE_AS"));
00079     
00080     wxTextValidator numberValidator(wxFILTER_NUMERIC);
00081     goldText = XRCCTRL(*this, "ID_GENERAL_GOLD", wxTextCtrl);
00082     goldText->SetValidator(numberValidator);
00083     goldText->SetMaxLength(6);
00084     
00085     healSlider = XRCCTRL(*this, "ID_GENERAL_HEAL", wxSlider);
00086     pureSlider = XRCCTRL(*this, "ID_GENERAL_PURE", wxSlider);
00087     softSlider = XRCCTRL(*this, "ID_GENERAL_SOFT", wxSlider);
00088     tentSlider = XRCCTRL(*this, "ID_GENERAL_TENT", wxSlider);
00089     cabinSlider = XRCCTRL(*this, "ID_GENERAL_CABIN", wxSlider);
00090     houseSlider = XRCCTRL(*this, "ID_GENERAL_HOUSE", wxSlider);
00091     
00092     wxArrayString letters;
00093     letters.Add(wxT("A")); letters.Add(wxT("B")); letters.Add(wxT("C"));
00094     letters.Add(wxT("D")); letters.Add(wxT("E")); letters.Add(wxT("F"));
00095     letters.Add(wxT("G")); letters.Add(wxT("H")); letters.Add(wxT("I"));
00096     letters.Add(wxT("J")); letters.Add(wxT("K")); letters.Add(wxT("L"));
00097     letters.Add(wxT("M")); letters.Add(wxT("N")); letters.Add(wxT("O"));
00098     letters.Add(wxT("P")); letters.Add(wxT("Q")); letters.Add(wxT("R"));
00099     letters.Add(wxT("S")); letters.Add(wxT("T")); letters.Add(wxT("U"));
00100     letters.Add(wxT("V")); letters.Add(wxT("W")); letters.Add(wxT("X"));
00101     letters.Add(wxT("Y")); letters.Add(wxT("Z")); letters.Add(wxT("a"));
00102     letters.Add(wxT("b")); letters.Add(wxT("c")); letters.Add(wxT("d"));
00103     letters.Add(wxT("e")); letters.Add(wxT("f")); letters.Add(wxT("g"));
00104     letters.Add(wxT("h")); letters.Add(wxT("i")); letters.Add(wxT("j"));
00105     letters.Add(wxT("k")); letters.Add(wxT("l")); letters.Add(wxT("m"));
00106     letters.Add(wxT("n")); letters.Add(wxT("o")); letters.Add(wxT("p"));
00107     letters.Add(wxT("q")); letters.Add(wxT("r")); letters.Add(wxT("s"));
00108     letters.Add(wxT("t")); letters.Add(wxT("u")); letters.Add(wxT("v"));
00109     letters.Add(wxT("w")); letters.Add(wxT("x")); letters.Add(wxT("y"));
00110     letters.Add(wxT("z")); letters.Add(wxT("0")); letters.Add(wxT("1"));
00111     letters.Add(wxT("2")); letters.Add(wxT("3")); letters.Add(wxT("4"));
00112     letters.Add(wxT("5")); letters.Add(wxT("6")); letters.Add(wxT("7"));
00113     letters.Add(wxT("8")); letters.Add(wxT("9")); letters.Add(wxT("'"));
00114     letters.Add(wxT(",")); letters.Add(wxT(".")); letters.Add(wxT("-"));
00115     letters.Add(wxT(":")); letters.Add(wxT("!")); letters.Add(wxT("?"));
00116 
00117     wxTextValidator nameValidator(wxFILTER_INCLUDE_CHAR_LIST);
00118     nameValidator.SetIncludes(letters);
00119     
00120     nameText = XRCCTRL(*this, "ID_CHARACTER_NAME", wxTextCtrl);
00121     nameText->SetValidator(nameValidator);
00122     nameText->SetMaxLength(4);
00123     
00124     classChoice = XRCCTRL(*this, "ID_CHARACTER_CLASS", wxChoice);
00125     conditionChoice = XRCCTRL(*this, "ID_CHARACTER_CONDITION", wxChoice);
00126     
00127     currentHPText = XRCCTRL(*this, "ID_CHARACTER_CURRENT_HP", wxTextCtrl);
00128     currentHPText->SetValidator(numberValidator);
00129     currentHPText->SetMaxLength(3);
00130     
00131     maxHPText = XRCCTRL(*this, "ID_CHARACTER_MAX_HP", wxTextCtrl);
00132     maxHPText->SetValidator(numberValidator);
00133     maxHPText->SetMaxLength(3);
00134     
00135     experienceText = XRCCTRL(*this, "ID_CHARACTER_EXPERIENCE", wxTextCtrl);
00136     experienceText->SetValidator(numberValidator);
00137     experienceText->SetMaxLength(6);
00138     
00139     strengthText = XRCCTRL(*this, "ID_CHARACTER_STRENGTH", wxTextCtrl);
00140     strengthText->SetValidator(numberValidator);
00141     strengthText->SetMaxLength(2);
00142     
00143     agilityText = XRCCTRL(*this, "ID_CHARACTER_AGILITY", wxTextCtrl);
00144     agilityText->SetValidator(numberValidator);
00145     agilityText->SetMaxLength(2);
00146     
00147     intelligenceText = XRCCTRL(*this, "ID_CHARACTER_INTELLIGENCE", wxTextCtrl);
00148     intelligenceText->SetValidator(numberValidator);
00149     intelligenceText->SetMaxLength(2);
00150     
00151     vitalityText = XRCCTRL(*this, "ID_CHARACTER_VITALITY", wxTextCtrl);
00152     vitalityText->SetValidator(numberValidator);
00153     vitalityText->SetMaxLength(2);
00154     
00155     luckText = XRCCTRL(*this, "ID_CHARACTER_LUCK", wxTextCtrl);
00156     luckText->SetValidator(numberValidator);
00157     luckText->SetMaxLength(2);
00158     
00159     damageText = XRCCTRL(*this, "ID_CHARACTER_DAMAGE", wxTextCtrl);
00160     damageText->SetValidator(numberValidator);
00161     damageText->SetMaxLength(3);
00162     
00163     hitPercentText = XRCCTRL(*this, "ID_CHARACTER_HIT_PERCENT", wxTextCtrl);
00164     hitPercentText->SetValidator(numberValidator);
00165     hitPercentText->SetMaxLength(3);
00166     
00167     weaponChoice[0] = XRCCTRL(*this, "ID_CHARACTER_WEAPON1", wxChoice);
00168     weaponEquippedCheck[0] =
00169         XRCCTRL(*this, "ID_CHARACTER_WEAPON_EQUIPPED1", wxCheckBox);
00170     weaponChoice[1] = XRCCTRL(*this, "ID_CHARACTER_WEAPON2", wxChoice);
00171     weaponEquippedCheck[1] =
00172         XRCCTRL(*this, "ID_CHARACTER_WEAPON_EQUIPPED2", wxCheckBox);
00173     weaponChoice[2] = XRCCTRL(*this, "ID_CHARACTER_WEAPON3", wxChoice);
00174     weaponEquippedCheck[2] =
00175         XRCCTRL(*this, "ID_CHARACTER_WEAPON_EQUIPPED3", wxCheckBox);
00176     weaponChoice[3] = XRCCTRL(*this, "ID_CHARACTER_WEAPON4", wxChoice);
00177     weaponEquippedCheck[3] =
00178         XRCCTRL(*this, "ID_CHARACTER_WEAPON_EQUIPPED4", wxCheckBox);
00179     
00180     armorChoice[0] = XRCCTRL(*this, "ID_CHARACTER_ARMOR1", wxChoice);
00181     armorEquippedCheck[0] =
00182         XRCCTRL(*this, "ID_CHARACTER_ARMOR_EQUIPPED1", wxCheckBox);
00183     armorChoice[1] = XRCCTRL(*this, "ID_CHARACTER_ARMOR2", wxChoice);
00184     armorEquippedCheck[1] =
00185         XRCCTRL(*this, "ID_CHARACTER_ARMOR_EQUIPPED2", wxCheckBox);
00186     armorChoice[2] = XRCCTRL(*this, "ID_CHARACTER_ARMOR3", wxChoice);
00187     armorEquippedCheck[2] =
00188         XRCCTRL(*this, "ID_CHARACTER_ARMOR_EQUIPPED3", wxCheckBox);
00189     armorChoice[3] = XRCCTRL(*this, "ID_CHARACTER_ARMOR4", wxChoice);
00190     armorEquippedCheck[3] =
00191         XRCCTRL(*this, "ID_CHARACTER_ARMOR_EQUIPPED4", wxCheckBox);
00192     
00193     currentMagicSlider[0] = XRCCTRL(*this, "ID_MAGIC_CURRENT1", wxSlider);
00194     maxMagicSlider[0] = XRCCTRL(*this, "ID_MAGIC_MAX1", wxSlider);
00195     currentMagicSlider[1] = XRCCTRL(*this, "ID_MAGIC_CURRENT2", wxSlider);
00196     maxMagicSlider[1] = XRCCTRL(*this, "ID_MAGIC_MAX2", wxSlider);
00197     currentMagicSlider[2] = XRCCTRL(*this, "ID_MAGIC_CURRENT3", wxSlider);
00198     maxMagicSlider[2] = XRCCTRL(*this, "ID_MAGIC_MAX3", wxSlider);
00199     currentMagicSlider[3] = XRCCTRL(*this, "ID_MAGIC_CURRENT4", wxSlider);
00200     maxMagicSlider[3] = XRCCTRL(*this, "ID_MAGIC_MAX4", wxSlider);
00201     currentMagicSlider[4] = XRCCTRL(*this, "ID_MAGIC_CURRENT5", wxSlider);
00202     maxMagicSlider[4] = XRCCTRL(*this, "ID_MAGIC_MAX5", wxSlider);
00203     currentMagicSlider[5] = XRCCTRL(*this, "ID_MAGIC_CURRENT6", wxSlider);
00204     maxMagicSlider[5] = XRCCTRL(*this, "ID_MAGIC_MAX6", wxSlider);
00205     currentMagicSlider[6] = XRCCTRL(*this, "ID_MAGIC_CURRENT7", wxSlider);
00206     maxMagicSlider[6] = XRCCTRL(*this, "ID_MAGIC_MAX7", wxSlider);
00207     currentMagicSlider[7] = XRCCTRL(*this, "ID_MAGIC_CURRENT8", wxSlider);
00208     maxMagicSlider[7] = XRCCTRL(*this, "ID_MAGIC_MAX8", wxSlider);
00209     
00210     knownMagicChoice[0][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN11", wxChoice);
00211     knownMagicChoice[0][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN12", wxChoice);
00212     knownMagicChoice[0][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN13", wxChoice);
00213     knownMagicChoice[1][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN21", wxChoice);
00214     knownMagicChoice[1][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN22", wxChoice);
00215     knownMagicChoice[1][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN23", wxChoice);
00216     knownMagicChoice[2][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN31", wxChoice);
00217     knownMagicChoice[2][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN32", wxChoice);
00218     knownMagicChoice[2][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN33", wxChoice);
00219     knownMagicChoice[3][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN41", wxChoice);
00220     knownMagicChoice[3][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN42", wxChoice);
00221     knownMagicChoice[3][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN43", wxChoice);
00222     knownMagicChoice[4][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN51", wxChoice);
00223     knownMagicChoice[4][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN52", wxChoice);
00224     knownMagicChoice[4][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN53", wxChoice);
00225     knownMagicChoice[5][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN61", wxChoice);
00226     knownMagicChoice[5][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN62", wxChoice);
00227     knownMagicChoice[5][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN63", wxChoice);
00228     knownMagicChoice[6][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN71", wxChoice);
00229     knownMagicChoice[6][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN72", wxChoice);
00230     knownMagicChoice[6][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN73", wxChoice);
00231     knownMagicChoice[7][0] = XRCCTRL(*this, "ID_MAGIC_KNOWN81", wxChoice);
00232     knownMagicChoice[7][1] = XRCCTRL(*this, "ID_MAGIC_KNOWN82", wxChoice);
00233     knownMagicChoice[7][2] = XRCCTRL(*this, "ID_MAGIC_KNOWN83", wxChoice);
00234     
00235     setOpen(false);
00236 }
00237 
00238 void MainFrame::setOpen(bool open) {
00239     fileSaveItem->Enable(open);
00240     fileSaveAsItem->Enable(open);
00241     fileCloseItem->Enable(open);
00242     
00243     for (int i = 0; i < 4; i++) {
00244         memberItems[i]->Enable(open);
00245     }
00246     
00247     this->open = open;
00248 }
00249 
00250 void MainFrame::loadCharacterData(int member) {
00251     this->member = member;
00252     
00253     wxString str = game->getName(member);
00254     nameText->SetValue(str);
00255     
00256     classChoice->SetSelection(game->getClass(member));
00257     conditionChoice->SetSelection(game->getCondition(member));
00258     
00259     str.Printf(wxT("%d"), game->getCurrentHP(member));
00260     currentHPText->SetValue(str);
00261     
00262     str.Printf(wxT("%d"), game->getMaxHP(member));
00263     maxHPText->SetValue(str);
00264     
00265     str.Printf(wxT("%d"), game->getExperience(member));
00266     experienceText->SetValue(str);
00267     
00268     str.Printf(wxT("%d"), game->getStrength(member));
00269     strengthText->SetValue(str);
00270     
00271     str.Printf(wxT("%d"), game->getAgility(member));
00272     agilityText->SetValue(str);
00273     
00274     str.Printf(wxT("%d"), game->getIntelligence(member));
00275     intelligenceText->SetValue(str);
00276     
00277     str.Printf(wxT("%d"), game->getVitality(member));
00278     vitalityText->SetValue(str);
00279     
00280     str.Printf(wxT("%d"), game->getLuck(member));
00281     luckText->SetValue(str);
00282     
00283     str.Printf(wxT("%d"), game->getDamage(member));
00284     damageText->SetValue(str);
00285     
00286     str.Printf(wxT("%d"), game->getHitPercent(member));
00287     hitPercentText->SetValue(str);
00288     
00289     for (int pos = 0; pos < 4; pos++) {
00290         int weapon = game->getWeapon(member, pos);
00291         int armor = game->getArmor(member, pos);
00292         
00293         weaponChoice[pos]->SetSelection(weapon & 0x7F);
00294         armorChoice[pos]->SetSelection(armor & 0x7F);
00295         
00296         weaponEquippedCheck[pos]->SetValue((weapon & 0x80) ? true : false);
00297         armorEquippedCheck[pos]->SetValue((armor & 0x80) ? true : false);
00298     }
00299     
00300     for (int level = 0; level < 8; level++) {
00301         int current = game->getCurrentMagic(member, level);
00302         int max = game->getMaxMagic(member, level);
00303         
00304         currentMagicSlider[level]->SetValue(current);
00305         maxMagicSlider[level]->SetValue(max);
00306         
00307         for (int slot = 0; slot < 3; slot++) {
00308             int magic = game->getMagic(member, level, slot);
00309             knownMagicChoice[level][slot]->SetSelection(magic);
00310         }
00311     }
00312 }
00313 
00314 void MainFrame::loadGameData() {
00315     wxString str;
00316     str.Printf(wxT("%d"), game->getGold());
00317     
00318     goldText->SetValue(str);
00319     
00320     healSlider->SetValue(game->getItem(HEALP));
00321     pureSlider->SetValue(game->getItem(PUREP));
00322     softSlider->SetValue(game->getItem(SOFTP));
00323     
00324     tentSlider->SetValue(game->getItem(TENT));
00325     cabinSlider->SetValue(game->getItem(CABIN));
00326     houseSlider->SetValue(game->getItem(HOUSE));
00327     
00328     XRCCTRL(*this, "ID_GENERAL_LUTE", wxCheckBox)->
00329         SetValue((game->getItem(LUTE) == 1) ? true : false);
00330     XRCCTRL(*this, "ID_GENERAL_CROWN", wxCheckBox)->
00331         SetValue((game->getItem(CROWN) == 1) ? true : false);
00332     XRCCTRL(*this, "ID_GENERAL_CRYSTAL", wxCheckBox)->
00333         SetValue((game->getItem(CRYSTAL) == 1) ? true : false);
00334     XRCCTRL(*this, "ID_GENERAL_HERB", wxCheckBox)->
00335         SetValue((game->getItem(HERB) == 1) ? true : false);
00336     XRCCTRL(*this, "ID_GENERAL_KEY", wxCheckBox)->
00337         SetValue((game->getItem(KEY) == 1) ? true : false);
00338     XRCCTRL(*this, "ID_GENERAL_TNT", wxCheckBox)->
00339         SetValue((game->getItem(TNT) == 1) ? true : false);
00340     XRCCTRL(*this, "ID_GENERAL_ADAMENT", wxCheckBox)->
00341         SetValue((game->getItem(ADAMENT) == 1) ? true : false);
00342     XRCCTRL(*this, "ID_GENERAL_SLAB", wxCheckBox)->
00343         SetValue((game->getItem(SLAB) == 1) ? true : false);
00344     XRCCTRL(*this, "ID_GENERAL_RUBY", wxCheckBox)->
00345         SetValue((game->getItem(RUBY) == 1) ? true : false);
00346     XRCCTRL(*this, "ID_GENERAL_ROD", wxCheckBox)->
00347         SetValue((game->getItem(ROD) == 1) ? true : false);
00348     XRCCTRL(*this, "ID_GENERAL_FLOATER", wxCheckBox)->
00349         SetValue((game->getItem(FLOATER) == 1) ? true : false);
00350     XRCCTRL(*this, "ID_GENERAL_CHIME", wxCheckBox)->
00351         SetValue((game->getItem(CHIME) == 1) ? true : false);
00352     XRCCTRL(*this, "ID_GENERAL_TAIL", wxCheckBox)->
00353         SetValue((game->getItem(TAIL) == 1) ? true : false);
00354     XRCCTRL(*this, "ID_GENERAL_CUBE", wxCheckBox)->
00355         SetValue((game->getItem(CUBE) == 1) ? true : false);
00356     XRCCTRL(*this, "ID_GENERAL_BOTTLE", wxCheckBox)->
00357         SetValue((game->getItem(BOTTLE) == 1) ? true : false);
00358     XRCCTRL(*this, "ID_GENERAL_OXYALE", wxCheckBox)->
00359         SetValue((game->getItem(OXYALE) == 1) ? true : false);
00360     XRCCTRL(*this, "ID_GENERAL_CANOE", wxCheckBox)->
00361         SetValue((game->getItem(CANOE) == 1) ? true : false);
00362     XRCCTRL(*this, "ID_GENERAL_FIRE_ORB", wxCheckBox)->
00363         SetValue((game->getItem(FIREORB) == 1) ? true : false);
00364     XRCCTRL(*this, "ID_GENERAL_WATER_ORB", wxCheckBox)->
00365         SetValue((game->getItem(WATERORB) == 1) ? true : false);
00366     XRCCTRL(*this, "ID_GENERAL_WIND_ORB", wxCheckBox)->
00367         SetValue((game->getItem(WINDORB) == 1) ? true : false);
00368     XRCCTRL(*this, "ID_GENERAL_EARTH_ORB", wxCheckBox)->
00369         SetValue((game->getItem(EARTHORB) == 1) ? true : false);
00370     
00371     loadCharacterData();
00372     
00373     XRCCTRL(*this, "ID_NOTEBOOK", wxNotebook)->Show(true);
00374 }
00375 
00376 void MainFrame::load(wxString &filename) {
00377     if (!close()) {
00378         return;
00379     }
00380     
00381     char nvram[GAME_SIZE];
00382     sram = new char[SRAM_SIZE];
00383     
00384     std::ifstream in(filename.mb_str(), std::ios::in | std::ios::binary);
00385     
00386     if (!in) {
00387         // unable to open file
00388         wxMessageBox(wxT("Unable to open the selected file."),
00389                      wxT("File I/O Error"), wxOK | wxICON_ERROR);
00390         return;
00391     }
00392     
00393     in.read(sram, SRAM_SIZE);
00394     
00395     if (in.rdstate() & std::ios::failbit) {
00396         // unable to read the requested data
00397         wxMessageBox(wxT("Unable to read the selected file."),
00398                      wxT("File I/O Error"), wxOK | wxICON_ERROR);
00399         return;
00400     }
00401     
00402     in.close();
00403     
00404     memcpy(nvram, (sram + GAME_OFFSET), GAME_SIZE);
00405     game = new SaveSlot(nvram);
00406     
00407     if (game->isValid()) {
00408         loadGameData();
00409         setOpen(true);
00410         
00411         wxString bakfile = filename + wxT(".bak");
00412         std::ofstream out(bakfile.mb_str(), std::ios::out | std::ios::binary);
00413         
00414         if (out) {
00415             out.write(sram, SRAM_SIZE);
00416             out.close();
00417         }
00418     } else {
00419         wxMessageBox(wxT("No game data found in the file you loaded."),
00420                      wxT("Error: No Data Found"), wxOK | wxICON_ERROR);
00421                      
00422         delete sram;
00423         delete game;
00424     }
00425 }
00426 
00427 void MainFrame::fileOpen(wxCommandEvent &) {
00428     static wxFileDialog *dlg = new wxFileDialog(this, 
00429         wxT("Choose a .SAV File"), wxT(""), wxT(""), 
00430         wxT("NES SRAM File (*.sav)|*.sav"), (wxOPEN | wxCHANGE_DIR));
00431         
00432     int value = dlg->ShowModal();
00433     
00434     if (value == wxID_OK) {
00435         sramFile = dlg->GetPath();
00436         load(sramFile);
00437     }
00438 }
00439 
00440 bool MainFrame::close() {
00441     if (!isOpen()) {
00442         return true;
00443     }
00444     
00445     if (game->isModified()) {
00446         int choice = wxMessageBox(wxT("Save Game File Before Closing?"),
00447                                   wxT("Warning: Unsaved Changes"),
00448                                   wxYES_NO | wxCANCEL | wxICON_QUESTION,
00449                                   this);
00450         
00451         if (choice == wxYES) {
00452             if (!save(sramFile)) {
00453                 return false;
00454             }
00455         } else if (choice == wxCANCEL) {
00456             return false;
00457         }
00458     }
00459     
00460     delete game;
00461     delete sram;
00462     
00463     memberItems[0]->Check(true);
00464     XRCCTRL(*this, "ID_NOTEBOOK", wxNotebook)->Show(false);
00465     
00466     setOpen(false);
00467     
00468     return true;
00469 }
00470 
00471 void MainFrame::fileClose(wxCommandEvent &) {
00472     close();
00473 }
00474 
00475 bool MainFrame::isValidEquipment() {
00476     bool weapon;
00477     bool armor;
00478     bool shield;
00479     bool helmet;
00480     bool gauntlet;
00481     
00482     for (int member = 0; member < 4; member++) {
00483         weapon = false;
00484         armor = false;
00485         shield = false;
00486         helmet = false;
00487         gauntlet = false;
00488         
00489         for (int slot = 0; slot < 4; slot++) {
00490             int item = game->getWeapon(member, slot);
00491         
00492             if ((item >= 0x81) && (item <= 0xA8)) {
00493                 if (weapon) {
00494                     return false;
00495                 }
00496             
00497                 weapon = true;
00498             }
00499         
00500             item = game->getArmor(member, slot);
00501         
00502             if ((item >= 0x81) && (item <= 0x90)) {
00503                 if (armor) {
00504                     return false;
00505                 }
00506             
00507                 armor = true;
00508             } else if ((item >= 0x91) && (item <= 0x99)) {
00509                 if (shield) {
00510                     return false;
00511                 }
00512             
00513                 shield = true;
00514             } else if ((item >= 0x9A) && (item <= 0xA0)) {
00515                 if (helmet) {
00516                     return false;
00517                 }
00518             
00519                 helmet = true;
00520             } else if ((item >= 0xA1) && (item <= 0xA8)) {
00521                 if (gauntlet) {
00522                     return false;
00523                 }
00524             
00525                 gauntlet = true;
00526             }
00527         }
00528     }
00529     
00530     return true;
00531 }
00532 
00533 bool MainFrame::save(wxString &filename) {
00534     if (!isValidEquipment()) {
00535         int choice = wxMessageBox(
00536             wxT("At least one party member has duplicate equipment.\n")
00537             wxT("Continue Saving?"), wxT("Error: Invalid Equipment"),
00538             wxYES | wxNO | wxICON_QUESTION);
00539                      
00540         if (choice != wxYES) {
00541             return false;
00542         }
00543     }
00544     
00545     memcpy((sram + GAME_OFFSET), game->nvram, GAME_SIZE);
00546     
00547     std::ofstream out(filename.mb_str(), std::ios::binary | std::ios::out);
00548     
00549     if (!out) {
00550         wxMessageBox(wxT("Unable to open the SRAM file."),
00551                      wxT("File Open Error"), wxOK | wxICON_ERROR);
00552         return false;
00553     }
00554     
00555     out.write(sram, SRAM_SIZE);
00556     
00557     if (out.rdstate() && std::ios::failbit) {
00558         wxMessageBox(wxT("Unable to write to the SRAM file."),
00559                      wxT("File I/O Error"), wxOK | wxICON_ERROR);
00560         out.close();
00561         return false;
00562     }
00563     
00564     out.close();
00565     
00566     game->setModified(false);
00567     
00568     return true;
00569 }
00570 
00571 void MainFrame::fileSave(wxCommandEvent &) {
00572     save(sramFile);
00573 }
00574 
00575 void MainFrame::fileSaveAs(wxCommandEvent &) {
00576     static wxFileDialog *dlg = new wxFileDialog(this,
00577         wxT("Choose a .SAV File"), wxT(""), wxT(""),
00578         wxT("NES SRAM File (*.sav)|*.sav"), (wxSAVE | wxCHANGE_DIR));
00579 
00580     int value = dlg->ShowModal();
00581 
00582     if (value == wxID_OK) {
00583         sramFile = dlg->GetPath();
00584         save(sramFile);
00585     }
00586 }
00587 
00588 void MainFrame::fileExit(wxCommandEvent &) {
00589     if (close()) {
00590         Close(true);
00591     }
00592 }
00593 
00594 void MainFrame::windowClosing(wxCloseEvent &event) {
00595     if (event.CanVeto()) {
00596         if (!close()) {
00597             event.Veto();
00598             return;
00599         }
00600     }
00601     
00602     Destroy();
00603 }
00604 
00605 void MainFrame::memberChange(wxCommandEvent &event) {
00606     setOpen(false);
00607     
00608     int id = event.GetId();
00609     
00610     if (id == XRCID("IDM_MEMBER_ONE")) {
00611         loadCharacterData(0);
00612     } else if (id == XRCID("IDM_MEMBER_TWO")) {
00613         loadCharacterData(1);
00614     } else if (id == XRCID("IDM_MEMBER_THREE")) {
00615         loadCharacterData(2);
00616     } else if (id == XRCID("IDM_MEMBER_FOUR")) {
00617         loadCharacterData(3);
00618     }
00619     
00620     setOpen(true);
00621 }
00622 
00623 void MainFrame::helpAbout(wxCommandEvent &) {
00624     wxString msg = wxString(*ffseApp::APP_NAME + wxT(' ') + 
00625                             *ffseApp::APP_VERSION + wxT('\n') +
00626                             *ffseApp::APP_COPYRIGHT);
00627     wxString title = wxString(wxT("About ") + *ffseApp::APP_NAME + wxT("..."));
00628     
00629     wxMessageBox(msg, title, wxOK | wxICON_INFORMATION, this);
00630 }
00631 
00632 void MainFrame::goldChange(wxCommandEvent &) {
00633     if (!isOpen()) {
00634         return;
00635     }
00636     
00637     game->setGold(atoi(goldText->GetValue().mb_str()));
00638 }
00639 
00640 void MainFrame::itemQuantityChange(wxScrollEvent &event) {
00641     if (!isOpen()) {
00642         return;
00643     }
00644     
00645     wxSlider *ctrl = (wxSlider *)event.GetEventObject();
00646     int item = HOUSE;
00647     
00648     if (ctrl == healSlider) {
00649         item = HEALP;
00650     } else if (ctrl == pureSlider) {
00651         item = PUREP;
00652     } else if (ctrl == softSlider) {
00653         item = SOFTP;
00654     } else if (ctrl == tentSlider) {
00655         item = TENT;
00656     } else if (ctrl == cabinSlider) {
00657         item = CABIN;
00658     }
00659     
00660     game->setItem(item, ctrl->GetValue());
00661 }
00662 
00663 void MainFrame::itemHaveChange(wxCommandEvent &event) {
00664     if (!isOpen()) {
00665         return;
00666     }
00667     
00668     wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
00669     int item = LUTE;
00670     
00671     if (ctrl == XRCCTRL(*this, "ID_GENERAL_CROWN", wxCheckBox)) {
00672         item = CROWN;
00673     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_CRYSTAL", wxCheckBox)) {
00674         item = CRYSTAL;
00675     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_HERB", wxCheckBox)) {
00676         item = HERB;
00677     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_KEY", wxCheckBox)) {
00678         item = KEY;
00679     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_TNT", wxCheckBox)) {
00680         item = TNT;
00681     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_ADAMENT", wxCheckBox)) {
00682         item = ADAMENT;
00683     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_SLAB", wxCheckBox)) {
00684         item = SLAB;
00685     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_RUBY", wxCheckBox)) {
00686         item = RUBY;
00687     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_ROD", wxCheckBox)) {
00688         item = ROD;
00689     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_FLOATER", wxCheckBox)) {
00690         item = FLOATER;
00691     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_CHIME", wxCheckBox)) {
00692         item = CHIME;
00693     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_TAIL", wxCheckBox)) {
00694         item = TAIL;
00695     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_CUBE", wxCheckBox)) {
00696         item = CUBE;
00697     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_BOTTLE", wxCheckBox)) {
00698         item = BOTTLE;
00699     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_OXYALE", wxCheckBox)) {
00700         item = OXYALE;
00701     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_CANOE", wxCheckBox)) {
00702         item = CANOE;
00703     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_FIRE_ORB", wxCheckBox)) {
00704         item = FIREORB;
00705     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_WATER_ORB", wxCheckBox)) {
00706         item = WATERORB;
00707     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_WIND_ORB", wxCheckBox)) {
00708         item = WINDORB;
00709     } else if (ctrl == XRCCTRL(*this, "ID_GENERAL_EARTH_ORB", wxCheckBox)) {
00710         item = EARTHORB;
00711     }
00712     
00713     game->setItem(item, ctrl->IsChecked());
00714 }
00715 
00716 void MainFrame::nameChange(wxCommandEvent &) {
00717     if (!isOpen()) {
00718         return;
00719     }
00720     
00721     wxString value = nameText->GetValue();
00722     game->setName(member, value);
00723 }
00724 
00725 void MainFrame::conditionChange(wxCommandEvent &event) {
00726     if (!isOpen()) {
00727         return;
00728     }
00729     
00730     wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00731     
00732     if (ctrl == classChoice) {
00733         game->setClass(member, ctrl->GetSelection());
00734     } else if (ctrl == conditionChoice) {
00735         game->setCondition(member, ctrl->GetSelection());
00736     }
00737 }
00738 
00739 void MainFrame::statChange(wxCommandEvent &event) {
00740     if (!isOpen()) {
00741         return;
00742     }
00743     
00744     wxTextCtrl *ctrl = (wxTextCtrl *)event.GetEventObject();
00745     int value = atoi(ctrl->GetValue().mb_str());
00746     
00747     if (ctrl == currentHPText) {
00748         game->setCurrentHP(member, value);
00749     } else if (ctrl == maxHPText) {
00750         game->setMaxHP(member, value);
00751     } else if (ctrl == experienceText) {
00752         game->setExperience(member, value);
00753     } else if (ctrl == strengthText) {
00754         game->setStrength(member, value);
00755     } else if (ctrl == agilityText) {
00756         game->setAgility(member, value);
00757     } else if (ctrl == intelligenceText) {
00758         game->setIntelligence(member, value);
00759     } else if (ctrl == vitalityText) {
00760         game->setVitality(member, value);
00761     } else if (ctrl == luckText) {
00762         game->setLuck(member, value);
00763     } else if (ctrl == damageText) {
00764         game->setDamage(member, ((value > 255) ? 255 : value));
00765     } else if (ctrl == hitPercentText) {
00766         game->setHitPercent(member, ((value > 255) ? 255 : value));
00767     }
00768 }
00769 
00770 void MainFrame::weaponChange(wxCommandEvent &event) {
00771     if (!isOpen()) {
00772         return;
00773     }
00774     
00775     wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00776     int slot;
00777     
00778     for (slot = 0; slot < 4; slot++) {
00779         if (ctrl == weaponChoice[slot]) {
00780             break;
00781         }
00782     }
00783     
00784     int weapon = ctrl->GetSelection();
00785     
00786     if (weaponEquippedCheck[slot]->IsChecked()) {
00787         weapon |= 0x80;
00788     }
00789     
00790     game->setWeapon(member, slot, weapon);
00791 }
00792 
00793 void MainFrame::weaponEquippedChange(wxCommandEvent &event) {
00794     if (!isOpen()) {
00795         return;
00796     }
00797     
00798     wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
00799     int slot;
00800     
00801     for (slot = 0; slot < 4; slot++) {
00802         if (ctrl == weaponEquippedCheck[slot]) {
00803             break;
00804         }
00805     }
00806     
00807     int weapon = weaponChoice[slot]->GetSelection();
00808     
00809     if (ctrl->IsChecked()) {
00810         weapon |= 0x80;
00811     }
00812     
00813     game->setWeapon(member, slot, weapon);
00814 }
00815 
00816 void MainFrame::armorChange(wxCommandEvent &event) {
00817     if (!isOpen()) {
00818         return;
00819     }
00820     
00821     wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00822     int slot;
00823     
00824     for (slot = 0; slot < 4; slot++) {
00825         if (ctrl == armorChoice[slot]) {
00826             break;
00827         }
00828     }
00829     
00830     int armor = ctrl->GetSelection();
00831     
00832     if (armorEquippedCheck[slot]->IsChecked()) {
00833         armor |= 0x80;
00834     }
00835     
00836     game->setArmor(member, slot, armor);
00837 }
00838 
00839 void MainFrame::armorEquippedChange(wxCommandEvent &event) {
00840     if (!isOpen()) {
00841         return;
00842     }
00843     
00844     wxCheckBox *ctrl = (wxCheckBox *)event.GetEventObject();
00845     int slot;
00846     
00847     for (slot = 0; slot < 4; slot++) {
00848         if (ctrl == armorEquippedCheck[slot]) {
00849             break;
00850         }
00851     }
00852     
00853     int armor = armorChoice[slot]->GetSelection();
00854     
00855     if (ctrl->IsChecked()) {
00856         armor |= 0x80;
00857     }
00858     
00859     game->setArmor(member, slot, armor);
00860 }
00861 
00862 void MainFrame::currentMagicChange(wxScrollEvent &event) {
00863     if (!isOpen()) {
00864         return;
00865     }
00866     
00867     wxSlider *ctrl = (wxSlider *)event.GetEventObject();
00868     int level;
00869     
00870     for (level = 0; level < 8; level++) {
00871         if (ctrl == currentMagicSlider[level]) {
00872             break;
00873         }
00874     }
00875     
00876     game->setCurrentMagic(member, level, ctrl->GetValue());
00877 }
00878 
00879 void MainFrame::maxMagicChange(wxScrollEvent &event) {
00880     if (!isOpen()) {
00881         return;
00882     }
00883     
00884     wxSlider *ctrl = (wxSlider *)event.GetEventObject();
00885     int level;
00886     
00887     for (level = 0; level < 8; level++) {
00888         if (ctrl == maxMagicSlider[level]) {
00889             break;
00890         }
00891     }
00892     
00893     game->setMaxMagic(member, level, ctrl->GetValue());
00894 }
00895 
00896 void MainFrame::knownMagicChange(wxCommandEvent &event) {
00897     if (!isOpen()) {
00898         return;
00899     }
00900     
00901     wxChoice *ctrl = (wxChoice *)event.GetEventObject();
00902     int level, slot;
00903     
00904     for (level = 0; level < 8; level++) {
00905         bool match = false;
00906         
00907         for (slot = 0; slot < 3; slot++) {
00908             if (ctrl == knownMagicChoice[level][slot]) {
00909                 match = true;
00910                 break;
00911             }
00912         }
00913         
00914         if (match) {
00915             break;
00916         }
00917     }
00918     
00919     game->setMagic(member, level, slot, ctrl->GetSelection());
00920 }
00921 
00922 IMPLEMENT_DYNAMIC_CLASS(MainFrame, wxFrame)
00923 
00924 BEGIN_EVENT_TABLE(MainFrame, wxFrame)
00925     EVT_CLOSE(MainFrame::windowClosing)
00926 
00927     EVT_MENU(XRCID("IDM_FILE_OPEN"), MainFrame::fileOpen)
00928     EVT_MENU(XRCID("IDM_FILE_CLOSE"), MainFrame::fileClose)
00929     EVT_MENU(XRCID("IDM_FILE_SAVE"), MainFrame::fileSave)
00930     EVT_MENU(XRCID("IDM_FILE_SAVE_AS"), MainFrame::fileSaveAs)
00931     EVT_MENU(XRCID("IDM_FILE_EXIT"), MainFrame::fileExit)
00932     
00933     EVT_MENU(XRCID("IDM_MEMBER_ONE"), MainFrame::memberChange)
00934     EVT_MENU(XRCID("IDM_MEMBER_TWO"), MainFrame::memberChange)
00935     EVT_MENU(XRCID("IDM_MEMBER_THREE"), MainFrame::memberChange)
00936     EVT_MENU(XRCID("IDM_MEMBER_FOUR"), MainFrame::memberChange)
00937     
00938     EVT_MENU(XRCID("IDM_HELP_ABOUT"), MainFrame::helpAbout)
00939     
00940     EVT_TEXT(XRCID("ID_GENERAL_GOLD"), MainFrame::goldChange)
00941     
00942     EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_HEAL"), MainFrame::itemQuantityChange)
00943     EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_PURE"), MainFrame::itemQuantityChange)
00944     EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_SOFT"), MainFrame::itemQuantityChange)
00945     EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_TENT"), MainFrame::itemQuantityChange)
00946     EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_CABIN"), MainFrame::itemQuantityChange)
00947     EVT_COMMAND_SCROLL(XRCID("ID_GENERAL_HOUSE"), MainFrame::itemQuantityChange)
00948     
00949     EVT_CHECKBOX(XRCID("ID_GENERAL_LUTE"), MainFrame::itemHaveChange)
00950     EVT_CHECKBOX(XRCID("ID_GENERAL_CROWN"), MainFrame::itemHaveChange)
00951     EVT_CHECKBOX(XRCID("ID_GENERAL_CRYSTAL"), MainFrame::itemHaveChange)
00952     EVT_CHECKBOX(XRCID("ID_GENERAL_HERB"), MainFrame::itemHaveChange)
00953     EVT_CHECKBOX(XRCID("ID_GENERAL_KEY"), MainFrame::itemHaveChange)
00954     EVT_CHECKBOX(XRCID("ID_GENERAL_TNT"), MainFrame::itemHaveChange)
00955     EVT_CHECKBOX(XRCID("ID_GENERAL_ADAMENT"), MainFrame::itemHaveChange)
00956     EVT_CHECKBOX(XRCID("ID_GENERAL_SLAB"), MainFrame::itemHaveChange)
00957     EVT_CHECKBOX(XRCID("ID_GENERAL_RUBY"), MainFrame::itemHaveChange)
00958     EVT_CHECKBOX(XRCID("ID_GENERAL_ROD"), MainFrame::itemHaveChange)
00959     EVT_CHECKBOX(XRCID("ID_GENERAL_FLOATER"), MainFrame::itemHaveChange)
00960     EVT_CHECKBOX(XRCID("ID_GENERAL_CHIME"), MainFrame::itemHaveChange)
00961     EVT_CHECKBOX(XRCID("ID_GENERAL_TAIL"), MainFrame::itemHaveChange)
00962     EVT_CHECKBOX(XRCID("ID_GENERAL_CUBE"), MainFrame::itemHaveChange)
00963     EVT_CHECKBOX(XRCID("ID_GENERAL_BOTTLE"), MainFrame::itemHaveChange)
00964     EVT_CHECKBOX(XRCID("ID_GENERAL_OXYALE"), MainFrame::itemHaveChange)
00965     EVT_CHECKBOX(XRCID("ID_GENERAL_CANOE"), MainFrame::itemHaveChange)
00966     EVT_CHECKBOX(XRCID("ID_GENERAL_FIRE_ORB"), MainFrame::itemHaveChange)
00967     EVT_CHECKBOX(XRCID("ID_GENERAL_WATER_ORB"), MainFrame::itemHaveChange)
00968     EVT_CHECKBOX(XRCID("ID_GENERAL_WIND_ORB"), MainFrame::itemHaveChange)
00969     EVT_CHECKBOX(XRCID("ID_GENERAL_EARTH_ORB"), MainFrame::itemHaveChange)
00970     
00971     EVT_TEXT(XRCID("ID_CHARACTER_NAME"), MainFrame::nameChange)
00972     
00973     EVT_CHOICE(XRCID("ID_CHARACTER_CLASS"), MainFrame::conditionChange)
00974     EVT_CHOICE(XRCID("ID_CHARACTER_CONDITION"), MainFrame::conditionChange)
00975     
00976     EVT_TEXT(XRCID("ID_CHARACTER_CURRENT_HP"), MainFrame::statChange)
00977     EVT_TEXT(XRCID("ID_CHARACTER_MAX_HP"), MainFrame::statChange)
00978     EVT_TEXT(XRCID("ID_CHARACTER_EXPERIENCE"), MainFrame::statChange)
00979     EVT_TEXT(XRCID("ID_CHARACTER_STRENGTH"), MainFrame::statChange)
00980     EVT_TEXT(XRCID("ID_CHARACTER_AGILITY"), MainFrame::statChange)
00981     EVT_TEXT(XRCID("ID_CHARACTER_INTELLIGENCE"), MainFrame::statChange)
00982     EVT_TEXT(XRCID("ID_CHARACTER_VITALITY"), MainFrame::statChange)
00983     EVT_TEXT(XRCID("ID_CHARACTER_LUCK"), MainFrame::statChange)
00984     EVT_TEXT(XRCID("ID_CHARACTER_DAMAGE"), MainFrame::statChange)
00985     EVT_TEXT(XRCID("ID_CHARACTER_HIT_PERCENT"), MainFrame::statChange)
00986     
00987     EVT_CHOICE(XRCID("ID_CHARACTER_WEAPON1"), MainFrame::weaponChange)
00988     EVT_CHOICE(XRCID("ID_CHARACTER_WEAPON2"), MainFrame::weaponChange)
00989     EVT_CHOICE(XRCID("ID_CHARACTER_WEAPON3"), MainFrame::weaponChange)
00990     EVT_CHOICE(XRCID("ID_CHARACTER_WEAPON4"), MainFrame::weaponChange)
00991     
00992     EVT_CHECKBOX(XRCID("ID_CHARACTER_WEAPON_EQUIPPED1"),
00993         MainFrame::weaponEquippedChange)
00994     EVT_CHECKBOX(XRCID("ID_CHARACTER_WEAPON_EQUIPPED2"),
00995         MainFrame::weaponEquippedChange)
00996     EVT_CHECKBOX(XRCID("ID_CHARACTER_WEAPON_EQUIPPED3"),
00997         MainFrame::weaponEquippedChange)
00998     EVT_CHECKBOX(XRCID("ID_CHARACTER_WEAPON_EQUIPPED4"),
00999         MainFrame::weaponEquippedChange)
01000     
01001     EVT_CHOICE(XRCID("ID_CHARACTER_ARMOR1"), MainFrame::armorChange)
01002     EVT_CHOICE(XRCID("ID_CHARACTER_ARMOR2"), MainFrame::armorChange)
01003     EVT_CHOICE(XRCID("ID_CHARACTER_ARMOR3"), MainFrame::armorChange)
01004     EVT_CHOICE(XRCID("ID_CHARACTER_ARMOR4"), MainFrame::armorChange)
01005     
01006     EVT_CHECKBOX(XRCID("ID_CHARACTER_ARMOR_EQUIPPED1"),
01007         MainFrame::armorEquippedChange)
01008     EVT_CHECKBOX(XRCID("ID_CHARACTER_ARMOR_EQUIPPED2"),
01009         MainFrame::armorEquippedChange)
01010     EVT_CHECKBOX(XRCID("ID_CHARACTER_ARMOR_EQUIPPED3"),
01011         MainFrame::armorEquippedChange)
01012     EVT_CHECKBOX(XRCID("ID_CHARACTER_ARMOR_EQUIPPED4"),
01013         MainFrame::armorEquippedChange)
01014    
01015     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT1"),
01016         MainFrame::currentMagicChange)
01017     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT2"),
01018         MainFrame::currentMagicChange)
01019     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT3"),
01020         MainFrame::currentMagicChange)
01021     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT4"),
01022         MainFrame::currentMagicChange)
01023     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT5"),
01024         MainFrame::currentMagicChange)
01025     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT6"),
01026         MainFrame::currentMagicChange)
01027     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT7"),
01028         MainFrame::currentMagicChange)
01029     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_CURRENT8"),
01030         MainFrame::currentMagicChange)
01031     
01032     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX1"), MainFrame::maxMagicChange)
01033     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX2"), MainFrame::maxMagicChange)
01034     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX3"), MainFrame::maxMagicChange)
01035     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX4"), MainFrame::maxMagicChange)
01036     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX5"), MainFrame::maxMagicChange)
01037     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX6"), MainFrame::maxMagicChange)
01038     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX7"), MainFrame::maxMagicChange)
01039     EVT_COMMAND_SCROLL(XRCID("ID_MAGIC_MAX8"), MainFrame::maxMagicChange)
01040     
01041     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN11"), MainFrame::knownMagicChange)
01042     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN12"), MainFrame::knownMagicChange)
01043     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN13"), MainFrame::knownMagicChange)
01044     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN21"), MainFrame::knownMagicChange)
01045     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN22"), MainFrame::knownMagicChange)
01046     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN23"), MainFrame::knownMagicChange)
01047     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN31"), MainFrame::knownMagicChange)
01048     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN32"), MainFrame::knownMagicChange)
01049     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN33"), MainFrame::knownMagicChange)
01050     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN41"), MainFrame::knownMagicChange)
01051     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN42"), MainFrame::knownMagicChange)
01052     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN43"), MainFrame::knownMagicChange)
01053     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN51"), MainFrame::knownMagicChange)
01054     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN52"), MainFrame::knownMagicChange)
01055     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN53"), MainFrame::knownMagicChange)
01056     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN61"), MainFrame::knownMagicChange)
01057     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN62"), MainFrame::knownMagicChange)
01058     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN63"), MainFrame::knownMagicChange)
01059     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN71"), MainFrame::knownMagicChange)
01060     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN72"), MainFrame::knownMagicChange)
01061     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN73"), MainFrame::knownMagicChange)
01062     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN81"), MainFrame::knownMagicChange)
01063     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN82"), MainFrame::knownMagicChange)
01064     EVT_CHOICE(XRCID("ID_MAGIC_KNOWN83"), MainFrame::knownMagicChange)
01065 END_EVENT_TABLE()
01066 

Generated on Sun Feb 18 17:36:08 2007 for ffse by  doxygen 1.5.1-p1