diff options
author | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2019-06-28 05:55:49 +0800 |
---|---|---|
committer | jiangzhengwenjz <jiangzhengwenjzw@qq.com> | 2019-06-28 05:56:28 +0800 |
commit | 8e8fe3bf443cec46c0b7cc2072748c90bedc964d (patch) | |
tree | 5e3c933e14615e7daf0ac74d77545663dd05a8d4 | |
parent | be2010e0db8ca527693d40a6f1410000033f7e7f (diff) |
finished save_location
-rw-r--r-- | asm/save_location.s | 222 | ||||
-rw-r--r-- | data/data_83FECCC.s | 10 | ||||
-rw-r--r-- | include/global.h | 2 | ||||
-rw-r--r-- | include/save_location.h | 13 | ||||
-rw-r--r-- | ld_script.txt | 3 | ||||
-rw-r--r-- | src/load_save.c | 10 | ||||
-rw-r--r-- | src/reset_save_heap.c | 5 | ||||
-rw-r--r-- | src/save_location.c | 109 |
8 files changed, 127 insertions, 247 deletions
diff --git a/asm/save_location.s b/asm/save_location.s deleted file mode 100644 index 8a1031963..000000000 --- a/asm/save_location.s +++ /dev/null @@ -1,222 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start IsCurMapInLocationList -IsCurMapInLocationList: @ 810B6F4 - push {r4,lr} - adds r2, r0, 0 - ldr r0, _0810B724 @ =gSaveBlock1Ptr - ldr r0, [r0] - movs r1, 0x4 - ldrsb r1, [r0, r1] - lsls r1, 8 - ldrb r0, [r0, 0x5] - lsls r0, 24 - asrs r0, 24 - adds r0, r1 - lsls r0, 16 - lsrs r3, r0, 16 - ldrh r0, [r2] - ldr r1, _0810B728 @ =0x0000ffff - cmp r0, r1 - beq _0810B734 - adds r4, r1, 0 - adds r1, r2, 0 -_0810B71A: - ldrh r0, [r1] - cmp r0, r3 - bne _0810B72C - movs r0, 0x1 - b _0810B736 - .align 2, 0 -_0810B724: .4byte gSaveBlock1Ptr -_0810B728: .4byte 0x0000ffff -_0810B72C: - adds r1, 0x2 - ldrh r0, [r1] - cmp r0, r4 - bne _0810B71A -_0810B734: - movs r0, 0 -_0810B736: - pop {r4} - pop {r1} - bx r1 - thumb_func_end IsCurMapInLocationList - - thumb_func_start IsCurMapPokeCenter -IsCurMapPokeCenter: @ 810B73C - push {lr} - ldr r0, _0810B748 @ =gUnknown_845303C - bl IsCurMapInLocationList - pop {r1} - bx r1 - .align 2, 0 -_0810B748: .4byte gUnknown_845303C - thumb_func_end IsCurMapPokeCenter - - thumb_func_start IsCurMapReloadLocation -IsCurMapReloadLocation: @ 810B74C - push {lr} - ldr r0, _0810B758 @ =gUnknown_8453092 - bl IsCurMapInLocationList - pop {r1} - bx r1 - .align 2, 0 -_0810B758: .4byte gUnknown_8453092 - thumb_func_end IsCurMapReloadLocation - - thumb_func_start sub_810B75C -sub_810B75C: @ 810B75C - push {lr} - ldr r0, _0810B768 @ =gUnknown_8453094 - bl IsCurMapInLocationList - pop {r1} - bx r1 - .align 2, 0 -_0810B768: .4byte gUnknown_8453094 - thumb_func_end sub_810B75C - - thumb_func_start TrySetPokeCenterWarpStatus -TrySetPokeCenterWarpStatus: @ 810B76C - push {lr} - bl IsCurMapPokeCenter - cmp r0, 0 - bne _0810B788 - ldr r0, _0810B784 @ =gSaveBlock2Ptr - ldr r2, [r0] - ldrb r1, [r2, 0x9] - movs r0, 0xFD - ands r0, r1 - b _0810B792 - .align 2, 0 -_0810B784: .4byte gSaveBlock2Ptr -_0810B788: - ldr r0, _0810B798 @ =gSaveBlock2Ptr - ldr r2, [r0] - ldrb r1, [r2, 0x9] - movs r0, 0x2 - orrs r0, r1 -_0810B792: - strb r0, [r2, 0x9] - pop {r0} - bx r0 - .align 2, 0 -_0810B798: .4byte gSaveBlock2Ptr - thumb_func_end TrySetPokeCenterWarpStatus - - thumb_func_start TrySetReloadWarpStatus -TrySetReloadWarpStatus: @ 810B79C - push {lr} - bl IsCurMapReloadLocation - cmp r0, 0 - bne _0810B7B8 - ldr r0, _0810B7B4 @ =gSaveBlock2Ptr - ldr r2, [r0] - ldrb r1, [r2, 0x9] - movs r0, 0xFB - ands r0, r1 - b _0810B7C2 - .align 2, 0 -_0810B7B4: .4byte gSaveBlock2Ptr -_0810B7B8: - ldr r0, _0810B7C8 @ =gSaveBlock2Ptr - ldr r2, [r0] - ldrb r1, [r2, 0x9] - movs r0, 0x4 - orrs r0, r1 -_0810B7C2: - strb r0, [r2, 0x9] - pop {r0} - bx r0 - .align 2, 0 -_0810B7C8: .4byte gSaveBlock2Ptr - thumb_func_end TrySetReloadWarpStatus - - thumb_func_start sub_810B7CC -sub_810B7CC: @ 810B7CC - push {lr} - bl sub_810B75C - cmp r0, 0 - bne _0810B7E8 - ldr r0, _0810B7E4 @ =gSaveBlock2Ptr - ldr r2, [r0] - ldrb r1, [r2, 0x9] - movs r0, 0xF7 - ands r0, r1 - b _0810B7F2 - .align 2, 0 -_0810B7E4: .4byte gSaveBlock2Ptr -_0810B7E8: - ldr r0, _0810B7F8 @ =gSaveBlock2Ptr - ldr r2, [r0] - ldrb r1, [r2, 0x9] - movs r0, 0x8 - orrs r0, r1 -_0810B7F2: - strb r0, [r2, 0x9] - pop {r0} - bx r0 - .align 2, 0 -_0810B7F8: .4byte gSaveBlock2Ptr - thumb_func_end sub_810B7CC - - thumb_func_start TrySetMapSaveWarpStatus -TrySetMapSaveWarpStatus: @ 810B7FC - push {lr} - bl TrySetPokeCenterWarpStatus - bl TrySetReloadWarpStatus - bl sub_810B7CC - pop {r0} - bx r0 - thumb_func_end TrySetMapSaveWarpStatus - - thumb_func_start sub_810B810 -sub_810B810: @ 810B810 - ldr r0, _0810B828 @ =gSaveBlock2Ptr - ldr r2, [r0] - adds r2, 0xA8 - ldr r0, [r2] - movs r1, 0x1 - orrs r0, r1 - movs r1, 0x10 - orrs r0, r1 - movs r1, 0x20 - orrs r0, r1 - str r0, [r2] - bx lr - .align 2, 0 -_0810B828: .4byte gSaveBlock2Ptr - thumb_func_end sub_810B810 - - thumb_func_start sub_810B82C -sub_810B82C: @ 810B82C - ldr r3, _0810B854 @ =gSaveBlock2Ptr - ldr r2, [r3] - ldrb r1, [r2, 0x9] - movs r0, 0x80 - orrs r0, r1 - strb r0, [r2, 0x9] - ldr r2, [r3] - adds r2, 0xA8 - ldr r0, [r2] - movs r1, 0x2 - orrs r0, r1 - movs r1, 0x4 - orrs r0, r1 - movs r1, 0x8 - orrs r0, r1 - movs r1, 0x80 - lsls r1, 8 - orrs r0, r1 - str r0, [r2] - bx lr - .align 2, 0 -_0810B854: .4byte gSaveBlock2Ptr - thumb_func_end sub_810B82C - - .align 2, 0 @ Don't pad with nop. diff --git a/data/data_83FECCC.s b/data/data_83FECCC.s index 1d96617c4..d10a7d403 100644 --- a/data/data_83FECCC.s +++ b/data/data_83FECCC.s @@ -969,17 +969,7 @@ gUnknown_8452F6C:: @ 8452F6C gUnknown_8452F7C:: @ 8452F7C .incbin "baserom.gba", 0x452F7C, 0xC0 -gUnknown_845303C:: @ 845303C - .incbin "baserom.gba", 0x45303C, 0x56 - -gUnknown_8453092:: @ 8453092 - .incbin "baserom.gba", 0x453092, 0x2 - -gUnknown_8453094:: @ 8453094 - .incbin "baserom.gba", 0x453094, 0x4 - .section .rodata.8453F6C - // mailbox_pc.o gUnknown_8453FE8:: @ 8453FE8 .incbin "baserom.gba", 0x453FE8, 0x18 diff --git a/include/global.h b/include/global.h index 050c311e4..12381c6f4 100644 --- a/include/global.h +++ b/include/global.h @@ -209,7 +209,7 @@ struct SaveBlock2 { /*0x000*/ u8 playerName[PLAYER_NAME_LENGTH]; /*0x008*/ u8 playerGender; // MALE, FEMALE - /*0x009*/ u8 specialSaveWarp; + /*0x009*/ u8 specialSaveWarpFlags; /*0x00A*/ u8 playerTrainerId[4]; /*0x00E*/ u16 playTimeHours; /*0x010*/ u8 playTimeMinutes; diff --git a/include/save_location.h b/include/save_location.h index cd499643e..4e01c64e4 100644 --- a/include/save_location.h +++ b/include/save_location.h @@ -1,12 +1,15 @@ #ifndef GUARD_SAVE_LOCATION_H #define GUARD_SAVE_LOCATION_H -#include "global.h" +// specialSaveWarp flags +#define CONTINUE_GAME_WARP (1 << 0) +#define POKECENTER_SAVEWARP (1 << 1) +#define LOBBY_SAVEWARP (1 << 2) +#define UNK_SPECIAL_SAVE_WARP_FLAG_3 (1 << 3) -bool32 sub_81AFCEC(void); void TrySetMapSaveWarpStatus(void); -void sub_81AFDA0(void); -void sub_81AFDD0(void); bool32 IsCurMapPokeCenter(void); +void sub_810B810(void); +void sub_810B82C(void); -#endif // GUARD_SAVE_LOCATION_H +#endif // GUARD_SAVE_LOCATION_H
\ No newline at end of file diff --git a/ld_script.txt b/ld_script.txt index adbd9d0f5..e19f6c35e 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -227,7 +227,7 @@ SECTIONS { asm/pokedex_screen.o(.text); asm/list_menu.o(.text); asm/item_menu.o(.text); - asm/save_location.o(.text); + src/save_location.o(.text); src/bag.o(.text); src/trainer_pokemon_sprites.o(.text); src/vs_seeker.o(.text); @@ -421,6 +421,7 @@ SECTIONS { data/data_83FECCC.o(.rodata.841EE44); src/new_menu_helpers.o(.rodata); data/data_83FECCC.o(.rodata.841F4B4); + src/save_location.o(.rodata); src/bag.o(.rodata); src/trainer_pokemon_sprites.o(.rodata); src/vs_seeker.o(.rodata); diff --git a/src/load_save.c b/src/load_save.c index 8d09a86a8..00db946c0 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -132,28 +132,28 @@ void MoveSaveBlocks_ResetHeap(void) u32 sav2_x1_query_bit1(void) { - return gSaveBlock2Ptr->specialSaveWarp & 1; + return gSaveBlock2Ptr->specialSaveWarpFlags & 1; } void sav2_x9_clear_bit1(void) { - gSaveBlock2Ptr->specialSaveWarp &= ~1; + gSaveBlock2Ptr->specialSaveWarpFlags &= ~1; } void sub_804C1AC(void) { - gSaveBlock2Ptr->specialSaveWarp |= 1; + gSaveBlock2Ptr->specialSaveWarpFlags |= 1; } void sub_804C1C0(void) { sub_8055778(0); - gSaveBlock2Ptr->specialSaveWarp |= 1; + gSaveBlock2Ptr->specialSaveWarpFlags |= 1; } void sav2_gender2_inplace_and_xFE(void) { - gSaveBlock2Ptr->specialSaveWarp &= ~1; + gSaveBlock2Ptr->specialSaveWarpFlags &= ~1; } void SavePlayerParty(void) diff --git a/src/reset_save_heap.c b/src/reset_save_heap.c index 4347eb756..8d6e30cbf 100644 --- a/src/reset_save_heap.c +++ b/src/reset_save_heap.c @@ -10,9 +10,8 @@ void sub_8079B7C(void) { - u16 imeBackup; - - imeBackup = REG_IME; + u16 imeBackup = REG_IME; + REG_IME = 0; RegisterRamReset(0x00000001); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); diff --git a/src/save_location.c b/src/save_location.c new file mode 100644 index 000000000..71561c899 --- /dev/null +++ b/src/save_location.c @@ -0,0 +1,109 @@ +#include "global.h" +#include "save_location.h" +#include "constants/maps.h" + +static bool32 IsCurMapInLocationList(const u16 *list) +{ + s32 i; + u16 locSum = (gSaveBlock1Ptr->location.mapGroup << 8) + (gSaveBlock1Ptr->location.mapNum); + + for (i = 0; list[i] != 0xFFFF; i++) + { + if (list[i] == locSum) + return TRUE; + } + + return FALSE; +} + +static const u16 sSaveLocationPokeCenterList[] = +{ + MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F, MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F, + MAP_PEWTER_CITY_POKEMON_CENTER_1F, MAP_PEWTER_CITY_POKEMON_CENTER_2F, + MAP_CERULEAN_CITY_POKEMON_CENTER_1F, MAP_CERULEAN_CITY_POKEMON_CENTER_2F, + MAP_LAVENDER_TOWN_POKEMON_CENTER_1F, MAP_LAVENDER_TOWN_POKEMON_CENTER_2F, + MAP_VERMILION_CITY_POKEMON_CENTER_1F, MAP_VERMILION_CITY_POKEMON_CENTER_2F, + MAP_CELADON_CITY_POKEMON_CENTER_1F, MAP_CELADON_CITY_POKEMON_CENTER_2F, + MAP_FUCHSIA_CITY_POKEMON_CENTER_1F, MAP_FUCHSIA_CITY_POKEMON_CENTER_2F, + MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F, MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F, + MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F, MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F, + MAP_SAFFRON_CITY_POKEMON_CENTER_1F, MAP_SAFFRON_CITY_POKEMON_CENTER_2F, + MAP_ROUTE4_POKEMON_CENTER_1F, MAP_ROUTE4_POKEMON_CENTER_2F, + MAP_ROUTE10_POKEMON_CENTER_1F, MAP_ROUTE10_POKEMON_CENTER_2F, + MAP_ONE_ISLAND_POKEMON_CENTER_1F, MAP_ONE_ISLAND_POKEMON_CENTER_2F, + MAP_TWO_ISLAND_POKEMON_CENTER_1F, MAP_TWO_ISLAND_POKEMON_CENTER_2F, + MAP_THREE_ISLAND_POKEMON_CENTER_1F, MAP_THREE_ISLAND_POKEMON_CENTER_2F, + MAP_FOUR_ISLAND_POKEMON_CENTER_1F, MAP_FOUR_ISLAND_POKEMON_CENTER_2F, + MAP_FIVE_ISLAND_POKEMON_CENTER_1F, MAP_FIVE_ISLAND_POKEMON_CENTER_2F, + MAP_SEVEN_ISLAND_POKEMON_CENTER_1F, MAP_SEVEN_ISLAND_POKEMON_CENTER_2F, + MAP_SIX_ISLAND_POKEMON_CENTER_1F, MAP_SIX_ISLAND_POKEMON_CENTER_2F, + MAP_UNKNOWN_MAP_00_00, MAP_UNKNOWN_MAP_00_01, + MAP_UNKNOWN_MAP_00_03, MAP_UNKNOWN_MAP_00_04, + 0xFFFF, +}; + +bool32 IsCurMapPokeCenter(void) +{ + return IsCurMapInLocationList(sSaveLocationPokeCenterList); +} + +static const u16 sSaveLocationReloadLocList[] = { 0xFFFF }; + +static bool32 IsCurMapReloadLocation(void) +{ + return IsCurMapInLocationList(sSaveLocationReloadLocList); +} + +static const u16 sUnknown_8453094[] = { 0xFFFF }; + +static bool32 sub_810B75C(void) +{ + return IsCurMapInLocationList(sUnknown_8453094); +} + +static void TrySetPokeCenterWarpStatus(void) +{ + if (IsCurMapPokeCenter() == FALSE) + gSaveBlock2Ptr->specialSaveWarpFlags &= ~(POKECENTER_SAVEWARP); + else + gSaveBlock2Ptr->specialSaveWarpFlags |= POKECENTER_SAVEWARP; +} + +static void TrySetReloadWarpStatus(void) +{ + if (!IsCurMapReloadLocation()) + gSaveBlock2Ptr->specialSaveWarpFlags &= ~(LOBBY_SAVEWARP); + else + gSaveBlock2Ptr->specialSaveWarpFlags |= LOBBY_SAVEWARP; +} + +static void sub_810B7CC(void) +{ + if (!sub_810B75C()) + gSaveBlock2Ptr->specialSaveWarpFlags &= ~(UNK_SPECIAL_SAVE_WARP_FLAG_3); + else + gSaveBlock2Ptr->specialSaveWarpFlags |= UNK_SPECIAL_SAVE_WARP_FLAG_3; +} + +void TrySetMapSaveWarpStatus(void) +{ + TrySetPokeCenterWarpStatus(); + TrySetReloadWarpStatus(); + sub_810B7CC(); +} + +void sub_810B810(void) +{ + gSaveBlock2Ptr->field_A8 |= 0x1; + gSaveBlock2Ptr->field_A8 |= 0x10; + gSaveBlock2Ptr->field_A8 |= 0x20; +} + +void sub_810B82C(void) +{ + gSaveBlock2Ptr->specialSaveWarpFlags |= 0x80; + gSaveBlock2Ptr->field_A8 |= 0x2; + gSaveBlock2Ptr->field_A8 |= 0x4; + gSaveBlock2Ptr->field_A8 |= 0x8; + gSaveBlock2Ptr->field_A8 |= 0x8000; +} |