* En_Tab

* PR
This commit is contained in:
Maide 2022-03-05 14:16:36 +00:00 committed by GitHub
parent 888448decf
commit 1c955e56b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 593 additions and 52 deletions

View File

@ -24,9 +24,10 @@
<Texture Name="object_tab_Tex_006328" OutName="tex_006328" Format="ci8" Width="8" Height="8" Offset="0x6328" />
<Texture Name="object_tab_Tex_006368" OutName="tex_006368" Format="ci8" Width="8" Height="16" Offset="0x6368" />
<Texture Name="object_tab_Tex_0063E8" OutName="tex_0063E8" Format="ci8" Width="8" Height="8" Offset="0x63E8" />
<!-- <Blob Name="object_tab_Blob_006428" Size="0x400" Offset="0x6428" /> -->
<Texture Name="object_tab_Tex_006428" OutName="tex_006428" Format="ci8" Width="32" Height="32" Offset="0x6428" />
<Texture Name="object_tab_Tex_006828" OutName="tex_006828" Format="ci8" Width="16" Height="16" Offset="0x6828" />
<!-- <Blob Name="object_tab_Blob_006928" Size="0x800" Offset="0x6928" /> -->
<Texture Name="object_tab_Tex_006928" OutName="tex_006928" Format="ci8" Width="32" Height="32" Offset="0x6928" />
<Texture Name="object_tab_Tex_006D28" OutName="tex_006D28" Format="ci8" Width="32" Height="32" Offset="0x6D28" />
<Texture Name="object_tab_Tex_007128" OutName="tex_007128" Format="ci8" Width="16" Height="16" Offset="0x7128" />
<Texture Name="object_tab_Tex_007228" OutName="tex_007228" Format="ci8" Width="16" Height="16" Offset="0x7228" />
<Texture Name="object_tab_Tex_007328" OutName="tex_007328" Format="i8" Width="32" Height="32" Offset="0x7328" />

3
spec
View File

@ -4832,8 +4832,7 @@ beginseg
name "ovl_En_Tab"
compress
include "build/src/overlays/actors/ovl_En_Tab/z_en_tab.o"
include "build/data/ovl_En_Tab/ovl_En_Tab.data.o"
include "build/data/ovl_En_Tab/ovl_En_Tab.reloc.o"
include "build/src/overlays/actors/ovl_En_Tab/ovl_En_Tab_reloc.o"
endseg
beginseg

View File

@ -5,6 +5,8 @@
*/
#include "z_en_tab.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_tab/object_tab.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20)
@ -18,7 +20,39 @@ void EnTab_Draw(Actor* thisx, GlobalContext* globalCtx);
void func_80BE127C(EnTab* this, GlobalContext* globalCtx);
void func_80BE1348(EnTab* this, GlobalContext* globalCtx);
#if 0
s32 D_80BE18D0[] = {
0x0C000320, 0x0A00151B, 0x02093212, 0x010F0212, 0x00060003, 0x0400000E, 0x12000600, 0x020E0932, 0x12010105,
0x0A001519, 0x02093215, 0x050D0215, 0x37050501, 0x050E1537, 0x0505020E, 0x09321505, 0x01050000,
};
s32 D_80BE1914[] = {
0x003A0200, 0x080E2AF9, 0x0C113A02, 0x100E2AFA, 0x0C150900, 0x000E2AFB,
0x0C003401, 0x00090F2A, 0xFD0C0F2A, 0xFE0C100F, 0x2AFC0C10,
};
s32 D_80BE1940[] = {
0x003F0400, 0x080E2B3D, 0x0C113F04, 0x100E2B3E, 0x0C0F2AFA, 0x0C150900,
0x000E2AFB, 0x0C003401, 0x00090F2A, 0xFD0C0F2A, 0xFE0C100F, 0x2AFC0C10,
};
s32 D_80BE1970[] = { 0x003A0100, 0x080E2AFF, 0x0C113A01, 0x100E2B00, 0x0C100000 };
s32 D_80BE1984[] = { 0x00500100, 0x080E2B3F, 0x0C115001, 0x100E2B40, 0x0C100000 };
s32 D_80BE1998[] = { 0x0E2B090C, 0x10000000 };
s32 D_80BE19A0[] = {
0x0E2B0A0C, 0x05004E00, 0x00004E30, 0x2800050E, 0x2B0E0C10, 0x0E2B0B0C, 0x05000000, 0x08001008, 0x00140026,
0x19000E08, 0x00C8000F, 0x19000631, 0x0E2B0D0C, 0x10320E2B, 0x0C0C1030, 0x1214FF38, 0x06009100, 0x00130091,
0x0C103012, 0x14FFEC06, 0x00920000, 0x1300920C, 0x10300034, 0x0100050E, 0x2B0F0C10, 0x0E2B110C, 0x10000000,
};
s32 D_80BE1A0C[] = {
0x0E2B0A0C, 0x05004E00, 0x00004E30, 0x2800050E, 0x2B0E0C10, 0x0E2B0B0C, 0x05000000, 0x08001008, 0x00140026,
0x19000E08, 0x00C8000F, 0x19000631, 0x0E2B0D0C, 0x10320E2B, 0x0C0C1030, 0x1214FF38, 0x06009100, 0x00130091,
0x0C103012, 0x14FFEC06, 0x00920000, 0x1300920C, 0x10300034, 0x0100050E, 0x2B100C10, 0x0E2B110C, 0x10000000,
};
const ActorInit En_Tab_InitVars = {
ACTOR_EN_TAB,
ACTORCAT_NPC,
@ -31,75 +65,555 @@ const ActorInit En_Tab_InitVars = {
(ActorFunc)EnTab_Draw,
};
// static ColliderCylinderInit sCylinderInit = {
static ColliderCylinderInit D_80BE1A98 = {
{ 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,
},
{ 14, 62, 0, { 0, 0, 0 } },
};
// sColChkInfoInit
static CollisionCheckInfoInit2 D_80BE1AC4 = { 0, 0, 0, 0, MASS_IMMOVABLE };
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
#endif
AnimationInfoS D_80BE1AD0[] = {
{ &object_tab_Anim_000758, 1.0f, 0, -1, 0, 0 },
{ &object_tab_Anim_0086AC, 1.0f, 0, -1, 0, 0 },
};
extern ColliderCylinderInit D_80BE1A98;
extern CollisionCheckInfoInit2 D_80BE1AC4;
Vec3f D_80BE1AF0 = { -28.0f, -8.0f, -195.0f };
extern UNK_TYPE D_06007F78;
Vec3s D_80BE1AFC = { 0, 0, 0 };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE04E0.s")
Vec3f D_80BE1B04 = { 161.0f, 0.0f, -10.0f };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE0590.s")
Vec3s D_80BE1B10 = { 0, 0xC000, 0 };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE05BC.s")
Vec3f D_80BE1B18 = { 800.0f, 0.0f, 0.0f };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE0620.s")
TexturePtr D_80BE1B24[] = {
object_tab_Tex_006428,
object_tab_Tex_006928,
object_tab_Tex_006D28,
object_tab_Tex_006928,
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE0664.s")
EnGm* func_80BE04E0(EnTab* this, GlobalContext* globalCtx, u8 actorCat, s16 actorId) {
Actor* foundActor = NULL;
Actor* tempActor;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE06DC.s")
while (true) {
foundActor = SubS_FindActor(globalCtx, foundActor, actorCat, actorId);
if ((foundActor == NULL) || (((EnTab*)foundActor != this) && (foundActor->update != NULL))) {
break;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE0778.s")
tempActor = foundActor->next;
if (tempActor == NULL) {
foundActor = NULL;
break;
}
foundActor = tempActor;
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE07A0.s")
return (EnGm*)foundActor;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE09A8.s")
void func_80BE0590(EnTab* this) {
this->skelAnime.playSpeed = this->unk_300;
SkelAnime_Update(&this->skelAnime);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE0A98.s")
s32 func_80BE05BC(EnTab* this, s32 arg1) {
s32 phi_v0 = false;
s32 ret = false;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE0C04.s")
if (arg1 != this->unk_32C) {
phi_v0 = true;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE0D38.s")
if (phi_v0) {
this->unk_32C = arg1;
ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, D_80BE1AD0, arg1);
this->unk_300 = this->skelAnime.playSpeed;
}
return ret;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE0D60.s")
void func_80BE0620(EnTab* this, GlobalContext* globalCtx) {
s32 pad;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE0E04.s")
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE0F04.s")
void func_80BE0664(EnTab* this) {
if (DECR(this->unk_31C) == 0) {
this->unk_31E++;
if (this->unk_31E > 3) {
this->unk_31C = Rand_S16Offset(30, 30);
this->unk_31E = 0;
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE0FC4.s")
s32 func_80BE06DC(EnTab* this, GlobalContext* globalCtx) {
s32 ret = false;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE1060.s")
if (this->unk_2FC & 7) {
if (Actor_ProcessTalkRequest(&this->actor, &globalCtx->state)) {
SubS_UpdateFlags(&this->unk_2FC, 0, 7);
ret = true;
this->unk_320 = 0;
this->unk_328 = NULL;
this->actor.child = &GET_PLAYER(globalCtx)->actor;
this->unk_2FC |= 8;
this->actionFunc = func_80BE1348;
}
}
return ret;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE10BC.s")
Actor* func_80BE0778(EnTab* this, GlobalContext* globalCtx) {
Actor* actor;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE1224.s")
if (this->unk_1D8 == 1) {
actor = this->actor.child;
} else {
actor = &GET_PLAYER(globalCtx)->actor;
}
return actor;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE127C.s")
void func_80BE07A0(EnTab* this) {
s32 pad;
Vec3f sp40;
Vec3f sp34;
s16 sp32;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE1348.s")
Math_Vec3f_Copy(&sp40, &this->unk_1E0->world.pos);
Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
sp32 = Math_Vec3f_Yaw(&sp34, &sp40);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/EnTab_Init.s")
Math_ApproachS(&this->unk_314, (sp32 - this->unk_318) - this->actor.shape.rot.y, 4, 0x2AA8);
this->unk_314 = CLAMP(this->unk_314, -0x1FFE, 0x1FFE);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/EnTab_Destroy.s")
Math_ApproachS(&this->unk_318, (sp32 - this->unk_314) - this->actor.shape.rot.y, 4, 0x2AA8);
this->unk_318 = CLAMP(this->unk_318, -0x1C70, 0x1C70);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/EnTab_Update.s")
Math_Vec3f_Copy(&sp34, &this->actor.focus.pos);
if (this->unk_1E0->id == ACTOR_PLAYER) {
sp40.y = ((Player*)this->unk_1E0)->bodyPartsPos[7].y + 3.0f;
} else {
Math_Vec3f_Copy(&sp40, &this->unk_1E0->focus.pos);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE1648.s")
Math_ApproachS(&this->unk_312, Math_Vec3f_Pitch(&sp34, &sp40) - this->unk_316, 4, 0x2AA8);
this->unk_312 = CLAMP(this->unk_312, -0x1554, 0x1554);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE16B4.s")
Math_ApproachS(&this->unk_316, Math_Vec3f_Pitch(&sp34, &sp40) - this->unk_312, 4, 0x2AA8);
this->unk_316 = CLAMP(this->unk_316, -0xE38, 0xE38);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/func_80BE1704.s")
void func_80BE09A8(EnTab* this, GlobalContext* globalCtx) {
this->unk_1E0 = func_80BE0778(this, globalCtx);
if ((this->unk_2FC & 8) && (this->unk_1E0 != 0) && (DECR(this->unk_324) == 0)) {
func_80BE07A0(this);
this->unk_316 = 0;
this->unk_318 = 0;
this->unk_2FC &= ~0x40;
this->unk_2FC |= 0x10;
} else if (this->unk_2FC & 0x10) {
this->unk_2FC &= ~0x10;
this->unk_312 = 0;
this->unk_314 = 0;
this->unk_316 = 0;
this->unk_318 = 0;
this->unk_324 = 20;
} else if (DECR(this->unk_324) == 0) {
this->unk_2FC |= 0x40;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Tab/EnTab_Draw.s")
void func_80BE0A98(EnTab* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
s32 sp20 = Message_GetState(&globalCtx->msgCtx);
this->unk_308 += (this->unk_304 != 0.0f) ? 40.0f : -40.0f;
this->unk_308 = CLAMP(this->unk_308, 0.0f, 80.0f);
Matrix_InsertTranslation(this->unk_308, 0.0f, 0.0f, MTXMODE_APPLY);
if ((&this->actor == player->targetActor) &&
((globalCtx->msgCtx.unk11F04 < 0xFF) || (globalCtx->msgCtx.unk11F04 > 0x200)) && (sp20 == 3) &&
(this->unk_334 == 3)) {
if ((globalCtx->state.frames % 2) == 0) {
if (this->unk_304 != 0.0f) {
this->unk_304 = 0.0f;
} else {
this->unk_304 = 1.0f;
}
}
} else {
this->unk_304 = 0.0f;
}
this->unk_334 = sp20;
}
s32 func_80BE0C04(EnTab* this, Actor* actor, f32 arg2) {
Vec3f sp44;
Vec3f sp38;
s32 ret = false;
f32 sp30;
s16 sp2E;
if (actor != NULL) {
Math_Vec3f_Copy(&sp38, &this->actor.world.pos);
Math_Vec3f_Copy(&sp44, &actor->world.pos);
sp2E = Math_Vec3f_Yaw(&sp38, &sp44);
if (this->unk_338) {
sp30 = arg2;
} else {
sp30 = arg2 * 0.5f;
}
if ((Math_Vec3f_DistXZ(&sp44, &sp38) < sp30) && (ABS_ALT(BINANG_SUB(sp2E, this->actor.shape.rot.y)) < 0x38E0)) {
ret = true;
}
if (DECR(this->unk_322) == 0) {
this->unk_338 ^= true;
this->unk_322 = Rand_S16Offset(60, 60);
}
}
return ret;
}
s32 func_80BE0D38(EnTab* this, GlobalContext* globalCtx) {
return Interface_HasEmptyBottle();
}
s32 func_80BE0D60(EnTab* this, GlobalContext* globalCtx) {
s32 pad;
s32 ret = false;
this->unk_320++;
if (this->unk_320 == 1) {
globalCtx->setPlayerTalkAnim(globalCtx, &gameplay_keep_Linkanim_00D568, 2);
} else if (this->unk_320 > 20) {
globalCtx->setPlayerTalkAnim(globalCtx, NULL, 0);
this->unk_320 = 0;
ret = true;
}
return ret;
}
s32* func_80BE0E04(EnTab* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
if (player->transformation == PLAYER_FORM_DEKU) {
return D_80BE1984;
}
switch (this->unk_1D8) {
case 2:
this->unk_328 = func_80BE0D38;
if (Player_GetMask(globalCtx) != PLAYER_MASK_ROMANI) {
return D_80BE1998;
}
if (gSaveContext.day == 3) {
return D_80BE1A0C;
}
return D_80BE19A0;
case 1:
this->unk_328 = func_80BE0D60;
if (Player_GetMask(globalCtx) == PLAYER_MASK_ROMANI) {
return D_80BE1940;
}
if (Player_GetMask(globalCtx) == PLAYER_MASK_KAFEIS_MASK) {
return D_80BE1970;
}
return D_80BE1914;
}
return NULL;
}
s32 func_80BE0F04(EnTab* this, GlobalContext* globalCtx, struct_80133038_arg2* arg2) {
s32 ret = false;
EnGm* sp28 = func_80BE04E0(this, globalCtx, ACTORCAT_NPC, ACTOR_EN_GM);
if (sp28) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BE1AF0);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80BE1AFC);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
this->actor.targetMode = 0;
SubS_UpdateFlags(&this->unk_2FC, 3, 7);
this->unk_2FC |= (0x40 | 0x20);
this->unk_30C = 30;
this->unk_1E4 = sp28;
func_80BE05BC(this, 0);
ret = true;
}
return ret;
}
s32 func_80BE0FC4(EnTab* this, GlobalContext* globalCtx, struct_80133038_arg2* arg2) {
s32 pad;
Math_Vec3f_Copy(&this->actor.world.pos, &D_80BE1B04);
Math_Vec3s_Copy(&this->actor.world.rot, &D_80BE1B10);
Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot);
this->actor.targetMode = 6;
SubS_UpdateFlags(&this->unk_2FC, 3, 7);
this->unk_2FC |= (0x40 | 0x20);
this->unk_30C = 0x50;
func_80BE05BC(this, 1);
return true;
}
s32 func_80BE1060(EnTab* this, GlobalContext* globalCtx, struct_80133038_arg2* arg2) {
s32 ret;
this->unk_2FC = 0;
switch (arg2->unk0) {
case 1:
ret = func_80BE0F04(this, globalCtx, arg2);
break;
case 2:
ret = func_80BE0FC4(this, globalCtx, arg2);
break;
default:
ret = false;
break;
}
return ret;
}
s32 func_80BE10BC(EnTab* this, GlobalContext* globalCtx) {
s32 pad;
Player* player = GET_PLAYER(globalCtx);
f32 dist;
Actor* tempActor;
switch (this->unk_1D8) {
case 1:
if ((player->stateFlags1 & 0x40) && !(globalCtx->msgCtx.unk11F04 <= 0x2B00) &&
(globalCtx->msgCtx.unk11F04 < 0x2B08)) {
this->actor.child = &this->unk_1E4->actor;
this->unk_2FC |= 8;
} else {
dist = Math_Vec3f_DistXYZ(&this->actor.world.pos, &this->unk_1E4->actor.world.pos);
if ((gSaveContext.weekEventReg[75] & 1) || (this->unk_1E4->actor.draw == NULL) || !(dist < 160.0f)) {
tempActor = &GET_PLAYER(globalCtx)->actor;
this->actor.child = tempActor;
} else {
tempActor = &this->unk_1E4->actor;
this->actor.child = tempActor;
}
if (func_80BE0C04(this, tempActor, 160.0f)) {
this->unk_2FC |= 8;
} else {
this->unk_2FC &= ~8;
}
}
break;
case 2:
if (func_80BE0C04(this, &GET_PLAYER(globalCtx)->actor, 200.0f)) {
this->unk_2FC |= 8;
} else {
this->unk_2FC &= ~8;
}
break;
}
return false;
}
void func_80BE1224(EnTab* this, GlobalContext* globalCtx) {
if ((this->unk_1D8 == 1) || (this->unk_1D8 == 2)) {
func_80BE10BC(this, globalCtx);
}
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x2AA8);
}
void func_80BE127C(EnTab* this, GlobalContext* globalCtx) {
u32* unk_14 = &gSaveContext.unk_14;
struct_80133038_arg2 sp18;
this->unk_31A = REG(15) + *unk_14;
if (!func_80133038(globalCtx, D_80BE18D0, &sp18) ||
((this->unk_1D8 != sp18.unk0) && !func_80BE1060(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_1D8 = sp18.unk0;
func_80BE1224(this, globalCtx);
}
void func_80BE1348(EnTab* this, GlobalContext* globalCtx) {
s32 pad;
Vec3f sp40;
Vec3f sp34;
if (func_8010BF58(&this->actor, globalCtx, func_80BE0E04(this, globalCtx), this->unk_328, &this->unk_1DC)) {
SubS_UpdateFlags(&this->unk_2FC, 3, 7);
this->unk_2FC &= ~8;
this->unk_2FC |= 0x40;
this->unk_324 = 20;
this->unk_1DC = 0;
this->actionFunc = func_80BE127C;
} else if (this->unk_1E0 != 0) {
Math_Vec3f_Copy(&sp40, &this->unk_1E0->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 EnTab_Init(Actor* thisx, GlobalContext* globalCtx) {
EnTab* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 14.0f);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_tab_Skel_007F78, NULL, this->jointTable, this->morphTable,
20);
this->unk_32C = -1;
func_80BE05BC(this, 0);
Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
Actor_SetScale(&this->actor, 0.01f);
this->unk_1D8 = 0;
this->unk_328 = NULL;
this->unk_2FC = 0;
this->unk_2FC |= 0x40;
this->actor.gravity = -1.0f;
this->actionFunc = func_80BE127C;
this->actionFunc(this, globalCtx);
}
void EnTab_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnTab* this = THIS;
Collider_DestroyCylinder(globalCtx, &this->collider);
}
void EnTab_Update(Actor* thisx, GlobalContext* globalCtx) {
EnTab* this = THIS;
f32 radius;
f32 height;
func_80BE06DC(this, globalCtx);
this->actionFunc(this, globalCtx);
if (this->unk_1D8 != 0) {
func_80BE0590(this);
func_80BE0664(this);
func_80BE09A8(this, globalCtx);
radius = this->collider.dim.radius + this->unk_30C;
height = this->collider.dim.height + 10;
func_8013C964(&this->actor, globalCtx, radius, height, 0, this->unk_2FC & 7);
Actor_MoveWithGravity(&this->actor);
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 30.0f, 12.0f, 0.0f, 4);
func_80BE0620(this, globalCtx);
}
}
s32 EnTab_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnTab* this = THIS;
if (limbIndex == 9) {
func_80BE0A98(this, globalCtx);
}
if ((this->unk_32C == 1) && (limbIndex == 18)) {
*dList = NULL;
}
return false;
}
void EnTab_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnTab* this = THIS;
if (limbIndex == 9) {
Matrix_MultiplyVector3fByState(&D_80BE1B18, &this->actor.focus.pos);
Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
}
}
void EnTab_TransformDraw(GlobalContext* globalCtx, s32 limbIndex, Actor* thisx) {
EnTab* this = THIS;
s32 phi_v0;
s32 phi_v1;
if (!(this->unk_2FC & 0x40)) {
if (this->unk_2FC & 0x10) {
phi_v1 = 1;
} else {
phi_v1 = 0;
}
phi_v0 = 1;
} else {
phi_v1 = 0;
phi_v0 = 0;
}
if (limbIndex == 9) {
func_8013AD9C(BINANG_ADD(this->unk_312 + this->unk_316, 0x4000),
BINANG_ADD(this->unk_314 + this->unk_318 + this->actor.shape.rot.y, 0x4000), this->unk_1E8,
this->unk_200, phi_v0, phi_v1);
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();
}
}
void EnTab_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnTab* this = THIS;
if (this->unk_1D8 != 0) {
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80BE1B24[this->unk_31E]));
SkelAnime_DrawTransformFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnTab_OverrideLimbDraw, EnTab_PostLimbDraw,
EnTab_TransformDraw, &this->actor);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
}

View File

@ -2,16 +2,47 @@
#define Z_EN_TAB_H
#include "global.h"
#include "overlays/actors/ovl_En_Gm/z_en_gm.h"
struct EnTab;
typedef void (*EnTabActionFunc)(struct EnTab*, GlobalContext*);
typedef s32 (*EnTabUnkFunc)(struct EnTab*, GlobalContext*);
typedef struct EnTab {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x44];
/* 0x0144 */ SkelAnime skelAnime;
/* 0x0188 */ EnTabActionFunc actionFunc;
/* 0x018C */ char unk_18C[0x1B0];
/* 0x018C */ ColliderCylinder collider;
/* 0x01D8 */ u8 unk_1D8;
/* 0x01DC */ s32 unk_1DC;
/* 0x01E0 */ Actor* unk_1E0;
/* 0x01E4 */ EnGm* unk_1E4;
/* 0x01E8 */ Vec3f unk_1E8[2];
/* 0x0200 */ Vec3s unk_200[2];
/* 0x020C */ Vec3s jointTable[20];
/* 0x0284 */ Vec3s morphTable[20];
/* 0x02FC */ u16 unk_2FC;
/* 0x0300 */ f32 unk_300;
/* 0x0304 */ f32 unk_304;
/* 0x0308 */ f32 unk_308;
/* 0x030C */ s16 unk_30C;
/* 0x030E */ UNK_TYPE1 unk30E[4];
/* 0x0312 */ s16 unk_312;
/* 0x0314 */ s16 unk_314;
/* 0x0316 */ s16 unk_316;
/* 0x0318 */ s16 unk_318;
/* 0x031A */ s16 unk_31A;
/* 0x031C */ s16 unk_31C;
/* 0x031E */ s16 unk_31E;
/* 0x0320 */ s16 unk_320;
/* 0x0322 */ s16 unk_322;
/* 0x0324 */ s16 unk_324;
/* 0x0328 */ EnTabUnkFunc unk_328;
/* 0x032C */ s32 unk_32C;
/* 0x0330 */ UNK_TYPE1 unk330[4];
/* 0x0334 */ s32 unk_334;
/* 0x0338 */ s32 unk_338;
} EnTab; // size = 0x33C
extern const ActorInit En_Tab_InitVars;

View File

@ -16057,9 +16057,9 @@
0x80BE1424:("EnTab_Init",),
0x80BE1524:("EnTab_Destroy",),
0x80BE1550:("EnTab_Update",),
0x80BE1648:("func_80BE1648",),
0x80BE16B4:("func_80BE16B4",),
0x80BE1704:("func_80BE1704",),
0x80BE1648:("EnTab_OverrideLimbDraw",),
0x80BE16B4:("EnTab_PostLimbDraw",),
0x80BE1704:("EnTab_TransformDraw",),
0x80BE1810:("EnTab_Draw",),
0x80BE1C80:("func_80BE1C80",),
0x80BE1CEC:("EnNimotsu_Init",),

View File

@ -1809,10 +1809,6 @@ D_060091A8 = 0x060091A8;
D_06011AC8 = 0x06011AC8;
D_06012DE0 = 0x06012DE0;
// ovl_En_Tab
D_06007F78 = 0x06007F78;
// ovl_En_Takaraya
D_06000968 = 0x06000968;