diff options
Diffstat (limited to 'src/save_location.c')
-rw-r--r-- | src/save_location.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/save_location.c b/src/save_location.c new file mode 100644 index 000000000..9b679c7ee --- /dev/null +++ b/src/save_location.c @@ -0,0 +1,108 @@ +#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; +} |