mirror of
https://github.com/TuxSH/PkmGCTools.git
synced 2026-09-07 08:15:30 -05:00
Updated for pkmgchax
This commit is contained in:
@@ -40,7 +40,7 @@ public:
|
||||
Save* clone(void) const;
|
||||
Save* create(void) const;
|
||||
|
||||
void save(void);
|
||||
void save_impl(bool saveAll);
|
||||
|
||||
void fixBugsAffectingPokemon(void);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -40,7 +40,7 @@ public:
|
||||
Save* clone(void) const;
|
||||
Save* create(void) const;
|
||||
|
||||
void save(void);
|
||||
void save_impl(bool saveAll);
|
||||
|
||||
void saveUnshuffled(void);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user