summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-06-28 05:55:49 +0800
committerjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-06-28 05:56:28 +0800
commit8e8fe3bf443cec46c0b7cc2072748c90bedc964d (patch)
tree5e3c933e14615e7daf0ac74d77545663dd05a8d4
parentbe2010e0db8ca527693d40a6f1410000033f7e7f (diff)
finished save_location
-rw-r--r--asm/save_location.s222
-rw-r--r--data/data_83FECCC.s10
-rw-r--r--include/global.h2
-rw-r--r--include/save_location.h13
-rw-r--r--ld_script.txt3
-rw-r--r--src/load_save.c10
-rw-r--r--src/reset_save_heap.c5
-rw-r--r--src/save_location.c109
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;
+}