summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDizzyEggg <jajkodizzy@wp.pl>2017-09-04 18:26:39 +0200
committerDizzyEggg <jajkodizzy@wp.pl>2017-09-04 18:26:39 +0200
commit92892d140a2ed704a1cfa2748ea015c9007da14c (patch)
tree0734aabc301d63cb7f4d0a5a60959fb1bdca5171 /src
parent7ba62bcac8a429952067538b9bd1b6f4eeb32deb (diff)
begin load_save.c
Diffstat (limited to 'src')
-rw-r--r--src/load_save.c104
-rw-r--r--src/main.c12
-rw-r--r--src/save.c6
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\