summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2018-10-17 10:53:16 -0700
committerPikalaxALT <pikalaxalt@gmail.com>2018-10-17 10:53:16 -0700
commit46e006b94cf7a2e59652a083cdd01f0d5dc9a26f (patch)
treed2d5315a6c8512aeda5ca5d435c3ef2a7d80688b
parent0ba52688584d8a35ec9c617b035c9dea71e2689f (diff)
parentd05339979e39580b162e618087136bb220a4f20d (diff)
Merge branch 'master' into quest_log
-rw-r--r--asm/battle_2.s2
-rw-r--r--asm/battle_setup.s4
-rw-r--r--asm/cable_club.s8
-rw-r--r--asm/item.s2
-rw-r--r--asm/item_menu.s4
-rw-r--r--asm/link_rfu_3.s16
-rw-r--r--asm/load_save.s814
-rw-r--r--asm/overworld.s4
-rw-r--r--asm/party_menu.s2
-rw-r--r--asm/script_pokemon_util_80A0058.s2
-rw-r--r--asm/teachy_tv.s4
-rw-r--r--asm/unk_815EDDC.s2
-rw-r--r--common_syms/load_save.txt4
-rw-r--r--include/global.h24
-rw-r--r--include/load_save.h4
-rw-r--r--include/malloc.h1
-rw-r--r--ld_script.txt2
-rw-r--r--src/load_save.c297
-rw-r--r--sym_common.txt15
-rw-r--r--sym_ewram.txt16
20 files changed, 354 insertions, 873 deletions
diff --git a/asm/battle_2.s b/asm/battle_2.s
index 4daca575b..eba29102c 100644
--- a/asm/battle_2.s
+++ b/asm/battle_2.s
@@ -8,7 +8,7 @@
thumb_func_start sub_800FD9C
sub_800FD9C: @ 800FD9C
push {r4,lr}
- bl sub_804C0A4
+ bl MoveSaveBlocks_ResetHeap
bl sub_802E03C
bl AllocateBattleSpritesData
bl AllocateMonSpritesGfx
diff --git a/asm/battle_setup.s b/asm/battle_setup.s
index 128aa459f..a0585784f 100644
--- a/asm/battle_setup.s
+++ b/asm/battle_setup.s
@@ -579,7 +579,7 @@ _0807FAF4: .4byte gBattleTypeFlags
thumb_func_start sub_807FAF8
sub_807FAF8: @ 807FAF8
push {lr}
- bl sub_804C230
+ bl LoadPlayerParty
bl sub_807FB40
pop {r0}
bx r0
@@ -594,7 +594,7 @@ sub_807FB08: @ 807FB08
ldr r1, _0807FB38 @ =gMain
ldr r0, _0807FB3C @ =sub_807FAF8
str r0, [r1, 0x8]
- bl copy_player_party_to_sav1
+ bl SavePlayerParty
bl sub_8159F40
bl GetWildBattleTransition
lsls r0, 24
diff --git a/asm/cable_club.s b/asm/cable_club.s
index d67a8db6e..0d9454d72 100644
--- a/asm/cable_club.s
+++ b/asm/cable_club.s
@@ -1924,8 +1924,8 @@ sub_8081668: @ 8081668
ands r0, r1
str r0, [r2]
bl sub_8055DB8
- bl sub_804C230
- bl sub_804C440
+ bl LoadPlayerParty
+ bl SavePlayerBag
bl sub_81134B8
ldr r0, _080816B8 @ =gUnknown_20370C0
ldrh r0, [r0]
@@ -2025,8 +2025,8 @@ sub_8081744: @ 8081744
cmp r1, 0x5
bne _08081760
_08081758:
- bl sub_804C230
- bl sub_804C440
+ bl LoadPlayerParty
+ bl SavePlayerBag
_08081760:
movs r0, 0x7F
bl copy_saved_warp2_bank_and_enter_x_to_warp1
diff --git a/asm/item.s b/asm/item.s
index b5d30b995..08df51656 100644
--- a/asm/item.s
+++ b/asm/item.s
@@ -81,7 +81,7 @@ _08099E04:
adds r0, 0x2
mov r1, r8
str r2, [sp]
- bl sub_804C56C
+ bl ApplyNewEncryptionKeyToHword
adds r6, 0x1
ldr r2, [sp]
ldrb r4, [r4, 0x4]
diff --git a/asm/item_menu.s b/asm/item_menu.s
index 6c508193f..1c42a3a3f 100644
--- a/asm/item_menu.s
+++ b/asm/item_menu.s
@@ -6629,7 +6629,7 @@ _0810B396:
cmp r0, 0x1
bne _0810B3B8
bl FreeRestoreBattleData
- bl sub_804C230
+ bl LoadPlayerParty
b _0810B4B6
.align 2, 0
_0810B3B0: .4byte gTasks+0x8
@@ -6791,7 +6791,7 @@ sub_810B4BC: @ 810B4BC
cmp r0, 0x1
bne _0810B50C
bl FreeRestoreBattleData
- bl sub_804C230
+ bl LoadPlayerParty
b _0810B5C6
.align 2, 0
_0810B504: .4byte gTasks+0x8
diff --git a/asm/link_rfu_3.s b/asm/link_rfu_3.s
index d3c5d5917..ec3e2e5a4 100644
--- a/asm/link_rfu_3.s
+++ b/asm/link_rfu_3.s
@@ -3273,8 +3273,8 @@ sub_81173C0: @ 81173C0
lsls r6, 16
lsrs r6, 16
bl sp000_heal_pokemon
- bl copy_player_party_to_sav1
- bl copy_bags_and_unk_data_from_save_blocks
+ bl SavePlayerParty
+ bl LoadPlayerBag
ldr r5, _0811742C @ =gLinkPlayers
ldr r0, _08117430 @ =0x00002211
str r0, [r5, 0x14]
@@ -3661,8 +3661,8 @@ _081177A0:
movs r1, 0x1
bl sub_8117594
bl sp000_heal_pokemon
- bl copy_player_party_to_sav1
- bl copy_bags_and_unk_data_from_save_blocks
+ bl SavePlayerParty
+ bl LoadPlayerBag
movs r0, 0x1
str r0, [sp]
movs r0, 0
@@ -3674,8 +3674,8 @@ _081177C4: .4byte gUnknown_2022618
_081177C8:
bl sub_80563F0
bl sp000_heal_pokemon
- bl copy_player_party_to_sav1
- bl copy_bags_and_unk_data_from_save_blocks
+ bl SavePlayerParty
+ bl LoadPlayerBag
ldr r0, _081177EC @ =gUnknown_2022618
movs r1, 0x1
bl sub_8117594
@@ -3690,8 +3690,8 @@ _081177EC: .4byte gUnknown_2022618
_081177F0:
bl sub_80563F0
bl sp000_heal_pokemon
- bl copy_player_party_to_sav1
- bl copy_bags_and_unk_data_from_save_blocks
+ bl SavePlayerParty
+ bl LoadPlayerBag
ldr r0, _08117814 @ =gUnknown_2022618
movs r1, 0x1
bl sub_8117594
diff --git a/asm/load_save.s b/asm/load_save.s
deleted file mode 100644
index 6d8e115d8..000000000
--- a/asm/load_save.s
+++ /dev/null
@@ -1,814 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start CheckForFlashMemory
-CheckForFlashMemory: @ 804BFE4
- push {lr}
- bl IdentifyFlash
- lsls r0, 16
- cmp r0, 0
- bne _0804C000
- ldr r1, _0804BFFC @ =gFlashMemoryPresent
- movs r0, 0x1
- str r0, [r1]
- bl InitFlashTimer
- b _0804C006
- .align 2, 0
-_0804BFFC: .4byte gFlashMemoryPresent
-_0804C000:
- ldr r1, _0804C00C @ =gFlashMemoryPresent
- movs r0, 0
- str r0, [r1]
-_0804C006:
- pop {r0}
- bx r0
- .align 2, 0
-_0804C00C: .4byte gFlashMemoryPresent
- thumb_func_end CheckForFlashMemory
-
- thumb_func_start ClearSav2
-ClearSav2: @ 804C010
- push {lr}
- sub sp, 0x4
- mov r1, sp
- movs r0, 0
- strh r0, [r1]
- ldr r1, _0804C02C @ =gSaveBlock2
- ldr r2, _0804C030 @ =0x010007d2
- mov r0, sp
- bl CpuSet
- add sp, 0x4
- pop {r0}
- bx r0
- .align 2, 0
-_0804C02C: .4byte gSaveBlock2
-_0804C030: .4byte 0x010007d2
- thumb_func_end ClearSav2
-
- thumb_func_start ClearSav1
-ClearSav1: @ 804C034
- push {lr}
- sub sp, 0x4
- mov r1, sp
- movs r0, 0
- strh r0, [r1]
- ldr r1, _0804C050 @ =gSaveBlock1
- ldr r2, _0804C054 @ =0x01001ef4
- mov r0, sp
- bl CpuSet
- add sp, 0x4
- pop {r0}
- bx r0
- .align 2, 0
-_0804C050: .4byte gSaveBlock1
-_0804C054: .4byte 0x01001ef4
- thumb_func_end ClearSav1
-
- thumb_func_start SetSaveBlocksPointers
-SetSaveBlocksPointers: @ 804C058
- push {r4,r5,lr}
- ldr r4, _0804C08C @ =gSaveBlock1Ptr
- ldr r5, [r4]
- bl Random
- movs r1, 0x7C
- ands r1, r0
- ldr r2, _0804C090 @ =gSaveBlock2Ptr
- ldr r0, _0804C094 @ =gSaveBlock2
- adds r0, r1, r0
- str r0, [r2]
- ldr r0, _0804C098 @ =gSaveBlock1
- adds r0, r1, r0
- str r0, [r4]
- ldr r2, _0804C09C @ =gPokemonStoragePtr
- ldr r0, _0804C0A0 @ =gPokemonStorage
- adds r1, r0
- str r1, [r2]
- bl sub_8099E44
- adds r0, r5, 0
- bl sub_8110840
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0804C08C: .4byte gSaveBlock1Ptr
-_0804C090: .4byte gSaveBlock2Ptr
-_0804C094: .4byte gSaveBlock2
-_0804C098: .4byte gSaveBlock1
-_0804C09C: .4byte gPokemonStoragePtr
-_0804C0A0: .4byte gPokemonStorage
- thumb_func_end SetSaveBlocksPointers
-
- thumb_func_start sub_804C0A4
-sub_804C0A4: @ 804C0A4
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x8
- ldr r4, _0804C160 @ =gMain
- ldr r0, [r4, 0xC]
- str r0, [sp]
- ldr r1, [r4, 0x10]
- str r1, [sp, 0x4]
- movs r0, 0
- str r0, [r4, 0xC]
- str r0, [r4, 0x10]
- str r0, [r4, 0x20]
- ldr r5, _0804C164 @ =gHeap
- ldr r0, _0804C168 @ =gSaveBlock2Ptr
- ldr r1, [r0]
- ldr r0, _0804C16C @ =0x00000f24
- mov r9, r0
- adds r0, r5, 0
- mov r2, r9
- bl memcpy
- ldr r1, _0804C170 @ =gSaveBlock1Ptr
- mov r10, r1
- ldr r1, [r1]
- ldr r7, _0804C174 @ =0x00003d68
- ldr r0, _0804C178 @ =gHeap + 0xf24
- adds r2, r7, 0
- bl memcpy
- ldr r6, _0804C17C @ =gPokemonStoragePtr
- ldr r1, [r6]
- ldr r0, _0804C180 @ =0x000083d0
- mov r8, r0
- ldr r0, _0804C184 @ =gHeap + 0x4c8c
- mov r2, r8
- bl memcpy
- bl SetSaveBlocksPointers
- ldr r1, _0804C168 @ =gSaveBlock2Ptr
- ldr r0, [r1]
- adds r1, r5, 0
- mov r2, r9
- bl memcpy
- mov r1, r10
- ldr r0, [r1]
- ldr r1, _0804C178 @ =gHeap + 0xf24
- adds r2, r7, 0
- bl memcpy
- ldr r0, [r6]
- ldr r1, _0804C184 @ =gHeap + 0x4c8c
- mov r2, r8
- bl memcpy
- movs r1, 0xE0
- lsls r1, 9
- adds r0, r5, 0
- bl InitHeap
- ldr r0, [sp, 0x4]
- str r0, [r4, 0x10]
- ldr r1, [sp]
- str r1, [r4, 0xC]
- bl Random
- adds r4, r0, 0
- bl Random
- lsls r4, 16
- lsls r0, 16
- lsrs r0, 16
- adds r4, r0
- adds r0, r4, 0
- bl sub_804C5A4
- ldr r1, _0804C168 @ =gSaveBlock2Ptr
- ldr r0, [r1]
- movs r1, 0xF2
- lsls r1, 4
- adds r0, r1
- str r4, [r0]
- add sp, 0x8
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0804C160: .4byte gMain
-_0804C164: .4byte gHeap
-_0804C168: .4byte gSaveBlock2Ptr
-_0804C16C: .4byte 0x00000f24
-_0804C170: .4byte gSaveBlock1Ptr
-_0804C174: .4byte 0x00003d68
-_0804C178: .4byte gHeap + 0xf24
-_0804C17C: .4byte gPokemonStoragePtr
-_0804C180: .4byte 0x000083d0
-_0804C184: .4byte gHeap + 0x4c8c
- thumb_func_end sub_804C0A4
-
- thumb_func_start sav2_x1_query_bit1
-sav2_x1_query_bit1: @ 804C188
- ldr r0, _0804C194 @ =gSaveBlock2Ptr
- ldr r0, [r0]
- ldrb r1, [r0, 0x9]
- movs r0, 0x1
- ands r0, r1
- bx lr
- .align 2, 0
-_0804C194: .4byte gSaveBlock2Ptr
- thumb_func_end sav2_x1_query_bit1
-
- thumb_func_start sav2_x9_clear_bit1
-sav2_x9_clear_bit1: @ 804C198
- ldr r0, _0804C1A8 @ =gSaveBlock2Ptr
- ldr r2, [r0]
- ldrb r1, [r2, 0x9]
- movs r0, 0xFE
- ands r0, r1
- strb r0, [r2, 0x9]
- bx lr
- .align 2, 0
-_0804C1A8: .4byte gSaveBlock2Ptr
- thumb_func_end sav2_x9_clear_bit1
-
- thumb_func_start sub_804C1AC
-sub_804C1AC: @ 804C1AC
- ldr r0, _0804C1BC @ =gSaveBlock2Ptr
- ldr r2, [r0]
- ldrb r1, [r2, 0x9]
- movs r0, 0x1
- orrs r0, r1
- strb r0, [r2, 0x9]
- bx lr
- .align 2, 0
-_0804C1BC: .4byte gSaveBlock2Ptr
- thumb_func_end sub_804C1AC
-
- thumb_func_start sub_804C1C0
-sub_804C1C0: @ 804C1C0
- push {lr}
- movs r0, 0
- bl sub_8055778
- ldr r0, _0804C1D8 @ =gSaveBlock2Ptr
- ldr r2, [r0]
- ldrb r1, [r2, 0x9]
- movs r0, 0x1
- orrs r0, r1
- strb r0, [r2, 0x9]
- pop {r0}
- bx r0
- .align 2, 0
-_0804C1D8: .4byte gSaveBlock2Ptr
- thumb_func_end sub_804C1C0
-
- thumb_func_start sav2_gender2_inplace_and_xFE
-sav2_gender2_inplace_and_xFE: @ 804C1DC
- ldr r0, _0804C1EC @ =gSaveBlock2Ptr
- ldr r2, [r0]
- ldrb r1, [r2, 0x9]
- movs r0, 0xFE
- ands r0, r1
- strb r0, [r2, 0x9]
- bx lr
- .align 2, 0
-_0804C1EC: .4byte gSaveBlock2Ptr
- thumb_func_end sav2_gender2_inplace_and_xFE
-
- thumb_func_start copy_player_party_to_sav1
-copy_player_party_to_sav1: @ 804C1F0
- push {r4,lr}
- ldr r0, _0804C224 @ =gSaveBlock1Ptr
- ldr r0, [r0]
- ldr r1, _0804C228 @ =gPlayerPartyCount
- ldrb r1, [r1]
- adds r0, 0x34
- strb r1, [r0]
- movs r4, 0
-_0804C200:
- ldr r0, _0804C224 @ =gSaveBlock1Ptr
- ldr r0, [r0]
- movs r1, 0x64
- muls r1, r4
- adds r0, r1
- ldr r2, _0804C22C @ =gPlayerParty
- adds r1, r2
- adds r0, 0x38
- movs r2, 0x64
- bl memcpy
- adds r4, 0x1
- cmp r4, 0x5
- ble _0804C200
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0804C224: .4byte gSaveBlock1Ptr
-_0804C228: .4byte gPlayerPartyCount
-_0804C22C: .4byte gPlayerParty
- thumb_func_end copy_player_party_to_sav1
-
- thumb_func_start sub_804C230
-sub_804C230: @ 804C230
- push {r4,r5,lr}
- ldr r1, _0804C264 @ =gPlayerPartyCount
- ldr r0, _0804C268 @ =gSaveBlock1Ptr
- ldr r0, [r0]
- adds r0, 0x34
- ldrb r0, [r0]
- strb r0, [r1]
- movs r4, 0
- ldr r5, _0804C26C @ =gPlayerParty
-_0804C242:
- movs r0, 0x64
- adds r2, r4, 0
- muls r2, r0
- adds r0, r2, r5
- ldr r1, _0804C268 @ =gSaveBlock1Ptr
- ldr r1, [r1]
- adds r1, r2
- adds r1, 0x38
- movs r2, 0x64
- bl memcpy
- adds r4, 0x1
- cmp r4, 0x5
- ble _0804C242
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0804C264: .4byte gPlayerPartyCount
-_0804C268: .4byte gSaveBlock1Ptr
-_0804C26C: .4byte gPlayerParty
- thumb_func_end sub_804C230
-
- thumb_func_start save_serialize_npcs
-save_serialize_npcs: @ 804C270
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- ldr r0, _0804C2B0 @ =gSaveBlock1Ptr
- mov r12, r0
- movs r5, 0xD4
- lsls r5, 3
- mov r8, r5
- ldr r4, _0804C2B4 @ =gMapObjects
- movs r3, 0
- movs r2, 0xF
-_0804C286:
- mov r6, r12
- ldr r1, [r6]
- adds r1, r3
- add r1, r8
- adds r0, r4, 0
- ldm r0!, {r5-r7}
- stm r1!, {r5-r7}
- ldm r0!, {r5-r7}
- stm r1!, {r5-r7}
- ldm r0!, {r5-r7}
- stm r1!, {r5-r7}
- adds r4, 0x24
- adds r3, 0x24
- subs r2, 0x1
- cmp r2, 0
- bge _0804C286
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0804C2B0: .4byte gSaveBlock1Ptr
-_0804C2B4: .4byte gMapObjects
- thumb_func_end save_serialize_npcs
-
- thumb_func_start sub_804C2B8
-sub_804C2B8: @ 804C2B8
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- ldr r0, _0804C2F8 @ =gSaveBlock1Ptr
- mov r12, r0
- movs r5, 0xD4
- lsls r5, 3
- mov r8, r5
- ldr r4, _0804C2FC @ =gMapObjects
- movs r3, 0
- movs r2, 0xF
-_0804C2CE:
- mov r6, r12
- ldr r1, [r6]
- adds r1, r3
- adds r0, r4, 0
- add r1, r8
- ldm r1!, {r5-r7}
- stm r0!, {r5-r7}
- ldm r1!, {r5-r7}
- stm r0!, {r5-r7}
- ldm r1!, {r5-r7}
- stm r0!, {r5-r7}
- adds r4, 0x24
- adds r3, 0x24
- subs r2, 0x1
- cmp r2, 0
- bge _0804C2CE
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0804C2F8: .4byte gSaveBlock1Ptr
-_0804C2FC: .4byte gMapObjects
- thumb_func_end sub_804C2B8
-
- thumb_func_start SaveSerializedGame
-SaveSerializedGame: @ 804C300
- push {lr}
- bl copy_player_party_to_sav1
- bl save_serialize_npcs
- pop {r0}
- bx r0
- thumb_func_end SaveSerializedGame
-
- thumb_func_start LoadSerializedGame
-LoadSerializedGame: @ 804C310
- push {lr}
- bl sub_804C230
- bl sub_804C2B8
- pop {r0}
- bx r0
- thumb_func_end LoadSerializedGame
-
- thumb_func_start copy_bags_and_unk_data_from_save_blocks
-copy_bags_and_unk_data_from_save_blocks: @ 804C320
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- movs r2, 0
- ldr r0, _0804C424 @ =gUnknown_2031C8C
- mov r12, r0
- ldr r1, _0804C428 @ =gSaveBlock2Ptr
- mov r10, r1
- ldr r5, _0804C42C @ =gSaveBlock1Ptr
- movs r3, 0xC4
- lsls r3, 2
- ldr r4, _0804C430 @ =gUnknown_2031764
-_0804C33C:
- lsls r0, r2, 2
- ldr r1, [r5]
- adds r1, r3
- adds r1, r0
- ldr r0, [r1]
- stm r4!, {r0}
- adds r2, 0x1
- cmp r2, 0x29
- ble _0804C33C
- movs r2, 0
- ldr r0, _0804C430 @ =gUnknown_2031764
- ldr r5, _0804C42C @ =gSaveBlock1Ptr
- movs r3, 0xEE
- lsls r3, 2
- adds r4, r0, 0
- adds r4, 0xA8
-_0804C35C:
- lsls r0, r2, 2
- ldr r1, [r5]
- adds r1, r3
- adds r1, r0
- ldr r0, [r1]
- stm r4!, {r0}
- adds r2, 0x1
- cmp r2, 0x1D
- ble _0804C35C
- movs r2, 0
- ldr r0, _0804C430 @ =gUnknown_2031764
- ldr r5, _0804C42C @ =gSaveBlock1Ptr
- movs r6, 0x90
- lsls r6, 1
- adds r4, r0, r6
- movs r3, 0x86
- lsls r3, 3
-_0804C37E:
- lsls r0, r2, 2
- ldr r1, [r5]
- adds r1, r3
- adds r1, r0
- ldr r0, [r1]
- stm r4!, {r0}
- adds r2, 0x1
- cmp r2, 0xC
- ble _0804C37E
- movs r2, 0
- ldr r0, _0804C430 @ =gUnknown_2031764
- ldr r5, _0804C42C @ =gSaveBlock1Ptr
- movs r7, 0xAA
- lsls r7, 1
- adds r4, r0, r7
- ldr r3, _0804C434 @ =0x00000464
-_0804C39E:
- lsls r0, r2, 2
- ldr r1, [r5]
- adds r1, r3
- adds r1, r0
- ldr r0, [r1]
- stm r4!, {r0}
- adds r2, 0x1
- cmp r2, 0x39
- ble _0804C39E
- movs r2, 0
- ldr r0, _0804C430 @ =gUnknown_2031764
- ldr r5, _0804C42C @ =gSaveBlock1Ptr
- movs r1, 0x8F
- lsls r1, 2
- adds r4, r0, r1
- ldr r3, _0804C438 @ =0x0000054c
-_0804C3BE:
- lsls r0, r2, 2
- ldr r1, [r5]
- adds r1, r3
- adds r1, r0
- ldr r0, [r1]
- stm r4!, {r0}
- adds r2, 0x1
- cmp r2, 0x2A
- ble _0804C3BE
- ldr r0, _0804C430 @ =gUnknown_2031764
- ldr r5, _0804C42C @ =gSaveBlock1Ptr
- mov r8, r5
- movs r6, 0xBA
- lsls r6, 2
- adds r4, r0, r6
- movs r3, 0
- ldr r7, _0804C43C @ =0x00002cd0
- mov r9, r7
- movs r2, 0xF
-_0804C3E4:
- mov r0, r8
- ldr r1, [r0]
- adds r1, r3
- adds r0, r4, 0
- add r1, r9
- ldm r1!, {r5-r7}
- stm r0!, {r5-r7}
- ldm r1!, {r5-r7}
- stm r0!, {r5-r7}
- ldm r1!, {r5-r7}
- stm r0!, {r5-r7}
- adds r4, 0x24
- adds r3, 0x24
- subs r2, 0x1
- cmp r2, 0
- bge _0804C3E4
- mov r1, r10
- ldr r0, [r1]
- movs r5, 0xF2
- lsls r5, 4
- adds r0, r5
- ldr r0, [r0]
- mov r6, r12
- str r0, [r6]
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0804C424: .4byte gUnknown_2031C8C
-_0804C428: .4byte gSaveBlock2Ptr
-_0804C42C: .4byte gSaveBlock1Ptr
-_0804C430: .4byte gUnknown_2031764
-_0804C434: .4byte 0x00000464
-_0804C438: .4byte 0x0000054c
-_0804C43C: .4byte 0x00002cd0
- thumb_func_end copy_bags_and_unk_data_from_save_blocks
-
- thumb_func_start sub_804C440
-sub_804C440: @ 804C440
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- movs r2, 0
- ldr r0, _0804C550 @ =gSaveBlock2Ptr
- mov r8, r0
- ldr r1, _0804C554 @ =gUnknown_2031C8C
- mov r12, r1
- ldr r5, _0804C558 @ =gSaveBlock1Ptr
- movs r3, 0xC4
- lsls r3, 2
- ldr r4, _0804C55C @ =gUnknown_2031764
-_0804C45C:
- ldr r0, [r5]
- lsls r1, r2, 2
- adds r0, r3
- adds r0, r1
- ldm r4!, {r1}
- str r1, [r0]
- adds r2, 0x1
- cmp r2, 0x29
- ble _0804C45C
- movs r2, 0
- ldr r5, _0804C558 @ =gSaveBlock1Ptr
- movs r4, 0xEE
- lsls r4, 2
- ldr r0, _0804C55C @ =gUnknown_2031764
- adds r3, r0, 0
- adds r3, 0xA8
-_0804C47C:
- ldr r0, [r5]
- lsls r1, r2, 2
- adds r0, r4
- adds r0, r1
- ldm r3!, {r1}
- str r1, [r0]
- adds r2, 0x1
- cmp r2, 0x1D
- ble _0804C47C
- movs r2, 0
- ldr r5, _0804C558 @ =gSaveBlock1Ptr
- movs r4, 0x86
- lsls r4, 3
- ldr r0, _0804C55C @ =gUnknown_2031764
- movs r6, 0x90
- lsls r6, 1
- adds r3, r0, r6
-_0804C49E:
- ldr r0, [r5]
- lsls r1, r2, 2
- adds r0, r4
- adds r0, r1
- ldm r3!, {r1}
- str r1, [r0]
- adds r2, 0x1
- cmp r2, 0xC
- ble _0804C49E
- movs r2, 0
- ldr r5, _0804C558 @ =gSaveBlock1Ptr
- ldr r4, _0804C560 @ =0x00000464
- ldr r0, _0804C55C @ =gUnknown_2031764
- movs r7, 0xAA
- lsls r7, 1
- adds r3, r0, r7
-_0804C4BE:
- ldr r0, [r5]
- lsls r1, r2, 2
- adds r0, r4
- adds r0, r1
- ldm r3!, {r1}
- str r1, [r0]
- adds r2, 0x1
- cmp r2, 0x39
- ble _0804C4BE
- movs r2, 0
- ldr r5, _0804C558 @ =gSaveBlock1Ptr
- ldr r4, _0804C564 @ =0x0000054c
- ldr r0, _0804C55C @ =gUnknown_2031764
- movs r1, 0x8F
- lsls r1, 2
- adds r3, r0, r1
-_0804C4DE:
- ldr r0, [r5]
- lsls r1, r2, 2
- adds r0, r4
- adds r0, r1
- ldm r3!, {r1}
- str r1, [r0]
- adds r2, 0x1
- cmp r2, 0x2A
- ble _0804C4DE
- ldr r2, _0804C558 @ =gSaveBlock1Ptr
- mov r9, r2
- ldr r5, _0804C568 @ =0x00002cd0
- mov r10, r5
- ldr r4, _0804C55C @ =gUnknown_2031764
- movs r3, 0
- movs r2, 0xF
-_0804C4FE:
- mov r6, r9
- ldr r1, [r6]
- adds r1, r3
- add r1, r10
- movs r7, 0xBA
- lsls r7, 2
- adds r0, r4, r7
- ldm r0!, {r5-r7}
- stm r1!, {r5-r7}
- ldm r0!, {r5-r7}
- stm r1!, {r5-r7}
- ldm r0!, {r5-r7}
- stm r1!, {r5-r7}
- adds r4, 0x24
- adds r3, 0x24
- subs r2, 0x1
- cmp r2, 0
- bge _0804C4FE
- mov r1, r8
- ldr r0, [r1]
- movs r5, 0xF2
- lsls r5, 4
- adds r0, r5
- ldr r4, [r0]
- mov r2, r12
- ldr r1, [r2]
- str r1, [r0]
- adds r0, r4, 0
- bl ApplyNewEncryptionKeyToBagItems
- mov r6, r8
- ldr r0, [r6]
- adds r0, r5
- str r4, [r0]
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0804C550: .4byte gSaveBlock2Ptr
-_0804C554: .4byte gUnknown_2031C8C
-_0804C558: .4byte gSaveBlock1Ptr
-_0804C55C: .4byte gUnknown_2031764
-_0804C560: .4byte 0x00000464
-_0804C564: .4byte 0x0000054c
-_0804C568: .4byte 0x00002cd0
- thumb_func_end sub_804C440
-
- thumb_func_start sub_804C56C
-sub_804C56C: @ 804C56C
- ldr r2, _0804C584 @ =gSaveBlock2Ptr
- ldr r2, [r2]
- movs r3, 0xF2
- lsls r3, 4
- adds r2, r3
- ldr r2, [r2]
- ldrh r3, [r0]
- eors r2, r3
- eors r2, r1
- strh r2, [r0]
- bx lr
- .align 2, 0
-_0804C584: .4byte gSaveBlock2Ptr
- thumb_func_end sub_804C56C
-
- thumb_func_start sub_804C588
-sub_804C588: @ 804C588
- ldr r2, _0804C5A0 @ =gSaveBlock2Ptr
- ldr r3, [r2]
- movs r2, 0xF2
- lsls r2, 4
- adds r3, r2
- ldr r2, [r0]
- ldr r3, [r3]
- eors r2, r3
- eors r2, r1
- str r2, [r0]
- bx lr
- .align 2, 0
-_0804C5A0: .4byte gSaveBlock2Ptr
- thumb_func_end sub_804C588
-
- thumb_func_start sub_804C5A4
-sub_804C5A4: @ 804C5A4
- push {r4-r7,lr}
- adds r5, r0, 0
- ldr r7, _0804C5F8 @ =gSaveBlock1Ptr
- ldr r6, _0804C5FC @ =0x00003d38
- movs r4, 0x3
-_0804C5AE:
- ldr r0, [r7]
- adds r0, r6
- adds r0, 0x4
- adds r1, r5, 0
- bl sub_804C588
- adds r6, 0xC
- subs r4, 0x1
- cmp r4, 0
- bge _0804C5AE
- adds r0, r5, 0
- bl sub_8054F38
- adds r0, r5, 0
- bl ApplyNewEncryptionKeyToBagItems_
- adds r0, r5, 0
- bl sub_815EE6C
- ldr r4, _0804C5F8 @ =gSaveBlock1Ptr
- ldr r0, [r4]
- movs r1, 0xA4
- lsls r1, 2
- adds r0, r1
- adds r1, r5, 0
- bl sub_804C588
- ldr r0, [r4]
- movs r1, 0xA5
- lsls r1, 2
- adds r0, r1
- adds r1, r5, 0
- bl sub_804C56C
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0804C5F8: .4byte gSaveBlock1Ptr
-_0804C5FC: .4byte 0x00003d38
- thumb_func_end sub_804C5A4
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/overworld.s b/asm/overworld.s
index 4ab22581a..0dd6bb4b9 100644
--- a/asm/overworld.s
+++ b/asm/overworld.s
@@ -421,7 +421,7 @@ _08054F40:
ldr r0, [r6]
adds r0, r1
adds r1, r5, 0
- bl sub_804C588
+ bl ApplyNewEncryptionKeyToWord
adds r0, r4, 0x1
lsls r0, 24
lsrs r4, r0, 24
@@ -4439,7 +4439,7 @@ _08056E60:
thumb_func_start MoveSaveBlocks_ResetHeap_
MoveSaveBlocks_ResetHeap_: @ 8056E74
push {lr}
- bl sub_804C0A4
+ bl MoveSaveBlocks_ResetHeap
pop {r0}
bx r0
thumb_func_end MoveSaveBlocks_ResetHeap_
diff --git a/asm/party_menu.s b/asm/party_menu.s
index 50c485ad5..6152d9d54 100644
--- a/asm/party_menu.s
+++ b/asm/party_menu.s
@@ -4877,7 +4877,7 @@ _08120FAC: .4byte sub_8120FB0
sub_8120FB0: @ 8120FB0
push {lr}
bl FreeRestoreBattleData
- bl sub_804C230
+ bl LoadPlayerParty
bl sub_815AC20
ldr r0, _08120FC8 @ =sub_815ABFC
bl SetMainCallback2
diff --git a/asm/script_pokemon_util_80A0058.s b/asm/script_pokemon_util_80A0058.s
index 604de1de2..18c2d7ecb 100644
--- a/asm/script_pokemon_util_80A0058.s
+++ b/asm/script_pokemon_util_80A0058.s
@@ -442,7 +442,7 @@ sub_80A039C: @ 80A039C
ldrb r4, [r0]
cmp r4, 0
bne _080A03B8
- bl sub_804C230
+ bl LoadPlayerParty
ldr r0, _080A03B4 @ =gUnknown_20370D0
strh r4, [r0]
b _080A03C2
diff --git a/asm/teachy_tv.s b/asm/teachy_tv.s
index 812aac1a5..55f403f8a 100644
--- a/asm/teachy_tv.s
+++ b/asm/teachy_tv.s
@@ -2161,7 +2161,7 @@ sub_815BC90: @ 815BC90
ldr r1, _0815BCD8 @ =gMain
ldr r0, _0815BCDC @ =sub_815BD58
str r0, [r1, 0x8]
- bl copy_player_party_to_sav1
+ bl SavePlayerParty
bl sub_8159F40
movs r0, 0
bl PlayMapChosenOrBattleBGM
@@ -2243,7 +2243,7 @@ _0815BD54: .4byte sub_800FD9C
thumb_func_start sub_815BD58
sub_815BD58: @ 815BD58
push {lr}
- bl sub_804C230
+ bl LoadPlayerParty
ldr r0, _0815BD6C @ =gUnknown_2023E8A
ldrb r0, [r0]
cmp r0, 0x3
diff --git a/asm/unk_815EDDC.s b/asm/unk_815EDDC.s
index 1f56f8820..07e772bb8 100644
--- a/asm/unk_815EDDC.s
+++ b/asm/unk_815EDDC.s
@@ -98,7 +98,7 @@ sub_815EE6C: @ 815EE6C
ldr r0, [r0]
ldr r2, _0815EE84 @ =0x00000af8
adds r0, r2
- bl sub_804C588
+ bl ApplyNewEncryptionKeyToWord
pop {r0}
bx r0
.align 2, 0
diff --git a/common_syms/load_save.txt b/common_syms/load_save.txt
new file mode 100644
index 000000000..2d3d9b802
--- /dev/null
+++ b/common_syms/load_save.txt
@@ -0,0 +1,4 @@
+gFlashMemoryPresent
+gSaveBlock1Ptr
+gSaveBlock2Ptr
+gPokemonStoragePtr
diff --git a/include/global.h b/include/global.h
index 0857d552a..b1604e1d6 100644
--- a/include/global.h
+++ b/include/global.h
@@ -79,6 +79,12 @@ enum LanguageId {
#define GAME_LANGUAGE (LANGUAGE_ENGLISH)
+#define BAG_ITEMS_COUNT 42
+#define BAG_KEYITEMS_COUNT 30
+#define BAG_POKEBALLS_COUNT 13
+#define BAG_TMHM_COUNT 58
+#define BAG_BERRIES_COUNT 43
+
enum
{
MALE,
@@ -532,23 +538,30 @@ struct SaveBlock1
/*0x2F*/ u8 filler_2F;
/*0x30*/ u8 flashLevel;
/*0x32*/ u16 mapDataId;
- /*0x34*/ u16 mapView[0x100];
/*0x234*/ u8 playerPartyCount;
/*0x238*/ struct Pokemon playerParty[PARTY_SIZE];
/*0x490*/ u32 money;
/*0x494*/ u16 coins;
/*0x496*/ u16 registeredItem; // registered for use with SELECT button
- /*0x498*/ u8 filler_0498[0x1a0];
+ /*0x0298*/ u8 filler298[0x78];
+ /*0x0310*/ struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT];
+ /*0x????*/ struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT];
+ /*0x????*/ struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT];
+ /*0x????*/ struct ItemSlot bagPocket_TMHM[BAG_TMHM_COUNT];
+ /*0x????*/ struct ItemSlot bagPocket_Berries[BAG_BERRIES_COUNT];
+ /*0x05F8*/ u8 filler5F8[0x40];
/*0x638*/ u8 trainerRematchStepCounter;
u8 filler_639;
- /*0x63a*/ u8 trainerRematches[100];
+ /*0x63A*/ u8 trainerRematches[100];
/*0x06A0*/ struct MapObject mapObjects[MAP_OBJECTS_COUNT];
/*0x08E0*/ struct MapObjectTemplate mapObjectTemplates[64];
/*0x0EE0*/ u8 flags[FLAGS_COUNT];
/*0x1000*/ u16 vars[VARS_COUNT];
/*0x1200*/ u8 filler1200[0x100];
/*0x1300*/ struct QuestLog questLog[4];
- /*0x2ca0*/ u8 filler2CA0[0x44C];
+ /*0x2CA0*/ u8 filler2CA0[0x30];
+ /*0x2CD0*/ struct MailStruct mail[MAIL_COUNT];
+ /*0x2F10*/ u8 filler2F10[0x1DA];
/*0x30EC*/ struct EnigmaBerry enigmaBerry;
/*0x3120*/ u8 filler3120[0x340];
/*0x3460*/ struct MysteryEventStruct unk_3460;
@@ -556,7 +569,8 @@ struct SaveBlock1
/*0x361C*/ struct RamScript ramScript;
/*0x3A08*/ u8 filler3A08[0x44];
/*0x3A4C*/ u8 rivalName[PLAYER_NAME_LENGTH];
- /*0x3A54*/ u8 filler3A54[0x314];
+ /*0x3A54*/ u8 filler3A54[0x2E4];
+ u32 unkArray[4][3];
};
extern struct SaveBlock1* gSaveBlock1Ptr;
diff --git a/include/load_save.h b/include/load_save.h
index 1f406bbad..b3e9fe49c 100644
--- a/include/load_save.h
+++ b/include/load_save.h
@@ -18,7 +18,9 @@ void SaveSerializedGame(void);
void LoadSerializedGame(void);
void LoadPlayerBag(void);
void SavePlayerBag(void);
-void SetSaveBlocksPointers(u16);
+void SetSaveBlocksPointers(void);
void MoveSaveBlocks_ResetHeap(void);
+void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey);
+void ApplyNewEncryptionKeyToBagItems(u32 encryptionKey);
#endif // GUARD_LOAD_SAVE_H
diff --git a/include/malloc.h b/include/malloc.h
index 003ee1f03..6efa8fbef 100644
--- a/include/malloc.h
+++ b/include/malloc.h
@@ -1,6 +1,7 @@
#ifndef GUARD_MALLOC_H
#define GUARD_MALLOC_H
+#define HEAP_SIZE 0x1C000
#define malloc Alloc
#define calloc(ct, sz) AllocZeroed((ct) * (sz))
#define free Free
diff --git a/ld_script.txt b/ld_script.txt
index 5ac1bdeaa..90996ddb1 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -86,7 +86,7 @@ SECTIONS {
asm/battle_interface.o(.text);
asm/smokescreen.o(.text);
asm/pokeball.o(.text);
- asm/load_save.o(.text);
+ src/load_save.o(.text);
asm/trade.o(.text);
asm/play_time.o(.text);
asm/new_game.o(.text);
diff --git a/src/load_save.c b/src/load_save.c
new file mode 100644
index 000000000..eba01642c
--- /dev/null
+++ b/src/load_save.c
@@ -0,0 +1,297 @@
+#include "global.h"
+#include "gba/flash_internal.h"
+#include "load_save.h"
+#include "main.h"
+#include "pokemon.h"
+#include "random.h"
+#include "malloc.h"
+#include "item.h"
+
+extern void sub_8099E44(void);
+extern void sub_8110840(void *oldSave);
+extern void sub_8055778(int);
+extern void sub_8054F38(u32 newKey);
+extern void ApplyNewEncryptionKeyToBagItems_(u32 newKey);
+extern void sub_815EE6C(u32 newKey);
+
+#define SAVEBLOCK_MOVE_RANGE 128
+
+struct LoadedSaveData
+{
+ /*0x0000*/ struct ItemSlot items[BAG_ITEMS_COUNT];
+ /*0x0078*/ struct ItemSlot keyItems[BAG_KEYITEMS_COUNT];
+ /*0x00F0*/ struct ItemSlot pokeBalls[BAG_POKEBALLS_COUNT];
+ /*0x0130*/ struct ItemSlot TMsHMs[BAG_TMHM_COUNT];
+ /*0x0230*/ struct ItemSlot berries[BAG_BERRIES_COUNT];
+ /*0x02E8*/ struct MailStruct mail[MAIL_COUNT];
+};
+
+// EWRAM DATA
+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};
+
+EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0};
+EWRAM_DATA u32 gLastEncryptionKey = 0;
+
+// IWRAM common
+IWRAM_DATA bool32 gFlashMemoryPresent;
+IWRAM_DATA struct SaveBlock1 *gSaveBlock1Ptr;
+IWRAM_DATA struct SaveBlock2 *gSaveBlock2Ptr;
+IWRAM_DATA struct PokemonStorage *gPokemonStoragePtr;
+
+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(void)
+{
+ u32 offset;
+ struct SaveBlock1** sav1_LocalVar = &gSaveBlock1Ptr;
+ void *oldSave = (void *)gSaveBlock1Ptr;
+
+ offset = (Random()) & (SAVEBLOCK_MOVE_RANGE - 4);
+
+ gSaveBlock2Ptr = (void*)(&gSaveBlock2) + offset;
+ *sav1_LocalVar = (void*)(&gSaveBlock1) + offset;
+ gPokemonStoragePtr = (void*)(&gPokemonStorage) + offset;
+
+ sub_8099E44();
+ sub_8110840(oldSave);
+}
+
+void MoveSaveBlocks_ResetHeap(void)
+{
+ void *vblankCB, *hblankCB;
+ u32 encryptionKey;
+ struct SaveBlock2 *saveBlock2Copy;
+ struct SaveBlock1 *saveBlock1Copy;
+ struct PokemonStorage *pokemonStorageCopy;
+
+ // save interrupt functions and turn them off
+ vblankCB = gMain.vblankCallback;
+ hblankCB = gMain.hblankCallback;
+ gMain.vblankCallback = NULL;
+ gMain.hblankCallback = NULL;
+ gMain.vblankCounter1 = NULL;
+
+ saveBlock2Copy = (struct SaveBlock2 *)(gHeap);
+ saveBlock1Copy = (struct SaveBlock1 *)(gHeap + sizeof(struct SaveBlock2));
+ pokemonStorageCopy = (struct PokemonStorage *)(gHeap + sizeof(struct SaveBlock2) + sizeof(struct SaveBlock1));
+
+ // backup the saves.
+ *saveBlock2Copy = *gSaveBlock2Ptr;
+ *saveBlock1Copy = *gSaveBlock1Ptr;
+ *pokemonStorageCopy = *gPokemonStoragePtr;
+
+ // change saveblocks' pointers
+ SetSaveBlocksPointers(); // unlike Emerald, this does not use
+ // the trainer ID sum for an offset.
+
+ // restore saveblock data since the pointers changed
+ *gSaveBlock2Ptr = *saveBlock2Copy;
+ *gSaveBlock1Ptr = *saveBlock1Copy;
+ *gPokemonStoragePtr = *pokemonStorageCopy;
+
+ // heap was destroyed in the copying process, so reset it
+ InitHeap(gHeap, HEAP_SIZE);
+
+ // restore interrupt functions
+ gMain.hblankCallback = hblankCB;
+ gMain.vblankCallback = vblankCB;
+
+ // create a new encryption key
+ encryptionKey = (Random() << 0x10) + (Random());
+ ApplyNewEncryptionKeyToAllEncryptedData(encryptionKey);
+ gSaveBlock2Ptr->encryptionKey = encryptionKey;
+}
+
+u32 sav2_x1_query_bit1(void)
+{
+ return gSaveBlock2Ptr->specialSaveWarp & 1;
+}
+
+void sav2_x9_clear_bit1(void)
+{
+ gSaveBlock2Ptr->specialSaveWarp &= ~1;
+}
+
+void sub_804C1AC(void)
+{
+ gSaveBlock2Ptr->specialSaveWarp |= 1;
+}
+
+void sub_804C1C0(void)
+{
+ sub_8055778(0);
+ gSaveBlock2Ptr->specialSaveWarp |= 1;
+}
+
+void sav2_gender2_inplace_and_xFE(void)
+{
+ gSaveBlock2Ptr->specialSaveWarp &= ~1;
+}
+
+void SavePlayerParty(void)
+{
+ int i;
+
+ gSaveBlock1Ptr->playerPartyCount = gPlayerPartyCount;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i];
+}
+
+void LoadPlayerParty(void)
+{
+ int i;
+
+ gPlayerPartyCount = gSaveBlock1Ptr->playerPartyCount;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ gPlayerParty[i] = gSaveBlock1Ptr->playerParty[i];
+}
+
+void SaveMapObjects(void)
+{
+ int i;
+
+ for (i = 0; i < NUM_FIELD_OBJECTS; i++)
+ gSaveBlock1Ptr->mapObjects[i] = gMapObjects[i];
+}
+
+void LoadMapObjects(void)
+{
+ int i;
+
+ for (i = 0; i < NUM_FIELD_OBJECTS; i++)
+ gMapObjects[i] = gSaveBlock1Ptr->mapObjects[i];
+}
+
+void SaveSerializedGame(void)
+{
+ SavePlayerParty();
+ SaveMapObjects();
+}
+
+void LoadSerializedGame(void)
+{
+ LoadPlayerParty();
+ LoadMapObjects();
+}
+
+void LoadPlayerBag(void)
+{
+ int i;
+
+ // load player items.
+ for (i = 0; i < BAG_ITEMS_COUNT; i++)
+ gLoadedSaveData.items[i] = gSaveBlock1Ptr->bagPocket_Items[i];
+
+ // load player key items.
+ for (i = 0; i < BAG_KEYITEMS_COUNT; i++)
+ gLoadedSaveData.keyItems[i] = gSaveBlock1Ptr->bagPocket_KeyItems[i];
+
+ // load player pokeballs.
+ for (i = 0; i < BAG_POKEBALLS_COUNT; i++)
+ gLoadedSaveData.pokeBalls[i] = gSaveBlock1Ptr->bagPocket_PokeBalls[i];
+
+ // load player TMs and HMs.
+ for (i = 0; i < BAG_TMHM_COUNT; i++)
+ gLoadedSaveData.TMsHMs[i] = gSaveBlock1Ptr->bagPocket_TMHM[i];
+
+ // load player berries.
+ for (i = 0; i < BAG_BERRIES_COUNT; i++)
+ gLoadedSaveData.berries[i] = gSaveBlock1Ptr->bagPocket_Berries[i];
+
+ // load mail.
+ for (i = 0; i < MAIL_COUNT; i++)
+ gLoadedSaveData.mail[i] = gSaveBlock1Ptr->mail[i];
+
+ gLastEncryptionKey = gSaveBlock2Ptr->encryptionKey;
+}
+
+void SavePlayerBag(void)
+{
+ int i;
+ u32 encryptionKeyBackup;
+
+ // save player items.
+ for (i = 0; i < BAG_ITEMS_COUNT; i++)
+ gSaveBlock1Ptr->bagPocket_Items[i] = gLoadedSaveData.items[i];
+
+ // save player key items.
+ for (i = 0; i < BAG_KEYITEMS_COUNT; i++)
+ gSaveBlock1Ptr->bagPocket_KeyItems[i] = gLoadedSaveData.keyItems[i];
+
+ // save player pokeballs.
+ for (i = 0; i < BAG_POKEBALLS_COUNT; i++)
+ gSaveBlock1Ptr->bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i];
+
+ // save player TMs and HMs.
+ for (i = 0; i < BAG_TMHM_COUNT; i++)
+ gSaveBlock1Ptr->bagPocket_TMHM[i] = gLoadedSaveData.TMsHMs[i];
+
+ // save player berries.
+ for (i = 0; i < BAG_BERRIES_COUNT; i++)
+ gSaveBlock1Ptr->bagPocket_Berries[i] = gLoadedSaveData.berries[i];
+
+ // save mail.
+ for (i = 0; i < MAIL_COUNT; i++)
+ gSaveBlock1Ptr->mail[i] = gLoadedSaveData.mail[i];
+
+ encryptionKeyBackup = gSaveBlock2Ptr->encryptionKey;
+ gSaveBlock2Ptr->encryptionKey = gLastEncryptionKey;
+ ApplyNewEncryptionKeyToBagItems(encryptionKeyBackup);
+ gSaveBlock2Ptr->encryptionKey = encryptionKeyBackup;
+}
+
+void ApplyNewEncryptionKeyToHword(u16 *hWord, u32 newKey)
+{
+ *hWord ^= gSaveBlock2Ptr->encryptionKey;
+ *hWord ^= newKey;
+}
+
+void ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey)
+{
+ *word ^= gSaveBlock2Ptr->encryptionKey;
+ *word ^= newKey;
+}
+
+void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey)
+{
+ int i;
+
+ for(i = 0; i < 4; i++)
+ ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->unkArray[i][1], encryptionKey);
+
+ sub_8054F38(encryptionKey);
+ ApplyNewEncryptionKeyToBagItems_(encryptionKey);
+ sub_815EE6C(encryptionKey);
+ ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->money, encryptionKey);
+ ApplyNewEncryptionKeyToHword(&gSaveBlock1Ptr->coins, encryptionKey);
+}
diff --git a/sym_common.txt b/sym_common.txt
index 65be232af..6c213ca4d 100644
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -133,20 +133,9 @@ gUnknown_3004FFC: @ 3004FFC
.space 0x4
.include "random.o"
-
- .align 2
-gFlashMemoryPresent: @ 3005004
- .space 0x4
-
-gSaveBlock1Ptr: @ 3005008
- .space 0x4
-
-gSaveBlock2Ptr: @ 300500C
- .space 0x4
-
-gPokemonStoragePtr: @ 3005010
- .space 0x4
+ .include "load_save.o"
+ .align 2
gUnknown_3005014: @ 3005014
.space 0x4
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 4cad7bb1f..c0a8ace22 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -530,21 +530,9 @@ gUnknown_202456C: @ 202456C
gUnknown_2024580: @ 2024580
.space 0x8
-gSaveBlock2: @ 2024588
- .space 0xFA4
-
-gSaveBlock1: @ 202552C
- .space 0x3DE8
-
-gPokemonStorage: @ 2029314
- .space 0x8450
-
-gUnknown_2031764: @ 2031764
- .space 0x528
-
-gUnknown_2031C8C: @ 2031C8C
- .space 0x4
+ .include "src/load_save.o"
+ .align 2
gUnknown_2031C90: @ 2031C90
.space 0x4