Boss05 (Bio Deku Baba) OK and documented (#1510)

* Init, Destroy, Update, easy actions

* Just the hard 3 + 1 left

* One left

* OK

Co-authored-by: petrie911 <69443847+petrie911@users.noreply.github.com>

* Data/bss in, extract colheader

* Clean up externs

* Better match for func_809EECBC

* Sfx

* Lot of naming

* fix build

* Name skel stuff

* name limbdraws

* name colliders

* Document `object_boss05`

* Port some names from Odolwa

* Name bio baba types (and relatedly clean up EnPp)

* Better names for the LimbDraw functions + some related vars

* Name all functions

* Name a lot of struct vars

* Colliders and body parts

* Name all struct vars (might come back for a few of these though)

* Name most stack vars

* Fragment states, ice data

* Limb rot index

* Damage effects

* Enum for hit reactions

* Enums for movement state/attack state

* Finish up

* Missed this in EnPp

* Respond to reviews

* Fix comment

* Reverse order for postlimbdraw, etc. functions

* Remove blank line at the top

* Respond to review

* Make a "getter" macro for the force detach timer

* Respond to review

---------

Co-authored-by: Elliptic Ellipsis <elliptic.ellipsis@gmail.com>
Co-authored-by: petrie911 <69443847+petrie911@users.noreply.github.com>
Co-authored-by: angie <angheloalf95@gmail.com>
This commit is contained in:
Tom Overton 2023-11-23 04:37:16 -08:00 committed by GitHub
parent c75d3b97d3
commit 3a952a655d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 1861 additions and 350 deletions

View File

@ -0,0 +1,6 @@
<Root>
<!-- Contains the collision for the Bio Deku Baba's lily pad. -->
<File Name="ovl_Boss_05" BaseAddress="0x809EE4E0" RangeStart="0x3540" RangeEnd="0x364C">
<Collision Name="sBioBabaLilypadCol" Offset="0x3620" />
</File>
</Root>

View File

@ -349,7 +349,7 @@ typedef struct {
/* 0x10 */ UNK_TYPE1 pad10[0x4];
} Room; // size = 0x14
typedef struct {
typedef struct RoomContext {
/* 0x00 */ Room curRoom;
/* 0x14 */ Room prevRoom;
/* 0x28 */ void* roomMemPages[2]; // In a scene with transitions, roomMemory is split between two pages that toggle each transition. This is one continuous range, as the second page allocates from the end

4
spec
View File

@ -2316,9 +2316,7 @@ beginseg
name "ovl_Boss_05"
compress
include "build/src/overlays/actors/ovl_Boss_05/z_boss_05.o"
include "build/data/ovl_Boss_05/ovl_Boss_05.data.o"
include "build/data/ovl_Boss_05/ovl_Boss_05.bss.o"
include "build/data/ovl_Boss_05/ovl_Boss_05.reloc.o"
include "build/src/overlays/actors/ovl_Boss_05/ovl_Boss_05_reloc.o"
endseg
beginseg

View File

@ -1953,17 +1953,17 @@ void Boss01_UpdateDamage(Boss01* this, PlayState* play) {
if (this->shieldCollider.elements[ODOLWA_SHIELD_COLLIDER_SHIELD].info.bumperFlags & BUMP_HIT) {
this->bodyInvincibilityTimer = 5;
if (this->damageTimer == 0) {
if (this->damagedTimer == 0) {
ColliderInfo* acHitInfo = this->shieldCollider.elements[ODOLWA_SHIELD_COLLIDER_SHIELD].info.acHitInfo;
if (acHitInfo->toucher.dmgFlags == DMG_SWORD_BEAM) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.focus.pos.x, this->actor.focus.pos.y,
this->actor.focus.pos.z, 0, 0, 3, CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS));
Actor_PlaySfx(&this->actor, NA_SE_IT_SHIELD_BOUND);
this->damageTimer = 5;
this->damagedTimer = 5;
}
}
} else if (this->damageTimer == 0) {
} else if (this->damagedTimer == 0) {
for (i = 0; i < ODOLWA_SWORD_COLLIDER_MAX; i++) {
if (this->swordCollider.elements[i].info.toucherFlags & TOUCH_HIT) {
this->swordCollider.elements[i].info.toucherFlags &= ~TOUCH_HIT;
@ -2014,7 +2014,7 @@ void Boss01_UpdateDamage(Boss01* this, PlayState* play) {
case ODOLWA_DMGEFF_STUN:
stunned:
Boss01_SetupStunned(this, play);
this->damageTimer = 15;
this->damagedTimer = 15;
Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->canGuardOrEvade = false;
return;
@ -2030,14 +2030,14 @@ void Boss01_UpdateDamage(Boss01* this, PlayState* play) {
//! @bug: unreachable code. If Odolwa's damage effect is ODOLWA_DMGEFF_STUN, we early-return out of
//! the function in the above switch statement.
Boss01_SetupStunned(this, play);
this->damageTimer = 15;
this->damagedTimer = 15;
} else if (this->actor.colChkInfo.damageEffect == ODOLWA_DMGEFF_DAZE) {
Boss01_SetupDazed(this, play);
Audio_PlaySfx_AtPos(&sOdolwaDamageSfxPos, NA_SE_EN_MIBOSS_DAMAGE_OLD);
this->damageTimer = 15;
this->damagedTimer = 15;
} else {
this->damageFlashTimer = 15;
this->damageTimer = 5;
this->damagedFlashTimer = 15;
this->damagedTimer = 5;
this->actor.colChkInfo.health -= damage;
if ((s8)this->actor.colChkInfo.health <= 0) {
Boss01_SetupDeathCutscene(this, play);
@ -2382,8 +2382,8 @@ void Boss01_Update(Actor* thisx, PlayState* play2) {
DECR(this->timers[i]);
}
DECR(this->damageTimer);
DECR(this->damageFlashTimer);
DECR(this->damagedTimer);
DECR(this->damagedFlashTimer);
this->actor.flags |= ACTOR_FLAG_TARGETABLE;
this->actionFunc(this, play);
@ -2896,7 +2896,7 @@ void Boss01_Draw(Actor* thisx, PlayState* play) {
Gfx_SetupDL25_Opa(play->state.gfxCtx);
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
if (this->damageFlashTimer & 1) {
if ((this->damagedFlashTimer % 2) != 0) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 0, 0, 255, 900, 1099);
}
@ -3252,16 +3252,16 @@ void Boss01_Bug_UpdateDamage(Boss01* this, PlayState* play) {
this->bugACCollider.base.acFlags &= ~AC_HIT;
acHitInfo = this->bugACCollider.info.acHitInfo;
if (this->damageTimer == 0) {
if (this->damagedTimer == 0) {
Matrix_RotateYS(this->actor.yawTowardsPlayer, MTXMODE_NEW);
if (acHitInfo->toucher.dmgFlags & 0x300000) {
this->damageTimer = 10;
this->damagedTimer = 10;
Matrix_MultVecZ(-10.0f, &additionalVelocity);
this->additionalVelocityX = additionalVelocity.x;
this->additionalVelocityZ = additionalVelocity.z;
} else {
this->damageTimer = 15;
this->damageFlashTimer = 15;
this->damagedTimer = 15;
this->damagedFlashTimer = 15;
Matrix_MultVecZ(-20.0f, &additionalVelocity);
this->additionalVelocityX = additionalVelocity.x;
this->additionalVelocityZ = additionalVelocity.z;
@ -3294,7 +3294,7 @@ void Boss01_Bug_UpdateDamage(Boss01* this, PlayState* play) {
if ((distXZ < (KREG(49) + 210.0f)) && (distXZ > (KREG(49) + 190.0f))) {
Actor_PlaySfx(&this->actor, NA_SE_EN_MIZUBABA2_DAMAGE);
Boss01_Bug_SetupDead(this, play);
this->damageFlashTimer = 15;
this->damagedFlashTimer = 15;
this->bugDrawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE;
this->actor.speed = 0.0f;
this->actor.velocity.y = 5.0f;
@ -3313,8 +3313,8 @@ void Boss01_Bug_Update(Actor* thisx, PlayState* play) {
DECR(this->timers[i]);
}
DECR(this->damageTimer);
DECR(this->damageFlashTimer);
DECR(this->damagedTimer);
DECR(this->damagedFlashTimer);
this->actionFunc(this, play);
@ -3366,7 +3366,7 @@ void Boss01_Bug_Draw(Actor* thisx, PlayState* play) {
Gfx_SetupDL25_Opa(play->state.gfxCtx);
if (this->damageFlashTimer & 1) {
if ((this->damagedFlashTimer % 2) != 0) {
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 0, 0, 255, 900, 1099);
}

View File

@ -85,8 +85,8 @@ typedef struct Boss01 {
/* 0x14E */ s16 timers[3];
/* 0x154 */ f32 animMorphFrames1;
/* 0x158 */ f32 animMorphFrames2;
/* 0x15C */ s16 damageTimer;
/* 0x15E */ s16 damageFlashTimer;
/* 0x15C */ s16 damagedTimer;
/* 0x15E */ s16 damagedFlashTimer;
/* 0x160 */ u8 isPerformingVerticalSlash; // set, but never checked
/* 0x160 */ u8 landedFromJump;
/* 0x162 */ u8 waitType;

File diff suppressed because it is too large Load Diff

View File

@ -2,16 +2,119 @@
#define Z_BOSS_05_H
#include "global.h"
#include "assets/objects/object_boss05/object_boss05.h"
struct Boss05;
typedef void (*Boss05ActionFunc)(struct Boss05*, PlayState*);
typedef enum BioDekuBabaType {
/* 0 */ BIO_BABA_TYPE_LILY_PAD_WITH_HEAD,
/* 1 */ BIO_BABA_TYPE_NO_LEAF_LILY_PAD_WITH_HEAD,
/* 2 */ BIO_BABA_TYPE_LILY_PAD,
/* 3 */ BIO_BABA_TYPE_FALLING_HEAD,
/* 4 */ BIO_BABA_TYPE_WALKING_HEAD,
/* 10 */ BIO_BABA_TYPE_FRAGMENT_BASE = 10,
/* 10 */ BIO_BABA_TYPE_FRAGMENT_LOWER_JAW = BIO_BABA_TYPE_FRAGMENT_BASE,
/* 11 */ BIO_BABA_TYPE_FRAGMENT_UPPER_JAW,
/* 12 */ BIO_BABA_TYPE_FRAGMENT_BODY,
/* 13 */ BIO_BABA_TYPE_FRAGMENT_BACK_UPPER_LEG,
/* 14 */ BIO_BABA_TYPE_FRAGMENT_BACK_LOWER_LEG,
/* 15 */ BIO_BABA_TYPE_FRAGMENT_LEFT_UPPER_LEG,
/* 16 */ BIO_BABA_TYPE_FRAGMENT_LEFT_LOWER_LEG,
/* 17 */ BIO_BABA_TYPE_FRAGMENT_LEFT_LOWER_EYESTALK,
/* 18 */ BIO_BABA_TYPE_FRAGMENT_LEFT_UPPER_EYESTALK,
/* 19 */ BIO_BABA_TYPE_FRAGMENT_RIGHT_LOWER_EYESTALK,
/* 20 */ BIO_BABA_TYPE_FRAGMENT_RIGHT_UPPER_EYESTALK,
/* 21 */ BIO_BABA_TYPE_FRAGMENT_RIGHT_UPPER_LEG,
/* 22 */ BIO_BABA_TYPE_FRAGMENT_RIGHT_LOWER_LEG,
/* 23 */ BIO_BABA_TYPE_FRAGMENT_LEAVES,
/* 24 */ BIO_BABA_TYPE_MAX
} BioDekuBabaType;
typedef enum BioDekuBabaBodyPart {
/* 0 */ BIO_BABA_BODYPART_HEAD,
/* 1 */ BIO_BABA_BODYPART_MAX
} BioDekuBabaBodyPart;
typedef enum BioDekuBabaHeadCollider {
/* 0 */ BIO_BABA_HEAD_COLLIDER_HEAD,
/* 1 */ BIO_BABA_HEAD_COLLIDER_MAX
} BioDekuBabaHeadCollider;
typedef enum BioDekuBabaLilyPadCollider {
/* 0 */ BIO_BABA_LILY_PAD_COLLIDER_UPPER_STEM,
/* 1 */ BIO_BABA_LILY_PAD_COLLIDER_MIDDLE_STEM,
/* 2 */ BIO_BABA_LILY_PAD_COLLIDER_MAX
} BioDekuBabaLilyPadCollider;
typedef enum BioDekuBabaLilyPadWithHeadLimbRotIndex {
/* -1 */ BIO_BABA_LILY_PAD_WITH_HEAD_LIMB_ROT_INDEX_NONE = -1,
/* 0 */ BIO_BABA_LILY_PAD_WITH_HEAD_LIMB_ROT_INDEX_UPPER_STEM,
/* 1 */ BIO_BABA_LILY_PAD_WITH_HEAD_LIMB_ROT_INDEX_MIDDLE_STEM,
/* 2 */ BIO_BABA_LILY_PAD_WITH_HEAD_LIMB_ROT_INDEX_LOWER_STEM,
/* 3 */ BIO_BABA_LILY_PAD_WITH_HEAD_LIMB_ROT_INDEX_LEFT_UPPER_ARM,
/* 4 */ BIO_BABA_LILY_PAD_WITH_HEAD_LIMB_ROT_INDEX_LEFT_LOWER_ARM,
/* 5 */ BIO_BABA_LILY_PAD_WITH_HEAD_LIMB_ROT_INDEX_RIGHT_UPPER_ARM,
/* 6 */ BIO_BABA_LILY_PAD_WITH_HEAD_LIMB_ROT_INDEX_RIGHT_LOWER_ARM,
/* 7 */ BIO_BABA_LILY_PAD_WITH_HEAD_LIMB_ROT_INDEX_MAX
} BioDekuBabaLilyPadWithHeadLimbRotIndex;
#define BIO_BABA_GET_TYPE(thisx) ((thisx)->params)
#define BIO_BABA_GET_FRAGMENT_INDEX(thisx) ((thisx)->params - BIO_BABA_TYPE_FRAGMENT_BASE)
#define BIO_BABA_FORCE_DETACH_TIMER(thisx) ((thisx)->world.rot.z)
typedef struct Boss05 {
/* 0x000 */ Actor actor;
/* 0x144 */ char unk_144[0x2C];
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ union {
u8 lilyPadWithHeadAttackState;
u8 fragmentState;
};
/* 0x15E */ s16 flipAttackFrameCounter;
/* 0x160 */ s16 frameCounter;
/* 0x162 */ s16 timers[3];
/* 0x168 */ s16 forceDetachTimer;
/* 0x16A */ s16 damagedTimer;
/* 0x16C */ s16 damagedFlashTimer;
/* 0x170 */ Boss05ActionFunc actionFunc;
/* 0x174 */ char unk_174[0x394];
/* 0x174 */ u8 lilyPadWithHeadMovementState;
/* 0x176 */ s16 lilyPadRotY;
/* 0x178 */ s16 lilyPadRotX;
/* 0x17A */ s16 drawDmgEffTimer;
/* 0x17C */ f32 drawDmgEffScale;
/* 0x180 */ f32 drawDmgEffFrozenSteamScale;
/* 0x184 */ f32 drawDmgEffAlpha;
/* 0x188 */ u8 drawDmgEffState;
/* 0x189 */ u8 drawDmgEffType;
/* 0x18C */ Vec3f bodyPartsPos[BIO_BABA_BODYPART_MAX];
/* 0x198 */ f32 fallingHeadLilyPadLimbScale;
/* 0x19C */ s16 lilyPadWithHeadStemRotX;
/* 0x19E */ Vec3s lilyPadWithHeadLimbRot[BIO_BABA_LILY_PAD_WITH_HEAD_LIMB_ROT_INDEX_MAX];
/* 0x1C8 */ ColliderJntSph lilyPadCollider;
/* 0x1E8 */ ColliderJntSphElement lilyPadColliderElements[BIO_BABA_LILY_PAD_COLLIDER_MAX];
/* 0x268 */ SkelAnime lilyPadSkelAnime;
/* 0x2AC */ Vec3s lilyPadJointTable[BIO_DEKU_BABA_LILY_PAD_LIMB_MAX];
/* 0x2E8 */ Vec3s lilyPadMorphTable[BIO_DEKU_BABA_LILY_PAD_LIMB_MAX];
/* 0x324 */ union {
Vec3f headPos;
Vec3f fragmentPos;
};
/* 0x330 */ Vec3s headRot;
/* 0x338 */ f32 knockbackMagnitude;
/* 0x33C */ Vec3f knockbackVelocity;
/* 0x348 */ s16 knockbackAngle;
/* 0x34C */ Vec3f walkTargetPos;
/* 0x35C */ f32 walkAngularVelocityY;
/* 0x35C */ f32 lowerJawScaleXZ;
/* 0x360 */ f32 headBodyScale;
/* 0x364 */ f32 headLimbScale;
/* 0x368 */ ColliderJntSph headCollider;
/* 0x388 */ ColliderJntSphElement headColliderElements[BIO_BABA_HEAD_COLLIDER_MAX];
/* 0x3C8 */ SkelAnime headSkelAnime;
/* 0x40C */ Vec3s headJointTable[BIO_DEKU_BABA_HEAD_LIMB_MAX];
/* 0x484 */ Vec3s headMorphTable[BIO_DEKU_BABA_HEAD_LIMB_MAX];
/* 0x4FC */ f32 animEndFrame;
/* 0x500 */ Vec3s fragmentAngularVelocity;
} Boss05; // size = 0x508
#endif // Z_BOSS_05_H

View File

@ -34,8 +34,8 @@ void EnPp_Damaged(EnPp* this, PlayState* play);
void EnPp_SetupDead(EnPp* this, PlayState* play);
void EnPp_Dead(EnPp* this, PlayState* play);
void EnPp_Mask_Detach(EnPp* this, PlayState* play);
void EnPp_BodyPart_SetupMove(EnPp* this);
void EnPp_BodyPart_Move(EnPp* this, PlayState* play);
void EnPp_Fragment_SetupMove(EnPp* this);
void EnPp_Fragment_Move(EnPp* this, PlayState* play);
typedef enum {
/* 0 */ EN_PP_COLLISION_RESULT_OK,
@ -66,7 +66,7 @@ typedef enum {
/* 2 */ EN_PP_MASK_DETACH_STATE_DIE
} EnPpMaskDetachState;
static s32 sCurrentDeadBodyPartIndex = 0;
static s32 sCurrentFragmentIndex = 0;
typedef enum {
/* 0x0 */ EN_PP_DMGEFF_JUMP, // Forces the Hiploop to jump
@ -233,12 +233,12 @@ void EnPp_Init(Actor* thisx, PlayState* play) {
this->actor.params = EN_PP_TYPE_MASKED;
}
if (EN_PP_GET_TYPE(&this->actor) >= EN_PP_TYPE_BODY_PART_BASE) {
this->deadBodyPartIndex = sCurrentDeadBodyPartIndex;
sCurrentDeadBodyPartIndex++;
if (EN_PP_GET_TYPE(&this->actor) >= EN_PP_TYPE_FRAGMENT_BASE) {
this->fragmentIndex = sCurrentFragmentIndex;
sCurrentFragmentIndex++;
this->actor.shape.rot.y = this->actor.world.rot.y;
Actor_SetScale(&this->actor, 0.03f);
EnPp_BodyPart_SetupMove(this);
EnPp_Fragment_SetupMove(this);
} else {
Collider_InitAndSetJntSph(play, &this->maskCollider, &this->actor, &sMaskColliderJntSphInit,
this->maskColliderElements);
@ -304,7 +304,7 @@ void EnPp_Init(Actor* thisx, PlayState* play) {
void EnPp_Destroy(Actor* thisx, PlayState* play) {
EnPp* this = THIS;
if (EN_PP_GET_TYPE(&this->actor) < EN_PP_TYPE_BODY_PART_BASE) {
if (EN_PP_GET_TYPE(&this->actor) < EN_PP_TYPE_FRAGMENT_BASE) {
Collider_DestroyJntSph(play, &this->maskCollider);
Collider_DestroyJntSph(play, &this->bodyCollider);
Collider_DestroyQuad(play, &this->hornCollider);
@ -1175,26 +1175,26 @@ void EnPp_Mask_Detach(EnPp* this, PlayState* play) {
}
}
void EnPp_BodyPart_SetupMove(EnPp* this) {
void EnPp_Fragment_SetupMove(EnPp* this) {
EnPp_ChangeAnim(this, EN_PP_ANIM_DAMAGE);
this->actor.velocity.y = Rand_ZeroFloat(5.0f) + 13.0f;
this->actor.gravity = -2.0f;
this->timer = Rand_S16Offset(30, 30);
this->deadBodyPartAngularVelocity.x = (this->deadBodyPartIndex * 0x2E) + 0xFF00;
this->deadBodyPartAngularVelocity.z = (this->deadBodyPartIndex * 0x2E) + 0xFF00;
if (EN_PP_GET_TYPE(&this->actor) != EN_PP_TYPE_BODY_PART_BODY) {
this->fragmentAngularVelocity.x = (this->fragmentIndex * 0x2E) + 0xFF00;
this->fragmentAngularVelocity.z = (this->fragmentIndex * 0x2E) + 0xFF00;
if (EN_PP_GET_TYPE(&this->actor) != EN_PP_TYPE_FRAGMENT_BODY) {
this->actor.speed = Rand_ZeroFloat(4.0f) + 4.0f;
this->actor.world.rot.y = ((s32)Rand_CenteredFloat(223.0f) + 0x1999) * this->deadBodyPartIndex;
this->actor.world.rot.y = ((s32)Rand_CenteredFloat(223.0f) + 0x1999) * this->fragmentIndex;
}
this->action = EN_PP_ACTION_BODY_PART_MOVE;
this->actionFunc = EnPp_BodyPart_Move;
this->actionFunc = EnPp_Fragment_Move;
}
/**
* Makes the body part fly through the air. If it touches water, it will make a splash.
* Makes the fragment fly through the air. If it touches water, it will make a splash.
*/
void EnPp_BodyPart_Move(EnPp* this, PlayState* play) {
void EnPp_Fragment_Move(EnPp* this, PlayState* play) {
s32 pad;
Vec3f splashPos;
WaterBox* waterBox;
@ -1202,26 +1202,29 @@ void EnPp_BodyPart_Move(EnPp* this, PlayState* play) {
s32 i;
SkelAnime_Update(&this->skelAnime);
if (EN_PP_GET_TYPE(&this->actor) == EN_PP_TYPE_BODY_PART_BODY) {
this->deadBodyPartCount = EN_PP_DEAD_BODYPART_MAX;
for (i = 0; i < EN_PP_DEAD_BODYPART_MAX; i++) {
Math_Vec3f_Copy(&this->deadBodyPartsPos[i], &this->deadBodyPartPos);
this->deadBodyPartsPos[i].x += Math_SinS(0xCCC * i) * 15.0f;
this->deadBodyPartsPos[i].y += -5.0f;
this->deadBodyPartsPos[i].z += Math_CosS(0xCCC * i) * 15.0f;
// Updates the positions of the blue flames for this fragment. The body fragment has 10 flames, while all other
// fragments only have a single flame.
if (EN_PP_GET_TYPE(&this->actor) == EN_PP_TYPE_FRAGMENT_BODY) {
this->fragmentFlameCount = ARRAY_COUNT(this->fragmentFlamesPos);
for (i = 0; i < ARRAY_COUNT(this->fragmentFlamesPos); i++) {
Math_Vec3f_Copy(&this->fragmentFlamesPos[i], &this->fragmentPos);
this->fragmentFlamesPos[i].x += Math_SinS(0xCCC * i) * 15.0f;
this->fragmentFlamesPos[i].y += -5.0f;
this->fragmentFlamesPos[i].z += Math_CosS(0xCCC * i) * 15.0f;
}
} else {
Math_Vec3f_Copy(&this->deadBodyPartsPos[0], &this->deadBodyPartPos);
this->deadBodyPartCount = 1;
this->actor.shape.rot.x += this->deadBodyPartAngularVelocity.x;
this->actor.shape.rot.z += this->deadBodyPartAngularVelocity.z;
Math_Vec3f_Copy(&this->fragmentFlamesPos[0], &this->fragmentPos);
this->fragmentFlameCount = 1;
this->actor.shape.rot.x += this->fragmentAngularVelocity.x;
this->actor.shape.rot.z += this->fragmentAngularVelocity.z;
}
if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &waterSurface,
&waterBox) &&
(this->actor.world.pos.y < (waterSurface + 5.0f))) {
this->timer = 0;
if (EN_PP_GET_TYPE(&this->actor) == EN_PP_TYPE_BODY_PART_BODY) {
if (EN_PP_GET_TYPE(&this->actor) == EN_PP_TYPE_FRAGMENT_BODY) {
for (i = 0; i < 6; i++) {
Math_Vec3f_Copy(&splashPos, &this->actor.world.pos);
splashPos.x += Rand_CenteredFloat(10 + (5 * i));
@ -1485,7 +1488,7 @@ s32 EnPp_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
pos->y += this->maskPos.y;
pos->z += this->maskPos.z;
}
} else if ((limbIndex + EN_PP_TYPE_BODY_PART_BASE) != EN_PP_GET_TYPE(&this->actor)) {
} else if ((limbIndex + EN_PP_TYPE_FRAGMENT_BASE) != EN_PP_GET_TYPE(&this->actor)) {
*dList = NULL;
}
@ -1538,9 +1541,9 @@ void EnPp_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
}
}
} else {
if ((EN_PP_GET_TYPE(&this->actor) >= EN_PP_TYPE_BODY_PART_BASE) &&
((limbIndex + EN_PP_TYPE_BODY_PART_BASE) == EN_PP_GET_TYPE(&this->actor))) {
Matrix_MultVec3f(&gZeroVec3f, &this->deadBodyPartPos);
if ((EN_PP_GET_TYPE(&this->actor) >= EN_PP_TYPE_FRAGMENT_BASE) &&
((limbIndex + EN_PP_TYPE_FRAGMENT_BASE) == EN_PP_GET_TYPE(&this->actor))) {
Matrix_MultVec3f(&gZeroVec3f, &this->fragmentPos);
}
}
@ -1561,15 +1564,16 @@ void EnPp_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
this->bodyPartIndex = 0;
}
if ((this->action == EN_PP_ACTION_SPAWN_BODY_PARTS) && (this->deadBodyPartsSpawnedCount < 6) &&
if ((this->action == EN_PP_ACTION_SPAWN_BODY_PARTS) && (this->fragmentsSpawnedCount < 6) &&
((limbIndex == HIPLOOP_LIMB_BODY) || (limbIndex == HIPLOOP_LIMB_FRONT_LEFT_LOWER_LEG) ||
(limbIndex == HIPLOOP_LIMB_FRONT_RIGHT_LOWER_LEG) || (limbIndex == HIPLOOP_LIMB_LEFT_WING_MIDDLE) ||
(limbIndex == HIPLOOP_LIMB_RIGHT_WING_MIDDLE) || (limbIndex == HIPLOOP_LIMB_CENTER_WING_MIDDLE))) {
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_PP, this->actor.world.pos.x, this->actor.world.pos.y,
this->actor.world.pos.z, this->actor.world.rot.x, this->actor.world.rot.y,
this->actor.world.rot.z, limbIndex + 7);
this->deadBodyPartsSpawnedCount++;
if (this->deadBodyPartsSpawnedCount >= 6) {
this->actor.world.rot.z, limbIndex + EN_PP_TYPE_FRAGMENT_BASE);
this->fragmentsSpawnedCount++;
if (this->fragmentsSpawnedCount >= 6) {
this->action = EN_PP_ACTION_DONE_SPAWNING_BODY_PARTS;
}
}
@ -1589,14 +1593,14 @@ void EnPp_Draw(Actor* thisx, PlayState* play) {
SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnPp_OverrideLimbDraw, EnPp_PostLimbDraw, &this->actor);
if (this->deadBodyPartCount != 0) {
if (this->fragmentFlameCount != 0) {
scale = 0.4f;
if (EN_PP_GET_TYPE(&this->actor) == EN_PP_TYPE_BODY_PART_BODY) {
if (EN_PP_GET_TYPE(&this->actor) == EN_PP_TYPE_FRAGMENT_BODY) {
scale = 0.6f;
}
Actor_DrawDamageEffects(play, &this->actor, this->deadBodyPartsPos, this->deadBodyPartCount, scale, scale, 1.0f,
ACTOR_DRAW_DMGEFF_BLUE_FIRE);
Actor_DrawDamageEffects(play, &this->actor, this->fragmentFlamesPos, this->fragmentFlameCount, scale, scale,
1.0f, ACTOR_DRAW_DMGEFF_BLUE_FIRE);
}
if (this->drawDmgEffTimer != 0) {

View File

@ -16,44 +16,30 @@ typedef enum {
/* 0 */ EN_PP_TYPE_MASKED,
/* 1 */ EN_PP_TYPE_NO_MASK,
/* 2 */ EN_PP_TYPE_UNMASKED,
/* 7 */ EN_PP_TYPE_BODY_PART_BASE = 7,
/* 8 */ EN_PP_TYPE_BODY_PART_BODY,
/* 10 */ EN_PP_TYPE_BODY_PART_FRONT_LEFT_LOWER_LEG = 10,
/* 13 */ EN_PP_TYPE_BODY_PART_FRONT_RIGHT_LOWER_LEG = 13,
/* 17 */ EN_PP_TYPE_BODY_PART_LEFT_WING_MIDDLE = 17,
/* 23 */ EN_PP_TYPE_BODY_PART_RIGHT_WING_MIDDLE = 23,
/* 26 */ EN_PP_TYPE_BODY_PART_CENTER_WING_MIDDLE = 26
/* 7 */ EN_PP_TYPE_FRAGMENT_BASE = 7,
/* 8 */ EN_PP_TYPE_FRAGMENT_BODY = HIPLOOP_LIMB_BODY + EN_PP_TYPE_FRAGMENT_BASE,
/* 10 */ EN_PP_TYPE_FRAGMENT_FRONT_LEFT_LOWER_LEG = HIPLOOP_LIMB_FRONT_LEFT_LOWER_LEG + EN_PP_TYPE_FRAGMENT_BASE,
/* 13 */ EN_PP_TYPE_FRAGMENT_FRONT_RIGHT_LOWER_LEG = HIPLOOP_LIMB_FRONT_RIGHT_LOWER_LEG + EN_PP_TYPE_FRAGMENT_BASE,
/* 17 */ EN_PP_TYPE_FRAGMENT_LEFT_WING_MIDDLE = HIPLOOP_LIMB_LEFT_WING_MIDDLE + EN_PP_TYPE_FRAGMENT_BASE,
/* 23 */ EN_PP_TYPE_FRAGMENT_RIGHT_WING_MIDDLE = HIPLOOP_LIMB_RIGHT_WING_MIDDLE + EN_PP_TYPE_FRAGMENT_BASE,
/* 26 */ EN_PP_TYPE_FRAGMENT_CENTER_WING_MIDDLE = HIPLOOP_LIMB_CENTER_WING_MIDDLE + EN_PP_TYPE_FRAGMENT_BASE
} EnPpType;
typedef enum EnPpBodyPart {
/* 0 */ EN_PP_BODYPART_0,
/* 1 */ EN_PP_BODYPART_1,
/* 2 */ EN_PP_BODYPART_2,
/* 3 */ EN_PP_BODYPART_3,
/* 4 */ EN_PP_BODYPART_4,
/* 5 */ EN_PP_BODYPART_5,
/* 6 */ EN_PP_BODYPART_6,
/* 7 */ EN_PP_BODYPART_7,
/* 8 */ EN_PP_BODYPART_8,
/* 9 */ EN_PP_BODYPART_9,
/* 10 */ EN_PP_BODYPART_10,
/* 0 */ EN_PP_BODYPART_BODY,
/* 1 */ EN_PP_BODYPART_FRONT_LEFT_LOWER_LEG,
/* 2 */ EN_PP_BODYPART_FRONT_LEFT_UPPER_LEG,
/* 3 */ EN_PP_BODYPART_LEFT_WING_MIDDLE,
/* 4 */ EN_PP_BODYPART_BACK_RIGHT_LOWER_LEG,
/* 5 */ EN_PP_BODYPART_RIGHT_WING_MIDDLE,
/* 6 */ EN_PP_BODYPART_CENTER_WING_BASE,
/* 7 */ EN_PP_BODYPART_CENTER_WING_MIDDLE,
/* 8 */ EN_PP_BODYPART_BACK_LEFT_LOWER_LEG,
/* 9 */ EN_PP_BODYPART_RIGHT_EYE,
/* 10 */ EN_PP_BODYPART_LEFT_EYE,
/* 11 */ EN_PP_BODYPART_MAX
} EnPpBodyPart;
typedef enum EnPpDeadBodyPart {
/* 0 */ EN_PP_DEAD_BODYPART_0,
/* 1 */ EN_PP_DEAD_BODYPART_1,
/* 2 */ EN_PP_DEAD_BODYPART_2,
/* 3 */ EN_PP_DEAD_BODYPART_3,
/* 4 */ EN_PP_DEAD_BODYPART_4,
/* 5 */ EN_PP_DEAD_BODYPART_5,
/* 6 */ EN_PP_DEAD_BODYPART_6,
/* 7 */ EN_PP_DEAD_BODYPART_7,
/* 8 */ EN_PP_DEAD_BODYPART_8,
/* 9 */ EN_PP_DEAD_BODYPART_9,
/* 10 */ EN_PP_DEAD_BODYPART_MAX
} EnPpDeadBodyPart;
typedef struct EnPp {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
@ -61,7 +47,7 @@ typedef struct EnPp {
/* 0x224 */ Vec3s morphTable[HIPLOOP_LIMB_MAX];
/* 0x2C0 */ EnPpActionFunc actionFunc;
/* 0x2C4 */ s16 chargesInStraightLines; // If false, the Hiploop will instead charge directly at the player.
/* 0x2C6 */ s16 deadBodyPartIndex;
/* 0x2C6 */ s16 fragmentIndex;
/* 0x2C8 */ s16 action;
/* 0x2CA */ s16 timer;
/* 0x2CC */ s16 secondaryTimer;
@ -74,7 +60,7 @@ typedef struct EnPp {
s16 maskDetachState;
} actionVar;
/* 0x2D4 */ s16 maskBounceAngularVelocity; // Controls the speed that the Hiploop rotates to face the player when an attack bounces off the mask.
/* 0x2D6 */ s16 deadBodyPartsSpawnedCount;
/* 0x2D6 */ s16 fragmentsSpawnedCount;
/* 0x2D8 */ f32 animEndFrame;
/* 0x2DC */ f32 chargeAndBounceSpeed;
/* 0x2DC */ Vec3f ledgeCheckPos[3];
@ -85,10 +71,10 @@ typedef struct EnPp {
/* 0x340 */ Vec3f maskRot;
/* 0x34C */ Vec3f maskVelocity;
/* 0x358 */ Vec3f targetPos;
/* 0x364 */ Vec3f deadBodyPartPos;
/* 0x370 */ s32 deadBodyPartCount;
/* 0x374 */ Vec3f deadBodyPartsPos[EN_PP_DEAD_BODYPART_MAX];
/* 0x3EC */ Vec3s deadBodyPartAngularVelocity;
/* 0x364 */ Vec3f fragmentPos;
/* 0x370 */ s32 fragmentFlameCount;
/* 0x374 */ Vec3f fragmentFlamesPos[10];
/* 0x3EC */ Vec3s fragmentAngularVelocity;
/* 0x3F2 */ s16 drawDmgEffTimer;
/* 0x3F4 */ s16 drawDmgEffType;
/* 0x3F8 */ f32 drawDmgEffScale;

View File

@ -9378,47 +9378,47 @@
0x809EDCCC:("Boss04_OverrideLimbDraw",),
0x809EDECC:("Boss04_PostLimbDraw",),
0x809EDF58:("Boss04_Draw",),
0x809EE4E0:("func_809EE4E0",),
0x809EE668:("func_809EE668",),
0x809EE4E0:("Boss05_WalkingHead_Thaw",),
0x809EE668:("Boss05_SetColliderSphere",),
0x809EE6F8:("Boss05_Init",),
0x809EEC70:("Boss05_Destroy",),
0x809EECBC:("func_809EECBC",),
0x809EEDD0:("func_809EEDD0",),
0x809EEDE8:("func_809EEDE8",),
0x809EF9BC:("func_809EF9BC",),
0x809EFAB4:("func_809EFAB4",),
0x809EFE50:("func_809EFE50",),
0x809F0014:("func_809F0014",),
0x809F0058:("func_809F0058",),
0x809F00CC:("func_809F00CC",),
0x809F010C:("func_809F010C",),
0x809F01CC:("func_809F01CC",),
0x809F0244:("func_809F0244",),
0x809F02D0:("func_809F02D0",),
0x809F0374:("func_809F0374",),
0x809F0474:("func_809F0474",),
0x809F04C0:("func_809F04C0",),
0x809F0538:("func_809F0538",),
0x809F0590:("func_809F0590",),
0x809F0650:("func_809F0650",),
0x809F06B8:("func_809F06B8",),
0x809F0708:("func_809F0708",),
0x809F0780:("func_809F0780",),
0x809F0A0C:("func_809F0A0C",),
0x809F0A64:("func_809F0A64",),
0x809F0ABC:("func_809F0ABC",),
0x809F0B0C:("func_809F0B0C",),
0x809EECBC:("Boss05_LilyPadWithHead_UpdateDamage",),
0x809EEDD0:("Boss05_LilyPadWithHead_SetupMove",),
0x809EEDE8:("Boss05_LilyPadWithHead_Move",),
0x809EF9BC:("Boss05_LilyPad_Idle",),
0x809EFAB4:("Boss05_FallingHead_Fall",),
0x809EFE50:("Boss05_WalkingHead_UpdateDamage",),
0x809F0014:("Boss05_WalkingHead_IsLookingAtPlayer",),
0x809F0058:("Boss05_WalkingHead_TrySpottingPlayer",),
0x809F00CC:("Boss05_WalkingHead_SetupTransform",),
0x809F010C:("Boss05_WalkingHead_Transform",),
0x809F01CC:("Boss05_WalkingHead_SetupIdle",),
0x809F0244:("Boss05_WalkingHead_Idle",),
0x809F02D0:("Boss05_WalkingHead_SetupWalk",),
0x809F0374:("Boss05_WalkingHead_Walk",),
0x809F0474:("Boss05_WalkingHead_SetupSpottedPlayer",),
0x809F04C0:("Boss05_WalkingHead_SpottedPlayer",),
0x809F0538:("Boss05_WalkingHead_SetupCharge",),
0x809F0590:("Boss05_WalkingHead_Charge",),
0x809F0650:("Boss05_WalkingHead_SetupAttack",),
0x809F06B8:("Boss05_WalkingHead_Attack",),
0x809F0708:("Boss05_WalkingHead_SetupDamaged",),
0x809F0780:("Boss05_WalkingHead_Damaged",),
0x809F0A0C:("Boss05_WalkingHead_SetupStunned",),
0x809F0A64:("Boss05_WalkingHead_SetupFreeze",),
0x809F0ABC:("Boss05_WalkingHead_Stunned",),
0x809F0B0C:("Boss05_Fragment_Move",),
0x809F0CCC:("Boss05_Update",),
0x809F1050:("func_809F1050",),
0x809F1170:("func_809F1170",),
0x809F1284:("func_809F1284",),
0x809F12A0:("func_809F12A0",),
0x809F135C:("func_809F135C",),
0x809F1404:("func_809F1404",),
0x809F1430:("func_809F1430",),
0x809F1464:("func_809F1464",),
0x809F14AC:("func_809F14AC",),
0x809F1550:("func_809F1550",),
0x809F1050:("Boss05_LilyPadWithHead_OverrideLimbDraw",),
0x809F1170:("Boss05_LilyPad_PostLimbDraw",),
0x809F1284:("Boss05_Head_OverrideLimbDraw",),
0x809F12A0:("Boss05_Head_PostLimbDraw",),
0x809F135C:("Boss05_Head_TransformLimbDraw",),
0x809F1404:("Boss05_LilyPad_OverrideLimbDraw",),
0x809F1430:("Boss05_FallingHeadLilyPad_OverrideLimbDraw",),
0x809F1464:("Boss05_FallingHeadLilyPad_TransformLimbDraw",),
0x809F14AC:("Boss05_Fragment_OverrideLimbDraw",),
0x809F1550:("Boss05_Fragment_PostLimbDraw",),
0x809F159C:("Boss05_Draw",),
0x809F2120:("func_809F2120",),
0x809F2140:("func_809F2140",),
@ -13227,8 +13227,8 @@
0x80B1FC7C:("EnPp_Dead",),
0x80B1FF20:("EnPp_Mask_SetupDetach",),
0x80B20030:("EnPp_Mask_Detach",),
0x80B202B8:("EnPp_BodyPart_SetupMove",),
0x80B203BC:("EnPp_BodyPart_Move",),
0x80B202B8:("EnPp_Fragment_SetupMove",),
0x80B203BC:("EnPp_Fragment_Move",),
0x80B20668:("EnPp_UpdateDamage",),
0x80B20B40:("EnPp_Update",),
0x80B20E6C:("EnPp_OverrideLimbDraw",),

View File

@ -10196,25 +10196,25 @@
0x809F1A30:("D_809F1A30","UNK_TYPE1","",0x1),
0x809F1AD0:("D_809F1AD0","UNK_TYPE1","",0x1),
0x809F1B00:("D_809F1B00","UNK_TYPE1","",0x1),
0x809F1B2C:("D_809F1B2C","UNK_TYPE1","",0x1),
0x809F1B74:("D_809F1B74","UNK_TYPE1","",0x1),
0x809F1B84:("D_809F1B84","UNK_TYPE1","",0x1),
0x809F1BA8:("D_809F1BA8","UNK_TYPE1","",0x1),
0x809F1BB8:("D_809F1BB8","UNK_TYPE1","",0x1),
0x809F1BDC:("D_809F1BDC","UNK_TYPE1","",0x1),
0x809F1BEC:("D_809F1BEC","UNK_TYPE1","",0x1),
0x809F1BF0:("D_809F1BF0","UNK_TYPE1","",0x1),
0x809F1BF4:("D_809F1BF4","UNK_TYPE1","",0x1),
0x809F1C00:("D_809F1C00","UNK_TYPE1","",0x1),
0x809F1C20:("D_809F1C20","UNK_TYPE1","",0x1),
0x809F1C40:("Boss_05_InitVars","UNK_TYPE1","",0x1),
0x809F1C60:("D_809F1C60","UNK_TYPE2","",0x2),
0x809F1C8C:("D_809F1C8C","UNK_TYPE2","",0x2),
0x809F1CB8:("D_809F1CB8","UNK_TYPE1","",0x1),
0x809F1CC0:("D_809F1CC0","UNK_TYPE1","",0x1),
0x809F1CC4:("D_809F1CC4","UNK_TYPE1","",0x1),
0x809F1CD0:("D_809F1CD0","UNK_TYPE1","",0x1),
0x809F1CDC:("D_809F1CDC","UNK_TYPE1","",0x1),
0x809F1B2C:("sLilyPadJntSphElementsInit","ColliderJntSphElementInit","[2]",0x48),
0x809F1B74:("sLilyPadJntSphInit","ColliderJntSphInit","",0x10),
0x809F1B84:("sHeadJntSphElementsInit","ColliderJntSphElementInit","[1]",0x24),
0x809F1BA8:("sHeadJntSphInit","ColliderJntSphInit","",0x10),
0x809F1BB8:("sWalkingHeadJntSphElementsInit","ColliderJntSphElementInit","[1]",0x24),
0x809F1BDC:("sWalkingHeadJntSphInit","ColliderJntSphInit","",0x10),
0x809F1BEC:("sIcePrimColor","Color_RGBA8","",0x4),
0x809F1BF0:("sIceEnvColor","Color_RGBA8","",0x4),
0x809F1BF4:("sIceAccel","Vec3f","",0xC),
0x809F1C00:("sLilyPadWithHeadDamageTable","DamageTable","",0x20),
0x809F1C20:("sWalkingHeadDamageTable","DamageTable","",0x20),
0x809F1C40:("Boss_05_InitVars","ActorInit","",0x20),
0x809F1C60:("sWindUpLimbRot","Vec3s","[7]",0x2A),
0x809F1C8C:("sLungeAttackLimbRot","Vec3s","[7]",0x2A),
0x809F1CB8:("sLimbIndexToLimbRotIndex","s8","[12]",0xC),
0x809F1CC4:("sHeadOffset","Vec3f","",0xC),
0x809F1CD0:("sHeadColliderOffset","Vec3f","",0xC),
0x809F1CDC:("sHeadOffset","Vec3f","",0xC),
0x809F1CE8:("sFragmentIndexToLimbIndex","s32","[14]",0x38),
0x809F1D20:("D_809F1D20","f32","",0x4),
0x809F1D24:("D_809F1D24","f32","",0x4),
0x809F1D28:("D_809F1D28","f32","",0x4),
@ -10230,7 +10230,7 @@
0x809F1DA4:("D_809F1DA4","f32","",0x4),
0x809F1DA8:("D_809F1DA8","f32","",0x4),
0x809F1DAC:("D_809F1DAC","f32","",0x4),
0x809F2110:("D_809F2110","UNK_TYPE1","",0x1),
0x809F2110:("sBioDekuBabaHeadColliderPos","Vec3f","",0xC),
0x809F4080:("D_809F4080","UNK_TYPE1","",0x1),
0x809F40A0:("Boss_06_InitVars","UNK_TYPE1","",0x1),
0x809F40C0:("D_809F40C0","UNK_TYPE1","",0x1),
@ -13708,7 +13708,7 @@
0x80B1DB54:("D_80B1DB54","f32","",0x4),
0x80B1DB58:("D_80B1DB58","f32","",0x4),
0x80B1DB5C:("D_80B1DB5C","f32","",0x4),
0x80B21620:("sCurrentDeadBodyPartIndex","UNK_TYPE4","",0x4),
0x80B21620:("sCurrentFragmentIndex","UNK_TYPE4","",0x4),
0x80B21624:("sDamageTable","UNK_TYPE1","",0x1),
0x80B21644:("En_Pp_InitVars","UNK_TYPE1","",0x1),
0x80B21664:("sMaskColliderJntSphElementsInit","UNK_TYPE1","",0x1),

View File

@ -196,21 +196,6 @@ D_060005C4 = 0x060005C4;
D_06000A20 = 0x06000A20;
D_06000040 = 0x06000040;
// ovl_Boss_05
D_060006A4 = 0x060006A4;
D_06000A5C = 0x06000A5C;
D_06000ABC = 0x06000ABC;
D_060024E0 = 0x060024E0;
D_06002F0C = 0x06002F0C;
D_06003448 = 0x06003448;
D_06006240 = 0x06006240;
D_06006378 = 0x06006378;
D_06006484 = 0x06006484;
D_06006E50 = 0x06006E50;
D_06007488 = 0x06007488;
D_06007908 = 0x06007908;
// ovl_Boss_07
D_06000194 = 0x06000194;