Document EnSyatekiWf and do some slight cleanup on object_wf and other Syateki actors (#1168)

This commit is contained in:
Tom Overton 2023-02-21 11:42:20 -08:00 committed by GitHub
parent a7fd595136
commit 50bd6056e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 286 additions and 249 deletions

View File

@ -65,11 +65,11 @@
<Skeleton Name="gWolfosWhiteSkel" Type="Flex" LimbType="Standard" LimbNone="WOLFOS_WHITE_LIMB_NONE" LimbMax="WOLFOS_WHITE_LIMB_MAX" EnumName="WolfosWhiteLimb" Offset="0x3BC0" />
<!-- Wolfos/White Wolfos Animations -->
<Animation Name="gWolfosSlashingAnim" Offset="0x4638" /> <!-- Original name is "wolfman_attack" -->
<Animation Name="gWolfosBackflippingAnim" Offset="0x4A90" /> <!-- Original name is "wolfman_back_jump" -->
<Animation Name="gWolfosBlockingAnim" Offset="0x4C44" /> <!-- Original name is "wolfman_defense" -->
<Animation Name="gWolfosRearingUpFallingOverAnim" Offset="0x53D0" /> <!-- Original name is "wolfman_down" -->
<Animation Name="gWolfosRunningAnim" Offset="0x5700" /> <!-- Original name is "wolfman_run" -->
<Animation Name="gWolfosSlashAnim" Offset="0x4638" /> <!-- Original name is "wolfman_attack" -->
<Animation Name="gWolfosBackflipAnim" Offset="0x4A90" /> <!-- Original name is "wolfman_back_jump" -->
<Animation Name="gWolfosBlockAnim" Offset="0x4C44" /> <!-- Original name is "wolfman_defense" -->
<Animation Name="gWolfosRearUpFallOverAnim" Offset="0x53D0" /> <!-- Original name is "wolfman_down" -->
<Animation Name="gWolfosRunAnim" Offset="0x5700" /> <!-- Original name is "wolfman_run" -->
<!-- Wolfos Limb DisplayLists -->
<DList Name="gWolfosNormalAbdomenDL" Offset="0x6D10" />
@ -135,8 +135,8 @@
<Skeleton Name="gWolfosNormalSkel" Type="Flex" LimbType="Standard" LimbNone="WOLFOS_NORMAL_LIMB_NONE" LimbMax="WOLFOS_NORMAL_LIMB_MAX" EnumName="WolfosNormalLimb" Offset="0x95D0" />
<!-- Wolfos/White Wolfos Animations -->
<Animation Name="gWolfosSidesteppingAnim" Offset="0x9808" /> <!-- Original name is "wolfman_side_walk" -->
<Animation Name="gWolfosSidestepAnim" Offset="0x9808" /> <!-- Original name is "wolfman_side_walk" -->
<Animation Name="gWolfosDamagedAnim" Offset="0x9A50" /> <!-- Originla name is "wolfman_tail_hit" -->
<Animation Name="gWolfosWaitingAnim" Offset="0xA3CC" /> <!-- Original name is "wolfman_wait" -->
<Animation Name="gWolfosWaitAnim" Offset="0xA3CC" /> <!-- Original name is "wolfman_wait" -->
</File>
</Root>

View File

@ -16,8 +16,8 @@ void EnSyatekiCrow_Destroy(Actor* thisx, PlayState* play);
void EnSyatekiCrow_Update(Actor* thisx, PlayState* play);
void EnSyatekiCrow_Draw(Actor* thisx, PlayState* play);
void EnSyatekiCrow_SetupWaitForSpawn(EnSyatekiCrow* this);
void EnSyatekiCrow_WaitForSpawn(EnSyatekiCrow* this, PlayState* play);
void EnSyatekiCrow_SetupWaitForSignal(EnSyatekiCrow* this);
void EnSyatekiCrow_WaitForSignal(EnSyatekiCrow* this, PlayState* play);
void EnSyatekiCrow_SetupWaitToMove(EnSyatekiCrow* this);
void EnSyatekiCrow_WaitToMove(EnSyatekiCrow* this, PlayState* play);
void EnSyatekiCrow_Fly(EnSyatekiCrow* this, PlayState* play);
@ -105,7 +105,7 @@ void EnSyatekiCrow_Init(Actor* thisx, PlayState* play2) {
this->maxPointIndex = path->count;
this->deathTimer = 20;
this->waitTimer = 0;
EnSyatekiCrow_SetupWaitForSpawn(this);
EnSyatekiCrow_SetupWaitForSignal(this);
}
void EnSyatekiCrow_Destroy(Actor* thisx, PlayState* play) {
@ -114,7 +114,7 @@ void EnSyatekiCrow_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyJntSph(play, &this->collider);
}
void EnSyatekiCrow_SetupWaitForSpawn(EnSyatekiCrow* this) {
void EnSyatekiCrow_SetupWaitForSignal(EnSyatekiCrow* this) {
Actor_SetScale(&this->actor, 0.03f);
this->actor.speedXZ = 0.0f;
this->actor.gravity = 0.0f;
@ -123,13 +123,13 @@ void EnSyatekiCrow_SetupWaitForSpawn(EnSyatekiCrow* this) {
this->actor.shape.rot = this->actor.world.rot;
this->currentPointIndex = 1;
this->actor.draw = NULL;
this->actionFunc = EnSyatekiCrow_WaitForSpawn;
this->actionFunc = EnSyatekiCrow_WaitForSignal;
}
/**
* Waits until the shooting gallery man sets the appropriate Guay flag to spawn.
* Waits until the shooting gallery man sets the appropriate Guay flag.
*/
void EnSyatekiCrow_WaitForSpawn(EnSyatekiCrow* this, PlayState* play) {
void EnSyatekiCrow_WaitForSignal(EnSyatekiCrow* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->isActive == true) &&
@ -144,6 +144,10 @@ void EnSyatekiCrow_WaitForSpawn(EnSyatekiCrow* this, PlayState* play) {
}
}
/**
* Positions the Guay at the start of its assigned path and rotates it to face the
* next point on the path, then sets it up to start waiting.
*/
void EnSyatekiCrow_SetupWaitToMove(EnSyatekiCrow* this) {
Vec3f targetPos;
@ -181,7 +185,7 @@ void EnSyatekiCrow_Fly(EnSyatekiCrow* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
EnSyatekiCrow_SetupWaitForSpawn(this);
EnSyatekiCrow_SetupWaitForSignal(this);
return;
}
@ -203,7 +207,7 @@ void EnSyatekiCrow_Fly(EnSyatekiCrow* this, PlayState* play) {
} else {
this->isActive = false;
syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_INDEX(&this->actor));
EnSyatekiCrow_SetupWaitForSpawn(this);
EnSyatekiCrow_SetupWaitForSignal(this);
}
SkelAnime_Update(&this->skelAnime);
@ -242,7 +246,7 @@ void EnSyatekiCrow_Dead(EnSyatekiCrow* this, PlayState* play) {
func_800B3030(play, &this->actor.world.pos, &sZeroVec, &sZeroVec, this->actor.scale.x * 10000.0f, 0, 0);
syatekiMan->guayHitCounter++;
syatekiMan->guayFlags &= ~(1 << EN_SYATEKI_CROW_GET_INDEX(&this->actor));
EnSyatekiCrow_SetupWaitForSpawn(this);
EnSyatekiCrow_SetupWaitForSignal(this);
}
this->deathTimer++;

View File

@ -17,10 +17,10 @@ void EnSyatekiDekunuts_Destroy(Actor* thisx, PlayState* play);
void EnSyatekiDekunuts_Update(Actor* thisx, PlayState* play);
void EnSyatekiDekunuts_Draw(Actor* thisx, PlayState* play);
void EnSyatekiDekunuts_SetupWaitForSpawn(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_WaitForSpawn(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupSpawn(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_Spawn(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupWaitForSignal(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_WaitForSignal(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupWaitToStart(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_WaitToStart(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupWaitToEmerge(EnSyatekiDekunuts* this);
void EnSyatekiDekunuts_WaitToEmerge(EnSyatekiDekunuts* this, PlayState* play);
void EnSyatekiDekunuts_SetupEmerge(EnSyatekiDekunuts* this);
@ -152,7 +152,7 @@ void EnSyatekiDekunuts_Init(Actor* thisx, PlayState* play2) {
this->timer = 0;
this->unk_1DC = 0;
this->waitTimer = 0;
EnSyatekiDekunuts_SetupWaitForSpawn(this);
EnSyatekiDekunuts_SetupWaitForSignal(this);
}
void EnSyatekiDekunuts_Destroy(Actor* thisx, PlayState* play) {
@ -161,7 +161,7 @@ void EnSyatekiDekunuts_Destroy(Actor* thisx, PlayState* play) {
Collider_DestroyCylinder(play, &this->collider);
}
void EnSyatekiDekunuts_SetupWaitForSpawn(EnSyatekiDekunuts* this) {
void EnSyatekiDekunuts_SetupWaitForSignal(EnSyatekiDekunuts* this) {
Animation_PlayOnceSetSpeed(&this->skelAnime, &gDekuScrubUpAnim, 0.0f);
this->actor.speedXZ = 0.0f;
@ -176,18 +176,18 @@ void EnSyatekiDekunuts_SetupWaitForSpawn(EnSyatekiDekunuts* this) {
this->isAlive = true;
}
this->actionFunc = EnSyatekiDekunuts_WaitForSpawn;
this->actionFunc = EnSyatekiDekunuts_WaitForSignal;
}
/**
* Waits until the shooting gallery man sets the appropriate Deku Scrub flag to spawn.
* Waits until the shooting gallery man sets the appropriate Deku Scrub flag.
*/
void EnSyatekiDekunuts_WaitForSpawn(EnSyatekiDekunuts* this, PlayState* play) {
void EnSyatekiDekunuts_WaitForSignal(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->isAlive == true) &&
(syatekiMan->dekuScrubFlags & (1 << this->index))) {
EnSyatekiDekunuts_SetupSpawn(this);
EnSyatekiDekunuts_SetupWaitToStart(this);
} else if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
this->isAlive = true;
}
@ -201,7 +201,7 @@ void EnSyatekiDekunuts_WaitForSpawn(EnSyatekiDekunuts* this, PlayState* play) {
/**
* Positions the Deku Scrub to match up with its flower, then sets it up to start waiting.
*/
void EnSyatekiDekunuts_SetupSpawn(EnSyatekiDekunuts* this) {
void EnSyatekiDekunuts_SetupWaitToStart(EnSyatekiDekunuts* this) {
Vec3f pos;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
@ -221,13 +221,13 @@ void EnSyatekiDekunuts_SetupSpawn(EnSyatekiDekunuts* this) {
this->headdressType = EN_SYATEKI_DEKUNUTS_HEADDRESS_TYPE_NORMAL;
}
this->actionFunc = EnSyatekiDekunuts_Spawn;
this->actionFunc = EnSyatekiDekunuts_WaitToStart;
}
/**
* Waits 20 frames, then plays a sound and starts the process of making the Deku Scrubs emerge.
*/
void EnSyatekiDekunuts_Spawn(EnSyatekiDekunuts* this, PlayState* play) {
void EnSyatekiDekunuts_WaitToStart(EnSyatekiDekunuts* this, PlayState* play) {
EnSyatekiMan* syatekiMan;
if (this->waitTimer > 20) {
@ -357,7 +357,7 @@ void EnSyatekiDekunuts_SetupGameEnd(EnSyatekiDekunuts* this) {
*/
void EnSyatekiDekunuts_GameEnd(EnSyatekiDekunuts* this, PlayState* play) {
if (this->waitTimer > 20) {
EnSyatekiDekunuts_SetupWaitForSpawn(this);
EnSyatekiDekunuts_SetupWaitForSignal(this);
this->waitTimer = 0;
} else {
this->waitTimer++;
@ -411,7 +411,7 @@ void EnSyatekiDekunuts_Dead(EnSyatekiDekunuts* this, PlayState* play) {
syatekiMan->dekuScrubFlags &= ~(1 << this->index);
}
EnSyatekiDekunuts_SetupWaitForSpawn(this);
EnSyatekiDekunuts_SetupWaitForSignal(this);
}
} else if (this->timer < 160) {
this->timer--;
@ -424,7 +424,7 @@ void EnSyatekiDekunuts_Update(Actor* thisx, PlayState* play) {
this->actionFunc(this, play);
if ((this->actionFunc != EnSyatekiDekunuts_WaitForSpawn) && (this->timer < this->timeToBurrow) &&
if ((this->actionFunc != EnSyatekiDekunuts_WaitForSignal) && (this->timer < this->timeToBurrow) &&
(this->timer > 10)) {
if ((this->collider.base.acFlags & AC_HIT) && (this->isAlive == true)) {
if (EN_SYATEKI_DEKUNUTS_GET_TYPE(&this->actor) == EN_SYATEKI_DEKUNUTS_TYPE_BONUS) {
@ -463,7 +463,7 @@ void EnSyatekiDekunuts_Draw(Actor* thisx, PlayState* play) {
Vec3f flowerPos;
s32 i;
if (this->actionFunc != EnSyatekiDekunuts_WaitForSpawn) {
if (this->actionFunc != EnSyatekiDekunuts_WaitForSignal) {
SkelAnime_DrawOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
EnSyatekiDekunuts_OverrideLimbDraw, NULL, &this->actor);
}

View File

@ -16,19 +16,19 @@ void EnSyatekiWf_Destroy(Actor* thisx, PlayState* play);
void EnSyatekiWf_Update(Actor* thisx, PlayState* play2);
void EnSyatekiWf_Draw(Actor* thisx, PlayState* play);
void func_80A201CC(EnSyatekiWf* this);
void func_80A20284(EnSyatekiWf* this, PlayState* play);
void func_80A2030C(EnSyatekiWf* this);
void func_80A20320(EnSyatekiWf* this, PlayState* play);
void func_80A20378(EnSyatekiWf* this);
void func_80A203DC(EnSyatekiWf* this, PlayState* play);
void func_80A20670(EnSyatekiWf* this);
void func_80A206DC(EnSyatekiWf* this, PlayState* play);
void func_80A20710(EnSyatekiWf* this);
void func_80A2075C(EnSyatekiWf* this, PlayState* play);
void func_80A2079C(EnSyatekiWf* this);
void func_80A20800(EnSyatekiWf* this, PlayState* play);
void func_80A208F8(EnSyatekiWf* this, PlayState* play);
void EnSyatekiWf_SetupWaitForSignal(EnSyatekiWf* this);
void EnSyatekiWf_WaitForSignal(EnSyatekiWf* this, PlayState* play);
void EnSyatekiWf_SetupWaitToMove(EnSyatekiWf* this);
void EnSyatekiWf_WaitToMove(EnSyatekiWf* this, PlayState* play);
void EnSyatekiWf_SetupRun(EnSyatekiWf* this);
void EnSyatekiWf_Run(EnSyatekiWf* this, PlayState* play);
void EnSyatekiWf_SetupJump(EnSyatekiWf* this);
void EnSyatekiWf_Jump(EnSyatekiWf* this, PlayState* play);
void EnSyatekiWf_SetupLand(EnSyatekiWf* this);
void EnSyatekiWf_Land(EnSyatekiWf* this, PlayState* play);
void EnSyatekiWf_SetupHowl(EnSyatekiWf* this);
void EnSyatekiWf_Howl(EnSyatekiWf* this, PlayState* play);
void EnSyatekiWf_Dead(EnSyatekiWf* this, PlayState* play);
static ColliderJntSphElementInit sJntSphElementsInit[1] = {
{
@ -40,11 +40,11 @@ static ColliderJntSphElementInit sJntSphElementsInit[1] = {
BUMP_ON,
OCELEM_ON,
},
{ 17, { { 800, 0, 0 }, 25 }, 100 },
{ WOLFOS_NORMAL_LIMB_HEAD, { { 800, 0, 0 }, 25 }, 100 },
},
};
static ColliderCylinderInit sCylinderInit1 = {
static ColliderCylinderInit sBodyCylinderInit = {
{
COLTYPE_HIT5,
AT_NONE,
@ -77,7 +77,7 @@ static ColliderJntSphInit sJntSphInit = {
sJntSphElementsInit,
};
static ColliderCylinderInit sCylinderInit2 = {
static ColliderCylinderInit sTailCylinderInit = {
{
COLTYPE_HIT5,
AT_NONE,
@ -97,9 +97,9 @@ static ColliderCylinderInit sCylinderInit2 = {
{ 15, 20, -15, { 0, 0, 0 } },
};
static Vec3f D_80A20EDC = { 0.0f, 20.0f, 0.0f };
static Vec3f sVelocity = { 0.0f, 20.0f, 0.0f };
static Vec3f D_80A20EE8 = { 0.0f, 0.0f, 0.0f };
static Vec3f sAccel = { 0.0f, 0.0f, 0.0f };
ActorInit En_Syateki_Wf_InitVars = {
ACTOR_EN_SYATEKI_WF,
@ -113,14 +113,24 @@ ActorInit En_Syateki_Wf_InitVars = {
(ActorFunc)EnSyatekiWf_Draw,
};
typedef enum {
/* 0 */ EN_SYATEKI_WF_ANIM_WAIT, // unused
/* 1 */ EN_SYATEKI_WF_ANIM_RUN,
/* 2 */ EN_SYATEKI_WF_ANIM_JUMP,
/* 3 */ EN_SYATEKI_WF_ANIM_LAND,
/* 4 */ EN_SYATEKI_WF_ANIM_BACKFLIP, // unused
/* 5 */ EN_SYATEKI_WF_ANIM_DAMAGED,
/* 6 */ EN_SYATEKI_WF_ANIM_REAR_UP_FALL_OVER,
} EnSyatekiWfAnimation;
static AnimationInfo sAnimationInfo[] = {
{ &gWolfosWaitingAnim, 2.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -1.0f },
{ &gWolfosRunningAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
{ &gWolfosRunningAnim, 1.0f, 0.0f, 4.0f, ANIMMODE_ONCE, 1.0f },
{ &gWolfosRunningAnim, 1.0f, 4.0f, 8.0f, ANIMMODE_ONCE, 1.0f },
{ &gWolfosBackflippingAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
{ &gWolfosWaitAnim, 2.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -1.0f },
{ &gWolfosRunAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
{ &gWolfosRunAnim, 1.0f, 0.0f, 4.0f, ANIMMODE_ONCE, 1.0f },
{ &gWolfosRunAnim, 1.0f, 4.0f, 8.0f, ANIMMODE_ONCE, 1.0f },
{ &gWolfosBackflipAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
{ &gWolfosDamagedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 8.0f },
{ &gWolfosRearingUpFallingOverAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
{ &gWolfosRearUpFallOverAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f },
};
static InitChainEntry sInitChain[] = {
@ -128,17 +138,6 @@ static InitChainEntry sInitChain[] = {
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_STOP),
};
static Vec3f D_80A20FC4 = { 0.0f, 0.5f, 0.0f };
static Vec3f D_80A20FD0 = { 1200.0f, 0.0f, 0.0f };
static TexturePtr sEyeTextures[] = {
gWolfosNormalEyeOpenTex,
gWolfosNormalEyeHalfTex,
gWolfosNormalEyeNarrowTex,
gWolfosNormalEyeHalfTex,
};
void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
s32 pad;
EnSyatekiWf* this = THIS;
@ -160,12 +159,12 @@ void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
return;
}
this->unk_2A0 = Lib_SegmentedToVirtual(path->points);
this->unk_2A4 = 1;
this->unk_2A6 = path->count;
this->pathPoints = Lib_SegmentedToVirtual(path->points);
this->currentPointIndex = 1;
this->maxPointIndex = path->count;
Actor_ProcessInitChain(&this->actor, sInitChain);
this->unk_29C = 0;
this->waitTimer = 0;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 0.0f);
this->actor.focus.pos = this->actor.world.pos;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
@ -175,45 +174,46 @@ void EnSyatekiWf_Init(Actor* thisx, PlayState* play) {
this->eyeIndex = 0;
this->unk_2AC = 10.0f;
Collider_InitCylinder(play, &this->unk_2B4);
Collider_SetCylinder(play, &this->unk_2B4, &this->actor, &sCylinderInit1);
Collider_InitCylinder(play, &this->unk_300);
Collider_SetCylinder(play, &this->unk_300, &this->actor, &sCylinderInit2);
Collider_InitJntSph(play, &this->unk_34C);
Collider_SetJntSph(play, &this->unk_34C, &this->actor, &sJntSphInit, this->unk_36C);
this->unk_34C.elements->dim.worldSphere.radius = sJntSphInit.elements[0].dim.modelSphere.radius;
Collider_InitCylinder(play, &this->bodyCollider);
Collider_SetCylinder(play, &this->bodyCollider, &this->actor, &sBodyCylinderInit);
Collider_InitCylinder(play, &this->tailCollider);
Collider_SetCylinder(play, &this->tailCollider, &this->actor, &sTailCylinderInit);
Collider_InitJntSph(play, &this->headCollider);
Collider_SetJntSph(play, &this->headCollider, &this->actor, &sJntSphInit, this->headColliderElements);
this->headCollider.elements->dim.worldSphere.radius = sJntSphInit.elements[0].dim.modelSphere.radius;
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitingAnim, this->jointTable,
this->morphTable, WOLFOS_NORMAL_LIMB_MAX);
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitAnim, this->jointTable, this->morphTable,
WOLFOS_NORMAL_LIMB_MAX);
Actor_SetScale(&this->actor, 0.01f);
this->actor.hintId = TATL_HINT_ID_WOLFOS;
func_80A201CC(this);
EnSyatekiWf_SetupWaitForSignal(this);
}
void EnSyatekiWf_Destroy(Actor* thisx, PlayState* play) {
EnSyatekiWf* this = THIS;
Collider_DestroyCylinder(play, &this->unk_2B4);
Collider_DestroyCylinder(play, &this->unk_300);
Collider_DestroyCylinder(play, &this->bodyCollider);
Collider_DestroyCylinder(play, &this->tailCollider);
}
void func_80A200E0(EnSyatekiWf* this) {
Vec3f sp24;
s16 temp;
/**
* Positions the Wolfos at the start of its assigned path and rotates it to face
* the next point on the path.
*/
void EnSyatekiWf_InitPathStart(EnSyatekiWf* this) {
Vec3f targetPos;
this->actor.world.pos.x = this->unk_2A0[0].x;
this->actor.world.pos.y = this->unk_2A0[0].y;
this->actor.world.pos.z = this->unk_2A0[0].z;
sp24.x = this->unk_2A0[this->unk_2A4].x;
sp24.y = this->unk_2A0[this->unk_2A4].y;
sp24.z = this->unk_2A0[this->unk_2A4].z;
temp = Math_Vec3f_Yaw(&this->actor.world.pos, &sp24);
this->actor.shape.rot.y = temp;
this->actor.world.rot.y = temp;
this->actor.world.pos.x = this->pathPoints[0].x;
this->actor.world.pos.y = this->pathPoints[0].y;
this->actor.world.pos.z = this->pathPoints[0].z;
targetPos.x = this->pathPoints[this->currentPointIndex].x;
targetPos.y = this->pathPoints[this->currentPointIndex].y;
targetPos.z = this->pathPoints[this->currentPointIndex].z;
this->actor.world.rot.y = this->actor.shape.rot.y = Math_Vec3f_Yaw(&this->actor.world.pos, &targetPos);
}
void func_80A201CC(EnSyatekiWf* this) {
void EnSyatekiWf_SetupWaitForSignal(EnSyatekiWf* this) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
this->actor.speedXZ = 0.0f;
@ -222,67 +222,79 @@ void func_80A201CC(EnSyatekiWf* this) {
this->actor.shape.rot = this->actor.world.rot;
this->actor.colChkInfo.health = 2;
this->actor.draw = NULL;
this->unk_2A4 = 1;
this->unk_298 = 0;
this->currentPointIndex = 1;
this->isActive = false;
syatekiMan->wolfosFlags &= ~(1 << EN_SYATEKI_WF_GET_INDEX(&this->actor));
this->actionFunc = func_80A20284;
this->actionFunc = EnSyatekiWf_WaitForSignal;
}
void func_80A20284(EnSyatekiWf* this, PlayState* play) {
/**
* Waits until the shooting gallery man sets the appropriate Wolfos flag.
*/
void EnSyatekiWf_WaitForSignal(EnSyatekiWf* this, PlayState* play) {
EnSyatekiMan* syatekiMan;
if (this->actor.parent != NULL) {
syatekiMan = (EnSyatekiMan*)this->actor.parent;
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->unk_298 == 1)) {
func_80A200E0(this);
func_80A2030C(this);
if ((syatekiMan->shootingGameState == SG_GAME_STATE_RUNNING) && (this->isActive == true)) {
EnSyatekiWf_InitPathStart(this);
EnSyatekiWf_SetupWaitToMove(this);
} else if (syatekiMan->wolfosFlags & (1 << EN_SYATEKI_WF_GET_INDEX(&this->actor))) {
this->unk_298 = 1;
this->isActive = true;
}
}
}
void func_80A2030C(EnSyatekiWf* this) {
this->actionFunc = func_80A20320;
void EnSyatekiWf_SetupWaitToMove(EnSyatekiWf* this) {
this->actionFunc = EnSyatekiWf_WaitToMove;
}
void func_80A20320(EnSyatekiWf* this, PlayState* play) {
if (this->unk_29C >= 11) {
/**
* Waits 11 frames, then makes the Wolfos start running forward.
*/
void EnSyatekiWf_WaitToMove(EnSyatekiWf* this, PlayState* play) {
if (this->waitTimer >= 11) {
Actor_PlaySfxAtPos(this->actor.parent, NA_SE_EN_WOLFOS_APPEAR);
this->unk_29C = 0;
func_80A20378(this);
this->waitTimer = 0;
EnSyatekiWf_SetupRun(this);
} else {
this->unk_29C++;
this->waitTimer++;
}
}
void func_80A20378(EnSyatekiWf* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 1);
void EnSyatekiWf_SetupRun(EnSyatekiWf* this) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_WF_ANIM_RUN);
this->actor.speedXZ = 10.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.draw = EnSyatekiWf_Draw;
this->actionFunc = func_80A203DC;
this->actionFunc = EnSyatekiWf_Run;
}
void func_80A203DC(EnSyatekiWf* this, PlayState* play) {
Vec3f sp54;
f32 sp50;
s16 temp_v0;
/**
* Runs forward along its assigned path. If the Wolfos encounters a wall directly
* in front of it, this function will make it jump. If the Wolfos reaches a certain
* point along the path (which is specified via its params), this function will make
* it stop running and howl in place.
*/
void EnSyatekiWf_Run(EnSyatekiWf* this, PlayState* play) {
Vec3f targetPoint;
f32 distToTarget;
s16 wallYawDiff;
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
if (syatekiMan->shootingGameState != SG_GAME_STATE_RUNNING) {
func_80A201CC(this);
EnSyatekiWf_SetupWaitForSignal(this);
}
sp54.x = this->unk_2A0[this->unk_2A4].x;
sp54.y = this->unk_2A0[this->unk_2A4].y;
sp54.z = this->unk_2A0[this->unk_2A4].z;
temp_v0 = (this->actor.wallYaw - this->actor.world.rot.y) + 0x8000;
targetPoint.x = this->pathPoints[this->currentPointIndex].x;
targetPoint.y = this->pathPoints[this->currentPointIndex].y;
targetPoint.z = this->pathPoints[this->currentPointIndex].z;
wallYawDiff = (this->actor.wallYaw - this->actor.world.rot.y) + 0x8000;
if (this->actor.bgCheckFlags & 1) {
if (this->actor.bgCheckFlags & 8) {
if ((ABS(temp_v0) < 0x1555) && (this->actor.wallPoly != this->actor.floorPoly)) {
func_80A20670(this);
if ((ABS(wallYawDiff) < 0x1555) && (this->actor.wallPoly != this->actor.floorPoly)) {
EnSyatekiWf_SetupJump(this);
return;
}
}
@ -291,13 +303,13 @@ void func_80A203DC(EnSyatekiWf* this, PlayState* play) {
this->actor.velocity.y = 2.0f;
}
sp50 = Math_Vec3f_DistXZ(&this->actor.world.pos, &sp54);
this->unk_2A8 = Math_Vec3f_Yaw(&this->actor.world.pos, &sp54);
distToTarget = Math_Vec3f_DistXZ(&this->actor.world.pos, &targetPoint);
this->yawTarget = Math_Vec3f_Yaw(&this->actor.world.pos, &targetPoint);
if (sp50 > 15.0f) {
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_2A8, 5, 0x3000, 0x100);
if (distToTarget > 15.0f) {
Math_SmoothStepToS(&this->actor.world.rot.y, this->yawTarget, 5, 0x3000, 0x100);
this->actor.shape.rot.y = this->actor.world.rot.y;
if (sp50 < 50.0f) {
if (distToTarget < 50.0f) {
if (this->actor.speedXZ > 3.0f) {
this->actor.speedXZ = this->actor.speedXZ - 0.5f;
} else {
@ -305,16 +317,16 @@ void func_80A203DC(EnSyatekiWf* this, PlayState* play) {
}
}
} else {
if (this->unk_2A4 < (this->unk_2A6 - 1)) {
if (this->unk_2A4 == EN_SYATEKI_WF_GET_PARAM_F0(&this->actor)) {
func_80A2079C(this);
if (this->currentPointIndex < (this->maxPointIndex - 1)) {
if (this->currentPointIndex == EN_SYATEKI_WF_GET_POINT_TO_HOWL(&this->actor)) {
EnSyatekiWf_SetupHowl(this);
}
this->unk_2A4++;
this->currentPointIndex++;
} else {
this->unk_298 = 0;
this->unk_2A4 = 1;
func_80A201CC(this);
this->isActive = false;
this->currentPointIndex = 1;
EnSyatekiWf_SetupWaitForSignal(this);
}
}
@ -324,76 +336,82 @@ void func_80A203DC(EnSyatekiWf* this, PlayState* play) {
}
}
void func_80A20670(EnSyatekiWf* this) {
void EnSyatekiWf_SetupJump(EnSyatekiWf* this) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_TEKU_JUMP);
this->actor.velocity.y = 20.0f;
this->actor.speedXZ = 5.0f;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 2);
this->actionFunc = func_80A206DC;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_WF_ANIM_JUMP);
this->actionFunc = EnSyatekiWf_Jump;
}
void func_80A206DC(EnSyatekiWf* this, PlayState* play) {
void EnSyatekiWf_Jump(EnSyatekiWf* this, PlayState* play) {
if (this->actor.bgCheckFlags & 2) {
func_80A20710(this);
EnSyatekiWf_SetupLand(this);
}
}
void func_80A20710(EnSyatekiWf* this) {
void EnSyatekiWf_SetupLand(EnSyatekiWf* this) {
this->actor.speedXZ = 0.0f;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 3);
this->actionFunc = func_80A2075C;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_WF_ANIM_LAND);
this->actionFunc = EnSyatekiWf_Land;
}
void func_80A2075C(EnSyatekiWf* this, PlayState* play) {
/**
* Freezes the Wolfos in place until its landing animation is complete, then makes it start running.
*/
void EnSyatekiWf_Land(EnSyatekiWf* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
func_80A20378(this);
EnSyatekiWf_SetupRun(this);
}
}
void func_80A2079C(EnSyatekiWf* this) {
this->unk_29A = 40;
void EnSyatekiWf_SetupHowl(EnSyatekiWf* this) {
this->timer = 40;
this->actor.speedXZ = 0.0f;
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_APPEAR);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 5);
this->actionFunc = func_80A20800;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_WF_ANIM_DAMAGED);
this->actionFunc = EnSyatekiWf_Howl;
}
void func_80A20800(EnSyatekiWf* this, PlayState* play) {
/**
* Makes the Wolfos stand completely still until 40 frames after its damaged animation is complete.
*/
void EnSyatekiWf_Howl(EnSyatekiWf* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->unk_29A--;
if (this->unk_29A == 0) {
func_80A20378(this);
this->timer--;
if (this->timer == 0) {
EnSyatekiWf_SetupRun(this);
}
}
}
void func_80A20858(EnSyatekiWf* this, PlayState* play) {
void EnSyatekiWf_SetupDead(EnSyatekiWf* this, PlayState* play) {
EnSyatekiMan* syatekiMan = (EnSyatekiMan*)this->actor.parent;
this->unk_298 = 0;
this->isActive = false;
this->actor.speedXZ = 0.0f;
EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A20EDC, &D_80A20EE8, 5, 2);
EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 5, 2);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_DEAD);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 6);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, EN_SYATEKI_WF_ANIM_REAR_UP_FALL_OVER);
syatekiMan->score += 100;
this->actionFunc = func_80A208F8;
this->actionFunc = EnSyatekiWf_Dead;
}
void func_80A208F8(EnSyatekiWf* this, PlayState* play) {
void EnSyatekiWf_Dead(EnSyatekiWf* this, PlayState* play) {
s32 pad;
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
func_80A201CC(this);
EnSyatekiWf_SetupWaitForSignal(this);
} else {
Vec3f sp68;
Vec3f sp5C = D_80A20FC4;
Vec3f firePos;
Vec3f sFireVelocityAndAccel = { 0.0f, 0.5f, 0.0f };
s32 i;
for (i = (s32)this->skelAnime.animLength - (s32)this->skelAnime.curFrame; i >= 0; i--) {
sp68.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
sp68.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
sp68.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &sp68, &sp5C, &sp5C, 0x64, 0, 2);
firePos.x = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.x;
firePos.z = randPlusMinusPoint5Scaled(60.0f) + this->actor.world.pos.z;
firePos.y = randPlusMinusPoint5Scaled(50.0f) + (this->actor.world.pos.y + 20.0f);
func_800B3030(play, &firePos, &sFireVelocityAndAccel, &sFireVelocityAndAccel, 100, 0, 2);
}
}
}
@ -402,7 +420,7 @@ void EnSyatekiWf_Update(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
EnSyatekiWf* this = THIS;
if (this->actionFunc != func_80A20284) {
if (this->actionFunc != EnSyatekiWf_WaitForSignal) {
SkelAnime_Update(&this->skelAnime);
}
@ -417,26 +435,34 @@ void EnSyatekiWf_Update(Actor* thisx, PlayState* play2) {
Math_SmoothStepToS(&this->actor.shape.rot.z, 0, 1, 0x3E8, 0);
}
if ((this->unk_2B4.base.acFlags & AC_HIT) || (this->unk_300.base.acFlags & AC_HIT) ||
(this->unk_34C.base.acFlags & AC_HIT)) {
this->unk_2B4.base.acFlags &= ~AC_HIT;
this->unk_300.base.acFlags &= ~AC_HIT;
this->unk_34C.base.acFlags &= ~AC_HIT;
if ((this->bodyCollider.base.acFlags & AC_HIT) || (this->tailCollider.base.acFlags & AC_HIT) ||
(this->headCollider.base.acFlags & AC_HIT)) {
this->bodyCollider.base.acFlags &= ~AC_HIT;
this->tailCollider.base.acFlags &= ~AC_HIT;
this->headCollider.base.acFlags &= ~AC_HIT;
// The Wolfos always starts with 2 health, so the subtraction below is guaranteed to kill it;
// the else-block is never reached in practice. If you *could* damage the Wolfos without killing
// it, then the number "30" would appear every time you hit it, and the player's displayed score
// would increase by 30. However, the else-block doesn't increase the shooting gallery man's
// "score" variable, so it would become desynchronized from the displayed score. This could cause
// weird behavior, like not getting a free replay after finishing a game with 2000 or more points.
this->actor.colChkInfo.health -= 2;
if (this->actor.colChkInfo.health == 0) {
Audio_PlayFanfare(NA_BGM_GET_ITEM | 0x900);
func_80A20858(this, play);
EnSyatekiWf_SetupDead(this, play);
} else {
play_sound(NA_SE_SY_TRE_BOX_APPEAR);
EffectSsExtra_Spawn(play, &this->actor.world.pos, &D_80A20EDC, &D_80A20EE8, 3, 0);
EffectSsExtra_Spawn(play, &this->actor.world.pos, &sVelocity, &sAccel, 3, 0);
}
}
Collider_UpdateCylinder(&this->actor, &this->unk_2B4);
if ((this->actionFunc != func_80A20284) && (this->actionFunc != func_80A208F8) && (this->actor.draw != NULL)) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->unk_300.base);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->unk_2B4.base);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->unk_34C.base);
Collider_UpdateCylinder(&this->actor, &this->bodyCollider);
if ((this->actionFunc != EnSyatekiWf_WaitForSignal) && (this->actionFunc != EnSyatekiWf_Dead) &&
(this->actor.draw != NULL)) {
CollisionCheck_SetAC(play, &play->colChkCtx, &this->tailCollider.base);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->bodyCollider.base);
CollisionCheck_SetAC(play, &play->colChkCtx, &this->headCollider.base);
this->actor.focus.pos = this->actor.world.pos;
this->actor.focus.pos.y += 25.0f;
}
@ -455,19 +481,26 @@ s32 EnSyatekiWf_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
}
void EnSyatekiWf_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
static Vec3f sTailColliderOffset = { 1200.0f, 0.0f, 0.0f };
EnSyatekiWf* this = THIS;
Vec3f sp18;
Vec3f tailColliderPos;
Collider_UpdateSpheres(limbIndex, &this->unk_34C);
Collider_UpdateSpheres(limbIndex, &this->headCollider);
if (limbIndex == WOLFOS_NORMAL_LIMB_TAIL) {
Matrix_MultVec3f(&D_80A20FD0, &sp18);
this->unk_300.dim.pos.x = sp18.x;
this->unk_300.dim.pos.y = sp18.y;
this->unk_300.dim.pos.z = sp18.z;
Matrix_MultVec3f(&sTailColliderOffset, &tailColliderPos);
this->tailCollider.dim.pos.x = tailColliderPos.x;
this->tailCollider.dim.pos.y = tailColliderPos.y;
this->tailCollider.dim.pos.z = tailColliderPos.z;
}
}
void EnSyatekiWf_Draw(Actor* thisx, PlayState* play) {
static TexturePtr sEyeTextures[] = {
gWolfosNormalEyeOpenTex,
gWolfosNormalEyeHalfTex,
gWolfosNormalEyeNarrowTex,
gWolfosNormalEyeHalfTex,
};
EnSyatekiWf* this = THIS;
OPEN_DISPS(play->state.gfxCtx);

View File

@ -4,9 +4,9 @@
#include "global.h"
#include "objects/object_wf/object_wf.h"
#define EN_SYATEKI_WF_GET_PARAM_F0(thisx) (((thisx)->params & 0xF0) >> 4)
#define EN_SYATEKI_WF_GET_POINT_TO_HOWL(thisx) (((thisx)->params & 0xF0) >> 4)
#define EN_SYATEKI_WF_GET_INDEX(thisx) (((thisx)->params & 0xFF00) >> 8)
#define EN_SYATEKI_WF_PARAMS(index, unkF0, unused) (((index << 8) & 0xFF00) | ((unkF0 << 4) & 0xF0) | (unused & 0xF))
#define EN_SYATEKI_WF_PARAMS(index, pointToHowl, unused) (((index << 8) & 0xFF00) | ((pointToHowl << 4) & 0xF0) | (unused & 0xF))
struct EnSyatekiWf;
@ -19,19 +19,19 @@ typedef struct EnSyatekiWf {
/* 0x20C */ Vec3s morphTable[WOLFOS_NORMAL_LIMB_MAX];
/* 0x290 */ UNK_TYPE1 unk_290[0x4];
/* 0x294 */ EnSyatekiWfActionFunc actionFunc;
/* 0x298 */ s16 unk_298;
/* 0x29A */ s16 unk_29A;
/* 0x29C */ s16 unk_29C;
/* 0x2A0 */ Vec3s* unk_2A0;
/* 0x2A4 */ s16 unk_2A4;
/* 0x2A6 */ s16 unk_2A6;
/* 0x2A8 */ s16 unk_2A8;
/* 0x2AC */ f32 unk_2AC;
/* 0x298 */ s16 isActive;
/* 0x29A */ s16 timer;
/* 0x29C */ s16 waitTimer;
/* 0x2A0 */ Vec3s* pathPoints;
/* 0x2A4 */ s16 currentPointIndex;
/* 0x2A6 */ s16 maxPointIndex;
/* 0x2A8 */ s16 yawTarget;
/* 0x2AC */ f32 unk_2AC; // set to 10.0f, but never used
/* 0x2B0 */ u8 eyeIndex;
/* 0x2B4 */ ColliderCylinder unk_2B4;
/* 0x300 */ ColliderCylinder unk_300;
/* 0x34C */ ColliderJntSph unk_34C;
/* 0x36C */ ColliderJntSphElement unk_36C[1];
/* 0x2B4 */ ColliderCylinder bodyCollider;
/* 0x300 */ ColliderCylinder tailCollider;
/* 0x34C */ ColliderJntSph headCollider;
/* 0x36C */ ColliderJntSphElement headColliderElements[1];
/* 0x3AC */ UNK_TYPE1 unk_3AC[0x20];
} EnSyatekiWf; // size = 0x3CC

View File

@ -317,7 +317,7 @@ void EnWf_Init(Actor* thisx, PlayState* play) {
Actor_SetScale(&this->actor, 0.0075f);
if (this->actor.params == 0) {
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitingAnim, this->jointTable,
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosNormalSkel, &gWolfosWaitAnim, this->jointTable,
this->morphTable, WOLFOS_NORMAL_LIMB_MAX);
this->actor.hintId = TATL_HINT_ID_WOLFOS;
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable2, &sColChkInfoInit);
@ -325,7 +325,7 @@ void EnWf_Init(Actor* thisx, PlayState* play) {
this->collider1.elements[1].info.toucher.damage = 8;
this->actor.colChkInfo.health = 6;
} else {
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosWhiteSkel, &gWolfosWaitingAnim, this->jointTable,
SkelAnime_InitFlex(play, &this->skelAnime, &gWolfosWhiteSkel, &gWolfosWaitAnim, this->jointTable,
this->morphTable, WOLFOS_WHITE_LIMB_MAX);
this->actor.hintId = TATL_HINT_ID_WHITE_WOLFOS;
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable1, &sColChkInfoInit);
@ -549,7 +549,7 @@ void func_80990F50(EnWf* this, PlayState* play) {
}
void func_80990FC8(EnWf* this) {
Animation_Change(&this->skelAnime, &gWolfosRearingUpFallingOverAnim, 0.5f, 0.0f, 7.0f, ANIMMODE_ONCE_INTERP, 0.0f);
Animation_Change(&this->skelAnime, &gWolfosRearUpFallOverAnim, 0.5f, 0.0f, 7.0f, ANIMMODE_ONCE_INTERP, 0.0f);
this->unk_2A0 = 5;
this->actor.flags |= ACTOR_FLAG_1;
this->actionFunc = func_80991040;
@ -572,7 +572,7 @@ void func_80991040(EnWf* this, PlayState* play) {
void func_809910F0(EnWf* this) {
this->collider2.base.acFlags &= ~AC_ON;
this->actor.speedXZ = 0.0f;
Animation_Change(&this->skelAnime, &gWolfosRearingUpFallingOverAnim, 0.5f, 0.0f, 7.0f, ANIMMODE_ONCE_INTERP, -5.0f);
Animation_Change(&this->skelAnime, &gWolfosRearUpFallOverAnim, 0.5f, 0.0f, 7.0f, ANIMMODE_ONCE_INTERP, -5.0f);
this->unk_2A0 = 5;
this->actionFunc = func_80991174;
}
@ -591,7 +591,7 @@ void func_80991174(EnWf* this, PlayState* play) {
void func_80991200(EnWf* this) {
this->collider2.base.acFlags |= AC_ON;
Animation_MorphToLoop(&this->skelAnime, &gWolfosWaitingAnim, -4.0f);
Animation_MorphToLoop(&this->skelAnime, &gWolfosWaitAnim, -4.0f);
this->unk_2A0 = (s32)Rand_ZeroFloat(10.0f) + 2;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = func_80991280;
@ -642,7 +642,7 @@ void func_80991280(EnWf* this, PlayState* play) {
void func_80991438(EnWf* this) {
this->collider2.base.acFlags |= AC_ON;
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.speedXZ = 8.0f;
this->actionFunc = func_8099149C;
@ -703,7 +703,7 @@ void func_8099149C(EnWf* this, PlayState* play) {
}
void func_80991738(EnWf* this) {
Animation_MorphToLoop(&this->skelAnime, &gWolfosSidesteppingAnim, -4.0f);
Animation_MorphToLoop(&this->skelAnime, &gWolfosSidestepAnim, -4.0f);
this->actionFunc = func_8099177C;
}
@ -755,7 +755,7 @@ void func_8099177C(EnWf* this, PlayState* play) {
void func_80991948(EnWf* this) {
this->collider2.base.acFlags |= AC_ON;
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
if (Rand_ZeroOne() > 0.5f) {
this->unk_29A = 16000;
} else {
@ -809,7 +809,7 @@ void func_809919F4(EnWf* this, PlayState* play) {
void func_80991C04(EnWf* this) {
this->collider2.base.acFlags |= AC_ON;
Animation_PlayOnce(&this->skelAnime, &gWolfosSlashingAnim);
Animation_PlayOnce(&this->skelAnime, &gWolfosSlashAnim);
this->collider1.base.atFlags &= ~AT_BOUNCED;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
this->unk_2A0 = 7;
@ -879,7 +879,7 @@ void func_80991FD8(EnWf* this) {
if (this->skelAnime.curFrame > 15.0f) {
phi_f0 = 15.0f;
}
Animation_Change(&this->skelAnime, &gWolfosSlashingAnim, -0.5f, this->skelAnime.curFrame - 1.0f, phi_f0,
Animation_Change(&this->skelAnime, &gWolfosSlashAnim, -0.5f, this->skelAnime.curFrame - 1.0f, phi_f0,
ANIMMODE_ONCE_INTERP, 0.0f);
this->collider1.base.atFlags &= ~AT_ON;
this->actionFunc = func_80992068;
@ -923,7 +923,7 @@ void func_80992068(EnWf* this, PlayState* play) {
void func_8099223C(EnWf* this) {
this->collider2.base.acFlags &= ~AC_ON;
Animation_MorphToPlayOnce(&this->skelAnime, &gWolfosBackflippingAnim, -3.0f);
Animation_MorphToPlayOnce(&this->skelAnime, &gWolfosBackflipAnim, -3.0f);
this->unk_2A0 = 0;
this->actor.speedXZ = -6.0f;
this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
@ -1021,8 +1021,8 @@ void func_809924EC(EnWf* this, PlayState* play) {
void func_809926D0(EnWf* this) {
this->collider2.base.acFlags &= ~AC_ON;
Animation_Change(&this->skelAnime, &gWolfosBackflippingAnim, -1.0f,
Animation_GetLastFrame(&gWolfosBackflippingAnim.common), 0.0f, ANIMMODE_ONCE, -3.0f);
Animation_Change(&this->skelAnime, &gWolfosBackflipAnim, -1.0f, Animation_GetLastFrame(&gWolfosBackflipAnim.common),
0.0f, ANIMMODE_ONCE, -3.0f);
this->unk_2A0 = 0;
this->actor.speedXZ = 6.5f;
this->actor.velocity.y = 15.0f;
@ -1053,8 +1053,8 @@ void func_8099282C(EnWf* this) {
this->collider1.base.atFlags &= ~AT_ON;
this->unk_2A0 = 10;
this->actor.speedXZ = 0.0f;
Animation_Change(&this->skelAnime, &gWolfosBlockingAnim, -1.0f, Animation_GetLastFrame(&gWolfosBlockingAnim.common),
0.0f, ANIMMODE_ONCE, -2.0f);
Animation_Change(&this->skelAnime, &gWolfosBlockAnim, -1.0f, Animation_GetLastFrame(&gWolfosBlockAnim.common), 0.0f,
ANIMMODE_ONCE, -2.0f);
this->actionFunc = func_809928CC;
}
@ -1091,7 +1091,7 @@ void func_80992A74(EnWf* this, PlayState* play) {
f32 temp_f0;
this->collider2.base.acFlags |= AC_ON;
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
player = GET_PLAYER(play);
temp_f0 = Math_SinS((player->actor.shape.rot.y + this->unk_29A) - this->actor.yawTowardsPlayer);
if (temp_f0 > 0.0f) {
@ -1153,7 +1153,7 @@ void func_80992B8C(EnWf* this, PlayState* play) {
void func_80992D6C(EnWf* this) {
this->collider2.base.acFlags &= ~AC_ON;
Animation_MorphToPlayOnce(&this->skelAnime, &gWolfosRearingUpFallingOverAnim, -4.0f);
Animation_MorphToPlayOnce(&this->skelAnime, &gWolfosRearUpFallOverAnim, -4.0f);
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
if (this->actor.bgCheckFlags & 1) {
this->actor.speedXZ = -6.0f;
@ -1205,7 +1205,7 @@ void func_80992E0C(EnWf* this, PlayState* play) {
}
void func_80992FD4(EnWf* this) {
Animation_MorphToLoop(&this->skelAnime, &gWolfosWaitingAnim, -4.0f);
Animation_MorphToLoop(&this->skelAnime, &gWolfosWaitAnim, -4.0f);
this->actionFunc = func_80993018;
}
@ -1232,7 +1232,7 @@ void func_80993018(EnWf* this, PlayState* play) {
}
void func_80993148(EnWf* this) {
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
this->actor.speedXZ = 0.0f;
this->actionFunc = func_80993194;
}
@ -1277,7 +1277,7 @@ void func_80993194(EnWf* this, PlayState* play) {
}
void func_80993350(EnWf* this) {
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_WOLFOS_APPEAR);
this->actionFunc = func_809933A0;
}
@ -1317,7 +1317,7 @@ void func_809933A0(EnWf* this, PlayState* play) {
}
void func_80993524(EnWf* this) {
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunningAnim, -4.0f);
Animation_MorphToLoop(&this->skelAnime, &gWolfosRunAnim, -4.0f);
this->actor.speedXZ = 6.0f;
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actionFunc = func_8099357C;

View File

@ -9125,8 +9125,8 @@
0x809CA27C:("BgIcicle_Draw",),
0x809CA3F0:("EnSyatekiCrow_Init",),
0x809CA5A8:("EnSyatekiCrow_Destroy",),
0x809CA5D4:("EnSyatekiCrow_SetupWaitForSpawn",),
0x809CA67C:("EnSyatekiCrow_WaitForSpawn",),
0x809CA5D4:("EnSyatekiCrow_SetupWaitForSignal",),
0x809CA67C:("EnSyatekiCrow_WaitForSignal",),
0x809CA71C:("EnSyatekiCrow_SetupWaitToMove",),
0x809CA840:("EnSyatekiCrow_WaitToMove",),
0x809CA8E4:("EnSyatekiCrow_Fly",),
@ -9876,21 +9876,21 @@
0x80A1FC50:("DmHina_Draw",),
0x80A1FE50:("EnSyatekiWf_Init",),
0x80A200A0:("EnSyatekiWf_Destroy",),
0x80A200E0:("func_80A200E0",),
0x80A201CC:("func_80A201CC",),
0x80A20284:("func_80A20284",),
0x80A2030C:("func_80A2030C",),
0x80A20320:("func_80A20320",),
0x80A20378:("func_80A20378",),
0x80A203DC:("func_80A203DC",),
0x80A20670:("func_80A20670",),
0x80A206DC:("func_80A206DC",),
0x80A20710:("func_80A20710",),
0x80A2075C:("func_80A2075C",),
0x80A2079C:("func_80A2079C",),
0x80A20800:("func_80A20800",),
0x80A20858:("func_80A20858",),
0x80A208F8:("func_80A208F8",),
0x80A200E0:("EnSyatekiWf_InitPathStart",),
0x80A201CC:("EnSyatekiWf_SetupWaitForSignal",),
0x80A20284:("EnSyatekiWf_WaitForSignal",),
0x80A2030C:("EnSyatekiWf_SetupWaitToMove",),
0x80A20320:("EnSyatekiWf_WaitToMove",),
0x80A20378:("EnSyatekiWf_SetupRun",),
0x80A203DC:("EnSyatekiWf_Run",),
0x80A20670:("EnSyatekiWf_SetupJump",),
0x80A206DC:("EnSyatekiWf_Jump",),
0x80A20710:("EnSyatekiWf_SetupLand",),
0x80A2075C:("EnSyatekiWf_Land",),
0x80A2079C:("EnSyatekiWf_SetupHowl",),
0x80A20800:("EnSyatekiWf_Howl",),
0x80A20858:("EnSyatekiWf_SetupDead",),
0x80A208F8:("EnSyatekiWf_Dead",),
0x80A20A50:("EnSyatekiWf_Update",),
0x80A20CF4:("EnSyatekiWf_OverrideLimbDraw",),
0x80A20D10:("EnSyatekiWf_PostLimbDraw",),
@ -10063,10 +10063,10 @@
0x80A2B390:("BgDblueMovebg_Draw",),
0x80A2BC00:("EnSyatekiDekunuts_Init",),
0x80A2BE28:("EnSyatekiDekunuts_Destroy",),
0x80A2BE54:("EnSyatekiDekunuts_SetupWaitForSpawn",),
0x80A2BF18:("EnSyatekiDekunuts_WaitForSpawn",),
0x80A2BFC4:("EnSyatekiDekunuts_SetupSpawn",),
0x80A2C0F8:("EnSyatekiDekunuts_Spawn",),
0x80A2BE54:("EnSyatekiDekunuts_SetupWaitForSignal",),
0x80A2BF18:("EnSyatekiDekunuts_WaitForSignal",),
0x80A2BFC4:("EnSyatekiDekunuts_SetupWaitToStart",),
0x80A2C0F8:("EnSyatekiDekunuts_WaitToStart",),
0x80A2C150:("EnSyatekiDekunuts_SetupWaitToEmerge",),
0x80A2C168:("EnSyatekiDekunuts_WaitToEmerge",),
0x80A2C1AC:("EnSyatekiDekunuts_SetupEmerge",),

View File

@ -10954,13 +10954,13 @@
0x80A20EA0:("D_80A20EA0","UNK_TYPE1","",0x1),
0x80A20EAC:("D_80A20EAC","UNK_PTR","",0x4),
0x80A20EB0:("D_80A20EB0","UNK_TYPE1","",0x1),
0x80A20EDC:("D_80A20EDC","UNK_TYPE1","",0x1),
0x80A20EE8:("D_80A20EE8","UNK_TYPE1","",0x1),
0x80A20EDC:("sVelocity","UNK_TYPE1","",0x1),
0x80A20EE8:("sAccel","UNK_TYPE1","",0x1),
0x80A20EF4:("En_Syateki_Wf_InitVars","UNK_TYPE1","",0x1),
0x80A20F14:("D_80A20F14","UNK_PTR","",0x4),
0x80A20FBC:("D_80A20FBC","UNK_TYPE1","",0x1),
0x80A20FC4:("D_80A20FC4","UNK_TYPE4","",0x4),
0x80A20FD0:("D_80A20FD0","UNK_TYPE1","",0x1),
0x80A20FC4:("sFireVelocityAndAccel","UNK_TYPE4","",0x4),
0x80A20FD0:("sTailColliderOffset","UNK_TYPE1","",0x1),
0x80A20FDC:("D_80A20FDC","UNK_TYPE1","",0x1),
0x80A20FF0:("D_80A20FF0","f32","",0x4),
0x80A229F0:("Obj_Skateblock_InitVars","UNK_TYPE1","",0x1),