diff options
| author | engineer124 <47598039+engineer124@users.noreply.github.com> | 2024-12-03 12:11:00 +1100 |
|---|---|---|
| committer | Eblo <7004497+Eblo@users.noreply.github.com> | 2025-09-16 14:06:11 -0400 |
| commit | c966093e0f9fbf9a38b7e548110615d089d3029f (patch) | |
| tree | 00b3fda4bf4ff79259a43377bfd1c94625e4b5b0 | |
| parent | 6316feec296e37fc15a7004ee5bc1abf2054759b (diff) | |
Player Docs: Slide on Slope (#1752)
* slide on slope
* cleanup
| -rw-r--r-- | mm/include/z64player.h | 1 | ||||
| -rw-r--r-- | mm/src/overlays/actors/ovl_player_actor/z_player.c | 181 |
2 files changed, 96 insertions, 86 deletions
diff --git a/mm/include/z64player.h b/mm/include/z64player.h index 5a771692c..2c7efafbd 100644 --- a/mm/include/z64player.h +++ b/mm/include/z64player.h @@ -1265,6 +1265,7 @@ typedef struct Player { /* 0xAE7 */ union { s8 actionVar1; s8 startedAnim; // Player_Action_TimeTravelEnd: Started playing the animation that was previously frozen + s8 facingUpSlope; // Player_Action_SlideOnSlope: Facing uphill when sliding on a slope } av1; // "Action Variable 1": context dependent variable that has different meanings depending on what action is currently running /* 0xAE8 */ union { s16 actionVar2; diff --git a/mm/src/overlays/actors/ovl_player_actor/z_player.c b/mm/src/overlays/actors/ovl_player_actor/z_player.c index b07315abe..57e0e3a84 100644 --- a/mm/src/overlays/actors/ovl_player_actor/z_player.c +++ b/mm/src/overlays/actors/ovl_player_actor/z_player.c @@ -85,6 +85,8 @@ void func_80839A10(PlayState* play, Player* this); void func_80859CE0(PlayState* play, Player* this, s32 arg2); +void Player_Cutscene_SetPosAndYawToStart(Player* this, CsCmdActorCue* cue); + typedef enum AnimSfxType { /* 1 */ ANIMSFX_TYPE_GENERAL = 1, /* 2 */ ANIMSFX_TYPE_FLOOR, @@ -191,7 +193,7 @@ void Player_Action_69(Player* this, PlayState* play); void Player_Action_70(Player* this, PlayState* play); void Player_Action_ExchangeItem(Player* this, PlayState* play); void Player_Action_72(Player* this, PlayState* play); -void Player_Action_73(Player* this, PlayState* play); +void Player_Action_SlideOnSlope(Player* this, PlayState* play); void Player_Action_WaitForCutscene(Player* this, PlayState* play); void Player_Action_StartWarpSongArrive(Player* this, PlayState* play); void Player_Action_BlueWarpArrive(Player* this, PlayState* play); @@ -504,12 +506,12 @@ ConveyorSpeed sPlayerConveyorSpeedIndex; s16 sPlayerIsOnFloorConveyor; s16 sPlayerConveyorYaw; f32 sPlayerYDistToFloor; -FloorProperty sPlayerPrevFloorProperty; -s32 sPlayerShapeYawToTouchedWall; -s32 sPlayerWorldYawToTouchedWall; -s16 sPlayerFloorPitchShape; +FloorProperty sPrevFloorProperty; +s32 sShapeYawToTouchedWall; +s32 sWorldYawToTouchedWall; +s16 sFloorPitchShape; s32 sSavedCurrentMask; -Vec3f sPlayerInteractWallCheckResult; +Vec3f sInteractWallCheckResult; f32 D_80862B3C; FloorEffect sPlayerFloorEffect; Input* sPlayerControlInput; @@ -4429,7 +4431,7 @@ void Player_SetParallel(Player* this) { this->stateFlags1 |= PLAYER_STATE1_PARALLEL; if (!(this->skelAnime.moveFlags & ANIM_FLAG_80) && (this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && - (sPlayerShapeYawToTouchedWall < 0x2000)) { + (sShapeYawToTouchedWall < 0x2000)) { // snap to the wall this->yaw = this->actor.shape.rot.y = this->actor.wallYaw + 0x8000; } @@ -7287,8 +7289,8 @@ s32 func_808373F8(PlayState* play, Player* this, u16 sfxId) { s32 var_v1; if ((this->transformation != PLAYER_FORM_DEKU) && - ((sPlayerPrevFloorProperty == FLOOR_PROPERTY_1) || (sPlayerPrevFloorProperty == FLOOR_PROPERTY_2))) { - if (sPlayerPrevFloorProperty == FLOOR_PROPERTY_1) { + ((sPrevFloorProperty == FLOOR_PROPERTY_1) || (sPrevFloorProperty == FLOOR_PROPERTY_2))) { + if (sPrevFloorProperty == FLOOR_PROPERTY_1) { var_v1 = 4; } else { var_v1 = 5; @@ -7538,7 +7540,7 @@ s32 func_80837DEC(Player* this, PlayState* play) { temp_fv1_2 = this->actor.world.pos.y - BgCheck_EntityRaycastFloor5(&play->colCtx, &sp90, &sp88, &this->actor, &sp70); if ((temp_fv1_2 >= -11.0f) && (temp_fv1_2 <= 0.0f)) { - var_v1_2 = (sPlayerPrevFloorProperty == FLOOR_PROPERTY_6); + var_v1_2 = (sPrevFloorProperty == FLOOR_PROPERTY_6); if (!var_v1_2) { if (SurfaceType_GetWallFlags(&play->colCtx, entityPoly, entityBgId) & WALL_FLAG_3) { var_v1_2 = true; @@ -7615,7 +7617,7 @@ void func_8083827C(Player* this, PlayState* play) { return; } - if (sPlayerPrevFloorProperty == FLOOR_PROPERTY_8) { + if (sPrevFloorProperty == FLOOR_PROPERTY_8) { this->actor.world.pos.x = this->actor.prevPos.x; this->actor.world.pos.z = this->actor.prevPos.z; return; @@ -7631,7 +7633,7 @@ void func_8083827C(Player* this, PlayState* play) { return; } - if ((sPlayerPrevFloorProperty == FLOOR_PROPERTY_7) || (this->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) || + if ((sPrevFloorProperty == FLOOR_PROPERTY_7) || (this->meleeWeaponState != PLAYER_MELEE_WEAPON_STATE_0) || ((this->skelAnime.moveFlags & ANIM_FLAG_8) && func_808381F8(play, this))) { Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos); if (this->speedXZ > 0.0f) { @@ -7650,13 +7652,13 @@ void func_8083827C(Player* this, PlayState* play) { ((this->transformation != PLAYER_FORM_DEKU) || (this->remainingHopsCounter != 0)) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND_LEAVE)) { if (!(this->stateFlags1 & PLAYER_STATE1_8000000)) { - if ((sPlayerPrevFloorProperty != FLOOR_PROPERTY_6) && (sPlayerPrevFloorProperty != FLOOR_PROPERTY_9) && + if ((sPrevFloorProperty != FLOOR_PROPERTY_6) && (sPrevFloorProperty != FLOOR_PROPERTY_9) && (sPlayerYDistToFloor > 20.0f) && (this->meleeWeaponState == PLAYER_MELEE_WEAPON_STATE_0)) { if ((ABS_ALT(temp_t0) < 0x2000) && (this->speedXZ > 3.0f)) { if (!(this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR)) { if (((this->transformation == PLAYER_FORM_ZORA) && CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) || - ((sPlayerPrevFloorProperty == FLOOR_PROPERTY_11) && + ((sPrevFloorProperty == FLOOR_PROPERTY_11) && (this->transformation != PLAYER_FORM_GORON) && (this->transformation != PLAYER_FORM_DEKU))) { @@ -7681,7 +7683,7 @@ void func_8083827C(Player* this, PlayState* play) { } // Checking if the ledge is tall enough for Player to hang from - if ((sPlayerPrevFloorProperty == FLOOR_PROPERTY_9) || (sPlayerYDistToFloor <= this->ageProperties->unk_34) || + if ((sPrevFloorProperty == FLOOR_PROPERTY_9) || (sPlayerYDistToFloor <= this->ageProperties->unk_34) || !func_80837DEC(this, play)) { Player_Anim_PlayLoop(play, this, &gPlayerAnim_link_normal_landing_wait); } @@ -9499,50 +9501,54 @@ s32 Player_ActionHandler_3(Player* this, PlayState* play) { return false; } -PlayerAnimationHeader* sPlayerSlopeSlipAnims[] = { +PlayerAnimationHeader* sSlopeSlideAnims[] = { &gPlayerAnim_link_normal_down_slope_slip, &gPlayerAnim_link_normal_up_slope_slip, }; s32 Player_HandleSlopes(PlayState* play, Player* this) { - if (!Player_InBlockingCsMode(play, this) && !(this->cylinder.base.ocFlags1 & OC1_HIT)) { - if ((Player_Action_73 != this->actionFunc) && (Player_Action_96 != this->actionFunc) && - (sPlayerFloorEffect == FLOOR_EFFECT_1)) { - s16 playerVelYaw = Math_Atan2S_XY(this->actor.velocity.z, this->actor.velocity.x); - Vec3f slopeNormal; - s16 downwardSlopeYaw; - s16 velYawToDownwardSlope; - f32 slopeSlowdownSpeed; - f32 temp_fv1; - f32 var_fa1; - f32 slopeSlowdownSpeedStep; + if (!Player_InBlockingCsMode(play, this) && !(this->cylinder.base.ocFlags1 & OC1_HIT) && + (Player_Action_SlideOnSlope != this->actionFunc) && (Player_Action_96 != this->actionFunc) && + (sPlayerFloorEffect == FLOOR_EFFECT_1)) { + s16 playerVelYaw = Math_Atan2S_XY(this->actor.velocity.z, this->actor.velocity.x); + Vec3f slopeNormal; + s16 downwardSlopeYaw; + s16 velYawToDownwardSlope; + f32 slopeSlowdownSpeed; + f32 temp_fv1; + f32 var_fa1; + f32 slopeSlowdownSpeedStep; - Actor_GetSlopeDirection(this->actor.floorPoly, &slopeNormal, &downwardSlopeYaw); - velYawToDownwardSlope = downwardSlopeYaw - playerVelYaw; + Actor_GetSlopeDirection(this->actor.floorPoly, &slopeNormal, &downwardSlopeYaw); + velYawToDownwardSlope = downwardSlopeYaw - playerVelYaw; - if (ABS_ALT(velYawToDownwardSlope) > 0x3E80) { // 87.9 degrees - var_fa1 = (Player_Action_96 == this->actionFunc) ? Math_CosS(this->floorPitch) : slopeNormal.y; - slopeSlowdownSpeed = (1.0f - var_fa1) * 40.0f; - temp_fv1 = fabsf(this->actor.speed) + slopeSlowdownSpeed; - slopeSlowdownSpeedStep = SQ(temp_fv1) * 0.011f; - slopeSlowdownSpeedStep = CLAMP_MIN(slopeSlowdownSpeedStep, 2.2f); + if (ABS_ALT(velYawToDownwardSlope) > 0x3E80) { // 87.9 degrees + var_fa1 = (Player_Action_96 == this->actionFunc) ? Math_CosS(this->floorPitch) : slopeNormal.y; + slopeSlowdownSpeed = (1.0f - var_fa1) * 40.0f; + temp_fv1 = fabsf(this->actor.speed) + slopeSlowdownSpeed; + slopeSlowdownSpeedStep = SQ(temp_fv1) * 0.011f; + slopeSlowdownSpeedStep = CLAMP_MIN(slopeSlowdownSpeedStep, 2.2f); - // slows down speed as player is climbing a slope - this->pushedYaw = downwardSlopeYaw; - Math_StepToF(&this->pushedSpeed, slopeSlowdownSpeed, slopeSlowdownSpeedStep); - } else { - Player_SetAction(play, this, Player_Action_73, 0); - func_8082DE50(play, this); - Player_Anim_PlayLoopMorph(play, this, sPlayerSlopeSlipAnims[this->av1.actionVar1]); - this->speedXZ = sqrtf(SQXZ(this->actor.velocity)); - this->yaw = downwardSlopeYaw; - if (sPlayerFloorPitchShape >= 0) { - this->av1.actionVar1 = 1; - Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HANG); - } + // slows down speed as player is climbing a slope + this->pushedYaw = downwardSlopeYaw; + Math_StepToF(&this->pushedSpeed, slopeSlowdownSpeed, slopeSlowdownSpeedStep); + } else { + // moving downward on the slope, causing player to slip and then slide down + Player_SetAction(play, this, Player_Action_SlideOnSlope, 0); + func_8082DE50(play, this); - return true; + // facingUpSlope has not yet been updated based on slope, so it will always be 0 here. + Player_Anim_PlayLoopMorph(play, this, sSlopeSlideAnims[this->av1.facingUpSlope]); + + this->speedXZ = sqrtf(SQXZ(this->actor.velocity)); + this->yaw = downwardSlopeYaw; + + if (sFloorPitchShape >= 0) { + this->av1.facingUpSlope = true; + Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_HANG); } + + return true; } } @@ -9910,7 +9916,7 @@ void func_8083DF38(Player* this, PlayerAnimationHeader* anim, PlayState* play) { s32 Player_ActionHandler_5(Player* this, PlayState* play) { if (!(this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) && - (this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && (sPlayerShapeYawToTouchedWall < 0x3000)) { + (this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && (sShapeYawToTouchedWall < 0x3000)) { if ((this->speedXZ > 0.0f) && func_8083D860(this, play)) { return true; } @@ -10346,10 +10352,10 @@ void func_8083F358(Player* this, s32 arg1, PlayState* play) { f32 var_fv1; s16 var_a1; - if (ABS_ALT(sPlayerFloorPitchShape) < 0xE38) { + if (ABS_ALT(sFloorPitchShape) < 0xE38) { var_a1 = 0; } else { - var_a1 = CLAMP(sPlayerFloorPitchShape, -0x2AAA, 0x2AAA); + var_a1 = CLAMP(sFloorPitchShape, -0x2AAA, 0x2AAA); } Math_ScaledStepToS(&this->unk_B70, var_a1, 0x190); @@ -10843,8 +10849,7 @@ s32 func_80840A30(PlayState* play, Player* this, f32* arg2, f32 arg3) { if (arg3 <= *arg2) { // If interacting with a wall and close to facing it - if (((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && - (sPlayerWorldYawToTouchedWall < 0x1C00)) || + if (((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && (sWorldYawToTouchedWall < 0x1C00)) || // or, impacting something's cylinder (((this->cylinder.base.ocFlags1 & OC1_HIT) && (cylinderOc = this->cylinder.base.oc) != NULL) && // and that something is a Beaver Race ring, @@ -11780,7 +11785,7 @@ s32 func_808430E0(Player* this) { } this->floorPitch = 0; this->floorPitchAlt = 0; - sPlayerFloorPitchShape = 0; + sFloorPitchShape = 0; return true; } @@ -11805,7 +11810,7 @@ void Player_ProcessSceneCollision(PlayState* play, Player* this) { u32 updBgCheckInfoFlags; s32 spAC = (Player_Action_35 == this->actionFunc) && (this->unk_397 == 4); - sPlayerPrevFloorProperty = this->floorProperty; + sPrevFloorProperty = this->floorProperty; wallCheckRadius = this->ageProperties->wallCheckRadius; ceilingCheckHeight = this->ageProperties->ceilingCheckHeight; @@ -11909,7 +11914,7 @@ void Player_ProcessSceneCollision(PlayState* play, Player* this) { sInteractWallCheckOffset.z = this->ageProperties->wallCheckRadius + 10.0f; if (Player_PosVsWallLineTest(play, this, &sInteractWallCheckOffset, &wallPoly, &wallBgId, - &sPlayerInteractWallCheckResult)) { + &sInteractWallCheckResult)) { this->actor.bgCheckFlags |= BGCHECKFLAG_PLAYER_WALL_INTERACT; if (this->actor.wallPoly != wallPoly) { @@ -11921,12 +11926,12 @@ void Player_ProcessSceneCollision(PlayState* play, Player* this) { yawDiff = this->actor.shape.rot.y - BINANG_ADD(this->actor.wallYaw, 0x8000); sPlayerTouchedWallFlags = SurfaceType_GetWallFlags(&play->colCtx, this->actor.wallPoly, this->actor.wallBgId); - sPlayerShapeYawToTouchedWall = ABS_ALT(yawDiff); + sShapeYawToTouchedWall = ABS_ALT(yawDiff); yawDiff = BINANG_SUB(this->yaw, BINANG_ADD(this->actor.wallYaw, 0x8000)); - sPlayerWorldYawToTouchedWall = ABS_ALT(yawDiff); + sWorldYawToTouchedWall = ABS_ALT(yawDiff); - speedScale = sPlayerWorldYawToTouchedWall * 0.00008f; + speedScale = sWorldYawToTouchedWall * 0.00008f; if (!(this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) || (speedScale >= 1.0f)) { this->unk_B50 = R_RUN_SPEED_LIMIT / 100.0f; @@ -11937,7 +11942,7 @@ void Player_ProcessSceneCollision(PlayState* play, Player* this) { } } - if ((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && (sPlayerShapeYawToTouchedWall < 0x3000)) { + if ((this->actor.bgCheckFlags & BGCHECKFLAG_PLAYER_WALL_INTERACT) && (sShapeYawToTouchedWall < 0x3000)) { CollisionPoly* wallPoly = this->actor.wallPoly; if (ABS_ALT(wallPoly->normal.y) < 600) { @@ -11975,7 +11980,7 @@ void Player_ProcessSceneCollision(PlayState* play, Player* this) { sInteractWallCheckOffset.y = (ledgePosY + 5.0f) - this->actor.world.pos.y; if (Player_PosVsWallLineTest(play, this, &sInteractWallCheckOffset, &poly, &bgId, - &sPlayerInteractWallCheckResult) && + &sInteractWallCheckResult) && (wallYawDiff = (s32)(this->actor.wallYaw - Math_Atan2S_XY(poly->normal.z, poly->normal.x)), ABS_ALT(wallYawDiff) < 0x4000) && !SurfaceType_CheckWallFlag1(&play->colCtx, poly, bgId)) { @@ -12055,7 +12060,7 @@ void Player_ProcessSceneCollision(PlayState* play, Player* this) { sin = Math_SinS(this->actor.shape.rot.y); cos = Math_CosS(this->actor.shape.rot.y); - sPlayerFloorPitchShape = + sFloorPitchShape = Math_Atan2S_XY(1.0f, (-(floorPolyNormalX * sin) - (floorPolyNormalZ * cos)) * floorPolyNormalY); Player_HandleSlopes(play, this); @@ -12953,7 +12958,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { if (!(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_DEAD | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_800000)) && !(this->stateFlags3 & PLAYER_STATE3_10000000)) { - if ((Player_Action_93 != this->actionFunc) && (Player_Action_73 != this->actionFunc) && + if ((Player_Action_93 != this->actionFunc) && (Player_Action_SlideOnSlope != this->actionFunc) && (this->actor.draw != NULL)) { if ((this->actor.id != ACTOR_PLAYER) && (this->csAction == PLAYER_CSACTION_110)) { this->cylinder.dim.radius = 8; @@ -18455,18 +18460,21 @@ void Player_Action_72(Player* this, PlayState* play) { } } -void Player_Action_73(Player* this, PlayState* play) { +void Player_Action_SlideOnSlope(Player* this, PlayState* play) { CollisionPoly* floorPoly; - f32 var_fv0; - f32 temp_fv1; - f32 var_fa0; + f32 speedXZTarget; + f32 speedXZIncrStep; + f32 speedXZDecrStep; s16 downwardSlopeYaw; - s16 var_v0; + s16 shapeYawTarget; Vec3f slopeNormal; this->stateFlags2 |= (PLAYER_STATE2_20 | PLAYER_STATE2_40); + PlayerAnimation_Update(play, &this->skelAnime); + func_8083FBC4(play, this); + Audio_PlaySfx_AtPosWithSyncedFreqAndVolume( &this->actor.projectedPos, Player_GetFloorSfx(this, NA_SE_PL_SLIP_LEVEL - SFX_FLAG), this->actor.speed); @@ -18485,35 +18493,38 @@ void Player_Action_73(Player* this, PlayState* play) { } Actor_GetSlopeDirection(floorPoly, &slopeNormal, &downwardSlopeYaw); - var_v0 = downwardSlopeYaw; - if (this->av1.actionVar1 != 0) { - var_v0 = downwardSlopeYaw + 0x8000; + + shapeYawTarget = downwardSlopeYaw; + if (this->av1.facingUpSlope) { + shapeYawTarget = downwardSlopeYaw + 0x8000; } + if (this->speedXZ < 0.0f) { downwardSlopeYaw += 0x8000; } - var_fv0 = (1.0f - slopeNormal.y) * 40.0f; - var_fv0 = CLAMP(var_fv0, 0.0f, 10.0f); + speedXZTarget = (1.0f - slopeNormal.y) * 40.0f; + speedXZTarget = CLAMP(speedXZTarget, 0.0f, 10.0f); + + speedXZIncrStep = SQ(speedXZTarget) * 0.015f; + speedXZDecrStep = slopeNormal.y * 0.01f; - temp_fv1 = var_fv0 * var_fv0 * 0.015f; - var_fa0 = slopeNormal.y * 0.01f; if (SurfaceType_GetFloorEffect(&play->colCtx, floorPoly, this->actor.floorBgId) != FLOOR_EFFECT_1) { - var_fv0 = 0.0f; - var_fa0 = slopeNormal.y * 10.0f; + speedXZTarget = 0.0f; + speedXZDecrStep = slopeNormal.y * 10.0f; } - temp_fv1 = CLAMP_MIN(temp_fv1, 1.0f); - if (Math_AsymStepToF(&this->speedXZ, var_fv0, temp_fv1, var_fa0) && (var_fv0 == 0.0f)) { + speedXZIncrStep = CLAMP_MIN(speedXZIncrStep, 1.0f); + + if (Math_AsymStepToF(&this->speedXZ, speedXZTarget, speedXZIncrStep, speedXZDecrStep) && (speedXZTarget == 0.0f)) { func_80836A98(this, - (this->av1.actionVar1 == 0) - ? D_8085BE84[PLAYER_ANIMGROUP_down_slope_slip_end][this->modelAnimType] - : D_8085BE84[PLAYER_ANIMGROUP_up_slope_slip_end][this->modelAnimType], + (!this->av1.facingUpSlope) ? D_8085BE84[PLAYER_ANIMGROUP_down_slope_slip_end][this->modelAnimType] + : D_8085BE84[PLAYER_ANIMGROUP_up_slope_slip_end][this->modelAnimType], play); } Math_SmoothStepToS(&this->yaw, downwardSlopeYaw, 0xA, 0xFA0, 0x320); - Math_ScaledStepToS(&this->actor.shape.rot.y, var_v0, 0x7D0); + Math_ScaledStepToS(&this->actor.shape.rot.y, shapeYawTarget, 0x7D0); } /** @@ -18539,8 +18550,6 @@ void Player_Action_StartWarpSongArrive(Player* this, PlayState* play) { Actor_Spawn(&play->actorCtx, play, ACTOR_DEMO_KANKYO, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0x10); } -void Player_Cutscene_SetPosAndYawToStart(Player* this, CsCmdActorCue* cue); - void Player_Action_BlueWarpArrive(Player* this, PlayState* play) { if (sPlayerYDistToFloor < 150.0f) { if (PlayerAnimation_Update(play, &this->skelAnime)) { |
