1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-12 02:44:54 +00:00

Child Ruto Actions Part 3: Boss room (#2602)

* Child Ruto Actions Part 3: Boss room

* Rename action enum members

* Subtle rename of enum members
This commit is contained in:
Jordan Longstaff 2025-07-03 10:08:42 -04:00 committed by GitHub
parent fd7e88af1e
commit 4d2bc68bac
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 127 additions and 117 deletions

View file

@ -52,13 +52,13 @@ void EnRu1_Meeting_WalkingAwayAccel(EnRu1* this, PlayState* play);
void EnRu1_Meeting_WalkingAwayConstant(EnRu1* this, PlayState* play); void EnRu1_Meeting_WalkingAwayConstant(EnRu1* this, PlayState* play);
void EnRu1_Meeting_FallingDownHole(EnRu1* this, PlayState* play); void EnRu1_Meeting_FallingDownHole(EnRu1* this, PlayState* play);
void EnRu1_Meeting_End(EnRu1* this, PlayState* play); void EnRu1_Meeting_End(EnRu1* this, PlayState* play);
void func_80AED304(EnRu1* this, PlayState* play); void EnRu1_BossRoom_PreSpawn(EnRu1* this, PlayState* play);
void func_80AED324(EnRu1* this, PlayState* play); void EnRu1_BossRoom_Spawn(EnRu1* this, PlayState* play);
void func_80AED344(EnRu1* this, PlayState* play); void EnRu1_BossRoom_RiseThroughBlueWarp(EnRu1* this, PlayState* play);
void func_80AED374(EnRu1* this, PlayState* play); void EnRu1_BossRoom_WaitInsideBlueWarp(EnRu1* this, PlayState* play);
void func_80AED3A4(EnRu1* this, PlayState* play); void EnRu1_BossRoom_LinkWalksToPointInBlueWarp(EnRu1* this, PlayState* play);
void func_80AED3E0(EnRu1* this, PlayState* play); void EnRu1_BossRoom_WhatTookYouSoLong(EnRu1* this, PlayState* play);
void func_80AED414(EnRu1* this, PlayState* play); void EnRu1_BossRoom_WarpingOut(EnRu1* this, PlayState* play);
void func_80AEF29C(EnRu1* this, PlayState* play); void func_80AEF29C(EnRu1* this, PlayState* play);
void func_80AEF2AC(EnRu1* this, PlayState* play); void func_80AEF2AC(EnRu1* this, PlayState* play);
void func_80AEF2D0(EnRu1* this, PlayState* play); void func_80AEF2D0(EnRu1* this, PlayState* play);
@ -161,13 +161,13 @@ static EnRu1ActionFunc sActionFuncs[] = {
EnRu1_Meeting_WalkingAwayConstant, // ENRU1_ACTION_MEETING_WALKING_AWAY_CONSTANT EnRu1_Meeting_WalkingAwayConstant, // ENRU1_ACTION_MEETING_WALKING_AWAY_CONSTANT
EnRu1_Meeting_FallingDownHole, // ENRU1_ACTION_MEETING_FALLING_DOWN_HOLE EnRu1_Meeting_FallingDownHole, // ENRU1_ACTION_MEETING_FALLING_DOWN_HOLE
EnRu1_Meeting_End, // ENRU1_ACTION_MEETING_END EnRu1_Meeting_End, // ENRU1_ACTION_MEETING_END
func_80AED304, // ENRU1_ACTION_15 EnRu1_BossRoom_PreSpawn, // ENRU1_ACTION_PRE_SPAWN_BOSS_ROOM
func_80AED324, // ENRU1_ACTION_16 EnRu1_BossRoom_Spawn, // ENRU1_ACTION_SPAWN_BOSS_ROOM
func_80AED344, // ENRU1_ACTION_17 EnRu1_BossRoom_RiseThroughBlueWarp, // ENRU1_ACTION_RISE_THROUGH_BLUE_WARP
func_80AED374, // ENRU1_ACTION_18 EnRu1_BossRoom_WaitInsideBlueWarp, // ENRU1_ACTION_WAIT_INSIDE_BLUE_WARP
func_80AED3A4, // ENRU1_ACTION_19 EnRu1_BossRoom_LinkWalksToPointInBlueWarp, // ENRU1_ACTION_LINK_WALKS_TO_POINT_IN_BLUE_WARP
func_80AED3E0, // ENRU1_ACTION_20 EnRu1_BossRoom_WhatTookYouSoLong, // ENRU1_ACTION_WHAT_TOOK_YOU_SO_LONG
func_80AED414, // ENRU1_ACTION_21 EnRu1_BossRoom_WarpingOut, // ENRU1_ACTION_WARPING_OUT
func_80AEF29C, // ENRU1_ACTION_22 func_80AEF29C, // ENRU1_ACTION_22
func_80AEF2AC, // ENRU1_ACTION_23 func_80AEF2AC, // ENRU1_ACTION_23
func_80AEF2D0, // ENRU1_ACTION_24 func_80AEF2D0, // ENRU1_ACTION_24
@ -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; s32 pad;
Vec3f* pos; Vec3f* pos;
s16 yawTowardsPlayer; s16 yawTowardsPlayer;
@ -1103,31 +1103,37 @@ void func_80AECCB0(EnRu1* this, PlayState* play) {
void EnRu1_InitInBossRoom(EnRu1* this, PlayState* play) { void EnRu1_InitInBossRoom(EnRu1* this, PlayState* play) {
EnRu1_AnimationChange(this, &gRutoChildWaitHandsOnHipsAnim, ANIMMODE_LOOP, 0, false); 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; this->actor.shape.yOffset = -10000.0f;
EnRu1_SetEyes(this, ENRU1_EYES_BLUSH); EnRu1_SetEyes(this, ENRU1_EYES_BLUSH);
EnRu1_SetMouth(this, ENRU1_MOUTH_OPEN); 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); 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; s32 pad2;
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
Vec3f* playerPos = &player->actor.world.pos; Vec3f* playerPos = &player->actor.world.pos;
s16 shapeRotY = player->actor.shape.rot.y; s16 shapeRotY = player->actor.shape.rot.y;
s32 pad; s32 pad;
f32 unk_27C = this->unk_27C; f32 xzDistToPlayer = this->xzDistToPlayerInBlueWarp;
Vec3f* pos = &this->actor.world.pos; 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->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; s32 pad;
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
Vec3f* player_unk_450 = &player->unk_450; 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; 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; s16* shapeRotY;
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
Player* otherPlayer; Player* otherPlayer;
s16 temp_f16; s16 targetRotY;
f32 temp1; f32 dx;
f32 temp2; f32 dz;
s32 pad2[5]; s32 pad2[5];
this->walkingFrame += 1.0f; 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.y = otherPlayer->unk_450.y;
player->actor.world.pos.z = otherPlayer->unk_450.z; player->actor.world.pos.z = otherPlayer->unk_450.z;
shapeRotY = &player->actor.shape.rot.y; shapeRotY = &player->actor.shape.rot.y;
temp1 = this->actor.world.pos.x - player->actor.world.pos.x; dx = this->actor.world.pos.x - player->actor.world.pos.x;
temp2 = this->actor.world.pos.z - player->actor.world.pos.z; dz = this->actor.world.pos.z - player->actor.world.pos.z;
temp_f16 = RAD_TO_BINANG(Math_FAtan2F(temp1, temp2)); targetRotY = RAD_TO_BINANG(Math_FAtan2F(dx, dz));
if (*shapeRotY != temp_f16) { if (*shapeRotY != targetRotY) {
Math_SmoothStepToS(shapeRotY, temp_f16, 0x14, 0x1838, 0x64); Math_SmoothStepToS(shapeRotY, targetRotY, 0x14, 0x1838, 0x64);
player->actor.world.rot.y = *shapeRotY; player->actor.world.rot.y = *shapeRotY;
} else { } else {
return true; return true;
@ -1167,102 +1177,102 @@ s32 func_80AECF6C(EnRu1* this, PlayState* play) {
return false; return false;
} }
s32 func_80AED084(EnRu1* this, s32 state) { s32 EnRu1_CheckBlueWarpState(EnRu1* this, s32 state) {
if (this->blueWarp != NULL && this->blueWarp->rutoWarpState == state) { if (this->blueWarp != NULL && this->blueWarp->rutoWarpState == state) {
return true; return true;
} }
return false; return false;
} }
void func_80AED0B0(EnRu1* this, s32 state) { void EnRu1_SetBlueWarpState(EnRu1* this, s32 state) {
if (this->blueWarp != NULL) { if (this->blueWarp != NULL) {
this->blueWarp->rutoWarpState = state; this->blueWarp->rutoWarpState = state;
} }
} }
void func_80AED0C8(EnRu1* this, PlayState* play) { void EnRu1_TriggerSpawnInBossRoom(EnRu1* this, PlayState* play) {
this->action = ENRU1_ACTION_16; this->action = ENRU1_ACTION_SPAWN_BOSS_ROOM;
} }
void func_80AED0D8(EnRu1* this, PlayState* play) { void EnRu1_SetupRiseThroughBlueWarp(EnRu1* this, PlayState* play) {
this->action = ENRU1_ACTION_17; this->action = ENRU1_ACTION_RISE_THROUGH_BLUE_WARP;
this->drawConfig = ENRU1_DRAW_OPA; this->drawConfig = ENRU1_DRAW_OPA;
this->actor.world.rot.y = this->actor.yawTowardsPlayer; this->actor.world.rot.y = this->actor.yawTowardsPlayer;
this->actor.shape.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) { 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; 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) { void EnRu1_CheckLinkEnteredBlueWarp(EnRu1* this, PlayState* play) {
if (func_80AED084(this, WARP_BLUE_RUTO_STATE_ENTERED)) { if (EnRu1_CheckBlueWarpState(this, WARP_BLUE_RUTO_STATE_ENTERED)) {
this->action = ENRU1_ACTION_19; this->action = ENRU1_ACTION_LINK_WALKS_TO_POINT_IN_BLUE_WARP;
this->walkingFrame = 0.0f; this->walkingFrame = 0.0f;
func_80AECEB4(this, play); EnRu1_SetPlayerMarkInBlueWarp(this, play);
} }
} }
void func_80AED19C(EnRu1* this, s32 cond) { void EnRu1_StartCrossingArmsAndLegs(EnRu1* this, s32 shouldStart) {
if (cond) { if (shouldStart) {
Animation_Change(&this->skelAnime, &gRutoChildTransitionHandsOnHipToCrossArmsAndLegsAnim, 1.0f, 0, Animation_Change(&this->skelAnime, &gRutoChildTransitionHandsOnHipToCrossArmsAndLegsAnim, 1.0f, 0,
Animation_GetLastFrame(&gRutoChildTransitionHandsOnHipToCrossArmsAndLegsAnim), ANIMMODE_ONCE, Animation_GetLastFrame(&gRutoChildTransitionHandsOnHipToCrossArmsAndLegsAnim), ANIMMODE_ONCE,
-8.0f); -8.0f);
this->action = ENRU1_ACTION_20; this->action = ENRU1_ACTION_WHAT_TOOK_YOU_SO_LONG;
func_80AED0B0(this, WARP_BLUE_RUTO_STATE_3); EnRu1_SetBlueWarpState(this, WARP_BLUE_RUTO_STATE_3);
} }
} }
void func_80AED218(EnRu1* this, UNK_TYPE arg1) { void EnRu1_AdvanceAngryAnimation(EnRu1* this, s32 isTalking) {
if (func_80AED084(this, WARP_BLUE_RUTO_STATE_TALKING)) { if (EnRu1_CheckBlueWarpState(this, WARP_BLUE_RUTO_STATE_TALKING)) {
if (arg1 != 0) { if (isTalking) {
Animation_Change(&this->skelAnime, &gRutoChildWaitSittingAnim, 1.0f, 0, Animation_Change(&this->skelAnime, &gRutoChildWaitSittingAnim, 1.0f, 0,
Animation_GetLastFrame(&gRutoChildWaitSittingAnim), ANIMMODE_LOOP, -8.0f); 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_Change(&this->skelAnime, &gRutoChildWaitInBlueWarpAnim, 1.0f, 0,
Animation_GetLastFrame(&gRutoChildWaitInBlueWarpAnim), ANIMMODE_ONCE, -8.0f); Animation_GetLastFrame(&gRutoChildWaitInBlueWarpAnim), ANIMMODE_ONCE, -8.0f);
this->action = ENRU1_ACTION_21; this->action = ENRU1_ACTION_WARPING_OUT;
this->unk_27C = this->actor.xzDistToPlayer; this->xzDistToPlayerInBlueWarp = this->actor.xzDistToPlayer;
} }
} }
void func_80AED304(EnRu1* this, PlayState* play) { void EnRu1_BossRoom_PreSpawn(EnRu1* this, PlayState* play) {
func_80AED0C8(this, play); EnRu1_TriggerSpawnInBossRoom(this, play);
} }
void func_80AED324(EnRu1* this, PlayState* play) { void EnRu1_BossRoom_Spawn(EnRu1* this, PlayState* play) {
func_80AED0D8(this, play); EnRu1_SetupRiseThroughBlueWarp(this, play);
} }
void func_80AED344(EnRu1* this, PlayState* play) { void EnRu1_BossRoom_RiseThroughBlueWarp(EnRu1* this, PlayState* play) {
func_80AECE04(this, play); EnRu1_Rise(this, play);
EnRu1_UpdateSkelAnime(this); 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); 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); 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_80AEAECC(this, play);
func_80AED218(this, EnRu1_UpdateSkelAnime(this)); EnRu1_AdvanceAngryAnimation(this, EnRu1_UpdateSkelAnime(this));
} }
void func_80AED414(EnRu1* this, PlayState* play) { void EnRu1_BossRoom_WarpingOut(EnRu1* this, PlayState* play) {
func_80AECE20(this, play); EnRu1_RiseWithLink(this, play);
func_80AEAECC(this, play); func_80AEAECC(this, play);
EnRu1_UpdateSkelAnime(this); EnRu1_UpdateSkelAnime(this);
} }

View file

@ -30,7 +30,7 @@ typedef struct EnRu1 {
/* 0x0270 */ f32 treadTimer; /* 0x0270 */ f32 treadTimer;
/* 0x0274 */ char unk_274[0x4]; /* 0x0274 */ char unk_274[0x4];
/* 0x0278 */ DoorWarp1* blueWarp; /* 0x0278 */ DoorWarp1* blueWarp;
/* 0x027C */ f32 unk_27C; /* 0x027C */ f32 xzDistToPlayerInBlueWarp;
/* 0x0280 */ s32 isFalling; /* 0x0280 */ s32 isFalling;
/* 0x0284 */ s8 roomNum1; /* 0x0284 */ s8 roomNum1;
/* 0x0285 */ s8 roomNum2; /* 0x0285 */ s8 roomNum2;
@ -76,13 +76,13 @@ typedef enum EnRu1Action {
/* 12 */ ENRU1_ACTION_MEETING_WALKING_AWAY_CONSTANT, /* 12 */ ENRU1_ACTION_MEETING_WALKING_AWAY_CONSTANT,
/* 13 */ ENRU1_ACTION_MEETING_FALLING_DOWN_HOLE, /* 13 */ ENRU1_ACTION_MEETING_FALLING_DOWN_HOLE,
/* 14 */ ENRU1_ACTION_MEETING_END, /* 14 */ ENRU1_ACTION_MEETING_END,
/* 15 */ ENRU1_ACTION_15, /* 15 */ ENRU1_ACTION_PRE_SPAWN_BOSS_ROOM,
/* 16 */ ENRU1_ACTION_16, /* 16 */ ENRU1_ACTION_SPAWN_BOSS_ROOM,
/* 17 */ ENRU1_ACTION_17, /* 17 */ ENRU1_ACTION_RISE_THROUGH_BLUE_WARP,
/* 18 */ ENRU1_ACTION_18, /* 18 */ ENRU1_ACTION_WAIT_INSIDE_BLUE_WARP,
/* 19 */ ENRU1_ACTION_19, /* 19 */ ENRU1_ACTION_LINK_WALKS_TO_POINT_IN_BLUE_WARP,
/* 20 */ ENRU1_ACTION_20, /* 20 */ ENRU1_ACTION_WHAT_TOOK_YOU_SO_LONG,
/* 21 */ ENRU1_ACTION_21, /* 21 */ ENRU1_ACTION_WARPING_OUT,
/* 22 */ ENRU1_ACTION_22, /* 22 */ ENRU1_ACTION_22,
/* 23 */ ENRU1_ACTION_23, /* 23 */ ENRU1_ACTION_23,
/* 24 */ ENRU1_ACTION_24, /* 24 */ ENRU1_ACTION_24,