En_look_nuts OK with docs (#674)

* OK

* some documenting

* lgtm

* format

* spacing things out

* one other name

* PR feedback

* fix enum

* addressing PR

* actor fixer

* fixing PR
This commit is contained in:
Parker Burnett 2022-03-24 21:22:46 -04:00 committed by GitHub
parent 20fed85f67
commit 3431b542ff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 402 additions and 99 deletions

View File

@ -1,50 +1,50 @@
<Root>
<File Name="object_dnk" Segment="6">
<Animation Name="object_dnk_Anim_00031C" Offset="0x31C" />
<Animation Name="object_dnk_Anim_000430" Offset="0x430" />
<Animation Name="object_dnk_Anim_0006CC" Offset="0x6CC" />
<Animation Name="object_dnk_Anim_000894" Offset="0x894" />
<Animation Name="object_dnk_Anim_000B70" Offset="0xB70" />
<Texture Name="object_dnk_Tex_000B80" OutName="tex_000B80" Format="rgba16" Width="32" Height="32" Offset="0xB80" />
<Texture Name="object_dnk_Tex_001380" OutName="tex_001380" Format="rgba16" Width="16" Height="16" Offset="0x1380" />
<Texture Name="object_dnk_Tex_001580" OutName="tex_001580" Format="rgba16" Width="8" Height="8" Offset="0x1580" />
<Texture Name="object_dnk_Tex_001600" OutName="tex_001600" Format="rgba16" Width="8" Height="8" Offset="0x1600" />
<Texture Name="object_dnk_Tex_001680" OutName="tex_001680" Format="rgba16" Width="8" Height="8" Offset="0x1680" />
<Texture Name="object_dnk_Tex_001700" OutName="tex_001700" Format="rgba16" Width="8" Height="8" Offset="0x1700" />
<Texture Name="object_dnk_Tex_001780" OutName="tex_001780" Format="rgba16" Width="8" Height="8" Offset="0x1780" />
<DList Name="object_dnk_DL_001DD0" Offset="0x1DD0" />
<DList Name="object_dnk_DL_001E58" Offset="0x1E58" />
<DList Name="object_dnk_DL_001E68" Offset="0x1E68" />
<DList Name="object_dnk_DL_001EF0" Offset="0x1EF0" />
<DList Name="object_dnk_DL_001F00" Offset="0x1F00" />
<DList Name="object_dnk_DL_001F90" Offset="0x1F90" />
<DList Name="object_dnk_DL_001FA0" Offset="0x1FA0" />
<DList Name="object_dnk_DL_002030" Offset="0x2030" />
<DList Name="object_dnk_DL_002040" Offset="0x2040" />
<DList Name="object_dnk_DL_0020F0" Offset="0x20F0" />
<DList Name="object_dnk_DL_002100" Offset="0x2100" />
<DList Name="object_dnk_DL_002188" Offset="0x2188" />
<DList Name="object_dnk_DL_002198" Offset="0x2198" />
<DList Name="object_dnk_DL_002240" Offset="0x2240" />
<DList Name="object_dnk_DL_002250" Offset="0x2250" />
<DList Name="object_dnk_DL_0022F8" Offset="0x22F8" />
<DList Name="object_dnk_DL_002308" Offset="0x2308" />
<DList Name="object_dnk_DL_002400" Offset="0x2400" />
<DList Name="object_dnk_DL_002410" Offset="0x2410" />
<DList Name="object_dnk_DL_002510" Offset="0x2510" />
<DList Name="object_dnk_DL_002700" Offset="0x2700" />
<Limb Name="object_dnk_Standardlimb_0027A8" Type="Standard" EnumName="OBJECT_DNK_LIMB_01" Offset="0x27A8" />
<Limb Name="object_dnk_Standardlimb_0027B4" Type="Standard" EnumName="OBJECT_DNK_LIMB_02" Offset="0x27B4" />
<Limb Name="object_dnk_Standardlimb_0027C0" Type="Standard" EnumName="OBJECT_DNK_LIMB_03" Offset="0x27C0" />
<Limb Name="object_dnk_Standardlimb_0027CC" Type="Standard" EnumName="OBJECT_DNK_LIMB_04" Offset="0x27CC" />
<Limb Name="object_dnk_Standardlimb_0027D8" Type="Standard" EnumName="OBJECT_DNK_LIMB_05" Offset="0x27D8" />
<Limb Name="object_dnk_Standardlimb_0027E4" Type="Standard" EnumName="OBJECT_DNK_LIMB_06" Offset="0x27E4" />
<Limb Name="object_dnk_Standardlimb_0027F0" Type="Standard" EnumName="OBJECT_DNK_LIMB_07" Offset="0x27F0" />
<Limb Name="object_dnk_Standardlimb_0027FC" Type="Standard" EnumName="OBJECT_DNK_LIMB_08" Offset="0x27FC" />
<Limb Name="object_dnk_Standardlimb_002808" Type="Standard" EnumName="OBJECT_DNK_LIMB_09" Offset="0x2808" />
<Limb Name="object_dnk_Standardlimb_002814" Type="Standard" EnumName="OBJECT_DNK_LIMB_0A" Offset="0x2814" />
<Skeleton Name="object_dnk_Skel_002848" Type="Normal" LimbType="Standard" LimbNone="OBJECT_DNK_LIMB_NONE" LimbMax="OBJECT_DNK_LIMB_MAX" EnumName="object_dnk_Limbs" Offset="0x2848" />
<Animation Name="object_dnk_Anim_002A08" Offset="0x2A08" />
<Animation Name="object_dnk_Anim_002B6C" Offset="0x2B6C" />
<Animation Name="gDekuPalaceGuardAttackAnim" Offset="0x31C" /> <!-- Original named: dnk_attack -->
<Animation Name="gDekuPalaceGuardDigAnim" Offset="0x430" /> <!-- Original named: dnk_dig -->
<Animation Name="gDekuPalaceGuardHappyAnim" Offset="0x6CC" /> <!-- Original named: dnk_happy -->
<Animation Name="gDekuPalaceGuardJumpAnim" Offset="0x894" /> <!-- Original named: dnk_jump -->
<Animation Name="gDekuPalaceGuardStartAnim" Offset="0xB70" /> <!-- Original named: dnk_start -->
<Texture Name="gDekuPalaceGuardLeafTorsoTex" OutName="deku_palace_guard_leaf_torso" Format="rgba16" Width="32" Height="32" Offset="0xB80" />
<Texture Name="gDekuPalaceGuardFootTex" OutName="deku_palace_guard_foot" Format="rgba16" Width="16" Height="16" Offset="0x1380" />
<Texture Name="gDekuPalaceGuardHeadTex" OutName="deku_palace_guard_head" Format="rgba16" Width="8" Height="8" Offset="0x1580" />
<Texture Name="gDekuPalaceGuardMouthTex" OutName="deku_palace_guard_mouth" Format="rgba16" Width="8" Height="8" Offset="0x1600" />
<Texture Name="gDekuPalaceGuardEyeOpenTex" OutName="deku_palace_guard_eye_open" Format="rgba16" Width="8" Height="8" Offset="0x1680" />
<Texture Name="gDekuPalaceGuardEyeHalfTex" OutName="deku_palace_guard_eye_half" Format="rgba16" Width="8" Height="8" Offset="0x1700" />
<Texture Name="gDekuPalaceGuardEyeClosedTex" OutName="deku_palace_guard_eye_closed" Format="rgba16" Width="8" Height="8" Offset="0x1780" />
<DList Name="gDekuPalaceGuardRightLeafDL" Offset="0x1DD0" />
<DList Name="gDekuPalaceGuardRightLeaf2DL" Offset="0x1E58" />
<DList Name="gDekuPalaceGuardLeftLeafDL" Offset="0x1E68" />
<DList Name="gDekuPalaceGuardLeftLeaf2DL" Offset="0x1EF0" />
<DList Name="gDekuPalaceGuardRearLeafDL" Offset="0x1F00" />
<DList Name="gDekuPalaceGuardRearLeaf2DL" Offset="0x1F90" />
<DList Name="gDekuPalaceGuardCenterLeafDL" Offset="0x1FA0" />
<DList Name="gDekuPalaceGuardCenterLeaf2DL" Offset="0x2030" />
<DList Name="gDekuPalaceGuardTorsoDL" Offset="0x2040" />
<DList Name="gDekuPalaceGuardTorso2DL" Offset="0x20F0" />
<DList Name="gDekuPalaceGuardEyesDL" Offset="0x2100" />
<DList Name="gDekuPalaceGuardEyes2DL" Offset="0x2188" />
<DList Name="gDekuPalaceGuardRightFootDL" Offset="0x2198" />
<DList Name="gDekuPalaceGuardRightFoot2DL" Offset="0x2240" />
<DList Name="gDekuPalaceGuardLeftFootDL" Offset="0x2250" />
<DList Name="gDekuPalaceGuardLeftFoot2DL" Offset="0x22F8" />
<DList Name="gDekuPalaceGuardHeadDL" Offset="0x2308" />
<DList Name="gDekuPalaceGuardHead2DL" Offset="0x2400" />
<DList Name="gDekuPalaceGuardSnoutDL" Offset="0x2410" />
<DList Name="gDekuPalaceGuardSnout2DL" Offset="0x2510" />
<DList Name="gDekuPalaceGuardFlower" Offset="0x2700" />
<Limb Name="gDekuPalaceGuardTorsoLimb" Type="Standard" EnumName="OBJECT_DNK_LIMB_TORSO" Offset="0x27A8" />
<Limb Name="gDekuPalaceGuardHeadLimb" Type="Standard" EnumName="OBJECT_DNK_LIMB_HEAD" Offset="0x27B4" />
<Limb Name="gDekuPalaceGuardLeftLeafLimb" Type="Standard" EnumName="OBJECT_DNK_LIMB_LEFT_LEAF" Offset="0x27C0" />
<Limb Name="gDekuPalaceGuardRightLeafLimb" Type="Standard" EnumName="OBJECT_DNK_LIMB_RIGHT_LEAF" Offset="0x27CC" />
<Limb Name="gDekuPalaceGuardCenterLeafLimb" Type="Standard" EnumName="OBJECT_DNK_LIMB_CENTER_LEAF" Offset="0x27D8" />
<Limb Name="gDekuPalaceGuardRearLeafLimb" Type="Standard" EnumName="OBJECT_DNK_LIMB_REAR_LEAF" Offset="0x27E4" />
<Limb Name="gDekuPalaceGuardSnoutLimb" Type="Standard" EnumName="OBJECT_DNK_LIMB_SNOUT" Offset="0x27F0" />
<Limb Name="gDekuPalaceGuardEyesLimb" Type="Standard" EnumName="OBJECT_DNK_LIMB_EYES" Offset="0x27FC" />
<Limb Name="gDekuPalaceGuardLeftFootLimb" Type="Standard" EnumName="OBJECT_DNK_LIMB_LEFT_FOOT" Offset="0x2808" />
<Limb Name="gDekuPalaceGuardRightFootLimb" Type="Standard" EnumName="OBJECT_DNK_LIMB_RIGHT_FOOT" Offset="0x2814" />
<Skeleton Name="gDekuPalaceGuardSkel" Type="Normal" LimbType="Standard" LimbNone="OBJECT_DNK_LIMB_NONE" LimbMax="OBJECT_DNK_LIMB_MAX" EnumName="ObjectDnkLimbs" Offset="0x2848" />
<Animation Name="gDekuPalaceGuardWaitAnim" Offset="0x2A08" /> <!-- Original named: dnk_wait -->
<Animation Name="gDekuPalaceGuardWalkAnim" Offset="0x2B6C" /> <!-- Original named: dnk_walk -->
</File>
</Root>

3
spec
View File

@ -3056,8 +3056,7 @@ beginseg
name "ovl_En_Look_Nuts"
compress
include "build/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.o"
include "build/data/ovl_En_Look_Nuts/ovl_En_Look_Nuts.data.o"
include "build/data/ovl_En_Look_Nuts/ovl_En_Look_Nuts.reloc.o"
include "build/src/overlays/actors/ovl_En_Look_Nuts/ovl_En_Look_Nuts_reloc.o"
endseg
beginseg

View File

@ -94,16 +94,16 @@ static DamageTable sDamageTable = {
};
static AnimationInfoS sAnimations[] = {
{ &object_dnk_Anim_000B70, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_dnk_Anim_000B70, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &object_dnk_Anim_002A08, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &object_dnk_Anim_00031C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &object_dnk_Anim_000430, 1.0f, -1, -1, ANIMMODE_ONCE, 0 },
{ &object_dnk_Anim_000430, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &object_dnk_Anim_000894, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &object_dnk_Anim_002B6C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_dnk_Anim_002B6C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &object_dnk_Anim_0006CC, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gDekuPalaceGuardStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &gDekuPalaceGuardStartAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &gDekuPalaceGuardWaitAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gDekuPalaceGuardAttackAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gDekuPalaceGuardDigAnim, 1.0f, -1, -1, ANIMMODE_ONCE, 0 },
{ &gDekuPalaceGuardDigAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &gDekuPalaceGuardJumpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &gDekuPalaceGuardWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &gDekuPalaceGuardWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &gDekuPalaceGuardHappyAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &object_hintnuts_Anim_000168, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
{ &object_hintnuts_Anim_0024CC, 1.0f, -1, -1, ANIMMODE_ONCE, 0 },
{ &object_hintnuts_Anim_0024CC, 1.0f, 0, -1, ANIMMODE_ONCE, -4 },
@ -178,7 +178,7 @@ void func_80A51648(EnDnk* this, GlobalContext* globalCtx) {
switch (ENDNK_GET_3(&this->actor)) {
case ENDNK_GET_3_0:
SkelAnime_Init(globalCtx, &this->skelAnime, &object_dnk_Skel_002848, NULL, this->jointTable,
SkelAnime_Init(globalCtx, &this->skelAnime, &gDekuPalaceGuardSkel, NULL, this->jointTable,
this->morphTable, 11);
func_80A514F0(&this->skelAnime, 7);
break;
@ -326,9 +326,9 @@ void func_80A51AA4(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s*
void func_80A51CB8(EnDnk* this, GlobalContext* globalCtx) {
static TexturePtr D_80A5245C[] = {
object_dnk_Tex_001680,
object_dnk_Tex_001700,
object_dnk_Tex_001780,
gDekuPalaceGuardEyeOpenTex,
gDekuPalaceGuardEyeHalfTex,
gDekuPalaceGuardEyeClosedTex,
};
s32 pad;

View File

@ -15,7 +15,14 @@ void EnLookNuts_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnLookNuts_Update(Actor* thisx, GlobalContext* globalCtx);
void EnLookNuts_Draw(Actor* thisx, GlobalContext* globalCtx);
#if 0
void EnLookNuts_SetupPatrol(EnLookNuts* this);
void EnLookNuts_Patrol(EnLookNuts* this, GlobalContext* globalCtx);
void EnLookNuts_SetupStandAndWait(EnLookNuts* this);
void EnLookNuts_StandAndWait(EnLookNuts* this, GlobalContext* globalCtx);
void EnLookNuts_RunToPlayer(EnLookNuts* this, GlobalContext* globalCtx);
void EnLookNuts_SetupSendPlayerToSpawn(EnLookNuts* this);
void EnLookNuts_SendPlayerToSpawn(EnLookNuts* this, GlobalContext* globalCtx);
const ActorInit En_Look_Nuts_InitVars = {
ACTOR_EN_LOOK_NUTS,
ACTORCAT_NPC,
@ -28,15 +35,29 @@ const ActorInit En_Look_Nuts_InitVars = {
(ActorFunc)EnLookNuts_Draw,
};
// static ColliderCylinderInit sCylinderInit = {
static ColliderCylinderInit D_80A68600 = {
{ COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_NONE, OC2_NONE, COLSHAPE_CYLINDER, },
{ ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_NONE,
AT_NONE,
AC_ON | AC_TYPE_PLAYER,
OC1_NONE,
OC2_NONE,
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK0,
{ 0xF7CFFFFF, 0x00, 0x00 },
{ 0xF7CFFFFF, 0x00, 0x00 },
TOUCH_NONE | TOUCH_SFX_NORMAL,
BUMP_ON,
OCELEM_NONE,
},
{ 20, 50, 0, { 0, 0, 0 } },
};
// static DamageTable sDamageTable = {
static DamageTable D_80A68630 = {
s32 D_80A6862C = 0;
static DamageTable sDamageTable = {
/* Deku Nut */ DMG_ENTRY(1, 0xF),
/* Deku Stick */ DMG_ENTRY(1, 0xF),
/* Horse trample */ DMG_ENTRY(1, 0xF),
@ -71,34 +92,302 @@ static DamageTable D_80A68630 = {
/* Powder Keg */ DMG_ENTRY(1, 0xF),
};
#endif
typedef enum {
/* 0x01 */ PALACE_GUARD_PATROLLING,
/* 0x01 */ PALACE_GUARD_WAITING,
/* 0x02 */ PALACE_GUARD_RUNNING_TO_PLAYER,
/* 0x03 */ PALACE_GUARD_CAUGHT_PLAYER
} PalaceGuardState;
extern ColliderCylinderInit D_80A68600;
extern DamageTable D_80A68630;
void EnLookNuts_Init(Actor* thisx, GlobalContext* globalCtx) {
EnLookNuts* this = THIS;
extern UNK_TYPE D_06000430;
extern UNK_TYPE D_06002B6C;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
SkelAnime_Init(globalCtx, &this->skelAnime, &gDekuPalaceGuardSkel, &gDekuPalaceGuardDigAnim, this->jointTable,
this->morphTable, OBJECT_DNK_LIMB_MAX);
Actor_SetScale(&this->actor, 0.01f);
this->actor.colChkInfo.damageTable = &sDamageTable;
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->actor.targetMode = 1;
Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
this->actor.flags |= ACTOR_FLAG_8000000;
this->pathLocation = LOOKNUTS_GET_PATROL_LOCATION(&this->actor);
this->switchFlag = LOOKNUTS_GET_SCENE_FLAG(&this->actor);
this->spawnIndex = LOOKNUTS_GET_SPAWN_INDEX(&this->actor);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/EnLookNuts_Init.s")
if (this->switchFlag == 0x7F) {
this->switchFlag = -1;
}
if ((this->switchFlag >= 0) && (Flags_GetSwitch(globalCtx, this->switchFlag))) {
Actor_MarkForDeath(&this->actor);
return;
}
if (this->pathLocation == 0x1F) {
Actor_MarkForDeath(&this->actor);
return;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/EnLookNuts_Destroy.s")
this->state = PALACE_GUARD_PATROLLING;
EnLookNuts_SetupPatrol(this);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/func_80A67A34.s")
void EnLookNuts_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnLookNuts* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/func_80A67AA8.s")
Collider_DestroyCylinder(globalCtx, &this->collider);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/func_80A67C48.s")
void EnLookNuts_SetupPatrol(EnLookNuts* this) {
Animation_Change(&this->skelAnime, &gDekuPalaceGuardWalkAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gDekuPalaceGuardWalkAnim), 0, -10.0f);
this->state = PALACE_GUARD_PATROLLING;
this->actionFunc = EnLookNuts_Patrol;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/func_80A67D0C.s")
void EnLookNuts_Patrol(EnLookNuts* this, GlobalContext* globalCtx) {
f32 sp34 = 0.0f;
f32 sp30;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/func_80A67F30.s")
SkelAnime_Update(&this->skelAnime);
if (func_801690CC(globalCtx) != 0) {
this->actor.speedXZ = 0.0f;
return;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/func_80A67FC4.s")
this->actor.speedXZ = 2.0f;
if (Animation_OnFrame(&this->skelAnime, 1.0f) || Animation_OnFrame(&this->skelAnime, 5.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_WALK);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/func_80A68080.s")
if (D_80A6862C != 0) {
Math_ApproachZeroF(&this->actor.speedXZ, 0.3f, 1.0f);
return;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/func_80A680FC.s")
this->path = func_8013D648(globalCtx, this->pathLocation, 0x1F);
if (this->path != NULL) {
sp34 = func_8013D83C(this->path, this->currentPathIndex, &this->actor.world.pos, &sp30);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/EnLookNuts_Update.s")
if (sp30 < 10.0f) {
if (this->path != NULL) {
this->currentPathIndex++;
if (this->currentPathIndex >= this->path->count) {
this->currentPathIndex = 0;
}
if (Rand_ZeroOne() < 0.6f) {
EnLookNuts_SetupStandAndWait(this);
return;
}
}
}
Math_SmoothStepToS(&this->actor.shape.rot.y, sp34, 1, 0x1388, 0);
this->actor.world.rot.y = this->actor.shape.rot.y;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Look_Nuts/EnLookNuts_Draw.s")
void EnLookNuts_SetupStandAndWait(EnLookNuts* this) {
Animation_Change(&this->skelAnime, &gDekuPalaceGuardWalkAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gDekuPalaceGuardWalkAnim), 2, -10.0f);
this->waitTimer = Rand_S16Offset(1, 3);
this->headRotTarget.y = 10000.0f;
if (Rand_ZeroOne() < 0.5f) {
this->headRotTarget.y = -10000.0f;
}
this->eventTimer = 10;
this->state = PALACE_GUARD_WAITING;
this->actionFunc = EnLookNuts_StandAndWait;
}
// Patrol Guards will stand in place and wait for a maximum of ~12 frames.
void EnLookNuts_StandAndWait(EnLookNuts* this, GlobalContext* globalCtx) {
s16 randOffset;
SkelAnime_Update(&this->skelAnime);
Math_ApproachZeroF(&this->actor.speedXZ, 0.3f, 1.0f);
if ((func_801690CC(globalCtx) == 0) && (D_80A6862C == 0) && (this->eventTimer == 0)) {
this->eventTimer = 10;
switch (this->waitTimer) {
case 0:
case 1:
case 2:
case 3:
case 4:
this->waitTimer++;
this->headRotTarget.y *= -1.0f;
break;
case 5:
this->headRotTarget.y = 0.0f;
randOffset = Rand_S16Offset(1, 2);
this->eventTimer = 0;
this->waitTimer += randOffset;
break;
case 6:
if (fabsf(this->headRotTarget.y - this->headRotation.y) < 10.0f) {
this->waitTimer = 10;
this->headRotTarget.x = 4000.0f;
this->eventTimer = 5;
}
break;
case 7:
if (fabsf(this->headRotTarget.y - this->headRotation.y) < 10.0f) {
this->headRotTarget.z = 4000.0f;
this->waitTimer++;
}
break;
case 8:
this->waitTimer = 10;
this->eventTimer = 20;
this->headRotTarget.z = -8000.0f;
break;
case 10:
Math_Vec3f_Copy(&this->headRotTarget, &gZeroVec3f);
this->waitTimer = 11;
break;
case 11:
if ((fabsf(this->headRotation.x) < 30.0f) && (fabsf(this->headRotation.y) < 30.0f) &&
(fabsf(this->headRotation.z) < 30.0f)) {
this->waitTimer = 12;
}
break;
}
if (this->waitTimer == 12) {
this->waitTimer = 0;
EnLookNuts_SetupPatrol(this);
}
}
}
void EnLookNuts_DetectedPlayer(EnLookNuts* this, GlobalContext* globalCtx) {
Animation_Change(&this->skelAnime, &gDekuPalaceGuardWalkAnim, 2.0f, 0.0f,
Animation_GetLastFrame(&gDekuPalaceGuardWalkAnim), 0, -10.0f);
this->state = PALACE_GUARD_RUNNING_TO_PLAYER;
this->eventTimer = 300;
Message_StartTextbox(globalCtx, 0x833, &this->actor);
this->actionFunc = EnLookNuts_RunToPlayer;
}
void EnLookNuts_RunToPlayer(EnLookNuts* this, GlobalContext* globalCtx) {
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 1.0f) || Animation_OnFrame(&this->skelAnime, 5.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_NUTS_WALK);
}
this->actor.speedXZ = 4.0f;
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 0xBB8, 0);
if ((this->actor.xzDistToPlayer < 70.0f) || (this->eventTimer == 0)) {
this->actor.speedXZ = 0.0f;
EnLookNuts_SetupSendPlayerToSpawn(this);
}
}
void EnLookNuts_SetupSendPlayerToSpawn(EnLookNuts* this) {
Animation_Change(&this->skelAnime, &gDekuPalaceGuardWalkAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gDekuPalaceGuardWalkAnim), 2, -10.0f);
this->state = PALACE_GUARD_CAUGHT_PLAYER;
this->actionFunc = EnLookNuts_SendPlayerToSpawn;
}
void EnLookNuts_SendPlayerToSpawn(EnLookNuts* this, GlobalContext* globalCtx) {
SkelAnime_Update(&this->skelAnime);
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 0xBB8, 0);
if ((Message_GetState(&globalCtx->msgCtx) == 5) && func_80147624(globalCtx)) {
func_801477B4(globalCtx);
globalCtx->nextEntranceIndex = Entrance_CreateIndexFromSpawn(this->spawnIndex);
gSaveContext.nextCutsceneIndex = 0;
Scene_SetExitFade(globalCtx);
globalCtx->sceneLoadFlag = 0x14;
gSaveContext.weekEventReg[17] |= 4;
}
}
static Vec3f effectVecInitialize = { 0.0f, 0.0f, 0.0f };
void EnLookNuts_Update(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnLookNuts* this = THIS;
Vec3f effectVelOffset;
Vec3f effectPos;
Vec3f effectVel;
if (this->blinkTimer == 0) {
this->eyeState++;
if (this->eyeState >= 3) {
this->eyeState = 0;
this->blinkTimer = (s16)Rand_ZeroFloat(60.0f) + 20;
}
}
this->actionFunc(this, globalCtx);
if (this->blinkTimer != 0) {
this->blinkTimer--;
}
if (this->eventTimer != 0) {
this->eventTimer--;
}
Actor_MoveWithGravity(&this->actor);
if (D_80A6862C == 0) {
if ((this->state < 2) && (this->actor.xzDistToPlayer < 320.0f) && (this->actor.playerHeightRel < 80.0f)) {
effectVelOffset = effectVecInitialize;
Math_Vec3f_Copy(&effectPos, &this->actor.world.pos);
effectPos.x += Math_SinS((this->actor.world.rot.y + (s16)this->headRotation.y)) * 10.0f;
effectPos.y += 30.0f;
effectPos.z += Math_CosS((this->actor.world.rot.y + (s16)this->headRotation.y)) * 10.0f;
Matrix_StatePush();
Matrix_RotateY(this->actor.shape.rot.y, MTXMODE_NEW);
effectVelOffset.z = 20.0f;
Matrix_MultiplyVector3fByState(&effectVelOffset, &effectVel);
Matrix_StatePop();
if (!this->isPlayerDetected) {
s16 drawFlag = 1;
if (gSaveContext.isNight) {
drawFlag = 0;
}
if (Player_GetMask(globalCtx) != PLAYER_MASK_STONE) {
EffectSsSolderSrchBall_Spawn(globalCtx, &effectPos, &effectVel, &gZeroVec3f, 50,
&this->isPlayerDetected, drawFlag);
}
}
if ((this->isPlayerDetected == true) || (this->actor.xzDistToPlayer < 20.0f)) {
Player* player = GET_PLAYER(globalCtx);
if (!(player->stateFlags3 & 0x100) && !func_801690CC(globalCtx)) {
Math_Vec3f_Copy(&this->headRotTarget, &gZeroVec3f);
this->state = PALACE_GUARD_RUNNING_TO_PLAYER;
play_sound(NA_SE_SY_FOUND);
func_800B7298(globalCtx, &this->actor, 0x1A);
D_80A6862C = 1;
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_10);
this->actor.gravity = 0.0f;
EnLookNuts_DetectedPlayer(this, globalCtx);
} else {
this->isPlayerDetected = false;
}
}
}
Math_ApproachF(&this->headRotation.x, this->headRotTarget.x, 1.0f, 3000.0f);
Math_ApproachF(&this->headRotation.y, this->headRotTarget.y, 1.0f, 6000.0f);
Math_ApproachF(&this->headRotation.z, this->headRotTarget.z, 1.0f, 2000.0f);
this->actor.shape.rot.y = this->actor.world.rot.y;
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
}
static TexturePtr sEyeTextures[] = {
gDekuPalaceGuardEyeOpenTex,
gDekuPalaceGuardEyeHalfTex,
gDekuPalaceGuardEyeClosedTex,
};
void EnLookNuts_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnLookNuts* this = THIS;
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeState]));
SkelAnime_DrawOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL, &this->actor);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}

View File

@ -2,16 +2,37 @@
#define Z_EN_LOOK_NUTS_H
#include "global.h"
#include "objects/object_dnk/object_dnk.h"
struct EnLookNuts;
typedef void (*EnLookNutsActionFunc)(struct EnLookNuts*, GlobalContext*);
#define LOOKNUTS_GET_SPAWN_INDEX(thisx) (((thisx)->params >> 0xC) & 0xF)
#define LOOKNUTS_GET_SCENE_FLAG(thisx) ((thisx)->params & 0x7F)
#define LOOKNUTS_GET_PATROL_LOCATION(thisx) (((thisx)->params >> 0x7) & 0x1F)
typedef struct EnLookNuts {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0xC8];
/* 0x0144 */ SkelAnime skelAnime;
/* 0x0188 */ Vec3s jointTable[OBJECT_DNK_LIMB_MAX];
/* 0x01CA */ Vec3s morphTable[OBJECT_DNK_LIMB_MAX];
/* 0x020C */ EnLookNutsActionFunc actionFunc;
/* 0x0210 */ char unk_210[0x80];
/* 0x0210 */ Path *path;
/* 0x0214 */ s16 currentPathIndex; // Index for the point where the deku guard is in its path
/* 0x0216 */ s16 eyeState;
/* 0x0218 */ s16 blinkTimer;
/* 0x021A */ s16 eventTimer; // Timer to trigger when another event within the actor will happen
/* 0x021C */ s16 state;
/* 0x021E */ s16 switchFlag;
/* 0x0220 */ s16 pathLocation; // Determines path that a guard will patrol
/* 0x0222 */ s16 isPlayerDetected;
/* 0x0224 */ s16 waitTimer; // Timer for how long the deku guard will take a break for
/* 0x0226 */ s16 spawnIndex;
/* 0x0228 */ UNK_TYPE4 pad228; // Unused necessary padding
/* 0x022C */ Vec3f headRotation;
/* 0x0238 */ Vec3f headRotTarget; // Target value for head rotation
/* 0x0244 */ ColliderCylinder collider;
} EnLookNuts; // size = 0x290
extern const ActorInit En_Look_Nuts_InitVars;

View File

@ -10845,14 +10845,14 @@
0x80A675C4:("ObjDriftice_Draw",),
0x80A678B0:("EnLookNuts_Init",),
0x80A67A08:("EnLookNuts_Destroy",),
0x80A67A34:("func_80A67A34",),
0x80A67A34:("EnLookNuts_SetupPatrol",),
0x80A67AA8:("func_80A67AA8",),
0x80A67C48:("func_80A67C48",),
0x80A67D0C:("func_80A67D0C",),
0x80A67C48:("EnLookNuts_SetupStandAndWait",),
0x80A67D0C:("EnLookNuts_StandAndWait",),
0x80A67F30:("func_80A67F30",),
0x80A67FC4:("func_80A67FC4",),
0x80A68080:("func_80A68080",),
0x80A680FC:("func_80A680FC",),
0x80A68080:("EnLookNuts_SetupSendPlayerToSpawn",),
0x80A680FC:("EnLookNuts_SendPlayerToSpawn",),
0x80A681C4:("EnLookNuts_Update",),
0x80A68540:("EnLookNuts_Draw",),
0x80A687A0:("func_80A687A0",),

View File

@ -1550,12 +1550,6 @@ D_060002E0 = 0x060002E0;
D_060029E8 = 0x060029E8;
D_0600AC70 = 0x0600AC70;
// ovl_En_Look_Nuts
D_06000430 = 0x06000430;
D_06002848 = 0x06002848;
D_06002B6C = 0x06002B6C;
// ovl_En_Mag
D_06000000 = 0x06000000;