diff options
| -rw-r--r-- | asm/cable_club.s | 8 | ||||
| -rw-r--r-- | asm/load_save.s | 444 | ||||
| -rw-r--r-- | asm/record_mixing.s | 4 | ||||
| -rw-r--r-- | asm/rom6.s | 2 | ||||
| -rw-r--r-- | asm/script_pokemon_util_80C4BF0.s | 2 | ||||
| -rw-r--r-- | asm/trade.s | 4 | ||||
| -rw-r--r-- | data/specials.inc | 6 | ||||
| -rw-r--r-- | include/asm.inc.h | 8 | ||||
| -rw-r--r-- | include/global.h | 11 | ||||
| -rw-r--r-- | ld_script.txt | 2 | ||||
| -rw-r--r-- | src/load_save.c | 165 | ||||
| -rw-r--r-- | src/new_game.c | 2 | ||||
| -rw-r--r-- | src/rom4.c | 6 | ||||
| -rw-r--r-- | src/save.c | 16 | ||||
| -rw-r--r-- | src/start_menu.c | 4 | ||||
| -rw-r--r-- | sym_ewram.txt | 2 | 
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 | 
