summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorProjectRevoTPP <projectrevotpp@hotmail.com>2016-12-12 02:08:36 -0500
committerYamaArashi <YamaArashi@users.noreply.github.com>2016-12-11 23:08:36 -0800
commit36214115534dd9329b5c02d78595967e671b6caf (patch)
tree953d530079418c9e69679ecc74bde7df367089b9
parentcd1db96498c4ac9ec940611a114a604800e12c2a (diff)
decompile load_save.c (#125)
* start decompiling load_save.c * almost finish decompiling load_save.c * finish decompiling load_save.c * i cannot hex math * formatting
-rw-r--r--asm/cable_club.s8
-rw-r--r--asm/load_save.s444
-rw-r--r--asm/record_mixing.s4
-rw-r--r--asm/rom6.s2
-rw-r--r--asm/script_pokemon_util_80C4BF0.s2
-rw-r--r--asm/trade.s4
-rw-r--r--data/specials.inc6
-rw-r--r--include/asm.inc.h8
-rw-r--r--include/global.h11
-rw-r--r--ld_script.txt2
-rw-r--r--src/load_save.c165
-rw-r--r--src/new_game.c2
-rw-r--r--src/rom4.c6
-rw-r--r--src/save.c16
-rw-r--r--src/start_menu.c4
-rw-r--r--sym_ewram.txt2
16 files changed, 207 insertions, 479 deletions
diff --git a/asm/cable_club.s b/asm/cable_club.s
index 8d11915cb..2a45d386b 100644
--- a/asm/cable_club.s
+++ b/asm/cable_club.s
@@ -1602,8 +1602,8 @@ _08083954: .4byte sub_8083958
sub_8083958: @ 8083958
push {lr}
bl call_map_music_set_to_zero
- bl copy_player_party_from_sav1
- bl copy_bags_and_unk_data_to_save_blocks
+ bl LoadPlayerParty
+ bl SavePlayerData
bl sub_810FEFC
ldr r0, _08083990 @ =gSpecialVar_0x8004
ldrh r0, [r0]
@@ -1643,8 +1643,8 @@ sub_80839A4: @ 80839A4
cmp r1, 0x5
bne _080839C0
_080839B8:
- bl copy_player_party_from_sav1
- bl copy_bags_and_unk_data_to_save_blocks
+ bl LoadPlayerParty
+ bl SavePlayerData
_080839C0:
movs r0, 0x7F
bl copy_saved_warp2_bank_and_enter_x_to_warp1
diff --git a/asm/load_save.s b/asm/load_save.s
deleted file mode 100644
index 09a9ea969..000000000
--- a/asm/load_save.s
+++ /dev/null
@@ -1,444 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "constants/species_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start CheckForFlashMemory
-CheckForFlashMemory: @ 80479CC
- push {lr}
- bl IdentifyFlash
- lsls r0, 16
- cmp r0, 0
- bne _080479E8
- ldr r1, _080479E4 @ =gUnknown_3004820
- movs r0, 0x1
- str r0, [r1]
- bl InitFlashTimer
- b _080479EE
- .align 2, 0
-_080479E4: .4byte gUnknown_3004820
-_080479E8:
- ldr r1, _080479F4 @ =gUnknown_3004820
- movs r0, 0
- str r0, [r1]
-_080479EE:
- pop {r0}
- bx r0
- .align 2, 0
-_080479F4: .4byte gUnknown_3004820
- thumb_func_end CheckForFlashMemory
-
- thumb_func_start sub_80479F8
-sub_80479F8: @ 80479F8
- ldr r0, _08047A00 @ =gSaveBlock2
- ldrb r0, [r0, 0x9]
- bx lr
- .align 2, 0
-_08047A00: .4byte gSaveBlock2
- thumb_func_end sub_80479F8
-
- thumb_func_start sub_8047A04
-sub_8047A04: @ 8047A04
- ldr r1, _08047A0C @ =gSaveBlock2
- movs r0, 0
- strb r0, [r1, 0x9]
- bx lr
- .align 2, 0
-_08047A0C: .4byte gSaveBlock2
- thumb_func_end sub_8047A04
-
- thumb_func_start sub_8047A10
-sub_8047A10: @ 8047A10
- ldr r1, _08047A18 @ =gSaveBlock2
- movs r0, 0x1
- strb r0, [r1, 0x9]
- bx lr
- .align 2, 0
-_08047A18: .4byte gSaveBlock2
- thumb_func_end sub_8047A10
-
- thumb_func_start sub_8047A1C
-sub_8047A1C: @ 8047A1C
- push {lr}
- movs r0, 0
- bl gpu_sync_bg_hide
- ldr r1, _08047A30 @ =gSaveBlock2
- movs r0, 0x1
- strb r0, [r1, 0x9]
- pop {r0}
- bx r0
- .align 2, 0
-_08047A30: .4byte gSaveBlock2
- thumb_func_end sub_8047A1C
-
- thumb_func_start sub_8047A34
-sub_8047A34: @ 8047A34
- ldr r1, _08047A3C @ =gSaveBlock2
- movs r0, 0
- strb r0, [r1, 0x9]
- bx lr
- .align 2, 0
-_08047A3C: .4byte gSaveBlock2
- thumb_func_end sub_8047A34
-
- thumb_func_start sub_8047A40
-sub_8047A40: @ 8047A40
- push {r4-r6,lr}
- ldr r2, _08047A78 @ =gSaveBlock1
- ldr r0, _08047A7C @ =gPlayerPartyCount
- ldrb r1, [r0]
- movs r3, 0x8D
- lsls r3, 2
- adds r0, r2, r3
- strb r1, [r0]
- movs r6, 0
- movs r0, 0x8E
- lsls r0, 2
- adds r5, r2, r0
- movs r4, 0
-_08047A5A:
- ldr r1, _08047A80 @ =gPlayerParty
- adds r1, r4, r1
- adds r0, r5, 0
- movs r2, 0x64
- bl memcpy
- adds r5, 0x64
- adds r4, 0x64
- adds r6, 0x1
- cmp r6, 0x5
- ble _08047A5A
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08047A78: .4byte gSaveBlock1
-_08047A7C: .4byte gPlayerPartyCount
-_08047A80: .4byte gPlayerParty
- thumb_func_end sub_8047A40
-
- thumb_func_start copy_player_party_from_sav1
-copy_player_party_from_sav1: @ 8047A84
- push {r4-r6,lr}
- ldr r0, _08047AC0 @ =gPlayerPartyCount
- ldr r1, _08047AC4 @ =gSaveBlock1
- movs r2, 0x8D
- lsls r2, 2
- adds r1, r2
- ldrb r1, [r1]
- strb r1, [r0]
- ldr r4, _08047AC8 @ =gPlayerParty
- movs r5, 0
- movs r0, 0xFA
- lsls r0, 1
- adds r6, r4, r0
-_08047A9E:
- ldr r1, _08047AC4 @ =gSaveBlock1
- adds r1, r5, r1
- movs r2, 0x8E
- lsls r2, 2
- adds r1, r2
- adds r0, r4, 0
- movs r2, 0x64
- bl memcpy
- adds r4, 0x64
- adds r5, 0x64
- cmp r4, r6
- ble _08047A9E
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08047AC0: .4byte gPlayerPartyCount
-_08047AC4: .4byte gSaveBlock1
-_08047AC8: .4byte gPlayerParty
- thumb_func_end copy_player_party_from_sav1
-
- thumb_func_start sub_8047ACC
-sub_8047ACC: @ 8047ACC
- push {r4-r7,lr}
- ldr r0, _08047AFC @ =gSaveBlock1
- ldr r4, _08047B00 @ =gMapObjects
- movs r1, 0x9E
- lsls r1, 4
- adds r3, r0, r1
- movs r2, 0xF
-_08047ADA:
- adds r1, r3, 0
- 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 _08047ADA
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08047AFC: .4byte gSaveBlock1
-_08047B00: .4byte gMapObjects
- thumb_func_end sub_8047ACC
-
- thumb_func_start save_deserialize_npcs
-save_deserialize_npcs: @ 8047B04
- push {r4-r7,lr}
- ldr r0, _08047B34 @ =gSaveBlock1
- movs r1, 0x9E
- lsls r1, 4
- adds r4, r0, r1
- ldr r3, _08047B38 @ =gMapObjects
- movs r2, 0xF
-_08047B12:
- adds r1, r3, 0
- 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 _08047B12
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08047B34: .4byte gSaveBlock1
-_08047B38: .4byte gMapObjects
- thumb_func_end save_deserialize_npcs
-
- thumb_func_start save_serialize_game
-save_serialize_game: @ 8047B3C
- push {lr}
- bl sub_8047A40
- bl sub_8047ACC
- pop {r0}
- bx r0
- thumb_func_end save_serialize_game
-
- thumb_func_start save_deserialize_game
-save_deserialize_game: @ 8047B4C
- push {lr}
- bl copy_player_party_from_sav1
- bl save_deserialize_npcs
- pop {r0}
- bx r0
- thumb_func_end save_deserialize_game
-
- thumb_func_start copy_bags_and_unk_data_from_save_blocks
-copy_bags_and_unk_data_from_save_blocks: @ 8047B5C
- push {r4-r7,lr}
- ldr r0, _08047C0C @ =gSaveBlock1
- movs r1, 0xAC
- lsls r1, 3
- adds r3, r0, r1
- ldr r1, _08047C10 @ =gUnknown_020291F4
- movs r2, 0x13
-_08047B6A:
- ldm r3!, {r0}
- stm r1!, {r0}
- subs r2, 0x1
- cmp r2, 0
- bge _08047B6A
- ldr r1, _08047C10 @ =gUnknown_020291F4
- ldr r0, _08047C0C @ =gSaveBlock1
- movs r2, 0xB6
- lsls r2, 3
- adds r3, r0, r2
- adds r1, 0x50
- movs r2, 0x13
-_08047B82:
- ldm r3!, {r0}
- stm r1!, {r0}
- subs r2, 0x1
- cmp r2, 0
- bge _08047B82
- ldr r1, _08047C10 @ =gUnknown_020291F4
- ldr r0, _08047C0C @ =gSaveBlock1
- movs r5, 0xC0
- lsls r5, 3
- adds r3, r0, r5
- adds r1, 0xA0
- movs r2, 0xF
-_08047B9A:
- ldm r3!, {r0}
- stm r1!, {r0}
- subs r2, 0x1
- cmp r2, 0
- bge _08047B9A
- ldr r1, _08047C10 @ =gUnknown_020291F4
- ldr r0, _08047C0C @ =gSaveBlock1
- movs r6, 0xC8
- lsls r6, 3
- adds r3, r0, r6
- adds r1, 0xE0
- movs r2, 0x3F
-_08047BB2:
- ldm r3!, {r0}
- stm r1!, {r0}
- subs r2, 0x1
- cmp r2, 0
- bge _08047BB2
- ldr r1, _08047C10 @ =gUnknown_020291F4
- ldr r0, _08047C0C @ =gSaveBlock1
- movs r7, 0xE8
- lsls r7, 3
- adds r3, r0, r7
- movs r0, 0xF0
- lsls r0, 1
- adds r1, r0
- movs r2, 0x2D
-_08047BCE:
- ldm r3!, {r0}
- stm r1!, {r0}
- subs r2, 0x1
- cmp r2, 0
- bge _08047BCE
- ldr r0, _08047C10 @ =gUnknown_020291F4
- ldr r4, _08047C0C @ =gSaveBlock1
- movs r1, 0xA6
- lsls r1, 2
- adds r3, r0, r1
- ldr r2, _08047C14 @ =0x00002b4c
- mov r12, r2
- movs r2, 0xF
-_08047BE8:
- adds r1, r3, 0
- mov r5, r12
- adds r0, r4, r5
- 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 _08047BE8
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08047C0C: .4byte gSaveBlock1
-_08047C10: .4byte gUnknown_020291F4
-_08047C14: .4byte 0x00002b4c
- thumb_func_end copy_bags_and_unk_data_from_save_blocks
-
- thumb_func_start copy_bags_and_unk_data_to_save_blocks
-copy_bags_and_unk_data_to_save_blocks: @ 8047C18
- push {r4-r7,lr}
- ldr r0, _08047CCC @ =gSaveBlock1
- ldr r3, _08047CD0 @ =gUnknown_020291F4
- movs r2, 0xAC
- lsls r2, 3
- adds r1, r0, r2
- movs r2, 0x13
-_08047C26:
- ldm r3!, {r0}
- stm r1!, {r0}
- subs r2, 0x1
- cmp r2, 0
- bge _08047C26
- ldr r1, _08047CCC @ =gSaveBlock1
- ldr r0, _08047CD0 @ =gUnknown_020291F4
- adds r3, r0, 0
- adds r3, 0x50
- movs r5, 0xB6
- lsls r5, 3
- adds r1, r5
- movs r2, 0x13
-_08047C40:
- ldm r3!, {r0}
- stm r1!, {r0}
- subs r2, 0x1
- cmp r2, 0
- bge _08047C40
- ldr r1, _08047CCC @ =gSaveBlock1
- ldr r0, _08047CD0 @ =gUnknown_020291F4
- adds r3, r0, 0
- adds r3, 0xA0
- movs r6, 0xC0
- lsls r6, 3
- adds r1, r6
- movs r2, 0xF
-_08047C5A:
- ldm r3!, {r0}
- stm r1!, {r0}
- subs r2, 0x1
- cmp r2, 0
- bge _08047C5A
- ldr r1, _08047CCC @ =gSaveBlock1
- ldr r0, _08047CD0 @ =gUnknown_020291F4
- adds r3, r0, 0
- adds r3, 0xE0
- movs r7, 0xC8
- lsls r7, 3
- adds r1, r7
- movs r2, 0x3F
-_08047C74:
- ldm r3!, {r0}
- stm r1!, {r0}
- subs r2, 0x1
- cmp r2, 0
- bge _08047C74
- ldr r1, _08047CCC @ =gSaveBlock1
- ldr r0, _08047CD0 @ =gUnknown_020291F4
- movs r2, 0xF0
- lsls r2, 1
- adds r3, r0, r2
- movs r5, 0xE8
- lsls r5, 3
- adds r1, r5
- movs r2, 0x2D
-_08047C90:
- ldm r3!, {r0}
- stm r1!, {r0}
- subs r2, 0x1
- cmp r2, 0
- bge _08047C90
- ldr r0, _08047CCC @ =gSaveBlock1
- ldr r4, _08047CD0 @ =gUnknown_020291F4
- ldr r6, _08047CD4 @ =0x00002b4c
- adds r3, r0, r6
- movs r7, 0xA6
- lsls r7, 2
- mov r12, r7
- movs r2, 0xF
-_08047CAA:
- adds r1, r3, 0
- mov r5, r12
- adds r0, r4, r5
- 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 _08047CAA
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08047CCC: .4byte gSaveBlock1
-_08047CD0: .4byte gUnknown_020291F4
-_08047CD4: .4byte 0x00002b4c
- thumb_func_end copy_bags_and_unk_data_to_save_blocks
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/record_mixing.s b/asm/record_mixing.s
index 1c981d167..ce0121a40 100644
--- a/asm/record_mixing.s
+++ b/asm/record_mixing.s
@@ -496,7 +496,7 @@ _080BA038:
.4byte _080BA074
.4byte _080BA08E
_080BA050:
- bl sub_8047A1C
+ bl SetSecretBase2Field_9_AndHideBG
bl sub_8125E2C
b _080BA086
_080BA05A:
@@ -504,7 +504,7 @@ _080BA05A:
lsls r0, 24
cmp r0, 0
beq _080BA09C
- bl sub_8047A34
+ bl ClearSecretBase2Field_9_2
ldrh r0, [r4, 0x8]
adds r0, 0x1
movs r1, 0
diff --git a/asm/rom6.s b/asm/rom6.s
index ad1e71be5..a4006ace5 100644
--- a/asm/rom6.s
+++ b/asm/rom6.s
@@ -3921,7 +3921,7 @@ _0810D1B4:
movs r0, 0x1
bl sav12_xor_set
_0810D1D4:
- bl sub_8047A10
+ bl SetSecretBase2Field_9
ldr r0, _0810D1EC @ =gSaveBlock2
ldrb r0, [r0, 0x8]
cmp r0, 0
diff --git a/asm/script_pokemon_util_80C4BF0.s b/asm/script_pokemon_util_80C4BF0.s
index 5d99fa2b2..b60c9444a 100644
--- a/asm/script_pokemon_util_80C4BF0.s
+++ b/asm/script_pokemon_util_80C4BF0.s
@@ -1311,7 +1311,7 @@ SetBattleTowerPlayerParty: @ 80C55C8
ldrb r4, [r0]
cmp r4, 0
bne _080C55E4
- bl copy_player_party_from_sav1
+ bl LoadPlayerParty
ldr r0, _080C55E0 @ =gScriptResult
strh r4, [r0]
b _080C55EE
diff --git a/asm/trade.s b/asm/trade.s
index ae857d1c3..6a6b6ae30 100644
--- a/asm/trade.s
+++ b/asm/trade.s
@@ -11765,7 +11765,7 @@ _0804DF48: .4byte 0x0000043c
_0804DF4C: .4byte gUnknown_03004828
_0804DF50: .4byte gSystemText_Saving
_0804DF54:
- bl sub_8047A1C
+ bl SetSecretBase2Field_9_AndHideBG
movs r0, 0x15
bl sav12_xor_increment
bl sub_8125D80
@@ -11803,7 +11803,7 @@ _0804DF9C:
lsrs r1, r0, 24
cmp r1, 0
beq _0804DFC0
- bl sub_8047A34
+ bl ClearSecretBase2Field_9_2
ldr r0, _0804DFB8 @ =gMain
ldr r1, _0804DFBC @ =0x0000043c
adds r0, r1
diff --git a/data/specials.inc b/data/specials.inc
index 852372ce0..5d5ed3f07 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -39,8 +39,8 @@ gSpecials::
.4byte sub_8083614
.4byte GetLinkPartnerNames
.4byte sub_810DB28
- .4byte sub_8047A40
- .4byte copy_player_party_from_sav1
+ .4byte SavePlayerParty
+ .4byte LoadPlayerParty
.4byte sub_80C5568
.4byte sub_8083BDC
.4byte FieldObjectInteractionGetBerryTreeData
@@ -331,7 +331,7 @@ gSpecials::
.4byte sub_80FA148
.4byte sub_810F8FC
.4byte sub_80BC50C
- .4byte copy_bags_and_unk_data_from_save_blocks
+ .4byte LoadPlayerData
.4byte sub_8081924
.4byte sub_810F950
.4byte sub_810F908
diff --git a/include/asm.inc.h b/include/asm.inc.h
index f533d8729..1cae90e98 100644
--- a/include/asm.inc.h
+++ b/include/asm.inc.h
@@ -38,10 +38,10 @@ void CreatePokeballSprite(u8 r0, u8 r1, u8 r2, u8 r3, u8 s1, u8 s2, u8 s3, u16 s
void CheckForFlashMemory(void);
int sub_80479F8();
void sub_8047A04();
-void sub_8047A1C(void);
-void sub_8047A34(void);
-void save_serialize_game(void);
-void save_deserialize_game();
+void SetSecretBase2Field_9_AndHideBG(void);
+void ClearSecretBase2Field_9_2(void);
+void SaveSerializedGame(void);
+void LoadSerializedGame(void);
// asm/berry_blender.o
void sub_80516C4(u8, u16);
diff --git a/include/global.h b/include/global.h
index ce2267642..be35f1299 100644
--- a/include/global.h
+++ b/include/global.h
@@ -169,6 +169,11 @@ struct EasyChatPair
u16 words[2];
}; /*size = 0x8*/
+struct SaveBlock1_2B4C_Struct
+{
+ u8 filler[0x24];
+};
+
struct SaveBlock1
{
/*0x00*/ struct Coords16 pos;
@@ -230,7 +235,9 @@ struct SaveBlock1
/*0x2B0D*/ u8 outbreakPokemonProbability;
/*0x2B0E*/ u8 filler_2B0E[0xE];
/*0x2B1C*/ u16 unk2B1C[4];
- /*0x2B24*/ u8 filler_2B24[0x2B0];
+ /*0x2B24*/ u8 filler_2B24[0x28];
+ /*0x2B4C*/ struct SaveBlock1_2B4C_Struct unkSave[16];
+ /*0x2D8C*/ u8 filler_2D8C[0x48];
/*0x2DD4*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff
/*0x2DFC*/ u8 filler_2DFC[0x100];
/*0x2EFC*/ struct SB1_2EFC_Struct sb1_2EFC_struct[5];
@@ -284,7 +291,7 @@ struct SaveBlock2
{
/*0x00*/ u8 playerName[8];
/*0x08*/ u8 playerGender; // MALE, FEMALE
- /*0x09*/ u8 sb2_field_9;
+ /*0x09*/ u8 specialSaveWarp;
/*0x0A*/ u8 playerTrainerId[4];
/*0x0E*/ u16 playTimeHours;
/*0x10*/ u8 playTimeMinutes;
diff --git a/ld_script.txt b/ld_script.txt
index 716e0563e..119690d73 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -60,7 +60,7 @@ SECTIONS {
asm/daycare.o(.text);
asm/egg_hatch.o(.text);
asm/rom_804373C.o(.text);
- asm/load_save.o(.text);
+ src/load_save.o(.text);
asm/trade.o(.text);
asm/berry_blender.o(.text);
src/play_time.o(.text);
diff --git a/src/load_save.c b/src/load_save.c
new file mode 100644
index 000000000..6f12718f0
--- /dev/null
+++ b/src/load_save.c
@@ -0,0 +1,165 @@
+#include "global.h"
+#include "main.h"
+#include "rom4.h"
+#include "pokemon.h"
+
+extern u8 gPlayerPartyCount;
+extern u32 gUnknown_3004820;
+
+struct LoadedSaveData
+{
+ struct ItemSlot items[20];
+ struct ItemSlot keyItems[20];
+ struct ItemSlot pokeBalls[16];
+ struct ItemSlot TMsHMs[64];
+ struct ItemSlot berries[46];
+ struct SaveBlock1_2B4C_Struct unknownSaveData[16];
+};
+
+extern struct LoadedSaveData gLoadedSaveData[];
+
+extern u16 IdentifyFlash(void);
+extern void gpu_sync_bg_hide();
+
+void CheckForFlashMemory(void)
+{
+ if(!IdentifyFlash())
+ {
+ gUnknown_3004820 = 1;
+ InitFlashTimer();
+ }
+ else
+ gUnknown_3004820 = 0;
+}
+
+u8 GetSecretBase2Field_9(void)
+{
+ return gSaveBlock2.specialSaveWarp;
+}
+
+void ClearSecretBase2Field_9(void)
+{
+ gSaveBlock2.specialSaveWarp = 0;
+}
+
+void SetSecretBase2Field_9(void)
+{
+ gSaveBlock2.specialSaveWarp = 1;
+}
+
+void SetSecretBase2Field_9_AndHideBG(void) // note: no other function sets specialSaveWarp to values other than 0 or 1, hence clear and set distinctions.
+{
+ gpu_sync_bg_hide(0); // the function doesn't use the parameter passed to it, but this is necessary to match.
+ gSaveBlock2.specialSaveWarp = 1;
+}
+
+void ClearSecretBase2Field_9_2(void) // duplicate function
+{
+ gSaveBlock2.specialSaveWarp = 0;
+}
+
+void SavePlayerParty(void)
+{
+ int i;
+
+ gSaveBlock1.playerPartyCount = gPlayerPartyCount;
+
+ for (i = 0; i < 6; i++)
+ gSaveBlock1.playerParty[i] = gPlayerParty[i];
+}
+
+void LoadPlayerParty(void)
+{
+ int i;
+
+ gPlayerPartyCount = gSaveBlock1.playerPartyCount;
+
+ for (i = 0; i < 6; i++)
+ gPlayerParty[i] = gSaveBlock1.playerParty[i];
+}
+
+void SaveMapObjects(void)
+{
+ int i;
+
+ for(i = 0; i < 16; i++)
+ gSaveBlock1.mapObjects[i] = gMapObjects[i];
+}
+
+void LoadMapObjects(void)
+{
+ int i;
+
+ for(i = 0; i < 16; i++)
+ gMapObjects[i] = gSaveBlock1.mapObjects[i];
+}
+
+void SaveSerializedGame(void)
+{
+ SavePlayerParty();
+ SaveMapObjects();
+}
+
+void LoadSerializedGame(void)
+{
+ LoadPlayerParty();
+ LoadMapObjects();
+}
+
+void LoadPlayerData(void)
+{
+ int i;
+
+ // load player items.
+ for(i = 0; i < 20; i++)
+ gLoadedSaveData->items[i] = gSaveBlock1.bagPocket_Items[i];
+
+ // load player key items.
+ for(i = 0; i < 20; i++)
+ gLoadedSaveData->keyItems[i] = gSaveBlock1.bagPocket_KeyItems[i];
+
+ // load player pokeballs.
+ for(i = 0; i < 16; i++)
+ gLoadedSaveData->pokeBalls[i] = gSaveBlock1.bagPocket_PokeBalls[i];
+
+ // load player TMs and HMs.
+ for(i = 0; i < 64; i++)
+ gLoadedSaveData->TMsHMs[i] = gSaveBlock1.bagPocket_TMHM[i];
+
+ // load player berries.
+ for(i = 0; i < 46; i++)
+ gLoadedSaveData->berries[i] = gSaveBlock1.bagPocket_Berries[i];
+
+ // load misc data.
+ for(i = 0; i < 16; i++)
+ gLoadedSaveData->unknownSaveData[i] = gSaveBlock1.unkSave[i];
+}
+
+void SavePlayerData(void)
+{
+ int i;
+
+ // save player items.
+ for(i = 0; i < 20; i++)
+ gSaveBlock1.bagPocket_Items[i] = gLoadedSaveData->items[i];
+
+ // save player key items.
+ for(i = 0; i < 20; i++)
+ gSaveBlock1.bagPocket_KeyItems[i] = gLoadedSaveData->keyItems[i];
+
+ // save player pokeballs.
+ for(i = 0; i < 16; i++)
+ gSaveBlock1.bagPocket_PokeBalls[i] = gLoadedSaveData->pokeBalls[i];
+
+ // save player TMs and HMs.
+ for(i = 0; i < 64; i++)
+ gSaveBlock1.bagPocket_TMHM[i] = gLoadedSaveData->TMsHMs[i];
+
+ // save player berries.
+ for(i = 0; i < 46; i++)
+ gSaveBlock1.bagPocket_Berries[i] = gLoadedSaveData->berries[i];
+
+ // save misc data.
+ for(i = 0; i < 16; i++)
+ gSaveBlock1.unkSave[i] = gLoadedSaveData->unknownSaveData[i];
+}
diff --git a/src/new_game.c b/src/new_game.c
index c36337409..d63e50236 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -102,7 +102,7 @@ void NewGameInitData(void)
sub_8052DE4();
memset(&gSaveBlock1, 0, sizeof(gSaveBlock1));
sub_80A2B18();
- gSaveBlock2.sb2_field_9 = 0;
+ gSaveBlock2.specialSaveWarp = 0;
set_player_trainer_id();
PlayTimeCounter_Reset();
sub_8052D78();
diff --git a/src/rom4.c b/src/rom4.c
index a3b0b221d..19f59001b 100644
--- a/src/rom4.c
+++ b/src/rom4.c
@@ -454,7 +454,7 @@ void sub_80537CC(u8 a1)
warp_set(&gSaveBlock1.warp1, warp->group, warp->map, -1, warp->x, warp->y);
}
-void gpu_sync_bg_hide(void)
+void gpu_sync_bg_hide()
{
gSaveBlock1.warp1 = gSaveBlock1.warp2;
}
@@ -1262,9 +1262,9 @@ void CB2_ContinueSavedGame(void)
PlayTimeCounter_Start();
ScriptContext1_Init();
ScriptContext2_Disable();
- if (sub_80479F8() == 1)
+ if (GetSecretBase2Field_9() == 1)
{
- sub_8047A04();
+ ClearSecretBase2Field_9();
sub_8053778();
warp_in();
SetMainCallback2(CB2_LoadMap);
diff --git a/src/save.c b/src/save.c
index a26e0da98..88f19f15c 100644
--- a/src/save.c
+++ b/src/save.c
@@ -550,27 +550,27 @@ u8 sub_8125C3C(u8 a1)
sav12_xor_increment(10);
for (i = 0; i < 2; i++)
sub_81253C8(28 + i, gHallOfFameSaveSectionLocations[i].data, gHallOfFameSaveSectionLocations[i].size);
- save_serialize_game();
+ SaveSerializedGame();
save_write_to_flash(0xFFFF, gSaveSectionLocations);
break;
case 0:
default:
- save_serialize_game();
+ SaveSerializedGame();
save_write_to_flash(0xFFFF, gSaveSectionLocations);
break;
case 1:
- save_serialize_game();
+ SaveSerializedGame();
for (i = 0; i < 5; i++)
save_write_to_flash(i, gSaveSectionLocations);
break;
case 2:
- save_serialize_game();
+ SaveSerializedGame();
save_write_to_flash(0, gSaveSectionLocations);
break;
case 4:
for (i = 28; i < 32; i++)
EraseFlashSector(i);
- save_serialize_game();
+ SaveSerializedGame();
save_write_to_flash(0xFFFF, gSaveSectionLocations);
break;
}
@@ -592,7 +592,7 @@ u8 sub_8125D80(void)
{
if (gUnknown_3004820 != 1)
return 1;
- save_serialize_game();
+ SaveSerializedGame();
sub_812546C(gSaveSectionLocations);
return 0;
}
@@ -629,7 +629,7 @@ u8 sub_8125E2C(void)
if (gUnknown_3004820 != 1)
return 1;
- save_serialize_game();
+ SaveSerializedGame();
sub_81254C8(gSaveSectionLocations);
sub_812556C(gUnknown_03005EB4 + 1, gSaveSectionLocations);
return 0;
@@ -669,7 +669,7 @@ u8 sub_8125EC8(u8 a1)
case 0:
default:
result = sub_812587C(0xFFFF, gSaveSectionLocations);
- save_deserialize_game();
+ LoadSerializedGame();
gSaveFileStatus = result;
gUnknown_03005EBC = 0;
break;
diff --git a/src/start_menu.c b/src/start_menu.c
index 06eb28909..ee941b715 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -811,14 +811,14 @@ static void Task_8071B64(u8 taskId)
(*step)++;
break;
case 1:
- sub_8047A1C();
+ SetSecretBase2Field_9_AndHideBG();
sub_8125E2C();
(*step)++;
break;
case 2:
if(!sub_8125E6C())
break;
- sub_8047A34();
+ ClearSecretBase2Field_9_2();
(*step)++;
break;
case 3:
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 842903712..0ef21b938 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -310,7 +310,7 @@ gSaveBlock2: @ 2024EA4
gSaveBlock1: @ 2025734
.space 0x3AC0
-gUnknown_020291F4: @ 20291F4
+gLoadedSaveData: @ items
.space 0x4D8
gUnknown_020296CC: @ 20296CC