Updated for pkmgchax

This commit is contained in:
TuxSH
2015-10-29 12:19:43 +01:00
parent 796406f80a
commit ddfdb1178a
12 changed files with 65 additions and 44 deletions

View File

@@ -40,7 +40,7 @@ public:
Save* clone(void) const;
Save* create(void) const;
void save(void);
void save_impl(bool saveAll);
void fixBugsAffectingPokemon(void);

View File

@@ -62,14 +62,14 @@ public:
void swap(SaveSlot& other);
SaveSlot& operator=(SaveSlot const& other);
void save(void);
void save_impl(bool saveAll);
bool checkChecksum(bool fix = false);
bool checkHeaderChecksum(bool fix = false);
std::pair<bool, bool> checkBothChecksums(bool fixGlobalChecksum = false, bool fixHeaderChecksum = false);
bool isCorrupt(void);
void saveEncrypted(u8* outBuf);
void saveEncrypted(u8* outBuf, bool saveAll = true);
u8 checksum[20]; // digest

View File

@@ -52,7 +52,10 @@ public:
virtual void reload(const u8* inData = NULL, u32 flags = 0);
void saveEncrypted(u8* outBuf, bool exportGCIData = true);
virtual void save_impl(bool saveAll) = 0;
void save(void);
void saveEncrypted(u8* outBuf, bool exportGCIData = true, bool saveAll = true);
SaveSlot* getMostRecentSlot(size_t index = 0) const;
SaveSlot* getMostRecentValidSlot(size_t index = 0, size_t *outIndex = NULL);

View File

@@ -60,7 +60,10 @@ public:
virtual std::pair<bool, bool> checkBothChecksums(bool fixGlobalChecksum = false, bool fixHeaderChecksum = false) = 0;
virtual bool isCorrupt(void) = 0;
virtual void saveEncrypted(u8* outBuf) = 0;
virtual void save_impl(bool saveAll) = 0;
void save(void);
virtual void saveEncrypted(u8* outBuf, bool saveAll = true) = 0;
SaveMagic magic;

View File

@@ -40,7 +40,7 @@ public:
Save* clone(void) const;
Save* create(void) const;
void save(void);
void save_impl(bool saveAll);
void saveUnshuffled(void);

View File

@@ -89,7 +89,7 @@ public:
void swap(GC::SaveEditing::SaveSlot& other);
SaveSlot& operator=(GC::SaveEditing::SaveSlot const& other);
void save(void);
void save_impl(bool saveAll);
bool checkChecksum(bool fix = false);
bool checkHeaderChecksum(bool fix = false);
@@ -99,7 +99,7 @@ public:
void reorderSubstructures(void);
void saveUnshuffled(void);
void saveEncrypted(u8* outBuf);
void saveEncrypted(u8* outBuf, bool saveAll = true);
PurifierData* purifier;

View File

@@ -55,8 +55,11 @@ void Save::loadFields(void) {
}
void Save::save(void) {
SV_SUBSTRUCTURE_ARRAY(SaveSlot, saveSlots, 3, 0x6000);
void Save::save_impl(bool saveAll) {
for (size_t i = 0; i < 3; ++i) {
saveSlots[i]->save_impl(saveAll);
std::copy(saveSlots[i]->data, saveSlots[i]->data + SaveSlot::size, data + 0x6000 * i);
}
}
void Save::fixBugsAffectingPokemon(void) {

View File

@@ -268,7 +268,7 @@ void SaveSlot::loadFields(void) {
std::copy(data + 0x1dfd8, data + 0x1dfec, randomBytes);
}
void SaveSlot::save(void) {
void SaveSlot::save_impl(bool saveAll) {
magic = ColosseumMagic;
SV_FIELD_E(u32, ColosseumMagic, 0, SaveMagic);
SV_FIELD(u32, saveCount, 4);
@@ -276,20 +276,22 @@ void SaveSlot::save(void) {
size_t offset = 0;
#define SV_IMPLEMENTED_SUBSTRUCTURE(type, field) SV_SUBSTRUCTURE(type, field, 8 + offset); offset += type::size;
SV_IMPLEMENTED_SUBSTRUCTURE(GameConfigData, gameConfig);
SV_IMPLEMENTED_SUBSTRUCTURE(PlayerData, player);
SV_IMPLEMENTED_SUBSTRUCTURE(PCData, PC);
SV_IMPLEMENTED_SUBSTRUCTURE(MailboxData, mailbox);
SV_IMPLEMENTED_SUBSTRUCTURE(DaycareData, daycare);
SV_IMPLEMENTED_SUBSTRUCTURE(StrategyMemoData, strategyMemo);
offset = 0xe3e8;
SV_IMPLEMENTED_SUBSTRUCTURE(BattleModeData, battleMode);
offset = 0x1c45c;
SV_IMPLEMENTED_SUBSTRUCTURE(RibbonDescriptionsData, ribbonDescriptions);
// unknown substructures following
if (saveAll) {
SV_IMPLEMENTED_SUBSTRUCTURE(PlayerData, player);
SV_IMPLEMENTED_SUBSTRUCTURE(PCData, PC);
SV_IMPLEMENTED_SUBSTRUCTURE(MailboxData, mailbox);
SV_IMPLEMENTED_SUBSTRUCTURE(DaycareData, daycare);
SV_IMPLEMENTED_SUBSTRUCTURE(StrategyMemoData, strategyMemo);
offset = 0xe3e8;
SV_IMPLEMENTED_SUBSTRUCTURE(BattleModeData, battleMode);
offset = 0x1c45c;
SV_IMPLEMENTED_SUBSTRUCTURE(RibbonDescriptionsData, ribbonDescriptions);
// unknown substructures following
}
checkBothChecksums(true, true); // update checksums
offset = 0;
@@ -300,8 +302,8 @@ void SaveSlot::save(void) {
}
void SaveSlot::saveEncrypted(u8* outBuf) {
save();
void SaveSlot::saveEncrypted(u8* outBuf, bool saveAll) {
save_impl(saveAll);
std::copy(data, data + 0x18, outBuf);
std::copy(data + 0x1dfd8, data + 0x1e000, outBuf + 0x1dfd8);
encrypt_impl(data, outBuf, checksum);

View File

@@ -82,7 +82,11 @@ void Save::reload(const u8* inData, u32 flags) {
else Base::DataStruct::reload(inData, 0);
}
void Save::saveEncrypted(u8* outBuf, bool exportGCIData) {
void Save::save(void) {
save_impl(true);
}
void Save::saveEncrypted(u8* outBuf, bool exportGCIData, bool saveAll) {
if (hasGCIData && exportGCIData) {
std::copy(GCIData, GCIData + 0x40, outBuf);
outBuf += 0x40;
@@ -90,7 +94,7 @@ void Save::saveEncrypted(u8* outBuf, bool exportGCIData) {
std::copy(data, data + 0x6000, outBuf);
size_t sz = saveSlots[0]->fixedSize;
for (size_t i = 0; i < nbSlots; ++i)
saveSlots[i]->saveEncrypted(outBuf + 0x6000 + sz*i);
saveSlots[i]->saveEncrypted(outBuf + 0x6000 + sz*i, saveAll);
}
inline bool date_comparison(SaveSlot* a, SaveSlot* b) {

View File

@@ -104,6 +104,10 @@ void SaveSlot::reload(const u8* inData, u32 flags) {
else Base::DataStruct::reload(inData, flags);
}
void SaveSlot::save(void) {
save_impl(true);
}
}
}

View File

@@ -50,18 +50,18 @@ void Save::loadFields(void) {
saveSlots = new GC::SaveEditing::SaveSlot*[2];
u8* start = data + 0x6000;
/*delete saveSlots[0];
delete saveSlots[1];*/
saveSlots[0] = new SaveSlot(start, _is_decrypted);
saveSlots[1] = new SaveSlot(start + 0x28000, _is_decrypted);
}
void Save::save(void) {
SV_SUBSTRUCTURE_ARRAY(SaveSlot, saveSlots, 2, 0x6000);
void Save::save_impl(bool saveAll) {
for (size_t i = 0; i < 2; ++i) {
saveSlots[i]->save_impl(saveAll);
std::copy(saveSlots[i]->data, saveSlots[i]->data + SaveSlot::size, data + 0x6000 * i);
}
}
void Save::saveUnshuffled(void) {
//nb_saveSlots = 2;
for (size_t i = 0; i < 2; ++i) {
SaveSlot* slot = (SaveSlot*)saveSlots[i];
slot->saveUnshuffled();

View File

@@ -326,7 +326,7 @@ bool SaveSlot::isCorrupt(void) {
return !chk.first || !chk.second;
}
void SaveSlot::save(void) {
void SaveSlot::save_impl(bool saveAll) {
magic = XDMagic;
u8* start = data + 8 + 0xa0;
@@ -338,10 +338,11 @@ void SaveSlot::save(void) {
std::copy(randomBytes, randomBytes + 40, data + size - 40);
std::fill(start, data + size - 40, 0); // clean the filler bytes
if(saveAll) std::fill(start, data + size - 40, 0); // clean the filler bytes
std::copy(substructureMaxSizes, substructureMaxSizes + 16, substructureSizes);
{ // flags
u16 sz = 0;
for (size_t i = 0; i < 5; ++i) sz += flagDataSubSizes[i];
@@ -358,16 +359,17 @@ void SaveSlot::save(void) {
#define SV_IMPLEMENTED_SUBSTRUCTURE(type, field, id) field->save(); std::copy(field->data, field->data + substructureMaxSizes[id], start + substructureOffsets[id]);
SV_IMPLEMENTED_SUBSTRUCTURE(GameConfigData, gameConfig, 0);
SV_IMPLEMENTED_SUBSTRUCTURE(PlayerData, player, 1);
SV_IMPLEMENTED_SUBSTRUCTURE(PCData, PC, 2);
SV_IMPLEMENTED_SUBSTRUCTURE(MailboxData, mailbox, 3);
SV_IMPLEMENTED_SUBSTRUCTURE(DaycareData, daycare, 4);
SV_IMPLEMENTED_SUBSTRUCTURE(StrategyMemoData, strategyMemo, 5);
SV_IMPLEMENTED_SUBSTRUCTURE(BattleModeData, battleMode, 6);
SV_IMPLEMENTED_SUBSTRUCTURE(RibbonDescriptionsData, ribbonDescriptions, 9);
SV_IMPLEMENTED_SUBSTRUCTURE(PurifierData, purifier, 14);
if (saveAll) {
SV_IMPLEMENTED_SUBSTRUCTURE(PlayerData, player, 1);
SV_IMPLEMENTED_SUBSTRUCTURE(PCData, PC, 2);
SV_IMPLEMENTED_SUBSTRUCTURE(MailboxData, mailbox, 3);
SV_IMPLEMENTED_SUBSTRUCTURE(DaycareData, daycare, 4);
SV_IMPLEMENTED_SUBSTRUCTURE(StrategyMemoData, strategyMemo, 5);
SV_IMPLEMENTED_SUBSTRUCTURE(BattleModeData, battleMode, 6);
SV_IMPLEMENTED_SUBSTRUCTURE(RibbonDescriptionsData, ribbonDescriptions, 9);
SV_IMPLEMENTED_SUBSTRUCTURE(PurifierData, purifier, 14);
}
u16 substructureOffsetsTmp[32]; // the upper 16 bits of each offset are stored AFTER the lower ones
std::copy(substructureMaxSizes, substructureMaxSizes + 16, substructureSizes);
@@ -420,8 +422,8 @@ void SaveSlot::saveUnshuffled(void) {
save();
}
void SaveSlot::saveEncrypted(u8* outBuf) {
save();
void SaveSlot::saveEncrypted(u8* outBuf, bool saveAll) {
save_impl(saveAll);
std::copy(data, data + 0x10, outBuf);
std::copy(data + 0x28000 - 40, data + 0x28000, outBuf + 0x28000 - 40);
encrypt_impl(data, outBuf, encryptionKeys);