finished save_location

This commit is contained in:
jiangzhengwenjz
2019-06-28 05:55:49 +08:00
parent be2010e0db
commit 8e8fe3bf44
8 changed files with 127 additions and 247 deletions
-222
View File
@@ -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.
-10
View File
@@ -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
+1 -1
View File
@@ -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;
+8 -5
View File
@@ -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
+2 -1
View File
@@ -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);
+5 -5
View File
@@ -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)
+2 -3
View File
@@ -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);
+109
View File
@@ -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;
}