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

source/model/SaveSlot.cc

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2004 emuWorks
00003  * http://games.technoplaza.net/
00004  *
00005  * This program is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU General Public License
00007  * as published by the Free Software Foundation; either version 2
00008  * of the License, or (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00018  */
00019 
00020 // $Id: SaveSlot.cc,v 1.3 2004/12/10 11:41:32 technoplaza Exp $
00021 
00022 #ifdef HAVE_CONFIG_H
00023     #include <config.h>
00024 #endif
00025 
00026 #include <wx/wxprec.h>
00027 
00028 #ifndef WX_PRECOMP
00029    #include <wx/wx.h>
00030 #endif
00031 
00032 #include "SaveSlot.hh"
00033 
00034 using namespace emuWorks;
00035 
00036 SaveSlot::SaveSlot(const char *nvram) {
00037     this->nvram = new unsigned char[GAME_SIZE];
00038     memcpy(this->nvram, nvram, GAME_SIZE);
00039     
00040     if (this->nvram[NAME_OFFSET] == (unsigned char)0xF4) {
00041         valid = false;
00042     } else {
00043         valid = true;
00044     }
00045     
00046     setModified(false);
00047     
00048     checkForNewGame();
00049 }
00050 
00051 SaveSlot::~SaveSlot() {
00052     delete nvram;
00053 }
00054 
00055 void SaveSlot::checkForNewGame() {
00056     if (nvram[TRIFORCE_OFFSET] == 1) {
00057         setTriforce(true);
00058         
00059         setContainers(MAGICCONTAINER, 4);
00060         setContainers(LIFECONTAINER, 4);
00061         
00062         setItem(CANDLE, false);
00063         setItem(GLOVE, false);
00064         setItem(RAFT, false);
00065         setItem(BOOTS, false);
00066         setItem(CROSS, false);
00067         setItem(FLUTE, false);
00068         setItem(MAGICKEY, false);
00069         setItem(HAMMER, false);
00070         
00071         for (int palace = 0; palace < 6; palace++) {
00072             setSeal(palace, false);
00073         }
00074         
00075         setKeys(0);
00076         
00077         setModified(false);
00078     }
00079 }
00080 
00081 wxString SaveSlot::getName() const {
00082     wxString name;
00083     
00084     for (int pos = 0; pos < 8; pos++) {
00085         char letter = fromNES(nvram[NAME_OFFSET + pos]);
00086         name.append(1, letter);
00087     }
00088     
00089     return name.Trim();
00090 }
00091 
00092 void SaveSlot::setName(wxString &name) {
00093     int length = name.Length();
00094     
00095     for (int pos = 0; pos < 8; pos++) {
00096         unsigned char letter;
00097         
00098         if ((length - 1) < pos) {
00099             letter = (unsigned char)0xF4;
00100         } else {
00101             letter = toNES(name.at(pos));
00102         }
00103         
00104         nvram[NAME_OFFSET + pos] = letter;
00105     }
00106     
00107     setModified();
00108 }
00109 
00110 int SaveSlot::getPlayCount() const {
00111     return nvram[PLAY_COUNT_OFFSET];
00112 }
00113 
00114 void SaveSlot::setPlayCount(unsigned char value) {
00115     nvram[PLAY_COUNT_OFFSET] = value;
00116     setModified();
00117 }
00118 
00119 bool SaveSlot::hasTriforce() const {
00120     return (nvram[TRIFORCE_OFFSET] == 2);
00121 }
00122 
00123 void SaveSlot::setTriforce(bool value) {
00124     nvram[TRIFORCE_OFFSET] = (value ? 2 : 0);
00125     setModified();
00126 }
00127 
00128 int SaveSlot::getLevel(int which) const {
00129     return nvram[LEVEL_OFFSET + which];
00130 }
00131 
00132 void SaveSlot::setLevel(int which, unsigned char value) {
00133     nvram[LEVEL_OFFSET + which] = value;
00134     setModified();
00135 }
00136 
00137 int SaveSlot::getContainers(int which) const {
00138     return nvram[CONTAINER_OFFSET + which];
00139 }
00140 
00141 void SaveSlot::setContainers(int which, unsigned char value) {
00142     nvram[CONTAINER_OFFSET + which] = value;
00143     setModified();
00144 }
00145 
00146 bool SaveSlot::hasTechnique(int technique) const {
00147     return ((nvram[TECHNIQUE_OFFSET] & technique) > 0);
00148 }
00149 
00150 void SaveSlot::setTechnique(int technique, bool value) {
00151     if (value) {
00152         nvram[TECHNIQUE_OFFSET] |= technique;
00153     } else {
00154         nvram[TECHNIQUE_OFFSET] &= (~technique);
00155     }
00156     
00157     setModified();
00158 }
00159 
00160 bool SaveSlot::hasSpell(int spell) const {
00161     return (nvram[SPELL_OFFSET + spell] == 1);
00162 }
00163 
00164 void SaveSlot::setSpell(int spell, bool value) {
00165     nvram[SPELL_OFFSET + spell] = (value ? 1 : 0);
00166     setModified();
00167 }
00168 
00169 bool SaveSlot::hasItem(int item) const {
00170     return (nvram[ITEM_OFFSET + item] == 1);
00171 }
00172 
00173 void SaveSlot::setItem(int item, bool value) {
00174     nvram[ITEM_OFFSET + item] = (value ? 1 : 0);
00175     setModified();
00176 }
00177 
00178 bool SaveSlot::hasSeal(int palace) const {
00179     return (nvram[PALACE_OFFSET + palace] == (palace + 1));
00180 }
00181 
00182 void SaveSlot::setSeal(int palace, bool value) {
00183     if (value) {
00184         nvram[SEAL_OFFSET]--;
00185     } else {
00186         nvram[SEAL_OFFSET]++;
00187     }
00188     
00189     nvram[PALACE_OFFSET + palace] = (value ? (palace + 1) : 0);
00190     setModified();
00191 }
00192 
00193 int SaveSlot::getKeys() const {
00194     return nvram[KEYS_OFFSET];
00195 }
00196 
00197 void SaveSlot::setKeys(unsigned char value) {
00198     nvram[KEYS_OFFSET] = value;
00199     setModified();
00200 }
00201 
00202 char SaveSlot::fromNES(unsigned char letter) {
00203     if ((letter >= 0xD0) && (letter <= 0xD9)) {
00204         return (char)('0' + (letter - 0xD0));
00205     } else if ((letter >= 0xDA) && (letter <= 0xF3)) {
00206         return (char)('A' + (letter - 0xDA));
00207     }
00208     
00209     return (char)' ';
00210 }
00211 
00212 unsigned char SaveSlot::toNES(char letter) {
00213     if ((letter >= '0') && (letter <= '9')) {
00214         return (unsigned char)(0xD0 + (letter - '0'));
00215     } else if ((letter >= 'A') && (letter <= 'Z')) {
00216         return (unsigned char)(0xDA + (letter - 'A'));
00217     }
00218     
00219     return (unsigned char)0xF4;
00220 }

Generated on Fri Dec 10 11:33:56 2004 for Zelda II SRAM Editor by  doxygen 1.3.9.1