diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_setup.c | 4 | ||||
-rw-r--r-- | src/cable_club.c | 2 | ||||
-rw-r--r-- | src/coord_event_weather.c | 66 | ||||
-rw-r--r-- | src/field_control_avatar.c | 1183 | ||||
-rw-r--r-- | src/field_fadetransition.c | 18 | ||||
-rw-r--r-- | src/field_specials.c | 8 | ||||
-rw-r--r-- | src/metatile_behavior.c | 10 | ||||
-rw-r--r-- | src/region_map.c | 2 | ||||
-rw-r--r-- | src/scrcmd.c | 73 | ||||
-rw-r--r-- | src/script.c | 96 | ||||
-rw-r--r-- | src/script_menu.c | 2 |
11 files changed, 1324 insertions, 140 deletions
diff --git a/src/battle_setup.c b/src/battle_setup.c index 1abbbcec6..df8a3ac45 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -974,7 +974,7 @@ const u8 *BattleSetup_GetScriptAddrAfterBattle(void) if (sTrainerBattleEndScript != NULL) return sTrainerBattleEndScript; else - return Test_EventScript_Sign; + return EventScript_TestSignpostMsg; } const u8 *BattleSetup_GetTrainerPostBattleScript(void) @@ -982,7 +982,7 @@ const u8 *BattleSetup_GetTrainerPostBattleScript(void) if (sTrainerABattleScriptRetAddr != NULL) return sTrainerABattleScriptRetAddr; else - return Test_EventScript_Sign; + return EventScript_TestSignpostMsg; } void ShowTrainerCantBattleSpeech(void) diff --git a/src/cable_club.c b/src/cable_club.c index b7f9b9114..bc41ca4f6 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -762,7 +762,7 @@ void CleanupLinkRoomState(void) LoadPlayerParty(); SavePlayerBag(); } - copy_saved_warp2_bank_and_enter_x_to_warp1(127); + SetWarpDestinationToDynamicWarp(127); } void ExitLinkRoom(void) diff --git a/src/coord_event_weather.c b/src/coord_event_weather.c index 4dbdd574b..ca1da728d 100644 --- a/src/coord_event_weather.c +++ b/src/coord_event_weather.c @@ -1,46 +1,48 @@ #include "global.h" +#include "constants/weather.h" -void nullsub_27(void) {} -void nullsub_28(void) {} -void nullsub_29(void) {} -void nullsub_30(void) {} -void nullsub_31(void) {} -void nullsub_32(void) {} -void nullsub_33(void) {} -void nullsub_34(void) {} -void nullsub_35(void) {} -void nullsub_36(void) {} -void nullsub_37(void) {} -void nullsub_38(void) {} -void nullsub_39(void) {} +// These were all dummied out because it's always sunny in Viridian +void WeatherCoordEvent_SunnyClouds(void) {} +void WeatherCoordEvent_Sunny(void) {} +void WeatherCoordEvent_Rain(void) {} +void WeatherCoordEvent_Snow(void) {} +void WeatherCoordEvent_RainThunderstorm(void) {} +void WeatherCoordEvent_FogHorizontal(void) {} +void WeatherCoordEvent_VolcanicAsh(void) {} +void WeatherCoordEvent_Sandstorm(void) {} +void WeatherCoordEvent_FogDiagonal(void) {} +void WeatherCoordEvent_Underwater(void) {} +void WeatherCoordEvent_Shade(void) {} +void WeatherCoordEvent_Route119Cycle(void) {} +void WeatherCoordEvent_Route123Cycle(void) {} -struct { +static struct { u8 weatherId; void (*callback)(void); -} const gUnknown_83A72A8[] = { - {0x01, nullsub_27}, - {0x02, nullsub_28}, - {0x03, nullsub_29}, - {0x04, nullsub_30}, - {0x05, nullsub_31}, - {0x06, nullsub_32}, - {0x07, nullsub_33}, - {0x08, nullsub_34}, - {0x09, nullsub_35}, - {0x0a, nullsub_36}, - {0x0b, nullsub_37}, - {0x14, nullsub_38}, - {0x15, nullsub_39} +} const sWeatherCoordEventFuncs[] = { + {WEATHER_SUNNY_CLOUDS, WeatherCoordEvent_SunnyClouds }, + {WEATHER_SUNNY, WeatherCoordEvent_Sunny }, + {WEATHER_RAIN, WeatherCoordEvent_Rain }, + {WEATHER_SNOW, WeatherCoordEvent_Snow }, + {WEATHER_RAIN_THUNDERSTORM, WeatherCoordEvent_RainThunderstorm}, + {WEATHER_FOG_HORIZONTAL, WeatherCoordEvent_FogHorizontal }, + {WEATHER_VOLCANIC_ASH, WeatherCoordEvent_VolcanicAsh }, + {WEATHER_SANDSTORM, WeatherCoordEvent_Sandstorm }, + {WEATHER_FOG_DIAGONAL, WeatherCoordEvent_FogDiagonal }, + {WEATHER_UNDERWATER, WeatherCoordEvent_Underwater }, + {WEATHER_SHADE, WeatherCoordEvent_Shade }, + {WEATHER_ROUTE119_CYCLE, WeatherCoordEvent_Route119Cycle }, + {WEATHER_ROUTE123_CYCLE, WeatherCoordEvent_Route123Cycle } }; -void trigger_activate_weather(u8 weatherId) +void DoCoordEventWeather(u8 weatherId) { u8 i; - for (i = 0; i < NELEMS(gUnknown_83A72A8); i++) + for (i = 0; i < NELEMS(sWeatherCoordEventFuncs); i++) { - if (gUnknown_83A72A8[i].weatherId == weatherId) + if (sWeatherCoordEventFuncs[i].weatherId == weatherId) { - gUnknown_83A72A8[i].callback(); + sWeatherCoordEventFuncs[i].callback(); return; } } diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c new file mode 100644 index 000000000..89b90ca92 --- /dev/null +++ b/src/field_control_avatar.c @@ -0,0 +1,1183 @@ +#include "global.h" +#include "gflib.h" +#include "bike.h" +#include "coord_event_weather.h" +#include "daycare.h" +#include "event_data.h" +#include "event_object_movement.h" +#include "event_scripts.h" +#include "fieldmap.h" +#include "field_control_avatar.h" +#include "field_fadetransition.h" +#include "field_player_avatar.h" +#include "field_poison.h" +#include "field_specials.h" +#include "item_menu.h" +#include "link.h" +#include "menews_jisan.h" +#include "metatile_behavior.h" +#include "overworld.h" +#include "renewable_hidden_items.h" +#include "quest_log.h" +#include "safari_zone.h" +#include "script.h" +#include "start_menu.h" +#include "trainer_see.h" +#include "vs_seeker.h" +#include "wild_encounter.h" +#include "constants/songs.h" +#include "constants/event_bg.h" +#include "constants/event_objects.h" +#include "constants/maps.h" +#include "constants/metatile_behaviors.h" + +#define SIGNPOST_POKECENTER 0 +#define SIGNPOST_POKEMART 1 +#define SIGNPOST_INDIGO_1 2 +#define SIGNPOST_INDIGO_2 3 +#define SIGNPOST_SCRIPTED 240 +#define SIGNPOST_NA 255 + +static void QuestLogOverrideJoyVars(struct FieldInput *input, u16 *newKeys, u16 *heldKeys); +static void Task_QuestLogPlayback_OpenStartMenu(u8 taskId); +static void GetPlayerPosition(struct MapPosition * position); +static void GetInFrontOfPlayerPosition(struct MapPosition * position); +static u16 GetPlayerCurMetatileBehavior(void); +static bool8 TryStartInteractionScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); +static const u8 *GetInteractionScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); +static const u8 *GetInteractedObjectEventScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); +static const u8 *GetInteractedBackgroundEventScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); +static const struct BgEvent *GetBackgroundEventAtPosition(struct MapHeader *, u16, u16, u8); +static const u8 *GetInteractedMetatileScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); +static const u8 *GetInteractedWaterScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); +static bool8 TryStartStepBasedScript(struct MapPosition * position, u16 metatileBehavior, u16 playerDirection); +static bool8 TryStartCoordEventScript(struct MapPosition * position); +static bool8 TryStartMiscWalkingScripts(u16 metatileBehavior); +static bool8 TryStartStepCountScript(u16 metatileBehavior); +static void UpdateHappinessStepCounter(void); +static bool8 UpdatePoisonStepCounter(void); +static bool8 CheckStandardWildEncounter(u32 encounter); +static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); +static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection); +static u8 GetFacingSignpostType(u16 metatileBehvaior, u8 direction); +static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition * position); +static bool8 TryArrowWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); +static bool8 TryStartWarpEventScript(struct MapPosition * position, u16 metatileBehavior); +static bool8 IsWarpMetatileBehavior(u16 metatileBehavior); +static void SetupWarp(struct MapHeader * mapHeader, s8 warpId, struct MapPosition * position); +static bool8 IsArrowWarpMetatileBehavior(u16 metatileBehavior, u8 playerDirection); +static s8 GetWarpEventAtMapPosition(struct MapHeader * mapHeader, struct MapPosition * mapPosition); +static bool8 TryDoorWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); +static s8 GetWarpEventAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z); +static const u8 *GetCoordEventScriptAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z); + +struct FieldInput gInputToStoreInQuestLogMaybe; + +void FieldClearPlayerInput(struct FieldInput *input) +{ + input->pressedAButton = FALSE; + input->checkStandardWildEncounter = FALSE; + input->pressedStartButton = FALSE; + input->pressedSelectButton = FALSE; + input->heldDirection = FALSE; + input->heldDirection2 = FALSE; + input->tookStep = FALSE; + input->pressedBButton = FALSE; + input->pressedRButton = FALSE; + input->input_field_1_0 = FALSE; + input->input_field_1_1 = FALSE; + input->input_field_1_2 = FALSE; + input->input_field_1_3 = FALSE; + input->dpadDirection = 0; +} + +void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) +{ + u8 runningState = gPlayerAvatar.runningState; + u8 tileTransitionState = gPlayerAvatar.tileTransitionState; + bool8 forcedMove = MetatileBehavior_IsForcedMovementTile(GetPlayerCurMetatileBehavior()); + + if (!ScriptContext1_IsScriptSetUp() && IsQuestLogInputDpad() == TRUE) + { + QuestLogOverrideJoyVars(input, &newKeys, &heldKeys); + } + if ((tileTransitionState == T_TILE_CENTER && forcedMove == FALSE) || tileTransitionState == T_NOT_MOVING) + { + if (GetPlayerSpeed() != 4) + { + if ((newKeys & START_BUTTON) && !(gPlayerAvatar.flags & 0x40)) + input->pressedStartButton = TRUE; + if (gQuestLogState != QL_STATE_2 && gQuestLogState != QL_STATE_3) + { + if (!(gPlayerAvatar.flags & 0x40)) + { + if (newKeys & SELECT_BUTTON) + input->pressedSelectButton = TRUE; + if (newKeys & A_BUTTON) + input->pressedAButton = TRUE; + if (newKeys & B_BUTTON) + input->pressedBButton = TRUE; + if (newKeys & R_BUTTON) + input->pressedRButton = TRUE; + } + } + } + + if (gQuestLogState != QL_STATE_2 && gQuestLogState != QL_STATE_3) + { + if (heldKeys & (DPAD_UP | DPAD_DOWN | DPAD_LEFT | DPAD_RIGHT)) + { + input->heldDirection = TRUE; + input->heldDirection2 = TRUE; + } + } + + } + + if (forcedMove == FALSE) + { + if (tileTransitionState == T_TILE_CENTER && runningState == MOVING) + input->tookStep = TRUE; + if (forcedMove == FALSE && tileTransitionState == T_TILE_CENTER) + input->checkStandardWildEncounter = TRUE; + } + + if (gQuestLogState != QL_STATE_2 && gQuestLogState != QL_STATE_3) + { + if (heldKeys & DPAD_UP) + input->dpadDirection = DIR_NORTH; + else if (heldKeys & DPAD_DOWN) + input->dpadDirection = DIR_SOUTH; + else if (heldKeys & DPAD_LEFT) + input->dpadDirection = DIR_WEST; + else if (heldKeys & DPAD_RIGHT) + input->dpadDirection = DIR_EAST; + } +} + +static void QuestLogOverrideJoyVars(struct FieldInput *input, u16 *newKeys, u16 *heldKeys) +{ + switch (GetRegisteredQuestLogInput()) + { + case QL_INPUT_OFF: + break; + case QL_INPUT_UP: + *heldKeys = *newKeys = DPAD_UP; + break; + case QL_INPUT_DOWN: + *heldKeys = *newKeys = DPAD_DOWN; + break; + case QL_INPUT_LEFT: + *heldKeys = *newKeys = DPAD_LEFT; + break; + case QL_INPUT_RIGHT: + *heldKeys = *newKeys = DPAD_RIGHT; + break; + case QL_INPUT_L: + *heldKeys = *newKeys = L_BUTTON; + break; + case QL_INPUT_R: + *heldKeys = *newKeys = R_BUTTON; + break; + case QL_INPUT_START: + *heldKeys = *newKeys = START_BUTTON; + break; + case QL_INPUT_SELECT: + *heldKeys = *newKeys = SELECT_BUTTON; + break; + } + ClearQuestLogInputIsDpadFlag(); + ClearQuestLogInput(); +} + +int ProcessPlayerFieldInput(struct FieldInput *input) +{ + struct MapPosition position; + u8 playerDirection; + u16 metatileBehavior; + u32 r8; + + ResetFacingNpcOrSignPostVars(); + playerDirection = GetPlayerFacingDirection(); + GetPlayerPosition(&position); + r8 = MapGridGetMetatileAttributeAt(position.x, position.y, 0xFF); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + + FieldClearPlayerInput(&gInputToStoreInQuestLogMaybe); + gInputToStoreInQuestLogMaybe.dpadDirection = input->dpadDirection; + + if (CheckForTrainersWantingBattle() == TRUE) + return TRUE; + + if (TryRunOnFrameMapScript() == TRUE) + return TRUE; + + if (input->tookStep) + { + IncrementGameStat(GAME_STAT_STEPS); + MENewsJisanStepCounter(); + IncrementRenewableHiddenItemStepCounter(); + RunMassageCooldownStepCounter(); + IncrementResortGorgeousStepCounter(); + IncrementBirthIslandRockStepCount(); + if (TryStartStepBasedScript(&position, metatileBehavior, playerDirection) == TRUE) + { + gInputToStoreInQuestLogMaybe.tookStep = TRUE; + return TRUE; + } + } + if (input->checkStandardWildEncounter) + { + if (input->dpadDirection == 0 || input->dpadDirection == playerDirection) + { + GetInFrontOfPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) + { + gInputToStoreInQuestLogMaybe.checkStandardWildEncounter = TRUE; + return TRUE; + } + GetPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + } + } + if (input->checkStandardWildEncounter && CheckStandardWildEncounter(r8) == TRUE) + { + gInputToStoreInQuestLogMaybe.checkStandardWildEncounter = TRUE; + return TRUE; + } + if (input->heldDirection && input->dpadDirection == playerDirection) + { + if (TryArrowWarp(&position, metatileBehavior, playerDirection) == TRUE) + { + gInputToStoreInQuestLogMaybe.heldDirection = TRUE; + return TRUE; + } + } + + GetInFrontOfPlayerPosition(&position); + metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y); + if (input->heldDirection && input->dpadDirection == playerDirection) + { + if (TrySetUpWalkIntoSignpostScript(&position, metatileBehavior, playerDirection) == TRUE) + { + gInputToStoreInQuestLogMaybe.heldDirection = TRUE; + return TRUE; + } + } + + if (input->pressedAButton && TryStartInteractionScript(&position, metatileBehavior, playerDirection) == TRUE) + { + gInputToStoreInQuestLogMaybe.pressedAButton = TRUE; + return TRUE; + } + + if (input->heldDirection2 && input->dpadDirection == playerDirection) + { + if (TryDoorWarp(&position, metatileBehavior, playerDirection) == TRUE) + { + gInputToStoreInQuestLogMaybe.heldDirection2 = TRUE; + return TRUE; + } + } + + if (input->pressedStartButton) + { + gInputToStoreInQuestLogMaybe.pressedStartButton = TRUE; + FlagSet(FLAG_OPENED_START_MENU); + PlaySE(SE_WIN_OPEN); + ShowStartMenu(); + return TRUE; + } + if (input->pressedSelectButton && UseRegisteredKeyItemOnField() == TRUE) + { + gInputToStoreInQuestLogMaybe.pressedSelectButton = TRUE; + return TRUE; + } + + return FALSE; +} + +void FieldInput_HandleCancelSignpost(struct FieldInput * input) +{ + if (ScriptContext1_IsScriptSetUp() == TRUE) + { + if (gWalkAwayFromSignInhibitTimer != 0) + gWalkAwayFromSignInhibitTimer--; + else if (CanWalkAwayToCancelMsgBox() == TRUE) + { + if (input->dpadDirection != 0 && GetPlayerFacingDirection() != input->dpadDirection) + { + if (sub_80699D4() == TRUE) + return; + if (input->dpadDirection == DIR_NORTH) + RegisterQuestLogInput(QL_INPUT_UP); + else if (input->dpadDirection == DIR_SOUTH) + RegisterQuestLogInput(QL_INPUT_DOWN); + else if (input->dpadDirection == DIR_WEST) + RegisterQuestLogInput(QL_INPUT_LEFT); + else if (input->dpadDirection == DIR_EAST) + RegisterQuestLogInput(QL_INPUT_RIGHT); + ScriptContext1_SetupScript(EventScript_CancelMessageBox); + ScriptContext2_Enable(); + } + else if (input->pressedStartButton) + { + ScriptContext1_SetupScript(EventScript_CancelMessageBox); + ScriptContext2_Enable(); + if (!FuncIsActiveTask(Task_QuestLogPlayback_OpenStartMenu)) + CreateTask(Task_QuestLogPlayback_OpenStartMenu, 8); + } + } + } +} + +static void Task_QuestLogPlayback_OpenStartMenu(u8 taskId) +{ + if (!ScriptContext2_IsEnabled()) + { + PlaySE(SE_WIN_OPEN); + ShowStartMenu(); + DestroyTask(taskId); + } +} + +static void GetPlayerPosition(struct MapPosition *position) +{ + PlayerGetDestCoords(&position->x, &position->y); + position->height = PlayerGetZCoord(); +} + +static void GetInFrontOfPlayerPosition(struct MapPosition *position) +{ + s16 x, y; + + GetXYCoordsOneStepInFrontOfPlayer(&position->x, &position->y); + PlayerGetDestCoords(&x, &y); + if (MapGridGetZCoordAt(x, y) != 0) + position->height = PlayerGetZCoord(); + else + position->height = 0; +} + +static u16 GetPlayerCurMetatileBehavior(void) +{ + s16 x, y; + + PlayerGetDestCoords(&x, &y); + return MapGridGetMetatileBehaviorAt(x, y); +} + +static bool8 TryStartInteractionScript(struct MapPosition *position, u16 metatileBehavior, u8 direction) +{ + const u8 *script = GetInteractionScript(position, metatileBehavior, direction); + if (script == NULL) + return FALSE; + + // Don't play interaction sound for certain scripts. + if (script != PalletTown_PlayersHouse_2F_EventScript_PC + && script != EventScript_PC) + PlaySE(SE_SELECT); + + ScriptContext1_SetupScript(script); + return TRUE; +} + +static const u8 *GetInteractionScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) +{ + const u8 *script = GetInteractedObjectEventScript(position, metatileBehavior, direction); + if (script != NULL) + return script; + + script = GetInteractedBackgroundEventScript(position, metatileBehavior, direction); + if (script != NULL) + return script; + + script = GetInteractedMetatileScript(position, metatileBehavior, direction); + if (script != NULL) + return script; + + script = GetInteractedWaterScript(position, metatileBehavior, direction); + if (script != NULL) + return script; + + return NULL; +} + +const u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) +{ + u8 objectEventId; + s32 i; + + if (!MetatileBehavior_IsCounter(MapGridGetMetatileBehaviorAt(position->x, position->y))) + objectEventId = GetObjectEventIdByXYZ(position->x, position->y, position->height); + else + objectEventId = GetObjectEventIdByXYZ(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->height); + + if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER) + return NULL; + + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if (gLinkPlayerObjectEvents[i].active == TRUE && gLinkPlayerObjectEvents[i].objEventId == objectEventId) + return NULL; + } + + gSelectedObjectEvent = objectEventId; + gSpecialVar_LastTalked = gObjectEvents[objectEventId].localId; + gSpecialVar_Facing = direction; + return GetObjectEventScriptPointerByObjectEventId(objectEventId); +} + +static const u8 *GetInteractedObjectEventScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) +{ + u8 objectEventId; + const u8 *script; + + objectEventId = GetObjectEventIdByXYZ(position->x, position->y, position->height); + if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER) + { + if (MetatileBehavior_IsCounter(metatileBehavior) != TRUE) + return NULL; + + // Look for an object event on the other side of the counter. + objectEventId = GetObjectEventIdByXYZ(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->height); + if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER) + return NULL; + } + + if (InUnionRoom() == TRUE && !ObjectEventCheckHeldMovementStatus(&gObjectEvents[objectEventId])) + return NULL; + + gSelectedObjectEvent = objectEventId; + gSpecialVar_LastTalked = gObjectEvents[objectEventId].localId; + gSpecialVar_Facing = direction; + + script = GetObjectEventScriptPointerByObjectEventId(objectEventId); + + script = GetRamScript(gSpecialVar_LastTalked, script); + return script; +} + +static const u8 *GetInteractedBackgroundEventScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) +{ + u8 signpostType; + const struct BgEvent *bgEvent = GetBackgroundEventAtPosition(&gMapHeader, position->x - 7, position->y - 7, position->height); + + if (bgEvent == NULL) + return NULL; + if (bgEvent->bgUnion.script == NULL) + return EventScript_TestSignpostMsg; + + signpostType = GetFacingSignpostType(metatileBehavior, direction); + + switch (bgEvent->kind) + { + case BG_EVENT_PLAYER_FACING_ANY: + default: + break; + case BG_EVENT_PLAYER_FACING_NORTH: + if (direction != DIR_NORTH) + return NULL; + break; + case BG_EVENT_PLAYER_FACING_SOUTH: + if (direction != DIR_SOUTH) + return NULL; + break; + case BG_EVENT_PLAYER_FACING_EAST: + if (direction != DIR_EAST) + return NULL; + break; + case BG_EVENT_PLAYER_FACING_WEST: + if (direction != DIR_WEST) + return NULL; + break; + case 5: + case 6: + case BG_EVENT_HIDDEN_ITEM: + if (GetHiddenItemAttr((u32)bgEvent->bgUnion.script, HIDDEN_ITEM_UNDERFOOT) == TRUE) + return NULL; + gSpecialVar_0x8005 = GetHiddenItemAttr((u32)bgEvent->bgUnion.script, HIDDEN_ITEM_ID); + gSpecialVar_0x8004 = GetHiddenItemAttr((u32)bgEvent->bgUnion.script, HIDDEN_ITEM_FLAG); + gSpecialVar_0x8006 = GetHiddenItemAttr((u32)bgEvent->bgUnion.script, HIDDEN_ITEM_QUANTITY); + if (FlagGet(gSpecialVar_0x8004) == TRUE) + return NULL; + gSpecialVar_Facing = direction; + return EventScript_HiddenItemScript; + } + + if (signpostType != SIGNPOST_NA) + MsgSetSignPost(); + gSpecialVar_Facing = direction; + return bgEvent->bgUnion.script; +} + +static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) +{ + gSpecialVar_Facing = direction; + if (MetatileBehavior_IsPC(metatileBehavior) == TRUE) + return EventScript_PC; + if (MetatileBehavior_IsRegionMap(metatileBehavior) == TRUE) + return EventScript_WallTownMap; + if (MetatileBehavior_IsBookshelf(metatileBehavior) == TRUE) + return gUnknown_81A7606; + if (MetatileBehavior_IsPokeMartShelf(metatileBehavior) == TRUE) + return gUnknown_81A760F; + if (MetatileBehavior_IsFood(metatileBehavior) == TRUE) + return gUnknown_81A7618; + if (MetatileBehavior_IsImpressiveMachine(metatileBehavior) == TRUE) + return gUnknown_81A7633; + if (MetatileBehavior_IsBlueprints(metatileBehavior) == TRUE) + return gUnknown_81A763C; + if (MetatileBehavior_IsVideoGame(metatileBehavior) == TRUE) + return gUnknown_81A7621; + if (MetatileBehavior_IsBurglary(metatileBehavior) == TRUE) + return gUnknown_81A7645; + if (MetatileBehavior_IsComputer(metatileBehavior) == TRUE) + return gUnknown_81A762A; + if (MetatileBehavior_IsMBA3(metatileBehavior) == TRUE) + return TrainerTower_EventScript_ShowTime; + if (MetatileBehavior_IsPlayerFacingTVScreen(metatileBehavior, direction) == TRUE) + return gUnknown_81A764E; + if (MetatileBehavior_IsCabinet(metatileBehavior) == TRUE) + return gUnknown_81A7657; + if (MetatileBehavior_IsKitchen(metatileBehavior) == TRUE) + return gUnknown_81A7660; + if (MetatileBehavior_IsDresser(metatileBehavior) == TRUE) + return gUnknown_81A7669; + if (MetatileBehavior_IsSnacks(metatileBehavior) == TRUE) + return gUnknown_81A7672; + if (MetatileBehavior_IsPainting(metatileBehavior) == TRUE) + return gUnknown_81A767B; + if (MetatileBehavior_IsPowerPlantMachine(metatileBehavior) == TRUE) + return gUnknown_81A7684; + if (MetatileBehavior_IsTelephone(metatileBehavior) == TRUE) + return gUnknown_81A768D; + if (MetatileBehavior_IsAdvertisingPoster(metatileBehavior) == TRUE) + return gUnknown_81A7696; + if (MetatileBehavior_IsTastyFood(metatileBehavior) == TRUE) + return gUnknown_81A769F; + if (MetatileBehavior_IsTrashBin(metatileBehavior) == TRUE) + return gUnknown_81A76A8; + if (MetatileBehavior_IsCup(metatileBehavior) == TRUE) + return gUnknown_81A76B1; + if (MetatileBehavior_ReturnFalse_19(metatileBehavior) == TRUE) + return gUnknown_81A76BA; + if (MetatileBehavior_ReturnFalse_20(metatileBehavior) == TRUE) + return gUnknown_81A76C3; + if (MetatileBehavior_IsBlinkingLights(metatileBehavior) == TRUE) + return gUnknown_81A76CC; + if (MetatileBehavior_IsMB9F(metatileBehavior) == TRUE) + return gUnknown_81A76D5; + if (MetatileBehavior_IsPlayerFacingMB_8D(metatileBehavior, direction) == TRUE) + return CableClub_EventScript_81BBFD8; + if (MetatileBehavior_IsQuestionnaire(metatileBehavior) == TRUE) + return EventScript_Questionnaire; + if (MetatileBehavior_IsPlayerFacingBattleRecords(metatileBehavior, direction) == TRUE) + return CableClub_EventScript_ShowBattleRecords; + if (MetatileBehavior_IsIndigoPlateauMark(metatileBehavior) == TRUE) + { + MsgSetSignPost(); + return EventScript_Indigo_UltimateGoal; + } + if (MetatileBehavior_IsIndigoPlateauMark2(metatileBehavior) == TRUE) + { + MsgSetSignPost(); + return EventScript_Indigo_HighestAuthority; + } + if (MetatileBehavior_IsPlayerFacingPokeMartSign(metatileBehavior, direction) == TRUE) + { + MsgSetSignPost(); + return EventScript_PokemartSign; + } + if (MetatileBehavior_IsPlayerFacingPokemonCenterSign(metatileBehavior, direction) == TRUE) + { + MsgSetSignPost(); + return EventScript_PokecenterSign; + } + return NULL; +} + +static const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metatileBehavior, u8 direction) +{ + if (MetatileBehavior_IsSemiDeepWater(metatileBehavior) == TRUE &&PartyHasMonWithSurf() == TRUE) + return EventScript_CurrentTooFast; + if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) + return EventScript_UseSurf; + + if (MetatileBehavior_IsWaterfall(metatileBehavior) == TRUE) + { + if (FlagGet(FLAG_BADGE07_GET) == TRUE && IsPlayerSurfingNorth() == TRUE) + return EventScript_Waterfall; + else + return EventScript_CantUseWaterfall; + } + return NULL; +} + +static bool8 TryStartStepBasedScript(struct MapPosition *position, u16 metatileBehavior, u16 direction) +{ + if (TryStartCoordEventScript(position) == TRUE) + return TRUE; + if (TryStartWarpEventScript(position, metatileBehavior) == TRUE) + return TRUE; + if (TryStartMiscWalkingScripts(metatileBehavior) == TRUE) + return TRUE; + if (TryStartStepCountScript(metatileBehavior) == TRUE) + return TRUE; + if (!(gPlayerAvatar.flags & 0x40) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior) && UpdateRepelCounter() == TRUE) + return TRUE; + return FALSE; +} + +static bool8 TryStartCoordEventScript(struct MapPosition *position) +{ + const u8 *script = GetCoordEventScriptAtPosition(&gMapHeader, position->x - 7, position->y - 7, position->height); + + if (script == NULL) + return FALSE; + ScriptContext1_SetupScript(script); + return TRUE; +} + +static bool8 TryStartMiscWalkingScripts(u16 metatileBehavior) +{ + // Dummied + return FALSE; +} + +static bool8 TryStartStepCountScript(u16 metatileBehavior) +{ + if (InUnionRoom() == TRUE) + return FALSE; + if (gQuestLogState == QL_STATE_2) + return FALSE; + + UpdateHappinessStepCounter(); + + if (!(gPlayerAvatar.flags & 0x40) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior)) + { + if (sub_810C4EC() == TRUE) + { + ScriptContext1_SetupScript(gUnknown_81A8CED); + return TRUE; + } + else if (UpdatePoisonStepCounter() == TRUE) + { + ScriptContext1_SetupScript(EventScript_FieldPoison); + return TRUE; + } + else if (ShouldEggHatch()) + { + IncrementGameStat(GAME_STAT_HATCHED_EGGS); + ScriptContext1_SetupScript(EventScript_EggHatch); + return TRUE; + } + } + if (SafariZoneTakeStep() == TRUE) + return TRUE; + return FALSE; +} + +static void Unref_ClearHappinessStepCounter(void) +{ + VarSet(VAR_HAPPINESS_STEP_COUNTER, 0); +} + +static void UpdateHappinessStepCounter(void) +{ + u16 *ptr = GetVarPointer(VAR_HAPPINESS_STEP_COUNTER); + int i; + + (*ptr)++; + (*ptr) %= 128; + if (*ptr == 0) + { + struct Pokemon *mon = gPlayerParty; + for (i = 0; i < PARTY_SIZE; i++) + { + AdjustFriendship(mon, FRIENDSHIP_EVENT_WALKING); + mon++; + } + } +} + +void ClearPoisonStepCounter(void) +{ + VarSet(VAR_POISON_STEP_COUNTER, 0); +} + +static bool8 UpdatePoisonStepCounter(void) +{ + u16 *ptr; + + if (gMapHeader.mapType != MAP_TYPE_SECRET_BASE) + { + ptr = GetVarPointer(VAR_POISON_STEP_COUNTER); + (*ptr)++; + (*ptr) %= 5; + if (*ptr == 0) + { + switch (DoPoisonFieldEffect()) + { + case FLDPSN_NONE: + return FALSE; + case FLDPSN_PSN: + return FALSE; + case FLDPSN_FNT: + return TRUE; + } + } + } + return FALSE; +} + +void RestartWildEncounterImmunitySteps(void) +{ + ResetEncounterRateModifiers(); +} + +static bool8 CheckStandardWildEncounter(u32 encounter) +{ + return TryStandardWildEncounter(encounter); +} + +static bool8 TrySetUpWalkIntoSignpostScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection) +{ + u8 r4; + const u8 * script; + if (JOY_HELD(DPAD_LEFT | DPAD_RIGHT)) + return FALSE; + if (playerDirection == DIR_EAST || playerDirection == DIR_WEST) + return FALSE; + + r4 = GetFacingSignpostType(metatileBehavior, playerDirection); + if (r4 == SIGNPOST_POKECENTER) + { + SetUpWalkIntoSignScript(EventScript_PokecenterSign, playerDirection); + return TRUE; + } + else if (r4 == SIGNPOST_POKEMART) + { + SetUpWalkIntoSignScript(EventScript_PokemartSign, playerDirection); + return TRUE; + } + else if (r4 == SIGNPOST_INDIGO_1) + { + SetUpWalkIntoSignScript(EventScript_Indigo_UltimateGoal, playerDirection); + return TRUE; + } + else if (r4 == SIGNPOST_INDIGO_2) + { + SetUpWalkIntoSignScript(EventScript_Indigo_HighestAuthority, playerDirection); + return TRUE; + } + else + { + script = GetSignpostScriptAtMapPosition(position); + if (script == NULL) + return FALSE; + if (r4 != SIGNPOST_SCRIPTED) + return FALSE; + SetUpWalkIntoSignScript(script, playerDirection); + return TRUE; + } +} + +static u8 GetFacingSignpostType(u16 metatileBehavior, u8 playerDirection) +{ + if (MetatileBehavior_IsPlayerFacingPokemonCenterSign(metatileBehavior, playerDirection) == TRUE) + return SIGNPOST_POKECENTER; + + if (MetatileBehavior_IsPlayerFacingPokeMartSign(metatileBehavior, playerDirection) == TRUE) + return SIGNPOST_POKEMART; + + if (MetatileBehavior_IsIndigoPlateauMark(metatileBehavior) == TRUE) + return SIGNPOST_INDIGO_1; + + if (MetatileBehavior_IsIndigoPlateauMark2(metatileBehavior) == TRUE) + return SIGNPOST_INDIGO_2; + + if (MetatileBehavior_IsSignpost(metatileBehavior) == TRUE) + return SIGNPOST_SCRIPTED; + + return SIGNPOST_NA; +} + +static void SetUpWalkIntoSignScript(const u8 *script, u8 playerDirection) +{ + gSpecialVar_Facing = playerDirection; + ScriptContext1_SetupScript(script); + SetWalkingIntoSignVars(); + MsgSetSignPost(); +} + +static const u8 *GetSignpostScriptAtMapPosition(struct MapPosition * position) +{ + const struct BgEvent * event = GetBackgroundEventAtPosition(&gMapHeader, position->x - 7, position->y - 7, position->height); + if (event == NULL) + return NULL; + if (event->bgUnion.script != NULL) + return event->bgUnion.script; + return EventScript_TestSignpostMsg; +} + +static bool8 TryArrowWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction) +{ + s8 warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position); + u16 delay; + + if (warpEventId != -1) + { + if (IsArrowWarpMetatileBehavior(metatileBehavior, direction) == TRUE) + { + StoreInitialPlayerAvatarState(); + SetupWarp(&gMapHeader, warpEventId, position); + DoWarp(); + return TRUE; + } + else if (sub_806DB84(metatileBehavior, direction) == TRUE) + { + delay = 0; + if (gPlayerAvatar.flags & 6) + { + SetPlayerAvatarTransitionFlags(1); + delay = 12; + } + StoreInitialPlayerAvatarState(); + SetupWarp(&gMapHeader, warpEventId, position); + sub_807E4A0(metatileBehavior, delay); + return TRUE; + } + } + return FALSE; +} + +static bool8 TryStartWarpEventScript(struct MapPosition *position, u16 metatileBehavior) +{ + s8 warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position); + + if (warpEventId != -1 && IsWarpMetatileBehavior(metatileBehavior) == TRUE) + { + StoreInitialPlayerAvatarState(); + SetupWarp(&gMapHeader, warpEventId, position); + if (MetatileBehavior_IsEscalator(metatileBehavior) == TRUE) + { + DoEscalatorWarp(metatileBehavior); + return TRUE; + } + if (MetatileBehavior_IsLavaridgeB1FWarp(metatileBehavior) == TRUE) + { + DoLavaridgeGymB1FWarp(); + return TRUE; + } + if (MetatileBehavior_IsLavaridge1FWarp(metatileBehavior) == TRUE) + { + DoLavaridgeGym1FWarp(); + return TRUE; + } + if (MetatileBehavior_IsWarpPad(metatileBehavior) == TRUE) + { + DoTeleportWarp(); + return TRUE; + } + if (MetatileBehavior_IsUnionRoomWarp(metatileBehavior) == TRUE) + { + DoUnionRoomWarp(); + return TRUE; + } + if (MetatileBehavior_IsFallWarp(metatileBehavior) == TRUE) + { + ResetInitialPlayerAvatarState(); + ScriptContext1_SetupScript(EventScript_1C1361); + return TRUE; + } + DoWarp(); + return TRUE; + } + return FALSE; +} + +static bool8 IsWarpMetatileBehavior(u16 metatileBehavior) +{ + if (MetatileBehavior_IsWarpDoor(metatileBehavior) == TRUE) + return TRUE; + if (MetatileBehavior_IsLadder(metatileBehavior) == TRUE) + return TRUE; + if (MetatileBehavior_IsEscalator(metatileBehavior) == TRUE) + return TRUE; + if (MetatileBehavior_IsCaveDoor(metatileBehavior) == TRUE) + return TRUE; + if (MetatileBehavior_IsLavaridgeB1FWarp(metatileBehavior) == TRUE) + return TRUE; + if (MetatileBehavior_IsLavaridge1FWarp(metatileBehavior) == TRUE) + return TRUE; + if (MetatileBehavior_IsWarpPad(metatileBehavior) == TRUE) + return TRUE; + if (MetatileBehavior_IsFallWarp(metatileBehavior) == TRUE) + return TRUE; + if (MetatileBehavior_IsUnionRoomWarp(metatileBehavior) == TRUE) + return TRUE; + return FALSE; +} + +bool8 sub_806DB84(u16 metatileBehavior, u8 playerDirection) +{ + switch (playerDirection) + { + case DIR_WEST: + if (MetatileBehavior_IsUnknownWarp6D(metatileBehavior)) + return TRUE; + if (MetatileBehavior_IsUnknownWarp6F(metatileBehavior)) + return TRUE; + break; + case DIR_EAST: + if (MetatileBehavior_IsUnknownWarp6C(metatileBehavior)) + return TRUE; + if (MetatileBehavior_IsUnknownWarp6E(metatileBehavior)) + return TRUE; + break; + } + return FALSE; +} + +static bool8 IsArrowWarpMetatileBehavior(u16 metatileBehavior, u8 direction) +{ + switch (direction) + { + case DIR_NORTH: + return MetatileBehavior_IsNorthArrowWarp(metatileBehavior); + case DIR_SOUTH: + return MetatileBehavior_IsSouthArrowWarp(metatileBehavior); + case DIR_WEST: + return MetatileBehavior_IsWestArrowWarp(metatileBehavior); + case DIR_EAST: + return MetatileBehavior_IsEastArrowWarp(metatileBehavior); + } + return FALSE; +} + +static s8 GetWarpEventAtMapPosition(struct MapHeader *mapHeader, struct MapPosition *position) +{ + return GetWarpEventAtPosition(mapHeader, position->x - 7, position->y - 7, position->height); +} + +static void SetupWarp(struct MapHeader *unused, s8 warpEventId, struct MapPosition *position) +{ + const struct WarpEvent *warpEvent; + + warpEvent = &gMapHeader.events->warps[warpEventId]; + + if (warpEvent->mapNum == MAP_NUM(NONE)) + { + SetWarpDestinationToDynamicWarp(warpEvent->warpId); + } + else + { + const struct MapHeader *mapHeader; + + SetWarpDestinationToMapWarp(warpEvent->mapGroup, warpEvent->mapNum, warpEvent->warpId); + UpdateEscapeWarp(position->x, position->y); + mapHeader = Overworld_GetMapHeaderByGroupAndId(warpEvent->mapGroup, warpEvent->mapNum); + if (mapHeader->events->warps[warpEvent->warpId].mapNum == MAP_NUM(NONE)) + SetDynamicWarp(mapHeader->events->warps[warpEventId].warpId, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, warpEventId); + } +} + +static bool8 TryDoorWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction) +{ + s8 warpEventId; + + if (direction == DIR_NORTH) + { + if (MetatileBehavior_IsWarpDoor(metatileBehavior) == TRUE) + { + warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position); + if (warpEventId != -1 && IsWarpMetatileBehavior(metatileBehavior) == TRUE) + { + StoreInitialPlayerAvatarState(); + SetupWarp(&gMapHeader, warpEventId, position); + DoDoorWarp(); + return TRUE; + } + } + } + return FALSE; +} + +static s8 GetWarpEventAtPosition(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation) +{ + s32 i; + struct WarpEvent *warpEvent = mapHeader->events->warps; + u8 warpCount = mapHeader->events->warpCount; + + for (i = 0; i < warpCount; i++, warpEvent++) + { + if ((u16)warpEvent->x == x && (u16)warpEvent->y == y) + { + if (warpEvent->elevation == elevation || warpEvent->elevation == 0) + return i; + } + } + return -1; +} + +static const u8 *TryRunCoordEventScript(struct CoordEvent *coordEvent) +{ + if (coordEvent != NULL) + { + if (coordEvent->script == NULL) + { + DoCoordEventWeather(coordEvent->trigger); + return NULL; + } + if (coordEvent->trigger == 0) + { + ScriptContext2_RunNewScript(coordEvent->script); + return NULL; + } + if (VarGet(coordEvent->trigger) == (u8)coordEvent->index) + return coordEvent->script; + } + return NULL; +} + +static const u8 *GetCoordEventScriptAtPosition(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation) +{ + s32 i; + struct CoordEvent *coordEvents = mapHeader->events->coordEvents; + u8 coordEventCount = mapHeader->events->coordEventCount; + + for (i = 0; i < coordEventCount; i++) + { + if ((u16)coordEvents[i].x == x && (u16)coordEvents[i].y == y) + { + if (coordEvents[i].elevation == elevation || coordEvents[i].elevation == 0) + { + const u8 *script = TryRunCoordEventScript(&coordEvents[i]); + if (script != NULL) + return script; + } + } + } + return NULL; +} + +void sub_806DE28(struct ObjectEvent * object) +{ + if (MapGridGetMetatileBehaviorAt(object->currentCoords.x, object->currentCoords.y) == MB_FALL_WARP) + { + PlaySE(SE_RU_HYUU); + // w-why?! + RemoveObjectEventByLocalIdAndMap(object->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + FlagClear(sub_805FCD8(object->localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup)); + } +} + +void sub_806DE70(u16 x, u16 y) +{ + int i; + const struct CoordEvent * events = gMapHeader.events->coordEvents; + int n = gMapHeader.events->coordEventCount; + + if (MapGridGetMetatileBehaviorAt(x, y) == MB_STRENGTH_BUTTON) + { + for (i = 0; i < n; i++) + { + if (events[i].x + 7 == x && events[i].y + 7 == y) + { + sub_8112364(); + ScriptContext1_SetupScript(events[i].script); + ScriptContext2_Enable(); + } + } + } +} + +const u8 *GetCoordEventScriptAtMapPosition(struct MapPosition *position) +{ + return GetCoordEventScriptAtPosition(&gMapHeader, position->x - 7, position->y - 7, position->height); +} + +static const struct BgEvent *GetBackgroundEventAtPosition(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation) +{ + u8 i; + struct BgEvent *bgEvents = mapHeader->events->bgEvents; + u8 bgEventCount = mapHeader->events->bgEventCount; + + for (i = 0; i < bgEventCount; i++) + { + if ((u16)bgEvents[i].x == x && (u16)bgEvents[i].y == y) + { + if (bgEvents[i].elevation == elevation || bgEvents[i].elevation == 0) + return &bgEvents[i]; + } + } + return NULL; +} + +bool8 dive_warp(struct MapPosition *position, u16 metatileBehavior) +{ + if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && !MetatileBehavior_IsUnableToEmerge(metatileBehavior)) + { + if (SetDiveWarpEmerge(position->x - 7, position->y - 7)) + { + StoreInitialPlayerAvatarState(); + DoDiveWarp(); + PlaySE(SE_W291); + return TRUE; + } + } + else if (MetatileBehavior_IsDiveable(metatileBehavior) == TRUE) + { + if (SetDiveWarpDive(position->x - 7, position->y - 7)) + { + StoreInitialPlayerAvatarState(); + DoDiveWarp(); + PlaySE(SE_W291); + return TRUE; + } + } + return FALSE; +} + +static u8 TrySetDiveWarp(void) +{ + s16 x, y; + u8 metatileBehavior; + + PlayerGetDestCoords(&x, &y); + metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && !MetatileBehavior_IsUnableToEmerge(metatileBehavior)) + { + if (SetDiveWarpEmerge(x - 7, y - 7) == TRUE) + return 1; + } + else if (MetatileBehavior_IsDiveable(metatileBehavior) == TRUE) + { + if (SetDiveWarpDive(x - 7, y - 7) == TRUE) + return 2; + } + return 0; +} + +static const u8 *GetObjectEventScriptPointerPlayerFacing(void) +{ + u8 direction; + struct MapPosition position; + + direction = GetPlayerMovementDirection(); + GetInFrontOfPlayerPosition(&position); + return GetInteractedObjectEventScript(&position, MapGridGetMetatileBehaviorAt(position.x, position.y), direction); +} + +int SetCableClubWarp(void) +{ + struct MapPosition position; + + GetPlayerMovementDirection(); // unnecessary + GetPlayerPosition(&position); + MapGridGetMetatileBehaviorAt(position.x, position.y); // unnecessary + SetupWarp(&gMapHeader, GetWarpEventAtMapPosition(&gMapHeader, &position), &position); + return 0; +} diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c index 58f654110..10d6b3d72 100644 --- a/src/field_fadetransition.c +++ b/src/field_fadetransition.c @@ -549,11 +549,11 @@ void DoDiveWarp(void) CreateTask(sub_807E718, 10); } -void sub_807E4A0(u16 a, u16 b) +void sub_807E4A0(u16 metatileBehavior, u16 delay) { u8 taskId = CreateTask(sub_807E980, 10); - gTasks[taskId].data[1] = a; - gTasks[taskId].data[15] = b; + gTasks[taskId].data[1] = metatileBehavior; + gTasks[taskId].data[15] = delay; sub_807E980(taskId); } @@ -571,7 +571,7 @@ void sub_807E500(void) gFieldCallback = sub_807DF94; } -void sub_807E524(void) +void DoUnionRoomWarp(void) { ScriptContext2_Enable(); gFieldCallback = sub_807DF64; @@ -584,25 +584,25 @@ void DoFallWarp(void) gFieldCallback = FieldCB_FallWarpExit; } -void sub_807E560(u8 a0) +void DoEscalatorWarp(u8 metatileBehavior) { ScriptContext2_Enable(); - StartEscalatorWarp(a0, 10); + StartEscalatorWarp(metatileBehavior, 10); } -void sub_807E57C(void) +void DoLavaridgeGymB1FWarp(void) { ScriptContext2_Enable(); StartLavaridgeGymB1FWarp(10); } -void sub_807E58C(void) +void DoLavaridgeGym1FWarp(void) { ScriptContext2_Enable(); StartLavaridgeGym1FWarp(10); } -void sub_807E59C(void) +void DoTeleportWarp(void) { ScriptContext2_Enable(); TryFadeOutOldMapMusic(); diff --git a/src/field_specials.c b/src/field_specials.c index 474fcd081..59c026b78 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -547,11 +547,11 @@ void NullFieldSpecial(void) } -void sub_80CADC4(void) +void DoPicboxCancel(void) { u8 t = EOS; AddTextPrinterParameterized(0, 2, &t, 0, 1, 0, NULL); - sub_809D424(); + PicboxCancel(); } void SetVermilionTrashCans(void) @@ -1545,7 +1545,7 @@ void SetSeenMon(void) GetSetPokedexFlag(SpeciesToNationalPokedexNum(gSpecialVar_0x8004), 2); } -void sub_80CBDE8(void) +void ResetContextNpcTextColor(void) { gSelectedObjectEvent = 0; gSpecialVar_TextColor = 0xFF; @@ -2435,7 +2435,7 @@ static void Task_WaitDeoxysFieldEffect(u8 taskId) } } -void BirthIslandDeoxysStepCounter(void) +void IncrementBirthIslandRockStepCount(void) { u16 count = VarGet(VAR_DEOXYS_INTERACTION_STEP_COUNTER); if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BIRTH_ISLAND_EXTERIOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BIRTH_ISLAND_EXTERIOR)) diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 414ece873..d6a983744 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -474,7 +474,7 @@ bool8 MetatileBehavior_IsMountain(u8 metatileBehavior) return FALSE; } -bool8 MetatileBehavior_IsDeepOrSemiDeepWater(u8 metatileBehavior) +bool8 MetatileBehavior_IsDiveable(u8 metatileBehavior) { if(metatileBehavior >= MB_SEMI_DEEP_WATER && metatileBehavior <= MB_DEEP_WATER) return TRUE; @@ -482,7 +482,7 @@ bool8 MetatileBehavior_IsDeepOrSemiDeepWater(u8 metatileBehavior) return FALSE; } -bool8 MetatileBehavior_IsMB19(u8 metatileBehavior) +bool8 MetatileBehavior_IsUnableToEmerge(u8 metatileBehavior) { if(metatileBehavior == MB_19) return TRUE; @@ -618,9 +618,9 @@ bool8 MetatileBehavior_UnusedReturnFalse_5(u8 metatileBehavior) { return FALSE; bool8 MetatileBehavior_UnusedReturnFalse_6(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_UnusedReturnFalse_7(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_UnusedReturnFalse_8(u8 metatileBehavior) { return FALSE; } -bool8 MetatileBehavior_ReturnFalse_12(u8 metatileBehavior) { return FALSE; } +bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 metatileBehavior) { return FALSE; } -bool8 MetatileBheavior_IsMB_68(u8 metatileBehavior) +bool8 MetatileBehavior_IsLavaridge1FWarp(u8 metatileBehavior) { if(metatileBehavior == MB_68) return TRUE; @@ -628,7 +628,7 @@ bool8 MetatileBheavior_IsMB_68(u8 metatileBehavior) return FALSE; } -bool8 MetatileBehavior_IsRegularWarp(u8 metatileBehavior) +bool8 MetatileBehavior_IsWarpPad(u8 metatileBehavior) { if(metatileBehavior == MB_REGULAR_WARP) return TRUE; diff --git a/src/region_map.c b/src/region_map.c index 731abc59f..b49c3c31a 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -4393,7 +4393,7 @@ static void sub_80C527C(u16 mapsec) } else { - warp1_set_2(sMapsecToSpawn[idx][0], sMapsecToSpawn[idx][1], -1); + SetWarpDestinationToMapWarp(sMapsecToSpawn[idx][0], sMapsecToSpawn[idx][1], -1); } ReturnToFieldFromFlyMapSelect(); } diff --git a/src/scrcmd.c b/src/scrcmd.c index 32ac5c4e2..2b5137f9a 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -55,8 +55,7 @@ static EWRAM_DATA u16 sMovingNpcMapId = 0; static EWRAM_DATA u16 sFieldEffectScriptId = 0; struct ScriptContext * gUnknown_3005070; - -extern u8 gSelectedObjectEvent; +u8 gSelectedObjectEvent; // This is defined in here so the optimizer can't see its value when compiling // script.c. @@ -789,7 +788,7 @@ bool8 ScrCmd_warpteleport(struct ScriptContext * ctx) u16 y = VarGet(ScriptReadHalfword(ctx)); SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sub_807E59C(); + DoTeleportWarp(); ResetInitialPlayerAvatarState(); return TRUE; } @@ -1315,32 +1314,32 @@ bool8 ScrCmd_closemessage(struct ScriptContext * ctx) static bool8 WaitForAorBPress(void) { - if (gMain.newKeys & A_BUTTON) + if (JOY_NEW(A_BUTTON)) return TRUE; - if (gMain.newKeys & B_BUTTON) + if (JOY_NEW(B_BUTTON)) return TRUE; if (sub_806B93C(gUnknown_3005070) == TRUE) { u8 r4 = sub_806B96C(gUnknown_3005070); - sub_8069998(r4); - if (r4) + RegisterQuestLogInput(r4); + if (r4 != QL_INPUT_OFF) { - if (gQuestLogState != 2) + if (gQuestLogState != QL_STATE_2) { - sub_80699F8(); - if (r4 < 9 || r4 > 10) - sub_8069964(); + ClearMsgBoxCancelableState(); + if (r4 != QL_INPUT_A && r4 != QL_INPUT_B) + SetQuestLogInputIsDpadFlag(); else { - sub_80699A4(); - sub_8069970(); + ClearQuestLogInput(); + ClearQuestLogInputIsDpadFlag(); } return TRUE; } } } - if (sub_8112CAC() == 1 || gQuestLogState == 2) + if (sub_8112CAC() == 1 || gQuestLogState == QL_STATE_2) { if (gUnknown_20370AC == 120) return TRUE; @@ -1368,37 +1367,37 @@ static bool8 sub_806B93C(struct ScriptContext * ctx) static u8 sub_806B96C(struct ScriptContext * ctx) { - if (gMain.heldKeys & DPAD_UP && gSpecialVar_Facing != 2) - return 1; + if (JOY_HELD(DPAD_UP) && gSpecialVar_Facing != DIR_NORTH) + return QL_INPUT_UP; - if (gMain.heldKeys & DPAD_DOWN && gSpecialVar_Facing != 1) - return 2; + if (JOY_HELD(DPAD_DOWN) && gSpecialVar_Facing != DIR_SOUTH) + return QL_INPUT_DOWN; - if (gMain.heldKeys & DPAD_LEFT && gSpecialVar_Facing != 3) - return 3; + if (JOY_HELD(DPAD_LEFT) && gSpecialVar_Facing != DIR_WEST) + return QL_INPUT_LEFT; - if (gMain.heldKeys & DPAD_RIGHT && gSpecialVar_Facing != 4) - return 4; + if (JOY_HELD(DPAD_RIGHT) && gSpecialVar_Facing != DIR_EAST) + return QL_INPUT_RIGHT; - if (gMain.newKeys & L_BUTTON) - return 5; + if (JOY_NEW(L_BUTTON)) + return QL_INPUT_L; - if (gMain.heldKeys & R_BUTTON) - return 6; + if (JOY_HELD(R_BUTTON)) + return QL_INPUT_R; - if (gMain.heldKeys & START_BUTTON) - return 7; + if (JOY_HELD(START_BUTTON)) + return QL_INPUT_START; - if (gMain.heldKeys & SELECT_BUTTON) - return 8; + if (JOY_HELD(SELECT_BUTTON)) + return QL_INPUT_SELECT; - if (gMain.newKeys & A_BUTTON) - return 9; + if (JOY_NEW(A_BUTTON)) + return QL_INPUT_A; - if (gMain.newKeys & B_BUTTON) - return 10; + if (JOY_NEW(B_BUTTON)) + return QL_INPUT_B; - return 0; + return QL_INPUT_OFF; } bool8 ScrCmd_waitbuttonpress(struct ScriptContext * ctx) @@ -2224,13 +2223,13 @@ bool8 ScrCmd_removecoins(struct ScriptContext * ctx) bool8 ScrCmd_signmsg(struct ScriptContext * ctx) { - sub_8069A20(); + MsgSetSignPost(); return FALSE; } bool8 ScrCmd_normalmsg(struct ScriptContext * ctx) { - sub_8069A2C(); + MsgSetNotSignPost(); return FALSE; } diff --git a/src/script.c b/src/script.c index 4b8565589..ff74b40bc 100644 --- a/src/script.c +++ b/src/script.c @@ -7,7 +7,7 @@ #define SCRIPT_STACK_SIZE 20 -extern void sub_80CBDE8(void); // field_specials +extern void ResetContextNpcTextColor(void); // field_specials extern u16 CalcCRC16WithTable(u8 *data, int length); // util extern bool32 ValidateReceivedWonderCard(void); // mevent @@ -18,21 +18,21 @@ enum SCRIPT_MODE_NATIVE, }; -EWRAM_DATA u8 gUnknown_20370A0 = 0; +EWRAM_DATA u8 gWalkAwayFromSignInhibitTimer = 0; EWRAM_DATA const u8 *gRAMScriptPtr = NULL; -// ewram bss -/*IWRAM_DATA*/ static u8 sScriptContext1Status; -/*IWRAM_DATA*/ static u32 sUnusedVariable1; -/*IWRAM_DATA*/ static struct ScriptContext sScriptContext1; -/*IWRAM_DATA*/ static u32 sUnusedVariable2; -/*IWRAM_DATA*/ static struct ScriptContext sScriptContext2; -/*IWRAM_DATA*/ static bool8 sScriptContext2Enabled; -/*IWRAM_DATA*/ static u8 gUnknown_3000F9D; -/*IWRAM_DATA*/ static u8 gUnknown_3000F9E; -/*IWRAM_DATA*/ static u8 gUnknown_3000F9F; -/*IWRAM_DATA*/ static u8 gUnknown_3000FA0; -/*IWRAM_DATA*/ static u8 gUnknown_3000FA1; +// iwram bss +static u8 sScriptContext1Status; +static u32 sUnusedVariable1; +static struct ScriptContext sScriptContext1; +static u32 sUnusedVariable2; +static struct ScriptContext sScriptContext2; +static bool8 sScriptContext2Enabled; +static u8 gUnknown_3000F9D; +static u8 sMsgBoxIsCancelable; +static u8 sQuestLogInput; +static u8 sQuestLogInputIsDpad; +static u8 sMsgIsSignPost; extern ScrCmdFunc gScriptCmdTable[]; extern ScrCmdFunc gScriptCmdTableEnd[]; @@ -202,95 +202,95 @@ bool8 ScriptContext2_IsEnabled(void) return sScriptContext2Enabled; } -void sub_8069964(void) +void SetQuestLogInputIsDpadFlag(void) { - gUnknown_3000FA0 = 1; + sQuestLogInputIsDpad = TRUE; } -void sub_8069970(void) +void ClearQuestLogInputIsDpadFlag(void) { - gUnknown_3000FA0 = 0; + sQuestLogInputIsDpad = FALSE; } -bool8 sub_806997C(void) +bool8 IsQuestLogInputDpad(void) { - if(gUnknown_3000FA0 == TRUE) + if(sQuestLogInputIsDpad == TRUE) return TRUE; else return FALSE; } -void sub_8069998(u8 var) +void RegisterQuestLogInput(u8 var) { - gUnknown_3000F9F = var; + sQuestLogInput = var; } -void sub_80699A4(void) +void ClearQuestLogInput(void) { - gUnknown_3000F9F = 0; + sQuestLogInput = 0; } -u8 sub_80699B0(void) +u8 GetRegisteredQuestLogInput(void) { - return gUnknown_3000F9F; + return sQuestLogInput; } void sub_80699BC(void) { - gUnknown_3000F9D = 1; + gUnknown_3000F9D = TRUE; } void sub_80699C8(void) { - gUnknown_3000F9D = 0; + gUnknown_3000F9D = FALSE; } -u8 sub_80699D4(void) +bool8 sub_80699D4(void) { return gUnknown_3000F9D; } -void sub_80699E0(void) +void SetWalkingIntoSignVars(void) { - gUnknown_20370A0 = 6; - gUnknown_3000F9E = 1; + gWalkAwayFromSignInhibitTimer = 6; + sMsgBoxIsCancelable = TRUE; } -void sub_80699F8(void) +void ClearMsgBoxCancelableState(void) { - gUnknown_3000F9E = 0; + sMsgBoxIsCancelable = FALSE; } -bool8 sub_8069A04(void) +bool8 CanWalkAwayToCancelMsgBox(void) { - if(gUnknown_3000F9E == TRUE) + if(sMsgBoxIsCancelable == TRUE) return TRUE; else return FALSE; } -void sub_8069A20(void) +void MsgSetSignPost(void) { - gUnknown_3000FA1 = 1; + sMsgIsSignPost = TRUE; } -void sub_8069A2C(void) +void MsgSetNotSignPost(void) { - gUnknown_3000FA1 = 0; + sMsgIsSignPost = FALSE; } bool8 IsMsgSignPost(void) { - if(gUnknown_3000FA1 == TRUE) + if(sMsgIsSignPost == TRUE) return TRUE; else return FALSE; } -void sub_8069A54(void) +void ResetFacingNpcOrSignPostVars(void) { - sub_80CBDE8(); - sub_8069A2C(); + ResetContextNpcTextColor(); + MsgSetNotSignPost(); } bool8 ScriptContext1_IsScriptSetUp(void) @@ -329,9 +329,9 @@ bool8 ScriptContext2_RunScript(void) void ScriptContext1_SetupScript(const u8 *ptr) { - sub_80699F8(); + ClearMsgBoxCancelableState(); sub_80699C8(); - sub_8069970(); + ClearQuestLogInputIsDpadFlag(); InitScriptContext(&sScriptContext1, gScriptCmdTable, gScriptCmdTableEnd); SetupBytecodeScript(&sScriptContext1, ptr); ScriptContext2_Enable(); @@ -431,7 +431,7 @@ void mapheader_run_script_with_tag_x6(void) mapheader_run_script_by_tag(6); } -bool8 mapheader_run_first_tag2_script_list_match(void) +bool8 TryRunOnFrameMapScript(void) { u8 *ptr; @@ -482,7 +482,7 @@ bool8 InitRamScript(u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 objec return TRUE; } -u8 *GetRamScript(u8 objectId, u8 *script) +const u8 *GetRamScript(u8 objectId, const u8 *script) { struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data; gRAMScriptPtr = NULL; diff --git a/src/script_menu.c b/src/script_menu.c index a4745ee10..94aaf528d 100644 --- a/src/script_menu.c +++ b/src/script_menu.c @@ -1070,7 +1070,7 @@ static bool8 PicboxWait(void) return FALSE; } -void sub_809D424(void) +void PicboxCancel(void) { u8 taskId = FindTaskIdByFunc(Task_ScriptShowMonPic); struct Task * task; |