* En_Ah

* PR
This commit is contained in:
Maide 2022-03-25 01:17:07 +00:00 committed by GitHub
parent 0a8fd53273
commit 20fed85f67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 580 additions and 47 deletions

3
spec
View File

@ -4685,8 +4685,7 @@ beginseg
name "ovl_En_Ah"
compress
include "build/src/overlays/actors/ovl_En_Ah/z_en_ah.o"
include "build/data/ovl_En_Ah/ovl_En_Ah.data.o"
include "build/data/ovl_En_Ah/ovl_En_Ah.reloc.o"
include "build/src/overlays/actors/ovl_En_Ah/ovl_En_Ah_reloc.o"
endseg
beginseg

View File

@ -5,6 +5,7 @@
*/
#include "z_en_ah.h"
#include "objects/object_ah/object_ah.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
@ -18,7 +19,19 @@ void EnAh_Draw(Actor* thisx, GlobalContext* globalCtx);
void func_80BD36B8(EnAh* this, GlobalContext* globalCtx);
void func_80BD3768(EnAh* this, GlobalContext* globalCtx);
#if 0
s32 D_80BD3DB0[] = {
0x0A00611D, 0x0C000303, 0x0400010C, 0x00021102, 0x15001700, 0x08003220, 0x03040001,
0x05040003, 0x050A0010, 0x120C0003, 0x0D021200, 0x06000105, 0x0E120006, 0x00020505,
};
s32 D_80BD3DE8[] = { 0x0E28FF0C, 0x10000000 };
s32 D_80BD3DF0[] = { 0x0E29000C, 0x10000000 };
s32 D_80BD3DF8[] = { 0x00330100, 0x050E28FE, 0x0C100E28, -0x03F3F000 };
s32 D_80BD3E08[] = { 0x0E28FD0C, 0x0F29540C, 0x10000000 };
const ActorInit En_Ah_InitVars = {
ACTOR_EN_AH,
ACTORCAT_NPC,
@ -31,75 +44,576 @@ const ActorInit En_Ah_InitVars = {
(ActorFunc)EnAh_Draw,
};
// static ColliderCylinderInit sCylinderInit = {
static ColliderCylinderInit D_80BD3E34 = {
{ COLTYPE_HIT1, AT_NONE, AC_NONE, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
{ ELEMTYPE_UNK1, { 0x00000000, 0x00, 0x00 }, { 0x00000000, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_ON, },
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_HIT1,
AT_NONE,
AC_NONE,
OC1_ON | OC1_TYPE_ALL,
OC2_TYPE_1,
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK1,
{ 0x00000000, 0x00, 0x00 },
{ 0x00000000, 0x00, 0x00 },
TOUCH_NONE | TOUCH_SFX_NORMAL,
BUMP_NONE,
OCELEM_ON,
},
{ 10, 68, 0, { 0, 0, 0 } },
};
// sColChkInfoInit
static CollisionCheckInfoInit2 D_80BD3E60 = { 0, 0, 0, 0, MASS_IMMOVABLE };
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
#endif
static AnimationInfoS sAnimations[] = {
{ &object_ah_Anim_001860, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_ah_Anim_001860, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &object_ah_Anim_002280, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_ah_Anim_000968, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &object_ah_Anim_000DDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
};
extern ColliderCylinderInit D_80BD3E34;
extern CollisionCheckInfoInit2 D_80BD3E60;
s16 D_80BD3EBC[] = { 0, 0, 1, 0 };
extern UNK_TYPE D_06009E70;
PosRot D_80BD3EC4 = { { 100.0f, 0.0f, 67.0f }, { 0, 0x349C, 0 } };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD2A30.s")
PosRot D_80BD3ED8 = { { 855.0f, 260.0f, 31.0f }, { 0, 0x7FF8, 0 } };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD2AE0.s")
PosRot D_80BD3EEC = { { -395.0f, 210.0f, -162.0f }, { 0, 0xBE98, 0 } };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD2B0C.s")
Vec3f D_80BD3F00 = { 1000.0f, 0.0f, 0.0f };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD2BA4.s")
TexturePtr D_80BD3F0C[] = { object_ah_Tex_008D70, object_ah_Tex_009570 };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD2BE8.s")
TexturePtr D_80BD3F14[] = {
object_ah_Tex_006D70, object_ah_Tex_007570, object_ah_Tex_007D70, object_ah_Tex_007570, object_ah_Tex_008570,
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD2C6C.s")
s32 func_80BD2A30(EnAh* this, GlobalContext* globalCtx, u8 actorCat, s16 actorId) {
Actor* tempActor;
Actor* foundActor = NULL;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD2DA0.s")
while (true) {
foundActor = SubS_FindActor(globalCtx, foundActor, actorCat, actorId);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD2DC8.s")
if ((foundActor == NULL) || (((EnAh*)foundActor != this) && (foundActor->update != NULL))) {
break;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD2FD0.s")
tempActor = foundActor->next;
if (tempActor == NULL) {
foundActor = NULL;
break;
}
foundActor = tempActor;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD30C0.s")
return foundActor;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD3118.s")
void func_80BD2AE0(EnAh* this) {
this->skelAnime.playSpeed = this->unk_2DC;
SkelAnime_Update(&this->skelAnime);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD3198.s")
s32 func_80BD2B0C(EnAh* this, s32 arg1) {
s32 phi_v1 = false;
s32 ret = false;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD3294.s")
if ((arg1 == 0) || (arg1 == 1)) {
if ((this->unk_300 != 0) && (this->unk_300 != 1)) {
phi_v1 = true;
}
} else if (arg1 != this->unk_300) {
phi_v1 = true;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD3320.s")
if (phi_v1) {
this->unk_300 = arg1;
ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, arg1);
this->unk_2DC = this->skelAnime.playSpeed;
}
return ret;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD3374.s")
void func_80BD2BA4(EnAh* this, GlobalContext* globalCtx) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD33FC.s")
s32 func_80BD2BE8(EnAh* this, GlobalContext* globalCtx) {
s32 ret = false;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD3484.s")
if (this->unk_2D8 & 7) {
if (Actor_ProcessTalkRequest(&this->actor, &globalCtx->state)) {
SubS_UpdateFlags(&this->unk_2D8, 0, 7);
ret = true;
this->unk_2D8 |= 8;
this->actionFunc = func_80BD3768;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD3548.s")
return ret;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD35BC.s")
void func_80BD2C6C(EnAh* this) {
s32 phi_a3 = false;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD3658.s")
if (this->unk_2D8 & 0x40) {
if (DECR(this->unk_2F8) == 0) {
switch (this->unk_2F6) {
case 1:
case 2:
if ((this->unk_2FA == 4) || (this->unk_2FA == 2)) {
phi_a3 = true;
this->unk_2FA = 4;
}
break;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD36B8.s")
if (!phi_a3 && (this->unk_2FA == 4)) {
this->unk_2FA = 0;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD3768.s")
if (!phi_a3) {
this->unk_2FA++;
if (this->unk_2FA >= 4) {
if (this->unk_2F6 == 0) {
this->unk_2F8 = Rand_S16Offset(30, 30);
} else {
this->unk_2F8 = 8;
}
this->unk_2FA = 0;
phi_a3 = true;
}
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/EnAh_Init.s")
if (phi_a3 == true) {
this->unk_2FC = D_80BD3EBC[this->unk_2F6];
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/EnAh_Destroy.s")
Actor* func_80BD2DA0(EnAh* this, GlobalContext* globalCtx) {
Actor* actor;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/EnAh_Update.s")
if (this->unk_1DC == 3) {
actor = this->actor.child;
} else {
actor = &GET_PLAYER(globalCtx)->actor;
}
return actor;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD3AA8.s")
void func_80BD2DC8(EnAh* this) {
s32 pad;
Vec3f sp40;
Vec3f sp34;
s16 sp32;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/func_80BD3AF8.s")
Math_Vec3f_Copy(&sp40, &this->unk_1E4->world.pos);
Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ah/EnAh_Draw.s")
sp32 = Math_Vec3f_Yaw(&sp34, &sp40);
Math_ApproachS(&this->unk_2EE, (sp32 - this->unk_2F2) - this->actor.shape.rot.y, 4, 0x2AA8);
this->unk_2EE = CLAMP(this->unk_2EE, -0x1FFE, 0x1FFE);
Math_ApproachS(&this->unk_2F2, (sp32 - this->unk_2EE) - this->actor.shape.rot.y, 4, 0x2AA8);
this->unk_2F2 = CLAMP(this->unk_2F2, -0x1C70, 0x1C70);
Math_Vec3f_Copy(&sp34, &this->actor.focus.pos);
if (this->unk_1E4->id == ACTOR_PLAYER) {
sp40.y = ((Player*)this->unk_1E4)->bodyPartsPos[7].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_1E4->focus.pos);
}
Math_ApproachS(&this->unk_2EC, Math_Vec3f_Pitch(&sp34, &sp40) - this->unk_2F0, 4, 0x2AA8);
this->unk_2EC = CLAMP(this->unk_2EC, -0x1554, 0x1554);
Math_ApproachS(&this->unk_2F0, Math_Vec3f_Pitch(&sp34, &sp40) - this->unk_2EC, 4, 0x2AA8);
this->unk_2F0 = CLAMP(this->unk_2F0, -0xE38, 0xE38);
}
void func_80BD2FD0(EnAh* this, GlobalContext* globalCtx) {
this->unk_1E4 = func_80BD2DA0(this, globalCtx);
if ((this->unk_2D8 & 8) && (this->unk_1E4 != NULL)) {
if (DECR(this->unk_2F4) == 0) {
func_80BD2DC8(this);
this->unk_2F0 = 0;
this->unk_2F2 = 0;
this->unk_2D8 &= ~0x80;
this->unk_2D8 |= 0x20;
return;
}
}
if (this->unk_2D8 & 0x20) {
this->unk_2D8 &= ~0x20;
this->unk_2EC = 0;
this->unk_2EE = 0;
this->unk_2F0 = 0;
this->unk_2F2 = 0;
this->unk_2F4 = 20;
} else if (DECR(this->unk_2F4) == 0) {
this->unk_2D8 |= 0x80;
}
}
s32 func_80BD30C0(EnAh* this, GlobalContext* globalCtx) {
switch (this->unk_1DC) {
case 1:
func_80BD2B0C(this, 0);
break;
case 2:
func_80BD2B0C(this, 4);
break;
}
return false;
}
void func_80BD3118(EnAh* this, GlobalContext* globalCtx) {
if (this->unk_2FE == 0) {
func_80BD2B0C(this, 2);
this->unk_2FE++;
} else if ((this->unk_2FE == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
func_80BD2B0C(this, 3);
this->unk_2FE++;
}
}
s32 func_80BD3198(EnAh* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
u16 temp = globalCtx->msgCtx.unk11F04;
if (player->stateFlags1 & 0x40) {
if (this->unk_2DA != temp) {
if (temp == 0x2954) {
this->unk_18C = func_80BD3118;
this->unk_2FE = 0;
}
switch (temp) {
case 0x28FD:
this->unk_2F6 = 1;
this->unk_2F8 = 8;
break;
case 0x2954:
this->unk_2F6 = 2;
this->unk_2F8 = 8;
break;
}
}
this->unk_2DA = temp;
this->unk_2D8 |= 0x100;
} else if (this->unk_2D8 & 0x100) {
this->unk_18C = NULL;
this->unk_2DA = 0;
this->unk_2D8 &= ~0x100;
this->unk_2F6 = 0;
this->unk_2F8 = 4;
func_80BD30C0(this, globalCtx);
}
if (this->unk_18C != NULL) {
this->unk_18C(this, globalCtx);
}
return false;
}
s32* func_80BD3294(EnAh* this, GlobalContext* globalCtx) {
s32 mask = Player_GetMask(globalCtx);
if (PLAYER_MASK_KAFEIS_MASK == mask) {
return D_80BD3E08;
}
switch (this->unk_1DC) {
case 1:
if (gSaveContext.day == 2) {
return D_80BD3DF0;
}
return D_80BD3DE8;
case 2:
return D_80BD3DF8;
}
return NULL;
}
s32 func_80BD3320(EnAh* this, GlobalContext* globalCtx, u8 actorCat, s16 actorId) {
s32 pad;
s32 ret = false;
Actor* temp_v0 = func_80BD2A30(this, globalCtx, actorCat, actorId);
if (temp_v0 != NULL) {
this->actor.child = temp_v0;
ret = true;
}
return ret;
}
s32 func_80BD3374(EnAh* this, GlobalContext* globalCtx, struct_80133038_arg2* arg2) {
s32 pad;
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BD3EC4.pos);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80BD3EC4.rot);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
func_80BD2B0C(this, 0);
SubS_UpdateFlags(&this->unk_2D8, 3, 7);
this->unk_2D8 |= 0x40;
return true;
}
s32 func_80BD33FC(EnAh* this, GlobalContext* globalCtx, struct_80133038_arg2* arg2) {
s32 pad;
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BD3ED8.pos);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80BD3ED8.rot);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
func_80BD2B0C(this, 4);
SubS_UpdateFlags(&this->unk_2D8, 3, 7);
this->unk_2D8 |= (0x40 | 0x10);
return true;
}
s32 func_80BD3484(EnAh* this, GlobalContext* globalCtx, struct_80133038_arg2* arg2) {
s32 ret = false;
if (func_80BD3320(this, globalCtx, ACTORCAT_NPC, ACTOR_EN_AN)) {
if (sREG(81) == 0) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BD3EEC.pos);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80BD3EEC.rot);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
}
func_80BD2B0C(this, 4);
this->unk_2D8 |= (0x40 | 0x8);
this->unk_2D8 |= 0x10;
this->unk_2D8 |= 0x80;
this->actor.gravity = 0.0f;
ret = true;
}
return ret;
}
s32 func_80BD3548(EnAh* this, GlobalContext* globalCtx, struct_80133038_arg2* arg2) {
s32 ret;
this->unk_2D8 = 0;
switch (arg2->unk0) {
default:
ret = false;
break;
case 1:
ret = func_80BD3374(this, globalCtx, arg2);
break;
case 2:
ret = func_80BD33FC(this, globalCtx, arg2);
break;
case 3:
ret = func_80BD3484(this, globalCtx, arg2);
break;
}
return ret;
}
s32 func_80BD35BC(EnAh* this, GlobalContext* globalCtx) {
s16 temp;
s16 temp2;
switch (this->unk_1DC) {
default:
return false;
case 2:
temp = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
temp2 = ABS_ALT(temp);
if (temp2 < 0x3800) {
SubS_UpdateFlags(&this->unk_2D8, 3, 7);
} else {
SubS_UpdateFlags(&this->unk_2D8, 0, 7);
}
return false;
}
}
void func_80BD3658(EnAh* this, GlobalContext* globalCtx) {
if ((this->unk_1DC == 1) || (this->unk_1DC == 2) || (this->unk_1DC == 3)) {
func_80BD35BC(this, globalCtx);
}
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x2AA8);
}
void func_80BD36B8(EnAh* this, GlobalContext* globalCtx) {
s32 pad;
struct_80133038_arg2 sp18;
if (!func_80133038(globalCtx, D_80BD3DB0, &sp18) ||
((this->unk_1DC != sp18.unk0) && !func_80BD3548(this, globalCtx, &sp18))) {
this->actor.shape.shadowDraw = NULL;
this->actor.flags &= ~ACTOR_FLAG_1;
sp18.unk0 = 0;
} else {
this->actor.shape.shadowDraw = ActorShadow_DrawCircle;
this->actor.flags |= ACTOR_FLAG_1;
}
this->unk_1DC = sp18.unk0;
func_80BD3658(this, globalCtx);
}
void func_80BD3768(EnAh* this, GlobalContext* globalCtx) {
s32 pad;
Vec3f sp40;
Vec3f sp34;
if (func_8010BF58(&this->actor, globalCtx, func_80BD3294(this, globalCtx), NULL, &this->unk_1E0)) {
SubS_UpdateFlags(&this->unk_2D8, 3, 7);
this->unk_2D8 &= ~8;
this->unk_2D8 |= 0x80;
this->unk_2F4 = 20;
this->unk_1E0 = 0;
this->actionFunc = func_80BD36B8;
} else if (this->unk_1DC != 2) {
if (this->unk_1E4 != NULL) {
Math_Vec3f_Copy(&sp40, &this->unk_1E4->world.pos);
Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
Math_ApproachS(&this->actor.shape.rot.y, Math_Vec3f_Yaw(&sp34, &sp40), 4, 0x2AA8);
}
}
}
void EnAh_Init(Actor* thisx, GlobalContext* globalCtx) {
EnAh* this = THIS;
if (func_80BD2A30(this, globalCtx, ACTORCAT_NPC, ACTOR_EN_AH)) {
Actor_MarkForDeath(&this->actor);
return;
}
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_ah_Skel_009E70, NULL, this->jointTable, this->morphTable,
17);
this->unk_300 = -1;
func_80BD2B0C(this, 0);
Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
this->actor.targetMode = 6;
Actor_SetScale(&this->actor, 0.01f);
this->unk_1DC = 0;
this->unk_2D8 = 0;
this->actionFunc = func_80BD36B8;
this->actionFunc(this, globalCtx);
}
void EnAh_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnAh* this = THIS;
Collider_DestroyCylinder(globalCtx, &this->collider);
}
void EnAh_Update(Actor* thisx, GlobalContext* globalCtx) {
EnAh* this = THIS;
f32 radius;
f32 height;
func_80BD2BE8(this, globalCtx);
this->actionFunc(this, globalCtx);
if (this->unk_1DC != 0) {
func_80BD3198(this, globalCtx);
func_80BD2AE0(this);
func_80BD2C6C(this);
func_80BD2FD0(this, globalCtx);
radius = this->collider.dim.radius + 60;
height = this->collider.dim.height + 10;
func_8013C964(&this->actor, globalCtx, radius, height, 0, this->unk_2D8 & 7);
if (!(this->unk_2D8 & 0x10)) {
Actor_MoveWithGravity(&this->actor);
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 30.0f, 12.0f, 0.0f, 4);
}
func_80BD2BA4(this, globalCtx);
}
}
void func_80BD3AA8(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnAh* this = THIS;
if (limbIndex == 7) {
Matrix_MultiplyVector3fByState(&D_80BD3F00, &this->actor.focus.pos);
Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
}
}
void func_80BD3AF8(GlobalContext* globalCtx, s32 limbIndex, Actor* thisx) {
EnAh* this = THIS;
s32 phi_v1;
s32 phi_v0;
if (!(this->unk_2D8 & 0x80)) {
if (this->unk_2D8 & 0x20) {
phi_v0 = 1;
} else {
phi_v0 = 0;
}
phi_v1 = 1;
} else {
phi_v1 = 0;
phi_v0 = 0;
}
if (limbIndex == 7) {
func_8013AD9C(BINANG_ADD(this->unk_2EC + this->unk_2F0, 0x4000),
BINANG_ADD(this->unk_2EE + this->unk_2F2 + this->actor.shape.rot.y, 0x4000), this->unk_1E8,
this->unk_200, phi_v1, phi_v0);
Matrix_StatePop();
Matrix_InsertTranslation(this->unk_1E8[0].x, this->unk_1E8[0].y, this->unk_1E8[0].z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
Matrix_RotateY(this->unk_200[0].y, MTXMODE_APPLY);
Matrix_InsertXRotation_s(this->unk_200[0].x, MTXMODE_APPLY);
Matrix_InsertZRotation_s(this->unk_200[0].z, MTXMODE_APPLY);
Matrix_StatePush();
} else if (limbIndex == 2) {
func_8013AD9C(BINANG_ADD(this->unk_2F0, 0x4000), BINANG_ADD(this->unk_2F2 + this->actor.shape.rot.y, 0x4000),
&this->unk_1E8[1], &this->unk_200[1], phi_v1, phi_v0);
Matrix_StatePop();
Matrix_InsertTranslation(this->unk_1E8[1].x, this->unk_1E8[1].y, this->unk_1E8[1].z, MTXMODE_NEW);
Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY);
Matrix_RotateY(this->unk_200[1].y, MTXMODE_APPLY);
Matrix_InsertXRotation_s(this->unk_200[1].x, MTXMODE_APPLY);
Matrix_InsertZRotation_s(this->unk_200[1].z, MTXMODE_APPLY);
Matrix_StatePush();
}
}
void EnAh_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnAh* this = THIS;
if (this->unk_1DC != 0) {
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BD3F14[this->unk_2FA]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80BD3F0C[this->unk_2FC]));
SkelAnime_DrawTransformFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, func_80BD3AA8, func_80BD3AF8, &this->actor);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
}

View File

@ -6,12 +6,36 @@
struct EnAh;
typedef void (*EnAhActionFunc)(struct EnAh*, GlobalContext*);
typedef void (*EnAhUnkFunc)(struct EnAh*, GlobalContext*);
typedef struct EnAh {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x44];
/* 0x0144 */ SkelAnime skelAnime;
/* 0x0188 */ EnAhActionFunc actionFunc;
/* 0x018C */ char unk_18C[0x178];
/* 0x018C */ EnAhUnkFunc unk_18C;
/* 0x0190 */ ColliderCylinder collider;
/* 0x01DC */ u8 unk_1DC;
/* 0x01E0 */ s32 unk_1E0;
/* 0x01E4 */ Actor* unk_1E4;
/* 0x01E8 */ Vec3f unk_1E8[2];
/* 0x0200 */ Vec3s unk_200[2];
/* 0x020C */ Vec3s jointTable[17];
/* 0x0272 */ Vec3s morphTable[17];
/* 0x02D8 */ u16 unk_2D8;
/* 0x02DA */ u16 unk_2DA;
/* 0x02DC */ f32 unk_2DC;
/* 0x02E0 */ UNK_TYPE1 unk2E0[0xC];
/* 0x02EC */ s16 unk_2EC;
/* 0x02EE */ s16 unk_2EE;
/* 0x02F0 */ s16 unk_2F0;
/* 0x02F2 */ s16 unk_2F2;
/* 0x02F4 */ s16 unk_2F4;
/* 0x02F6 */ s16 unk_2F6;
/* 0x02F8 */ s16 unk_2F8;
/* 0x02FA */ s16 unk_2FA;
/* 0x02FC */ s16 unk_2FC;
/* 0x02FE */ s16 unk_2FE;
/* 0x0300 */ s32 unk_300;
} EnAh; // size = 0x304
extern const ActorInit En_Ah_InitVars;

View File

@ -1052,10 +1052,6 @@ D_06000180 = 0x06000180;
D_060002A8 = 0x060002A8;
D_06000F38 = 0x06000F38;
// ovl_En_Ah
D_06009E70 = 0x06009E70;
// ovl_En_An
D_06000308 = 0x06000308;