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 #ifndef SOESRAME_SRAMFILE_HH_
00026 #define SOESRAME_SRAMFILE_HH_
00027
00028 #include <utility>
00029
00030 #include <QString>
00031
00032 #include "exceptions/invalidsramfileexception.hh"
00033
00034 namespace soesrame {
00035
00036 const int SRAM_ALCHEMYMAJORLEVELS_OFFSET = 0x19B;
00037
00038
00039 const int SRAM_ALCHEMYMINORLEVELS_OFFSET = 0x155;
00040
00041
00042 const int SRAM_BOY_CURRENTHP_OFFSET = 0x6E;
00043
00044
00045 const int SRAM_BOY_EXPERIENCE_OFFSET = 0x9A;
00046
00047
00048 const int SRAM_BOY_LEVEL_OFFSET = 0x9D;
00049
00050
00051 const int SRAM_BOY_MAXHP_OFFSET = 0x8E;
00052
00053
00054 const int SRAM_BOY_NAME_OFFSET = 0x26;
00055
00056
00057 const int SRAM_CHECKSUM_START_US = 0x43F;
00058
00059
00060 const int SRAM_CHECKSUM_START_EUROPE = 0x16FF;
00061
00062
00063 const int SRAM_CHECKSUM_OFFSET = 0x0;
00064
00065
00066 const int SRAM_DOG_CURRENTHP_OFFSET = 0xAF;
00067
00068
00069 const int SRAM_DOG_EXPERIENCE_OFFSET = 0xDB;
00070
00071
00072 const int SRAM_DOG_LEVEL_OFFSET = 0xDE;
00073
00074
00075 const int SRAM_DOG_MAXHP_OFFSET = 0xCF;
00076
00077
00078 const int SRAM_DOG_NAME_OFFSET = 0x4A;
00079
00080
00081 const int SRAM_DOG_ATTACKLEVEL_OFFSET = 0x13D;
00082
00083
00084 const int SRAM_FILE_SIZE = 0x2000;
00085
00086
00087 const int SRAM_GAME_OFFSET = 0x2;
00088
00089
00090 const int SRAM_GAME_SIZE = 0x331;
00091
00092
00093 const int SRAM_INGREDIENTS_OFFSET = 0x289;
00094
00095
00096 const int SRAM_ITEMS_OFFSET = 0x29F;
00097
00098
00099 const int SRAM_MONEY_OFFSET = 0xFC;
00100
00101
00102 const int SRAM_TRADEGOODS_OFFSET = 0x315;
00103
00104
00105 const int SRAM_WEAPONLEVELS_OFFSET = 0x115;
00106
00107
00108 enum sf_alchemy {
00109 SF_ACIDRAIN, SF_ATLAS, SF_BARRIER, SF_CALLUP, SF_CORROSION, SF_CRUSH,
00110 SF_CURE, SF_DEFEND, SF_DOUBLEDRAIN, SF_DRAIN, SF_ENERGIZE, SF_ESCAPE,
00111 SF_EXPLOSION, SF_FIREBALL, SF_FIREPOWER, SF_FLASH, SF_FORCEFIELD,
00112 SF_HARDBALL, SF_HEAL, SF_LANCEALCHEMY, SF_LASERDUMMY, SF_LEVITATE,
00113 SF_LIGHTNINGSTORM, SF_MIRACLECURE, SF_NITRO, SF_ONEUP, SF_REFLECT,
00114 SF_REGROWTH, SF_REVEALER, SF_REVIVE, SF_SLOWBURN, SF_SPEED, SF_STING,
00115 SF_STOP, SF_SUPERHEAL
00116 };
00117
00118
00119 enum sf_charm {
00120 SF_ARMORPOLISH, SF_CHOCOBOEGG, SF_INSECTINCENSE, SF_JADEDISK,
00121 SF_JAGUARRING, SF_MAGICGOURD, SF_MOXASTICK, SF_ORACLEBONE, SF_RUBYHEART,
00122 SF_SILVERSHEATH, SF_STAFFOFLIFE, SF_SUNSTONE, SF_THUGSCLOAK,
00123 SF_WIZARDSCOIN
00124 };
00125
00126
00127 enum sf_hero {
00128 SF_BOY, SF_DOG
00129 };
00130
00131
00132 enum sf_ingredient {
00133 SF_WAX, SF_WATER, SF_VINEGAR, SF_ROOT, SF_OIL, SF_MUSHROOM,
00134 SF_MUDPEPPER, SF_METEORITE, SF_LIMESTONE, SF_IRON, SF_GUNPOWDER,
00135 SF_GREASE, SF_FEATHER, SF_ETHANOL, SF_DRYICE, SF_CRYSTAL, SF_CLAY,
00136 SF_BRIMSTONE, SF_BONE, SF_ATLASMEDALLION, SF_ASH, SF_ACORN
00137 };
00138
00139
00140 enum sf_item {
00141 SF_PETAL, SF_NECTAR, SF_HONEY, SF_DOGBISCUIT, SF_WINGS, SF_ESSENCE,
00142 SF_PIXIEDUST, SF_CALLBEAD, SF_GRASSVEST, SF_SHELLPLATE, SF_DINOSKIN,
00143 SF_BRONZEARMOR, SF_STONEVEST, SF_CENTURIONCAPE, SF_SILVERMAIL,
00144 SF_GOLDPLATEDVEST, SF_SHININGARMOR, SF_MAGNAMAIL, SF_TITANIUMVEST,
00145 SF_VIRTUALVEST, SF_GRASSHAT, SF_SHELLHAT, SF_DINOHELM, SF_BRONZEHELMET,
00146 SF_OBSIDIANHELM, SF_CENTURIONHELM, SF_TITANSCROWN, SF_DRAGONHELM,
00147 SF_KNIGHTSHELM, SF_LIGHTNINGHELM, SF_OLDRELIABLE, SF_BRAINSTORM,
00148 SF_VINEBRACELET, SF_MAMMOTHGUARD, SF_CLAWGUARD, SF_SERPENTBRACER,
00149 SF_BRONZEGAUNTLET, SF_GLOVESOFRA, SF_IRONBRACER, SF_MAGICIANSRING,
00150 SF_DRAGONSCLAW, SF_CYBERGLOVE, SF_PROTECTORRING, SF_VIRTUALGLOVE,
00151 SF_LEATHERCOLLAR, SF_SPIKYCOLLAR, SF_DEFENDERCOLLAR, SF_SPOTSCOLLAR,
00152 SF_THUNDERBALL, SF_PARTICLEBOMB, SF_CRYOBLAST
00153 };
00154
00155
00156 enum sf_money {
00157 SF_TALONS, SF_JEWELS, SF_GOLDCOINS, SF_CREDITS
00158 };
00159
00160
00161 enum sf_region {
00162 REGION_UNITEDSTATES, REGION_ENGLAND,
00163 REGION_FRANCE, REGION_GERMANY, REGION_SPAIN
00164 };
00165
00166
00167 enum sf_tradegood {
00168 SF_ANNIHILATIONAMULET, SF_BEADS, SF_CERAMICPOT, SF_CHICKEN,
00169 SF_GOLDENJACKAL, SF_JEWELEDSCARAB, SF_LIMESTONETABLET, SF_PERFUME,
00170 SF_RICE, SF_SPICE, SF_SOUVENIRSPOON, SF_TAPESTRY, SF_TICKETFOREXHIBITION
00171 };
00172
00173
00174 enum sf_weapon {
00175 SF_BONECRUSHER, SF_GLADIATORSWORD, SF_CRUSADERSWORD, SF_NEUTRONBLADE,
00176 SF_SPIDERSCLAW, SF_BRONZEAXE, SF_KNIGHTBASHER, SF_ATOMSMASHER,
00177 SF_HORNSPEAR, SF_BRONZESPEAR, SF_LANCEWEAPON, SF_LASERLANCE, SF_BAZOOKA
00178 };
00179
00180
00181 class SRAMFile {
00182 private:
00183 int game;
00184 enum sf_region region;
00185 unsigned char *offset;
00186 unsigned char sram[SRAM_FILE_SIZE];
00187 bool modified, valid[4];
00188
00189
00190 static const std::pair<int, int> SRAM_ALCHEMY_OFFSETS[];
00191
00192
00193 static const std::pair<int, int> SRAM_CHARM_OFFSETS[];
00194
00195
00196 static const std::pair<int, int> SRAM_WEAPON_OFFSETS[];
00197
00198
00199
00200
00201
00202
00203
00204
00205 quint16 checksum(int game) const;
00206
00207
00208
00209
00210
00211
00212
00213
00214 quint16 getChecksum(int game) const;
00215
00216
00217
00218
00219
00220
00221
00222 void setChecksum(int game, quint16 checksum);
00223
00224 public:
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 SRAMFile(const QString &filename, enum sf_region region)
00235 throw(InvalidSRAMFileException);
00236
00237
00238
00239
00240
00241
00242
00243
00244 bool save(const QString &filename);
00245
00246
00247
00248
00249
00250
00251
00252
00253 bool hasAlchemy(enum sf_alchemy alchemy) const;
00254
00255
00256
00257
00258
00259
00260
00261 void setAlchemy(enum sf_alchemy alchemy, bool have = true);
00262
00263
00264
00265
00266
00267
00268
00269
00270 std::pair<int, int> getAlchemyLevel(enum sf_alchemy alchemy) const;
00271
00272
00273
00274
00275
00276
00277
00278 void setAlchemyLevel(enum sf_alchemy alchemy,
00279 std::pair<int, int> level);
00280
00281
00282
00283
00284
00285
00286 std::pair<int, int> getAttackLevel() const;
00287
00288
00289
00290
00291
00292
00293 void setAttackLevel(std::pair<int, int> level);
00294
00295
00296
00297
00298
00299
00300
00301
00302 bool hasCharm(enum sf_charm charm) const;
00303
00304
00305
00306
00307
00308
00309
00310 void setCharm(enum sf_charm charm, bool have = true);
00311
00312
00313
00314
00315
00316
00317
00318
00319 quint16 getCurrentHP(enum sf_hero hero) const;
00320
00321
00322
00323
00324
00325
00326
00327 void setCurrentHP(enum sf_hero hero, quint16 hp);
00328
00329
00330
00331
00332
00333
00334
00335
00336 quint32 getExperience(enum sf_hero hero) const;
00337
00338
00339
00340
00341
00342
00343
00344 void setExperience(enum sf_hero hero, quint32 experience);
00345
00346
00347
00348
00349
00350
00351 int getGame() const;
00352
00353
00354
00355
00356
00357
00358 void setGame(int game = 0);
00359
00360
00361
00362
00363
00364
00365
00366
00367 int getIngredient(enum sf_ingredient ingredient) const;
00368
00369
00370
00371
00372
00373
00374
00375 void setIngredient(enum sf_ingredient ingredient, int count);
00376
00377
00378
00379
00380
00381
00382
00383
00384 int getItem(enum sf_item item) const;
00385
00386
00387
00388
00389
00390
00391
00392 void setItem(enum sf_item item, int count);
00393
00394
00395
00396
00397
00398
00399
00400
00401 int getLevel(enum sf_hero hero) const;
00402
00403
00404
00405
00406
00407
00408
00409 void setLevel(enum sf_hero hero, int level);
00410
00411
00412
00413
00414
00415
00416
00417
00418 quint16 getMaxHP(enum sf_hero hero) const;
00419
00420
00421
00422
00423
00424
00425
00426 void setMaxHP(enum sf_hero hero, quint16 hp);
00427
00428
00429
00430
00431
00432
00433 bool isModified() const;
00434
00435
00436
00437
00438
00439
00440
00441
00442 quint32 getMoney(enum sf_money money) const;
00443
00444
00445
00446
00447
00448
00449
00450 void setMoney(enum sf_money money, quint32 count);
00451
00452
00453
00454
00455
00456
00457
00458
00459 QString getName(enum sf_hero hero) const;
00460
00461
00462
00463
00464
00465
00466
00467 void setName(enum sf_hero hero, const QString &name);
00468
00469
00470
00471
00472
00473
00474
00475
00476 quint16 getTradeGood(enum sf_tradegood tradegood) const;
00477
00478
00479
00480
00481
00482
00483
00484 void setTradeGood(enum sf_tradegood tradegood, quint16 count);
00485
00486
00487
00488
00489
00490
00491
00492
00493 bool hasWeapon(enum sf_weapon weapon) const;
00494
00495
00496
00497
00498
00499
00500
00501 void setWeapon(enum sf_weapon weapon, bool have = true);
00502
00503
00504
00505
00506
00507
00508
00509
00510 std::pair<int, int> getWeaponLevel(enum sf_weapon weapon) const;
00511
00512
00513
00514
00515
00516
00517
00518 void setWeaponLevel(enum sf_weapon weapon, std::pair<int, int> level);
00519
00520
00521
00522
00523
00524
00525
00526
00527 bool isValid(int game) const;
00528 };
00529
00530 inline int SRAMFile::getGame() const
00531 { return game; }
00532
00533 inline bool SRAMFile::isModified() const
00534 { return modified; }
00535
00536 inline bool SRAMFile::isValid(int game) const
00537 {
00538 Q_ASSERT((game >= 0) && (game < 4));
00539 return valid[game];
00540 }
00541 }
00542
00543 #endif
00544