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 "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 if (this->nvram[NAME_OFFSET] == (unsigned char)0xF4) {
00044 valid = false;
00045 } else {
00046 valid = true;
00047 }
00048
00049 setModified(false);
00050
00051 checkForNewGame();
00052 }
00053
00054 SaveSlot::~SaveSlot() {
00055 delete nvram;
00056 }
00057
00058 void SaveSlot::checkForNewGame() {
00059 if (nvram[TRIFORCE_OFFSET] == 1) {
00060 setTriforce(true);
00061
00062 setContainers(MAGICCONTAINER, 4);
00063 setContainers(LIFECONTAINER, 4);
00064
00065 setItem(CANDLE, false);
00066 setItem(GLOVE, false);
00067 setItem(RAFT, false);
00068 setItem(BOOTS, false);
00069 setItem(CROSS, false);
00070 setItem(FLUTE, false);
00071 setItem(MAGICKEY, false);
00072 setItem(HAMMER, false);
00073
00074 for (int palace = 0; palace < 6; palace++) {
00075 setSeal(palace, false);
00076 }
00077
00078 setKeys(0);
00079
00080 setModified(false);
00081 }
00082 }
00083
00084 wxString SaveSlot::getName() const {
00085 wxString name;
00086
00087 for (int pos = 0; pos < 8; pos++) {
00088 char letter = fromNES(nvram[NAME_OFFSET + pos]);
00089 name.append(1, letter);
00090 }
00091
00092 return name.Trim();
00093 }
00094
00095 void SaveSlot::setName(wxString &name) {
00096 int length = name.Length();
00097
00098 for (int pos = 0; pos < 8; pos++) {
00099 unsigned char letter;
00100
00101 if ((length - 1) < pos) {
00102 letter = (unsigned char)0xF4;
00103 } else {
00104 letter = toNES(name.at(pos));
00105 }
00106
00107 nvram[NAME_OFFSET + pos] = letter;
00108 }
00109
00110 setModified();
00111 }
00112
00113 int SaveSlot::getPlayCount() const {
00114 return nvram[PLAY_COUNT_OFFSET];
00115 }
00116
00117 void SaveSlot::setPlayCount(unsigned char value) {
00118 nvram[PLAY_COUNT_OFFSET] = value;
00119 setModified();
00120 }
00121
00122 bool SaveSlot::hasTriforce() const {
00123 return (nvram[TRIFORCE_OFFSET] == 2);
00124 }
00125
00126 void SaveSlot::setTriforce(bool value) {
00127 nvram[TRIFORCE_OFFSET] = (value ? 2 : 0);
00128 setModified();
00129 }
00130
00131 int SaveSlot::getLevel(int which) const {
00132 return nvram[LEVEL_OFFSET + which];
00133 }
00134
00135 void SaveSlot::setLevel(int which, unsigned char value) {
00136 nvram[LEVEL_OFFSET + which] = value;
00137 setModified();
00138 }
00139
00140 int SaveSlot::getContainers(int which) const {
00141 return nvram[CONTAINER_OFFSET + which];
00142 }
00143
00144 void SaveSlot::setContainers(int which, unsigned char value) {
00145 nvram[CONTAINER_OFFSET + which] = value;
00146 setModified();
00147 }
00148
00149 bool SaveSlot::hasTechnique(int technique) const {
00150 return ((nvram[TECHNIQUE_OFFSET] & technique) > 0);
00151 }
00152
00153 void SaveSlot::setTechnique(int technique, bool value) {
00154 if (value) {
00155 nvram[TECHNIQUE_OFFSET] |= technique;
00156 } else {
00157 nvram[TECHNIQUE_OFFSET] &= (~technique);
00158 }
00159
00160 setModified();
00161 }
00162
00163 bool SaveSlot::hasSpell(int spell) const {
00164 return (nvram[SPELL_OFFSET + spell] == 1);
00165 }
00166
00167 void SaveSlot::setSpell(int spell, bool value) {
00168 nvram[SPELL_OFFSET + spell] = (value ? 1 : 0);
00169 setModified();
00170 }
00171
00172 bool SaveSlot::hasItem(int item) const {
00173 return (nvram[ITEM_OFFSET + item] == 1);
00174 }
00175
00176 void SaveSlot::setItem(int item, bool value) {
00177 nvram[ITEM_OFFSET + item] = (value ? 1 : 0);
00178 setModified();
00179 }
00180
00181 bool SaveSlot::hasSeal(int palace) const {
00182 return (nvram[PALACE_OFFSET + palace] == (palace + 1));
00183 }
00184
00185 void SaveSlot::setSeal(int palace, bool value) {
00186 if (value) {
00187 nvram[SEAL_OFFSET]--;
00188 } else {
00189 nvram[SEAL_OFFSET]++;
00190 }
00191
00192 nvram[PALACE_OFFSET + palace] = (value ? (palace + 1) : 0);
00193 setModified();
00194 }
00195
00196 int SaveSlot::getKeys() const {
00197 return nvram[KEYS_OFFSET];
00198 }
00199
00200 void SaveSlot::setKeys(unsigned char value) {
00201 nvram[KEYS_OFFSET] = value;
00202 setModified();
00203 }
00204
00205 char SaveSlot::fromNES(unsigned char letter) {
00206 if ((letter >= 0xD0) && (letter <= 0xD9)) {
00207 return (char)('0' + (letter - 0xD0));
00208 } else if ((letter >= 0xDA) && (letter <= 0xF3)) {
00209 return (char)('A' + (letter - 0xDA));
00210 }
00211
00212 return (char)' ';
00213 }
00214
00215 unsigned char SaveSlot::toNES(char letter) {
00216 if ((letter >= '0') && (letter <= '9')) {
00217 return (unsigned char)(0xD0 + (letter - '0'));
00218 } else if ((letter >= 'A') && (letter <= 'Z')) {
00219 return (unsigned char)(0xDA + (letter - 'A'));
00220 }
00221
00222 return (unsigned char)0xF4;
00223 }