* En_Mm3

* PR

* Merge
This commit is contained in:
Maide 2022-03-05 15:57:38 +00:00 committed by GitHub
parent 4a18f3ca4d
commit 040db7ac40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 540 additions and 45 deletions

View File

@ -0,0 +1,6 @@
<Root>
<File Name="ovl_En_Mm3" BaseAddress="0x80A6F0A0" RangeStart="0x1448" RangeEnd="0x1450">
<DList Name="sEnMm3DL" Offset="0x1448"/>
</File>
</Root>

View File

@ -1900,7 +1900,7 @@ void OLib_DbCameraVec3fSum(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode);
// void func_8010E028(void);
// void func_8010E968(void);
void func_8010E9F0(s16 arg0, s16 arg1);
// void func_8010EA9C(void);
void func_8010EA9C(s32 arg0, s32 arg1);
// void func_8010EB50(void);
// void func_8010EBA0(void);
// void func_8010EC54(void);
@ -3634,7 +3634,7 @@ void func_801A0124(Vec3f* pos, u8 arg1);
// void func_801A0184(void);
// void func_801A01C4(void);
void func_801A0204(s8 seqId);
// void func_801A0238(void);
void func_801A0238(s32 arg0, s32 arg1);
// void func_801A026C(void);
// void func_801A0318(void);
// void func_801A046C(void);

3
spec
View File

@ -3092,8 +3092,7 @@ beginseg
name "ovl_En_Mm3"
compress
include "build/src/overlays/actors/ovl_En_Mm3/z_en_mm3.o"
include "build/data/ovl_En_Mm3/ovl_En_Mm3.data.o"
include "build/data/ovl_En_Mm3/ovl_En_Mm3.reloc.o"
include "build/src/overlays/actors/ovl_En_Mm3/ovl_En_Mm3_reloc.o"
endseg
beginseg

View File

@ -5,6 +5,7 @@
*/
#include "z_en_mm3.h"
#include "objects/object_mm/object_mm.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
@ -15,7 +16,19 @@ void EnMm3_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnMm3_Update(Actor* thisx, GlobalContext* globalCtx);
void EnMm3_Draw(Actor* thisx, GlobalContext* globalCtx);
#if 0
void func_80A6F270(EnMm3* this);
void func_80A6F2C8(EnMm3* this, GlobalContext* globalCtx);
void func_80A6F9C8(EnMm3* this);
void func_80A6F9DC(EnMm3* this, GlobalContext* globalCtx);
void func_80A6FBA0(EnMm3* this);
void func_80A6FBFC(EnMm3* this, GlobalContext* globalCtx);
void func_80A6FE1C(EnMm3* this);
void func_80A6FE30(EnMm3* this, GlobalContext* globalCtx);
void func_80A6FED8(EnMm3* this);
void func_80A6FEEC(EnMm3* this, GlobalContext* globalCtx);
s32 func_80A6FFAC(EnMm3* this, GlobalContext* globalCtx);
void func_80A70084(EnMm3* this, GlobalContext* globalCtx);
const ActorInit En_Mm3_InitVars = {
ACTOR_EN_MM3,
ACTORCAT_NPC,
@ -28,61 +41,532 @@ const ActorInit En_Mm3_InitVars = {
(ActorFunc)EnMm3_Draw,
};
// static ColliderCylinderInit sCylinderInit = {
static ColliderCylinderInit D_80A703F0 = {
{ COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
{ ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x00000000, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_NONE,
AT_NONE,
AC_ON | AC_TYPE_PLAYER,
OC1_ON | OC1_TYPE_ALL,
OC2_TYPE_1,
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK0,
{ 0x00000000, 0x00, 0x00 },
{ 0x00000000, 0x00, 0x00 },
TOUCH_NONE | TOUCH_SFX_NORMAL,
BUMP_ON,
OCELEM_ON,
},
{ 18, 63, 0, { 0, 0, 0 } },
};
// sColChkInfoInit
static CollisionCheckInfoInit2 D_80A7041C = { 0, 0, 0, 0, MASS_IMMOVABLE };
static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
#endif
static AnimationInfo sAnimations[] = {
{ &object_mm_Anim_002238, 1.0f, 0.0f, 0.0f, 0, -7.0f }, { &object_mm_Anim_00A4E0, -1.0f, 0.0f, 0.0f, 2, -7.0f },
{ &object_mm_Anim_00C640, 1.0f, 0.0f, 0.0f, 0, -7.0f }, { &object_mm_Anim_00A4E0, 1.0f, 0.0f, 0.0f, 2, -7.0f },
{ &object_mm_Anim_000468, 1.0f, 0.0f, 0.0f, 0, -7.0f }, { &object_mm_Anim_00CD90, 1.0f, 0.0f, 0.0f, 0, -12.0f },
{ &object_mm_Anim_00DA50, 1.0f, 0.0f, 0.0f, 0, -12.0f }, { &object_mm_Anim_00DA50, 1.0f, 0.0f, 10.0f, 2, -10.0f },
};
extern ColliderCylinderInit D_80A703F0;
extern CollisionCheckInfoInit2 D_80A7041C;
#include "overlays/ovl_En_Mm3/ovl_En_Mm3.c"
extern UNK_TYPE D_0600A4E0;
Vec3f D_80A704F0 = { 0.0f, 0.0f, 0.0f };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/EnMm3_Init.s")
TexturePtr D_80A704FC[] = { object_mm_Tex_002950, object_mm_Tex_002750 };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/EnMm3_Destroy.s")
void EnMm3_Init(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnMm3* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6F22C.s")
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 21.0f);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_mm_Skel_0096E8, &object_mm_Anim_00A4E0, this->jointTable,
this->morphTable, 16);
Animation_Change(&this->skelAnime, &object_mm_Anim_00A4E0, -1.0f, Animation_GetLastFrame(&object_mm_Anim_00A4E0),
0.0f, 2, 0.0f);
Collider_InitCylinder(globalCtx, &this->collider);
Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, NULL, &sColChkInfoInit);
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 0.0f, 0.0f, 0.0f, 4);
this->actor.parent = NULL;
this->actor.targetMode = 0;
this->unk_1DC = 1;
this->unk_2B4 = 0;
this->unk_2AE = 0;
this->unk_2B0 &= ~1;
this->actor.world.pos.y = this->actor.floorHeight;
func_80A6F270(this);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6F270.s")
void EnMm3_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnMm3* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6F2C8.s")
gSaveContext.weekEventReg[63] &= (u8)~1;
Collider_DestroyCylinder(globalCtx, &this->collider);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6F3B4.s")
s32 func_80A6F22C(EnMm3* this) {
s16 abs = BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6F5E4.s")
abs = ABS_ALT(abs);
if (abs < 0x4000) {
return true;
}
return false;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6F9C8.s")
void func_80A6F270(EnMm3* this) {
this->unk_1DC = 1;
this->unk_2B0 &= ~1;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 5);
this->actionFunc = func_80A6F2C8;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6F9DC.s")
void func_80A6F2C8(EnMm3* this, GlobalContext* globalCtx) {
if (Actor_ProcessTalkRequest(&this->actor, &globalCtx->state)) {
Message_StartTextbox(globalCtx, 0x278A, &this->actor);
this->unk_2B4 = 0x278A;
func_80A6F9C8(this);
} else if (func_80A6F22C(this)) {
func_800B8614(&this->actor, globalCtx, 100.0f);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6FBA0.s")
Math_SmoothStepToS(&this->unk_2A0.x, 0, 5, 0x1000, 0x100);
Math_SmoothStepToS(&this->unk_2A0.y, 0, 5, 0x1000, 0x100);
Math_SmoothStepToS(&this->unk_2A6.x, 0, 5, 0x1000, 0x100);
Math_SmoothStepToS(&this->unk_2A6.y, 0, 5, 0x1000, 0x100);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6FBFC.s")
void func_80A6F3B4(EnMm3* this, GlobalContext* globalCtx) {
if (func_80147624(globalCtx)) {
switch (this->unk_2B4) {
case 0x278E:
if (globalCtx->msgCtx.choiceIndex == 0) {
if (this->unk_2B2 & 0x20) {
if (gSaveContext.rupees >= globalCtx->msgCtx.unk1206C) {
func_8019F208();
Message_StartTextbox(globalCtx, 0x2790, &this->actor);
this->unk_2B4 = 0x2790;
func_801159EC(-globalCtx->msgCtx.unk1206C);
} else {
play_sound(NA_SE_SY_ERROR);
Message_StartTextbox(globalCtx, 0x279C, &this->actor);
this->unk_2B4 = 0x279C;
func_80151BB4(globalCtx, 0xB);
}
} else {
func_8019F208();
Message_StartTextbox(globalCtx, 0x2790, &this->actor);
this->unk_2B4 = 0x2790;
}
} else {
func_8019F230();
Message_StartTextbox(globalCtx, 0x278F, &this->actor);
this->unk_2B4 = 0x278F;
func_80151BB4(globalCtx, 0xB);
}
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6FE1C.s")
case 0x279A:
if (globalCtx->msgCtx.choiceIndex == 0) {
if (gSaveContext.rupees >= globalCtx->msgCtx.unk1206C) {
func_8019F208();
Message_StartTextbox(globalCtx, 0x2790, &this->actor);
this->unk_2B4 = 0x2790;
func_801159EC(-globalCtx->msgCtx.unk1206C);
} else {
play_sound(NA_SE_SY_ERROR);
Message_StartTextbox(globalCtx, 0x279C, &this->actor);
this->unk_2B4 = 0x279C;
func_80151BB4(globalCtx, 0xB);
}
} else {
func_8019F230();
Message_StartTextbox(globalCtx, 0x279B, &this->actor);
this->unk_2B4 = 0x279B;
func_80151BB4(globalCtx, 0xB);
}
break;
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6FE30.s")
void func_80A6F5E4(EnMm3* this, GlobalContext* globalCtx) {
if (((this->unk_2B4 != 0x2791) || (this->unk_2AC == 0)) && func_80147624(globalCtx)) {
switch (this->unk_2B4) {
case 0x278A:
if (func_80A6FFAC(this, globalCtx)) {
Message_StartTextbox(globalCtx, 0x279D, &this->actor);
this->unk_2B4 = 0x279D;
} else {
func_80A70084(this, globalCtx);
if (Player_GetMask(globalCtx) == PLAYER_MASK_BUNNY) {
Message_StartTextbox(globalCtx, 0x27A0, &this->actor);
this->unk_2B4 = 0x27A0;
} else {
Message_StartTextbox(globalCtx, 0x278B, &this->actor);
this->unk_2B4 = 0x278B;
}
}
this->unk_1DC = 0;
this->unk_2B0 |= 1;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 7);
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6FED8.s")
case 0x278B:
case 0x27A0:
this->unk_2AE = 0;
Message_StartTextbox(globalCtx, 0x278C, &this->actor);
this->unk_2B4 = 0x278C;
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6FEEC.s")
case 0x278C:
Message_StartTextbox(globalCtx, 0x278D, &this->actor);
this->unk_2B4 = 0x278D;
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A6FFAC.s")
case 0x279D:
this->unk_2AE = 0;
Message_StartTextbox(globalCtx, 0x279E, &this->actor);
this->unk_2B4 = 0x279E;
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A70084.s")
case 0x279E:
this->unk_2B2 |= 0x20;
Message_StartTextbox(globalCtx, 0x279F, &this->actor);
this->unk_2B4 = 0x279F;
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/EnMm3_Update.s")
case 0x278D:
case 0x279F:
Message_StartTextbox(globalCtx, 0x278E, &this->actor);
this->unk_2B4 = 0x278E;
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A701E0.s")
case 0x2791:
if (gSaveContext.unk_3DE0[0] == 1000) {
Message_StartTextbox(globalCtx, 0x2792, &this->actor);
this->unk_2B4 = 0x2792;
} else if ((gSaveContext.unk_3DE0[0] >= 1500)) {
Message_StartTextbox(globalCtx, 0x2797, &this->actor);
this->unk_2B4 = 0x2797;
} else if ((gSaveContext.unk_3DE0[0] <= 1050) && (gSaveContext.unk_3DE0[0] >= 950)) {
Message_StartTextbox(globalCtx, 0x2795, &this->actor);
this->unk_2B4 = 0x2795;
} else {
Message_StartTextbox(globalCtx, 0x2796, &this->actor);
this->unk_2B4 = 0x2796;
}
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/func_80A702B0.s")
case 0x2792:
Message_StartTextbox(globalCtx, 0x2793, &this->actor);
this->unk_2B4 = 0x2793;
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Mm3/EnMm3_Draw.s")
case 0x2793:
func_801477B4(globalCtx);
func_80A6FE1C(this);
func_80A6FE30(this, globalCtx);
break;
case 0x2795:
case 0x2796:
case 0x2797:
if (gSaveContext.weekEventReg[63] & 2) {
Message_StartTextbox(globalCtx, 0x279B, &this->actor);
this->unk_2B4 = 0x279B;
func_80151BB4(globalCtx, 0xB);
} else {
Message_StartTextbox(globalCtx, 0x2798, &this->actor);
this->unk_2B4 = 0x2798;
}
break;
case 0x2798:
Message_StartTextbox(globalCtx, 0x2799, &this->actor);
this->unk_2B4 = 0x2799;
break;
case 0x2799:
Message_StartTextbox(globalCtx, 0x279A, &this->actor);
this->unk_2B4 = 0x279A;
break;
}
} else if ((this->unk_2AC > 0) && (this->unk_2B4 == 0x2791)) {
this->unk_2AC--;
if (this->unk_2AC == 0) {
if (gSaveContext.unk_3DE0[0] == 1000) {
func_801A3098(0x922);
} else {
play_sound(NA_SE_SY_ERROR);
}
}
}
}
void func_80A6F9C8(EnMm3* this) {
this->actionFunc = func_80A6F9DC;
}
void func_80A6F9DC(EnMm3* this, GlobalContext* globalCtx) {
this->unk_2B0 &= ~2;
switch (Message_GetState(&globalCtx->msgCtx)) {
case 0:
case 1:
case 2:
break;
case 3:
this->unk_2B0 |= 2;
break;
case 4:
func_80A6F3B4(this, globalCtx);
break;
case 5:
func_80A6F5E4(this, globalCtx);
break;
case 6:
if (func_80147624(globalCtx)) {
if (this->unk_2B4 == 0x2790) {
Player* player = GET_PLAYER(globalCtx);
player->stateFlags1 |= 0x20;
if (Player_GetMask(globalCtx) == PLAYER_MASK_BUNNY) {
func_8010EA9C(0, 2);
} else {
func_8010EA9C(0, 0);
}
func_801477B4(globalCtx);
play_sound(NA_SE_SY_START_SHOT);
func_80A6FBA0(this);
} else {
gSaveContext.weekEventReg[63] &= (u8)~1;
gSaveContext.weekEventReg[63] &= (u8)~2;
func_80A6F270(this);
}
}
break;
}
if ((this->skelAnime.mode == 2) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, 2);
}
if (((this->unk_2B4 == 0x279D) || (this->unk_2B4 == 0x27A0) || (this->unk_2B4 == 0x278B)) &&
Animation_OnFrame(&this->skelAnime, 8.0f) && (this->unk_2AE == 0)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_LIE_DOWN_ON_BED);
this->unk_2AE = 1;
}
}
void func_80A6FBA0(EnMm3* this) {
func_801A5BD0(0x6F);
func_801A0238(0, 5);
gSaveContext.weekEventReg[63] |= 1;
gSaveContext.weekEventReg[63] &= (u8)~2;
this->actionFunc = func_80A6FBFC;
}
void func_80A6FBFC(EnMm3* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
OSTime a;
OSTime b;
if (gSaveContext.unk_3DD0[0] == 0x10) {
player->stateFlags1 &= ~0x20;
this->actor.flags |= ACTOR_FLAG_10000;
if (gSaveContext.unk_3DE0[0] >= 0x5DD) {
gSaveContext.unk_3DE0[0] = 0x5DC;
} else {
a = gSaveContext.unk_3DE0[0];
if (a >= (OSTime)(995 - XREG(16))) {
b = gSaveContext.unk_3DE0[0];
if ((OSTime)(XREG(17) + 1005) >= b) {
gSaveContext.unk_3DE0[0] = 1000;
}
}
}
} else if (gSaveContext.unk_3DE0[0] >= 0x5DD) {
gSaveContext.unk_3DD0[0] = 15;
gSaveContext.unk_3DC8 = osGetTime();
}
if (Actor_ProcessTalkRequest(&this->actor, &globalCtx->state)) {
func_801A5BD0(0);
func_801A0238(0x7F, 5);
Message_StartTextbox(globalCtx, 0x2791, &this->actor);
this->unk_2B4 = 0x2791;
this->unk_2AC = 7;
gSaveContext.unk_3DD0[0] = 0;
this->actor.flags &= ~ACTOR_FLAG_10000;
play_sound(NA_SE_SY_START_SHOT);
func_80A6F9C8(this);
} else {
func_800B8614(&this->actor, globalCtx, this->actor.xzDistToPlayer + 10.0f);
func_80123E90(globalCtx, &this->actor);
if (Player_GetMask(globalCtx) == PLAYER_MASK_BUNNY) {
play_sound(NA_SE_SY_STOPWATCH_TIMER_INF - SFX_FLAG);
} else {
play_sound(NA_SE_SY_STOPWATCH_TIMER_3 - SFX_FLAG);
}
}
}
void func_80A6FE1C(EnMm3* this) {
this->actionFunc = func_80A6FE30;
}
void func_80A6FE30(EnMm3* this, GlobalContext* globalCtx) {
if (Actor_HasParent(&this->actor, globalCtx)) {
if (!(gSaveContext.weekEventReg[77] & 1)) {
gSaveContext.weekEventReg[77] |= 1;
}
this->actor.parent = NULL;
func_80A6FED8(this);
} else if (gSaveContext.weekEventReg[77] & 1) {
Actor_PickUp(&this->actor, globalCtx, GI_RUPEE_PURPLE, 500.0f, 100.0f);
} else {
Actor_PickUp(&this->actor, globalCtx, GI_HEART_PIECE, 500.0f, 100.0f);
}
}
void func_80A6FED8(EnMm3* this) {
this->actionFunc = func_80A6FEEC;
}
void func_80A6FEEC(EnMm3* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
if (Actor_ProcessTalkRequest(&this->actor, &globalCtx->state)) {
player->stateFlags1 &= ~0x20;
Message_StartTextbox(globalCtx, 0x2794, &this->actor);
this->unk_2B4 = 0x2794;
func_80151BB4(globalCtx, 0xB);
func_80151BB4(globalCtx, 0x2B);
this->actor.flags &= ~ACTOR_FLAG_10000;
func_80A6F9C8(this);
} else {
func_800B85E0(&this->actor, globalCtx, 200.0f, -1);
}
}
s32 func_80A6FFAC(EnMm3* this, GlobalContext* globalCtx) {
switch (gSaveContext.playerForm) {
case 4:
if (Player_GetMask(globalCtx) == PLAYER_MASK_BUNNY) {
if (this->unk_2B2 & 0x10) {
return true;
}
} else if (this->unk_2B2 & 1) {
return true;
}
break;
case 3:
if (this->unk_2B2 & 2) {
return true;
}
break;
case 2:
if (this->unk_2B2 & 4) {
return true;
}
break;
case 1:
if (this->unk_2B2 & 8) {
return true;
}
break;
}
return false;
}
void func_80A70084(EnMm3* this, GlobalContext* globalCtx) {
switch (gSaveContext.playerForm) {
case 4:
if (Player_GetMask(globalCtx) == PLAYER_MASK_BUNNY) {
this->unk_2B2 |= 0x10;
this->unk_2B2 |= 1;
} else {
this->unk_2B2 |= 1;
}
break;
case 3:
this->unk_2B2 |= 2;
break;
case 2:
this->unk_2B2 |= 4;
break;
case 1:
this->unk_2B2 |= 8;
break;
}
}
void EnMm3_Update(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnMm3* this = THIS;
this->actionFunc(this, globalCtx);
SkelAnime_Update(&this->skelAnime);
if (this->unk_2B0 & 1) {
func_800E9250(globalCtx, &this->actor, &this->unk_2A0, &this->unk_2A6, this->actor.focus.pos);
}
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
s32 EnMm3_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) {
EnMm3* this = THIS;
if (limbIndex == 8) {
rot->x += this->unk_2A6.y;
rot->y -= this->unk_2A6.x;
} else if (limbIndex == 15) {
rot->x += this->unk_2A0.y;
rot->z += this->unk_2A0.x;
if ((this->unk_2B0 & 2) && ((globalCtx->gameplayFrames % 3) == 0)) {
Matrix_InsertTranslation(40.0f, 0.0f, 0.0f, MTXMODE_APPLY);
}
}
return false;
}
void EnMm3_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
EnMm3* this = THIS;
if (limbIndex == 15) {
Matrix_MultiplyVector3fByState(&D_80A704F0, &this->actor.focus.pos);
}
}
void EnMm3_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnMm3* this = THIS;
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A704FC[this->unk_1DC]));
gSPSegment(POLY_OPA_DISP++, 0x0C, sEnMm3DL);
SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnMm3_OverrideLimbDraw, EnMm3_PostLimbDraw, &this->actor);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}

View File

@ -9,9 +9,20 @@ typedef void (*EnMm3ActionFunc)(struct EnMm3*, GlobalContext*);
typedef struct EnMm3 {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x90];
/* 0x0144 */ SkelAnime skelAnime;
/* 0x0188 */ ColliderCylinder collider;
/* 0x01D4 */ EnMm3ActionFunc actionFunc;
/* 0x01D8 */ char unk_1D8[0xE0];
/* 0x01D8 */ UNK_TYPE1 unk1D8[4];
/* 0x01DC */ s32 unk_1DC;
/* 0x01E0 */ Vec3s jointTable[16];
/* 0x0240 */ Vec3s morphTable[16];
/* 0x02A0 */ Vec3s unk_2A0;
/* 0x02A6 */ Vec3s unk_2A6;
/* 0x02AC */ s16 unk_2AC;
/* 0x02AE */ s16 unk_2AE;
/* 0x02B0 */ u16 unk_2B0;
/* 0x02B2 */ u16 unk_2B2;
/* 0x02B4 */ u16 unk_2B4;
} EnMm3; // size = 0x2B8
extern const ActorInit En_Mm3_InitVars;

View File

@ -10956,8 +10956,8 @@
0x80A6FFAC:("func_80A6FFAC",),
0x80A70084:("func_80A70084",),
0x80A70134:("EnMm3_Update",),
0x80A701E0:("func_80A701E0",),
0x80A702B0:("func_80A702B0",),
0x80A701E0:("EnMm3_OverrideLimbDraw",),
0x80A702B0:("EnMm3_PostLimbDraw",),
0x80A702F0:("EnMm3_Draw",),
0x80A706F0:("BgCraceMovebg_Init",),
0x80A7090C:("func_80A7090C",),

View File

@ -1594,11 +1594,6 @@ D_06002EC0 = 0x06002EC0;
D_06001C38 = 0x06001C38;
D_06006CA0 = 0x06006CA0;
// ovl_En_Mm3
D_060096E8 = 0x060096E8;
D_0600A4E0 = 0x0600A4E0;
// ovl_En_Mnk
D_06003584 = 0x06003584;