From ddfdb1178a7a42e6d2593ae23c2f02717a231100 Mon Sep 17 00:00:00 2001 From: TuxSH Date: Thu, 29 Oct 2015 12:19:43 +0100 Subject: [PATCH] Updated for pkmgchax --- .../LibPkmGC/Colosseum/SaveEditing/Save.h | 2 +- .../LibPkmGC/Colosseum/SaveEditing/SaveSlot.h | 4 +-- .../include/LibPkmGC/GC/SaveEditing/Save.h | 5 +++- .../LibPkmGC/GC/SaveEditing/SaveSlot.h | 5 +++- .../include/LibPkmGC/XD/SaveEditing/Save.h | 2 +- .../LibPkmGC/XD/SaveEditing/SaveSlot.h | 4 +-- .../LibPkmGC/Colosseum/SaveEditing/Save.cpp | 7 +++-- .../Colosseum/SaveEditing/SaveSlot.cpp | 30 ++++++++++--------- LibPkmGC/src/LibPkmGC/GC/SaveEditing/Save.cpp | 8 +++-- .../src/LibPkmGC/GC/SaveEditing/SaveSlot.cpp | 4 +++ LibPkmGC/src/LibPkmGC/XD/SaveEditing/Save.cpp | 10 +++---- .../src/LibPkmGC/XD/SaveEditing/SaveSlot.cpp | 28 +++++++++-------- 12 files changed, 65 insertions(+), 44 deletions(-) diff --git a/LibPkmGC/include/LibPkmGC/Colosseum/SaveEditing/Save.h b/LibPkmGC/include/LibPkmGC/Colosseum/SaveEditing/Save.h index 2e14acc..c690837 100644 --- a/LibPkmGC/include/LibPkmGC/Colosseum/SaveEditing/Save.h +++ b/LibPkmGC/include/LibPkmGC/Colosseum/SaveEditing/Save.h @@ -40,7 +40,7 @@ public: Save* clone(void) const; Save* create(void) const; - void save(void); + void save_impl(bool saveAll); void fixBugsAffectingPokemon(void); diff --git a/LibPkmGC/include/LibPkmGC/Colosseum/SaveEditing/SaveSlot.h b/LibPkmGC/include/LibPkmGC/Colosseum/SaveEditing/SaveSlot.h index e3bd94c..849d637 100644 --- a/LibPkmGC/include/LibPkmGC/Colosseum/SaveEditing/SaveSlot.h +++ b/LibPkmGC/include/LibPkmGC/Colosseum/SaveEditing/SaveSlot.h @@ -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 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 diff --git a/LibPkmGC/include/LibPkmGC/GC/SaveEditing/Save.h b/LibPkmGC/include/LibPkmGC/GC/SaveEditing/Save.h index 9ba5c5a..6bed4f2 100644 --- a/LibPkmGC/include/LibPkmGC/GC/SaveEditing/Save.h +++ b/LibPkmGC/include/LibPkmGC/GC/SaveEditing/Save.h @@ -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); diff --git a/LibPkmGC/include/LibPkmGC/GC/SaveEditing/SaveSlot.h b/LibPkmGC/include/LibPkmGC/GC/SaveEditing/SaveSlot.h index 9463995..1e8da17 100644 --- a/LibPkmGC/include/LibPkmGC/GC/SaveEditing/SaveSlot.h +++ b/LibPkmGC/include/LibPkmGC/GC/SaveEditing/SaveSlot.h @@ -60,7 +60,10 @@ public: virtual std::pair 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; diff --git a/LibPkmGC/include/LibPkmGC/XD/SaveEditing/Save.h b/LibPkmGC/include/LibPkmGC/XD/SaveEditing/Save.h index e5d59cf..b1c9e6d 100644 --- a/LibPkmGC/include/LibPkmGC/XD/SaveEditing/Save.h +++ b/LibPkmGC/include/LibPkmGC/XD/SaveEditing/Save.h @@ -40,7 +40,7 @@ public: Save* clone(void) const; Save* create(void) const; - void save(void); + void save_impl(bool saveAll); void saveUnshuffled(void); diff --git a/LibPkmGC/include/LibPkmGC/XD/SaveEditing/SaveSlot.h b/LibPkmGC/include/LibPkmGC/XD/SaveEditing/SaveSlot.h index 7cb60af..0fa7168 100644 --- a/LibPkmGC/include/LibPkmGC/XD/SaveEditing/SaveSlot.h +++ b/LibPkmGC/include/LibPkmGC/XD/SaveEditing/SaveSlot.h @@ -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; diff --git a/LibPkmGC/src/LibPkmGC/Colosseum/SaveEditing/Save.cpp b/LibPkmGC/src/LibPkmGC/Colosseum/SaveEditing/Save.cpp index cbd437c..9fe0dab 100644 --- a/LibPkmGC/src/LibPkmGC/Colosseum/SaveEditing/Save.cpp +++ b/LibPkmGC/src/LibPkmGC/Colosseum/SaveEditing/Save.cpp @@ -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) { diff --git a/LibPkmGC/src/LibPkmGC/Colosseum/SaveEditing/SaveSlot.cpp b/LibPkmGC/src/LibPkmGC/Colosseum/SaveEditing/SaveSlot.cpp index 3d32b44..170b641 100644 --- a/LibPkmGC/src/LibPkmGC/Colosseum/SaveEditing/SaveSlot.cpp +++ b/LibPkmGC/src/LibPkmGC/Colosseum/SaveEditing/SaveSlot.cpp @@ -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); diff --git a/LibPkmGC/src/LibPkmGC/GC/SaveEditing/Save.cpp b/LibPkmGC/src/LibPkmGC/GC/SaveEditing/Save.cpp index aa316a4..43fd6c2 100644 --- a/LibPkmGC/src/LibPkmGC/GC/SaveEditing/Save.cpp +++ b/LibPkmGC/src/LibPkmGC/GC/SaveEditing/Save.cpp @@ -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) { diff --git a/LibPkmGC/src/LibPkmGC/GC/SaveEditing/SaveSlot.cpp b/LibPkmGC/src/LibPkmGC/GC/SaveEditing/SaveSlot.cpp index e55044c..f69469a 100644 --- a/LibPkmGC/src/LibPkmGC/GC/SaveEditing/SaveSlot.cpp +++ b/LibPkmGC/src/LibPkmGC/GC/SaveEditing/SaveSlot.cpp @@ -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); +} + } } diff --git a/LibPkmGC/src/LibPkmGC/XD/SaveEditing/Save.cpp b/LibPkmGC/src/LibPkmGC/XD/SaveEditing/Save.cpp index e31891e..e2fa60c 100644 --- a/LibPkmGC/src/LibPkmGC/XD/SaveEditing/Save.cpp +++ b/LibPkmGC/src/LibPkmGC/XD/SaveEditing/Save.cpp @@ -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(); diff --git a/LibPkmGC/src/LibPkmGC/XD/SaveEditing/SaveSlot.cpp b/LibPkmGC/src/LibPkmGC/XD/SaveEditing/SaveSlot.cpp index 5c01302..ef2cd76 100644 --- a/LibPkmGC/src/LibPkmGC/XD/SaveEditing/SaveSlot.cpp +++ b/LibPkmGC/src/LibPkmGC/XD/SaveEditing/SaveSlot.cpp @@ -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);