diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2018-10-17 10:53:16 -0700 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2018-10-17 10:53:16 -0700 |
commit | 46e006b94cf7a2e59652a083cdd01f0d5dc9a26f (patch) | |
tree | d2d5315a6c8512aeda5ca5d435c3ef2a7d80688b | |
parent | 0ba52688584d8a35ec9c617b035c9dea71e2689f (diff) | |
parent | d05339979e39580b162e618087136bb220a4f20d (diff) |
Merge branch 'master' into quest_log
-rw-r--r-- | asm/battle_2.s | 2 | ||||
-rw-r--r-- | asm/battle_setup.s | 4 | ||||
-rw-r--r-- | asm/cable_club.s | 8 | ||||
-rw-r--r-- | asm/item.s | 2 | ||||
-rw-r--r-- | asm/item_menu.s | 4 | ||||
-rw-r--r-- | asm/link_rfu_3.s | 16 | ||||
-rw-r--r-- | asm/load_save.s | 814 | ||||
-rw-r--r-- | asm/overworld.s | 4 | ||||
-rw-r--r-- | asm/party_menu.s | 2 | ||||
-rw-r--r-- | asm/script_pokemon_util_80A0058.s | 2 | ||||
-rw-r--r-- | asm/teachy_tv.s | 4 | ||||
-rw-r--r-- | asm/unk_815EDDC.s | 2 | ||||
-rw-r--r-- | common_syms/load_save.txt | 4 | ||||
-rw-r--r-- | include/global.h | 24 | ||||
-rw-r--r-- | include/load_save.h | 4 | ||||
-rw-r--r-- | include/malloc.h | 1 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/load_save.c | 297 | ||||
-rw-r--r-- | sym_common.txt | 15 | ||||
-rw-r--r-- | sym_ewram.txt | 16 |
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 |