SaveSlot.cc

Go to the documentation of this file.
00001 /*
00002  * Zelda II SRAM Editor
00003  * Copyright (C) 2004-2005,2007-2008 emuWorks
00004  * http://games.technoplaza.net/
00005  *
00006  * This file is part of z2se.
00007  *
00008  * z2se 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  * z2se 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 z2se; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00021  */
00022 
00023 // $Id: SaveSlot.cc,v 1.8 2008/12/17 06:24:27 jdratlif 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 "model/SaveSlot.hh"
00036 
00037 using namespace emuWorks;
00038 
00039 SaveSlot::SaveSlot(const char *nvram) {
00040     this->nvram = new unsigned char[GAME_SIZE];
00041     memcpy(this->nvram, nvram, GAME_SIZE);
00042     
00043     valid = (nvram[NAME_OFFSET] != '\xF4');
00044     
00045     setModified(false);
00046     
00047     checkForNewGame();
00048 }
00049 
00050 SaveSlot::~SaveSlot() {
00051     delete nvram;
00052 }
00053 
00054 void SaveSlot::checkForNewGame() {
00055     if (nvram[TRIFORCE_OFFSET] == 1) {
00056         setTriforce(true);
00057         
00058         setContainers(MAGICCONTAINER, 4);
00059         setContainers(LIFECONTAINER, 4);
00060         
00061         setItem(CANDLE, false);
00062         setItem(GLOVE, false);
00063         setItem(RAFT, false);
00064         setItem(BOOTS, false);
00065         setItem(CROSS, false);
00066         setItem(FLUTE, false);
00067         setItem(MAGICKEY, false);
00068         setItem(HAMMER, false);
00069         
00070         for (int palace = 0; palace < 6; palace++) {
00071             setSeal(palace, false);
00072         }
00073         
00074         setKeys(0);
00075         
00076         setModified(false);
00077     }
00078 }
00079 
00080 wxString SaveSlot::getName() const {
00081     wxString name;
00082     
00083     for (int pos = 0; pos < 8; pos++) {
00084         char letter = fromNES(nvram[NAME_OFFSET + pos]);
00085         name.append(1, letter);
00086     }
00087     
00088     return name.Trim();
00089 }
00090 
00091 void SaveSlot::setName(wxString &name) {
00092     int length = name.Length();
00093     
00094     for (int pos = 0; pos < 8; pos++) {
00095         unsigned char letter;
00096         
00097         if ((length - 1) < pos) {
00098             letter = static_cast<unsigned char>(0xF4);
00099         } else {
00100             letter = toNES(name.at(pos));
00101         }
00102         
00103         nvram[NAME_OFFSET + pos] = letter;
00104     }
00105     
00106     setModified();
00107 }
00108 
00109 int SaveSlot::getPlayCount() const {
00110     return nvram[PLAY_COUNT_OFFSET];
00111 }
00112 
00113 void SaveSlot::setPlayCount(unsigned char value) {
00114     nvram[PLAY_COUNT_OFFSET] = value;
00115     setModified();
00116 }
00117 
00118 bool SaveSlot::hasTriforce() const {
00119     return (nvram[TRIFORCE_OFFSET] == 2);
00120 }
00121 
00122 void SaveSlot::setTriforce(bool value) {
00123     nvram[TRIFORCE_OFFSET] = (value ? 2 : 0);
00124     setModified();
00125 }
00126 
00127 int SaveSlot::getLevel(int which) const {
00128     return nvram[LEVEL_OFFSET + which];
00129 }
00130 
00131 void SaveSlot::setLevel(int which, unsigned char value) {
00132     nvram[LEVEL_OFFSET + which] = value;
00133     setModified();
00134 }
00135 
00136 int SaveSlot::getContainers(int which) const {
00137     return nvram[CONTAINER_OFFSET + which];
00138 }
00139 
00140 void SaveSlot::setContainers(int which, unsigned char value) {
00141     nvram[CONTAINER_OFFSET + which] = value;
00142     setModified();
00143 }
00144 
00145 bool SaveSlot::hasTechnique(int technique) const {
00146     return ((nvram[TECHNIQUE_OFFSET] & technique) > 0);
00147 }
00148 
00149 void SaveSlot::setTechnique(int technique, bool value) {
00150     if (value) {
00151         nvram[TECHNIQUE_OFFSET] |= technique;
00152     } else {
00153         nvram[TECHNIQUE_OFFSET] &= (~technique);
00154     }
00155     
00156     setModified();
00157 }
00158 
00159 bool SaveSlot::hasSpell(int spell) const {
00160     return (nvram[SPELL_OFFSET + spell] == 1);
00161 }
00162 
00163 void SaveSlot::setSpell(int spell, bool value) {
00164     nvram[SPELL_OFFSET + spell] = (value ? 1 : 0);
00165     setModified();
00166 }
00167 
00168 bool SaveSlot::hasItem(int item) const {
00169     return (nvram[ITEM_OFFSET + item] == 1);
00170 }
00171 
00172 void SaveSlot::setItem(int item, bool value) {
00173     nvram[ITEM_OFFSET + item] = (value ? 1 : 0);
00174     setModified();
00175 }
00176 
00177 bool SaveSlot::hasSeal(int palace) const {
00178     return (nvram[PALACE_OFFSET + palace] == (palace + 1));
00179 }
00180 
00181 void SaveSlot::setSeal(int palace, bool value) {
00182     if (value) {
00183         nvram[SEAL_OFFSET]--;
00184     } else {
00185         nvram[SEAL_OFFSET]++;
00186     }
00187     
00188     nvram[PALACE_OFFSET + palace] = (value ? (palace + 1) : 0);
00189     setModified();
00190 }
00191 
00192 int SaveSlot::getKeys() const {
00193     return nvram[KEYS_OFFSET];
00194 }
00195 
00196 void SaveSlot::setKeys(unsigned char value) {
00197     nvram[KEYS_OFFSET] = value;
00198     setModified();
00199 }
00200 
00201 char SaveSlot::fromNES(unsigned char letter) {
00202     if ((letter >= 0xD0) && (letter <= 0xD9)) {
00203         return static_cast<char>('0' + (letter - 0xD0));
00204     } else if ((letter >= 0xDA) && (letter <= 0xF3)) {
00205         return static_cast<char>('A' + (letter - 0xDA));
00206     }
00207     
00208     return static_cast<char>(' ');
00209 }
00210 
00211 unsigned char SaveSlot::toNES(char letter) {
00212     if ((letter >= '0') && (letter <= '9')) {
00213         return static_cast<unsigned char>(0xD0 + (letter - '0'));
00214     } else if ((letter >= 'A') && (letter <= 'Z')) {
00215         return static_cast<unsigned char>(0xDA + (letter - 'A'));
00216     }
00217     
00218     return static_cast<unsigned char>(0xF4);
00219 }
00220 

Generated on Mon Dec 29 01:21:33 2008 for Zelda II SRAM Editor by  doxygen 1.5.4