summaryrefslogtreecommitdiff
path: root/include/load_save.h
diff options
context:
space:
mode:
authorProjectRevoTPP <projectrevotpp@hotmail.com>2021-11-13 21:41:16 -0500
committerProjectRevoTPP <projectrevotpp@hotmail.com>2021-11-13 21:41:16 -0500
commit9d3345a6d69c38bf31014df69c52583c877eed24 (patch)
tree3f682d51224c1294464aa215b5f600141df586a6 /include/load_save.h
parentb14fe9dce369b1a78c5f4f653b4c7e2e2d67d98d (diff)
Enforce structs to enforce save block order for modern toolchains.
Diffstat (limited to 'include/load_save.h')
-rw-r--r--include/load_save.h30
1 files changed, 27 insertions, 3 deletions
diff --git a/include/load_save.h b/include/load_save.h
index 2f4a9ace6..9e7b1bc92 100644
--- a/include/load_save.h
+++ b/include/load_save.h
@@ -1,9 +1,33 @@
#ifndef GUARD_LOAD_SAVE_H
#define GUARD_LOAD_SAVE_H
-extern struct SaveBlock1 gSaveblock1;
-extern struct SaveBlock2 gSaveblock2;
-extern struct PokemonStorage gPokemonStorage;
+#include "pokemon_storage_system.h"
+
+#define SAVEBLOCK_MOVE_RANGE 128
+
+/**
+ * These structs are to prevent them from being reordered on newer or modern
+ * toolchains. If this is not done, the ClearSav functions will end up erasing
+ * the wrong memory leading to various glitches.
+ */
+struct SaveBlock2DMA {
+ struct SaveBlock2 block;
+ u8 dma[SAVEBLOCK_MOVE_RANGE];
+};
+
+struct SaveBlock1DMA {
+ struct SaveBlock1 block;
+ u8 dma[SAVEBLOCK_MOVE_RANGE];
+};
+
+struct PokemonStorageDMA {
+ struct PokemonStorage block;
+ u8 dma[SAVEBLOCK_MOVE_RANGE];
+};
+
+extern struct SaveBlock1DMA gSaveblock1;
+extern struct SaveBlock2DMA gSaveblock2;
+extern struct PokemonStorageDMA gPokemonStorage;
extern bool32 gFlashMemoryPresent;
extern struct SaveBlock1 *gSaveBlock1Ptr;