diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/load_save.c | 104 | ||||
-rw-r--r-- | src/main.c | 12 | ||||
-rw-r--r-- | src/save.c | 6 |
3 files changed, 113 insertions, 9 deletions
diff --git a/src/load_save.c b/src/load_save.c new file mode 100644 index 000000000..43b2475f3 --- /dev/null +++ b/src/load_save.c @@ -0,0 +1,104 @@ +#include "global.h" +#include "gba/flash_internal.h" +#include "load_save.h" +#include "main.h" +#include "pokemon.h" +#include "rng.h" +#include "malloc.h" + +extern u8 gPlayerPartyCount; +extern struct PokemonStorage* gPokemonStoragePtr; +extern void* gUnknown_0203CF5C; +extern u8 gHeap[0x1C000]; + +extern bool16 IdentifyFlash(void); +extern void SetBagItemsPointers(void); +extern void SetDecorationInventoriesPointers(void); +extern void InitHeap(void *heapStart, u32 heapSize); + +void ApplyNewEncyprtionKeyToAllEncryptedData(u32 encryptionKey); + +#define SAVEBLOCK_MOVE_RANGE 128 + +EWRAM_DATA struct SaveBlock2 gSaveblock2 = {0}; +EWRAM_DATA u8 gSaveblock2_DMA[SAVEBLOCK_MOVE_RANGE] = {0}; + +EWRAM_DATA struct SaveBlock1 gSaveblock1 = {0}; +EWRAM_DATA u8 gSaveblock1_DMA[SAVEBLOCK_MOVE_RANGE] = {0}; + +EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; +EWRAM_DATA u8 gSaveblock3_DMA[SAVEBLOCK_MOVE_RANGE] = {0}; + +void CheckForFlashMemory(void) +{ + if (!IdentifyFlash()) + { + gFlashMemoryPresent = TRUE; + InitFlashTimer(); + } + else + gFlashMemoryPresent = FALSE; +} + +void ClearSav2(void) +{ + CpuFill16(0, &gSaveblock2, sizeof(struct SaveBlock2) + sizeof(gSaveblock2_DMA)); +} + +void ClearSav1(void) +{ + CpuFill16(0, &gSaveblock1, sizeof(struct SaveBlock1) + sizeof(gSaveblock1_DMA)); +} + +void SetSaveBlocksPointers(u16 offset) +{ + struct SaveBlock1** sav1_LocalVar = &gSaveBlock1Ptr; + + offset = (offset + Random()) & (SAVEBLOCK_MOVE_RANGE - 4); + + gSaveBlock2Ptr = (void*)(&gSaveblock2) + offset; + *sav1_LocalVar = (void*)(&gSaveblock1) + offset; + gPokemonStoragePtr = (void*)(&gPokemonStorage) + offset; + + SetBagItemsPointers(); + SetDecorationInventoriesPointers(); +} +/* +void MoveSaveBlocks_ResetHeap(void) +{ + void *vblankCB, *hblankCB; + u32 encryptionKey; + + // save interrupt functions and turn them off + vblankCB = gMain.vblankCallback; + hblankCB = gMain.hblankCallback; + gMain.vblankCallback = NULL; + gMain.hblankCallback = NULL; + gUnknown_0203CF5C = NULL; + + // copy saveblocks' content + memcpy(gHeap, gSaveBlock2Ptr, sizeof(struct SaveBlock2)); + memcpy(gHeap + sizeof(struct SaveBlock2), gSaveBlock1Ptr, sizeof(struct SaveBlock1)); + memcpy(gHeap + sizeof(struct SaveBlock2) + sizeof(struct SaveBlock1), gPokemonStoragePtr, sizeof(struct PokemonStorage)); + + // change saveblocks' pointers + // argument is a sum of the individual trainerId bytes + SetSaveBlocksPointers(gHeap[10] + gHeap[11] + gHeap[12] + gHeap[13]); + + // restore saveblock data since the pointers changed + memcpy(gSaveBlock2Ptr, gHeap, sizeof(struct SaveBlock2)); + memcpy(gSaveBlock1Ptr, gHeap + sizeof(struct SaveBlock2), sizeof(struct SaveBlock1)); + memcpy(gPokemonStoragePtr, gHeap + sizeof(struct SaveBlock2) + sizeof(struct SaveBlock1), sizeof(struct PokemonStorage)); + + // heap was destroyed in the copying process, so reset it + InitHeap(gHeap, sizeof(gHeap)); + + // restore interrupt functions + gMain.hblankCallback = hblankCB; + gMain.vblankCallback = vblankCB; + + // create a new encryption key + encryptionKey = (Random() << 0x10) + (Random()); + ApplyNewEncyprtionKeyToAllEncryptedData(encryptionKey); + gSaveBlock2Ptr->encryptionKey = encryptionKey; +}*/ diff --git a/src/main.c b/src/main.c index 7c8075a6f..7da51c65a 100644 --- a/src/main.c +++ b/src/main.c @@ -34,9 +34,9 @@ extern struct SoundInfo gSoundInfo; extern u32 gFlashMemoryPresent; extern u32 IntrMain[]; extern u8 gHeap[]; -extern struct SaveBlock2 gUnknown_02024A54; -extern char *gUnknown_03005D94; -extern char gUnknown_02029808[]; +extern struct SaveBlock2 gSaveblock2; +extern char *gPokemonStoragePtr; +extern char gPokemonStorage[]; extern u32 gBattleTypeFlags; extern u8 gUnknown_03002748; extern u32 *gUnknown_0203CF5C; @@ -185,8 +185,8 @@ static void InitMainCallbacks(void) gMain.vblankCounter2 = 0; gMain.callback1 = NULL; SetMainCallback2(c2_copyright_1); - gSaveBlock2Ptr = &gUnknown_02024A54; - gUnknown_03005D94 = gUnknown_02029808; + gSaveBlock2Ptr = &gSaveblock2; + gPokemonStoragePtr = gPokemonStorage; } static void CallCallbacks(void) @@ -368,7 +368,7 @@ static void VBlankIntr(void) gMain.intrCheck |= INTR_FLAG_VBLANK; } -void StartFlashMemoryTimer(void) +void InitFlashTimer(void) { SetFlashTimerIntr(2, gIntrTable + 0x7); } diff --git a/src/save.c b/src/save.c index ccb653f66..2b3da38b1 100644 --- a/src/save.c +++ b/src/save.c @@ -5,7 +5,7 @@ extern struct SaveSectionOffsets gSaveSectionOffsets[0xE]; extern struct SaveSectionLocation gRamSaveSectionLocations[0xE]; -extern void *gUnknown_03005D94; +extern void *gPokemonStoragePtr; extern u8 gDecompressionBuffer[]; extern u32 gFlashMemoryPresent; extern u16 gUnknown_03006294; @@ -593,7 +593,7 @@ void UpdateSaveAddresses(void) for(i = 5; i < 14; i++) { - gRamSaveSectionLocations[i].data = gUnknown_03005D94 + gSaveSectionOffsets[i].toAdd; + gRamSaveSectionLocations[i].data = gPokemonStoragePtr + gSaveSectionOffsets[i].toAdd; gRamSaveSectionLocations[i].size = gSaveSectionOffsets[i].size; } } @@ -630,7 +630,7 @@ _081531AC:\n\ bge _081531AC\n\ movs r4, 0x5\n\ ldr r1, =gRamSaveSectionLocations\n\ - ldr r5, =gUnknown_03005D94\n\ + ldr r5, =gPokemonStoragePtr\n\ ldr r0, =gSaveSectionOffsets\n\ adds r3, r1, 0\n\ adds r3, 0x28\n\ |