summaryrefslogtreecommitdiff
path: root/src/REL
diff options
context:
space:
mode:
authorelijah-thomas774 <elijahthomas774@gmail.com>2026-10-02 20:36:02 -0400
committerelijah-thomas774 <elijahthomas774@gmail.com>2026-10-13 14:39:50 -0400
commit107af1e4f2891334beaeb855c91095ea1986df15 (patch)
treeb0b415a5d34d1db4f546ceee456fbc54c6b7dd88 /src/REL
parente5d6f2046c800a0addb54acfbc12be02529f9709 (diff)
d_a_b_girahimu_base early Progress
Diffstat (limited to 'src/REL')
-rw-r--r--src/REL/d/a/b/d_a_b_girahimu_base.cpp1725
1 files changed, 1725 insertions, 0 deletions
diff --git a/src/REL/d/a/b/d_a_b_girahimu_base.cpp b/src/REL/d/a/b/d_a_b_girahimu_base.cpp
index ba8a3b2c..0f69332b 100644
--- a/src/REL/d/a/b/d_a_b_girahimu_base.cpp
+++ b/src/REL/d/a/b/d_a_b_girahimu_base.cpp
@@ -1,3 +1,1728 @@
#include "d/a/b/d_a_b_girahimu_base.h"
+#include "c/c_lib.h"
+#include "c/c_math.h"
+#include "common.h"
+#include "d/a/d_a_player.h"
+#include "d/a/obj/d_a_obj_girahimu_sword_link.h"
+#include "d/col/c/c_cc_d.h"
+#include "d/d_vec.h"
+#include "d/flag/sceneflag_manager.h"
+#include "d/snd/d_snd_wzsound.h"
+#include "m/m3d/m_fanm.h"
+#include "m/m_angle.h"
+#include "m/m_mtx.h"
+#include "m/m_quat.h"
+#include "m/m_vec.h"
+#include "nw4r/g3d/res/g3d_resmdl.h"
+#include "nw4r/math/math_arithmetic.h"
+#include "rvl/MTX/mtx.h"
+#include "rvl/VI/vi.h"
+#include "s/s_Math.h"
+
+#include <cstdint>
+
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, Wait);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, Walk);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, Panch);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, Catch);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, CatchDamage);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, GetSword);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, Link_SwordWait);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, Link_SwordWalk);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, Link_SwordAttack);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, ReturnSword);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, LinkSwordGuardJust);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, SearchSword);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, HomeWarp);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, PickUpSword);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, ReleaseSword);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, BackStep);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, Escape);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, EscapeBack);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, FrontWarp);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, FrontAttack);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, BackWarp);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, BackAttack);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, Counter);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, Run);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, RunAttack);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, BackWalk);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, G_SwordDamage);
+STATE_VIRTUAL_DEFINE(dAcGirahimuBase_c, KnifeDamage);
+
SPECIAL_ACTOR_PROFILE(B_GIRAHIMU_BASE, dAcGirahimuBase_c, fProfile::B_GIRAHIMU_BASE, 0x10D, 0, 0);
+
+void dAcGirahimuBase_c::callback_c::fn_226_DC0(mMtx_c &out, const mAng3_c &rot, const mAng yRot) {
+ mVec3_c translation;
+ mMtx_c transform;
+ out.getTranslation(translation);
+ transform.YrotS(yRot);
+ transform.YrotM(rot.y);
+ transform.XrotM(rot.x);
+ transform.YrotM(-yRot);
+ MTXConcat(transform, out, out);
+ out.setTranslation(translation);
+}
+
+void dAcGirahimuBase_c::callback_c::fn_226_E80() {
+ mVec3_c v0 = field_0x164;
+
+ mVec3_c v1 = v0 - field_0x21C;
+ v1.normalizeRS();
+
+ mVec3_c v2 = field_0x260 - v0;
+ v2.normalizeRS();
+
+ mVec3_c v3 = field_0x21C - v0;
+ v3.normalizeRS();
+
+ mVec3_c v4;
+ vecCross(v4, v2, v3);
+ v4.normalizeRS();
+
+ mVec3_c v5;
+ vecCross(v5, v4, v1);
+ v5.normalizeRS();
+
+ mVec3_c v6 = v5;
+ v5 = -v4;
+ v4 = -v6;
+
+ mMtx_c m0;
+ m0.setBase(0, v1);
+ m0.setBase(1, v4);
+ m0.setBase(2, v5);
+
+ mQuat_c q0;
+ m0.toQuat(q0);
+ field_0x1CC.slerpTo(q0, 1.0f, field_0x1CC);
+ field_0x19C.fromQuat(field_0x1CC);
+ field_0x19C.setTranslation(field_0x21C);
+
+ field_0x19C.scaleM(mpGhirahim->field_0x8BC);
+}
+
+void dAcGirahimuBase_c::callback_c::fn_226_1160() {
+ mVec3_c v0 = field_0x164;
+
+ mVec3_c v1 = field_0x260 - v0;
+ v1.normalizeRS();
+
+ mVec3_c v2 = field_0x260 - v0;
+ v2.normalizeRS();
+
+ mVec3_c v3;
+ v3 = field_0x21C - v0;
+ v3.normalizeRS();
+
+ mVec3_c v4;
+ vecCross(v4, v2, v3);
+ v4.normalizeRS();
+
+ mVec3_c v5;
+ vecCross(v5, v4, v1);
+ v5.normalizeRS();
+
+ mVec3_c v6 = v5;
+ v5 = -v4;
+ v4 = -v6;
+
+ mMtx_c m0;
+ m0.setBase(0, v1);
+ m0.setBase(1, v4);
+ m0.setBase(2, v5);
+
+ mQuat_c q0;
+ m0.toQuat(q0);
+ field_0x118.slerpTo(q0, 1.0f, field_0x118);
+ field_0x0E8.fromQuat(field_0x118);
+
+ if (mpGhirahim != nullptr && mpGhirahim->field_0xD71) {
+ mVec3_c diff = field_0x260 - field_0x21C;
+ mAng ang = (s32)diff.atan2sX_Z();
+ ang = ang - field_0x084;
+ if (ang > 0) {
+ field_0x0E8.XrotM(-ang);
+ }
+ }
+ field_0x0E8.setTranslation(field_0x164);
+ field_0x19C.scaleM(mpGhirahim->field_0x8BC);
+}
+
+void dAcGirahimuBase_c::callback_c::init(dAcGirahimuBase_c *pGhirahim) {
+ field_0x014 = 1.0f;
+ mMtx_c m0;
+ MTXIdentity(m0);
+ (void)mVec3_c(1.0f, 0.0f, 0.0f);
+ (void)mVec3_c(0.0f, 0.0f, -1.0f);
+ (void)mVec3_c(0.0f, 1.0f, 0.0f);
+ m0.toQuat(field_0x004);
+ m0.toQuat(field_0x118);
+ m0.toQuat(field_0x1CC);
+ mpGhirahim = pGhirahim;
+ field_0x2D4 = -1.0f;
+ field_0x2D0 = -1.0f;
+}
+
+void dAcGirahimuBase_c::callback_c::fn_226_1580(u32 node, nw4r::g3d::WorldMtxManip *result, nw4r::g3d::ResMdl) {
+ if (node == mNodeID_ArmR) {
+ field_0x2C0 = result;
+ result->GetMtx(field_0x19C);
+ field_0x19C.getTranslation(field_0x21C);
+ mVec3_c v0(-40.0f, -20.0f, -15.0f);
+ v0.rotY(field_0x084);
+ v0 += field_0x21C;
+ field_0x18C.set(v0);
+ if (!field_0x1E8) {
+ field_0x1E8 = true;
+ } else {
+ if (field_0x04E) {
+ fn_226_1DD0();
+ fn_226_24F0();
+ fn_226_24E0();
+ fn_226_1160();
+ fn_226_E80();
+ } else {
+ field_0x2BA = 0;
+ sLib::chaseAngle(field_0x0B4.ref(), 0, 0x1000);
+ mQuat_c q0;
+ field_0x19C.toQuat(q0);
+ field_0x1CC.slerpTo(q0, field_0x2D0, field_0x1CC);
+ if (field_0x2D0 < 1.0f) {
+ mMtx_c m0;
+ field_0x19C.fromQuat(field_0x1CC);
+ m0.scaleS(mpGhirahim->field_0x8BC);
+ MTXConcat(m0, field_0x19C, field_0x19C);
+ field_0x19C.setTranslation(field_0x21C);
+ }
+ }
+ result->SetMtx(field_0x19C);
+ }
+ } else if (node == mNodeID_ElbowR) {
+ field_0x2C4 = result;
+ if (!field_0x198) {
+ result->GetMtx(field_0x0E8);
+ field_0x0E8.getTranslation(field_0x164);
+ field_0x128.set(1.0f, 0.0f, 0.0f);
+ field_0x198 = true;
+ field_0x0E8.getTranslation(field_0x18C);
+ }
+
+ if (!field_0x04E) {
+ mMtx_c m0;
+ mQuat_c q0;
+ result->GetMtx(m0);
+ m0.toQuat(q0);
+
+ if (field_0x2D0 < 1.0f) {
+ field_0x118.slerpTo(q0, field_0x2D0, field_0x118);
+ field_0x0E8.fromQuat(field_0x118);
+ mMtx_c m1;
+ m1.scaleS(mpGhirahim->field_0x8BC);
+ MTXConcat(m1, field_0x0E8, field_0x0E8);
+ mVec3_c v0(field_0x234, 0.0f, 0.0f);
+ field_0x19C.multVec(v0, v0);
+ field_0x164.set(v0);
+ field_0x0E8.setTranslation(field_0x164);
+ } else {
+ field_0x118.slerpTo(q0, field_0x2D0, field_0x118);
+ result->GetMtx(field_0x0E8);
+ field_0x0E8.getTranslation(field_0x164);
+ }
+ }
+ result->SetMtx(field_0x0E8);
+ } else if (node == mNodeID_HandR) {
+ if (!field_0x2B8) {
+ field_0x2B8 = true;
+ result->GetMtx(field_0x278);
+ }
+ if (field_0x04E) {
+ if (mpGhirahim && !mpGhirahim->field_0xD71) {
+ mMtx_c m0;
+ result->GetMtx(m0);
+ m0.setTranslation(field_0x260);
+ sLib::chaseAngle(field_0x2BA.ref(), 0x2000, 0x200);
+ m0.YrotM(field_0x2BA);
+ mQuat_c q0;
+ m0.toQuat(q0);
+ field_0x2A8.slerpTo(q0, field_0x2D0, field_0x2A8);
+ field_0x278.fromQuat(field_0x2A8);
+ field_0x278.setTranslation(field_0x260);
+ }
+ } else {
+ field_0x2BA = 0;
+ if (field_0x2D0 < 1.0f) {
+ mMtx_c m0;
+ mQuat_c q0;
+ result->GetMtx(m0);
+ m0.toQuat(q0);
+ field_0x2A8.slerpTo(q0, 1.0f, field_0x2A8);
+ field_0x278.fromQuat(field_0x2A8);
+
+ mMtx_c scale;
+ scale.scaleS(mpGhirahim->field_0x8BC);
+ MTXConcat(scale, field_0x278, field_0x278);
+ mVec3_c v0(field_0x188, 0.0f, 0.0f);
+ field_0x0E8.multVec(v0, v0);
+ field_0x260.set(v0);
+ field_0x278.setTranslation(field_0x260);
+ } else {
+ result->GetMtx(field_0x278);
+ field_0x278.getTranslation(field_0x260);
+ field_0x278.toQuat(field_0x2A8);
+ }
+
+ if (mpGhirahim) {
+ field_0x254 = field_0x260 - field_0x21C;
+ field_0x254.rotY(-mpGhirahim->mRotation.y);
+ }
+ }
+ result->SetMtx(field_0x278);
+ }
+}
+
+void dAcGirahimuBase_c::callback_c::fn_226_1B60(mVec3_c &out) {
+ mMtx_c swordMtx;
+ dAcPy_c::GetLinkM()->getSwordModelMatrix(&swordMtx);
+ swordMtx.m[0][3] = 0.0f;
+ swordMtx.m[1][3] = 0.0f;
+ swordMtx.m[2][3] = 0.0f;
+
+ mVec3_c v0(-1.0f, 0.0f, 0.0f);
+ mVec3_c v1(0.0f, -1.0f, 0.0f);
+ mVec3_c v2(0.0f, 0.0f, -1.0f);
+ swordMtx.multVec(v0, v0);
+ swordMtx.multVec(v1, v1);
+ swordMtx.multVec(v2, v2);
+
+ (void)v2.atan2sX_Z();
+
+ mVec3_c v4(-5.0f, -2.0f, 15.0f);
+ if (mpGhirahim != nullptr && !mpGhirahim->field_0xD71) {
+ v4.z = 0.0f;
+ }
+ swordMtx.multVec(v4, v4);
+
+ mVec3_c v5 = dAcPy_c::GetLinkM()->getSwordPos() - dAcPy_c::GetLinkM()->vt_0x278();
+ if (mpGhirahim != nullptr && !mpGhirahim->field_0xD71) {
+ v5 *= 1.0f;
+ } else {
+ v5 *= 0.9f;
+ }
+ const mVec3_c &vt278 = dAcPy_c::GetLinkM()->vt_0x278();
+
+ v5 += vt278;
+ v5 += v4;
+ if (mpGhirahim != nullptr && !mpGhirahim->field_0xD71) {
+ v5.y -= 5.0f;
+ }
+
+ out.set(v5);
+}
+
+void dAcGirahimuBase_c::callback_c::fn_226_1DD0() {
+ mMtx_c swordMtx;
+ dAcPy_c::GetLinkM()->getSwordModelMatrix(&swordMtx);
+ swordMtx.m[0][3] = 0.0f;
+ swordMtx.m[1][3] = 0.0f;
+ swordMtx.m[2][3] = 0.0f;
+
+ mVec3_c v0(-1.0f, 0.0f, 0.0f);
+ mVec3_c v1(0.0f, -1.0f, 0.0f);
+ mVec3_c v2(0.0f, 0.0f, -1.0f);
+ swordMtx.multVec(v0, v0);
+ swordMtx.multVec(v1, v1);
+ swordMtx.multVec(v2, v2);
+
+ mVec3_c v3;
+ fn_226_1B60(v3);
+
+ mVec3_c v4 = v3;
+ mVec3_c v5;
+ v5 = v3 - field_0x21C;
+
+ if (v5.mag() >= (field_0x234 + field_0x188) * 0.9f) {
+ field_0x050 = true;
+ } else {
+ field_0x050 = false;
+ }
+ field_0x0B4.set(0);
+ if (mpGhirahim != nullptr && !mpGhirahim->field_0xD71) {
+ if (field_0x050) {
+ v3 -= field_0x21C;
+ v3.normalizeRS();
+ v3 *= (field_0x234 + field_0x188) * 0.9f;
+ v3 += field_0x21C;
+ }
+ mVec3_c v6 = v3 - field_0x21C;
+
+ dAcGirahimuBase_c *pAc = mpGhirahim;
+ mAng ang = mAng((s32)v6.atan2sX_Z());
+ ang = ang - pAc->mRotation.y;
+ mAng a;
+ switch (ang) {
+ case 0x2000 ... INT32_MAX: {
+ a = 0x2000 - ang;
+ v6.rotY(a);
+ v6 += field_0x21C;
+ v3 = v6;
+ } break;
+ case -0x1FFF ... 0x1FFF: {
+ // Do Nothing
+ } break;
+ default: {
+ a = -0x2000 - ang;
+ v6.rotY(a);
+ v6 += field_0x21C;
+ v3 = v6;
+ } break;
+ }
+
+ mVec3_c v7 = v3 - field_0x21C;
+ v7.rotY(-mpGhirahim->mRotation.y);
+
+ if (mpGhirahim->mHealth >= 100) {
+ if (--field_0x2BC <= 0) {
+ field_0x2BC = 60;
+ f32 z = v7.z;
+ v7.z = 0.0f;
+ v7.normalizeRS();
+ v7 *= 40.0f;
+ v7.z = z;
+ field_0x26C.set(v7);
+ }
+ v7.set(field_0x26C);
+ }
+ if (mpGhirahim->field_0xD50 > 0) {
+ cLib::addCalcPos2(&field_0x254, v7, 0.2f, 1000.0f);
+ } else {
+ cLib::addCalcPos2(&field_0x254, v7, 0.2f, field_0x2CC);
+ }
+
+ mVec3_c v8 = v7 - field_0x254;
+ f32 magV8 = v8.mag();
+
+ mVec3_c v9 = field_0x21C;
+ v9.y -= 10.0f;
+
+ field_0x098 = magV8;
+
+ mMtx_c m0;
+ m0.transS(v9);
+ m0.YrotM(mpGhirahim->mRotation.y);
+ m0.inverse();
+
+ mVec3_c v10 = field_0x260;
+ m0.multVec(v10, v10);
+ v10.z = 0.0f;
+ field_0x2E0.set(v10);
+
+ field_0x2D8 = v10.mag();
+
+ m0.transS(field_0x260);
+ m0.YrotM(mpGhirahim->mRotation.y);
+ m0.inverse();
+ m0.multVec(v4, v4);
+
+ v4.z = 0.0f;
+ field_0x2EC.set(v4);
+ mVec3_c v11 = field_0x254;
+ v11.rotY(mpGhirahim->mRotation.y);
+ v11 += field_0x21C;
+ cLib::addCalcPos2(&field_0x260, v11, 0.5f, 100.0f);
+ } else {
+ field_0x2BA = 0;
+ field_0x260.set(v3);
+ if (mpGhirahim != nullptr) {
+ field_0x254.set(field_0x260 - field_0x21C);
+ field_0x254.rotY(-mpGhirahim->mRotation.y);
+ }
+ mMtx_c m1;
+ m1.setBase(0, v2);
+ m1.setBase(1, v1);
+ m1.setBase(2, v0);
+
+ mQuat_c q0;
+ m1.toQuat(q0);
+
+ field_0x2A8.slerpTo(q0, field_0x2D0, field_0x2A8);
+ field_0x278.fromQuat(field_0x2A8);
+ field_0x278.setTranslation(field_0x260);
+ field_0x278.scaleM(1.05f, 1.05f, 1.05f);
+ }
+}
+
+void dAcGirahimuBase_c::callback_c::fn_226_24E0() {
+ return;
+}
+
+void dAcGirahimuBase_c::callback_c::fn_226_24F0() {
+ mVec3_c v3 = field_0x260;
+ mVec3_c v4 = field_0x18C;
+ mVec3_c v5 = v4 - v3;
+ v5.normalizeRS();
+ v5 *= field_0x188;
+ v5 += v3;
+ mVec3_c v1 = field_0x21C - v3;
+ v4.set(v5);
+ v4.normalizeRS();
+ v1 *= field_0x188;
+ v1 += v3;
+ if (v1.y <= v4.y) {
+ v4.y += v1.y - v4.y;
+ }
+ mVec3_c v6 = field_0x21C - v4;
+ v6.normalizeRS();
+ v6 *= field_0x234;
+ v6 += v4;
+
+ mVec3_c v2;
+ v1 = v6 - v3;
+ v2 = field_0x21C - v3;
+
+ v1.angle(v2);
+
+ mQuat_c q;
+ q.slerp(v1, v2, 1.0f);
+ mMtx_c m;
+ m.fromQuat(q);
+
+ mVec3_c v7 = v4 - v3;
+ m.multVec(v7, v7);
+ v7 += v3;
+ v1 = v7 - field_0x21C;
+ v4 = v7;
+ v1.normalizeRS();
+ v4 = v1 * field_0x234;
+ v4 += field_0x21C;
+ v1.set(v4);
+ v1 -= field_0x260;
+ v1.normalizeRS();
+ v4 = v1 * field_0x188;
+ v4 += field_0x260;
+ v1.set(v4);
+ cLib::addCalcPos2(&field_0x164, v4, 0.5f, 100.0f);
+}
+
+void dAcGirahimuBase_c::callback_c::timingB(u32 node, nw4r::g3d::WorldMtxManip *result, nw4r::g3d::ResMdl i_mdl) {
+ fn_226_1580(node, result, i_mdl);
+
+ mMtx_c m0;
+ if (node == mNodeID_Head) {
+ result->GetMtx(m0);
+ m0.getTranslation(field_0x08C);
+
+ mMtx_c m1;
+ result->GetMtx(m1);
+ fn_226_3150(m1);
+
+ mAng3_c a0(field_0x07E, field_0x07C, 0);
+ fn_226_DC0(m0, a0, field_0x084);
+ result->SetMtx(m0);
+ } else if (node == mNodeID_Hair1) {
+ mMtx_c m1;
+ result->GetMtx(m1);
+ m1.YrotM(-field_0x062.y);
+ m1.ZrotM(field_0x062.z);
+ result->SetMtx(m1);
+ } else if (node == mNodeID_Hair2) {
+ mMtx_c m1;
+ result->GetMtx(m1);
+ m1.YrotM(-field_0x062.y);
+ m1.ZrotM(field_0x062.z);
+ result->SetMtx(m1);
+ } else if (node == mNodeID_Hair3) {
+ mMtx_c m1;
+ result->GetMtx(m1);
+ m1.YrotM(-field_0x062.y);
+ m1.ZrotM(field_0x062.z);
+ result->SetMtx(m1);
+ } else if (node == mNodeID_Spine1) {
+ if (field_0x04E) {
+ if (mpGhirahim->field_0xD66 <= 0) {
+ mVec3_c v0;
+ fn_226_1B60(v0);
+ dAcGirahimuBase_c *pGhirahim = mpGhirahim;
+ mAng ang = cLib::targetAngleY(mpGhirahim->mPosition, v0);
+ ang = ang - pGhirahim->mRotation.y;
+ // What the....
+ if (mpGhirahim->field_0x8C8 != 1) {
+ sLib::chaseAngle(field_0x062.x.ref(), ang / 3, 0x80);
+ } else {
+ static s32 divVal = {2};
+ sLib::chaseAngle(field_0x062.x.ref(), ang / divVal, 0x80);
+ }
+ }
+ } else {
+ sLib::chaseAngle(field_0x062.x.ref(), 0, 0x80);
+ }
+ result->GetMtx(m0);
+ mAng3_c a0(field_0x058.y, field_0x058.x, 0);
+ fn_226_DC0(m0, a0, field_0x060);
+ m0.XrotM(field_0x062.x);
+ result->SetMtx(m0);
+ } else if (node == mNodeID_Spine2) {
+ result->GetMtx(m0);
+ mAng3_c a0(field_0x058.y, field_0x058.x, 0);
+ fn_226_DC0(m0, a0, field_0x060);
+ m0.XrotM(field_0x062.x);
+ result->SetMtx(m0);
+ } else if (node == mNodeID_ElbowR) {
+ fn_226_2FD0();
+ result->GetMtx(m0);
+ m0.YrotM(field_0x238);
+ result->SetMtx(m0);
+ } else if (node == mNodeID_ElbowL) {
+ fn_226_3080();
+ result->GetMtx(m0);
+ m0.YrotM(field_0x23A);
+ result->SetMtx(m0);
+ } else if (node == mNodeID_KneeL) {
+ result->GetMtx(m0);
+ mAng3_c a0(0, field_0x052.y / 2, 0);
+ fn_226_DC0(m0, a0, mpGhirahim->mRotation.y);
+ result->SetMtx(m0);
+ } else if (node == mNodeID_KneeR) {
+ result->GetMtx(m0);
+ mAng3_c a0(0, field_0x052.y / 2, 0);
+ fn_226_DC0(m0, a0, mpGhirahim->mRotation.y);
+ result->SetMtx(m0);
+ } else if (node == mNodeID_LegL) {
+ result->GetMtx(m0);
+ mAng3_c a0(0, field_0x052.y / 2, 0);
+ fn_226_DC0(m0, a0, mpGhirahim->mRotation.y);
+ result->SetMtx(m0);
+ } else if (node == mNodeID_LegR) {
+ result->GetMtx(m0);
+ mAng3_c a0(0, field_0x052.y / 2, 0);
+ fn_226_DC0(m0, a0, mpGhirahim->mRotation.y);
+ result->SetMtx(m0);
+ }
+}
+
+void dAcGirahimuBase_c::callback_c::fn_226_2FD0() {
+ sLib::chaseAngle(field_0x23C.ref(), 0, 0x150);
+ field_0x240 += 0x3500;
+ field_0x238 = field_0x23C * field_0x240.sin();
+}
+
+void dAcGirahimuBase_c::callback_c::fn_226_3080() {
+ sLib::chaseAngle(field_0x23E.ref(), 0, 0x150);
+ field_0x242 += 0x3500;
+ field_0x23A = field_0x23E * field_0x242.sin();
+}
+
+void dAcGirahimuBase_c::callback_c::fn_226_3130() {
+ sLib::chase(&field_0x2D0, field_0x2D4, 0.05f);
+}
+
+void dAcGirahimuBase_c::callback_c::fn_226_3150(mMtx_c &m) {
+ if (field_0x088 && mpGhirahim->field_0xD5C <= 10) {
+ mVec3_c v0;
+ m.getTranslation(v0);
+ m.m[2][3] = 0.0f;
+ m.m[1][3] = 0.0f;
+ m.m[0][3] = 0.0f;
+ mVec3_c v1(0.0f, 1.0f, 0.0f);
+ m.multVec(v1, v1);
+ s16 a0 = v1.atan2sX_Z();
+ s16 a1 = v1.atan2sY_XZ();
+ field_0x080 = cLib::targetAngleY(v0, mpGhirahim->field_0x88C) - a0;
+ field_0x082 = -(cLib::targetAngleX(v0, mpGhirahim->field_0x88C) - a1);
+ } else {
+ field_0x080 = 0;
+ field_0x082 = 0;
+ }
+
+ if (field_0x080 > 0x3000) {
+ field_0x080.set(0x3000);
+ } else if (field_0x080 < -0x3000) {
+ field_0x080 = -0x3000;
+ }
+
+ sLib::addCalcAngle(field_0x07C.ref(), field_0x080, 2, 0x500);
+ sLib::addCalcAngle(field_0x07E.ref(), field_0x082, 2, 0x500);
+
+ if (field_0x07E < 0x2000) {
+ if (field_0x07E + 0x1FFF > 0x3FFEu) {
+ field_0x07E = -0x2000;
+ }
+ } else {
+ field_0x07E.set(0x2000);
+ }
+}
+
+void dAcGirahimuBase_c::initializeState_Wait() {
+ field_0xD6C = 1;
+ fn_226_8B70("WaitA", 0, false, m3d::PLAY_MODE_4, 30.0f, 1.0f);
+ mCallback.field_0x088 = true;
+
+ field_0xD46 = 200;
+ field_0xD48 = 400;
+ field_0xD4A = 300;
+
+ field_0x1834 = 0.0f;
+ mSpeed = 0.0f;
+ if (dAcPy_c::GetLinkM()->isUsingSword()) {
+ mCallback.field_0x04E = true;
+ mCallback.field_0x2D4 = 0.2f;
+ mCallback.field_0x2D0 = 0.2f;
+ } else {
+ mCallback.field_0x04E = false;
+ mCallback.field_0x2D4 = 1.0f;
+ }
+}
+void dAcGirahimuBase_c::executeState_Wait() {
+ bool b0 = false;
+ if (dAcPy_c::GetLinkM()->isUsingSword() && field_0x1838 <= 250.0f) {
+ b0 = true;
+ }
+
+ if (dAcPy_c::GetLinkM()->isUsingSword() && field_0x1838 <= 370.0f) {
+ fn_226_BC00();
+ } else {
+ mCallback.field_0x04F = false;
+ mCallback.field_0x04E = false;
+ }
+
+ if (dAcPy_c::GetLinkM()->getBeetleInFlight() != nullptr) {
+ return;
+ }
+ mVec3_c distanceFromStart = mPosition - mStartingPos;
+ mVec3_c v1(0.0f, 0.0f, 1.0f);
+ v1.rotY(mRotation.y);
+ if (field_0x1868 >= 1500.0f && distanceFromStart.dot(v1) < 0.0f) {
+ field_0x8DC = 0;
+ changeState(StateID_HomeWarp);
+ return;
+ }
+ if (field_0xD46 <= 0 && mSwordLink.get()->isStick()) {
+ changeState(StateID_SearchSword);
+ return;
+ }
+
+ if (vt_0x210()) {
+ return;
+ }
+
+ if (mSwordLink.get()->isStick()) {
+ if (field_0xD46 % 100 > 50) {
+ field_0x88C = mSwordLink.get()->mPosition;
+ }
+ return;
+ }
+
+ if (field_0xD4A <= 0) {
+ vt_0x204();
+ return;
+ }
+
+ if (!b0) {
+ changeState(StateID_Walk);
+ return;
+ }
+ if (!(mSwordLink.get()->isStick() || turn(field_0x183E))) {
+ if (field_0x1838 <= 215.0f && --field_0xD4A <= 0) {
+ field_0xD4A = 0;
+ }
+
+ fn_226_8FF0("WaitA", ANM_WaitA, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ }
+
+ if (field_0x8CE == ANM_MovePose && mAnmChrs[4].checkFrame(43.0f)) {
+ fn_226_9190("WaitA", ANM_WaitA, m3d::PLAY_MODE_4, 15.0f, 1.0f);
+ fn_226_9260("WaitA", ANM_WaitA, m3d::PLAY_MODE_4, 15.0f, 1.0f);
+ }
+ if (field_0xD48 <= 0) {
+ fn_226_9190("MovePose", ANM_MovePose, m3d::PLAY_MODE_4, 15.0f, 1.0f);
+ fn_226_9260("MovePose", ANM_MovePose, m3d::PLAY_MODE_4, 15.0f, 1.0f);
+
+ field_0xD48 = 400 + cM::rndInt(100);
+ }
+
+ sLib::chaseAngle(mRotation.y.ref(), field_0x183E, 0x500);
+}
+void dAcGirahimuBase_c::finalizeState_Wait() {
+ field_0xD44 = 0;
+ mCallback.field_0x04E = false;
+ mCallback.field_0x2D4 = 1.0f;
+}
+
+void dAcGirahimuBase_c::initializeState_Walk() {
+ if (dAcPy_c::GetLinkM()->getBeetleInFlight() != nullptr) {
+ changeState(StateID_Wait);
+ return;
+ }
+
+ field_0xD6C = 1;
+ fn_226_8B70("Walk", ANM_Walk, false, m3d::PLAY_MODE_4, 15.0f, 1.0f);
+
+ mCallback.field_0x088 = true;
+ mCallback.field_0x04E = false;
+ mCallback.field_0x2D4 = 1.0f;
+
+ if (dAcPy_c::GetLinkM()->isUsingSword()) {
+ mCallback.field_0x04E = true;
+ mCallback.field_0x2D4 = 0.5f;
+ mCallback.field_0x2D0 = 0.0f;
+ } else {
+ mCallback.field_0x04E = false;
+ mCallback.field_0x2D4 = 1.0f;
+ }
+ mCallback.field_0x2CC = 0.0f;
+}
+void dAcGirahimuBase_c::executeState_Walk() {
+ if (mSwordLink.get()->isStick()) {
+ changeState(StateID_Wait);
+ return;
+ }
+
+ fn_226_BC00();
+
+ if (mCallback.field_0x04E) {
+ fn_226_90C0("WaitA", ANM_WaitA, m3d::PLAY_MODE_4, 15.0f, 1.0f);
+ } else {
+ mCallback.field_0x2BC = 0;
+ mCallback.field_0x098 = 10.0f;
+ fn_226_90C0("Walk", ANM_Walk, m3d::PLAY_MODE_4, 15.0f, 1.0f);
+ }
+
+ if (dAcPy_c::GetLinkM()->isUsingSword()) {
+ if (field_0x1838 <= 200.0f) {
+ changeState(StateID_Wait);
+ return;
+ }
+ } else {
+ if (field_0x1838 <= 150.0f) {
+ changeState(StateID_Panch);
+ return;
+ }
+ }
+ fn_226_B960(6.0f);
+}
+void dAcGirahimuBase_c::finalizeState_Walk() {}
+
+void dAcGirahimuBase_c::initializeState_Panch() {
+ fn_226_8B70("AttackBinta", ANM_AttackBinta, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ mCallback.field_0x088 = true;
+ field_0x1834 = 0.0f;
+ mSpeed = 0.0f;
+}
+void dAcGirahimuBase_c::executeState_Panch() {
+ field_0xD58 = 60;
+ sLib::chaseAngle(mRotation.y.ref(), field_0x183E, 0x500);
+ if (mAnmChrs[0].checkFrame(10.0f)) {
+ mSph0.SetR(100.0f);
+ mSph0.ClrCoSet();
+ mSph0.OnAtSet();
+ mSph0.SetAtFlagsUpper(0x40000);
+ return;
+ }
+ if (mAnmChrs[0].checkFrame(22.0f)) {
+ mSph0.SetR(40.0f);
+ mSph0.ClrAtSet();
+ mSph0.SetAtFlagsUpper(0);
+ return;
+ }
+
+ if (mAnmChrs[0].isStop()) {
+ changeState(StateID_Wait);
+ return;
+ }
+}
+void dAcGirahimuBase_c::finalizeState_Panch() {
+ mSph0.OnCoSet();
+ mSph0.SetR(40.0f);
+ mSph0.ClrAtSet();
+ mSph0.SetAtFlagsUpper(0);
+ field_0xD66 = 0;
+ field_0xD58 = 60;
+}
+
+void dAcGirahimuBase_c::initializeState_Catch() {
+ s32 flag = getFromParams(0, 0xFF);
+ if (flag != 0xFF) {
+ // 0xC0 -> zone temp flag: 0x1 01
+ SceneflagManager::sInstance->setFlag(mRoomID, flag);
+ }
+ vt_0x1FC();
+
+ mCollider.ClrCo();
+ field_0x1834 = 0.0f;
+ mSpeed = 0.0f;
+
+ field_0xD7E = false;
+ if (!field_0x1871 || cM::rndInt(100) > 50) {
+ field_0x1871 = true;
+ field_0xD7E = true;
+ fn_226_8C90("Catch", ANM_Catch, "Catch", ANM_Catch, "FaceTongue", ANM_FaceTonuge, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ } else {
+ fn_226_8C90("Catch", ANM_Catch, "Catch", ANM_Catch, "FaceSmaile", ANM_FaceSmaile, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ }
+
+ mCallback.field_0x088 = true;
+ dAcPy_c::GetLinkM()->set0x439F(this, 7);
+ mCallback.field_0x014 = 1.0f;
+ mCallback.field_0x2D4 = 0.5f;
+ field_0xD46 = 4;
+ field_0xD5E = 300;
+ if (!field_0x1872) {
+ field_0xD5E = 75;
+ }
+}
+void dAcGirahimuBase_c::executeState_Catch() {
+ if (field_0xD46 <= 0) {
+ field_0xD71 = true;
+ mCallback.field_0x04E = true;
+
+ if (vt_0x208()) {
+ return;
+ }
+ }
+
+ if (field_0xD46 <= 0 && !dAcPy_c::GetLinkM()->IfCurrentActionToActor(this, 0xA9 /* ??? */)) {
+ vt_0x220();
+ return;
+ }
+
+ field_0x88C += dAcPy_c::GetLink()->getSwordPos();
+ field_0x88C *= 0.5f;
+ if (--field_0xD5E <= 0) {
+ vt_0x22C();
+ return;
+ }
+
+ if (mAnmChrs[0].isStop()) {
+ if (field_0xD7E) {
+ fn_226_8C90(
+ "CatchLoop", ANM_CatchLoop, "CatchLoop", ANM_CatchLoop, "FaceTongue", ANM_FaceTonuge, m3d::PLAY_MODE_4,
+ 5.0f, 1.0f
+ );
+ } else {
+ fn_226_8C90(
+ "CatchLoop", ANM_CatchLoop, "CatchLoop", ANM_CatchLoop, "FaceSmaile", ANM_FaceSmaile, m3d::PLAY_MODE_4,
+ 5.0f, 1.0f
+ );
+ }
+ }
+
+ sLib::chaseAngle(mRotation.y.ref(), cLib::targetAngleY(mPosition, dAcPy_c::GetLink()->mPosition), 0x500);
+}
+void dAcGirahimuBase_c::finalizeState_Catch() {
+ mCallback.field_0x04E = false;
+ field_0xD71 = false;
+ mCollider.CoSet();
+ mCallback.field_0x2D4 = 1.0f;
+ s32 flag = getFromParams(0, 0xFF);
+ if (flag != 0xFF) {
+ // 0xC0 -> zone temp flag: 0x1 01
+ SceneflagManager::sInstance->unsetFlag(mRoomID, flag);
+ }
+}
+
+void dAcGirahimuBase_c::initializeState_ReleaseSword() {
+ field_0xD5A = 0;
+ field_0xD66 = 0;
+
+ mCallback.field_0x088 = false;
+ field_0xD6C = 1;
+ mSph0.ClrTgSet();
+ mCyl0.OnTgSet();
+
+ field_0x1834 = 0.0f;
+ mSpeed = 0.0f;
+}
+void dAcGirahimuBase_c::executeState_ReleaseSword() {
+ field_0xD81 = true;
+ fn_226_CC40();
+ mSph0.ClrTgSet();
+
+ sLib::chaseAngle(mRotation.y.ref(), field_0x183E, 0x500);
+ mCallback.field_0x04E = false;
+
+ if (mAnmChrs[0].checkFrame(35.0f)) {
+ mCallback.field_0x04E = false;
+ }
+ if (mAnmChrs[0].isStop()) {
+ vt_0x220();
+ }
+}
+void dAcGirahimuBase_c::finalizeState_ReleaseSword() {
+ mCallback.field_0x2BC = 0;
+ mSph0.OnTgSet();
+}
+
+void dAcGirahimuBase_c::initializeState_G_SwordDamage() {}
+void dAcGirahimuBase_c::executeState_G_SwordDamage() {}
+void dAcGirahimuBase_c::finalizeState_G_SwordDamage() {}
+
+void dAcGirahimuBase_c::initializeState_KnifeDamage() {
+ mCyl2.OnTgSet();
+ fn_226_8B70("KnifeDamage", ANM_KnifeDamage, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ mVec3_c pos = mPosition;
+ pos.y += 100.0f;
+ getSoundSource()->holdSoundAtPosition(SE_Girahim_DMG_KNIFE, pos);
+
+ mCallback.field_0x088 = false;
+ field_0xD44 = 0;
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+ field_0xD6C = 8;
+ field_0xD8E = false;
+}
+void dAcGirahimuBase_c::executeState_KnifeDamage() {
+ field_0xD8D = true;
+ if (mAnmChrs[0].isStop()) {
+ field_0xD8E = false;
+
+ if (field_0x1838 < 500.0f) {
+ changeState(StateID_BackStep);
+ } else {
+ vt_0x220();
+ }
+ }
+}
+void dAcGirahimuBase_c::finalizeState_KnifeDamage() {
+ field_0xD8E = false;
+}
+
+void dAcGirahimuBase_c::initializeState_CatchDamage() {}
+void dAcGirahimuBase_c::executeState_CatchDamage() {}
+void dAcGirahimuBase_c::finalizeState_CatchDamage() {}
+
+void dAcGirahimuBase_c::initializeState_LinkSwordGuardJust() {
+ field_0xD6C = 1;
+ mCallback.field_0x2D4 = 1.0f;
+ if (field_0x8C8 == ANM_AttackLSwordA) {
+ fn_226_8B70("GuardLSwordA", ANM_GuardLSwordA, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ } else {
+ fn_226_8B70("GuardLSwordB", ANM_GuardLSwordB, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ }
+ mCallback.field_0x088 = 0;
+ field_0xD72 = false;
+
+ mVec3_c throwForce(0.0f, 0.0f, 600.0f);
+ throwForce.rotY(mRotation.y - 0x7500);
+ throwForce += mPosition;
+ mSwordLink.get()->setThrow(throwForce, 0x1200, 29.0f);
+}
+void dAcGirahimuBase_c::executeState_LinkSwordGuardJust() {
+ if (mAnmChrs[0].isStop()) {
+ changeState(StateID_SearchSword);
+ }
+}
+void dAcGirahimuBase_c::finalizeState_LinkSwordGuardJust() {}
+
+void dAcGirahimuBase_c::initializeState_GetSword() {
+ field_0xD6C = 2;
+ field_0xD66 = 0;
+ field_0xD71 = true;
+
+ fn_226_8B70("GetSword", ANM_GetSword, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+
+ mCallback.field_0x014 = 1.0f;
+ mCallback.field_0x088 = true;
+ mCallback.field_0x2D4 = 1.0f;
+ mCallback.field_0x04E = true;
+
+ s32 flag = getFromParams(0, 0xFF);
+ if (flag != 0xFF) {
+ // 0xC1 -> zone temp flag: 0x1 02
+ SceneflagManager::sInstance->unsetFlag(mRoomID, flag + 1);
+ }
+}
+void dAcGirahimuBase_c::executeState_GetSword() {
+ if (vt_0x208()) {
+ field_0xD5A = 0;
+ mSwordLink.get()->setHide();
+ return;
+ }
+
+ if (mAnmChrs[0].getFrame() >= 8.0f) {
+ field_0x88C = mSwordLink.get()->mPosition;
+ }
+
+ if (dAcPy_c::GetLinkM()->IfCurrentActionToActor(this, 0xA9 /* ??? */) && mAnmChrs[0].checkFrame(8.0f)) {
+ if (dAcPy_c::GetLinkM()->vt_0x084(this, 0xA9 /* ??? */)) {
+ mCallback.field_0x04E = false;
+ field_0xD71 = false;
+ fn_226_AFB0();
+ mSwordLink.get()->setGetSword();
+ } else {
+ fn_226_D070();
+ fn_226_8B70("FreeUp", ANM_FreeUp, false, m3d::PLAY_MODE_4, 2.0f, 1.0f);
+ changeState(StateID_ReleaseSword);
+ return;
+ }
+ } else if (mAnmChrs[0].getFrame() < 8.0f && !dAcPy_c::GetLinkM()->IfCurrentActionToActor(this, 0xA9 /* ??? */)) {
+ fn_226_D070();
+ fn_226_8B70("FreeUp", ANM_FreeUp, false, m3d::PLAY_MODE_4, 2.0f, 1.0f);
+ changeState(StateID_ReleaseSword);
+ return;
+ }
+
+ if (mAnmChrs[0].checkFrame(36.0f)) {
+ mVec3_c unused = mCallback.field_0x260 - mPosition;
+ unused.rotY(-mRotation.y);
+
+ field_0xD72 = true;
+ mSwordLink.get()->setEquip();
+ field_0xD4C = 250;
+ }
+ if (mAnmChrs[0].isStop()) {
+ changeState(StateID_Link_SwordWait);
+ }
+}
+void dAcGirahimuBase_c::finalizeState_GetSword() {
+ field_0xD5A = 0;
+ field_0xD71 = false;
+}
+
+void dAcGirahimuBase_c::initializeState_SearchSword() {
+ mCallback.field_0x088 = true;
+ fn_226_8B70("Walk", ANM_Walk, false, m3d::PLAY_MODE_4, 15.0f, 1.2f);
+ mCyl2.OnTgSet();
+}
+void dAcGirahimuBase_c::executeState_SearchSword() {
+ field_0xD7C = false;
+
+ if (mSwordLink.get()->isHide()) {
+ mVec3_c distFromHome = mStartingPos - mPosition;
+ if (distFromHome.absXZ() > 800.0f) {
+ changeState(StateID_HomeWarp);
+ } else {
+ changeState(StateID_Wait);
+ }
+ return;
+ }
+
+ field_0x88C = mSwordLink.get()->mPosition;
+ s16 yTarget = cLib::targetAngleY(mPosition, mSwordLink.get()->mPosition);
+ sLib::chaseAngle(mRotation.y.ref(), yTarget, 0x200);
+ sLib::chaseAngle(mAngle.y.ref(), yTarget, 0x200);
+
+ s32 f0 = yTarget - mRotation.y;
+ f32 f = 1.f - std::abs(mAng(f0).normal_c());
+ if (f <= 0.9f) {
+ f = 0.0f;
+ fn_226_A070(yTarget);
+ } else {
+ fn_226_8B70("Walk", ANM_Walk, false, m3d::PLAY_MODE_4, 15.0f, 1.2f);
+ }
+ field_0x1834 = f * 8.0f * mAnmChrs[0].getRate();
+ mVec3_c v = mSwordLink.get()->mPosition - mPosition;
+ mAng a0 = (s32)v.atan2sX_Z();
+ a0 = a0 - mRotation.y;
+ if (v.absXZ() < 100.0f && mAng(a0).abs() < 0x4000) {
+ changeState(StateID_PickUpSword);
+ }
+}
+void dAcGirahimuBase_c::finalizeState_SearchSword() {
+ field_0xD7C = true;
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+ mCyl2.ClrTgSet();
+}
+
+void dAcGirahimuBase_c::initializeState_HomeWarp() {
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+ fn_226_8B70("MovePose", ANM_MovePose, false, m3d::PLAY_MODE_4, 15.0f, 1.5f);
+ mCallback.field_0x088 = true;
+ field_0xD44 = 0;
+ field_0xD6C = 0;
+}
+void dAcGirahimuBase_c::executeState_HomeWarp() {
+ mSph0.ClrTgSet();
+ mCyl2.ClrTgSet();
+ mCollider.ClrCo();
+
+ fn_226_BC00();
+
+ switch (field_0xD44) {
+ case 0: {
+ if (mAnmChrs[0].getFrame() >= 13.0f && sLib::chase(&field_0x8B0.x, 0.0f, 0.2f)) {
+ field_0xD44++;
+ mVec3_c v0 = dAcPy_c::GetLink()->mPosition - mStartingPos;
+ if (v0.absXZ() - 500.0f > 1000.0f) {
+ f32 f = 1000.0f;
+ v0.y = 0.0f;
+ v0.normalizeRS();
+ v0 *= f;
+ v0 += mStartingPos;
+ setPosition(v0);
+ setOldPosition(v0);
+ } else {
+ setPosition(mStartingPos);
+ setOldPosition(mStartingPos);
+ }
+ mRotation.y = cLib::targetAngleY(mPosition, dAcPy_c::GetLink()->mPosition);
+ field_0x8B0.set(0.0f, 0.0f, 0.0f);
+ field_0xD46 = 20;
+ }
+ } break;
+ case 1: {
+ if (field_0xD46 <= 0) {
+ field_0xD44++;
+ field_0x8B0.set(0.0f, 1.05f, 1.05f);
+ }
+ } break;
+ case 2: {
+ mCollider.CoSet();
+ if (sLib::chase(&field_0x8B0.x, 1.05f, 0.2f)) {
+ if (field_0xD72) {
+ changeState(StateID_Link_SwordWait);
+ } else {
+ vt_0x220();
+ }
+ }
+ } break;
+ }
+}
+void dAcGirahimuBase_c::finalizeState_HomeWarp() {
+ mCallback.field_0x2BC = 0;
+ field_0xD44 = 0;
+}
+
+void dAcGirahimuBase_c::initializeState_PickUpSword() {
+ field_0xD4C = 250;
+
+ fn_226_8B70("PickUp02", ANM_PickUp02, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ mCallback.field_0x088 = true;
+
+ field_0x1834 = 0.0f;
+ mSpeed = 0.0f;
+}
+void dAcGirahimuBase_c::executeState_PickUpSword() {
+ if (mSwordLink.get()->isHide()) {
+ vt_0x220();
+ return;
+ }
+
+ field_0x88C = mSwordLink.get()->mPosition;
+
+ if (mAnmChrs[0].checkFrame(16.0f)) {
+ field_0xD72 = true;
+ mSwordLink.get()->setEquip();
+ }
+
+ if (mAnmChrs[0].isStop()) {
+ changeState(StateID_Link_SwordWait);
+ }
+}
+void dAcGirahimuBase_c::finalizeState_PickUpSword() {}
+
+void dAcGirahimuBase_c::initializeState_Link_SwordWait() {
+ field_0xD6C = 2;
+ field_0x1872 = true;
+ if (!mbLinkSwordWaitFirstComplete) {
+ // Hah, quite the sword you have here. ...
+ mFlowMgr.triggerEntryPoint(201, 0x39, 0, 0);
+ fn_226_8B70("LookSword", ANM_LookSword, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ mCallback.field_0x088 = false;
+ } else {
+ fn_226_8B70("WaitBtB", ANM_WaitBtB, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ mCallback.field_0x088 = true;
+ }
+ field_0xD72 = true;
+ mSwordLink.get()->setEquip();
+ field_0xD46 = 10;
+ field_0x1834 = 0.0f;
+ mSpeed = 0.0f;
+}
+void dAcGirahimuBase_c::executeState_Link_SwordWait() {
+ if (!mbLinkSwordWaitFirstComplete) {
+ mFlowMgr.checkFinished();
+ }
+
+ mCyl2.SetR(40.0f);
+ if (field_0xD4C <= 0) {
+ changeState(StateID_ReturnSword);
+ return;
+ }
+
+ if (field_0x8C8 == ANM_LookSword) {
+ if (mAnmChrs[0].isStop()) {
+ changeState(StateID_Link_SwordWait);
+ return;
+ }
+ } else if (field_0xD46 <= 0) {
+ changeState(StateID_Link_SwordWalk);
+ return;
+ }
+
+ if (mCallback.field_0x07C.abs() < 0x1500 && field_0x1838 < 200.0f) {
+ changeState(StateID_Link_SwordAttack);
+ }
+}
+void dAcGirahimuBase_c::finalizeState_Link_SwordWait() {
+ mbLinkSwordWaitFirstComplete = true;
+}
+
+void dAcGirahimuBase_c::initializeState_Link_SwordWalk() {
+ fn_226_8B70("WalkBt", ANM_Walk, false, m3d::PLAY_MODE_4, 15.0f, 1.2f);
+ mCallback.field_0x088 = true;
+ field_0xD72 = true;
+ mSwordLink.get()->setEquip();
+ field_0xD6C = 2;
+}
+void dAcGirahimuBase_c::executeState_Link_SwordWalk() {
+ mCyl2.SetR(60.0f);
+ if (field_0xD4C <= 0) {
+ changeState(StateID_ReturnSword);
+ return;
+ }
+
+ sLib::chaseAngle(mRotation.y.ref(), field_0x183E, 0x500);
+ s32 f = field_0x183E - mRotation.y;
+
+ f32 f0 = 1.0f - std::abs(mAng(f).normal_c());
+ mAngle.y = mRotation.y;
+
+ if (f0 <= 0.6f) {
+ fn_226_A070(field_0x183E);
+ f0 = 2.0f;
+ } else if (field_0x8C8 != ANM_Walk) {
+ fn_226_8B70("WalkBt", ANM_Walk, false, m3d::PLAY_MODE_4, 15.0f, 1.2f);
+ }
+ field_0x1834 = f0 * 8.0f * mAnmChrs[0].getRate();
+
+ if (mCallback.field_0x07C.abs() < 0x1500 && field_0x1838 < 200.0f) {
+ changeState(StateID_Link_SwordAttack);
+ }
+}
+void dAcGirahimuBase_c::finalizeState_Link_SwordWalk() {
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+}
+
+void dAcGirahimuBase_c::initializeState_Link_SwordAttack() {
+ if (cM::rndInt(100) > 50) {
+ fn_226_8B70("AttackLSwordA", ANM_AttackLSwordA, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ } else {
+ fn_226_8B70("AttackLSwordB", ANM_AttackLSwordB, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ }
+ mCallback.field_0x088 = true;
+ field_0xD72 = true;
+ mSwordLink.get()->setEquip();
+ mCallback.field_0x2D4 = 1.0f;
+ mCallback.field_0x2D0 = 1.0f;
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+}
+void dAcGirahimuBase_c::executeState_Link_SwordAttack() {
+ mCyl2.SetR(90.0f);
+ sLib::chase(&field_0x8B0.x, 1.05f, 0.2f);
+ if (mAnmChrs[0].getFrame() < 29.0f) {
+ sLib::chaseAngle(mRotation.y.ref(), field_0x183E, 0x500);
+ }
+
+ if (mAnmChrs[0].checkFrame(30.0f)) {
+ mSwordLink.get()->getMdl().setProcActive(true);
+ mSwordLink.get()->getMdl().enableAttack();
+ return;
+ }
+ if (mAnmChrs[0].checkFrame(35.0f)) {
+ mSwordLink.get()->getMdl().setInactive();
+ mSwordLink.get()->getMdl().setProcActive(false);
+ return;
+ }
+
+ if (mAnmChrs[0].isStop()) {
+ changeState(StateID_Link_SwordWait);
+ return;
+ }
+}
+void dAcGirahimuBase_c::finalizeState_Link_SwordAttack() {
+ mSwordLink.get()->getMdl().setInactive();
+ mSwordLink.get()->getMdl().setProcActive(false);
+}
+
+void dAcGirahimuBase_c::initializeState_ReturnSword() {
+ field_0xD6C = 1;
+ fn_226_8B70("LSwordReturn", ANM_LSwordReturn, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ mCallback.field_0x088 = true;
+ field_0xD72 = true;
+ mSwordLink.get()->setEquip();
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+}
+void dAcGirahimuBase_c::executeState_ReturnSword() {
+ mCyl2.SetR(60.0f);
+ if (mAnmChrs[0].getFrame() < 37.0f) {
+ sLib::chaseAngle(mRotation.y.ref(), field_0x183E, 0x500);
+ }
+ if (mAnmChrs[0].checkFrame(37.0f)) {
+ field_0xD72 = false;
+ mVec3_c playerOffs(0.0f, 100.0f, 0.0f);
+ playerOffs.rotY(dAcPy_c::GetLink()->mRotation.y);
+ playerOffs += dAcPy_c::GetLink()->mPosition;
+ mVec3_c throwForce = playerOffs - mCallback.field_0x260;
+ throwForce.normalizeRS();
+ throwForce *= 100.0f;
+ mSwordLink.get()->setAtThrow(throwForce);
+ }
+ if (mAnmChrs[0].isStop()) {
+ changeState(StateID_SearchSword);
+ }
+}
+void dAcGirahimuBase_c::finalizeState_ReturnSword() {}
+
+void dAcGirahimuBase_c::initializeState_BackStep() {
+ if (field_0x8C8 == ANM_StepEnd) {
+ field_0xD7D = false;
+ fn_226_AAD0(600.0f, 15.0f);
+ fn_226_8B70("StepLoop", ANM_StepLoop, false, m3d::PLAY_MODE_4, 2.0f, 1.0f);
+ field_0xD44 = 2;
+ } else {
+ fn_226_8B70("StepStart", ANM_StepStart, false, m3d::PLAY_MODE_4, 2.0f, 1.0f);
+ field_0xD44 = 0;
+ }
+
+ mCyl2.ClrTgSet();
+ mSph0.ClrTgSet();
+
+ mCallback.field_0x04E = false;
+ field_0xD6C = 0;
+ mCallback.field_0x088 = true;
+ field_0xD46 = 3;
+}
+void dAcGirahimuBase_c::executeState_BackStep() {}
+void dAcGirahimuBase_c::finalizeState_BackStep() {
+ field_0xD44 = 0;
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+ field_0xD7C = true;
+ mSph0.OnTgSet();
+}
+
+void dAcGirahimuBase_c::initializeState_Escape() {
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+ fn_226_D070();
+ fn_226_8B70("StepEnd", ANM_StepEnd, false, m3d::PLAY_MODE_4, 2.0f, 1.0f);
+
+ mCyl2.ClrTgSet();
+ mSph0.ClrTgSet();
+
+ mCallback.field_0x04E = true;
+ mCallback.field_0x2D4 = 0.8f;
+ mCallback.field_0x2D0 = 0.8f;
+
+ field_0xD44 = 0;
+ field_0xD4E = 0;
+ field_0xD6C = 8;
+ field_0xD60 = 2;
+}
+void dAcGirahimuBase_c::executeState_Escape() {}
+void dAcGirahimuBase_c::finalizeState_Escape() {
+ field_0xD44 = 0;
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+ field_0xD7C = true;
+ field_0xD81 = false;
+ mSph0.OnTgSet();
+ field_0xD66 = 0;
+}
+
+void dAcGirahimuBase_c::initializeState_EscapeBack() {
+ if (field_0xD7B) {
+ fn_226_8B70("WaitBtC", ANM_WaitBtC, false, m3d::PLAY_MODE_4, 15.0f, 1.0f);
+ } else {
+ fn_226_8B70("WaitA", ANM_WaitA, false, m3d::PLAY_MODE_4, 15.0f, 1.0f);
+ }
+
+ mCyl2.ClrTgSet();
+ mSph0.ClrTgSet();
+ mCallback.field_0x04E = true;
+ mCallback.field_0x2D4 = 0.8f;
+ mCallback.field_0x2D0 = 0.8f;
+
+ field_0xD44 = 0;
+ field_0xD4E = 0;
+ field_0xD6C = 1;
+ field_0xD46 = 15;
+ mCallback.field_0x05E = 0xA80;
+}
+void dAcGirahimuBase_c::executeState_EscapeBack() {
+ mCyl2.ClrTgSet();
+ mSph0.ClrTgSet();
+ if (field_0xD46 <= 0) {
+ vt_0x220();
+ }
+ sLib::chaseAngle(mRotation.y.ref(), field_0x183E, 0x500);
+}
+void dAcGirahimuBase_c::finalizeState_EscapeBack() {
+ field_0xD44 = 0;
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+ mSph0.OnTgSet();
+}
+
+void dAcGirahimuBase_c::initializeState_FrontWarp() {
+ fn_226_8B70("MovePose", ANM_MovePose, false, m3d::PLAY_MODE_4, 15.0f, 2.0f);
+ mCallback.field_0x088 = true;
+ field_0xD44 = 0;
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+ field_0xD6C = 0;
+}
+void dAcGirahimuBase_c::executeState_FrontWarp() {}
+void dAcGirahimuBase_c::finalizeState_FrontWarp() {
+ mCollider.CoSet();
+ field_0xD44 = 0;
+ mCyl2.OnTgSet();
+}
+
+void dAcGirahimuBase_c::initializeState_FrontAttack() {
+ field_0x1834 = 0.0f;
+ mSpeed = 0.0f;
+ mCallback.field_0x088 = true;
+ field_0xD6C = 0;
+ if (vt_0x218()) {
+ field_0xD46 = 40;
+ } else {
+ field_0xD46 = 50;
+ }
+}
+void dAcGirahimuBase_c::executeState_FrontAttack() {}
+void dAcGirahimuBase_c::finalizeState_FrontAttack() {}
+
+void dAcGirahimuBase_c::initializeState_BackWarp() {
+ fn_226_8B70("MovePose", ANM_MovePose, false, m3d::PLAY_MODE_4, 15.0f, 2.0f);
+ mCallback.field_0x088 = true;
+ field_0xD44 = 0;
+ mCyl2.ClrTgSet();
+ mSpeed = 0.0f;
+ field_0x1834 = 0.0f;
+ field_0xD6C = 0;
+}
+void dAcGirahimuBase_c::executeState_BackWarp() {}
+void dAcGirahimuBase_c::finalizeState_BackWarp() {
+ mCollider.CoSet();
+ field_0xD44 = 0;
+ mCyl2.OnTgSet();
+}
+
+void dAcGirahimuBase_c::initializeState_BackAttack() {
+ field_0x1834 = 0.0f;
+ mSpeed = 0.0f;
+ vt_0x224();
+ mCallback.field_0x088 = true;
+ field_0xD6C = 0;
+ field_0xD46 = 50;
+}
+void dAcGirahimuBase_c::executeState_BackAttack() {}
+void dAcGirahimuBase_c::finalizeState_BackAttack() {}
+
+void dAcGirahimuBase_c::initializeState_Counter() {
+ field_0xD7E = false;
+ if (field_0x8C8 == ANM_PoseR) {
+ fn_226_8B70("PoseLAttack", ANM_PoseLAttack, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ } else if (field_0x8C8 == ANM_PoseL) {
+ fn_226_8B70("PoseRAttack", ANM_PoseRAttack, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ } else if (field_0x8C8 == ANM_PoseC) {
+ fn_226_8B70("PoseCAttack", ANM_PoseCAttack2, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ } else if (field_0x8C8 == ANM_PoseC2) {
+ fn_226_8B70("PoseCAttack", ANM_PoseCAttack, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ } else {
+ int rnd = cM::rndInt(90);
+ if (rnd > 60) {
+ fn_226_8B70("PoseLAttack", ANM_PoseLAttack, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ } else if (rnd > 30) {
+ fn_226_8B70("PoseRAttack", ANM_PoseRAttack, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ } else {
+ fn_226_8B70("PoseCAttack", ANM_PoseC, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ }
+ field_0xD7E = true;
+ }
+ field_0x1834 = 0.0f;
+ mSpeed = 0.0f;
+ mCallback.field_0x088 = true;
+ field_0xD6C = 5;
+}
+void dAcGirahimuBase_c::executeState_Counter() {}
+void dAcGirahimuBase_c::finalizeState_Counter() {
+ mMdlSwordA.setInactive();
+ mMdlSwordA.setProcActive(false);
+
+ mCyl2.OnTgSet();
+ field_0xD82 = false;
+}
+
+void dAcGirahimuBase_c::initializeState_Run() {
+ field_0xD6C = 3;
+ field_0xD44 = 0;
+
+ if (cM::rndInt(100) > 50) {
+ fn_226_8B70("AttackPoseL", ANM_AttackPoseL, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ } else {
+ fn_226_8B70("AttackPoseR", ANM_AttackPoseR, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ }
+ mCallback.field_0x088 = false;
+ field_0x1834 = 0.0f;
+}
+void dAcGirahimuBase_c::executeState_Run() {}
+void dAcGirahimuBase_c::finalizeState_Run() {
+ field_0x1834 = 0.0f;
+ field_0xD81 = false;
+}
+
+void dAcGirahimuBase_c::initializeState_RunAttack() {
+ field_0xD6C = 4;
+ if (fn_226_CC80()) {
+ fn_226_8B70("AttackSwordL", ANM_AttackSwordL, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ } else {
+ fn_226_8B70("AttackSwordR", ANM_AttackSwordR, false, m3d::PLAY_MODE_4, 5.0f, 1.0f);
+ }
+ mCallback.field_0x088 = true;
+ field_0x1834 = 0.0f;
+ field_0x1838 = 0.2f;
+}
+void dAcGirahimuBase_c::executeState_RunAttack() {}
+void dAcGirahimuBase_c::finalizeState_RunAttack() {
+ mMdlSwordA.setInactive();
+ mMdlSwordA.setProcActive(false);
+ field_0x1858 = 0.5f;
+}
+
+void dAcGirahimuBase_c::initializeState_BackWalk() {
+ field_0xD80 = false;
+ field_0xD6C = 6;
+ fn_226_8B70("WalkBt", ANM_Walk, false, m3d::PLAY_MODE_2, 15.0f, 1.0f);
+ mCallback.field_0x088 = true;
+ field_0xD46 = 50;
+ field_0x1834 = mAnmChrs[0].getRate() * -8.0f;
+}
+void dAcGirahimuBase_c::executeState_BackWalk() {
+ if (field_0xD46 <= 0) {
+ vt_0x220();
+ return;
+ }
+ fn_226_B960(6.0f);
+}
+void dAcGirahimuBase_c::finalizeState_BackWalk() {}
+
+dAcGirahimuBase_c::~dAcGirahimuBase_c() {
+ if (mpSoundSource != nullptr) {
+ if (mpSoundSource->hasPlayingSounds()) {
+ do {
+ VIWaitForRetrace();
+ } while (mpSoundSource->hasPlayingSounds());
+ }
+ }
+}
+
+void dAcGirahimuBase_c::initNodeData() {
+ nw4r::g3d::ResMdl mdl = mMdlBody.getResMdl();
+ mCallback.mNodeID_ShoulderR = mdl.GetResNode("ShoulderR").GetID();
+ mCallback.mNodeID_ShoulderL = mdl.GetResNode("ShoulderL").GetID();
+ mCallback.mNodeID_Hip = mdl.GetResNode("Hip").GetID();
+ mCallback.mNodeID_ArmR = mdl.GetResNode("ArmR").GetID();
+ mCallback.mNodeID_ArmL = mdl.GetResNode("ArmL").GetID();
+ mCallback.mNodeID_ElbowR = mdl.GetResNode("ElbowR").GetID();
+ mCallback.mNodeID_ElbowL = mdl.GetResNode("ElbowL").GetID();
+ mCallback.mNodeID_HandR = mdl.GetResNode("HandR").GetID();
+ mCallback.mNodeID_Head = mdl.GetResNode("Head").GetID();
+ mCallback.mNodeID_Neck = mdl.GetResNode("Neck").GetID();
+ mCallback.mNodeID_Hair1 = mdl.GetResNode("Hair1").GetID();
+ mCallback.mNodeID_Hair2 = mdl.GetResNode("Hair2").GetID();
+ mCallback.mNodeID_Hair3 = mdl.GetResNode("Hair3").GetID();
+ mCallback.mNodeID_Hair4 = mdl.GetResNode("Hair4").GetID();
+ mCallback.mNodeID_Spine1 = mdl.GetResNode("Spine1").GetID();
+ mCallback.mNodeID_Spine2 = mdl.GetResNode("Spine2").GetID();
+ mCallback.mNodeID_BrowL = mdl.GetResNode("BrowL").GetID();
+ mCallback.mNodeID_BrowR = mdl.GetResNode("BrowR").GetID();
+ mCallback.mNodeID_Chin = mdl.GetResNode("Chin").GetID();
+ mCallback.mNodeID_MouthL = mdl.GetResNode("MouthL").GetID();
+ mCallback.mNodeID_MouthR = mdl.GetResNode("MouthR").GetID();
+ mCallback.mNodeID_Upperjaw = mdl.GetResNode("Upperjaw").GetID();
+ mCallback.mNodeID_SklRoot = mdl.GetResNode("SklRoot").GetID();
+ mCallback.mNodeID_KneeR = mdl.GetResNode("KneeR").GetID();
+ mCallback.mNodeID_KneeL = mdl.GetResNode("KneeL").GetID();
+ mCallback.mNodeID_LegR = mdl.GetResNode("LegR").GetID();
+ mCallback.mNodeID_LegL = mdl.GetResNode("LegL").GetID();
+
+ mVec3_c nodeTranslation = mdl.GetResNode("ElbowR").GetTranslate();
+ mCallback.field_0x234 = nodeTranslation.mag() * 1.05f;
+ mCallback.field_0x17C = mdl.GetResNode("ElbowR").GetScale();
+
+ nodeTranslation = mdl.GetResNode("HandR").GetTranslate();
+ mCallback.field_0x188 = nodeTranslation.mag() * 1.05f;
+ mCallback.field_0x228 = mdl.GetResNode("ArmR").GetScale();
+}
+
+// 64B0
+bool dAcGirahimuBase_c::createHeap() {}
+
+// 6A10
+int dAcGirahimuBase_c::actorPostCreate() {}
+
+// 6AC0
+int dAcGirahimuBase_c::doDelete() {}
+
+// 6AD0
+int dAcGirahimuBase_c::preExecute() {}
+
+// 6B50
+void dAcGirahimuBase_c::vt_0x1DC() {}
+
+// 90C0
+int dAcGirahimuBase_c::draw() {}
+
+// 9520
+void dAcGirahimuBase_c::vt_0x1E0() {}
+
+// 9900
+void dAcGirahimuBase_c::vt_0x1E4() {}
+
+// 9B30
+void dAcGirahimuBase_c::vt_0x1E8() {}
+
+// 9CA0
+void dAcGirahimuBase_c::vt_0x1EC() {}
+
+// 9B20
+void dAcGirahimuBase_c::vt_0x1F0() {}
+
+// 9F60
+void dAcGirahimuBase_c::vt_0x21C() {}
+
+// AE30
+void dAcGirahimuBase_c::vt_0x1F4() {}
+
+// AEB0
+void dAcGirahimuBase_c::vt_0x1F8() {}
+
+// B0E0
+void dAcGirahimuBase_c::fn_226_CC40() {
+ mCyl0.SetTgType(
+ ~(AT_TYPE_PHYSICS | AT_TYPE_0x40 | AT_TYPE_SLINGSHOT | AT_TYPE_WIND | AT_TYPE_DAMAGE | AT_TYPE_WHIP |
+ AT_TYPE_0x8000 | AT_TYPE_BELLOWS | AT_TYPE_GLITTERING_SPORES | AT_TYPE_BEETLE | AT_TYPE_BUGNET)
+ );
+}
+
+// B100
+void dAcGirahimuBase_c::vt_0x220() {}
+
+// B150
+void dAcGirahimuBase_c::vt_0x200() {}
+
+// B190
+void dAcGirahimuBase_c::vt_0x204() {}
+
+// B1C0
+void dAcGirahimuBase_c::vt_0x228() {}
+
+// B300
+bool dAcGirahimuBase_c::vt_0x208() {}
+
+// B4D0
+void dAcGirahimuBase_c::vt_0x20C() {}
+
+// B4F0
+void dAcGirahimuBase_c::vt_0x22C() {}
+
+// B740
+void dAcGirahimuBase_c::vt_0x214() {}