Ovl_En_Cne_01 Ok and Documented (#641)

* Decomp and document Cne01

* Document object_cne

* split enhy header from z64

* Cleanup

* Actually include new z_en_hy header

* Actor flags

* Add header to object_cne

* screen defines

* Useage of ENHY_LIMB_MAX
This commit is contained in:
Derek Hensley 2022-02-13 16:30:30 -08:00 committed by GitHub
parent 7ba82882b2
commit 0625803c17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 506 additions and 253 deletions

View File

@ -1,47 +1,54 @@
<Root>
<!-- Object for Unusued Hyrule Market NPC -->
<File Name="object_cne" Segment="6">
<!-- This file has unaligned textures -->
<!-- <Limb Name="object_cne_Standardlimb_000000" Type="Standard" Offset="0x0" /> -->
<!-- <Limb Name="object_cne_Standardlimb_00000C" Type="Standard" Offset="0xC" /> -->
<!-- <Limb Name="object_cne_Standardlimb_000018" Type="Standard" Offset="0x18" /> -->
<!-- <Limb Name="object_cne_Standardlimb_000024" Type="Standard" Offset="0x24" /> -->
<!-- <Limb Name="object_cne_Standardlimb_000030" Type="Standard" Offset="0x30" /> -->
<!-- <Limb Name="object_cne_Standardlimb_00003C" Type="Standard" Offset="0x3C" /> -->
<!-- <Limb Name="object_cne_Standardlimb_000048" Type="Standard" Offset="0x48" /> -->
<!-- <Limb Name="object_cne_Standardlimb_000054" Type="Standard" Offset="0x54" /> -->
<!-- <Limb Name="object_cne_Standardlimb_000060" Type="Standard" Offset="0x60" /> -->
<!-- <Limb Name="object_cne_Standardlimb_00006C" Type="Standard" Offset="0x6C" /> -->
<!-- <Limb Name="object_cne_Standardlimb_000078" Type="Standard" Offset="0x78" /> -->
<!-- <Limb Name="object_cne_Standardlimb_000084" Type="Standard" Offset="0x84" /> -->
<!-- <Limb Name="object_cne_Standardlimb_000090" Type="Standard" Offset="0x90" /> -->
<!-- <Limb Name="object_cne_Standardlimb_00009C" Type="Standard" Offset="0x9C" /> -->
<!-- <Limb Name="object_cne_Standardlimb_0000A8" Type="Standard" Offset="0xA8" /> -->
<!-- <Skeleton Name="object_cne_Skel_0000F0" Type="Flex" LimbType="Standard" Offset="0xF0" /> -->
<!-- <Texture Name="object_cne_TLUT_0000FC" OutName="tlut_0000FC" Format="rgba16" Width="16" Height="16" Offset="0xFC" /> -->
<!-- <Texture Name="object_cne_Tex_0002FC" OutName="tex_0002FC" Format="ci8" Width="8" Height="8" Offset="0x2FC" /> -->
<!-- <Texture Name="object_cne_Tex_00033C" OutName="tex_00033C" Format="ci8" Width="8" Height="8" Offset="0x33C" /> -->
<!-- <Texture Name="object_cne_Tex_00037C" OutName="tex_00037C" Format="ci8" Width="8" Height="8" Offset="0x37C" /> -->
<!-- <Texture Name="object_cne_Tex_0003BC" OutName="tex_0003BC" Format="ci8" Width="8" Height="8" Offset="0x3BC" /> -->
<!-- <Texture Name="object_cne_Tex_0003FC" OutName="tex_0003FC" Format="ci8" Width="8" Height="16" Offset="0x3FC" /> -->
<!-- <Texture Name="object_cne_Tex_00047C" OutName="tex_00047C" Format="i8" Width="8" Height="8" Offset="0x47C" /> -->
<!-- <Texture Name="object_cne_Tex_0004BC" OutName="tex_0004BC" Format="ci8" Width="8" Height="8" Offset="0x4BC" /> -->
<!-- <DList Name="object_cne_DL_001300" Offset="0x1300" /> -->
<!-- <DList Name="object_cne_DL_001608" Offset="0x1608" /> -->
<!-- <DList Name="object_cne_DL_0016E8" Offset="0x16E8" /> -->
<!-- <DList Name="object_cne_DL_001808" Offset="0x1808" /> -->
<!-- <DList Name="object_cne_DL_0018C8" Offset="0x18C8" /> -->
<!-- <DList Name="object_cne_DL_0019A8" Offset="0x19A8" /> -->
<!-- <DList Name="object_cne_DL_001AC8" Offset="0x1AC8" /> -->
<!-- <DList Name="object_cne_DL_001B88" Offset="0x1B88" /> -->
<!-- <DList Name="object_cne_DL_001E50" Offset="0x1E50" /> -->
<!-- <DList Name="object_cne_DL_001F18" Offset="0x1F18" /> -->
<!-- <DList Name="object_cne_DL_001FE0" Offset="0x1FE0" /> -->
<!-- <DList Name="object_cne_DL_0020A8" Offset="0x20A8" /> -->
<!-- <DList Name="object_cne_DL_002170" Offset="0x2170" /> -->
<!-- <DList Name="object_cne_DL_002238" Offset="0x2238" /> -->
<!-- <DList Name="object_cne_DL_002300" Offset="0x2300" /> -->
<Texture Name="object_cne_Tex_0023D0" OutName="tex_0023D0" Format="rgba16" Width="8" Height="16" Offset="0x23D0" />
<Texture Name="object_cne_Tex_0024D0" OutName="tex_0024D0" Format="rgba16" Width="8" Height="8" Offset="0x24D0" />
<DList Name="object_cne_DL_002860" Offset="0x2860" />
<!-- The textures used by these limbs aren't 64-bit aligned -->
<Limb Name="gCnePelvisLimb" LimbType="Standard" EnumName="CNE_LIMB_PELVIS" Offset="0x0"/>
<Limb Name="gCneLeftThighLimb" LimbType="Standard" EnumName="CNE_LIMB_LEFT_THIGH" Offset="0xC"/>
<Limb Name="gCneLeftShinLimb" LimbType="Standard" EnumName="CNE_LIMB_LEFT_SHIN" Offset="0x18"/>
<Limb Name="gCneLeftFootLimb" LimbType="Standard" EnumName="CNE_LIMB_LEFT_FOOT" Offset="0x24"/>
<Limb Name="gCneRightThighLimb" LimbType="Standard" EnumName="CNE_LIMB_RIGHT_THIGH" Offset="0x30"/>
<Limb Name="gCneRightShinLimb" LimbType="Standard" EnumName="CNE_LIMB_RIGHT_SHIN" Offset="0x3C"/>
<Limb Name="gCneRightFootLimb" LimbType="Standard" EnumName="CNE_LIMB_RIGHT_FOOT" Offset="0x48"/>
<Limb Name="gCneTorsoLimb" LimbType="Standard" EnumName="CNE_LIMB_TORSO" Offset="0x54"/>
<Limb Name="gCneLeftUpperArmLimb" LimbType="Standard" EnumName="CNE_LIMB_LEFT_UPPER_ARM" Offset="0x60"/>
<Limb Name="gCneLeftForearmLimb" LimbType="Standard" EnumName="CNE_LIMB_LEFT_FOREARM" Offset="0x6C"/>
<Limb Name="gCneLeftHandLimb" LimbType="Standard" EnumName="CNE_LIMB_LEFT_HAND" Offset="0x78"/>
<Limb Name="gCneRightUpperArmLimb" LimbType="Standard" EnumName="CNE_LIMB_RIGHT_UPPER_ARM" Offset="0x84"/>
<Limb Name="gCneRightForearmLimb" LimbType="Standard" EnumName="CNE_LIMB_RIGHT_FOREARM" Offset="0x90"/>
<Limb Name="gCneRightHandLimb" LimbType="Standard" EnumName="CNE_LIMB_RIGHT_HAND" Offset="0x9C"/>
<Limb Name="gCneHeadLimb" LimbType="Standard" EnumName="CNE_LIMB_HEAD" Offset="0xA8"/>
<Skeleton Name="gCneSkel" Type="Flex" LimbType="Standard" LimbNone="CNE_LIMB_NONE" LimbMax="CNE_LIMB_MAX" EnumName="CneLimbs" Offset="0xF0"/>
<!-- 32-bit aligned textures. -->
<Texture Name="gCneTLUT" OutName="cne_tlut" Format="rgba16" Width="16" Height="16" Offset="0xFC"/>
<Texture Name="gCneSkinTex" OutName="cne_skin" Format="ci8" Width="8" Height="8" Offset="0x2FC"/>
<Texture Name="gCneBrownHairTex" OutName="cne_brown_hair" Format="ci8" Width="8" Height="8" Offset="0x33C"/>
<Texture Name="gCneHandTex" OutName="cne_hand_tex" Format="ci8" Width="8" Height="8" Offset="0x37C"/>
<Texture Name="gCneBrownHairSkinTex" OutName="cne_brown_hair_skin" Format="ci8" Width="8" Height="8" Offset="0x3BC"/>
<Texture Name="gCneBrownHairFaceTex" OutName="cne_brown_hair_face" Format="ci8" Width="8" Height="16" Offset="0x3FC"/>
<Texture Name="gCneDressTex" OutName="cne_dress" Format="i8" Width="8" Height="8" Offset="0x47C"/>
<Texture Name="gCneDressNeckTex" OutName="cne_dress_neck" Format="ci8" Width="8" Height="8" Offset="0x4BC"/>
<DList Name="gCneHeadBrownHairDL" Offset="0x1300"/>
<DList Name="gCneRightHandDL" Offset="0x1608"/>
<DList Name="gCneRightForearmDL" Offset="0x16E8"/>
<DList Name="gCneRightUpperArmDL" Offset="0x1808"/>
<DList Name="gCneLeftHandDL" Offset="0x18C8"/>
<DList Name="gCneLeftForearmDL" Offset="0x19A8"/>
<DList Name="gCneLeftUpperArmDL" Offset="0x1AC8"/>
<DList Name="gCneTorsoDL" Offset="0x1B88"/>
<DList Name="gCneRightFootDL" Offset="0x1E50"/>
<DList Name="gCneRightShinDL" Offset="0x1F18"/>
<DList Name="gCneRightThighDL" Offset="0x1FE0"/>
<DList Name="gCneLeftFootDL" Offset="0x20A8"/>
<DList Name="gCneLeftShinDL" Offset="0x2170"/>
<DList Name="gCneLeftThighDL" Offset="0x2238"/>
<DList Name="gCnePelvisDL" Offset="0x2300"/>
<Texture Name="gCneOrangeHairFaceTex" OutName="cne_orange_hair_face" Format="rgba16" Width="8" Height="16" Offset="0x23D0"/>
<Texture Name="gCneOrangeHairSkinTex" OutName="cne_orange_hair_skin" Format="rgba16" Width="8" Height="8" Offset="0x24D0"/>
<DList Name="gCneHeadOrangeHairDL" Offset="0x2860"/>
</File>
</Root>

View File

@ -1478,21 +1478,7 @@ void SoundSource_UpdateAll(GlobalContext* globalCtx);
void SoundSource_PlaySfxAtFixedWorldPos(GlobalContext* globalCtx, Vec3f* worldPos, u32 duration, u16 sfxId);
void SoundSource_PlaySfxEachFrameAtFixedWorldPos(GlobalContext* globalCtx, Vec3f* worldPos, u32 duration, u16 sfxId);
u16 ElfMessage_GetFirstCycleHint(GlobalContext* globalCtx);
s32 EnHy_ChangeAnim(SkelAnime* skelAnime, s16 animIndex);
Actor* EnHy_FindNearestDoor(Actor* actor, GlobalContext* globalCtx);
void EnHy_ChangeObjectAndAnim(EnHy* enHy, GlobalContext* globalCtx, s16 animIndex);
s32 EnHy_UpdateSkelAnime(EnHy* enHy, GlobalContext* globalCtx);
void EnHy_Blink(EnHy* enHy, s32 arg1);
s32 EnHy_Init(EnHy* enHy, GlobalContext* globalCtx, FlexSkeletonHeader* skeletonHeaderSeg, s16 animIndex);
void func_800F0BB4(EnHy* enHy, GlobalContext* globalCtx, Actor* arg2, s16 arg3, s16 arg4);
s32 func_800F0CE4(EnHy* enHy, GlobalContext* globalCtx, ActorFunc draw, s16 arg3, s16 arg4, f32 arg5);
s32 func_800F0DD4(EnHy* enHy, GlobalContext* globalCtx, s16 arg2, s16 arg3);
s32 EnHy_SetPointFowards(EnHy* enHy, GlobalContext* globalCtx, f32 gravity, s16 animIndex);
s32 EnHy_SetPointBackwards(EnHy* enHy, GlobalContext* globalCtx, s16 animIndex);
s32 EnHy_MoveForwards(EnHy* enHy, f32 arg1);
s32 EnHy_MoveBackwards(EnHy* enHy, f32 arg1);
void EnHy_UpdateCollider(EnHy* enHy, GlobalContext* globalCtx);
s32 EnHy_PlayWalkingSound(EnHy* enHy, GlobalContext* globalCtx, f32 arg2);
u16 Text_GetFaceReaction(GlobalContext* globalCtx, u32 reactionSet);
void EnvFlags_UnsetAll(GlobalContext* globalCtx);
void EnvFlags_Set(GlobalContext* globalCtx, s16 flag);

View File

@ -881,9 +881,6 @@ extern s801BB170 D_801BB170[118];
// extern UNK_TYPE1 D_801BC210;
extern Gfx D_801BC240[9];
extern Gfx D_801BC288[3];
// extern UNK_TYPE1 D_801BC3F0;
// extern UNK_TYPE1 D_801BC400;
// extern UNK_TYPE1 D_801BC410;
// extern UNK_TYPE1 D_801BC41E;
extern ActorCutscene actorCutscenesGlobalCutscenes[8];
extern s16 actorCutsceneCurrent;

View File

@ -1373,30 +1373,6 @@ typedef struct {
/* 0x24 */ s16 unk_24;
} struct_800BD888_arg1; // size = 0x28
typedef struct EnHy {
/* 0x000 */ Actor actor;
/* 0x144 */ UNK_TYPE1 unk_144[0x8];
/* 0x14C */ SkelAnime skelAnime;
/* 0x190 */ s8 unk190;
/* 0x191 */ s8 unk191;
/* 0x192 */ s8 unk192;
/* 0x193 */ s8 animObjIndex;
/* 0x194 */ ColliderCylinder collider;
/* 0x1E0 */ UNK_TYPE1 unk_1E0[0x4];
/* 0x1E4 */ Path* path;
/* 0x1E8 */ s16 curPoint;
/* 0x1EA */ UNK_TYPE1 unk_1EA[0x2];
/* 0x1EC */ Vec3f leftFootPos;
/* 0x1F8 */ Vec3f rightFootPos;
/* 0x204 */ u8 isLeftFootOnGround;
/* 0x205 */ u8 isRightFootOnGround;
/* 0x206 */ Vec3s jointTable[16];
/* 0x266 */ Vec3s morphTable[16];
/* 0x2C6 */ UNK_TYPE1 unk_2C6[0x120];
/* 0x3E6 */ s16 eyeTexIndex;
/* 0x3E8 */ s16 blinkTimer;
} EnHy;
typedef struct {
/* 0x0 */ u8 unk0;
/* 0x4 */ s32 unk4;

92
include/z_en_hy.h Normal file
View File

@ -0,0 +1,92 @@
#ifndef Z_EN_HY_H
#define Z_EN_HY_H
#include "global.h"
struct EnHy;
#define ENHY_LIMB_MAX 16
typedef enum {
/* 0 */ ENHY_ANIMATION_AOB_0,
/* 1 */ ENHY_ANIMATION_BOJ_1,
/* 2 */ ENHY_ANIMATION_BOJ_2,
/* 3 */ ENHY_ANIMATION_BOJ_3,
/* 4 */ ENHY_ANIMATION_BOJ_4,
/* 5 */ ENHY_ANIMATION_BOJ_5,
/* 6 */ ENHY_ANIMATION_BBA_6,
/* 7 */ ENHY_ANIMATION_BJI_7,
/* 8 */ ENHY_ANIMATION_BJI_8,
/* 9 */ ENHY_ANIMATION_BJI_9,
/* 10 */ ENHY_ANIMATION_BOJ_10,
/* 11 */ ENHY_ANIMATION_OS_ANIME_11,
/* 12 */ ENHY_ANIMATION_BOJ_12,
/* 13 */ ENHY_ANIMATION_BOJ_13,
/* 14 */ ENHY_ANIMATION_BOJ_14,
/* 15 */ ENHY_ANIMATION_BOJ_15,
/* 16 */ ENHY_ANIMATION_BOJ_16,
/* 17 */ ENHY_ANIMATION_BOJ_17,
/* 18 */ ENHY_ANIMATION_BOJ_18,
/* 19 */ ENHY_ANIMATION_BOJ_19,
/* 20 */ ENHY_ANIMATION_BOJ_20,
/* 21 */ ENHY_ANIMATION_MAX
} EnHyAnimation;
typedef void (*EnHyActionFunc)(struct EnHy*, GlobalContext*);
typedef struct EnHy {
/* 0x000 */ Actor actor;
/* 0x144 */ EnHyActionFunc actionFunc;
/* 0x148 */ EnHyActionFunc tmpActionFunc;
/* 0x14C */ SkelAnime skelAnime;
/* 0x190 */ s8 headObjIndex; // Limb 15
/* 0x191 */ s8 skelUpperObjIndex; // Limbs 8-14
/* 0x192 */ s8 skelLowerObjIndex; // Limbs 1-7
/* 0x193 */ s8 animObjIndex;
/* 0x194 */ ColliderCylinder collider;
/* 0x1E0 */ u16 textId;
/* 0x1E2 */ u8 waitingOnInit;
/* 0x1E3 */ u8 inMsgState3;
/* 0x1E4 */ Path* path;
/* 0x1E8 */ s16 curPoint;
/* 0x1EC */ Vec3f leftFootPos;
/* 0x1F8 */ Vec3f rightFootPos;
/* 0x204 */ u8 isLeftFootOnGround;
/* 0x205 */ u8 isRightFootOnGround;
/* 0x206 */ Vec3s jointTable[ENHY_LIMB_MAX];
/* 0x266 */ Vec3s morphTable[ENHY_LIMB_MAX];
/* 0x2C6 */ Vec3s focusTarget;
/* 0x2CC */ Vec3s headRot;
/* 0x2D2 */ Vec3s torsoRot;
/* 0x2D8 */ Vec3s tmpFocusTarget;
/* 0x2DE */ Vec3s tmpHeadRot;
/* 0x2E4 */ Vec3s tmpTorsoRot;
/* 0x2EA */ s16 limbRotTableY[16];
/* 0x30A */ s16 limbRotTableZ[16];
/* 0x32C */ Vec3f bodyPartsPos[15];
/* 0x3E0 */ UNK_TYPE1 unk_3E0[0x6];
/* 0x3E6 */ s16 eyeTexIndex;
/* 0x3E8 */ s16 blinkTimer;
} EnHy; // size = 0x3EC
extern s8 gEnHyBodyParts[];
extern s8 gEnHyBodyPartsIndex[];
extern u8 gEnHyShadowSize[];
s32 EnHy_ChangeAnim(SkelAnime* skelAnime, s16 animIndex);
struct EnDoor* EnHy_FindNearestDoor(Actor* actor, GlobalContext* globalCtx);
void EnHy_ChangeObjectAndAnim(EnHy* enHy, GlobalContext* globalCtx, s16 animIndex);
s32 EnHy_UpdateSkelAnime(EnHy* enHy, GlobalContext* globalCtx);
void EnHy_Blink(EnHy* enHy, s32 arg1);
s32 EnHy_Init(EnHy* enHy, GlobalContext* globalCtx, FlexSkeletonHeader* skeletonHeaderSeg, s16 animIndex);
void func_800F0BB4(EnHy* enHy, GlobalContext* globalCtx, struct EnDoor* door, s16 arg3, s16 arg4);
s32 func_800F0CE4(EnHy* enHy, GlobalContext* globalCtx, ActorFunc draw, s16 arg3, s16 arg4, f32 arg5);
s32 func_800F0DD4(EnHy* enHy, GlobalContext* globalCtx, s16 arg2, s16 arg3);
s32 EnHy_SetPointFowards(EnHy* enHy, GlobalContext* globalCtx, f32 gravity, s16 animIndex);
s32 EnHy_SetPointBackwards(EnHy* enHy, GlobalContext* globalCtx, s16 animIndex);
s32 EnHy_MoveForwards(EnHy* enHy, f32 speedTarget);
s32 EnHy_MoveBackwards(EnHy* enHy, f32 speedTarget);
void EnHy_UpdateCollider(EnHy* enHy, GlobalContext* globalCtx);
s32 EnHy_PlayWalkingSound(EnHy* enHy, GlobalContext* globalCtx, f32 distAboveThreshold);
#endif // Z_EN_HY_H

3
spec
View File

@ -2477,8 +2477,7 @@ beginseg
name "ovl_En_Cne_01"
compress
include "build/src/overlays/actors/ovl_En_Cne_01/z_en_cne_01.o"
include "build/data/ovl_En_Cne_01/ovl_En_Cne_01.data.o"
include "build/data/ovl_En_Cne_01/ovl_En_Cne_01.reloc.o"
include "build/src/overlays/actors/ovl_En_Cne_01/ovl_En_Cne_01_reloc.o"
endseg
beginseg

View File

@ -3,78 +3,79 @@
* Description: Unused System for NPCs (includes animation, door interaction, blinking, pathing, and collider helpers)
*/
#include "global.h"
#include "z_en_hy.h"
#include "overlays/actors/ovl_En_Door/z_en_door.h"
#include "objects/object_aob/object_aob.h"
#include "objects/object_bba/object_bba.h"
#include "objects/object_bji/object_bji.h"
#include "objects/object_boj/object_boj.h"
#include "objects/object_os_anime/object_os_anime.h"
extern AnimationHeader D_0600007C;
extern AnimationHeader D_0600066C;
extern AnimationHeader D_0600071C;
extern AnimationHeader D_060008C0;
extern AnimationHeader D_06000AB0;
extern AnimationHeader D_06000FDC;
extern AnimationHeader D_06001494;
extern AnimationHeader D_06001908;
extern AnimationHeader D_06001EE0;
extern AnimationHeader D_06005DC4;
extern AnimationHeader D_06005D9C;
extern AnimationHeader D_0600DED8;
extern AnimationHeader D_0600F920;
extern AnimationHeader D_0600FC1C;
extern AnimationHeader D_0600FEE4;
extern AnimationHeader D_06010330;
static ActorAnimationEntryS animations[] = {
{ &D_0600007C, 1.0f, 0, -1, 0, 0 }, { &D_06001494, 1.0f, 0, -1, 0, 0 }, { &D_06001494, 1.0f, 0, -1, 0, -8 },
{ &D_06001908, 1.0f, 0, -1, 0, 0 }, { &D_06001908, 1.0f, 0, -1, 0, -8 }, { &D_060008C0, 1.0f, 0, -1, 0, 0 },
{ &D_06005DC4, 1.0f, 0, -1, 0, 0 }, { &D_06000FDC, 1.0f, 0, -1, 0, 0 }, { &D_06000AB0, 1.0f, 0, -1, 0, -8 },
{ &D_0600066C, 1.0f, 0, -1, 0, 0 }, { &D_0600071C, 1.0f, 0, -1, 0, 0 }, { &D_06001EE0, 1.0f, 0, -1, 0, 0 },
{ &D_0600DED8, 1.5f, 0, -1, 2, 0 }, { &D_0600F920, 1.5f, 0, -1, 2, 0 }, { &D_0600FC1C, 1.0f, 0, -1, 0, 0 },
{ &D_0600FEE4, 1.0f, 0, -1, 0, 0 }, { &D_06010330, 1.0f, 0, -1, 0, 0 }, { &D_0600FC1C, 1.0f, 0, -1, 0, -8 },
{ &D_0600FEE4, 1.0f, 0, -1, 0, -8 }, { &D_06010330, 1.0f, 0, -1, 0, -8 }, { &D_06005D9C, 1.0f, 0, -1, 0, -8 },
ActorAnimationEntryS sAnimations[] = {
{ &object_aob_Anim_00007C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_boj_Anim_001494, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_boj_Anim_001494, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
{ &object_boj_Anim_001908, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_boj_Anim_001908, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
{ &object_boj_Anim_0008C0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_bba_Anim_005DC4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_bji_Anim_000FDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_bji_Anim_000AB0, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
{ &object_bji_Anim_00066C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_boj_Anim_00071C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_os_anime_Anim_001EE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_boj_Anim_00DED8, 1.5f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_boj_Anim_00F920, 1.5f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_boj_Anim_00FC1C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_boj_Anim_00FEE4, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_boj_Anim_010330, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_boj_Anim_00FC1C, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
{ &object_boj_Anim_00FEE4, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
{ &object_boj_Anim_010330, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
{ &object_boj_Anim_005D9C, 1.0f, 0, -1, ANIMMODE_LOOP, -8 },
};
s8 D_801BC3F0[] = { -1, 1, 12, 13, 14, 9, 10, 11, 0, 6, 7, 8, 3, 4, 5, 2 };
s8 gEnHyBodyParts[] = { -1, 1, 12, 13, 14, 9, 10, 11, 0, 6, 7, 8, 3, 4, 5, 2 };
s8 D_801BC400[] = { 0, 0, 0, 0, 3, 4, 0, 6, 7, 0, 9, 10, 0, 12, 13, 0 };
s8 gEnHyBodyPartsIndex[] = { 0, 0, 0, 0, 3, 4, 0, 6, 7, 0, 9, 10, 0, 12, 13 };
u8 D_801BC410[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
u8 gEnHyShadowSize[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
s32 EnHy_ChangeAnim(SkelAnime* skelAnime, s16 animIndex) {
s16 frameCount;
s32 isChanged = false;
if (animIndex >= 0 && animIndex <= 20) {
if (animIndex >= ENHY_ANIMATION_AOB_0 && animIndex < ENHY_ANIMATION_MAX) {
isChanged = true;
frameCount = animations[animIndex].frameCount;
frameCount = sAnimations[animIndex].frameCount;
if (frameCount < 0) {
frameCount = Animation_GetLastFrame(&animations[animIndex].animationSeg->common);
frameCount = Animation_GetLastFrame(&sAnimations[animIndex].animationSeg->common);
}
Animation_Change(skelAnime, animations[animIndex].animationSeg, animations[animIndex].playbackSpeed,
animations[animIndex].frame, frameCount, animations[animIndex].mode,
animations[animIndex].transitionRate);
Animation_Change(skelAnime, sAnimations[animIndex].animationSeg, sAnimations[animIndex].playbackSpeed,
sAnimations[animIndex].frame, frameCount, sAnimations[animIndex].mode,
sAnimations[animIndex].transitionRate);
}
return isChanged;
}
//! @TODO: Return Door instance when c and h files are split
Actor* EnHy_FindNearestDoor(Actor* actor, GlobalContext* globalCtx) {
Actor* nearestDoor = NULL;
EnDoor* EnHy_FindNearestDoor(Actor* actor, GlobalContext* globalCtx) {
EnDoor* nearestDoor = NULL;
Actor* doorIter = NULL;
Actor* door;
EnDoor* door;
f32 dist;
s32 isSetup = false;
f32 minDist = 0.0f;
do {
doorIter = SubS_FindActor(globalCtx, doorIter, ACTORCAT_DOOR, ACTOR_EN_DOOR);
door = doorIter;
dist = Actor_DistanceBetweenActors(actor, door);
door = (EnDoor*)doorIter;
dist = Actor_DistanceBetweenActors(actor, &door->actor);
if (!isSetup || (dist < minDist)) {
nearestDoor = door;
minDist = dist;
isSetup = true;
}
doorIter = door->next;
doorIter = door->actor.next;
} while (doorIter != NULL);
if (1) {}
@ -111,27 +112,29 @@ void EnHy_Blink(EnHy* enHy, s32 eyeTexMaxIndex) {
s32 EnHy_Init(EnHy* enHy, GlobalContext* globalCtx, FlexSkeletonHeader* skeletonHeaderSeg, s16 animIndex) {
s32 isInitialized = false;
if ((func_8013D8DC(enHy->animObjIndex, globalCtx) == 1) && (func_8013D8DC(enHy->unk190, globalCtx) == 1) &&
(func_8013D8DC(enHy->unk191, globalCtx) == 1) && (func_8013D8DC(enHy->unk192, globalCtx) == 1)) {
enHy->actor.objBankIndex = enHy->unk192;
if ((func_8013D8DC(enHy->animObjIndex, globalCtx) == true) &&
(func_8013D8DC(enHy->headObjIndex, globalCtx) == true) &&
(func_8013D8DC(enHy->skelUpperObjIndex, globalCtx) == true) &&
(func_8013D8DC(enHy->skelLowerObjIndex, globalCtx) == true)) {
enHy->actor.objBankIndex = enHy->skelLowerObjIndex;
isInitialized = true;
ActorShape_Init(&enHy->actor.shape, 0.0f, NULL, 0.0f);
gSegments[6] = PHYSICAL_TO_VIRTUAL(globalCtx->objectCtx.status[enHy->actor.objBankIndex].segment);
SkelAnime_InitFlex(globalCtx, &enHy->skelAnime, skeletonHeaderSeg, NULL, enHy->jointTable, enHy->morphTable,
16);
ENHY_LIMB_MAX);
EnHy_ChangeObjectAndAnim(enHy, globalCtx, animIndex);
}
return isInitialized;
}
//! @TODO: Should just take EnDoor instead of actor when c and h are split
void func_800F0BB4(EnHy* enHy, GlobalContext* globalCtx, Actor* door, s16 arg3, s16 arg4) {
void func_800F0BB4(EnHy* enHy, GlobalContext* globalCtx, EnDoor* door, s16 arg3, s16 arg4) {
s32 pad;
s8 sp3B;
Vec3f offset;
f32 phi_f0;
Actor_OffsetOfPointInActorCoords(door, &offset, &enHy->actor.world.pos);
Actor_OffsetOfPointInActorCoords(&door->actor, &offset, &enHy->actor.world.pos);
phi_f0 = (offset.z >= 0.0f) ? 1.0f : -1.0f;
sp3B = ((s8)phi_f0 < 0) ? 0 : 2;
EnHy_ChangeObjectAndAnim(enHy, globalCtx, (sp3B == 0) ? arg3 : arg4);
@ -139,14 +142,14 @@ void func_800F0BB4(EnHy* enHy, GlobalContext* globalCtx, Actor* door, s16 arg3,
enHy->skelAnime.prevTransl = *enHy->skelAnime.jointTable;
enHy->skelAnime.moveFlags |= 3;
AnimationContext_SetMoveActor(globalCtx, &enHy->actor, &enHy->skelAnime, 1.0f);
((EnDoor*)door)->unk_1A1 = 1;
((EnDoor*)door)->unk_1A0 = sp3B;
door->unk_1A1 = 1;
door->unk_1A0 = sp3B;
}
s32 func_800F0CE4(EnHy* enHy, GlobalContext* globalCtx, ActorFunc draw, s16 arg3, s16 arg4, f32 arg5) {
s32 ret = false;
s16 yaw;
Actor* door;
EnDoor* door;
s32 pad;
if (func_8013D68C(enHy->path, enHy->curPoint, &enHy->actor.world.pos)) {
@ -154,7 +157,7 @@ s32 func_800F0CE4(EnHy* enHy, GlobalContext* globalCtx, ActorFunc draw, s16 arg3
if (door != NULL) {
ret = true;
func_800F0BB4(enHy, globalCtx, door, arg3, arg4);
yaw = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->world.pos);
yaw = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->actor.world.pos);
enHy->actor.world.pos.x += arg5 * Math_SinS(yaw);
enHy->actor.world.pos.z += arg5 * Math_CosS(yaw);
enHy->actor.world.rot.y = -yaw;
@ -168,7 +171,7 @@ s32 func_800F0CE4(EnHy* enHy, GlobalContext* globalCtx, ActorFunc draw, s16 arg3
s32 func_800F0DD4(EnHy* enHy, GlobalContext* globalCtx, s16 arg2, s16 arg3) {
s32 ret = false;
s32 pad;
Actor* door;
EnDoor* door;
enHy->curPoint = 0;
if (func_8013D68C(enHy->path, enHy->curPoint, &enHy->actor.world.pos)) {
@ -176,10 +179,10 @@ s32 func_800F0DD4(EnHy* enHy, GlobalContext* globalCtx, s16 arg2, s16 arg3) {
if (door != NULL) {
ret = true;
func_800F0BB4(enHy, globalCtx, door, arg2, arg3);
enHy->actor.shape.rot.y = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->world.pos);
enHy->actor.shape.rot.y = Math_Vec3f_Yaw(&enHy->actor.world.pos, &door->actor.world.pos);
enHy->actor.world.rot.y = enHy->actor.shape.rot.y;
enHy->actor.gravity = 0.0f;
enHy->actor.flags &= ~1;
enHy->actor.flags &= ~ACTOR_FLAG_1;
}
}
return ret;
@ -187,16 +190,16 @@ s32 func_800F0DD4(EnHy* enHy, GlobalContext* globalCtx, s16 arg2, s16 arg3) {
s32 EnHy_SetPointFowards(EnHy* enHy, GlobalContext* globalCtx, f32 gravity, s16 animIndex) {
enHy->actor.gravity = gravity;
enHy->actor.flags |= 1;
enHy->actor.flags |= ACTOR_FLAG_1;
EnHy_ChangeObjectAndAnim(enHy, globalCtx, animIndex);
enHy->curPoint++;
return 0;
return false;
}
s32 EnHy_SetPointBackwards(EnHy* enHy, GlobalContext* globalCtx, s16 animIndex) {
EnHy_ChangeObjectAndAnim(enHy, globalCtx, animIndex);
enHy->curPoint--;
return 0;
return false;
}
s32 EnHy_MoveForwards(EnHy* enHy, f32 speedTarget) {
@ -212,6 +215,7 @@ s32 EnHy_MoveForwards(EnHy* enHy, f32 speedTarget) {
reachedEnd = true;
}
}
return reachedEnd;
}
@ -228,6 +232,7 @@ s32 EnHy_MoveBackwards(EnHy* enHy, f32 speedTarget) {
reachedEnd = true;
}
}
return reachedEnd;
}
@ -267,5 +272,6 @@ s32 EnHy_PlayWalkingSound(EnHy* enHy, GlobalContext* globalCtx, f32 distAboveThr
if (enHy->isRightFootOnGround && !wasRightFootOnGround && isFootOnGround) {
Actor_PlaySfxAtPos(&enHy->actor, sfxId);
}
return 0;
return false;
}

View File

@ -5,8 +5,9 @@
*/
#include "z_en_cne_01.h"
#include "objects/object_cne/object_cne.h"
#define FLAGS 0x00000019
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_8 | ACTOR_FLAG_1)
#define THIS ((EnCne01*)thisx)
@ -15,12 +16,12 @@ void EnCne01_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnCne01_Update(Actor* thisx, GlobalContext* globalCtx);
void EnCne01_Draw(Actor* thisx, GlobalContext* globalCtx);
void func_809CB520(EnCne01* this, GlobalContext* globalCtx);
void func_809CB5A0(EnCne01* this, GlobalContext* globalCtx);
void func_809CB5D8(EnCne01* this, GlobalContext* globalCtx);
void func_809CB5FC(EnCne01* this, GlobalContext* globalCtx);
void EnCne01_Walk(EnHy* this, GlobalContext* globalCtx);
void EnCne01_FaceForward(EnHy* this, GlobalContext* globalCtx);
void EnCne01_Talk(EnHy* this, GlobalContext* globalCtx);
typedef enum { CNE01_DMG_EFF_NONE } EnCne01DamageEffect;
#if 0
const ActorInit En_Cne_01_InitVars = {
ACTOR_EN_CNE_01,
ACTORCAT_NPC,
@ -33,85 +34,295 @@ const ActorInit En_Cne_01_InitVars = {
(ActorFunc)EnCne01_Draw,
};
// static ColliderCylinderInit sCylinderInit = {
static ColliderCylinderInit D_809CBF00 = {
{ COLTYPE_HIT0, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
{ ELEMTYPE_UNK1, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_HIT0,
AT_NONE,
AC_ON | AC_TYPE_PLAYER,
OC1_ON | OC1_TYPE_ALL,
OC2_TYPE_1,
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK1,
{ 0x00000000, 0x00, 0x00 },
{ 0xF7CFFFFF, 0x00, 0x00 },
TOUCH_NONE | TOUCH_SFX_NORMAL,
BUMP_ON,
OCELEM_ON,
},
{ 18, 64, 0, { 0, 0, 0 } },
};
// sColChkInfoInit
static CollisionCheckInfoInit2 D_809CBF2C = { 0, 0, 0, 0, MASS_IMMOVABLE };
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
// static DamageTable sDamageTable = {
static DamageTable D_809CBF38 = {
/* Deku Nut */ DMG_ENTRY(0, 0x0),
/* Deku Stick */ DMG_ENTRY(0, 0x0),
/* Horse trample */ DMG_ENTRY(0, 0x0),
/* Explosives */ DMG_ENTRY(0, 0x0),
/* Zora boomerang */ DMG_ENTRY(0, 0x0),
/* Normal arrow */ DMG_ENTRY(0, 0x0),
/* UNK_DMG_0x06 */ DMG_ENTRY(0, 0x0),
/* Hookshot */ DMG_ENTRY(0, 0x0),
/* Goron punch */ DMG_ENTRY(0, 0x0),
/* Sword */ DMG_ENTRY(0, 0x0),
/* Goron pound */ DMG_ENTRY(0, 0x0),
/* Fire arrow */ DMG_ENTRY(0, 0x0),
/* Ice arrow */ DMG_ENTRY(0, 0x0),
/* Light arrow */ DMG_ENTRY(0, 0x0),
/* Goron spikes */ DMG_ENTRY(0, 0x0),
/* Deku spin */ DMG_ENTRY(0, 0x0),
/* Deku bubble */ DMG_ENTRY(0, 0x0),
/* Deku launch */ DMG_ENTRY(0, 0x0),
/* UNK_DMG_0x12 */ DMG_ENTRY(0, 0x0),
/* Zora barrier */ DMG_ENTRY(0, 0x0),
/* Normal shield */ DMG_ENTRY(0, 0x0),
/* Light ray */ DMG_ENTRY(0, 0x0),
/* Thrown object */ DMG_ENTRY(0, 0x0),
/* Zora punch */ DMG_ENTRY(0, 0x0),
/* Spin attack */ DMG_ENTRY(0, 0x0),
/* Sword beam */ DMG_ENTRY(0, 0x0),
/* Normal Roll */ DMG_ENTRY(0, 0x0),
/* UNK_DMG_0x1B */ DMG_ENTRY(0, 0x0),
/* UNK_DMG_0x1C */ DMG_ENTRY(0, 0x0),
/* Unblockable */ DMG_ENTRY(0, 0x0),
/* UNK_DMG_0x1E */ DMG_ENTRY(0, 0x0),
/* Powder Keg */ DMG_ENTRY(0, 0x0),
static DamageTable sDamageTable = {
/* Deku Nut */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Deku Stick */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Horse trample */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Explosives */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Zora boomerang */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Normal arrow */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* UNK_DMG_0x06 */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Hookshot */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Goron punch */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Sword */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Goron pound */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Fire arrow */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Ice arrow */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Light arrow */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Goron spikes */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Deku spin */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Deku bubble */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Deku launch */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* UNK_DMG_0x12 */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Zora barrier */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Normal shield */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Light ray */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Thrown object */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Zora punch */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Spin attack */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Sword beam */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Normal Roll */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* UNK_DMG_0x1B */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* UNK_DMG_0x1C */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Unblockable */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* UNK_DMG_0x1E */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
/* Powder Keg */ DMG_ENTRY(0, CNE01_DMG_EFF_NONE),
};
#endif
static u16 D_809CBF58[] = { 4000, 4, 1, 3, 6000, 4, 1, 6, 4000, 4, 1, 3, 6000, 4, 1, 6 };
extern ColliderCylinderInit D_809CBF00;
extern CollisionCheckInfoInit2 D_809CBF2C;
extern DamageTable D_809CBF38;
void EnCne01_UpdateModel(EnCne01* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
Vec3f focus;
extern UNK_TYPE D_060000F0;
extern UNK_TYPE D_06001300;
EnHy_UpdateSkelAnime(&this->enHy, globalCtx);
if (func_8013D5E8(this->enHy.actor.shape.rot.y, 0x36B0, this->enHy.actor.yawTowardsPlayer)) {
focus.x = player->actor.world.pos.x;
focus.y = player->bodyPartsPos[7].y + 3.0f;
focus.z = player->actor.world.pos.z;
func_8013D2E0(&focus, &this->enHy.actor.focus.pos, &this->enHy.actor.shape.rot, &this->enHy.focusTarget,
&this->enHy.headRot, &this->enHy.torsoRot, D_809CBF58);
} else {
Math_SmoothStepToS(&this->enHy.focusTarget.x, 0, 4, 0x3E8, 1);
Math_SmoothStepToS(&this->enHy.focusTarget.y, 0, 4, 0x3E8, 1);
Math_SmoothStepToS(&this->enHy.headRot.x, 0, 4, 0x3E8, 1);
Math_SmoothStepToS(&this->enHy.headRot.y, 0, 4, 0x3E8, 1);
Math_SmoothStepToS(&this->enHy.torsoRot.x, 0, 4, 0x3E8, 1);
Math_SmoothStepToS(&this->enHy.torsoRot.y, 0, 4, 0x3E8, 1);
}
func_8013D9C8(globalCtx, this->enHy.limbRotTableY, this->enHy.limbRotTableZ, ARRAY_COUNT(this->enHy.limbRotTableY));
EnHy_UpdateCollider(&this->enHy, globalCtx);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/func_809CB290.s")
s32 EnCne01_TestIsTalking(EnCne01* this, GlobalContext* globalCtx) {
s32 isTalking = false;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/func_809CB404.s")
if (Actor_ProcessTalkRequest(&this->enHy.actor, &globalCtx->state)) {
isTalking = true;
this->enHy.textId = 0x10B9;
this->enHy.tmpFocusTarget = this->enHy.focusTarget;
this->enHy.tmpHeadRot = this->enHy.headRot;
this->enHy.tmpTorsoRot = this->enHy.torsoRot;
this->enHy.tmpActionFunc = this->enHy.actionFunc;
this->enHy.actionFunc = EnCne01_Talk;
}
return isTalking;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/func_809CB4A0.s")
s32 func_809CB4A0(EnCne01* this, GlobalContext* globalCtx) {
s16 x;
s16 y;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/func_809CB520.s")
Actor_GetScreenPos(globalCtx, &this->enHy.actor, &x, &y);
//! @bug: Both x and y conditionals are always true, || should be an &&
if (!this->enHy.waitingOnInit && ((x >= 0) || (x < SCREEN_WIDTH)) && ((y >= 0) || (y < SCREEN_HEIGHT))) {
func_800B85E0(&this->enHy.actor, globalCtx, 30.0f, EXCH_ITEM_2E);
}
return true;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/func_809CB5A0.s")
void EnCne01_FinishInit(EnHy* this, GlobalContext* globalCtx) {
if (EnHy_Init(this, globalCtx, &gCneSkel, ENHY_ANIMATION_OS_ANIME_11)) {
this->actor.flags |= ACTOR_FLAG_1;
this->actor.draw = EnCne01_Draw;
this->waitingOnInit = false;
if (ENCNE01_GET_PATH(&this->actor) == ENCNE01_NO_PATH) {
this->actionFunc = EnCne01_FaceForward;
} else {
this->actionFunc = EnCne01_Walk;
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/func_809CB5D8.s")
void EnCne01_Walk(EnHy* this, GlobalContext* globalCtx) {
if (EnHy_MoveForwards(this, 1.0f)) {
this->curPoint = 0;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/func_809CB5FC.s")
void EnCne01_FaceForward(EnHy* this, GlobalContext* globalCtx) {
this->actor.shape.rot = this->actor.world.rot;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/EnCne01_Init.s")
void EnCne01_Talk(EnHy* this, GlobalContext* globalCtx) {
s16 yaw;
u8 talkstate;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/EnCne01_Destroy.s")
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 0xFA0, 1);
talkstate = Message_GetState(&globalCtx->msgCtx);
this->inMsgState3 = (talkstate == 3) ? true : false;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/EnCne01_Update.s")
switch (talkstate) {
case 0:
yaw = ABS_ALT(this->actor.shape.rot.y - this->actor.yawTowardsPlayer);
if (yaw < 0x64) {
func_801518B0(globalCtx, this->textId, NULL);
}
break;
case 2:
this->actor.textId = 0;
this->focusTarget = this->tmpFocusTarget;
this->headRot = this->tmpHeadRot;
this->torsoRot = this->tmpTorsoRot;
this->actor.shape.rot.y = this->actor.world.rot.y;
this->actionFunc = this->tmpActionFunc;
this->tmpActionFunc = NULL;
break;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/func_809CB920.s")
void EnCne01_Init(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnCne01* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/func_809CBBC8.s")
this->enHy.animObjIndex = func_8013D924(OBJECT_OS_ANIME, globalCtx);
this->enHy.headObjIndex = func_8013D924(OBJECT_CNE, globalCtx);
this->enHy.skelUpperObjIndex = func_8013D924(OBJECT_CNE, globalCtx);
this->enHy.skelLowerObjIndex = func_8013D924(OBJECT_CNE, globalCtx);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/func_809CBCA0.s")
if ((this->enHy.animObjIndex < 0) || (this->enHy.headObjIndex < 0) || (this->enHy.skelUpperObjIndex < 0) ||
(this->enHy.skelLowerObjIndex < 0)) {
Actor_MarkForDeath(&this->enHy.actor);
}
this->enHy.actor.draw = NULL;
Collider_InitCylinder(globalCtx, &this->enHy.collider);
Collider_SetCylinder(globalCtx, &this->enHy.collider, &this->enHy.actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->enHy.actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
this->enHy.actor.flags &= ~ACTOR_FLAG_1;
this->enHy.path = func_8013D648(globalCtx, ENCNE01_GET_PATH(&this->enHy.actor), ENCNE01_NO_PATH);
this->enHy.waitingOnInit = true;
Actor_SetScale(&this->enHy.actor, 0.01f);
this->enHy.actionFunc = EnCne01_FinishInit;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Cne_01/EnCne01_Draw.s")
void EnCne01_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnCne01* this = THIS;
Collider_DestroyCylinder(globalCtx, &this->enHy.collider);
}
void EnCne01_Update(Actor* thisx, GlobalContext* globalCtx) {
EnCne01* this = THIS;
EnCne01_TestIsTalking(this, globalCtx);
this->enHy.actionFunc(&this->enHy, globalCtx);
Actor_UpdateBgCheckInfo(globalCtx, &this->enHy.actor, 0.0f, 0.0f, 0.0f, 4);
EnCne01_UpdateModel(this, globalCtx);
func_809CB4A0(this, globalCtx);
}
s32 EnCne01_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
Actor* thisx) {
EnCne01* this = THIS;
s8 bodyPart;
Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
bodyPart = gEnHyBodyParts[limbIndex];
if (bodyPart >= 0) {
Matrix_MultiplyVector3fByState(&zeroVec, &this->enHy.bodyPartsPos[bodyPart]);
}
if (limbIndex == CNE_LIMB_HEAD) {
OPEN_DISPS(globalCtx->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x06, globalCtx->objectCtx.status[this->enHy.headObjIndex].segment);
gSegments[6] = PHYSICAL_TO_VIRTUAL(globalCtx->objectCtx.status[this->enHy.headObjIndex].segment);
*dList = gCneHeadBrownHairDL;
gSegments[6] = PHYSICAL_TO_VIRTUAL(globalCtx->objectCtx.status[this->enHy.skelLowerObjIndex].segment);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
if (limbIndex == CNE_LIMB_HEAD) {
Matrix_InsertTranslation(1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
Matrix_InsertXRotation_s(this->enHy.headRot.y, MTXMODE_APPLY);
Matrix_InsertZRotation_s(-this->enHy.headRot.x, MTXMODE_APPLY);
Matrix_InsertTranslation(-1500.0f, 0.0f, 0.0f, MTXMODE_APPLY);
}
if (limbIndex == CNE_LIMB_TORSO) {
Matrix_InsertXRotation_s(-this->enHy.torsoRot.y, MTXMODE_APPLY);
Matrix_InsertZRotation_s(-this->enHy.torsoRot.x, MTXMODE_APPLY);
}
if ((limbIndex == CNE_LIMB_HEAD) && this->enHy.inMsgState3 && ((globalCtx->state.frames % 2) == 0)) {
Matrix_InsertTranslation(40.0f, 0.0f, 0.0f, MTXMODE_APPLY);
}
if ((limbIndex == CNE_LIMB_TORSO) || (limbIndex == CNE_LIMB_LEFT_UPPER_ARM) ||
(limbIndex == CNE_LIMB_RIGHT_UPPER_ARM)) {
rot->y += (s16)(Math_SinS(this->enHy.limbRotTableY[limbIndex]) * 200.0f);
rot->z += (s16)(Math_CosS(this->enHy.limbRotTableZ[limbIndex]) * 200.0f);
}
return false;
}
void EnCne01_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnCne01* this = THIS;
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
if (limbIndex == CNE_LIMB_RIGHT_FOOT) {
OPEN_DISPS(globalCtx->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x06, globalCtx->objectCtx.status[this->enHy.skelUpperObjIndex].segment);
gSegments[0x06] = PHYSICAL_TO_VIRTUAL(globalCtx->objectCtx.status[this->enHy.skelUpperObjIndex].segment);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
if (limbIndex == CNE_LIMB_HEAD) {
Matrix_MultiplyVector3fByState(&zeroVec, &this->enHy.actor.focus.pos);
}
}
void EnCne01_TransformLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Actor* thisx) {
}
void EnCne01_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnCne01* this = THIS;
s32 i;
u8* shadowTex = GRAPH_ALLOC(globalCtx->state.gfxCtx, sizeof(u8[64][64]));
u8* shadowTexIter;
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Gfx_EnvColor(globalCtx->state.gfxCtx, 160, 180, 255, 0));
gSPSegment(POLY_OPA_DISP++, 0x09, Gfx_EnvColor(globalCtx->state.gfxCtx, 160, 180, 255, 0));
gSPSegment(POLY_OPA_DISP++, 0x0A, Gfx_EnvColor(globalCtx->state.gfxCtx, 160, 180, 255, 0));
gDPPipeSync(POLY_OPA_DISP++);
SkelAnime_DrawTransformFlexOpa(globalCtx, this->enHy.skelAnime.skeleton, this->enHy.skelAnime.jointTable,
this->enHy.skelAnime.dListCount, EnCne01_OverrideLimbDraw, EnCne01_PostLimbDraw,
EnCne01_TransformLimbDraw, &this->enHy.actor);
Matrix_InsertXRotation_s(0, MTXMODE_NEW);
for (i = 0, shadowTexIter = shadowTex; i < (s32)sizeof(u8[64][64]); i++) {
*shadowTexIter++ = 0;
}
for (i = 0; i < 5; i++) {
func_8013CD64(this->enHy.bodyPartsPos, &this->enHy.actor.world.pos, shadowTex, i / 5.0f,
ARRAY_COUNT(this->enHy.bodyPartsPos), gEnHyShadowSize, gEnHyBodyPartsIndex);
}
func_8013CF04(&this->enHy.actor, &globalCtx->state.gfxCtx, shadowTex);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}

View File

@ -1,16 +1,18 @@
#ifndef Z_EN_CNE_01_H
#define Z_EN_CNE_01_H
#include "global.h"
#include "z_en_hy.h"
struct EnCne01;
typedef void (*EnCne01ActionFunc)(struct EnCne01*, GlobalContext*);
#define ENCNE01_GET_PATH(thisx) (((thisx)->params & 0x7E00) >> 9)
#define ENCNE01_NO_PATH 0x3F
typedef struct EnCne01 {
/* 0x0000 */ Actor actor;
/* 0x0144 */ EnCne01ActionFunc actionFunc;
/* 0x0148 */ char unk_148[0x4D4];
/* 0x000 */ EnHy enHy;
/* 0x3EC */ UNK_TYPE1 unk_3EC[0x230];
} EnCne01; // size = 0x61C
extern const ActorInit En_Cne_01_InitVars;

View File

@ -9141,19 +9141,19 @@
0x809CB210:("EnBoj04_Destroy",),
0x809CB220:("EnBoj04_Update",),
0x809CB230:("EnBoj04_Draw",),
0x809CB290:("func_809CB290",),
0x809CB404:("func_809CB404",),
0x809CB290:("EnCne01_UpdateModel",),
0x809CB404:("EnCne01_TestIsTalking",),
0x809CB4A0:("func_809CB4A0",),
0x809CB520:("func_809CB520",),
0x809CB5A0:("func_809CB5A0",),
0x809CB5D8:("func_809CB5D8",),
0x809CB5FC:("func_809CB5FC",),
0x809CB520:("EnCne01_FinishInit",),
0x809CB5A0:("EnCne01_Walk",),
0x809CB5D8:("EnCne01_FaceForward",),
0x809CB5FC:("EnCne01_Talk",),
0x809CB72C:("EnCne01_Init",),
0x809CB86C:("EnCne01_Destroy",),
0x809CB898:("EnCne01_Update",),
0x809CB920:("func_809CB920",),
0x809CBBC8:("func_809CBBC8",),
0x809CBCA0:("func_809CBCA0",),
0x809CB920:("EnCne01_OverrideLimbDraw",),
0x809CBBC8:("EnCne01_PostLimbDraw",),
0x809CBCA0:("EnCne01_TransformLimbDraw",),
0x809CBCB4:("EnCne01_Draw",),
0x809CC060:("func_809CC060",),
0x809CC1D4:("func_809CC1D4",),

View File

@ -917,9 +917,9 @@
0x801BC240:("D_801BC240","Gfx","[9]",0x48),
0x801BC288:("D_801BC288","Gfx","[3]",0x18),
0x801BC2A0:("D_801BC2A0","UNK_TYPE1","",0x1),
0x801BC3F0:("D_801BC3F0","UNK_TYPE1","",0x1),
0x801BC400:("D_801BC400","UNK_TYPE1","",0x1),
0x801BC410:("D_801BC410","s32",[],0x10),
0x801BC3F0:("gEnHyBodyParts","UNK_TYPE1","",0x1),
0x801BC400:("gEnHyBodyPartsIndex","UNK_TYPE1","",0x1),
0x801BC410:("gEnHyShadowSize","s32",[],0x10),
0x801BC420:("sReactionTextIds","u16","[]",0x140A),
0x801BD830:("actorCutscenesGlobalCutscenes","ActorCutscene","[8]",0x80),
0x801BD8B0:("actorCutsceneCurrent","s16","",0x2),

View File

@ -550,25 +550,6 @@ D_06011AB8 = 0x06011AB8;
D_06012A80 = 0x06012A80;
D_06013138 = 0x06013138;
// z_en_hy.c
D_0600007C = 0x0600007C;
D_0600066C = 0x0600066C;
D_0600071C = 0x0600071C;
D_060008C0 = 0x060008C0;
D_06000AB0 = 0x06000AB0;
D_06000FDC = 0x06000FDC;
D_06001494 = 0x06001494;
D_06001908 = 0x06001908;
D_06001EE0 = 0x06001EE0;
D_06005DC4 = 0x06005DC4;
D_06005D9C = 0x06005D9C;
D_0600DED8 = 0x0600DED8;
D_0600F920 = 0x0600F920;
D_0600FC1C = 0x0600FC1C;
D_0600FEE4 = 0x0600FEE4;
D_06010330 = 0x06010330;
// ovl_Bg_Astr_Bombwall
D_06002178 = 0x06002178;
@ -1290,11 +1271,6 @@ D_0600C3E0 = 0x0600C3E0;
D_06001000 = 0x06001000;
// ovl_En_Cne_01
D_060000F0 = 0x060000F0;
D_06001300 = 0x06001300;
// ovl_En_Crow
D_060000F0 = 0x060000F0;
@ -1405,6 +1381,7 @@ D_06003DC8 = 0x06003DC8;
// ovl_En_Fishing
D_0600007C = 0x0600007C;
D_0600CFE0 = 0x0600CFE0;
D_06011058 = 0x06011058;