mirror of
https://github.com/pret/pokefirered.git
synced 2026-05-10 22:18:41 -05:00
198 lines
6.7 KiB
C
198 lines
6.7 KiB
C
#include "global.h"
|
|
#include "bike.h"
|
|
#include "script.h"
|
|
#include "task.h"
|
|
#include "field_player_avatar.h"
|
|
#include "event_object_movement.h"
|
|
#include "field_effect.h"
|
|
#include "field_effect_helpers.h"
|
|
#include "quest_log.h"
|
|
#include "quest_log_player.h"
|
|
|
|
static void QL_GfxTransition_Normal(void);
|
|
static void QL_GfxTransition_Bike(void);
|
|
static void QL_GfxTransition_Fish(void);
|
|
static void Task_QLFishMovement(u8 taskId);
|
|
static void QL_GfxTransition_StartSurf(void);
|
|
static void QL_GfxTransition_VSSeeker(void);
|
|
static void Task_QLVSSeekerMovement(u8 taskId);
|
|
static void QL_GfxTransition_StopSurfSouth(void);
|
|
static void QL_GfxTransition_StopSurfNorth(void);
|
|
static void QL_GfxTransition_StopSurfWest(void);
|
|
static void QL_GfxTransition_StopSurfEast(void);
|
|
static void QL_SetObjectGraphicsId(struct ObjectEvent *object, u8 graphicsId);
|
|
|
|
static void (*const sQLGfxTransitions[])(void) = {
|
|
[QL_PLAYER_GFX_NORMAL] = QL_GfxTransition_Normal,
|
|
[QL_PLAYER_GFX_BIKE] = QL_GfxTransition_Bike,
|
|
[QL_PLAYER_GFX_FISH] = QL_GfxTransition_Fish,
|
|
[QL_PLAYER_GFX_SURF] = QL_GfxTransition_StartSurf,
|
|
[QL_PLAYER_GFX_STOP_SURF_S] = QL_GfxTransition_StopSurfSouth,
|
|
[QL_PLAYER_GFX_STOP_SURF_N] = QL_GfxTransition_StopSurfNorth,
|
|
[QL_PLAYER_GFX_STOP_SURF_W] = QL_GfxTransition_StopSurfWest,
|
|
[QL_PLAYER_GFX_STOP_SURF_E] = QL_GfxTransition_StopSurfEast,
|
|
[QL_PLAYER_GFX_VSSEEKER] = QL_GfxTransition_VSSeeker
|
|
};
|
|
|
|
void QuestLogUpdatePlayerSprite(u8 state)
|
|
{
|
|
if (state < NELEMS(sQLGfxTransitions))
|
|
sQLGfxTransitions[state]();
|
|
}
|
|
|
|
bool32 QuestLogTryRecordPlayerAvatarGfxTransition(u8 state)
|
|
{
|
|
if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RECORDING)
|
|
{
|
|
QuestLogRecordPlayerAvatarGfxTransition(state);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void QuestLogCallUpdatePlayerSprite(u8 state)
|
|
{
|
|
return QuestLogUpdatePlayerSprite(state);
|
|
}
|
|
|
|
static void QL_GfxTransition_Normal(void)
|
|
{
|
|
struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
|
|
QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL));
|
|
ObjectEventTurn(objectEvent, objectEvent->movementDirection);
|
|
SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT);
|
|
}
|
|
|
|
static void QL_GfxTransition_Bike(void)
|
|
{
|
|
struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
|
|
QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_BIKE));
|
|
ObjectEventTurn(objectEvent, objectEvent->movementDirection);
|
|
SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_MACH_BIKE);
|
|
BikeClearState(0, 0);
|
|
}
|
|
|
|
static void QL_GfxTransition_Fish(void)
|
|
{
|
|
struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
|
|
struct Sprite *sprite = &gSprites[objectEvent->spriteId];
|
|
|
|
if (gQuestLogPlaybackState == QL_PLAYBACK_STATE_RUNNING || gQuestLogPlaybackState == QL_PLAYBACK_STATE_ACTION_END)
|
|
{
|
|
u8 taskId;
|
|
LockPlayerFieldControls();
|
|
gPlayerAvatar.preventStep = TRUE;
|
|
taskId = CreateTask(Task_QLFishMovement, 0xFF);
|
|
gTasks[taskId].data[0] = 0;
|
|
}
|
|
else
|
|
{
|
|
QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_FISH));
|
|
StartSpriteAnim(sprite, GetFishingDirectionAnimNum(objectEvent->facingDirection));
|
|
}
|
|
}
|
|
|
|
static void Task_QLFishMovement(u8 taskId)
|
|
{
|
|
struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
|
|
struct Sprite *sprite = &gSprites[objectEvent->spriteId];
|
|
|
|
switch (gTasks[taskId].data[0])
|
|
{
|
|
case 0:
|
|
ObjectEventClearHeldMovementIfActive(objectEvent);
|
|
objectEvent->enableAnim = TRUE;
|
|
QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_FISH));
|
|
StartSpriteAnim(sprite, GetFishingDirectionAnimNum(objectEvent->facingDirection));
|
|
gTasks[taskId].data[0]++;
|
|
gTasks[taskId].data[1] = 0;
|
|
break;
|
|
case 1:
|
|
AlignFishingAnimationFrames(sprite);
|
|
if (gTasks[taskId].data[1] < 60)
|
|
gTasks[taskId].data[1]++;
|
|
else
|
|
gTasks[taskId].data[0]++;
|
|
break;
|
|
case 2:
|
|
StartSpriteAnim(sprite, GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection()));
|
|
gTasks[taskId].data[0]++;
|
|
break;
|
|
case 3:
|
|
AlignFishingAnimationFrames(sprite);
|
|
if (sprite->animEnded)
|
|
{
|
|
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING))
|
|
QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_NORMAL));
|
|
else
|
|
QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE));
|
|
ObjectEventTurn(objectEvent, objectEvent->movementDirection);
|
|
sprite->x2 = 0;
|
|
sprite->y2 = 0;
|
|
UnlockPlayerFieldControls();
|
|
DestroyTask(taskId);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void QL_GfxTransition_StartSurf(void)
|
|
{
|
|
struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
|
|
u8 fieldEffectId;
|
|
|
|
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING))
|
|
{
|
|
QL_SetObjectGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_GFX_RIDE));
|
|
ObjectEventTurn(objectEvent, objectEvent->movementDirection);
|
|
SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_SURFING);
|
|
gFieldEffectArguments[0] = objectEvent->currentCoords.x;
|
|
gFieldEffectArguments[1] = objectEvent->currentCoords.y;
|
|
gFieldEffectArguments[2] = gPlayerAvatar.objectEventId;
|
|
fieldEffectId = FieldEffectStart(FLDEFF_SURF_BLOB);
|
|
objectEvent->fieldEffectSpriteId = fieldEffectId;
|
|
SetSurfBlob_BobState(fieldEffectId, BOB_PLAYER_AND_MON);
|
|
}
|
|
}
|
|
|
|
static void QL_GfxTransition_VSSeeker(void)
|
|
{
|
|
FieldEffectStart(FLDEFF_USE_VS_SEEKER);
|
|
CreateTask(Task_QLVSSeekerMovement, 0x00);
|
|
}
|
|
|
|
static void Task_QLVSSeekerMovement(u8 taskId)
|
|
{
|
|
if (!FieldEffectActiveListContains(FLDEFF_USE_VS_SEEKER))
|
|
{
|
|
UnfreezeObjectEvents();
|
|
UnlockPlayerFieldControls();
|
|
DestroyTask(taskId);
|
|
}
|
|
}
|
|
|
|
static void QL_SetObjectGraphicsId(struct ObjectEvent * object, u8 graphicsId)
|
|
{
|
|
ObjectEventSetGraphicsId(object, graphicsId);
|
|
}
|
|
|
|
static void QL_GfxTransition_StopSurfSouth(void)
|
|
{
|
|
CreateStopSurfingTask_NoMusicChange(DIR_SOUTH);
|
|
}
|
|
|
|
static void QL_GfxTransition_StopSurfNorth(void)
|
|
{
|
|
CreateStopSurfingTask_NoMusicChange(DIR_NORTH);
|
|
}
|
|
|
|
static void QL_GfxTransition_StopSurfWest(void)
|
|
{
|
|
CreateStopSurfingTask_NoMusicChange(DIR_WEST);
|
|
}
|
|
|
|
static void QL_GfxTransition_StopSurfEast(void)
|
|
{
|
|
CreateStopSurfingTask_NoMusicChange(DIR_EAST);
|
|
}
|