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