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 #include <QValidator>
00026
00027 #include "exceptions/invalidgamegeniecode.hh"
00028
00029 #include "model/gbgggamegeniecode.hh"
00030 #include "model/gbggrawcode.hh"
00031 #include "model/genesisgamegeniecode.hh"
00032 #include "model/genesisrawcode.hh"
00033 #include "model/nesgamegeniecode.hh"
00034 #include "model/nesrawcode.hh"
00035 #include "model/snesgamegeniecode.hh"
00036 #include "model/snesrawcode.hh"
00037
00038 #include "tools/decoder.hh"
00039 #include "tools/encoder.hh"
00040
00041 #include "view/geniedialog.hh"
00042 #include "view/system.hh"
00043
00044 using namespace ggencoder;
00045
00046 GenieDialog::GenieDialog() : QDialog(), encoding(false), decoding(false) {
00047 setAttribute(Qt::WA_QuitOnClose);
00048 ui.setupUi(this);
00049
00050
00051 QRegExp regex;
00052
00053 regex = QRegExp("[A-Fa-f0-9]+");
00054 hexValidator = new QRegExpValidator(regex, this);
00055
00056 regex = QRegExp("[APZLGITYEOXUKSVNapzlgityeoxuksvn]+");
00057 nesValidator = new QRegExpValidator(regex, this);
00058
00059 regex = QRegExp("[A-Fa-f0-9-]+");
00060 snesValidator = new QRegExpValidator(regex, this);
00061
00062 regex = QRegExp("[A-HJ-NPR-TV-Z0-9a-hj-np-tv-z-]+");
00063 genesisValidator = new QRegExpValidator(regex, this);
00064
00065 regex = QRegExp("[A-Fa-f0-9-]+");
00066 gbggValidator = new QRegExpValidator(regex, this);
00067
00068 ui.valueEdit->setValidator(hexValidator);
00069 ui.addressEdit->setValidator(hexValidator);
00070 ui.compareEdit->setValidator(hexValidator);
00071
00072 ui.compareEdit->setMaxLength(2);
00073
00074
00075 on_nesRadio_toggled(true);
00076 }
00077
00078 GenieDialog::~GenieDialog() {
00079 delete hexValidator;
00080 delete nesValidator;
00081 delete snesValidator;
00082 delete genesisValidator;
00083 delete gbggValidator;
00084 }
00085
00086 void GenieDialog::decode() {
00087 if (encoding) {
00088 return;
00089 }
00090
00091 decoding = true;
00092
00093 QString text = ui.gamegenieEdit->text().toUpper();
00094
00095 try {
00096 QString str;
00097
00098 if (system == NES) {
00099 NESGameGenieCode ggcode = NESGameGenieCode::create(text);
00100 NESRawCode rawcode = Decoder::decodeNES(ggcode);
00101
00102 str.sprintf("%02X", rawcode.getValue());
00103 ui.valueEdit->setText(str);
00104
00105 str.sprintf("%04X", rawcode.getAddress());
00106 ui.addressEdit->setText(str);
00107
00108 if (rawcode.hasCompare()) {
00109 str.sprintf("%02X", rawcode.getCompare());
00110 ui.compareEdit->setText(str);
00111 } else {
00112 ui.compareEdit->clear();
00113 }
00114 } else if (system == SNES) {
00115 SNESGameGenieCode ggcode = SNESGameGenieCode::create(text);
00116 SNESRawCode rawcode = Decoder::decodeSNES(ggcode);
00117
00118 str.sprintf("%02X", rawcode.getValue());
00119 ui.valueEdit->setText(str);
00120
00121 str.sprintf("%04X", rawcode.getAddress());
00122 ui.addressEdit->setText(str);
00123 } else if (system == GENESIS) {
00124 GenesisGameGenieCode ggcode = GenesisGameGenieCode::create(text);
00125 GenesisRawCode rawcode = Decoder::decodeGenesis(ggcode);
00126
00127 str.sprintf("%04X", rawcode.getValue());
00128 ui.valueEdit->setText(str);
00129
00130 str.sprintf("%04X", rawcode.getAddress());
00131 ui.addressEdit->setText(str);
00132 } else if (system == GBGG) {
00133 GBGGGameGenieCode ggcode = GBGGGameGenieCode::create(text);
00134 GBGGRawCode rawcode = Decoder::decodeGBGG(ggcode);
00135
00136 str.sprintf("%02X", rawcode.getValue());
00137 ui.valueEdit->setText(str);
00138
00139 str.sprintf("%04X", rawcode.getAddress());
00140 ui.addressEdit->setText(str);
00141
00142 if (rawcode.hasCompare()) {
00143 str.sprintf("%02X", rawcode.getCompare());
00144 ui.compareEdit->setText(str);
00145 } else {
00146 ui.compareEdit->clear();
00147 }
00148 }
00149 } catch (InvalidGameGenieCodeException e) {
00150
00151 }
00152
00153 decoding = false;
00154 }
00155
00156 void GenieDialog::encode() {
00157 if (decoding) {
00158 return;
00159 }
00160
00161 encoding = true;
00162
00163 bool ok;
00164
00165 int value = ui.valueEdit->text().toInt(&ok, 16);
00166 int address = ui.addressEdit->text().toInt(&ok, 16);
00167 int compare = ui.compareEdit->text().toInt(&ok, 16);
00168
00169 if (system == NES) {
00170 NESRawCode *rawcode;
00171
00172 if (!ui.compareEdit->text().isEmpty()) {
00173 rawcode = new NESRawCode(address, value, compare);
00174 } else {
00175 rawcode = new NESRawCode(address, value);
00176 }
00177
00178 NESGameGenieCode ggcode = Encoder::encode(*rawcode);
00179 ui.gamegenieEdit->setText(ggcode.getCode());
00180
00181 delete rawcode;
00182 } else if (system == SNES) {
00183 SNESRawCode rawcode(address, value);
00184 SNESGameGenieCode ggcode = Encoder::encode(rawcode);
00185 ui.gamegenieEdit->setText(ggcode.getCode());
00186 } else if (system == GENESIS) {
00187 GenesisRawCode rawcode(address, value);
00188 GenesisGameGenieCode ggcode = Encoder::encode(rawcode);
00189 ui.gamegenieEdit->setText(ggcode.getCode());
00190 } else if (system == GBGG) {
00191 GBGGRawCode *rawcode;
00192
00193 if (!ui.compareEdit->text().isEmpty()) {
00194 rawcode = new GBGGRawCode(address, value, compare);
00195 } else {
00196 rawcode = new GBGGRawCode(address, value);
00197 }
00198
00199 GBGGGameGenieCode ggcode = Encoder::encode(*rawcode);
00200 ui.gamegenieEdit->setText(ggcode.getCode());
00201
00202 delete rawcode;
00203 }
00204
00205 encoding = false;
00206 }
00207
00208 void GenieDialog::reset() {
00209 encoding = true;
00210 decoding = true;
00211
00212 ui.gamegenieEdit->clear();
00213 ui.valueEdit->clear();
00214 ui.addressEdit->clear();
00215 ui.compareEdit->clear();
00216
00217 encoding = false;
00218 decoding = false;
00219 }
00220
00221 void GenieDialog::on_addressEdit_textEdited(const QString &) {
00222 encode();
00223 }
00224
00225 void GenieDialog::on_compareEdit_textEdited(const QString &) {
00226 encode();
00227 }
00228
00229 void GenieDialog::on_gamegenieEdit_textEdited(const QString &) {
00230 decode();
00231 }
00232
00233 void GenieDialog::on_gbggRadio_toggled(bool checked) {
00234 if (checked) {
00235 reset();
00236 system = GBGG;
00237 ui.compareEdit->setEnabled(true);
00238
00239 ui.valueEdit->setMaxLength(2);
00240 ui.addressEdit->setMaxLength(4);
00241 ui.gamegenieEdit->setMaxLength(11);
00242 ui.gamegenieEdit->setValidator(gbggValidator);
00243 }
00244 }
00245
00246 void GenieDialog::on_genesisRadio_toggled(bool checked) {
00247 if (checked) {
00248 reset();
00249 system = GENESIS;
00250 ui.compareEdit->setEnabled(false);
00251
00252 ui.valueEdit->setMaxLength(4);
00253 ui.addressEdit->setMaxLength(6);
00254 ui.gamegenieEdit->setMaxLength(9);
00255 ui.gamegenieEdit->setValidator(genesisValidator);
00256 }
00257 }
00258
00259 void GenieDialog::on_nesRadio_toggled(bool checked) {
00260 if (checked) {
00261 reset();
00262 system = NES;
00263 ui.compareEdit->setEnabled(true);
00264
00265 ui.valueEdit->setMaxLength(2);
00266 ui.addressEdit->setMaxLength(4);
00267 ui.gamegenieEdit->setMaxLength(8);
00268 ui.gamegenieEdit->setValidator(nesValidator);
00269 }
00270 }
00271
00272 void GenieDialog::on_snesRadio_toggled(bool checked) {
00273 if (checked) {
00274 reset();
00275 system = SNES;
00276 ui.compareEdit->setEnabled(false);
00277
00278 ui.valueEdit->setMaxLength(2);
00279 ui.addressEdit->setMaxLength(6);
00280 ui.gamegenieEdit->setMaxLength(9);
00281 ui.gamegenieEdit->setValidator(snesValidator);
00282 }
00283 }
00284
00285 void GenieDialog::on_valueEdit_textEdited(const QString &) {
00286 encode();
00287 }
00288