diff --git a/asm/intro.s b/asm/intro.s index 26ed312d6..efd52e7fd 100644 --- a/asm/intro.s +++ b/asm/intro.s @@ -307,7 +307,7 @@ c2_copyright_1: @ 816CEAC bl sub_815355C lsls r0, 16 lsrs r0, 16 - bl InitSaveBlockPointersWithRandomOffset + bl SetSaveBlocksPointers bl sub_808447C bl ResetSaveCounters movs r0, 0 diff --git a/asm/link.s b/asm/link.s index 39cf6ba5e..2c2a0dc43 100644 --- a/asm/link.s +++ b/asm/link.s @@ -52672,8 +52672,8 @@ SetBerryPowder: @ 802467C .pool thumb_func_end SetBerryPowder - thumb_func_start sub_8024690 -sub_8024690: @ 8024690 + thumb_func_start ApplyNewEncyprtionKeyToBerryPowder +ApplyNewEncyprtionKeyToBerryPowder: @ 8024690 push {lr} adds r1, r0, 0 ldr r0, =gSaveBlock2Ptr @@ -52681,11 +52681,11 @@ sub_8024690: @ 8024690 movs r2, 0xFA lsls r2, 1 adds r0, r2 - bl apply_u32_xor_crypto + bl ApplyNewEncyprtionKeyToWord pop {r0} bx r0 .pool - thumb_func_end sub_8024690 + thumb_func_end ApplyNewEncyprtionKeyToBerryPowder thumb_func_start sub_80246AC sub_80246AC: @ 80246AC diff --git a/asm/load_save.s b/asm/load_save.s index ccfce2ec4..08170b446 100644 --- a/asm/load_save.s +++ b/asm/load_save.s @@ -5,97 +5,9 @@ .text - thumb_func_start CheckForFlashMemory -@ void CheckForFlashMemory() -CheckForFlashMemory: @ 8076B68 - push {lr} - bl IdentifyFlash - lsls r0, 16 - cmp r0, 0 - bne _08076B84 - ldr r1, =gFlashMemoryPresent - movs r0, 0x1 - str r0, [r1] - bl StartFlashMemoryTimer - b _08076B8A - .pool -_08076B84: - ldr r1, =gFlashMemoryPresent - movs r0, 0 - str r0, [r1] -_08076B8A: - pop {r0} - bx r0 - .pool - thumb_func_end CheckForFlashMemory - thumb_func_start ClearSav2 -ClearSav2: @ 8076B94 - push {lr} - sub sp, 0x4 - mov r1, sp - movs r0, 0 - strh r0, [r1] - ldr r1, =gUnknown_02024A54 - ldr r2, =0x010007d6 - mov r0, sp - bl CpuSet - add sp, 0x4 - pop {r0} - bx r0 - .pool - thumb_func_end ClearSav2 - - thumb_func_start ClearSav1 -ClearSav1: @ 8076BB8 - push {lr} - sub sp, 0x4 - mov r1, sp - movs r0, 0 - strh r0, [r1] - ldr r1, =gUnknown_02025A00 - ldr r2, =0x01001f04 - mov r0, sp - bl CpuSet - add sp, 0x4 - pop {r0} - bx r0 - .pool - thumb_func_end ClearSav1 - - thumb_func_start InitSaveBlockPointersWithRandomOffset -@ void InitSaveBlockPointersWithRandomOffset(u8 offset) -InitSaveBlockPointersWithRandomOffset: @ 8076BDC - push {r4,r5,lr} - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - ldr r5, =gSaveBlock1Ptr - bl Random - adds r4, r0 - movs r0, 0x7C - ands r4, r0 - ldr r1, =gSaveBlock2Ptr - ldr r0, =gUnknown_02024A54 - adds r0, r4, r0 - str r0, [r1] - ldr r0, =gUnknown_02025A00 - adds r0, r4, r0 - str r0, [r5] - ldr r1, =gUnknown_03005D94 - ldr r0, =gUnknown_02029808 - adds r4, r0 - str r4, [r1] - bl SetBagItemsPointers - bl SetDecorationInventoriesPointers - pop {r4,r5} - pop {r0} - bx r0 - .pool - thumb_func_end InitSaveBlockPointersWithRandomOffset - - thumb_func_start saveblock_randomize_and_relocate -saveblock_randomize_and_relocate: @ 8076C2C + thumb_func_start MoveSaveBlocks_ResetHeap +MoveSaveBlocks_ResetHeap: @ 8076C2C push {r4-r7,lr} mov r7, r10 mov r6, r9 @@ -126,7 +38,7 @@ saveblock_randomize_and_relocate: @ 8076C2C ldr r0, =0x02000f2c adds r2, r7, 0 bl memcpy - ldr r0, =gUnknown_03005D94 + ldr r0, =gPokemonStoragePtr mov r8, r0 ldr r1, [r0] ldr r0, =0x000083d0 @@ -141,7 +53,7 @@ saveblock_randomize_and_relocate: @ 8076C2C adds r1, r0 ldrb r0, [r4, 0xD] adds r0, r1 - bl InitSaveBlockPointersWithRandomOffset + bl SetSaveBlocksPointers ldr r1, =gSaveBlock2Ptr ldr r0, [r1] adds r1, r4, 0 @@ -173,7 +85,7 @@ saveblock_randomize_and_relocate: @ 8076C2C lsrs r0, 16 adds r4, r0 adds r0, r4, 0 - bl saveblock_apply_crypto + bl ApplyNewEncyprtionKeyToAllEncryptedData ldr r1, =gSaveBlock2Ptr ldr r0, [r1] adds r0, 0xAC @@ -187,7 +99,7 @@ saveblock_randomize_and_relocate: @ 8076C2C pop {r0} bx r0 .pool - thumb_func_end saveblock_randomize_and_relocate + thumb_func_end MoveSaveBlocks_ResetHeap thumb_func_start sav2_x1_query_bit1 sav2_x1_query_bit1: @ 8076D24 @@ -713,8 +625,8 @@ ApplyNewEncyprtionKeyToHword: @ 8077100 .pool thumb_func_end ApplyNewEncyprtionKeyToHword - thumb_func_start apply_u32_xor_crypto -apply_u32_xor_crypto: @ 8077118 + thumb_func_start ApplyNewEncyprtionKeyToWord +ApplyNewEncyprtionKeyToWord: @ 8077118 ldr r2, =gSaveBlock2Ptr ldr r3, [r2] adds r3, 0xAC @@ -725,24 +637,24 @@ apply_u32_xor_crypto: @ 8077118 str r2, [r0] bx lr .pool - thumb_func_end apply_u32_xor_crypto + thumb_func_end ApplyNewEncyprtionKeyToWord - thumb_func_start saveblock_apply_crypto -saveblock_apply_crypto: @ 8077130 + thumb_func_start ApplyNewEncyprtionKeyToAllEncryptedData +ApplyNewEncyprtionKeyToAllEncryptedData: @ 8077130 push {r4,r5,lr} adds r4, r0, 0 - bl sub_8084864 + bl ApplyNewEncyprtionKeyToGameStats adds r0, r4, 0 bl ApplyNewEncyprtionKeyToBagItems_ adds r0, r4, 0 - bl sub_8024690 + bl ApplyNewEncyprtionKeyToBerryPowder ldr r5, =gSaveBlock1Ptr ldr r0, [r5] movs r1, 0x92 lsls r1, 3 adds r0, r1 adds r1, r4, 0 - bl apply_u32_xor_crypto + bl ApplyNewEncyprtionKeyToWord ldr r0, [r5] ldr r1, =0x00000494 adds r0, r1 @@ -752,6 +664,6 @@ saveblock_apply_crypto: @ 8077130 pop {r0} bx r0 .pool - thumb_func_end saveblock_apply_crypto + thumb_func_end ApplyNewEncyprtionKeyToAllEncryptedData .align 2, 0 @ Don't pad with nop. diff --git a/asm/lottery_corner.s b/asm/lottery_corner.s index fff59640f..05f248771 100644 --- a/asm/lottery_corner.s +++ b/asm/lottery_corner.s @@ -133,7 +133,7 @@ _0817764E: bls _081775FC _08177658: movs r7, 0 - ldr r1, =gUnknown_03005D94 + ldr r1, =gPokemonStoragePtr mov r9, r1 _0817765E: movs r6, 0 @@ -233,7 +233,7 @@ _0817773C: ldr r1, =gSpecialVar_0x8006 movs r0, 0x1 strh r0, [r1] - ldr r2, =gUnknown_03005D94 + ldr r2, =gPokemonStoragePtr ldr r1, [sp] lsls r0, r1, 2 adds r0, r1 diff --git a/asm/rom4.s b/asm/rom4.s index 6e7cd3cb2..877576275 100644 --- a/asm/rom4.s +++ b/asm/rom4.s @@ -238,8 +238,8 @@ _08084854: .pool thumb_func_end sav12_xor_set - thumb_func_start sub_8084864 -sub_8084864: @ 8084864 + thumb_func_start ApplyNewEncyprtionKeyToGameStats +ApplyNewEncyprtionKeyToGameStats: @ 8084864 push {r4-r6,lr} adds r5, r0, 0 movs r4, 0 @@ -251,7 +251,7 @@ _0808486C: ldr r0, [r6] adds r0, r1 adds r1, r5, 0 - bl apply_u32_xor_crypto + bl ApplyNewEncyprtionKeyToWord adds r0, r4, 0x1 lsls r0, 24 lsrs r4, r0, 24 @@ -261,7 +261,7 @@ _0808486C: pop {r0} bx r0 .pool - thumb_func_end sub_8084864 + thumb_func_end ApplyNewEncyprtionKeyToGameStats thumb_func_start CopyFieldObjectTemplatesToSav1 @ void CopyFieldObjectTemplatesToSav1() @@ -3713,7 +3713,7 @@ _0808644C: bl overworld_bg_setup bl script_env_1_init bl script_env_2_disable - bl saveblock_randomize_and_relocate_ + bl MoveSaveBlocks_ResetHeap_ bl sub_80867D8 b _08086506 _08086462: @@ -3838,7 +3838,7 @@ _08086570: bl mli0_load_map b _08086622 _0808657C: - bl saveblock_randomize_and_relocate_ + bl MoveSaveBlocks_ResetHeap_ bl sub_80867D8 b _08086622 _08086586: @@ -3941,7 +3941,7 @@ _0808664C: beq _0808668A b _0808668E _08086656: - bl saveblock_randomize_and_relocate_ + bl MoveSaveBlocks_ResetHeap_ bl sub_80867D8 movs r0, 0 bl sub_8086988 @@ -4006,7 +4006,7 @@ _080866B4: .4byte _0808679A _080866EC: bl sub_808631C - bl saveblock_randomize_and_relocate_ + bl MoveSaveBlocks_ResetHeap_ bl sub_80867D8 b _08086792 _080866FA: @@ -4106,14 +4106,14 @@ _080867B4: bx r0 thumb_func_end do_load_map_stuff_loop - thumb_func_start saveblock_randomize_and_relocate_ -saveblock_randomize_and_relocate_: @ 80867C8 + thumb_func_start MoveSaveBlocks_ResetHeap_ +MoveSaveBlocks_ResetHeap_: @ 80867C8 push {lr} bl sub_81BE6AC - bl saveblock_randomize_and_relocate + bl MoveSaveBlocks_ResetHeap pop {r0} bx r0 - thumb_func_end saveblock_randomize_and_relocate_ + thumb_func_end MoveSaveBlocks_ResetHeap_ thumb_func_start sub_80867D8 sub_80867D8: @ 80867D8 diff --git a/asm/rom_8034C54.s b/asm/rom_8034C54.s index 463a1615a..c22aad8d4 100644 --- a/asm/rom_8034C54.s +++ b/asm/rom_8034C54.s @@ -3065,7 +3065,7 @@ _08036758: thumb_func_start sub_8036760 sub_8036760: @ 8036760 push {lr} - bl saveblock_randomize_and_relocate + bl MoveSaveBlocks_ResetHeap bl sub_8056F28 bl dp11_init bl init_uns_table_pokemon_copy diff --git a/asm/rom_80C6FA0.s b/asm/rom_80C6FA0.s index 2c86a8340..8ff9d9d2f 100644 --- a/asm/rom_80C6FA0.s +++ b/asm/rom_80C6FA0.s @@ -20562,7 +20562,7 @@ nullsub_98: @ 80D1D08 thumb_func_start get_preferred_box @ char get_preferred_box() get_preferred_box: @ 80D1D0C - ldr r0, =gUnknown_03005D94 + ldr r0, =gPokemonStoragePtr ldr r0, [r0] ldrb r0, [r0] bx lr @@ -20576,7 +20576,7 @@ sub_80D1D18: @ 80D1D18 lsrs r1, r0, 24 cmp r1, 0xD bhi _080D1D28 - ldr r0, =gUnknown_03005D94 + ldr r0, =gPokemonStoragePtr ldr r0, [r0] strb r1, [r0] _080D1D28: @@ -20597,7 +20597,7 @@ get_pokemon_data_from_any_box: @ 80D1D30 bhi _080D1D6C cmp r4, 0x1D bhi _080D1D6C - ldr r2, =gUnknown_03005D94 + ldr r2, =gPokemonStoragePtr lsls r0, r3, 2 adds r0, r3 lsls r1, r0, 4 @@ -20635,7 +20635,7 @@ set_pokemon_data_from_any_box: @ 80D1D74 bhi _080D1DAC cmp r4, 0x1D bhi _080D1DAC - ldr r2, =gUnknown_03005D94 + ldr r2, =gPokemonStoragePtr lsls r0, r3, 2 adds r0, r3 lsls r1, r0, 4 @@ -20665,7 +20665,7 @@ get_pokemon_data_from_selected_box: @ 80D1DB8 adds r2, r1, 0 lsls r3, 24 lsrs r3, 24 - ldr r0, =gUnknown_03005D94 + ldr r0, =gPokemonStoragePtr ldr r0, [r0] ldrb r0, [r0] adds r1, r3, 0 @@ -20683,7 +20683,7 @@ set_pokemon_data_from_selected_box: @ 80D1DD8 adds r3, r2, 0 lsls r4, 24 lsrs r4, 24 - ldr r0, =gUnknown_03005D94 + ldr r0, =gPokemonStoragePtr ldr r0, [r0] ldrb r0, [r0] adds r1, r4, 0 @@ -20707,7 +20707,7 @@ sub_80D1DFC: @ 80D1DFC bhi _080D1E38 cmp r4, 0x1D bhi _080D1E38 - ldr r2, =gUnknown_03005D94 + ldr r2, =gPokemonStoragePtr lsls r0, r3, 2 adds r0, r3 lsls r1, r0, 4 @@ -20745,7 +20745,7 @@ sub_80D1E44: @ 80D1E44 bhi _080D1E84 cmp r2, 0x1D bhi _080D1E84 - ldr r6, =gUnknown_03005D94 + ldr r6, =gPokemonStoragePtr lsls r1, r0, 2 adds r1, r0 lsls r0, r1, 4 @@ -20786,7 +20786,7 @@ sub_80D1E90: @ 80D1E90 bhi _080D1EC6 cmp r4, 0x1D bhi _080D1EC6 - ldr r2, =gUnknown_03005D94 + ldr r2, =gPokemonStoragePtr lsls r0, r3, 2 adds r0, r3 lsls r1, r0, 4 @@ -20822,7 +20822,7 @@ sub_80D1ED0: @ 80D1ED0 bhi _080D1F10 cmp r4, 0x1D bhi _080D1F10 - ldr r2, =gUnknown_03005D94 + ldr r2, =gPokemonStoragePtr lsls r0, r3, 2 adds r0, r3 lsls r1, r0, 4 @@ -20860,7 +20860,7 @@ sub_80D1F18: @ 80D1F18 bhi _080D1F4E cmp r1, 0x1D bhi _080D1F4E - ldr r0, =gUnknown_03005D94 + ldr r0, =gPokemonStoragePtr ldr r0, [r0] lsls r3, r1, 2 adds r3, r1 @@ -20895,7 +20895,7 @@ sub_80D1F58: @ 80D1F58 bhi _080D1F8E cmp r2, 0x1D bhi _080D1F8E - ldr r0, =gUnknown_03005D94 + ldr r0, =gPokemonStoragePtr ldr r1, [r0] lsls r3, r2, 2 adds r3, r2 @@ -20950,7 +20950,7 @@ sub_80D1F98: @ 80D1F98 bhi _080D2004 cmp r6, 0x1D bhi _080D2004 - ldr r2, =gUnknown_03005D94 + ldr r2, =gPokemonStoragePtr lsls r0, r7, 2 adds r0, r7 lsls r1, r0, 4 @@ -20995,7 +20995,7 @@ sub_80D2018: @ 80D2018 bhi _080D2048 cmp r4, 0x1D bhi _080D2048 - ldr r2, =gUnknown_03005D94 + ldr r2, =gPokemonStoragePtr lsls r0, r3, 2 adds r0, r3 lsls r1, r0, 4 @@ -21028,7 +21028,7 @@ sub_80D2054: @ 80D2054 bhi _080D2088 cmp r4, 0x1D bhi _080D2088 - ldr r2, =gUnknown_03005D94 + ldr r2, =gPokemonStoragePtr lsls r0, r3, 2 adds r0, r3 lsls r1, r0, 4 @@ -21062,7 +21062,7 @@ get_pokemon_by_box_and_pos: @ 80D2094 bhi _080D20C8 cmp r4, 0x1D bhi _080D20C8 - ldr r2, =gUnknown_03005D94 + ldr r2, =gPokemonStoragePtr lsls r0, r3, 2 adds r0, r3 lsls r1, r0, 4 @@ -21095,7 +21095,7 @@ sav3_get_box_name: @ 80D20D0 movs r0, 0 b _080D20EC _080D20DE: - ldr r0, =gUnknown_03005D94 + ldr r0, =gPokemonStoragePtr lsls r1, r2, 3 adds r1, r2 ldr r2, =0x00008344 @@ -21118,7 +21118,7 @@ sub_80D20F8: @ 80D20F8 movs r0, 0 b _080D2112 _080D2106: - ldr r0, =gUnknown_03005D94 + ldr r0, =gPokemonStoragePtr ldr r0, [r0] ldr r2, =0x000083c2 adds r0, r2 @@ -21141,7 +21141,7 @@ sub_80D2120: @ 80D2120 bhi _080D213E cmp r1, 0x10 bhi _080D213E - ldr r0, =gUnknown_03005D94 + ldr r0, =gPokemonStoragePtr ldr r0, [r0] ldr r3, =0x000083c2 adds r0, r3 @@ -21271,7 +21271,7 @@ sub_80D2218: @ 80D2218 push {r7} sub sp, 0x4 movs r2, 0 - ldr r0, =gUnknown_03005D94 + ldr r0, =gPokemonStoragePtr mov r8, r0 movs r7, 0x4 _080D2228: @@ -21321,7 +21321,7 @@ sub_80D2270: @ 80D2270 bhi _080D22C8 cmp r2, 0x1D bhi _080D22C8 - ldr r6, =gUnknown_03005D94 + ldr r6, =gPokemonStoragePtr lsls r1, r0, 2 adds r1, r0 lsls r0, r1, 4 @@ -21371,7 +21371,7 @@ sub_80D22D0: @ 80D22D0 push {r6,r7} movs r7, 0 movs r0, 0 - ldr r1, =gUnknown_03005D94 + ldr r1, =gPokemonStoragePtr mov r9, r1 _080D22E0: lsls r1, r0, 2 @@ -21428,7 +21428,7 @@ sub_80D233C: @ 80D233C push {r6,r7} movs r7, 0 movs r0, 0 - ldr r1, =gUnknown_03005D94 + ldr r1, =gPokemonStoragePtr mov r9, r1 _080D234C: lsls r1, r0, 2 @@ -21490,7 +21490,7 @@ sub_80D23A8: @ 80D23A8 strh r0, [r1, 0x2] movs r0, 0 mov r8, r0 - ldr r7, =gUnknown_03005D94 + ldr r7, =gPokemonStoragePtr movs r5, 0x4 _080D23C0: movs r6, 0 diff --git a/asm/rom_81700F8.s b/asm/rom_81700F8.s index 4c35e747c..45c505cd9 100644 --- a/asm/rom_81700F8.s +++ b/asm/rom_81700F8.s @@ -29,7 +29,7 @@ sub_81700F8: @ 81700F8 bl sub_815355C lsls r0, 16 lsrs r0, 16 - bl InitSaveBlockPointersWithRandomOffset + bl SetSaveBlocksPointers bl sub_808447C bl ResetSaveCounters movs r0, 0 diff --git a/include/global.h b/include/global.h index c43b57e03..ebef8e1dd 100644 --- a/include/global.h +++ b/include/global.h @@ -184,7 +184,8 @@ struct SaveBlock2 /*0xEE1*/ u8 field_EE1; /*0xEE2*/ u8 field_EE2[7]; /*0xEE9*/ u8 field_EE9; - /*0xEEA*/ u8 field_EEA[22]; + /*0xEEA*/ u8 field_EEA[66]; + // sizeof=0xF2C }; extern struct SaveBlock2 *gSaveBlock2Ptr; @@ -618,6 +619,23 @@ struct ContestWinner u8 contestRank; }; +struct DaycareMon +{ + struct BoxPokemon mon; + struct MailStruct mail; + u8 OT_name[OT_NAME_LENGTH + 1]; + u8 monName[11]; + u8 language; + u32 stepsTaken; +}; + +struct DaycareData +{ + struct DaycareMon mons[2]; + u32 offspringPersonality; + u8 stepCounter; +}; + #define FLAGS_NUMBER 300 #define VARS_NUMBER 256 @@ -686,33 +704,26 @@ struct SaveBlock1 /*0x????*/ u16 unk2B1C[6]; /*0x????*/ u16 unk2B28[6]; /*0x????*/ u16 unk2B34[6]; - /*0x????*/ u16 unk2B40[6]; + /*0x????*/ u16 unk2B3A[3]; /*0x2BE0*/ struct MailStruct mail[16]; - /*0x2E20*/ u8 additionalPhrases; // bitfield for 33 additional phrases in easy chat system + /*0x2E20*/ u8 additionalPhrases[5]; // bitfield for 33 additional phrases in easy chat system /*0x2E25*/ u8 unk2E25[3]; // possibly padding? /*0x2E28*/ OldMan oldMan; /*0x2e64*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff /*0x2e8c*/ u8 filler_2E8C[0x4]; /*0x2e90*/ struct ContestWinner contestWinners[13]; // 0 - 5 used in contest hall, 6 - 7 unused?, 8 - 12 museum - - // TODO: fix - - /*0x????*/ struct BoxPokemon daycareData[2]; - /*0x????*/ struct RecordMixing_UnknownStruct filler_303C; - /*0x????*/ u8 filler_30B4[0x2]; - /*0x????*/ u8 filler_30B6; - /*0x????*/ u8 filler_30B7[1]; - /*0x????*/ struct LinkBattleRecord linkBattleRecords[5]; - /*0x????*/ u8 filler_3108[8]; - + /*0x3030*/ struct DaycareData daycare; + /*0x3150*/ struct LinkBattleRecord linkBattleRecords[5]; + /*0x31A0*/ u8 filler_31A0[8]; /*0x31A8*/ u8 giftRibbons[52]; /*0x31DC*/ struct Roamer roamer; /*0x31F8*/ struct EnigmaBerry enigmaBerry; - - // TODO: fix - /*0x????*/ struct RamScript ramScript; - /*0x????*/ struct RecordMixingGift recordMixingGift; - /*0x????*/ u8 unk3A8C[52]; //pokedex related + /*0x3728*/ struct RamScript ramScript; + /*0x3B14*/ struct RecordMixingGift recordMixingGift; + /*0x3B24*/ u8 seen2[52]; + /*0x3B58*/ u8 lilycoveLady[536]; // TODO: convert to a union + /*0x3D70*/ u8 babyPhrase[24]; // TODO: convert to a struct + // sizeof: 0x3D88 }; extern struct SaveBlock1* gSaveBlock1Ptr; diff --git a/include/load_save.h b/include/load_save.h new file mode 100644 index 000000000..2dce65385 --- /dev/null +++ b/include/load_save.h @@ -0,0 +1,20 @@ +#ifndef GUARD_LOAD_SAVE_H +#define GUARD_LOAD_SAVE_H + +extern bool32 gFlashMemoryPresent; + +void CheckForFlashMemory(void); +void MoveSaveBlocks_ResetHeap(void); +bool32 GetSecretBase2Field_9(void); +void ClearSecretBase2Field_9(void); +void SetSecretBase2Field_9(void); +void SetSecretBase2Field_9_AndHideBG(void); +void ClearSecretBase2Field_9_2(void); +void SavePlayerParty(void); +void LoadPlayerParty(void); +void SaveSerializedGame(void); +void LoadSerializedGame(void); +void LoadPlayerBag(void); +void SavePlayerBag(void); + +#endif // GUARD_LOAD_SAVE_H diff --git a/include/pokemon.h b/include/pokemon.h index 299a25391..a9d6c6888 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -261,6 +261,14 @@ struct Pokemon extern struct Pokemon gPlayerParty[6]; extern struct Pokemon gEnemyParty[6]; +struct PokemonStorage +{ + /*0x0000*/ u8 currentBox; + /*0x0001*/ struct BoxPokemon boxes[14][30]; + /*0x8344*/ u8 boxNames[14][9]; + /*0x83C2*/ u8 boxWallpapers[14]; +}; + struct BaseStats { /* 0x00 */ u8 baseHP; diff --git a/ld_script.txt b/ld_script.txt index a38af206f..364d7bfb3 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -74,6 +74,7 @@ SECTIONS { asm/daycare.o(.text); asm/egg_hatch.o(.text); asm/rom_8072304.o(.text); + src/load_save.o(.text); asm/load_save.o(.text); asm/trade.o(.text); asm/berry_blender.o(.text); diff --git a/src/load_save.c b/src/load_save.c new file mode 100644 index 000000000..43b2475f3 --- /dev/null +++ b/src/load_save.c @@ -0,0 +1,104 @@ +#include "global.h" +#include "gba/flash_internal.h" +#include "load_save.h" +#include "main.h" +#include "pokemon.h" +#include "rng.h" +#include "malloc.h" + +extern u8 gPlayerPartyCount; +extern struct PokemonStorage* gPokemonStoragePtr; +extern void* gUnknown_0203CF5C; +extern u8 gHeap[0x1C000]; + +extern bool16 IdentifyFlash(void); +extern void SetBagItemsPointers(void); +extern void SetDecorationInventoriesPointers(void); +extern void InitHeap(void *heapStart, u32 heapSize); + +void ApplyNewEncyprtionKeyToAllEncryptedData(u32 encryptionKey); + +#define SAVEBLOCK_MOVE_RANGE 128 + +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}; + +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(u16 offset) +{ + struct SaveBlock1** sav1_LocalVar = &gSaveBlock1Ptr; + + offset = (offset + Random()) & (SAVEBLOCK_MOVE_RANGE - 4); + + gSaveBlock2Ptr = (void*)(&gSaveblock2) + offset; + *sav1_LocalVar = (void*)(&gSaveblock1) + offset; + gPokemonStoragePtr = (void*)(&gPokemonStorage) + offset; + + SetBagItemsPointers(); + SetDecorationInventoriesPointers(); +} +/* +void MoveSaveBlocks_ResetHeap(void) +{ + void *vblankCB, *hblankCB; + u32 encryptionKey; + + // save interrupt functions and turn them off + vblankCB = gMain.vblankCallback; + hblankCB = gMain.hblankCallback; + gMain.vblankCallback = NULL; + gMain.hblankCallback = NULL; + gUnknown_0203CF5C = NULL; + + // copy saveblocks' content + memcpy(gHeap, gSaveBlock2Ptr, sizeof(struct SaveBlock2)); + memcpy(gHeap + sizeof(struct SaveBlock2), gSaveBlock1Ptr, sizeof(struct SaveBlock1)); + memcpy(gHeap + sizeof(struct SaveBlock2) + sizeof(struct SaveBlock1), gPokemonStoragePtr, sizeof(struct PokemonStorage)); + + // change saveblocks' pointers + // argument is a sum of the individual trainerId bytes + SetSaveBlocksPointers(gHeap[10] + gHeap[11] + gHeap[12] + gHeap[13]); + + // restore saveblock data since the pointers changed + memcpy(gSaveBlock2Ptr, gHeap, sizeof(struct SaveBlock2)); + memcpy(gSaveBlock1Ptr, gHeap + sizeof(struct SaveBlock2), sizeof(struct SaveBlock1)); + memcpy(gPokemonStoragePtr, gHeap + sizeof(struct SaveBlock2) + sizeof(struct SaveBlock1), sizeof(struct PokemonStorage)); + + // heap was destroyed in the copying process, so reset it + InitHeap(gHeap, sizeof(gHeap)); + + // restore interrupt functions + gMain.hblankCallback = hblankCB; + gMain.vblankCallback = vblankCB; + + // create a new encryption key + encryptionKey = (Random() << 0x10) + (Random()); + ApplyNewEncyprtionKeyToAllEncryptedData(encryptionKey); + gSaveBlock2Ptr->encryptionKey = encryptionKey; +}*/ diff --git a/src/main.c b/src/main.c index 7c8075a6f..7da51c65a 100644 --- a/src/main.c +++ b/src/main.c @@ -34,9 +34,9 @@ extern struct SoundInfo gSoundInfo; extern u32 gFlashMemoryPresent; extern u32 IntrMain[]; extern u8 gHeap[]; -extern struct SaveBlock2 gUnknown_02024A54; -extern char *gUnknown_03005D94; -extern char gUnknown_02029808[]; +extern struct SaveBlock2 gSaveblock2; +extern char *gPokemonStoragePtr; +extern char gPokemonStorage[]; extern u32 gBattleTypeFlags; extern u8 gUnknown_03002748; extern u32 *gUnknown_0203CF5C; @@ -185,8 +185,8 @@ static void InitMainCallbacks(void) gMain.vblankCounter2 = 0; gMain.callback1 = NULL; SetMainCallback2(c2_copyright_1); - gSaveBlock2Ptr = &gUnknown_02024A54; - gUnknown_03005D94 = gUnknown_02029808; + gSaveBlock2Ptr = &gSaveblock2; + gPokemonStoragePtr = gPokemonStorage; } static void CallCallbacks(void) @@ -368,7 +368,7 @@ static void VBlankIntr(void) gMain.intrCheck |= INTR_FLAG_VBLANK; } -void StartFlashMemoryTimer(void) +void InitFlashTimer(void) { SetFlashTimerIntr(2, gIntrTable + 0x7); } diff --git a/src/save.c b/src/save.c index ccb653f66..2b3da38b1 100644 --- a/src/save.c +++ b/src/save.c @@ -5,7 +5,7 @@ extern struct SaveSectionOffsets gSaveSectionOffsets[0xE]; extern struct SaveSectionLocation gRamSaveSectionLocations[0xE]; -extern void *gUnknown_03005D94; +extern void *gPokemonStoragePtr; extern u8 gDecompressionBuffer[]; extern u32 gFlashMemoryPresent; extern u16 gUnknown_03006294; @@ -593,7 +593,7 @@ void UpdateSaveAddresses(void) for(i = 5; i < 14; i++) { - gRamSaveSectionLocations[i].data = gUnknown_03005D94 + gSaveSectionOffsets[i].toAdd; + gRamSaveSectionLocations[i].data = gPokemonStoragePtr + gSaveSectionOffsets[i].toAdd; gRamSaveSectionLocations[i].size = gSaveSectionOffsets[i].size; } } @@ -630,7 +630,7 @@ _081531AC:\n\ bge _081531AC\n\ movs r4, 0x5\n\ ldr r1, =gRamSaveSectionLocations\n\ - ldr r5, =gUnknown_03005D94\n\ + ldr r5, =gPokemonStoragePtr\n\ ldr r0, =gSaveSectionOffsets\n\ adds r3, r1, 0\n\ adds r3, 0x28\n\ diff --git a/sym_common.txt b/sym_common.txt index 8a96f4eff..b3ef89716 100644 --- a/sym_common.txt +++ b/sym_common.txt @@ -251,7 +251,7 @@ gSaveBlock1Ptr: @ 3005D8C gSaveBlock2Ptr: @ 3005D90 .space 0x4 -gUnknown_03005D94: @ 3005D94 +gPokemonStoragePtr: @ 3005D94 .space 0x4 gUnknown_03005D98: @ 3005D98 diff --git a/sym_ewram.txt b/sym_ewram.txt index a84208240..3b101e836 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -662,14 +662,7 @@ gUnknown_02024A38: @ 2024A38 gUnknown_02024A4C: @ 2024A4C .space 0x8 -gUnknown_02024A54: @ 2024A54 - .space 0xFAC - -gUnknown_02025A00: @ 2025A00 - .space 0x3E08 - -gUnknown_02029808: @ 2029808 - .space 0x8450 + .include "src/load_save.o" gUnknown_02031C58: @ 2031C58 .space 0x528