diff --git a/include/z64.h b/include/z64.h index b0c0121aaa..9423136146 100644 --- a/include/z64.h +++ b/include/z64.h @@ -942,7 +942,9 @@ typedef struct { /* 0x12023 */ s8 unk12023; /* 0x12024 */ UNK_TYPE1 unk12024[0x6]; /* 0x1202A */ u16 unk1202A; - /* 0x1202C */ UNK_TYPE1 pad1202C[0x18]; + /* 0x1202C */ UNK_TYPE1 pad1202C[0x2]; + /* 0x1202E */ u16 unk1202E; + /* 0x12030 */ UNK_TYPE1 pad12030[0x14]; /* 0x12044 */ s16 unk12044; /* 0x12046 */ UNK_TYPE1 pad12046[0x24]; /* 0x1206A */ s16 unk1206A; diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index e7a006dd9f..faa8c99a73 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -8045,9 +8045,9 @@ SECTIONS ovl_En_Hg : AT(RomLocation) { build/src/overlays/actors/ovl_En_Hg/z_en_hg.o(.text) - build/asm/overlays/ovl_En_Hg_data.o(.data) + build/src/overlays/actors/ovl_En_Hg/z_en_hg.o(.data) build/src/overlays/actors/ovl_En_Hg/z_en_hg.o(.rodata) - build/asm/overlays/ovl_En_Hg_rodata.o(.rodata) + build/src/overlays/actors/ovl_En_Hg/z_en_hg_overlay.o(.ovl) } SegmentEnd = .; SegmentSize = SegmentEnd - SegmentStart; diff --git a/linker_scripts/object_script.txt b/linker_scripts/object_script.txt index 892217f324..37de763466 100644 --- a/linker_scripts/object_script.txt +++ b/linker_scripts/object_script.txt @@ -347,6 +347,18 @@ D_06006320 = 0x06006320; D_06006720 = 0x06006720; D_06006920 = 0x06006920; +/* z_en_hg */ +D_06008580 = 0x06008580; +D_0600260C = 0x0600260C; +D_06005E28 = 0x06005E28; +D_06009D44 = 0x06009D44; +D_0600A164 = 0x0600A164; +D_06000370 = 0x06000370; +D_06001138 = 0x06001138; +D_060015D4 = 0x060015D4; +D_06001960 = 0x06001960; +D_0600AE1C = 0x0600AE1C; + /* z_en_in */ D_06014EA8 = 0x06014EA8; D_06015E38 = 0x06015E38; @@ -756,3 +768,4 @@ D_06000968 = 0x06000968; /* z_obj_visiblock */ D_06000AD0 = 0x06000AD0; D_06000140 = 0x06000140; + diff --git a/src/overlays/actors/ovl_En_Hg/z_en_hg.c b/src/overlays/actors/ovl_En_Hg/z_en_hg.c index 02d92af0f7..8e2a6af9a7 100644 --- a/src/overlays/actors/ovl_En_Hg/z_en_hg.c +++ b/src/overlays/actors/ovl_En_Hg/z_en_hg.c @@ -1,3 +1,9 @@ +/* + * File: z_en_hg.c + * Overlay: En_Hg + * Description: Pamela's Father (Human) + */ + #include "z_en_hg.h" #define FLAGS 0x02100019 @@ -9,7 +15,32 @@ void EnHg_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnHg_Update(Actor* thisx, GlobalContext* globalCtx); void EnHg_Draw(Actor* thisx, GlobalContext* globalCtx); -#if 0 +void func_80BCF354(EnHg* this); +void func_80BCF398(EnHg* this, GlobalContext* globalCtx); +void func_80BCF468(EnHg* this); +void func_80BCF468(EnHg* this); +void func_80BCF4AC(EnHg* this, GlobalContext* globalCtx); +void func_80BCF5F0(EnHg* this); +void func_80BCF634(EnHg* this, GlobalContext* globalCtx); +void func_80BCF68C(EnHg* this); +void func_80BCF6D0(EnHg* this, GlobalContext* globalCtx); +void func_80BCF8A0(EnHg* this, GlobalContext* globalCtx); +void func_80BCF93C(EnHg* this); +void func_80BCF95C(EnHg* this, GlobalContext* globalCtx); +s32 EnHg_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx); +void EnHg_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx); + +extern FlexSkeletonHeader D_06008580; +extern AnimationHeader D_0600260C; +extern AnimationHeader D_06009D44; +extern AnimationHeader D_0600A164; +extern AnimationHeader D_06000370; +extern AnimationHeader D_06001138; +extern AnimationHeader D_060015D4; +extern AnimationHeader D_06001960; +extern AnimationHeader D_0600AE1C; +extern Gfx D_06005E28[]; + const ActorInit En_Hg_InitVars = { ACTOR_EN_HG, ACTORCAT_PROP, @@ -22,17 +53,27 @@ const ActorInit En_Hg_InitVars = { (ActorFunc)EnHg_Draw, }; - -// static ColliderCylinderInit sCylinderInit = { -static ColliderCylinderInit D_80BCFFB0 = { - { COLTYPE_HIT0, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_2, COLSHAPE_CYLINDER, }, - { ELEMTYPE_UNK0, { 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_2, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK0, + { 0x00000000, 0x00, 0x00 }, + { 0xF7CFFFFF, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_ON, + OCELEM_ON, + }, { 18, 46, 0, { 0, 0, 0 } }, }; - -// static DamageTable sDamageTable = { -static DamageTable D_80BCFFDC = { +static DamageTable sDamageTable = { /* Deku Nut */ DMG_ENTRY(0, 0x1), /* Deku Stick */ DMG_ENTRY(1, 0xD), /* Horse trample */ DMG_ENTRY(0, 0x0), @@ -67,56 +108,320 @@ static DamageTable D_80BCFFDC = { /* Powder Keg */ DMG_ENTRY(1, 0xF), }; +static CollisionCheckInfoInit2 sColChkInfoInit2 = { + 0, 0, 0, 0, 0x80, +}; -// sColChkInfoInit -static CollisionCheckInfoInit2 D_80BCFFFC = { 0, 0, 0, 0, 128 }; +static ActorAnimationEntry sAnimations[] = { + { &D_0600260C, 1.0f, 0.0f, 0.0f, 0, -4.0f }, { &D_06009D44, 1.0f, 0.0f, 0.0f, 0, -4.0f }, + { &D_0600A164, 1.0f, 0.0f, 0.0f, 0, -4.0f }, { &D_06000370, 1.0f, 0.0f, 0.0f, 2, 0.0f }, + { &D_06001138, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &D_060015D4, 1.0f, 0.0f, 0.0f, 2, 0.0f }, + { &D_06001960, 1.0f, 0.0f, 0.0f, 0, 0.0f }, { &D_0600AE1C, 1.0f, 0.0f, 0.0f, 0, 0.0f }, +}; +static u32 D_80BD00C8 = false; -extern ColliderCylinderInit D_80BCFFB0; -extern DamageTable D_80BCFFDC; -extern CollisionCheckInfoInit2 D_80BCFFFC; -#endif +void EnHg_Init(Actor* thisx, GlobalContext* globalCtx) { + EnHg* this = THIS; + s16 currentCutscene = this->actor.cutscene; + s32 i; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/EnHg_Init.asm") + ActorShape_Init(&this->actor.shape, 0.0f, NULL, 36.0f); + SkelAnime_InitSV(globalCtx, &this->skelAnime, &D_06008580, &D_0600260C, this->limbDrawTbl, this->transitionDrawTbl, + HG_LIMB_MAX); + Collider_InitCylinder(globalCtx, &this->collider); + Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit); + CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit2); + if ((gSaveContext.weekEventReg[0x4B] & 0x20) || (gSaveContext.weekEventReg[0x34] & 0x20)) { + Actor_MarkForDeath(&this->actor); + } + this->actor.targetMode = 1; + this->actor.colChkInfo.health = 0; + this->actor.gravity = -1.0f; + for (i = 0; i < ARRAY_COUNT(this->cutscenes); i++) { + if (currentCutscene == -1) { + break; + } + this->cutscenes[i] = currentCutscene; + currentCutscene = ActorCutscene_GetAdditionalCutscene(currentCutscene); + } + func_80BCF354(this); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/EnHg_Destroy.asm") +void EnHg_Destroy(Actor* thisx, GlobalContext* globalCtx) { + EnHg* this = THIS; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF354.asm") + Collider_DestroyCylinder(globalCtx, &this->collider); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF398.asm") +void func_80BCF354(EnHg* this) { + func_800BDC5C(&this->skelAnime, sAnimations, 0); + this->actionFunc = func_80BCF398; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF468.asm") +void func_80BCF398(EnHg* this, GlobalContext* globalCtx) { + if (this->actor.colChkInfo.health == 1) { + if ((this->actor.xzDistToPlayer < 200.0f && this->actor.yDistToPlayer < 40.0f) && + !func_800EE29C(globalCtx, 0x1E3)) { + func_80BCF468(this); + } + if ((gSaveContext.sceneSetupIndex == 0 && globalCtx->csCtx.unk_12 == 0) && + (globalCtx->csCtx.frames == 20 || globalCtx->csCtx.frames == 60)) { + Audio_PlayActorSound2(&this->actor, NA_SE_EN_HALF_REDEAD_SURPRISE); + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF4AC.asm") +void func_80BCF468(EnHg* this) { + func_800BDC5C(&this->skelAnime, sAnimations, 1); + this->actionFunc = func_80BCF4AC; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF5F0.asm") +void func_80BCF4AC(EnHg* this, GlobalContext* globalCtx) { + Player* player = PLAYER; + s32 pad; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF634.asm") + this->actor.speedXZ = 1.6f; + if (!(player->stateFlags2 & 0x08000000) && !func_80152498(&globalCtx->msgCtx)) { + if (((this->skelAnime.animCurrentFrame > 9.0f) && (this->skelAnime.animCurrentFrame < 16.0f)) || + (this->skelAnime.animCurrentFrame > 44.0f) && (this->skelAnime.animCurrentFrame < 51.0f)) { + Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor); + Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x3E8, 0x14); + this->actor.world.rot.y = this->actor.shape.rot.y; + } + if ((Math_Vec3f_DistXZ(&this->actor.world.pos, &this->actor.home.pos) > 200.0f) && + (Math_Vec3f_DistXZ(&player->actor.world.pos, &this->actor.home.pos) > 200.0f)) { + func_80BCF5F0(this); + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF68C.asm") +void func_80BCF5F0(EnHg* this) { + func_800BDC5C(&this->skelAnime, sAnimations, 0); + this->actionFunc = func_80BCF634; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF6D0.asm") +void func_80BCF634(EnHg* this, GlobalContext* globalCtx) { + Player* player = PLAYER; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF710.asm") + if (Math_Vec3f_DistXZ(&player->actor.world.pos, &this->actor.home.pos) < 200.0f) { + func_80BCF468(this); + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF778.asm") +void func_80BCF68C(EnHg* this) { + func_800BDC5C(&this->skelAnime, sAnimations, 2); + this->actionFunc = func_80BCF6D0; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF7D8.asm") +void func_80BCF6D0(EnHg* this, GlobalContext* globalCtx) { + if (func_801378B8(&this->skelAnime, this->skelAnime.animFrameCount)) { + func_80BCF5F0(this); + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF88C.asm") +void func_80BCF710(EnHg* this, GlobalContext* globalCtx) { + if (!func_80152498(&globalCtx->msgCtx)) { + if (func_800B84D0(&this->actor, globalCtx)) { + func_801518B0(globalCtx, 0x24F, &this->actor); + } else { + func_800B8614(&this->actor, globalCtx, 80.0f); + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF8A0.asm") +void func_80BCF778(EnHg* this, GlobalContext* globalCtx) { + if (this->actor.colChkInfo.health == 1) { + if (this->actionFunc == func_80BCF4AC || this->actionFunc == func_80BCF6D0 || + this->actionFunc == func_80BCF634) { + func_800B9010(&this->actor, 0x32B7); + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF93C.asm") +void func_80BCF7D8(EnHg* this, GlobalContext* globalCtx) { + if (this->actor.colChkInfo.health) { + if (this->collider.base.acFlags & AC_HIT) { + this->collider.base.acFlags &= ~AC_HIT; + func_80BCF68C(this); + } + Collider_UpdateCylinder(&this->actor, &this->collider); + CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); + if (this->actionFunc != func_80BCF6D0 && this->actionFunc != func_80BCF8A0 && + this->actionFunc != func_80BCF95C) { + CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCF95C.asm") +void func_80BCF88C(EnHg* this) { + this->actionFunc = func_80BCF8A0; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCFC0C.asm") +void func_80BCF8A0(EnHg* this, GlobalContext* globalCtx) { + if (ActorCutscene_GetCanPlayNext(this->cutscenes[this->unk218])) { + ActorCutscene_Start(this->cutscenes[this->unk218], &this->actor); + func_80BCF93C(this); + } else { + if (ActorCutscene_GetCurrentIndex() == 0x7C) { + ActorCutscene_Stop(0x7C); + } + ActorCutscene_SetIntentToPlay(this->cutscenes[this->unk218]); + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/EnHg_Update.asm") +void func_80BCF93C(EnHg* this) { + this->cutscenes[3] = 0x63; + this->cutscenes[2] = 0; + this->actionFunc = func_80BCF95C; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCFE54.asm") +void func_80BCF95C(EnHg* this, GlobalContext* globalCtx) { + if (func_800EE29C(globalCtx, 0x1E4)) { + u32 actionIndex = func_800EE200(globalCtx, 0x1E4); + if (this->cutscenes[3] != globalCtx->csCtx.npcActions[actionIndex]->unk0) { + this->cutscenes[3] = globalCtx->csCtx.npcActions[actionIndex]->unk0; + switch (globalCtx->csCtx.npcActions[actionIndex]->unk0) { + case 1: + this->currentAnimation = NULL; + func_800BDC5C(&this->skelAnime, sAnimations, 0); + break; + case 2: + this->cutscenes[2] = 0; + this->currentAnimation = 3; + func_800BDC5C(&this->skelAnime, sAnimations, 3); + break; + case 3: + this->cutscenes[2] = 0; + this->currentAnimation = 5; + func_800BDC5C(&this->skelAnime, sAnimations, 5); + break; + case 4: + this->cutscenes[2] = 0; + this->currentAnimation = 7; + if ((this->unk218 == 1) || (this->unk218 == 3)) { + func_8019F128(NA_SE_EN_HALF_REDEAD_TRANS); + } + func_800BDC5C(&this->skelAnime, sAnimations, 7); + break; + case 5: + this->currentAnimation = 1; + func_800BDC5C(&this->skelAnime, sAnimations, 1); + break; + case 6: + gSaveContext.weekEventReg[0x4B] |= 0x20; + Actor_MarkForDeath(&this->actor); + break; + } + } else { + if (func_801378B8(&this->skelAnime, this->skelAnime.animFrameCount)) { + switch (this->currentAnimation) { + case 3: + this->currentAnimation = 4; + func_800BDC5C(&this->skelAnime, sAnimations, 4); + break; + case 5: + this->currentAnimation = 6; + func_800BDC5C(&this->skelAnime, sAnimations, 6); + break; + } + } + } + switch (this->currentAnimation) { + case 3: + case 4: + func_800B9010(&this->actor, NA_SE_EN_HALF_REDEAD_LOOP - SFX_FLAG); + break; + case 5: + case 6: + func_800B9010(&this->actor, NA_SE_EN_HALF_REDEAD_SCREAME - SFX_FLAG); + break; + case 7: + if ((this->unk218 == 0) || (this->unk218 == 2)) { + func_800B9010(&this->actor, NA_SE_EN_HALF_REDEAD_SCREAME - SFX_FLAG); + } + break; + } + func_800EDF24(&this->actor, globalCtx, actionIndex); + return; + } else if (globalCtx->csCtx.state == 0) { + func_80BCF354(this); + } + this->cutscenes[3] = 0x63; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/func_80BCFE70.asm") +void func_80BCFC0C(EnHg* this, GlobalContext* globalCtx) { + Player* player = PLAYER; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Hg_0x80BCF1D0/EnHg_Draw.asm") + if (this->actor.colChkInfo.health == 1 && !(fabsf(this->actor.yDistToPlayer) >= 80.0f)) { + if (player->stateFlags2 & 0x08000000) { + if (!D_80BD00C8) { + play_sound(NA_SE_SY_TRE_BOX_APPEAR); + } + D_80BD00C8 = true; + } else { + D_80BD00C8 = false; + } + if (globalCtx->msgCtx.unk1202A == 3) { + if (globalCtx->msgCtx.unk1202E == 7 && gSaveContext.playerForm == PLAYER_FORM_HUMAN) { + if (INV_CONTENT(0x41) == 0x41) { + this->unk218 = 3; + } else { + this->unk218 = 1; + } + func_80BCF88C(this); + } + } else { + if (this->actor.xzDistToPlayer < 60.0f && fabsf(this->actor.yDistToPlayer) < 40.0f) { + if ((this->actionFunc != func_80BCF8A0) && (this->actionFunc != func_80BCF95C)) { + if (!(gSaveContext.weekEventReg[0x3D] & 2)) { + gSaveContext.weekEventReg[0x3D] |= 2; + this->unk218 = 0; + } else { + this->unk218 = 2; + } + func_80BCF88C(this); + return; + } + } + func_80BCF710(this, globalCtx); + } + } +} + +void EnHg_Update(Actor* thisx, GlobalContext* globalCtx) { + EnHg* this = THIS; + + this->actionFunc(this, globalCtx); + SkelAnime_FrameUpdateMatrix(&this->skelAnime); + func_80BCF7D8(this, globalCtx); + func_80BCFC0C(this, globalCtx); + Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 30.0f, 25.0f, 0.0f, 5); + func_80BCF778(this, globalCtx); +} + +s32 EnHg_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { + return 0; +} + +void EnHg_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { + EnHg* this = THIS; + if (limbIndex == HG_LIMB_HEAD) { + SysMatrix_CopyCurrentState(&this->unk1D8); + } else if (limbIndex == HG_LIMB_PELVIS) { + SysMatrix_GetStateTranslation(&this->actor.focus.pos); + } +} + +void EnHg_Draw(Actor* thisx, GlobalContext* globalCtx) { + EnHg* this = THIS; + + OPEN_DISPS(globalCtx->state.gfxCtx); + func_8012C28C(globalCtx->state.gfxCtx); + SkelAnime_DrawSV(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, this->skelAnime.dListCount, + EnHg_OverrideLimbDraw, EnHg_PostLimbDraw, &this->actor); + SysMatrix_SetCurrentState(&this->unk1D8); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, D_06005E28); + CLOSE_DISPS(globalCtx->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_En_Hg/z_en_hg.h b/src/overlays/actors/ovl_En_Hg/z_en_hg.h index 6e537e7731..6fde574161 100644 --- a/src/overlays/actors/ovl_En_Hg/z_en_hg.h +++ b/src/overlays/actors/ovl_En_Hg/z_en_hg.h @@ -5,9 +5,43 @@ struct EnHg; +typedef void (*EnHgActionFunc)(struct EnHg*, GlobalContext*); + +typedef enum { + /* 00 */ HG_LIMB_NONE, + /* 01 */ HG_LIMB_ABDOMEN, + /* 02 */ HG_LIMB_CHEST, + /* 03 */ HG_LIMB_SHOULDER_LEFT, + /* 04 */ HG_LIMB_ARM_LEFT, + /* 05 */ HG_LIMB_HAND_LEFT, + /* 06 */ HG_LIMB_SHOULDER_RIGHT, + /* 07 */ HG_LIMB_ARM_RIGHT, + /* 08 */ HG_LIMB_HAND_RIGHT, + /* 09 */ HG_LIMB_EYEBROW, + /* 10 */ HG_LIMB_HEAD, + /* 11 */ HG_LIMB_PELVIS, + /* 12 */ HG_LIMB_THIGH_LEFT, + /* 13 */ HG_LIMB_LEG_LEFT, + /* 14 */ HG_LIMB_FOOT_LEFT, + /* 15 */ HG_LIMB_THIGH_RIGHT, + /* 16 */ HG_LIMB_LEG_RIGHT, + /* 17 */ HG_LIMB_FOOT_RIGHT, + /* 19 */ HG_LIMB_UNK, + /* 20 */ HG_LIMB_MAX, +} ObjectHgLimbs; + typedef struct EnHg { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x1D4]; + /* 0x144 */ ColliderCylinder collider; + /* 0x190 */ SkelAnime skelAnime; + /* 0x1D4 */ EnHgActionFunc actionFunc; + /* 0x1D8 */ MtxF unk1D8; + /* 0x218 */ s32 unk218; + /* 0x21C */ s32 currentAnimation; + /* 0x220 */ Vec3s limbDrawTbl[HG_LIMB_MAX]; + /* 0x292 */ Vec3s transitionDrawTbl[HG_LIMB_MAX]; + /* 0x304 */ UNK_TYPE1 pad304[0xC]; + /* 0x310 */ u16 cutscenes[4]; } EnHg; // size = 0x318 extern const ActorInit En_Hg_InitVars; diff --git a/tables/functions.txt b/tables/functions.txt index 917600fdd0..1137a7f2f0 100644 --- a/tables/functions.txt +++ b/tables/functions.txt @@ -15702,8 +15702,8 @@ 0x80BCF95C:("func_80BCF95C",), 0x80BCFC0C:("func_80BCFC0C",), 0x80BCFDC4:("EnHg_Update",), - 0x80BCFE54:("func_80BCFE54",), - 0x80BCFE70:("func_80BCFE70",), + 0x80BCFE54:("EnHg_OverrideLimbDraw",), + 0x80BCFE70:("EnHg_PostLimbDraw",), 0x80BCFEC4:("EnHg_Draw",), 0x80BD02B0:("EnHgo_Init",), 0x80BD03C0:("EnHgo_Destroy",),