diff --git a/asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_OverrideLimbDraw2.s b/asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_OverrideLimbDraw2.s index 0eb63f3242..fe87f584df 100644 --- a/asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_OverrideLimbDraw2.s +++ b/asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_OverrideLimbDraw2.s @@ -12,7 +12,7 @@ glabel EnIk_OverrideLimbDraw2 /* 03248 80A77558 54A1000C */ bnel $a1, $at, .L80A7758C /* 0324C 80A7755C 8FBF0014 */ lw $ra, 0x0014($sp) .L80A77560: -/* 03250 80A77560 0C29DC50 */ jal func_80A77140 +/* 03250 80A77560 0C29DC50 */ jal EnIk_AnimCurrentFrame /* 03254 80A77564 8FA4002C */ lw $a0, 0x002C($sp) /* 03258 80A77568 3C0141F0 */ lui $at, 0x41F0 ## $at = 41F00000 /* 0325C 80A7756C 44812000 */ mtc1 $at, $f4 ## $f4 = 30.00 diff --git a/asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_PostLimbDraw2.s b/asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_PostLimbDraw2.s index 69d96d0695..fd73efbbb9 100644 --- a/asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_PostLimbDraw2.s +++ b/asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_PostLimbDraw2.s @@ -72,7 +72,7 @@ glabel EnIk_PostLimbDraw2 /* 032E4 80A775F4 03000008 */ jr $t8 /* 032E8 80A775F8 00000000 */ nop glabel L80A775FC -/* 032EC 80A775FC 0C29DC50 */ jal func_80A77140 +/* 032EC 80A775FC 0C29DC50 */ jal EnIk_AnimCurrentFrame /* 032F0 80A77600 8FA40080 */ lw $a0, 0x0080($sp) /* 032F4 80A77604 3C0141F0 */ lui $at, 0x41F0 ## $at = 41F00000 /* 032F8 80A77608 44812000 */ mtc1 $at, $f4 ## $f4 = 30.00 @@ -151,7 +151,7 @@ glabel L80A776D0 /* 03414 80A77724 1000003C */ beq $zero, $zero, .L80A77818 /* 03418 80A77728 AC4A0000 */ sw $t2, 0x0000($v0) ## 00000000 glabel L80A7772C -/* 0341C 80A7772C 0C29DC50 */ jal func_80A77140 +/* 0341C 80A7772C 0C29DC50 */ jal EnIk_AnimCurrentFrame /* 03420 80A77730 8FA40080 */ lw $a0, 0x0080($sp) /* 03424 80A77734 3C0141F0 */ lui $at, 0x41F0 ## $at = 41F00000 /* 03428 80A77738 44813000 */ mtc1 $at, $f6 ## $f6 = 30.00 @@ -182,7 +182,7 @@ glabel L80A7772C /* 0348C 80A7779C 1000001E */ beq $zero, $zero, .L80A77818 /* 03490 80A777A0 AC4F0000 */ sw $t7, 0x0000($v0) ## 00000000 glabel L80A777A4 -/* 03494 80A777A4 0C29DC50 */ jal func_80A77140 +/* 03494 80A777A4 0C29DC50 */ jal EnIk_AnimCurrentFrame /* 03498 80A777A8 8FA40080 */ lw $a0, 0x0080($sp) /* 0349C 80A777AC 3C0141F0 */ lui $at, 0x41F0 ## $at = 41F00000 /* 034A0 80A777B0 44814000 */ mtc1 $at, $f8 ## $f8 = 30.00 diff --git a/asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A77140.s b/asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A77140.s index 90870301f2..dad0ac11e2 100644 --- a/asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A77140.s +++ b/asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A77140.s @@ -1,3 +1,3 @@ -glabel func_80A77140 +glabel EnIk_AnimCurrentFrame /* 02E30 80A77140 03E00008 */ jr $ra /* 02E34 80A77144 C4800164 */ lwc1 $f0, 0x0164($a0) ## 00000164 diff --git a/src/overlays/actors/ovl_En_Ik/z_en_ik.c b/src/overlays/actors/ovl_En_Ik/z_en_ik.c index 2fd463312f..7c435be3bb 100644 --- a/src/overlays/actors/ovl_En_Ik/z_en_ik.c +++ b/src/overlays/actors/ovl_En_Ik/z_en_ik.c @@ -67,6 +67,8 @@ extern AnimationHeader D_0600C114; extern AnimationHeader D_0600CD70; extern AnimationHeader D_0600DD50; extern AnimationHeader D_0600ED24; +extern Gfx D_06018E78[]; +extern Gfx D_06019100[]; extern SkeletonHeader D_0601E178; extern AnimationHeader D_060203D8; extern SkeletonHeader D_060205C0; @@ -681,8 +683,28 @@ Gfx* func_80A761B0(GraphicsContext* gfxCtx, u8 primR, u8 primG, u8 primB, u8 env return displayList; } -s32 EnIk_OverrideLimbDraw3(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* actor); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_OverrideLimbDraw3.s") +s32 EnIk_OverrideLimbDraw3(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* actor) { + EnIk* this = (EnIk*)actor; + + if (limbIndex == 0xC) { + if (this->actor.params != 0) { + *dList = D_06018E78; + } + } else if (limbIndex == 0xD) { + if (this->actor.params != 0) { + *dList = D_06019100; + } + } else if ((limbIndex == 0x1A) || (limbIndex == 0x1B)) { + if ((this->unk_2FA & 1)) { + *dList = NULL; + } + } else if ((limbIndex == 0x1C) || (limbIndex == 0x1D)) { + if (!(this->unk_2FA & 1)) { + *dList = NULL; + } + } + return 0; +} void EnIk_PostLimbDraw3(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* actor); #pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_PostLimbDraw3.s") @@ -748,11 +770,13 @@ void func_80A76C14(EnIk* this) { #pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A76E2C.s") -void func_80A77034(EnIk* this, GlobalContext* globalCtx); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A77034.s") +void func_80A77034(EnIk* this, GlobalContext* globalCtx) { + func_8002E4B4(globalCtx, &this->actor, 75.0f, 30.0f, 30.0f, 5); +} -s32 func_80A7707C(EnIk* this, GlobalContext* globalCtx); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A7707C.s") +s32 func_80A7707C(EnIk* this) { + return SkelAnime_FrameUpdateMatrix(&this->skelAnime); +} CsCmdActorAction* EnIk_GetNpcAction(GlobalContext* globalCtx, s32 actionIdx) { if (globalCtx->csCtx.state != 0) { @@ -773,21 +797,44 @@ void func_80A770C0(EnIk* this, GlobalContext* globalCtx, s32 actionIdx) { } } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A77140.s") +f32 EnIk_AnimCurrentFrame(EnIk* this) { + return this->skelAnime.animCurrentFrame; +} -void func_80A77148(EnIk* this); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A77148.s") +void func_80A77148(EnIk* this) { + this->action = 0; + this->drawMode = 0; + this->actor.shape.unk_14 = 0; +} -void func_80A77158(EnIk* this, GlobalContext* globalCtx); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A77158.s") +void func_80A77158(EnIk* this, GlobalContext* globalCtx) { + SkelAnime_ChangeAnim(&this->skelAnime, &D_0600C114, 1.0f, 0.0f, SkelAnime_GetFrameCount(&D_0600C114.genericHeader), + 2, 0.0f); + func_80A770C0(this, globalCtx, 4); + this->action = 1; + this->drawMode = 1; + this->actor.shape.unk_14 = 0xFF; +} -void func_80A771E4(EnIk* this); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A771E4.s") +void func_80A771E4(EnIk* this) { + SkelAnime_ChangeAnim(&this->skelAnime, &D_0600C114, 1.0f, 0.0f, SkelAnime_GetFrameCount(&D_0600C114.genericHeader), + 2, 0.0f); + this->action = 2; + this->drawMode = 1; + this->unk_4D4 = 0; + this->actor.shape.unk_14 = 0xFF; +} -void func_80A77264(EnIk* this, GlobalContext* globalCtx, s32 arg2); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A77264.s") +void func_80A77264(EnIk* this, GlobalContext* globalCtx, s32 arg2) { + if ((arg2 != 0) && (EnIk_GetNpcAction(globalCtx, 4) != NULL)) { + func_80A78160(this, globalCtx); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A772A4.s") +void func_80A772A4(EnIk* this) { + Audio_PlaySoundGeneral(NA_SE_EN_IRONNACK_STAGGER_DEMO, &this->actor.projectedPos, 4, &D_801333E0, &D_801333E0, + &D_801333E8); +} void func_80A772EC(EnIk* this, GlobalContext* globalCtx) { static Vec3f D_80A78FA0; @@ -812,8 +859,12 @@ void func_80A7735C(EnIk* this, GlobalContext* globalCtx) { this->actor.shape.unk_14 = 0xFF; } -void func_80A77434(EnIk* this, GlobalContext* globalCtx); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A77434.s") +void func_80A77434(EnIk* this, GlobalContext* globalCtx) { + this->action = 4; + this->drawMode = 2; + func_80A772A4(this); + this->actor.shape.unk_14 = 0xFF; +} void func_80A77474(EnIk* this, GlobalContext* globalCtx); #pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A77474.s") @@ -824,8 +875,17 @@ void func_80A77474(EnIk* this, GlobalContext* globalCtx); #pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/func_80A774F8.s") -s32 EnIk_OverrideLimbDraw2(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* actor); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_OverrideLimbDraw2.s") +s32 EnIk_OverrideLimbDraw2(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* actor) { + EnIk* this = (EnIk*)actor; + + if ((limbIndex == 0xD) || (limbIndex == 0x1A) || (limbIndex == 0x1B)) { + if (EnIk_AnimCurrentFrame(this) >= 30.0f) { + *dList = NULL; + } + } + + return 0; +} void EnIk_PostLimbDraw2(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* actor); #pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ik/EnIk_PostLimbDraw2.s") @@ -901,7 +961,7 @@ void func_80A77B0C(EnIk* this, GlobalContext* globalCtx) { void func_80A77B3C(EnIk* this, GlobalContext* globalCtx) { s32 sp24; - sp24 = func_80A7707C(this, globalCtx); + sp24 = func_80A7707C(this); func_80A76C14(this); func_80A77034(this, globalCtx); func_80A779DC(this, globalCtx); @@ -915,7 +975,7 @@ void EnIk_Update(Actor* thisx, GlobalContext* globalCtx) { osSyncPrintf(VT_FGCOL(RED) "メインモードがおかしい!!!!!!!!!!!!!!!!!!!!!!!!!\n" VT_RST); return; } - + sActionFuncs[this->action](this, globalCtx); } @@ -954,7 +1014,7 @@ void EnIk_Draw(Actor* thisx, GlobalContext* globalCtx) { osSyncPrintf(VT_FGCOL(RED) "描画モードがおかしい!!!!!!!!!!!!!!!!!!!!!!!!!\n" VT_RST); return; } - + sDrawFuncs[this->drawMode](this, globalCtx); } diff --git a/src/overlays/actors/ovl_En_Ik/z_en_ik.h b/src/overlays/actors/ovl_En_Ik/z_en_ik.h index 4d2c5a1df2..1da0a77b0d 100644 --- a/src/overlays/actors/ovl_En_Ik/z_en_ik.h +++ b/src/overlays/actors/ovl_En_Ik/z_en_ik.h @@ -15,12 +15,12 @@ typedef struct EnIk { /* 0x0244 */ Vec3s transitionDrawTable[30]; /* 0x02F8 */ u8 unk_2F8; /* 0x02F9 */ u8 unk_2F9; - /* 0x02F9 */ char unk_2FA[0x01]; + /* 0x02FA */ u8 unk_2FA; /* 0x02FB */ u8 unk_2FB; /* 0x02FC */ u8 unk_2FC; /* 0x02FD */ char unk_2FD[0x01]; /* 0x02FE */ s8 unk_2FE; - /* 0x02FD */ s8 unk_2FF; + /* 0x02FF */ s8 unk_2FF; /* 0x0300 */ s16 unk_300; /* 0x0302 */ s16 switchFlags; /* 0x0304 */ EnIkActionFunc actionFunc; @@ -33,7 +33,8 @@ typedef struct EnIk { /* 0x04C8 */ s32 action; /* 0x04CC */ s32 drawMode; /* 0x04D0 */ u32 npcAction; - /* 0x04D4 */ char unk_4D4[0x08]; + /* 0x04D4 */ s32 unk_4D4; + /* 0x04D8 */ char unk_4D8[0x04]; } EnIk; // size = 0x04DC extern const ActorInit En_Ik_InitVars; diff --git a/undefined_syms.txt b/undefined_syms.txt index 1895dca3a3..dafdd380ed 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -1185,6 +1185,8 @@ D_0600C114 = 0x0600C114; D_0600CD70 = 0x0600CD70; D_0600DD50 = 0x0600DD50; D_0600ED24 = 0x0600ED24; +D_06018E78 = 0x06018E78; +D_06019100 = 0x06019100; D_0601E178 = 0x0601E178; D_060203D8 = 0x060203D8; D_060205C0 = 0x060205C0;