diff options
Diffstat (limited to 'src/field_player_avatar.c')
-rw-r--r-- | src/field_player_avatar.c | 164 |
1 files changed, 85 insertions, 79 deletions
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index cb2beacee..f0a8da7d7 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -4,11 +4,10 @@ #include "event_data.h" #include "event_object_movement.h" #include "field_camera.h" -#include "field_player_avatar.h" #include "field_effect.h" #include "field_effect_helpers.h" +#include "field_player_avatar.h" #include "fieldmap.h" -#include "global.fieldmap.h" #include "menu.h" #include "metatile_behavior.h" #include "overworld.h" @@ -25,6 +24,7 @@ #include "constants/abilities.h" #include "constants/event_objects.h" #include "constants/event_object_movement_constants.h" +#include "constants/field_effects.h" #include "constants/flags.h" #include "constants/maps.h" #include "constants/moves.h" @@ -32,42 +32,18 @@ #include "constants/species.h" static EWRAM_DATA u8 gUnknown_0203734C = 0; -EWRAM_DATA struct EventObject gEventObjects[NUM_EVENT_OBJECTS] = {}; +EWRAM_DATA struct EventObject gEventObjects[EVENT_OBJECTS_COUNT] = {}; EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {}; -static void StartStrengthAnim(u8, u8); -static bool8 ShouldJumpLedge(s16, s16, u8); -static bool8 sub_808B1BC(s16, s16, u8); -static u8 sub_808B164(struct EventObject *, s16, s16, u8, u8); -static u8 sub_808B238(s16, s16, u8); -static void check_acro_bike_metatile(s16, s16, u8, u8 *); -static void PlayerNotOnBikeCollide(u8); -static void PlayCollisionSoundIfNotFacingWarp(u8 a); -static void PlayerNotOnBikeCollideWithFarawayIslandMew(u8); -static void PlayerRun(u8); -static void MovePlayerNotOnBike(u8, u16); -static u8 CheckMovementInputNotOnBike(u8); -static void DoPlayerMatSpin(void); -static void DoPlayerMatJump(void); -static u8 CheckForPlayerAvatarCollision(u8); +// static declarations + static u8 EventObjectCB2_NoMovement2(); -static void sub_808C280(struct EventObject *); static bool8 TryInterruptEventObjectSpecialAnim(struct EventObject *, u8); static void npc_clear_strange_bits(struct EventObject *); -static void DoPlayerAvatarTransition(void); -static bool8 player_is_anim_in_certain_ranges(void); -static bool8 sub_808B618(void); -static bool8 PlayerIsAnimActive(void); -static bool8 PlayerCheckIfAnimFinishedOrInactive(void); -static bool8 TryDoMetatileBehaviorForcedMovement(); static void MovePlayerAvatarUsingKeypadInput(u8, u16, u16); static void PlayerAllowForcedMovementIfMovingSameDirection(); -static u8 sub_808B028(u8); +static bool8 TryDoMetatileBehaviorForcedMovement(); static u8 GetForcedMovementByMetatileBehavior(); -static void PlayerNotOnBikeNotMoving(u8, u16); -static void PlayerNotOnBikeTurningInPlace(u8, u16); -static void PlayerNotOnBikeMoving(u8, u16); -static void sub_808C750(u8); static bool8 ForcedMovement_None(void); static bool8 ForcedMovement_Slip(void); @@ -87,25 +63,63 @@ static bool8 ForcedMovement_0xBB(void); static bool8 ForcedMovement_0xBC(void); static bool8 ForcedMovement_MuddySlope(void); +static void MovePlayerNotOnBike(u8, u16); +static u8 CheckMovementInputNotOnBike(u8); +static void PlayerNotOnBikeNotMoving(u8, u16); +static void PlayerNotOnBikeTurningInPlace(u8, u16); +static void PlayerNotOnBikeMoving(u8, u16); +static u8 CheckForPlayerAvatarCollision(u8); +static u8 sub_808B028(u8); +static u8 sub_808B164(struct EventObject *, s16, s16, u8, u8); +static bool8 sub_808B1BC(s16, s16, u8); +static bool8 ShouldJumpLedge(s16, s16, u8); +static u8 sub_808B238(s16, s16, u8); +static void check_acro_bike_metatile(s16, s16, u8, u8 *); + +static void DoPlayerAvatarTransition(void); +static void PlayerAvatarTransition_Dummy(struct EventObject *a); static void PlayerAvatarTransition_Normal(struct EventObject *a); static void PlayerAvatarTransition_MachBike(struct EventObject *a); static void PlayerAvatarTransition_AcroBike(struct EventObject *a); static void PlayerAvatarTransition_Surfing(struct EventObject *a); static void PlayerAvatarTransition_Underwater(struct EventObject *a); static void PlayerAvatarTransition_ReturnToField(struct EventObject *a); -static void PlayerAvatarTransition_Dummy(struct EventObject *a); +static bool8 player_is_anim_in_certain_ranges(void); +static bool8 sub_808B618(void); +static bool8 PlayerIsAnimActive(void); +static bool8 PlayerCheckIfAnimFinishedOrInactive(void); + +static void PlayerRun(u8); +static void PlayerNotOnBikeCollide(u8); +static void PlayerNotOnBikeCollideWithFarawayIslandMew(u8); + +static void PlayCollisionSoundIfNotFacingWarp(u8 a); + +static void sub_808C280(struct EventObject *); + +static void StartStrengthAnim(u8, u8); +static void Task_BumpBoulder(u8 taskId); static u8 sub_808C3A4(struct Task *task, struct EventObject *playerObject, struct EventObject *strengthObject); static u8 do_boulder_dust(struct Task *task, struct EventObject *playerObject, struct EventObject *strengthObject); static u8 sub_808C484(struct Task *task, struct EventObject *playerObject, struct EventObject *strengthObject); +static void DoPlayerMatJump(void); +static void DoPlayerAvatarSecretBaseMatJump(u8 taskId); static u8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct EventObject *eventObject); +static void DoPlayerMatSpin(void); +static void PlayerAvatar_DoSecretBaseMatSpin(u8 taskId); static bool8 PlayerAvatar_SecretBaseMatSpinStep0(struct Task *task, struct EventObject *eventObject); static bool8 PlayerAvatar_SecretBaseMatSpinStep1(struct Task *task, struct EventObject *eventObject); static bool8 PlayerAvatar_SecretBaseMatSpinStep2(struct Task *task, struct EventObject *eventObject); static bool8 PlayerAvatar_SecretBaseMatSpinStep3(struct Task *task, struct EventObject *eventObject); +static void sub_808C750(u8); +static void taskFF_0805D1D4(u8 taskId); +static void sub_808C814(u8 taskId); + +static void Task_Fishing(u8 taskId); static u8 Fishing1(struct Task *task); static u8 Fishing2(struct Task *task); static u8 Fishing3(struct Task *task); @@ -122,8 +136,13 @@ static u8 Fishing13(struct Task *task); static u8 Fishing14(struct Task *task); static u8 Fishing15(struct Task *task); static u8 Fishing16(struct Task *task); +static void AlignFishingAnimationFrames(void); -static bool8 (*const gUnknown_084973FC[])(u8) = +static u8 sub_808D38C(struct EventObject *object, s16 *a1); + +// .rodata + +static bool8 (*const sForcedMovementTestFuncs[])(u8) = { MetatileBehavior_IsTrickHouseSlipperyFloor, MetatileBehavior_IsIce_2, @@ -145,7 +164,7 @@ static bool8 (*const gUnknown_084973FC[])(u8) = MetatileBehavior_IsMuddySlope, }; -static bool8 (*const gUnknown_08497444[])(void) = +static bool8 (*const sForcedMovementFuncs[])(void) = { ForcedMovement_None, ForcedMovement_Slip, @@ -283,14 +302,15 @@ static bool8 (*const sPlayerAvatarSecretBaseMatSpin[])(struct Task *, struct Eve }; // .text + void MovementType_Player(struct Sprite *sprite) { - UpdateEventObjectCurrentMovement(&gEventObjects[sprite->data[0]], sprite, EventObjectCB2_NoMovement2); + UpdateEventObjectCurrentMovement(&gEventObjects[sprite->data[0]], sprite, EventObjectCB2_NoMovement2); } static u8 EventObjectCB2_NoMovement2(void) { - return 0; + return 0; } void player_step(u8 direction, u16 newKeys, u16 heldKeys) @@ -380,7 +400,7 @@ static void PlayerAllowForcedMovementIfMovingSameDirection(void) static bool8 TryDoMetatileBehaviorForcedMovement(void) { - return gUnknown_08497444[GetForcedMovementByMetatileBehavior()](); + return sForcedMovementFuncs[GetForcedMovementByMetatileBehavior()](); } static u8 GetForcedMovementByMetatileBehavior(void) @@ -393,7 +413,7 @@ static u8 GetForcedMovementByMetatileBehavior(void) for (i = 0; i < 18; i++) { - if (gUnknown_084973FC[i](metatileBehavior)) + if (sForcedMovementTestFuncs[i](metatileBehavior)) return i + 1; } } @@ -622,7 +642,7 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) { - // speed 2 is fast, same speed as running + // speed 2 is fast, same speed as running PlayerGoSpeed2(direction); return; } @@ -728,18 +748,18 @@ static u8 sub_808B238(s16 x, s16 y, u8 direction) { u8 eventObjectId = GetEventObjectIdByXY(x, y); - if (eventObjectId != 16 && gEventObjects[eventObjectId].graphicsId == 0x57) + if (eventObjectId != 16 && gEventObjects[eventObjectId].graphicsId == EVENT_OBJ_GFX_PUSHABLE_BOULDER) + { + x = gEventObjects[eventObjectId].currentCoords.x; + y = gEventObjects[eventObjectId].currentCoords.y; + MoveCoords(direction, &x, &y); + if (GetCollisionAtCoords(&gEventObjects[eventObjectId], x, y, direction) == 0 + && MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(x, y)) == 0) { - x = gEventObjects[eventObjectId].currentCoords.x; - y = gEventObjects[eventObjectId].currentCoords.y; - MoveCoords(direction, &x, &y); - if (GetCollisionAtCoords(&gEventObjects[eventObjectId], x, y, direction) == 0 - && MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(x, y)) == 0) - { - StartStrengthAnim(eventObjectId, direction); - return 1; - } + StartStrengthAnim(eventObjectId, direction); + return 1; } + } } return 0; } @@ -981,7 +1001,7 @@ void PlayerGoSpeed4(u8 a) PlayerSetAnimId(GetWalkFastestMovementAction(a), 2); } -void PlayerRun(u8 a) +static void PlayerRun(u8 a) { PlayerSetAnimId(GetPlayerRunMovementAction(a), 2); } @@ -997,13 +1017,13 @@ void PlayerOnBikeCollideWithFarawayIslandMew(u8 a) PlayerSetAnimId(GetWalkInPlaceNormalMovementAction(a), 2); } -void PlayerNotOnBikeCollide(u8 a) +static void PlayerNotOnBikeCollide(u8 a) { PlayCollisionSoundIfNotFacingWarp(a); PlayerSetAnimId(GetWalkInPlaceSlowMovementAction(a), 2); } -void PlayerNotOnBikeCollideWithFarawayIslandMew(u8 a) +static void PlayerNotOnBikeCollideWithFarawayIslandMew(u8 a) { PlayerSetAnimId(GetWalkInPlaceSlowMovementAction(a), 2); } @@ -1450,8 +1470,6 @@ static void sub_808C280(struct EventObject *eventObject) /* Strength */ -static void Task_BumpBoulder(u8 taskId); - static void StartStrengthAnim(u8 a, u8 b) { u8 taskId = CreateTask(Task_BumpBoulder, 0xFF); @@ -1523,8 +1541,6 @@ static bool8 sub_808C484(struct Task *task, struct EventObject *playerObject, st /* Some field effect */ -static void DoPlayerAvatarSecretBaseMatJump(u8 taskId); - static void DoPlayerMatJump(void) { DoPlayerAvatarSecretBaseMatJump(CreateTask(DoPlayerAvatarSecretBaseMatJump, 0xFF)); @@ -1557,8 +1573,6 @@ static u8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct EventObject /* Some field effect */ -static void PlayerAvatar_DoSecretBaseMatSpin(u8 taskId); - static void DoPlayerMatSpin(void) { u8 taskId = CreateTask(PlayerAvatar_DoSecretBaseMatSpin, 0xFF); @@ -1632,9 +1646,6 @@ static bool8 PlayerAvatar_SecretBaseMatSpinStep3(struct Task *task, struct Event /* Some Field effect */ -static void taskFF_0805D1D4(u8 taskId); -static void sub_808C814(u8 taskId); - static void sub_808C750(u8 a) { u8 taskId; @@ -1699,9 +1710,6 @@ static bool8 (*const sFishingStateFuncs[])(struct Task *) = Fishing16, }; -static void Task_Fishing(u8 taskId); -static void sub_808CF78(void); - #define tStep data[0] #define tFrameCounter data[1] #define tNumDots data[2] @@ -1759,7 +1767,7 @@ static bool8 Fishing2(struct Task *task) static bool8 Fishing3(struct Task *task) { - sub_808CF78(); + AlignFishingAnimationFrames(); // Wait one second task->tFrameCounter++; @@ -1791,7 +1799,7 @@ static bool8 Fishing5(struct Task *task) { const u8 dot[] = _("·"); - sub_808CF78(); + AlignFishingAnimationFrames(); task->tFrameCounter++; if (gMain.newKeys & A_BUTTON) { @@ -1827,7 +1835,7 @@ static bool8 Fishing6(struct Task *task) { bool8 bite; - sub_808CF78(); + AlignFishingAnimationFrames(); task->tStep++; bite = FALSE; @@ -1872,7 +1880,7 @@ static bool8 Fishing6(struct Task *task) // Oh! A Bite! static bool8 Fishing7(struct Task *task) { - sub_808CF78(); + AlignFishingAnimationFrames(); AddTextPrinterParameterized(0, 1, gText_OhABite, 0, 17, 0, NULL); task->tStep++; task->tFrameCounter = 0; @@ -1884,7 +1892,7 @@ static bool8 Fishing8(struct Task *task) { const s16 reelTimeouts[3] = {36, 33, 30}; - sub_808CF78(); + AlignFishingAnimationFrames(); task->tFrameCounter++; if (task->tFrameCounter >= reelTimeouts[task->tFishingRod]) task->tStep = FISHING_GOT_AWAY; @@ -1903,7 +1911,7 @@ static bool8 Fishing9(struct Task *task) {70, 30} }; - sub_808CF78(); + AlignFishingAnimationFrames(); task->tStep++; if (task->tRoundsPlayed < task->tMinRoundsRequired) { @@ -1922,7 +1930,7 @@ static bool8 Fishing9(struct Task *task) static bool8 Fishing10(struct Task *task) { - sub_808CF78(); + AlignFishingAnimationFrames(); FillWindowPixelBuffer(0, 0x11); AddTextPrinterParameterized2(0, 1, gText_PokemonOnHook, 1, 0, 2, 1, 3); task->tStep++; @@ -1933,7 +1941,7 @@ static bool8 Fishing10(struct Task *task) static bool8 Fishing11(struct Task *task) { if (task->tFrameCounter == 0) - sub_808CF78(); + AlignFishingAnimationFrames(); RunTextPrinters(); @@ -1969,7 +1977,7 @@ static bool8 Fishing11(struct Task *task) // Not even a nibble static bool8 Fishing12(struct Task *task) { - sub_808CF78(); + AlignFishingAnimationFrames(); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); FillWindowPixelBuffer(0, 0x11); AddTextPrinterParameterized2(0, 1, gText_NotEvenANibble, 1, 0, 2, 1, 3); @@ -1980,7 +1988,7 @@ static bool8 Fishing12(struct Task *task) // It got away static bool8 Fishing13(struct Task *task) { - sub_808CF78(); + AlignFishingAnimationFrames(); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFishingNoCatchDirectionAnimNum(GetPlayerFacingDirection())); FillWindowPixelBuffer(0, 0x11); AddTextPrinterParameterized2(0, 1, gText_ItGotAway, 1, 0, 2, 1, 3); @@ -1991,14 +1999,14 @@ static bool8 Fishing13(struct Task *task) // Wait one second static bool8 Fishing14(struct Task *task) { - sub_808CF78(); + AlignFishingAnimationFrames(); task->tStep++; return FALSE; } static bool8 Fishing15(struct Task *task) { - sub_808CF78(); + AlignFishingAnimationFrames(); if (gSprites[gPlayerAvatar.spriteId].animEnded) { struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; @@ -2033,7 +2041,7 @@ static bool8 Fishing16(struct Task *task) #undef tFrameCounter #undef tFishingRod -static void sub_808CF78(void) +static void AlignFishingAnimationFrames(void) { struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId]; u8 animCmdIndex; @@ -2082,8 +2090,6 @@ static u8 sub_808D080(void) return gUnknown_0203734C; } -static u8 sub_808D38C(struct EventObject *object, s16 *a1); - static void sub_808D094(u8 taskId) { struct EventObject *object = &gEventObjects[gPlayerAvatar.eventObjectId]; @@ -2114,7 +2120,7 @@ static void sub_808D094(u8 taskId) data[3] -= data[2]; data[2] += 3; sprite->pos1.y = data[3] >> 4; - if (sprite->pos1.y + (s16)gUnknown_03005DE8 < -32) + if (sprite->pos1.y + (s16)gTotalCameraPixelOffsetY < -32) { data[0]++; } |