1 Reflections
ghoulslash edited this page 2022-02-24 14:43:33 -07:00

Better Reflection System

Process

  1. Find PlayerStep in src/field_player_avatar.c
  2. add this function above it:
static void TryHidePlayerReflection(void)
{
    if (gObjectEvents[gPlayerAvatar.objectEventId].hasReflection) {
        s16 x, y;
        struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
        x = playerObjEvent->currentCoords.x;
        y = playerObjEvent->currentCoords.y;
        MoveCoords(DIR_SOUTH, &x, &y);
        if (!MetatileBehavior_IsReflective(MapGridGetMetatileBehaviorAt(x, y)))
            playerObjEvent->hideReflection = TRUE;
        else 
            playerObjEvent->hideReflection = FALSE;
    }
}
  1. Now change the function to this:
void PlayerStep(u8 direction, u16 newKeys, u16 heldKeys)
{
    struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];

    HideShowWarpArrow(playerObjEvent);
    if (gPlayerAvatar.preventStep == FALSE)
    {
        TryHidePlayerReflection();
        Bike_TryAcroBikeHistoryUpdate(newKeys, heldKeys);
        if (TryInterruptObjectEventSpecialAnim(playerObjEvent, direction) == 0)
        {
            npc_clear_strange_bits(playerObjEvent);
            DoPlayerAvatarTransition();
            if (TryDoMetatileBehaviorForcedMovement() == 0)
            {
                MovePlayerAvatarUsingKeypadInput(direction, newKeys, heldKeys);
                PlayerAllowForcedMovementIfMovingSameDirection();
            }

            TryHidePlayerReflection();
        }
    }
}

You're done!