From 4d2bc68bacdff06261f7a89a24b63bf4eec97487 Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Thu, 3 Jul 2025 10:08:42 -0400 Subject: [PATCH] Child Ruto Actions Part 3: Boss room (#2602) * Child Ruto Actions Part 3: Boss room * Rename action enum members * Subtle rename of enum members --- src/overlays/actors/ovl_En_Ru1/z_en_ru1.c | 228 +++++++++++----------- src/overlays/actors/ovl_En_Ru1/z_en_ru1.h | 16 +- 2 files changed, 127 insertions(+), 117 deletions(-) diff --git a/src/overlays/actors/ovl_En_Ru1/z_en_ru1.c b/src/overlays/actors/ovl_En_Ru1/z_en_ru1.c index 07c80bbf72..8ce2e814ab 100644 --- a/src/overlays/actors/ovl_En_Ru1/z_en_ru1.c +++ b/src/overlays/actors/ovl_En_Ru1/z_en_ru1.c @@ -52,13 +52,13 @@ void EnRu1_Meeting_WalkingAwayAccel(EnRu1* this, PlayState* play); void EnRu1_Meeting_WalkingAwayConstant(EnRu1* this, PlayState* play); void EnRu1_Meeting_FallingDownHole(EnRu1* this, PlayState* play); void EnRu1_Meeting_End(EnRu1* this, PlayState* play); -void func_80AED304(EnRu1* this, PlayState* play); -void func_80AED324(EnRu1* this, PlayState* play); -void func_80AED344(EnRu1* this, PlayState* play); -void func_80AED374(EnRu1* this, PlayState* play); -void func_80AED3A4(EnRu1* this, PlayState* play); -void func_80AED3E0(EnRu1* this, PlayState* play); -void func_80AED414(EnRu1* this, PlayState* play); +void EnRu1_BossRoom_PreSpawn(EnRu1* this, PlayState* play); +void EnRu1_BossRoom_Spawn(EnRu1* this, PlayState* play); +void EnRu1_BossRoom_RiseThroughBlueWarp(EnRu1* this, PlayState* play); +void EnRu1_BossRoom_WaitInsideBlueWarp(EnRu1* this, PlayState* play); +void EnRu1_BossRoom_LinkWalksToPointInBlueWarp(EnRu1* this, PlayState* play); +void EnRu1_BossRoom_WhatTookYouSoLong(EnRu1* this, PlayState* play); +void EnRu1_BossRoom_WarpingOut(EnRu1* this, PlayState* play); void func_80AEF29C(EnRu1* this, PlayState* play); void func_80AEF2AC(EnRu1* this, PlayState* play); void func_80AEF2D0(EnRu1* this, PlayState* play); @@ -146,52 +146,52 @@ static s32 sUnused = 0; static u32 D_80AF1938 = 0; static EnRu1ActionFunc sActionFuncs[] = { - EnRu1_Fountain_GazingAtLink, // ENRU1_ACTION_FOUNTAIN_GAZING_AT_LINK - EnRu1_Fountain_Diving, // ENRU1_ACTION_FOUNTAIN_DIVING - EnRu1_Fountain_Resurfacing, // ENRU1_ACTION_FOUNTAIN_RESURFACING - EnRu1_Fountain_TreadingWater, // ENRU1_ACTION_FOUNTAIN_TREADING_WATER - EnRu1_Fountain_StartingSwimBack, // ENRU1_ACTION_FOUNTAIN_STARTING_SWIM_BACK - EnRu1_Fountain_SwimmingBack, // ENRU1_ACTION_FOUNTAIN_SWIMMING_BACK - EnRu1_Fountain_FinishingSwimBack, // ENRU1_ACTION_FOUNTAIN_FINISHING_SWIM_BACK - EnRu1_Meeting_RangeCheck, // ENRU1_ACTION_MEETING_RANGE_CHECK - EnRu1_Meeting_InitPosition, // ENRU1_ACTION_MEETING_INIT_POSITION - EnRu1_Meeting_FacingLink, // ENRU1_ACTION_MEETING_FACING_LINK - EnRu1_Meeting_TurningAround, // ENRU1_ACTION_MEETING_TURNING_AROUND - EnRu1_Meeting_WalkingAwayAccel, // ENRU1_ACTION_MEETING_WALKING_AWAY_ACCEL - EnRu1_Meeting_WalkingAwayConstant, // ENRU1_ACTION_MEETING_WALKING_AWAY_CONSTANT - EnRu1_Meeting_FallingDownHole, // ENRU1_ACTION_MEETING_FALLING_DOWN_HOLE - EnRu1_Meeting_End, // ENRU1_ACTION_MEETING_END - func_80AED304, // ENRU1_ACTION_15 - func_80AED324, // ENRU1_ACTION_16 - func_80AED344, // ENRU1_ACTION_17 - func_80AED374, // ENRU1_ACTION_18 - func_80AED3A4, // ENRU1_ACTION_19 - func_80AED3E0, // ENRU1_ACTION_20 - func_80AED414, // ENRU1_ACTION_21 - func_80AEF29C, // ENRU1_ACTION_22 - func_80AEF2AC, // ENRU1_ACTION_23 - func_80AEF2D0, // ENRU1_ACTION_24 - func_80AEF354, // ENRU1_ACTION_25 - func_80AEF3A8, // ENRU1_ACTION_26 - func_80AEEBD4, // ENRU1_ACTION_27 - func_80AEEC5C, // ENRU1_ACTION_28 - func_80AEECF0, // ENRU1_ACTION_29 - func_80AEED58, // ENRU1_ACTION_30 - func_80AEEDCC, // ENRU1_ACTION_31 - func_80AEEE34, // ENRU1_ACTION_32 - func_80AEEE9C, // ENRU1_ACTION_33 - func_80AEEF08, // ENRU1_ACTION_34 - func_80AEEF5C, // ENRU1_ACTION_35 - func_80AEF9D8, // ENRU1_ACTION_36 - func_80AEFA2C, // ENRU1_ACTION_37 - func_80AEFAAC, // ENRU1_ACTION_38 - func_80AEFB04, // ENRU1_ACTION_39 - func_80AEFB68, // ENRU1_ACTION_40 - func_80AEFCE8, // ENRU1_ACTION_41 - func_80AEFBC8, // ENRU1_ACTION_42 - func_80AEFC24, // ENRU1_ACTION_43 - func_80AEFECC, // ENRU1_ACTION_44 - func_80AEFF40, // ENRU1_ACTION_45 + EnRu1_Fountain_GazingAtLink, // ENRU1_ACTION_FOUNTAIN_GAZING_AT_LINK + EnRu1_Fountain_Diving, // ENRU1_ACTION_FOUNTAIN_DIVING + EnRu1_Fountain_Resurfacing, // ENRU1_ACTION_FOUNTAIN_RESURFACING + EnRu1_Fountain_TreadingWater, // ENRU1_ACTION_FOUNTAIN_TREADING_WATER + EnRu1_Fountain_StartingSwimBack, // ENRU1_ACTION_FOUNTAIN_STARTING_SWIM_BACK + EnRu1_Fountain_SwimmingBack, // ENRU1_ACTION_FOUNTAIN_SWIMMING_BACK + EnRu1_Fountain_FinishingSwimBack, // ENRU1_ACTION_FOUNTAIN_FINISHING_SWIM_BACK + EnRu1_Meeting_RangeCheck, // ENRU1_ACTION_MEETING_RANGE_CHECK + EnRu1_Meeting_InitPosition, // ENRU1_ACTION_MEETING_INIT_POSITION + EnRu1_Meeting_FacingLink, // ENRU1_ACTION_MEETING_FACING_LINK + EnRu1_Meeting_TurningAround, // ENRU1_ACTION_MEETING_TURNING_AROUND + EnRu1_Meeting_WalkingAwayAccel, // ENRU1_ACTION_MEETING_WALKING_AWAY_ACCEL + EnRu1_Meeting_WalkingAwayConstant, // ENRU1_ACTION_MEETING_WALKING_AWAY_CONSTANT + EnRu1_Meeting_FallingDownHole, // ENRU1_ACTION_MEETING_FALLING_DOWN_HOLE + EnRu1_Meeting_End, // ENRU1_ACTION_MEETING_END + EnRu1_BossRoom_PreSpawn, // ENRU1_ACTION_PRE_SPAWN_BOSS_ROOM + EnRu1_BossRoom_Spawn, // ENRU1_ACTION_SPAWN_BOSS_ROOM + EnRu1_BossRoom_RiseThroughBlueWarp, // ENRU1_ACTION_RISE_THROUGH_BLUE_WARP + EnRu1_BossRoom_WaitInsideBlueWarp, // ENRU1_ACTION_WAIT_INSIDE_BLUE_WARP + EnRu1_BossRoom_LinkWalksToPointInBlueWarp, // ENRU1_ACTION_LINK_WALKS_TO_POINT_IN_BLUE_WARP + EnRu1_BossRoom_WhatTookYouSoLong, // ENRU1_ACTION_WHAT_TOOK_YOU_SO_LONG + EnRu1_BossRoom_WarpingOut, // ENRU1_ACTION_WARPING_OUT + func_80AEF29C, // ENRU1_ACTION_22 + func_80AEF2AC, // ENRU1_ACTION_23 + func_80AEF2D0, // ENRU1_ACTION_24 + func_80AEF354, // ENRU1_ACTION_25 + func_80AEF3A8, // ENRU1_ACTION_26 + func_80AEEBD4, // ENRU1_ACTION_27 + func_80AEEC5C, // ENRU1_ACTION_28 + func_80AEECF0, // ENRU1_ACTION_29 + func_80AEED58, // ENRU1_ACTION_30 + func_80AEEDCC, // ENRU1_ACTION_31 + func_80AEEE34, // ENRU1_ACTION_32 + func_80AEEE9C, // ENRU1_ACTION_33 + func_80AEEF08, // ENRU1_ACTION_34 + func_80AEEF5C, // ENRU1_ACTION_35 + func_80AEF9D8, // ENRU1_ACTION_36 + func_80AEFA2C, // ENRU1_ACTION_37 + func_80AEFAAC, // ENRU1_ACTION_38 + func_80AEFB04, // ENRU1_ACTION_39 + func_80AEFB68, // ENRU1_ACTION_40 + func_80AEFCE8, // ENRU1_ACTION_41 + func_80AEFBC8, // ENRU1_ACTION_42 + func_80AEFC24, // ENRU1_ACTION_43 + func_80AEFECC, // ENRU1_ACTION_44 + func_80AEFF40, // ENRU1_ACTION_45 }; static EnRu1PreLimbDrawFunc sPreLimbDrawFuncs[] = { @@ -1083,7 +1083,7 @@ void EnRu1_Meeting_End(EnRu1* this, PlayState* play) { } } -void func_80AECCB0(EnRu1* this, PlayState* play) { +void EnRu1_SpawnBlueWarp(EnRu1* this, PlayState* play) { s32 pad; Vec3f* pos; s16 yawTowardsPlayer; @@ -1103,31 +1103,37 @@ void func_80AECCB0(EnRu1* this, PlayState* play) { void EnRu1_InitInBossRoom(EnRu1* this, PlayState* play) { EnRu1_AnimationChange(this, &gRutoChildWaitHandsOnHipsAnim, ANIMMODE_LOOP, 0, false); - this->action = ENRU1_ACTION_15; + this->action = ENRU1_ACTION_PRE_SPAWN_BOSS_ROOM; this->actor.shape.yOffset = -10000.0f; EnRu1_SetEyes(this, ENRU1_EYES_BLUSH); EnRu1_SetMouth(this, ENRU1_MOUTH_OPEN); } -void func_80AECE04(EnRu1* this, PlayState* play) { +/** + * Ruto rises up through the floor within the field of the blue warp. + */ +void EnRu1_Rise(EnRu1* this, PlayState* play) { this->actor.shape.yOffset += (250.0f / 3.0f); } -void func_80AECE20(EnRu1* this, PlayState* play) { +/** + * Ruto rises up in sync with Link as they warp out together. + */ +void EnRu1_RiseWithLink(EnRu1* this, PlayState* play) { s32 pad2; Player* player = GET_PLAYER(play); Vec3f* playerPos = &player->actor.world.pos; s16 shapeRotY = player->actor.shape.rot.y; s32 pad; - f32 unk_27C = this->unk_27C; + f32 xzDistToPlayer = this->xzDistToPlayerInBlueWarp; Vec3f* pos = &this->actor.world.pos; - pos->x = (Math_SinS(shapeRotY) * unk_27C) + playerPos->x; + pos->x = (Math_SinS(shapeRotY) * xzDistToPlayer) + playerPos->x; pos->y = playerPos->y; - pos->z = (Math_CosS(shapeRotY) * unk_27C) + playerPos->z; + pos->z = (Math_CosS(shapeRotY) * xzDistToPlayer) + playerPos->z; } -void func_80AECEB4(EnRu1* this, PlayState* play) { +void EnRu1_SetPlayerMarkInBlueWarp(EnRu1* this, PlayState* play) { s32 pad; Player* player = GET_PLAYER(play); Vec3f* player_unk_450 = &player->unk_450; @@ -1138,13 +1144,17 @@ void func_80AECEB4(EnRu1* this, PlayState* play) { player_unk_450->z = ((kREG(2) + 30.0f) * Math_CosS(shapeRotY)) + pos->z; } -s32 func_80AECF6C(EnRu1* this, PlayState* play) { +/** + * Checks if Link is in position inside the blue warp, facing Ruto. + * This is the condition for when Ruto starts chiding him. + */ +s32 EnRu1_IsLinkInBlueWarp(EnRu1* this, PlayState* play) { s16* shapeRotY; Player* player = GET_PLAYER(play); Player* otherPlayer; - s16 temp_f16; - f32 temp1; - f32 temp2; + s16 targetRotY; + f32 dx; + f32 dz; s32 pad2[5]; this->walkingFrame += 1.0f; @@ -1154,11 +1164,11 @@ s32 func_80AECF6C(EnRu1* this, PlayState* play) { player->actor.world.pos.y = otherPlayer->unk_450.y; player->actor.world.pos.z = otherPlayer->unk_450.z; shapeRotY = &player->actor.shape.rot.y; - temp1 = this->actor.world.pos.x - player->actor.world.pos.x; - temp2 = this->actor.world.pos.z - player->actor.world.pos.z; - temp_f16 = RAD_TO_BINANG(Math_FAtan2F(temp1, temp2)); - if (*shapeRotY != temp_f16) { - Math_SmoothStepToS(shapeRotY, temp_f16, 0x14, 0x1838, 0x64); + dx = this->actor.world.pos.x - player->actor.world.pos.x; + dz = this->actor.world.pos.z - player->actor.world.pos.z; + targetRotY = RAD_TO_BINANG(Math_FAtan2F(dx, dz)); + if (*shapeRotY != targetRotY) { + Math_SmoothStepToS(shapeRotY, targetRotY, 0x14, 0x1838, 0x64); player->actor.world.rot.y = *shapeRotY; } else { return true; @@ -1167,102 +1177,102 @@ s32 func_80AECF6C(EnRu1* this, PlayState* play) { return false; } -s32 func_80AED084(EnRu1* this, s32 state) { +s32 EnRu1_CheckBlueWarpState(EnRu1* this, s32 state) { if (this->blueWarp != NULL && this->blueWarp->rutoWarpState == state) { return true; } return false; } -void func_80AED0B0(EnRu1* this, s32 state) { +void EnRu1_SetBlueWarpState(EnRu1* this, s32 state) { if (this->blueWarp != NULL) { this->blueWarp->rutoWarpState = state; } } -void func_80AED0C8(EnRu1* this, PlayState* play) { - this->action = ENRU1_ACTION_16; +void EnRu1_TriggerSpawnInBossRoom(EnRu1* this, PlayState* play) { + this->action = ENRU1_ACTION_SPAWN_BOSS_ROOM; } -void func_80AED0D8(EnRu1* this, PlayState* play) { - this->action = ENRU1_ACTION_17; +void EnRu1_SetupRiseThroughBlueWarp(EnRu1* this, PlayState* play) { + this->action = ENRU1_ACTION_RISE_THROUGH_BLUE_WARP; this->drawConfig = ENRU1_DRAW_OPA; this->actor.world.rot.y = this->actor.yawTowardsPlayer; this->actor.shape.rot.y = this->actor.yawTowardsPlayer; - func_80AECCB0(this, play); + EnRu1_SpawnBlueWarp(this, play); } -void func_80AED110(EnRu1* this) { +void EnRu1_EndRise(EnRu1* this) { if (this->actor.shape.yOffset >= 0.0f) { - this->action = ENRU1_ACTION_18; + this->action = ENRU1_ACTION_WAIT_INSIDE_BLUE_WARP; this->actor.shape.yOffset = 0.0f; - func_80AED0B0(this, WARP_BLUE_RUTO_STATE_READY); + EnRu1_SetBlueWarpState(this, WARP_BLUE_RUTO_STATE_READY); } } -void func_80AED154(EnRu1* this, PlayState* play) { - if (func_80AED084(this, WARP_BLUE_RUTO_STATE_ENTERED)) { - this->action = ENRU1_ACTION_19; +void EnRu1_CheckLinkEnteredBlueWarp(EnRu1* this, PlayState* play) { + if (EnRu1_CheckBlueWarpState(this, WARP_BLUE_RUTO_STATE_ENTERED)) { + this->action = ENRU1_ACTION_LINK_WALKS_TO_POINT_IN_BLUE_WARP; this->walkingFrame = 0.0f; - func_80AECEB4(this, play); + EnRu1_SetPlayerMarkInBlueWarp(this, play); } } -void func_80AED19C(EnRu1* this, s32 cond) { - if (cond) { +void EnRu1_StartCrossingArmsAndLegs(EnRu1* this, s32 shouldStart) { + if (shouldStart) { Animation_Change(&this->skelAnime, &gRutoChildTransitionHandsOnHipToCrossArmsAndLegsAnim, 1.0f, 0, Animation_GetLastFrame(&gRutoChildTransitionHandsOnHipToCrossArmsAndLegsAnim), ANIMMODE_ONCE, -8.0f); - this->action = ENRU1_ACTION_20; - func_80AED0B0(this, WARP_BLUE_RUTO_STATE_3); + this->action = ENRU1_ACTION_WHAT_TOOK_YOU_SO_LONG; + EnRu1_SetBlueWarpState(this, WARP_BLUE_RUTO_STATE_3); } } -void func_80AED218(EnRu1* this, UNK_TYPE arg1) { - if (func_80AED084(this, WARP_BLUE_RUTO_STATE_TALKING)) { - if (arg1 != 0) { +void EnRu1_AdvanceAngryAnimation(EnRu1* this, s32 isTalking) { + if (EnRu1_CheckBlueWarpState(this, WARP_BLUE_RUTO_STATE_TALKING)) { + if (isTalking) { Animation_Change(&this->skelAnime, &gRutoChildWaitSittingAnim, 1.0f, 0, Animation_GetLastFrame(&gRutoChildWaitSittingAnim), ANIMMODE_LOOP, -8.0f); } - } else if (func_80AED084(this, WARP_BLUE_RUTO_STATE_WARPING)) { + } else if (EnRu1_CheckBlueWarpState(this, WARP_BLUE_RUTO_STATE_WARPING)) { Animation_Change(&this->skelAnime, &gRutoChildWaitInBlueWarpAnim, 1.0f, 0, Animation_GetLastFrame(&gRutoChildWaitInBlueWarpAnim), ANIMMODE_ONCE, -8.0f); - this->action = ENRU1_ACTION_21; - this->unk_27C = this->actor.xzDistToPlayer; + this->action = ENRU1_ACTION_WARPING_OUT; + this->xzDistToPlayerInBlueWarp = this->actor.xzDistToPlayer; } } -void func_80AED304(EnRu1* this, PlayState* play) { - func_80AED0C8(this, play); +void EnRu1_BossRoom_PreSpawn(EnRu1* this, PlayState* play) { + EnRu1_TriggerSpawnInBossRoom(this, play); } -void func_80AED324(EnRu1* this, PlayState* play) { - func_80AED0D8(this, play); +void EnRu1_BossRoom_Spawn(EnRu1* this, PlayState* play) { + EnRu1_SetupRiseThroughBlueWarp(this, play); } -void func_80AED344(EnRu1* this, PlayState* play) { - func_80AECE04(this, play); +void EnRu1_BossRoom_RiseThroughBlueWarp(EnRu1* this, PlayState* play) { + EnRu1_Rise(this, play); EnRu1_UpdateSkelAnime(this); - func_80AED110(this); + EnRu1_EndRise(this); } -void func_80AED374(EnRu1* this, PlayState* play) { +void EnRu1_BossRoom_WaitInsideBlueWarp(EnRu1* this, PlayState* play) { EnRu1_UpdateSkelAnime(this); - func_80AED154(this, play); + EnRu1_CheckLinkEnteredBlueWarp(this, play); } -void func_80AED3A4(EnRu1* this, PlayState* play) { +void EnRu1_BossRoom_LinkWalksToPointInBlueWarp(EnRu1* this, PlayState* play) { EnRu1_UpdateSkelAnime(this); - func_80AED19C(this, func_80AECF6C(this, play)); + EnRu1_StartCrossingArmsAndLegs(this, EnRu1_IsLinkInBlueWarp(this, play)); } -void func_80AED3E0(EnRu1* this, PlayState* play) { +void EnRu1_BossRoom_WhatTookYouSoLong(EnRu1* this, PlayState* play) { func_80AEAECC(this, play); - func_80AED218(this, EnRu1_UpdateSkelAnime(this)); + EnRu1_AdvanceAngryAnimation(this, EnRu1_UpdateSkelAnime(this)); } -void func_80AED414(EnRu1* this, PlayState* play) { - func_80AECE20(this, play); +void EnRu1_BossRoom_WarpingOut(EnRu1* this, PlayState* play) { + EnRu1_RiseWithLink(this, play); func_80AEAECC(this, play); EnRu1_UpdateSkelAnime(this); } diff --git a/src/overlays/actors/ovl_En_Ru1/z_en_ru1.h b/src/overlays/actors/ovl_En_Ru1/z_en_ru1.h index 62f7ff4ffd..b36a0e32f9 100644 --- a/src/overlays/actors/ovl_En_Ru1/z_en_ru1.h +++ b/src/overlays/actors/ovl_En_Ru1/z_en_ru1.h @@ -30,7 +30,7 @@ typedef struct EnRu1 { /* 0x0270 */ f32 treadTimer; /* 0x0274 */ char unk_274[0x4]; /* 0x0278 */ DoorWarp1* blueWarp; - /* 0x027C */ f32 unk_27C; + /* 0x027C */ f32 xzDistToPlayerInBlueWarp; /* 0x0280 */ s32 isFalling; /* 0x0284 */ s8 roomNum1; /* 0x0285 */ s8 roomNum2; @@ -76,13 +76,13 @@ typedef enum EnRu1Action { /* 12 */ ENRU1_ACTION_MEETING_WALKING_AWAY_CONSTANT, /* 13 */ ENRU1_ACTION_MEETING_FALLING_DOWN_HOLE, /* 14 */ ENRU1_ACTION_MEETING_END, - /* 15 */ ENRU1_ACTION_15, - /* 16 */ ENRU1_ACTION_16, - /* 17 */ ENRU1_ACTION_17, - /* 18 */ ENRU1_ACTION_18, - /* 19 */ ENRU1_ACTION_19, - /* 20 */ ENRU1_ACTION_20, - /* 21 */ ENRU1_ACTION_21, + /* 15 */ ENRU1_ACTION_PRE_SPAWN_BOSS_ROOM, + /* 16 */ ENRU1_ACTION_SPAWN_BOSS_ROOM, + /* 17 */ ENRU1_ACTION_RISE_THROUGH_BLUE_WARP, + /* 18 */ ENRU1_ACTION_WAIT_INSIDE_BLUE_WARP, + /* 19 */ ENRU1_ACTION_LINK_WALKS_TO_POINT_IN_BLUE_WARP, + /* 20 */ ENRU1_ACTION_WHAT_TOOK_YOU_SO_LONG, + /* 21 */ ENRU1_ACTION_WARPING_OUT, /* 22 */ ENRU1_ACTION_22, /* 23 */ ENRU1_ACTION_23, /* 24 */ ENRU1_ACTION_24,