summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@gmail.com>2020-03-17 20:59:39 -0400
committerPikalaxALT <PikalaxALT@gmail.com>2020-03-17 20:59:39 -0400
commit901fceec188ff640f32b22343e5a0b6e7e4c9c42 (patch)
tree3384fab2ba989c1fd4eee44284d100faa084bbfd /src
parent715c2ff3ad3a7842a97a2b221f4c02135a813139 (diff)
through GetInteractedObjectEventScript
Diffstat (limited to 'src')
-rw-r--r--src/field_control_avatar.c428
-rw-r--r--src/field_specials.c2
-rw-r--r--src/script.c28
3 files changed, 443 insertions, 15 deletions
diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c
new file mode 100644
index 000000000..bf743d071
--- /dev/null
+++ b/src/field_control_avatar.c
@@ -0,0 +1,428 @@
+#include "global.h"
+#include "gflib.h"
+#include "bike.h"
+#include "event_data.h"
+#include "event_object_movement.h"
+#include "event_scripts.h"
+#include "fieldmap.h"
+#include "field_control_avatar.h"
+#include "field_player_avatar.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 "script.h"
+#include "start_menu.h"
+#include "trainer_see.h"
+#include "constants/songs.h"
+#include "constants/event_objects.h"
+
+void sub_806CA4C(struct FieldInput *input, u16 *newKeys, u16 *heldKeys);
+bool8 sub_80699D4(void);
+void sub_806CDF8(u8 taskId);
+void GetPlayerPosition(struct MapPosition * position);
+void GetInFrontOfPlayerPosition(struct MapPosition * position);
+u16 GetPlayerCurMetatileBehavior(void);
+bool8 TryStartStepBasedScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection);
+bool8 TryArrowWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection);
+bool8 TryDoorWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection);
+bool8 TryStartInteractionScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection);
+const u8 *GetInteractionScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection);
+const u8 *GetInteractedObjectEventScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection);
+const u8 *GetInteractedBackgroundEventScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection);
+const u8 *GetInteractedMetatileScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection);
+const u8 *GetInteractedWaterScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection);
+bool8 sub_806D804(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection);
+bool8 CheckStandardWildEncounter(u32 encounter);
+
+struct FieldInput gUnknown_3005078;
+
+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() && sub_806997C() == TRUE)
+ {
+ sub_806CA4C(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;
+ }
+}
+
+void sub_806CA4C(struct FieldInput *input, u16 *newKeys, u16 *heldKeys)
+{
+ switch (sub_80699B0())
+ {
+ case 0:
+ break;
+ case 1:
+ *heldKeys = *newKeys = DPAD_UP;
+ break;
+ case 2:
+ *heldKeys = *newKeys = DPAD_DOWN;
+ break;
+ case 3:
+ *heldKeys = *newKeys = DPAD_LEFT;
+ break;
+ case 4:
+ *heldKeys = *newKeys = DPAD_RIGHT;
+ break;
+ case 5:
+ *heldKeys = *newKeys = L_BUTTON;
+ break;
+ case 6:
+ *heldKeys = *newKeys = R_BUTTON;
+ break;
+ case 7:
+ *heldKeys = *newKeys = START_BUTTON;
+ break;
+ case 8:
+ *heldKeys = *newKeys = SELECT_BUTTON;
+ break;
+ }
+ sub_8069970();
+ sub_80699A4();
+}
+
+int ProcessPlayerFieldInput(struct FieldInput *input)
+{
+ struct MapPosition position;
+ u8 playerDirection;
+ u16 metatileBehavior;
+ u32 r8;
+
+ sub_8069A54();
+ playerDirection = GetPlayerFacingDirection();
+ GetPlayerPosition(&position);
+ r8 = MapGridGetMetatileAttributeAt(position.x, position.y, 0xFF);
+ metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y);
+
+ FieldClearPlayerInput(&gUnknown_3005078);
+ gUnknown_3005078.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)
+ {
+ gUnknown_3005078.tookStep = TRUE;
+ return TRUE;
+ }
+ }
+ if (input->checkStandardWildEncounter)
+ {
+ if (input->dpadDirection == 0 || input->dpadDirection == playerDirection)
+ {
+ GetInFrontOfPlayerPosition(&position);
+ metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y);
+ if (sub_806D804(&position, metatileBehavior, playerDirection) == TRUE)
+ {
+ gUnknown_3005078.checkStandardWildEncounter = TRUE;
+ return TRUE;
+ }
+ GetPlayerPosition(&position);
+ metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y);
+ }
+ }
+ if (input->checkStandardWildEncounter && CheckStandardWildEncounter(r8) == TRUE)
+ {
+ gUnknown_3005078.checkStandardWildEncounter = TRUE;
+ return TRUE;
+ }
+ if (input->heldDirection && input->dpadDirection == playerDirection)
+ {
+ if (TryArrowWarp(&position, metatileBehavior, playerDirection) == TRUE)
+ {
+ gUnknown_3005078.heldDirection = TRUE;
+ return TRUE;
+ }
+ }
+
+ GetInFrontOfPlayerPosition(&position);
+ metatileBehavior = MapGridGetMetatileBehaviorAt(position.x, position.y);
+ if (input->heldDirection && input->dpadDirection == playerDirection)
+ {
+ if (sub_806D804(&position, metatileBehavior, playerDirection) == TRUE)
+ {
+ gUnknown_3005078.heldDirection = TRUE;
+ return TRUE;
+ }
+ }
+
+ if (input->pressedAButton && TryStartInteractionScript(&position, metatileBehavior, playerDirection) == TRUE)
+ {
+ gUnknown_3005078.pressedAButton = TRUE;
+ return TRUE;
+ }
+
+ if (input->heldDirection2 && input->dpadDirection == playerDirection)
+ {
+ if (TryDoorWarp(&position, metatileBehavior, playerDirection) == TRUE)
+ {
+ gUnknown_3005078.heldDirection2 = TRUE;
+ return TRUE;
+ }
+ }
+
+ if (input->pressedStartButton)
+ {
+ gUnknown_3005078.pressedStartButton = TRUE;
+ FlagSet(FLAG_OPENED_START_MENU);
+ PlaySE(SE_WIN_OPEN);
+ ShowStartMenu();
+ return TRUE;
+ }
+ if (input->pressedSelectButton && UseRegisteredKeyItemOnField() == TRUE)
+ {
+ gUnknown_3005078.pressedSelectButton = TRUE;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_806CD30(struct FieldInput * input)
+{
+ if (ScriptContext1_IsScriptSetUp() == TRUE)
+ {
+ if (gUnknown_20370A0 != 0)
+ gUnknown_20370A0--;
+ else if (sub_8069A04() == TRUE)
+ {
+ if (input->dpadDirection != 0 && GetPlayerFacingDirection() != input->dpadDirection)
+ {
+ if (sub_80699D4() == TRUE)
+ return;
+ if (input->dpadDirection == DIR_NORTH)
+ sub_8069998(1);
+ else if (input->dpadDirection == DIR_SOUTH)
+ sub_8069998(2);
+ else if (input->dpadDirection == DIR_WEST)
+ sub_8069998(3);
+ else if (input->dpadDirection == DIR_EAST)
+ sub_8069998(4);
+ ScriptContext1_SetupScript(gUnknown_81A7ADB);
+ ScriptContext2_Enable();
+ }
+ else if (input->pressedStartButton)
+ {
+ ScriptContext1_SetupScript(gUnknown_81A7ADB);
+ ScriptContext2_Enable();
+ if (!FuncIsActiveTask(sub_806CDF8))
+ CreateTask(sub_806CDF8, 8);
+ }
+ }
+ }
+}
+
+void sub_806CDF8(u8 taskId)
+{
+ if (!ScriptContext2_IsEnabled())
+ {
+ PlaySE(SE_WIN_OPEN);
+ ShowStartMenu();
+ DestroyTask(taskId);
+ }
+}
+
+void GetPlayerPosition(struct MapPosition *position)
+{
+ PlayerGetDestCoords(&position->x, &position->y);
+ position->height = PlayerGetZCoord();
+}
+
+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;
+}
+
+u16 GetPlayerCurMetatileBehavior(void)
+{
+ s16 x, y;
+
+ PlayerGetDestCoords(&x, &y);
+ return MapGridGetMetatileBehaviorAt(x, y);
+}
+
+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;
+}
+
+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 < 4; 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);
+}
+
+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;
+}
diff --git a/src/field_specials.c b/src/field_specials.c
index 474fcd081..86ae03ddb 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -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/script.c b/src/script.c
index 4b8565589..7c7c3b970 100644
--- a/src/script.c
+++ b/src/script.c
@@ -21,18 +21,18 @@ enum
EWRAM_DATA u8 gUnknown_20370A0 = 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 gUnknown_3000F9E;
+static u8 gUnknown_3000F9F;
+static u8 gUnknown_3000FA0;
+static u8 gUnknown_3000FA1;
extern ScrCmdFunc gScriptCmdTable[];
extern ScrCmdFunc gScriptCmdTableEnd[];
@@ -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;