summaryrefslogtreecommitdiff
path: root/src/field_player_avatar.c
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@gmail.com>2020-03-23 21:42:35 -0400
committerPikalaxALT <PikalaxALT@gmail.com>2020-03-23 21:42:35 -0400
commit5b3e9f376b2ed230df1d7e6d23e0239f69d10ba4 (patch)
tree6011f60d2398a5ebb78564de2a06e150d62b34f9 /src/field_player_avatar.c
parentf9a3607824d00f17999288e241fc3ad339716279 (diff)
through PlayerGetCopyableMovement
Diffstat (limited to 'src/field_player_avatar.c')
-rw-r--r--src/field_player_avatar.c238
1 files changed, 236 insertions, 2 deletions
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c
index 5b2820f96..c27eb2650 100644
--- a/src/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -8,9 +8,13 @@
#include "field_player_avatar.h"
#include "metatile_behavior.h"
#include "overworld.h"
+#include "quest_log.h"
+#include "quest_log_player.h"
#include "constants/event_object_movement.h"
+#include "constants/event_objects.h"
#include "constants/songs.h"
#include "constants/flags.h"
+#include "constants/metatile_behaviors.h"
EWRAM_DATA struct ObjectEvent * gUnknown_2036E30 = NULL;
EWRAM_DATA bool8 gUnknown_2036E34 = FALSE;
@@ -21,7 +25,6 @@ u8 ObjectEventCB2_NoMovement2(struct ObjectEvent * object, struct Sprite * sprit
bool8 sub_805B528(void);
bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent * playerObjEvent, u8 direction);
void npc_clear_strange_bits(struct ObjectEvent * playerObjEvent);
-void DoPlayerAvatarTransition(void);
bool8 TryDoMetatileBehaviorForcedMovement(void);
void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys);
void PlayerAllowForcedMovementIfMovingSameDirection(void);
@@ -56,7 +59,20 @@ u8 CheckForObjectEventCollision(struct ObjectEvent * objectEvent, s16 x, s16 y,
bool8 CanStopSurfing(s16 x, s16 y, u8 direction);
bool8 ShouldJumpLedge(s16 x, s16 y, u8 direction);
bool8 TryPushBoulder(s16 x, s16 y, u8 direction);
-bool8 CheckAcroBikeCollision(s16 x, s16 y, u8 metatileBehavior, u8 *collision);
+void CheckAcroBikeCollision(s16 x, s16 y, u8 metatileBehavior, u8 *collision);
+void DoPlayerAvatarTransition(void);
+void PlayerAvatarTransition_Dummy(struct ObjectEvent * playerObject);
+void PlayerAvatarTransition_Normal(struct ObjectEvent * playerObject);
+void PlayerAvatarTransition_Bike(struct ObjectEvent * playerObject);
+void PlayerAvatarTransition_Surfing(struct ObjectEvent * playerObject);
+void PlayerAvatarTransition_Underwater(struct ObjectEvent * playerObject);
+void PlayerAvatarTransition_ReturnToField(struct ObjectEvent * playerObject);
+bool8 PlayerIsAnimActive(void);
+bool8 PlayerCheckIfAnimFinishedOrInactive(void);
+bool8 player_is_anim_in_certain_ranges(void);
+bool8 sub_805BF58(void);
+void CreateStopSurfingTask(u8 direction);
+void StartStrengthAnim(u8 objectEventId, u8 direction);
void PlayerNotOnBikeCollide(u8 direction);
void PlayerRun(u8 direction);
void PlayerRunSlow(u8 direction);
@@ -531,3 +547,221 @@ u8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u
}
return collision;
}
+
+const u8 gUnknown_835B820[] = {
+ MOVEMENT_ACTION_FACE_DOWN_FAST,
+ MOVEMENT_ACTION_FACE_DOWN_FAST,
+ MOVEMENT_ACTION_FACE_UP_FAST,
+ MOVEMENT_ACTION_FACE_LEFT_FAST,
+ MOVEMENT_ACTION_FACE_RIGHT_FAST
+};
+
+bool8 CanStopSurfing(s16 x, s16 y, u8 direction)
+{
+ if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
+ && MapGridGetZCoordAt(x, y) == 3
+ && GetObjectEventIdByXYZ(x, y, 3) == OBJECT_EVENTS_COUNT)
+ {
+ sub_811278C(gUnknown_835B820[direction], 16);
+ CreateStopSurfingTask(direction);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+bool8 ShouldJumpLedge(s16 x, s16 y, u8 z)
+{
+ if (GetLedgeJumpDirection(x, y, z) != 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 TryPushBoulder(s16 x, s16 y, u8 direction)
+{
+ u8 objectEventId;
+ if (!FlagGet(FLAG_SYS_USE_STRENGTH))
+ return FALSE;
+
+ objectEventId = GetObjectEventIdByXY(x, y);
+ if (objectEventId == OBJECT_EVENTS_COUNT)
+ return FALSE;
+
+ if (gObjectEvents[objectEventId].graphicsId != OBJ_EVENT_GFX_PUSHABLE_BOULDER)
+ return FALSE;
+
+ x = gObjectEvents[objectEventId].currentCoords.x;
+ y = gObjectEvents[objectEventId].currentCoords.y;
+ MoveCoords(direction, &x, &y);
+ if (MapGridGetMetatileBehaviorAt(x, y) == MB_FALL_WARP || (GetCollisionAtCoords(&gObjectEvents[objectEventId], x, y, direction) == COLLISION_NONE && !MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(x, y))))
+ {
+ StartStrengthAnim(objectEventId, direction);
+ return TRUE;
+ }
+ else
+ {
+ direction++;
+ direction--;
+ return FALSE;
+ }
+}
+
+bool8 (*const gUnknown_835B828[])(u8) = {
+ MetatileBehavior_IsBumpySlope,
+ MetatileBehavior_IsIsolatedVerticalRail,
+ MetatileBehavior_IsIsolatedHorizontalRail,
+ MetatileBehavior_IsVerticalRail,
+ MetatileBehavior_IsHorizontalRail
+};
+
+const u8 gUnknown_835B83C[] = {
+ COLLISION_WHEELIE_HOP,
+ COLLISION_ISOLATED_VERTICAL_RAIL,
+ COLLISION_ISOLATED_HORIZONTAL_RAIL,
+ COLLISION_VERTICAL_RAIL,
+ COLLISION_HORIZONTAL_RAIL,
+};
+
+void CheckAcroBikeCollision(s16 x, s16 y, u8 metatileBehavior, u8 *collision)
+{
+ u8 i;
+
+ for (i = 0; i < NELEMS(gUnknown_835B828); i++)
+ {
+ if (gUnknown_835B828[i](metatileBehavior))
+ {
+ *collision = gUnknown_835B83C[i];
+ return;
+ }
+ }
+}
+
+void SetPlayerAvatarTransitionFlags(bool16 flags)
+{
+ gPlayerAvatar.unk1 |= flags;
+ DoPlayerAvatarTransition();
+}
+
+void (*const gUnknown_835B844[])(struct ObjectEvent *) = {
+ PlayerAvatarTransition_Normal,
+ PlayerAvatarTransition_Bike,
+ PlayerAvatarTransition_Bike,
+ PlayerAvatarTransition_Surfing,
+ PlayerAvatarTransition_Underwater,
+ PlayerAvatarTransition_ReturnToField,
+ PlayerAvatarTransition_Dummy,
+ PlayerAvatarTransition_Dummy
+};
+
+void DoPlayerAvatarTransition(void)
+{
+ u8 i;
+ u8 flags = gPlayerAvatar.unk1;
+
+ if (flags != 0)
+ {
+ for (i = 0; i < NELEMS(gUnknown_835B844); i++, flags >>= 1)
+ {
+ if (flags & 1)
+ gUnknown_835B844[i](&gObjectEvents[gPlayerAvatar.objectEventId]);
+ }
+ gPlayerAvatar.unk1 = 0;
+ }
+}
+
+void PlayerAvatarTransition_Dummy(struct ObjectEvent * playerObjEvent)
+{
+
+}
+
+void PlayerAvatarTransition_Normal(struct ObjectEvent * playerObjEvent)
+{
+ sub_8150474(0);
+ sub_8150498(0);
+}
+
+void PlayerAvatarTransition_Bike(struct ObjectEvent * playerObjEvent)
+{
+ sub_8150474(1);
+ sub_8150498(1);
+ sub_80BD620(0, 0);
+}
+
+void PlayerAvatarTransition_Surfing(struct ObjectEvent * playerObjEvent)
+{
+ sub_8150474(3);
+ sub_8150498(3);
+}
+
+void PlayerAvatarTransition_Underwater(struct ObjectEvent * playerObjEvent)
+{
+
+}
+
+void PlayerAvatarTransition_ReturnToField(struct ObjectEvent * playerObjEvent)
+{
+ gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_FORCED_MVMT_DISABLED;
+}
+
+void sub_805BEB8(void)
+{
+ gPlayerAvatar.tileTransitionState = T_NOT_MOVING;
+ if (PlayerIsAnimActive())
+ {
+ if (!PlayerCheckIfAnimFinishedOrInactive())
+ {
+ if (!player_is_anim_in_certain_ranges())
+ gPlayerAvatar.tileTransitionState = T_TILE_TRANSITION;
+ }
+ else
+ {
+ if (!sub_805BF58())
+ gPlayerAvatar.tileTransitionState = T_TILE_CENTER;
+ }
+ }
+}
+
+bool8 player_is_anim_in_certain_ranges(void)
+{
+ u8 movementActionId = gObjectEvents[gPlayerAvatar.objectEventId].movementActionId;
+
+ if (movementActionId <= MOVEMENT_ACTION_FACE_RIGHT_FAST
+ || (movementActionId >= MOVEMENT_ACTION_DELAY_1 && movementActionId <= MOVEMENT_ACTION_DELAY_16)
+ || (movementActionId >= MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN && movementActionId <= MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_RIGHT)
+ || (movementActionId >= MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN && movementActionId <= MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT)
+ || (movementActionId >= MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN && movementActionId <= MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 sub_805BF58(void)
+{
+ if (player_is_anim_in_certain_ranges() && gPlayerAvatar.runningState != TURN_DIRECTION)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 PlayerIsAnimActive(void)
+{
+ return ObjectEventIsMovementOverridden(&gObjectEvents[gPlayerAvatar.objectEventId]);
+}
+
+bool8 PlayerCheckIfAnimFinishedOrInactive(void)
+{
+ return ObjectEventCheckHeldMovementStatus(&gObjectEvents[gPlayerAvatar.objectEventId]);
+}
+
+void PlayerSetCopyableMovement(u8 a)
+{
+ gObjectEvents[gPlayerAvatar.objectEventId].playerCopyableMovement = a;
+}
+
+u8 PlayerGetCopyableMovement(void)
+{
+ return gObjectEvents[gPlayerAvatar.objectEventId].playerCopyableMovement;
+}