00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
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