diff options
author | YamaArashi <shadow962@live.com> | 2016-10-02 00:43:14 -0700 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2016-10-02 00:43:14 -0700 |
commit | 179c2e5041b922fb5370e0188c90acf9f82bdf66 (patch) | |
tree | 1446578c29eb9262260af8c4b8143630dacab9f7 /src | |
parent | ee7db46023b1bde6a06f61242c7dd7c4770b6125 (diff) |
initial decompilation of some field system code
Diffstat (limited to 'src')
-rw-r--r-- | src/main_menu.c | 2 | ||||
-rw-r--r-- | src/rom4.c | 1319 |
2 files changed, 1320 insertions, 1 deletions
diff --git a/src/main_menu.c b/src/main_menu.c index 773ac06d8..d3481e3cd 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -478,7 +478,7 @@ void MainMenuPressedA(u8 taskId) DestroyTask(taskId); break; case OPTION: - gMain.field_8 = (u32)sub_80096FC; + gMain.field_8 = sub_80096FC; SetMainCallback2(CB2_InitOptionMenu); DestroyTask(taskId); break; diff --git a/src/rom4.c b/src/rom4.c new file mode 100644 index 000000000..541acd5a6 --- /dev/null +++ b/src/rom4.c @@ -0,0 +1,1319 @@ +#include "global.h" +#include "fieldmap.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "rng.h" +#include "main.h" +#include "palette.h" + +#ifdef SAPPHIRE +#define LEGENDARY_MUSIC BGM_OOAME // Heavy Rain +#else +#define LEGENDARY_MUSIC BGM_HIDERI // Drought +#endif + +struct UnkWarpStruct +{ + s8 mapGroup; + s8 mapNum; + s16 x, y; +}; + +struct UnkTVStruct +{ + u32 tv_field_0; + u32 tv_field_4; +}; + +struct UnkPlayerStruct +{ + u8 player_field_0; + u8 player_field_1; +}; + +struct UnkInputStruct +{ + u8 input_field_0; + u8 input_field_1; + u8 input_field_2; + u8 input_field_3; +}; + +extern struct WarpData gUnknown_020297F0; +extern struct WarpData gUnknown_020297F8; +extern struct WarpData gUnknown_02029800; +extern struct WarpData gUnknown_02029808; +extern struct UnkPlayerStruct gUnknown_02029810; +extern u16 gUnknown_02029814; +extern u8 gUnknown_02029816; + +extern void (*gUnknown_03000584)(void); + +extern void (*gUnknown_0300485C)(void); + +extern struct UnkTVStruct gUnknown_03004870; + +extern u8 gUnknown_0819FC74[]; +extern u8 gUnknown_0819FC9F[]; + +extern struct MapData * const gMapAttributes[]; +extern struct MapHeader * const * const gMapGroups[]; +extern const struct WarpData gDummyWarpData; +extern s32 gUnknown_0839ACE8; + +extern struct UnkWarpStruct *sub_80FA8CC(u8); +extern u16 VarGet(u16); +extern u8 FlagGet(u16); +extern u8 sav1_get_weather_probably(void); +extern void PlayerGetDestCoords(u16 *, u16 *); +extern u8 sub_810D32C(void); +extern u16 wild_pokemon_rand_for_map(u8 *); +extern void sub_80C76A0(void); +extern void sub_8080B60(void); +extern void sub_810CC80(void); +extern void sub_8080AC4(void); +extern void sub_8080A3C(void); +extern void atk17_seteffectuser(void); +extern void sub_80809B0(void); +extern void sub_8080990(void); +extern u8 sub_80BBB24(void); + +void sub_8053050(void); +void warp_in(void); +void sub_8053570(void); +u8 sav1_map_get_light_level(void); +u8 get_map_light_level_by_bank_and_number(s8, s8); +bool8 is_light_level_1_2_3_5_or_6(u8); +void sub_805363C(s8, s8, s8, s8, s8); +void sub_807D874(u8); +void sub_8082BD0(u16, u16); +void player_avatar_init_params_reset(void); +u8 TestPlayerAvatarFlags(u8); +u8 player_get_direction_lower_nybble(void); +u8 sub_8053B00(struct UnkPlayerStruct *playerStruct, u16, u8); +u8 sub_8053B60(struct UnkPlayerStruct *playerStruct, u8, u16, u8); +u8 MetatileBehavior_IsSurfableWaterOrUnderwater(u8); +bool8 sub_8056F24(u8); +bool8 sub_8056F08(u8); +bool8 sub_8056EAC(u8); +bool8 MetatileBehavior_IsSouthArrowWarp(u8); +bool8 MetatileBehavior_IsNorthArrowWarp(u8); +bool8 MetatileBehavior_IsWestArrowWarp(u8); +bool8 MetatileBehavior_IsEastArrowWarp(u8); +bool8 MetatileBehavior_IsLadder(u8); +u16 cur_mapdata_block_role_at_screen_center_acc_to_sav1(void); +bool32 sub_8053C44(void); +void sub_8053C98(void); +void sav1_reset_battle_music_maybe(void); +void sub_8053F0C(void); +u8 is_light_level_8_or_9(u8); +void sub_8054164(void); +u16 sub_8085514(); +u16 wild_pokemon_rand_for_map(u8 *); +void sub_8055354(void); +void c2_overworld(void); +void CB2_LoadMap2(void); +void c2_80567AC(void); +void sub_8055390(void); +void c2_exit_to_overworld_2_link(void); +void c2_exit_to_overworld_2_local(void); +void FieldClearVBlankHBlankCallbacks(void); +void SetFieldVBlankCallback(void); +void VBlankCB_Field(void); + +void sub_8052F5C(void) +{ + ScriptContext2_RunNewScript(gUnknown_0819FC74); + gSaveBlock1.money /= 2; + sp000_heal_pokemon(); + sub_8053050(); + sub_8053570(); + warp_in(); +} + +void flag_var_implications_of_teleport_(void) +{ + player_avatar_init_params_reset(); + FlagReset(2091); + FlagReset(2093); + FlagReset(2092); + FlagReset(2089); + FlagReset(2088); +} + +void new_game(void) +{ + player_avatar_init_params_reset(); + FlagReset(2091); + FlagReset(2093); + FlagReset(2092); + FlagReset(2089); + FlagReset(2088); + ScriptContext2_RunNewScript(gUnknown_0819FC9F); +} + +void sub_8053014(void) +{ + player_avatar_init_params_reset(); + FlagReset(2091); + FlagReset(2093); + FlagReset(2092); + FlagReset(2089); + FlagReset(2088); +} + +void sub_8053050(void) +{ + player_avatar_init_params_reset(); + FlagReset(2091); + FlagReset(2093); + FlagReset(2092); + FlagReset(2089); + FlagReset(2088); +} + +void sub_805308C(void) +{ + FlagReset(2092); + sub_8054164(); + wild_pokemon_reroll(); + mapnumbers_history_shift_sav1_0_2_4_out(); + sub_8134348(); +} + +void sub_80530AC(void) +{ + s32 i; + for (i = 0; i < NUM_GAME_STATS; i++) + gSaveBlock1.gameStats[i] = 0; +} + +void sav12_xor_increment(u8 index) +{ + if (index < NUM_GAME_STATS) + { + if (gSaveBlock1.gameStats[index] < 0xFFFFFF) + gSaveBlock1.gameStats[index]++; + else + gSaveBlock1.gameStats[index] = 0xFFFFFF; + } +} + +u32 sub_8053108(u8 index) +{ + if (index >= NUM_GAME_STATS) + return 0; + + return gSaveBlock1.gameStats[index]; +} + +void sav12_xor_set(u8 index, u32 value) +{ + if (index < NUM_GAME_STATS) + gSaveBlock1.gameStats[index] = value; +} + +void sub_8053154(void) +{ + CpuFill32(0, gSaveBlock1.mapObjectTemplates, sizeof(gSaveBlock1.mapObjectTemplates)); + CpuCopy32(gMapHeader.events->mapObjects, + gSaveBlock1.mapObjectTemplates, + gMapHeader.events->mapObjectCount * sizeof(struct MapObjectTemplate)); +} + +void sub_8053198(void) +{ + struct MapObjectTemplate *mapObjectTemplates = gSaveBlock1.mapObjectTemplates; + s32 i; + for (i = 0; i < 64; i++) + mapObjectTemplates[i].script = gMapHeader.events->mapObjects[i].script; +} + +void update_saveblock1_field_object_coords(u8 localId, s16 x, s16 y) +{ + s32 i; + for (i = 0; i < 64; i++) + { + struct MapObjectTemplate *mapObjectTemplate = &gSaveBlock1.mapObjectTemplates[i]; + if (mapObjectTemplate->localId == localId) + { + mapObjectTemplate->x = x; + mapObjectTemplate->y = y; + break; + } + } +} + +void update_saveblock1_field_object_movement_behavior(u8 localId, u8 movementType) +{ + s32 i = 0; + struct MapObjectTemplate *mapObjectTemplate = gSaveBlock1.mapObjectTemplates; + do + { + if (mapObjectTemplate->localId == localId) + { + mapObjectTemplate->movementType = movementType; + break; + } + mapObjectTemplate++; + i++; + } while (i < 64); +} + +void mapdata_load_assets_to_gpu_and_full_redraw(void) +{ + move_tilemap_camera_to_upper_left_corner(); + copy_map_tileset1_tileset2_to_vram(gMapHeader.mapData); + apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + DrawWholeMapView(); + cur_mapheader_run_tileset_funcs_after_some_cpuset(); +} + +struct MapData *get_mapdata_header(void) +{ + u16 mapDataId = gSaveBlock1.mapDataId; + if (mapDataId) + return gMapAttributes[mapDataId - 1]; + return NULL; +} + +void warp_shift(void) +{ + gUnknown_020297F0 = gSaveBlock1.location; + gSaveBlock1.location = gUnknown_020297F8; + gUnknown_02029800 = gDummyWarpData; + gUnknown_02029808 = gDummyWarpData; +} + +void warp_set(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp->mapGroup = mapGroup; + warp->mapNum = mapNum; + warp->warpId = warpId; + warp->x = x; + warp->y = y; +} + +bool32 warp_data_is_not_neg_1(struct WarpData *warp) +{ + if (warp->mapGroup != -1) + return FALSE; + if (warp->mapNum != -1) + return FALSE; + if (warp->warpId != -1) + return FALSE; + if (warp->x != -1) + return FALSE; + if (warp->y != -1) + return FALSE; + return TRUE; +} + +struct MapHeader * const get_mapheader_by_bank_and_number(u16 mapGroup, u16 mapNum) +{ + return gMapGroups[mapGroup][mapNum]; +} + +struct MapHeader * const warp1_get_mapheader(void) +{ + return get_mapheader_by_bank_and_number(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum); +} + +void set_current_map_header_from_sav1_save_old_name(void) +{ + struct MapHeader *dest = &gMapHeader; + struct MapHeader *src = get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); + *dest = *src; + gSaveBlock1.mapDataId = dest->mapDataId; + dest->mapData = get_mapdata_header(); +} + +void sub_805338C(void) +{ + struct MapHeader *dest = &gMapHeader; + struct MapHeader *src = get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); + *dest = *src; + dest->mapData = get_mapdata_header(); +} + +void sub_80533CC(void) +{ + if (gSaveBlock1.location.warpId >= 0 && gSaveBlock1.location.warpId < gMapHeader.events->warpCount) + { + gSaveBlock1.pos.x = gMapHeader.events->warps[gSaveBlock1.location.warpId].x; + gSaveBlock1.pos.y = gMapHeader.events->warps[gSaveBlock1.location.warpId].y; + } + else if (gSaveBlock1.location.x >= 0 && gSaveBlock1.location.y >= 0) + { + gSaveBlock1.pos.x = gSaveBlock1.location.x; + gSaveBlock1.pos.y = gSaveBlock1.location.y; + } + else + { + gSaveBlock1.pos.x = gMapHeader.mapData->width / 2; + gSaveBlock1.pos.y = gMapHeader.mapData->height / 2; + } +} + +void warp_in(void) +{ + warp_shift(); + set_current_map_header_from_sav1_save_old_name(); + sub_80533CC(); +} + +void warp1_set(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gUnknown_020297F8, mapGroup, mapNum, warpId, x, y); +} + +void warp1_set_2(s8 mapGroup, s8 mapNum, s8 warpId) +{ + warp1_set(mapGroup, mapNum, warpId, -1, -1); +} + +void saved_warp2_set(int unused, s8 mapGroup, s8 mapNum, s8 warpId) +{ + warp_set(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, gSaveBlock1.pos.x, gSaveBlock1.pos.y); +} + +void saved_warp2_set_2(int unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, x, y); +} + +void copy_saved_warp2_bank_and_enter_x_to_warp1(void) +{ + gUnknown_020297F8 = gSaveBlock1.warp2; +} + +void sub_8053538(u8 a1) +{ + struct UnkWarpStruct *warp = sub_80FA8CC(a1); + if (warp) + warp1_set(warp->mapGroup, warp->mapNum, -1, warp->x, warp->y); +} + +void sub_8053570(void) +{ + gUnknown_020297F8 = gSaveBlock1.warp3; +} + +void sub_8053588(u8 a1) +{ + struct UnkWarpStruct *warp = sub_80FA8CC(a1); + if (warp) + warp_set(&gSaveBlock1.warp3, warp->mapGroup, warp->mapNum, -1, warp->x, warp->y); +} + +void sub_80535C4(u16 a1, u16 a2) +{ + u8 v4 = sav1_map_get_light_level(); + u8 v5 = get_map_light_level_by_bank_and_number(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum); + if (is_light_level_1_2_3_5_or_6(v4) && is_light_level_1_2_3_5_or_6(v5) != TRUE) + sub_805363C(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, a1 - 7, a2 - 6); +} + +void sub_805363C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gSaveBlock1.warp4, mapGroup, mapNum, warpId, x, y); +} + +void sub_8053678(void) +{ + gUnknown_020297F8 = gSaveBlock1.warp4; +} + +void sub_8053690(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gUnknown_02029800, mapGroup, mapNum, warpId, x, y); +} + +void warp1_set_to_warp2(void) +{ + gUnknown_020297F8 = gUnknown_02029800; +} + +void sub_80536E4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gUnknown_02029808, mapGroup, mapNum, warpId, x, y); +} + +void sub_8053720(s16 x, s16 y) +{ + if (warp_data_is_not_neg_1(&gUnknown_02029808) == TRUE) + { + gUnknown_020297F8 = gUnknown_020297F0; + } + else + { + warp1_set(gUnknown_02029808.mapGroup, gUnknown_02029808.mapNum, -1, x, y); + } +} + +void sub_8053778(void) +{ + gUnknown_020297F8 = gSaveBlock1.warp1; +} + +void unref_sub_8053790(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +{ + warp_set(&gSaveBlock1.warp1, mapGroup, mapNum, warpId, x, y); +} + +void sub_80537CC(u8 a1) +{ + struct UnkWarpStruct *warp = sub_80FA8CC(a1); + if (warp) + warp_set(&gSaveBlock1.warp1, warp->mapGroup, warp->mapNum, -1, warp->x, warp->y); +} + +void gpu_sync_bg_hide(void) +{ + gSaveBlock1.warp1 = gSaveBlock1.warp2; +} + +struct MapConnection *sub_8053818(u8 dir) +{ + s32 i; + s32 count = gMapHeader.connections->count; + struct MapConnection *connection = gMapHeader.connections->connections; + + if (connection == NULL) + return NULL; + + i = 0; + + while (i < count) + { + if (connection->direction == dir) + return connection; + i++; + connection++; + } + + return NULL; +} + +bool8 sub_8053850(u8 dir, u16 x, u16 y) +{ + struct MapConnection *connection = sub_8053818(dir); + if (connection) + { + warp1_set(connection->mapGroup, connection->mapNum, -1, x, y); + } + else + { + mapheader_run_script_with_tag_x6(); + if (warp_data_is_not_neg_1(&gUnknown_02029800)) + return FALSE; + warp1_set_to_warp2(); + } + return TRUE; +} + +bool8 sub_80538B0(u16 x, u16 y) +{ + return sub_8053850(CONNECTION_EMERGE, x, y); +} + +bool8 sub_80538D0(u16 x, u16 y) +{ + return sub_8053850(CONNECTION_DIVE, x, y); +} + +void sub_80538F0(u8 mapGroup, u8 mapNum) +{ + s32 i; + warp1_set(mapGroup, mapNum, -1, -1, -1); + sub_8053F0C(); + warp_shift(); + set_current_map_header_from_sav1_save_old_name(); + sub_8053154(); + sub_806906C(); + wild_pokemon_reroll(); + prev_quest_postbuffer_cursor_backup_reset(); + sub_8082BD0(mapGroup, mapNum); + InTrainerHill(); + sub_80806E4(); + sub_8054164(); + sub_8053C98(); + sav1_reset_battle_music_maybe(); + mapheader_run_script_with_tag_x3(); + not_trainer_hill_battle_pyramid(); + sub_8056D38(gMapHeader.mapData); + apply_map_tileset2_palette(gMapHeader.mapData); + for (i = 6; i < 12; i++) + sub_807D874(i); + sub_8072ED0(); + mapnumbers_history_shift_sav1_0_2_4_out(); + sub_8134394(); + sub_808073C(); + wild_encounter_reset_coro_args(); + mapheader_run_script_with_tag_x5(); + AddMapNamePopUpWindowTask(); +} + +void sub_8053994(u32 a1) +{ + bool8 v2; + bool8 v3; + + set_current_map_header_from_sav1_save_old_name(); + sub_8053154(); + v2 = is_light_level_1_2_3_5_or_6(gMapHeader.light); + v3 = is_light_level_8_or_9(gMapHeader.light); + sub_806906C(); + wild_pokemon_reroll(); + prev_quest_postbuffer_cursor_backup_reset(); + sub_8082BD0(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum); + if (a1 != 1) + InTrainerHill(); + sub_80806E4(); + sub_8054164(); + if (v2) + FlagReset(2088); + sub_8053C98(); + sav1_reset_battle_music_maybe(); + mapheader_run_script_with_tag_x3(); + mapnumbers_history_shift_sav1_0_2_4_out(); + sub_8134348(); + not_trainer_hill_battle_pyramid(); + if (a1 != 1 && v3) + { + UpdateTVScreensOnMap(gUnknown_03004870.tv_field_0, gUnknown_03004870.tv_field_4); + sub_80BBCCC(1); + } +} + +void player_avatar_init_params_reset(void) +{ + gUnknown_02029810.player_field_1 = 1; + gUnknown_02029810.player_field_0 = 1; +} + +void walkrun_find_lowest_active_bit_in_bitfield(void) +{ + gUnknown_02029810.player_field_1 = player_get_direction_lower_nybble(); + + if (TestPlayerAvatarFlags(2)) + gUnknown_02029810.player_field_0 = 2; + else if (TestPlayerAvatarFlags(4)) + gUnknown_02029810.player_field_0 = 4; + else if (TestPlayerAvatarFlags(8)) + gUnknown_02029810.player_field_0 = 8; + else if (TestPlayerAvatarFlags(0x10)) + gUnknown_02029810.player_field_0 = 16; + else + gUnknown_02029810.player_field_0 = 1; +} + +struct UnkPlayerStruct *sub_8053AA8(void) +{ + struct UnkPlayerStruct playerStruct; + u8 light = sav1_map_get_light_level(); + u16 v2 = cur_mapdata_block_role_at_screen_center_acc_to_sav1(); + u8 v4 = sub_8053B00(&gUnknown_02029810, v2, light); + playerStruct.player_field_0 = v4; + playerStruct.player_field_1 = sub_8053B60(&gUnknown_02029810, v4, v2, light); + gUnknown_02029810 = playerStruct; + return &gUnknown_02029810; +} + +u8 sub_8053B00(struct UnkPlayerStruct *playerStruct, u16 a2, u8 a3) +{ + if (a3 != 8 && FlagGet(2093)) + return 1; + if (a3 == 5) + return 16; + if (MetatileBehavior_IsSurfableWaterOrUnderwater(a2) == 1) + return 8; + if (sub_8053C44() != 1) + return 1; + if (playerStruct->player_field_0 == 2) + return 2; + if (playerStruct->player_field_0 != 4) + return 1; + return 4; +} + +u8 sub_8053B60(struct UnkPlayerStruct *playerStruct, u8 a2, u16 a3, u8 a4) +{ + if (FlagGet(2093) && a4 == 6) + return 4; + if (sub_8056F24(a3) == TRUE) + return 2; + if (sub_8056F08(a3) == TRUE || sub_8056EAC(a3) == TRUE) + return 1; + if (MetatileBehavior_IsSouthArrowWarp(a3) == TRUE) + return 2; + if (MetatileBehavior_IsNorthArrowWarp(a3) == TRUE) + return 1; + if (MetatileBehavior_IsWestArrowWarp(a3) == TRUE) + return 4; + if (MetatileBehavior_IsEastArrowWarp(a3) == TRUE) + return 3; + if ((playerStruct->player_field_0 == 16 && a2 == 8) + || (playerStruct->player_field_0 == 8 && a2 == 16)) + return playerStruct->player_field_1; + if (MetatileBehavior_IsLadder(a3) == TRUE) + return playerStruct->player_field_1; + return 1; +} + +u16 cur_mapdata_block_role_at_screen_center_acc_to_sav1(void) +{ + return MapGridGetMetatileBehaviorAt(gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7); +} + +bool32 sub_8053C44(void) +{ + if (gSaveBlock1.location.mapGroup == 29 && (gSaveBlock1.location.mapNum == 11 || gSaveBlock1.location.mapNum == 12)) + return TRUE; + if (gMapHeader.light == 8) + return FALSE; + if (gMapHeader.light == 9) + return FALSE; + if (gMapHeader.light == 5) + return FALSE; + if (gSaveBlock1.location.mapGroup == 24 && gSaveBlock1.location.mapNum == 36) + return FALSE; + if (gSaveBlock1.location.mapGroup == 24 && gSaveBlock1.location.mapNum == 42) + return FALSE; + return TRUE; +} + +void sub_8053C98(void) +{ + if (!gMapHeader.cave) + gSaveBlock1.flashUsed = 0; + else if (FlagGet(2088)) + gSaveBlock1.flashUsed = 1; + else + gSaveBlock1.flashUsed = gUnknown_0839ACE8; +} + +void sub_8053CE4(s32 a1) +{ + if (a1 < 0 || a1 > gUnknown_0839ACE8) + a1 = 0; + gSaveBlock1.flashUsed = a1; +} + +u8 sav1_get_flash_used_on_map() +{ + return gSaveBlock1.flashUsed; +} + +void sub_8053D14(u16 mapDataId) +{ + gSaveBlock1.mapDataId = mapDataId; + gMapHeader.mapData = get_mapdata_header(); +} + +bool16 sub_8053D30(struct WarpData *warp) +{ + if (!FlagGet(2090)) + return FALSE; + if (warp->mapGroup != 0) + return FALSE; + switch (warp->mapNum) + { + case 5: + case 6: + case 7: + case 8: + return TRUE; + case 39: + case 40: + case 41: + case 42: + case 43: + return TRUE; + } + return FALSE; +} + +bool16 sub_8053D6C(struct WarpData *warp) +{ + if (VarGet(16563)) + return FALSE; + if (warp->mapGroup != 32) + return FALSE; + if (warp->mapNum == 0 || warp->mapNum == 1) + return TRUE; + return FALSE; +} + +u16 sub_8053D9C(struct WarpData *warp) +{ + if (sub_8053D30(warp) == TRUE) + return LEGENDARY_MUSIC; + else if (sub_8053D6C(warp) == TRUE) + return BGM_TOZAN; + else + return get_mapheader_by_bank_and_number(warp->mapGroup, warp->mapNum)->music; +} + +u16 sav1_map_get_music(void) +{ + u16 music; + + if (gSaveBlock1.location.mapGroup == 0 + && gSaveBlock1.location.mapNum == 26 + && sav1_get_weather_probably() == 8) + return BGM_ASHROAD; + + music = sub_8053D9C(&gSaveBlock1.location); + if (music != 0x7FFF) + { + return music; + } + else + { + if (gSaveBlock1.pos.x < 24) + return BGM_DOORO_X1; + else + return BGM_GRANROAD; + } +} + +u16 warp1_target_get_music(void) +{ + u16 music = sub_8053D9C(&gUnknown_020297F8); + if (music != 0x7FFF) + { + return music; + } + else + { + if (gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 2) + return BGM_DOORO_X1; + else + return BGM_GRANROAD; + } +} + +void call_map_music_set_to_zero(void) +{ + ResetMapMusic(); +} + +void sub_8053E90(void) +{ + u16 music = sav1_map_get_music(); + + if (music != LEGENDARY_MUSIC) + { + if (gSaveBlock1.battleMusic) + music = gSaveBlock1.battleMusic; + else if (sav1_map_get_light_level() == 5) + music = BGM_DEEPDEEP; + else if (TestPlayerAvatarFlags(8)) + music = BGM_NAMINORI; + } + + if (music != GetCurrentMapMusic()) + PlayNewMapMusic(music); +} + +void sav1_set_battle_music_maybe(u16 songNum) +{ + gSaveBlock1.battleMusic = songNum; +} + +void sav1_reset_battle_music_maybe(void) +{ + gSaveBlock1.battleMusic = 0; +} + +void sub_8053F0C(void) +{ + if (FlagGet(16385) != TRUE) + { + u16 newMusic = warp1_target_get_music(); + u16 currentMusic = GetCurrentMapMusic(); + if (newMusic != LEGENDARY_MUSIC) + { + if (currentMusic == BGM_DEEPDEEP || currentMusic == BGM_NAMINORI) + return; + if (TestPlayerAvatarFlags(8)) + newMusic = BGM_NAMINORI; + } + if (newMusic != currentMusic) + { + if (TestPlayerAvatarFlags(6)) + FadeOutAndFadeInNewMapMusic(newMusic, 4, 4); + else + FadeOutAndPlayNewMapMusic(newMusic, 8); + } + } +} + +void sub_8053F84(void) +{ + u16 currentMusic = GetCurrentMapMusic(); + if (currentMusic != sav1_map_get_music()) + FadeOutAndPlayNewMapMusic(sav1_map_get_music(), 8); +} + +void sub_8053FB0(u16 music) +{ + u16 currentMusic = GetCurrentMapMusic(); + if (currentMusic != music && currentMusic != LEGENDARY_MUSIC) + FadeOutAndPlayNewMapMusic(music, 8); +} + +u8 is_warp1_light_level_8_or_9(void) +{ + struct MapHeader *mapHeader = warp1_get_mapheader(); + if (is_light_level_8_or_9(mapHeader->light) == TRUE) + return 2; + else + return 4; +} + +void sub_8053FF8(void) +{ + u16 music = warp1_target_get_music(); + if (FlagGet(16385) != TRUE && music != GetCurrentMapMusic()) + { + u8 speed = is_warp1_light_level_8_or_9(); + FadeOutMapMusic(speed); + } +} + +bool8 sub_8054034(void) +{ + return IsNotWaitingForBGMStop(); +} + +void sub_8054044(void) +{ + FadeOutMapMusic(4); +} + +void sub_8054050(void) +{ + s16 x, y; + PlayerGetDestCoords((u16 *)&x, (u16 *)&y); + if (gUnknown_02029816 != 1 + || MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y))) + { + s8 pan = (Random() % 88) + 212; + s8 volume = (Random() % 30) + 50; + PlayCry2(gUnknown_02029814, pan, volume, 1); + } +} + +void sub_80540D0(s16 *a1, u16 *a2) +{ + switch (*a1) + { + case 0: + if (!gUnknown_02029814) + *a1 = 4; + else + *a1 = 1; + break; + case 1: + *a2 = (Random() % 2400) + 1200; + *a1 = 3; + break; + case 2: + *a2 = (Random() % 1200) + 1200; + *a1 = 3; + break; + case 3: + (*a2)--; + if (*a2 == 0) + { + sub_8054050(); + *a1 = 2; + } + break; + case 4: + break; + } +} + +void sub_8054164(void) +{ + if ((gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 45) && !sub_810D32C()) + { + gUnknown_02029816 = 1; + gUnknown_02029814 = sub_8085514(); + } + else + { + gUnknown_02029814 = wild_pokemon_rand_for_map(&gUnknown_02029816); + } +} + +u8 get_map_light_level_by_bank_and_number(s8 mapGroup, s8 mapNum) +{ + return get_mapheader_by_bank_and_number(mapGroup, mapNum)->light; +} + +u8 get_map_light_level_from_warp(struct WarpData *warp) +{ + return get_map_light_level_by_bank_and_number(warp->mapGroup, warp->mapNum); +} + +u8 sav1_map_get_light_level(void) +{ + return get_map_light_level_from_warp(&gSaveBlock1.location); +} + +u8 get_map_light_from_warp0(void) +{ + return get_map_light_level_from_warp(&gUnknown_020297F0); +} + +bool8 is_light_level_1_2_3_5_or_6(u8 a1) +{ + if (a1 == 3 || a1 == 1 || a1 == 5 || a1 == 2 || a1 == 6) + return TRUE; + else + return FALSE; +} + +bool8 is_light_level_1_2_3_or_6(u8 a1) +{ + if (a1 == 3 || a1 == 1 || a1 == 6 || a1 == 2) + return TRUE; + else + return FALSE; +} + +bool8 is_light_level_8_or_9(u8 a1) +{ + if (a1 == 8 || a1 == 9) + return TRUE; + else + return FALSE; +} + +u8 unref_sub_8054260(void) +{ + return get_mapheader_by_bank_and_number(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum)->name; +} + +u8 sav1_map_get_name(void) +{ + return get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->name; +} + +u8 sav1_map_get_battletype(void) +{ + return get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType; +} + +void ResetSafariZoneFlag_(void) +{ + ResetSafariZoneFlag(); +} + +bool32 is_c1_link_related_active(void) +{ + if (gMain.callback1 == sub_8055354) + return TRUE; + else + return FALSE; +} + +void c1_overworld_normal(u16 newKeys, u16 heldKeys) +{ + struct UnkInputStruct inputStruct; + sub_8059204(); + sub_8067EEC(&inputStruct); + process_overworld_input(&inputStruct, newKeys, heldKeys); + if (!ScriptContext2_IsEnabled()) + { + if (sub_8068024(&inputStruct) == 1) + { + ScriptContext2_Enable(); + HideMapNamePopUpWindow(); + } + else + { + player_step(inputStruct.input_field_2, newKeys, heldKeys); + } + } +} + +void c1_overworld(void) +{ + if (gMain.callback2 == c2_overworld) + c1_overworld_normal(gMain.newKeys, gMain.heldKeys); +} + +void c2_overworld_basic(void) +{ + ScriptContext2_RunScript(); + RunTasks(); + AnimateSprites(); + CameraUpdate(); + UpdateCameraPanning(); + BuildOamBuffer(); + UpdatePaletteFade(); + sub_8072EDC(); +} + +void sub_8054398(void) +{ + c2_overworld_basic(); +} + +void c2_overworld(void) +{ + int fading = (gPaletteFade.active != 0); + if (fading) + SetVBlankCallback(NULL); + c2_overworld_basic(); + if (fading) + SetFieldVBlankCallback(); +} + +void set_callback1(MainCallback cb) +{ + gMain.callback1 = cb; +} + +void sub_80543DC(void (*a1)(void)) +{ + gUnknown_03000584 = a1; +} + +void sub_80543E8(void) +{ + if (gUnknown_0300485C) + gUnknown_0300485C(); + else + mapldr_default(); + gUnknown_0300485C = NULL; +} + +void CB2_NewGame(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + NewGameInitData(); + player_avatar_init_params_reset(); + PlayTimeCounter_Start(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + gUnknown_0300485C = sub_80C76A0; + do_load_map_stuff_loop(&gMain.state); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); +} + +void c2_whiteout(void) +{ + u8 val; + gMain.state++; + if (gMain.state >= 120) + { + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + sub_8052F5C(); + player_avatar_init_params_reset(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + gUnknown_0300485C = sub_8080B60; + val = 0; + do_load_map_stuff_loop(&val); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); + } +} + +void CB2_LoadMap(void) +{ + FieldClearVBlankHBlankCallbacks(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + set_callback1(NULL); + SetMainCallback2(sub_810CC80); + gMain.field_8 = CB2_LoadMap2; +} + +void CB2_LoadMap2(void) +{ + do_load_map_stuff_loop(&gMain.state); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); +} + +void sub_8054534(void) +{ + if (!gMain.state) + { + FieldClearVBlankHBlankCallbacks(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + set_callback1(NULL); + } + if (sub_805493C(&gMain.state, 1)) + { + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); + } +} + +void sub_8054588(void) +{ + FieldClearVBlankHBlankCallbacks(); + gUnknown_0300485C = sub_8080AC4; + SetMainCallback2(c2_80567AC); +} + +void c2_80567AC(void) +{ + if (sub_805483C(&gMain.state)) + { + SetFieldVBlankCallback(); + set_callback1(sub_8055354); + sub_80543DC(sub_8055390); + SetMainCallback2(c2_overworld); + } +} + +void c2_exit_to_overworld_2_switch(void) +{ + if (is_c1_link_related_active() == TRUE) + { + SetMainCallback2(c2_exit_to_overworld_2_link); + } + else + { + FieldClearVBlankHBlankCallbacks(); + SetMainCallback2(c2_exit_to_overworld_2_local); + } +} + +void c2_exit_to_overworld_2_local(void) +{ + if (sub_8054A4C(&gMain.state)) + { + SetFieldVBlankCallback(); + SetMainCallback2(c2_overworld); + } +} + +void c2_exit_to_overworld_2_link(void) +{ + if (!sub_8055870() && sub_8054A9C(&gMain.state)) + SetMainCallback2(c2_overworld); +} + +void sub_805465C(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + sub_8054F70(); + set_callback1(sub_8055354); + sub_80543DC(sub_8055390); + gUnknown_0300485C = sub_8080A3C; + ScriptContext1_Init(); + ScriptContext2_Disable(); + c2_exit_to_overworld_2_switch(); +} + +void sub_805469C(void) +{ + FieldClearVBlankHBlankCallbacks(); + gUnknown_0300485C = atk17_seteffectuser; + c2_exit_to_overworld_2_switch(); +} + +void sub_80546B8(void) +{ + FieldClearVBlankHBlankCallbacks(); + gUnknown_0300485C = sub_80809B0; + c2_exit_to_overworld_2_switch(); +} + +void c2_exit_to_overworld_1_continue_scripts_restart_music(void) +{ + FieldClearVBlankHBlankCallbacks(); + gUnknown_0300485C = sub_8080990; + c2_exit_to_overworld_2_switch(); +} + +void sub_80546F0(void) +{ + FieldClearVBlankHBlankCallbacks(); + gUnknown_0300485C = sub_8080B60; + c2_exit_to_overworld_2_switch(); +} + +void sub_805470C(void) +{ + if (gMapHeader.flags == 1 && sub_80BBB24() == 1) + AddMapNamePopUpWindowTask(); + sub_8080B60(); +} + +void CB2_ContinueSavedGame(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + sub_805338C(); + sub_8053198(); + sub_806451C(); + InTrainerHill(); + sub_805308C(); + sub_8055FC0(); + PlayTimeCounter_Start(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + if (sub_80479F8() == 1) + { + sub_8047A04(); + sub_8053778(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + } + else + { + gUnknown_0300485C = sub_805470C; + set_callback1(c1_overworld); + c2_exit_to_overworld_2_switch(); + } +} + +void FieldClearVBlankHBlankCallbacks(void) +{ + u16 savedIme = REG_IME; + REG_IME = 0; + REG_IE &= ~INTR_FLAG_HBLANK; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); +} + +void SetFieldVBlankCallback(void) +{ + SetVBlankCallback(VBlankCB_Field); +} + +void VBlankCB_Field(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + sub_8089668(); + sub_8057A58(); + TransferPlttBuffer(); + sub_8072E74(); +} |