From efcc715a9cd78a76774eab7f7e7ba5a3743bcfbf Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 27 Sep 2026 17:30:42 -0400 Subject: [PATCH 1/5] d_a_girahimu_sword_beam --- .../d_a_girahimu_sword_beamNP/symbols.txt | 56 +- include/d/a/d_a_girahimu_sword_beam.h | 66 +- src/REL/d/a/d_a_girahimu_sword_beam.cpp | 675 +++++++++++++++++- 3 files changed, 764 insertions(+), 33 deletions(-) diff --git a/config/SOUE01/rels/d_a_girahimu_sword_beamNP/symbols.txt b/config/SOUE01/rels/d_a_girahimu_sword_beamNP/symbols.txt index 5725bf77..7131775a 100644 --- a/config/SOUE01/rels/d_a_girahimu_sword_beamNP/symbols.txt +++ b/config/SOUE01/rels/d_a_girahimu_sword_beamNP/symbols.txt @@ -4,36 +4,36 @@ _unresolved = .text:0x00000060; // type:function size:0x4 scope:global __register_global_object = .text:0x00000070; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global dAcGirahimuSwordBeam_c_classInit__Fv = .text:0x000000F0; // type:function size:0x15C -fn_240_250 = .text:0x00000250; // type:function size:0x58 -fn_240_2B0 = .text:0x000002B0; // type:function size:0x90 +__dt__15dShadowCircle_cFv = .text:0x00000250; // type:function size:0x58 +__dt__22dCcD_Linked<8dCcD_Cps>Fv = .text:0x000002B0; // type:function size:0x90 __dt__35sFState_c<22dAcGirahimuSwordBeam_c>Fv = .text:0x00000340; // type:function size:0x58 __dt__38sFStateFct_c<22dAcGirahimuSwordBeam_c>Fv = .text:0x000003A0; // type:function size:0x6C __dt__91sStateMgr_c<22dAcGirahimuSwordBeam_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000410; // type:function size:0xA0 __dt__61sFStateMgr_c<22dAcGirahimuSwordBeam_c,20sStateMethodUsr_FI_c>Fv = .text:0x000004B0; // type:function size:0xA4 -fn_240_560 = .text:0x00000560; // type:function size:0x8 -fn_240_570 = .text:0x00000570; // type:function size:0x1EC +createHeap__22dAcGirahimuSwordBeam_cFv = .text:0x00000560; // type:function size:0x8 +create__22dAcGirahimuSwordBeam_cFv = .text:0x00000570; // type:function size:0x1EC changeState__91sStateMgr_c<22dAcGirahimuSwordBeam_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000760; // type:function size:0x10 -fn_240_770 = .text:0x00000770; // type:function size:0x8 -fn_240_780 = .text:0x00000780; // type:function size:0x5A4 +doDelete__22dAcGirahimuSwordBeam_cFv = .text:0x00000770; // type:function size:0x8 +actorExecute__22dAcGirahimuSwordBeam_cFv = .text:0x00000780; // type:function size:0x5A4 executeState__91sStateMgr_c<22dAcGirahimuSwordBeam_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000D30; // type:function size:0x10 getStateID__91sStateMgr_c<22dAcGirahimuSwordBeam_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000D40; // type:function size:0x10 -fn_240_D50 = .text:0x00000D50; // type:function size:0x8C +draw__22dAcGirahimuSwordBeam_cFv = .text:0x00000D50; // type:function size:0x8C initializeState_BulletMove__22dAcGirahimuSwordBeam_cFv = .text:0x00000DE0; // type:function size:0xA8 executeState_BulletMove__22dAcGirahimuSwordBeam_cFv = .text:0x00000E90; // type:function size:0x10C finalizeState_BulletMove__22dAcGirahimuSwordBeam_cFv = .text:0x00000FA0; // type:function size:0x4 initializeState_Damage__22dAcGirahimuSwordBeam_cFv = .text:0x00000FB0; // type:function size:0x28 executeState_Damage__22dAcGirahimuSwordBeam_cFv = .text:0x00000FE0; // type:function size:0x4 finalizeState_Damage__22dAcGirahimuSwordBeam_cFv = .text:0x00000FF0; // type:function size:0x4 -fn_240_1000 = .text:0x00001000; // type:function size:0xC0 -fn_240_10C0 = .text:0x000010C0; // type:function size:0x6C -fn_240_1130 = .text:0x00001130; // type:function size:0x24 -fn_240_1160 = .text:0x00001160; // type:function size:0x8C -fn_240_11F0 = .text:0x000011F0; // type:function size:0x18C -fn_240_1380 = .text:0x00001380; // type:function size:0x338 -fn_240_16C0 = .text:0x000016C0; // type:function size:0x44 -fn_240_1710 = .text:0x00001710; // type:function size:0xA8 -fn_240_17C0 = .text:0x000017C0; // type:function size:0x44 -fn_240_1810 = .text:0x00001810; // type:function size:0xD0C +swordBeamReturn__22dAcGirahimuSwordBeam_cFl = .text:0x00001000; // type:function size:0xC0 +startMoveEmitters__22dAcGirahimuSwordBeam_cFv = .text:0x000010C0; // type:function size:0x6C +startDisappearEmitter__22dAcGirahimuSwordBeam_cFv = .text:0x00001130; // type:function size:0x24 +transformMatrix__22dAcGirahimuSwordBeam_cFv = .text:0x00001160; // type:function size:0x8C +fn_240_11F0__22dAcGirahimuSwordBeam_cFv = .text:0x000011F0; // type:function size:0x18C +fn_240_1380__22dAcGirahimuSwordBeam_cFv = .text:0x00001380; // type:function size:0x338 +fn_240_16C0__22dAcGirahimuSwordBeam_cFv = .text:0x000016C0; // type:function size:0x44 +fn_240_1710__22dAcGirahimuSwordBeam_cFv = .text:0x00001710; // type:function size:0xA8 +fn_240_17C0__22dAcGirahimuSwordBeam_cFl = .text:0x000017C0; // type:function size:0x44 +fn_240_1810__22dAcGirahimuSwordBeam_cFUlR7mAng3_cRC4mAng = .text:0x00001810; // type:function size:0xD0C __dt__22dAcGirahimuSwordBeam_cFv = .text:0x00002520; // type:function size:0x1A4 build__38sFStateFct_c<22dAcGirahimuSwordBeam_c>FRC12sStateIDIf_c = .text:0x000026D0; // type:function size:0x60 dispose__38sFStateFct_c<22dAcGirahimuSwordBeam_c>FRP10sStateIf_c = .text:0x00002730; // type:function size:0xC @@ -52,7 +52,7 @@ initializeState__37sFStateID_c<22dAcGirahimuSwordBeam_c>CFR22dAcGirahimuSwordBea __sinit_\d_a_girahimu_sword_beam_cpp = .text:0x00002890; // type:function size:0x1C8 scope:local __dt__37sFStateID_c<22dAcGirahimuSwordBeam_c>Fv = .text:0x00002A60; // type:function size:0x58 isSameName__37sFStateID_c<22dAcGirahimuSwordBeam_c>CFPCc = .text:0x00002AC0; // type:function size:0x88 -fn_240_2B50 = .text:0x00002B50; // type:function size:0x8 +@272@__dt__22dCcD_Linked<8dCcD_Cps>Fv = .text:0x00002B50; // type:function size:0x8 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global @@ -69,16 +69,16 @@ lbl_240_data_9C = .data:0x0000009C; // type:object size:0x4 data:4byte lbl_240_data_A0 = .data:0x000000A0; // type:object size:0x4 data:4byte lbl_240_data_A4 = .data:0x000000A4; // type:object size:0x4 data:4byte lbl_240_data_A8 = .data:0x000000A8; // type:object size:0x30 data:4byte -lbl_240_data_D8 = .data:0x000000D8; // type:object size:0x80 -lbl_240_data_158 = .data:0x00000158; // type:object size:0x30 -lbl_240_data_188 = .data:0x00000188; // type:object size:0x30 -lbl_240_data_1B8 = .data:0x000001B8; // type:object size:0x18 -lbl_240_data_1D0 = .data:0x000001D0; // type:object size:0x18 -lbl_240_data_1E8 = .data:0x000001E8; // type:object size:0x70 -lbl_240_data_258 = .data:0x00000258; // type:object size:0xA8 +__vt__22dAcGirahimuSwordBeam_c = .data:0x000000D8; // type:object size:0x80 +__vt__61sFStateMgr_c<22dAcGirahimuSwordBeam_c,20sStateMethodUsr_FI_c> = .data:0x00000158; // type:object size:0x30 +__vt__91sStateMgr_c<22dAcGirahimuSwordBeam_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000188; // type:object size:0x30 +__vt__38sFStateFct_c<22dAcGirahimuSwordBeam_c> = .data:0x000001B8; // type:object size:0x18 +__vt__35sFState_c<22dAcGirahimuSwordBeam_c> = .data:0x000001D0; // type:object size:0x18 +__vt__22dCcD_Linked<8dCcD_Cps> = .data:0x000001E8; // type:object size:0x70 +__vt__15dShadowCircle_c = .data:0x00000258; // type:object size:0xA8 lbl_240_data_300 = .data:0x00000300; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global lbl_240_bss_8 = .bss:0x00000008; // type:object size:0x10 data:2byte -lbl_240_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte -lbl_240_bss_58 = .bss:0x00000058; // type:object size:0x30 data:4byte -lbl_240_bss_88 = .bss:0x00000088; // type:object size:0x2 data:2byte +StateID_BulletMove__22dAcGirahimuSwordBeam_c = .bss:0x00000018; // type:object size:0x30 data:4byte +StateID_Damage__22dAcGirahimuSwordBeam_c = .bss:0x00000058; // type:object size:0x30 data:4byte +sSomeAngle = .bss:0x00000088; // type:object size:0x2 data:2byte diff --git a/include/d/a/d_a_girahimu_sword_beam.h b/include/d/a/d_a_girahimu_sword_beam.h index 7f81614c..f06b621d 100644 --- a/include/d/a/d_a_girahimu_sword_beam.h +++ b/include/d/a/d_a_girahimu_sword_beam.h @@ -1,19 +1,83 @@ #ifndef D_A_GIRAHIMU_SWORD_BEAM_H #define D_A_GIRAHIMU_SWORD_BEAM_H +#include "c/c_lib.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s_acch.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_cc.h" +#include "d/d_shadow.h" +#include "m/m_angle.h" #include "s/s_State.hpp" +#include "toBeSorted/d_emitter.h" class dAcGirahimuSwordBeam_c : public dAcObjBase_c { public: dAcGirahimuSwordBeam_c() : mStateMgr(*this) {} virtual ~dAcGirahimuSwordBeam_c() {} + virtual int create() override; + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorExecute() override; + STATE_FUNC_DECLARE(dAcGirahimuSwordBeam_c, BulletMove); STATE_FUNC_DECLARE(dAcGirahimuSwordBeam_c, Damage); + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcGirahimuSwordBeam_c); + STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcGirahimuSwordBeam_c); + STATE_MGR_DEFINE_UTIL_ISSTATE(dAcGirahimuSwordBeam_c); + + void swordBeamReturn(s32); + void startMoveEmitters(); + void startDisappearEmitter(); + void transformMatrix(); + void fn_240_11F0(); + void fn_240_1380(); + void fn_240_16C0(); + void fn_240_1710(); + void fn_240_17C0(s32); + void fn_240_1810(u32, mAng3_c &, const mAng &); + + void setB00(s16 x, s16 y, s16 z) { + field_0xB00 = x; + field_0xB02 = y; + field_0xB04 = z; + } + + mAng getLinkedAngle() const { + return (cLib::targetAngleY(mPosition, field_0xAF4.get()->mPosition)); + } + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcGirahimuSwordBeam_c); + /* 0x330 */ dShadowCircle_c mShadow; + /* 0x338 */ dBgS_AcchCir mAcchCir; + /* 0x394 */ dBgS_ObjAcch mAcch; + /* 0x744 */ dCcD_Linked mCps0; + /* 0x8C4 */ dCcD_Linked mCps1; + /* 0xA40 */ dColliderLinkedList mCollider; + /* 0xA50 */ STATE_MGR_DECLARE(dAcGirahimuSwordBeam_c); + /* 0xA8C */ dEmitter_c mEmitter0; + /* 0xAC0 */ dEmitter_c mEmitter1; + /* 0xAF4 */ dAcObjRef_c field_0xAF4; + /* 0xB00 */ s16 field_0xB00; + /* 0xB02 */ s16 field_0xB02; + /* 0xB04 */ s16 field_0xB04; + /* 0xB06 */ s16 field_0xB06; + /* 0xB08 */ s16 field_0xB08; + /* 0xB0A */ s16 field_0xB0A; + /* 0xB0C */ f32 field_0xB0C; + /* 0xB10 */ s32 field_0xB10; + /* 0xB14 */ mAng field_0xB14; + /* 0xB16 */ s16 field_0xB16; + /* 0xB18 */ u16 field_0xB18; + /* 0xB1C */ s32 field_0xB1C; + /* 0xB20 */ s32 field_0xB20; + /* 0xB24 */ u8 field_0xB24; + /* 0xB25 */ u8 field_0xB25; + /* 0xB26 */ u8 field_0xB26; + /* 0xB27 */ u8 field_0xB27; }; #endif diff --git a/src/REL/d/a/d_a_girahimu_sword_beam.cpp b/src/REL/d/a/d_a_girahimu_sword_beam.cpp index e0fecd1b..01033dc6 100644 --- a/src/REL/d/a/d_a_girahimu_sword_beam.cpp +++ b/src/REL/d/a/d_a_girahimu_sword_beam.cpp @@ -1,13 +1,680 @@ #include "d/a/d_a_girahimu_sword_beam.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_base.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_cc.h" +#include "d/d_vec.h" +#include "d/snd/d_snd_wzsound.h" +#include "f/f_base.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" +#include "m/m_quat.h" +#include "m/m_sphere.h" +#include "m/m_vec.h" +#include "toBeSorted/d_emitter.h" + SPECIAL_ACTOR_PROFILE(GH_SWORD_BEAM, dAcGirahimuSwordBeam_c, fProfile::GH_SWORD_BEAM, 0x116, 0, 0); STATE_DEFINE(dAcGirahimuSwordBeam_c, BulletMove); STATE_DEFINE(dAcGirahimuSwordBeam_c, Damage); -void dAcGirahimuSwordBeam_c::initializeState_BulletMove() {} -void dAcGirahimuSwordBeam_c::executeState_BulletMove() {} +static dCcD_SrcCps sSrcCps0 = { + { + {AT_TYPE_DAMAGE, 0x1000D, {0, 0, 0}, 4, 0, 0, 0, CUT_DIR_NONE, 0}, + {~(AT_TYPE_COMMON0 | AT_TYPE_DAMAGE), 0x111, {0, 0, 0x407}, 0, CUT_DIR_NONE}, + {0}, + }, + {20.0f}, +}; +static dCcD_SrcCps sSrcCps1 = { + { + {AT_TYPE_DAMAGE, 0x1001D, {0, 0, 0}, 4, 0, 0, 0, CUT_DIR_NONE, 0}, + {(AT_TYPE_0x800000 | AT_TYPE_0x40 | AT_TYPE_SWORD), 0x111, {0, 0, 0x407}, 0, CUT_DIR_NONE}, + {0}, + }, + {50.0f}, +}; + +struct dAcGirahimuSwordBeam_HIO_c { + f32 f0; + f32 f1; + u16 s0; + u16 s1; + + static const dAcGirahimuSwordBeam_HIO_c sInstance; +}; +const dAcGirahimuSwordBeam_HIO_c dAcGirahimuSwordBeam_HIO_c::sInstance = {1.17f, 1.21f, 20, 15}; + +static mAng sSomeAngle = 0; + +bool dAcGirahimuSwordBeam_c::createHeap() { + return true; +} + +int dAcGirahimuSwordBeam_c::create() { + mAngle.y = getXZAngleToPlayer(); + field_0xB1C = getFromParams(0, 0xF); + CREATE_ALLOCATOR(dAcGirahimuSwordBeam_c); + mAcch.Set(this, 1, &mAcchCir); + mAcchCir.SetWall(50.0f, 70.0f); + mStts.SetRank(3); + mCollider.addCc(mCps1, sSrcCps1); + mCollider.addCc(mCps0, sSrcCps0); + mCollider.SetStts(mStts); + + mCps0.ClrTgSet(); + mCps0.ClrCoSet(); + + mCps1.ClrAtSet(); + mCps1.ClrCoSet(); + + mRotation.x = 0; + mRotation.z = 0; + if (field_0xB1C == 0) { + mRotation.z -= 0x4000; + } + transformMatrix(); + mMaxSpeed = -60.0f; + + mEmitter0.init(this); + mEmitter1.init(this); + + field_0xB16 = -1; + field_0xB24 = 0; + field_0xB25 = 0; + + field_0xB00 = 0; + field_0xB02 = 0; + field_0xB04 = 0; + field_0xB26 = 0; + field_0xB27 = 0; + field_0xB18 = 0; + if (field_0xB1C == 1) { + field_0xB0C = 250.0f; + } else { + field_0xB0C = 150.0f; + } + field_0xB06 = 0; + field_0xB08 = 0; + field_0xB0A = 0; + field_0xB10 = 200; + + startSound(SE_BGh3_SW_BEAM_ATTACK); + changeState(StateID_BulletMove); + + return SUCCEEDED; +} + +int dAcGirahimuSwordBeam_c::doDelete() { + return SUCCEEDED; +} + +int dAcGirahimuSwordBeam_c::actorExecute() { + s32 _weird_zero = 0; + holdSound(SE_BGh3_SW_BEAM_LV); + + if (field_0xB20 == 0 && field_0xB25 == 1) { + field_0xB16 = 0xF; + field_0xB25 = 0; + } + + if (field_0xB18 == 0) { + if (mCps1.ChkTgSet() == 0) { + mCps1.OnTgSet(); + } + fn_240_11F0(); + } + + executeState(); + + mMtx_c m; + m.YrotS(mAngle.y); + m.XrotM(-mAngle.x); + mVec3_c vel(0.0f, 0.0f, mSpeed); + m.multVec(vel, mVelocity); + + mPosition += mVelocity; + + if (field_0xB27 == 0) { + mRotation.x = -mAngle.x; + mRotation.y = mAngle.y; + } else { + mRotation.x += field_0xB06; + mRotation.z += field_0xB0A; + mRotation.y += field_0xB08; + field_0xB14 += sSomeAngle; + } + + transformMatrix(); + + if (isState(StateID_BulletMove)) { + startMoveEmitters(); + + if (field_0xB24 != 0) { + mAcch.SetGroundUpY(_weird_zero + -80.0f); + } else if (field_0xB1C == 0) { + mAcch.SetGroundUpY(_weird_zero + 60.0f); + } else if (field_0xB1C == 1) { + mAcch.SetGroundUpY(_weird_zero + 40.0f); + } + + mAcch.CrrPos(*dBgS::GetInstance()); + } + + mMtx_c m1; + m1.ZXYrotS(mRotation); + m1.ZrotM(0x4000); + mVec3_c b1; + m1.getBase(1, b1); + + f32 scale1 = 50.0f; + b1 *= 110.0f; + b1 *= mScale.x; + scale1 *= mScale.x; + mVec3_c p1 = mPosition; + if (field_0xB20 == 0) { + getXZCirclePoint(p1, mAngle.y, scale1); + } + mCps0.Set(p1 + b1, p1 - b1); + + f32 scale0 = 45.0f; + scale0 *= mScale.x; + b1 *= 0.85f; + mVec3_c p0 = p1; + getXZCirclePoint(p0, mAngle.y, scale0); + mCps1.Set(p0 + b1, p0 - b1); + + ; + mCollider.registerColliders(); + if (field_0xB20 != 1) { + if (field_0xB16 > 0) { + field_0xB16--; + if (field_0xB16 < 10) { + if (field_0xB26 != 0) { + mEmitter0.setFading(10); + } else { + mEmitter1.setFading(10); + } + field_0xB10 -= 10.0f; + } + } else if (field_0xB16 == 0) { + deleteRequest(); + } + } + + if (field_0xB18 != 0) { + field_0xB18--; + if (mCps1.ChkTgSet()) { + mCps1.ClrTgSet(); + } + } + + return SUCCEEDED; +} + +int dAcGirahimuSwordBeam_c::draw() { + mSphere_c sph(mVec3_c(0.0f, 0.0f, 0.0f), field_0xB0C); + drawShadow(mShadow, nullptr, mWorldMtx, &sph, -1, field_0xB10, -1, -1, -1, mPosition.y - mAcch.GetGroundH()); + return SUCCEEDED; +} + +void dAcGirahimuSwordBeam_c::initializeState_BulletMove() { + s32 _weird_zero = 0; + mSpeed = 29.0f + _weird_zero; + mMtx_c m; + m.YrotS(mAngle.y); + m.XrotM(-mAngle.x); + mVec3_c vel(0.0f, 0.0f, mSpeed); + m.multVec(vel, mVelocity); +} +void dAcGirahimuSwordBeam_c::executeState_BulletMove() { + if ((mCps0.ChkAtHit() && !mCps0.GetAtFlag0x8()) || mAcch.ChkGndHit() || mAcch.ChkWallHit(nullptr) || + mAcch.ChkWaterIn()) { + mCps0.SetAtRpm(0); + mCps0.ClrAtActorInfo(); + mCps0.SubtractAtEffCounter(); + + if (field_0xB26 != 0) { + mEmitter0.remove(true); + } else { + mEmitter1.remove(true); + } + + startDisappearEmitter(); + + startSound(SE_BGh3_SW_BEAM_DISAPPEAR); + changeState(StateID_Damage); + } +} void dAcGirahimuSwordBeam_c::finalizeState_BulletMove() {} -void dAcGirahimuSwordBeam_c::initializeState_Damage() {} -void dAcGirahimuSwordBeam_c::executeState_Damage() {} + +void dAcGirahimuSwordBeam_c::initializeState_Damage() { + mSpeed = 0.0f; + mVelocity.set(0.0f, 0.0f, 0.0f); + mCps0.ClrAtSet(); +} +void dAcGirahimuSwordBeam_c::executeState_Damage() { + deleteRequest(); +} void dAcGirahimuSwordBeam_c::finalizeState_Damage() {} + +void dAcGirahimuSwordBeam_c::swordBeamReturn(s32 param1) { + if (field_0xB20 == 1) { + fn_240_17C0(param1); + mAngle.y = getXZAngleToPlayer(); + mCps0.SetAtGrp(0xC); + mCps0.OffAtGrp(0x2); + fn_240_16C0(); + field_0xB20 = 0; + field_0xB18 = 10; + field_0xB0C += 30.0f; + mEmitter0.remove(true); + startSound(SE_BGh3_SW_BEAM_RETURN); + field_0xB26 = 0; + } +} + +void dAcGirahimuSwordBeam_c::startMoveEmitters() { + if (field_0xB26 != 0) { + if (field_0xB27 == 0) { + // the beam trail + mEmitter0.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_882_, mWorldMtx, nullptr, nullptr); + } else { + // deflect sparkles? + mEmitter0.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_940_, mWorldMtx, nullptr, nullptr); + } + } else { + // the beam trail + mEmitter1.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_882_, mWorldMtx, nullptr, nullptr); + } +} + +void dAcGirahimuSwordBeam_c::startDisappearEmitter() { + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_881_, mWorldMtx, nullptr, nullptr, 0, 0); +} + +void dAcGirahimuSwordBeam_c::transformMatrix() { + mWorldMtx.transS(mPosition); + mWorldMtx.ZXYrotM(mRotation); + if (field_0xB27) { + mWorldMtx.YrotM(field_0xB14); + } + mWorldMtx.scaleM(mScale); +} + +void dAcGirahimuSwordBeam_c::fn_240_11F0() { + if (field_0xB20 == 0) { + fn_240_1380(); + } + if (mCps1.ChkTgHit()) { + if (mCps1.GetTgAtHitType() == AT_TYPE_0x800000) { + if (field_0xB26 != 0) { + mEmitter0.remove(true); + } else { + mEmitter1.remove(true); + } + + startDisappearEmitter(); + startSound(SE_BGh3_SW_BEAM_DISAPPEAR); + changeState(StateID_Damage); + } else if (mCps1.GetTgAtHitType()) { + // Assuming this was a another branch + } + } + + if (mCps0.ChkAtHit() && mCps0.GetAtFlag0x8()) { + mAng3_c a0; + a0.x = a0.z = 0; + if (field_0xAF4.isLinked()) { + a0.y = dAcPy_c::GetLink()->mRotation.y; + } + field_0xB24 = 1; + + mAng3_c a1 = a0; + fn_240_1810(0, a1, mRotation.y + 0x4000); + } +} + +void dAcGirahimuSwordBeam_c::fn_240_1380() { + if (!mCps1.ChkTgHit()) { + return; + } + + if (mCps1.GetTgAtHitType() != AT_TYPE_SWORD) { + return; + } + + mAng3_c a; + a.x = 0; + a.y = mCps1.GetTgAtHitDir().atan2sX_Z(); + a.z = 0; + mAng playerAngle = cLib::targetAngleY(mPosition, dAcPy_c::GetLink()->mPosition); + mAng hitAngle = cLib::targetAngleY(mPosition, const_cast &>(mCps1).GetTgHitPos()); + if (field_0xAF4.isLinked()) { + cLib::targetAngleY(mPosition, field_0xAF4.get()->mPosition); + } + + s32 cutDir = dAcPy_c::GetLink()->getSpecificAttackDirection(); + switch (cutDir) { + case CUT_DIR_U: { + if (field_0xB1C == 0) { + s32 a = mRotation.y - playerAngle; + if (mAng::abs(a) < 0xAAB) { + fn_240_1710(); + } else { + field_0xB24 = 0; + } + } else if (field_0xB1C == 1) { + field_0xB24 = 0; + } + } break; + case CUT_DIR_D: { + if (field_0xB1C == 0) { + s32 a = mRotation.y - playerAngle; + if (mAng::abs(a) < 0xAAB) { + fn_240_1710(); + } else { + field_0xB24 = 1; + } + } else if (field_0xB1C == 1) { + field_0xB24 = 1; + } + } break; + case CUT_DIR_L: { + if (field_0xB1C == 0) { + field_0xB24 = 0; + } else if (field_0xB1C == 1) { + s32 a = (mRotation.y + 0x1555) - playerAngle; + if (mAng::abs(a) < 0x1C72) { + fn_240_1710(); + } else { + field_0xB24 = 0; + } + } + } break; + case CUT_DIR_R: { + if (field_0xB1C == 0) { + field_0xB24 = 0; + } else if (field_0xB1C == 1) { + s32 a = (mRotation.y - 0x1555) - playerAngle; + if (mAng::abs(a) < 0x1C72) { + fn_240_1710(); + } else { + field_0xB24 = 0; + } + } + } break; + case CUT_DIR_LU: field_0xB24 = 0; break; + case CUT_DIR_LD: field_0xB24 = 1; break; + case CUT_DIR_RU: field_0xB24 = 0; break; + case CUT_DIR_RD: field_0xB24 = 1; break; + case CUT_DIR_STAB: field_0xB24 = 0; break; + default: field_0xB24 = 0; break; + } + + mAng3_c a1 = a; + mAng a2 = hitAngle; + fn_240_1810(cutDir, a1, a2); +} + +void dAcGirahimuSwordBeam_c::fn_240_16C0() { + mSpeed *= 1.21f; + mScale *= 1.17f; +} + +void dAcGirahimuSwordBeam_c::fn_240_1710() { + if (field_0xB20 == 0) { + if (field_0xAF4.isLinked()) { + mAngle.y = cLib::targetAngleY(mPosition, field_0xAF4.get()->mPosition); + } + mCps0.SetAtGrp(2); + mCps0.OffAtGrp(0xC); + field_0xB18 = 10; + field_0xB20 = 1; + mEmitter1.remove(true); + startSound(SE_BGh3_SW_BEAM_RETURN); + field_0xB26 = 1; + } +} + +void dAcGirahimuSwordBeam_c::fn_240_17C0(s32 val) { + if (val == (field_0xB1C & 0xFF)) { + return; + } + + field_0xB1C = val; + mRotation.z = 0; + if (val == 0) { + mRotation.z -= 0x4000; + } +} + +inline mAng rndAngle(f32 amp) { + return cM::rndFX(amp); +} +void dAcGirahimuSwordBeam_c::fn_240_1810(u32 cutDir, mAng3_c &angle, const mAng &ay) { + s32 _weird_zero = 0; + mAng3_c inAngle = angle; + mAng3_c playerAngle; + mAng angleToPlayer = cLib::targetAngleY(mPosition, dAcPy_c::GetLink()->mPosition); + mAng relativeAngle = (mRotation.y - 0x4000) - angleToPlayer; + mAng angDiff = relativeAngle - mRotation.y; + + if (field_0xB20 != 0) { + return; + } + + field_0xB18 = 10; + + // ??? + mAng3_c m; + mAng &linkedAngleY = m.x; + if (field_0xAF4.isLinked()) { + linkedAngleY = (cLib::targetAngleY(mPosition, field_0xAF4.get()->mPosition)); + } + + switch (cutDir) { + case CUT_DIR_RD: { + angle.y = linkedAngleY + 182 * rndAngle(11.0f) + 0x1C72; + angle.x += 0x700; + mRotation.y = angle.y + 0x4E39; + s32 ang = relativeAngle.abs(); + if (ang < 0x38E4) { + field_0xB0A = -0x1777; + field_0xB0A *= (0.8f + (0.1f * _weird_zero)); + field_0xB06 = 0x5B0; + field_0xB08 = 0x5B0; + } else { + field_0xB0A = 0x1777; + field_0xB0A *= (0.8f + (0.1f * _weird_zero)); + field_0xB06 = -0x2D8; + field_0xB08 = 0x889; + } + } break; + case CUT_DIR_RU: { + angle.y = linkedAngleY + 182 * rndAngle(11.0f) + 0x1C72; + angle.x -= 0x900; + mRotation.y = angle.y + 0x4E39; + s32 ang = relativeAngle.abs(); + if (ang < 0x38E4) { + field_0xB0A = 0x1777; + field_0xB0A *= (0.8f + (0.1f * _weird_zero)); + field_0xB06 = 0x5B0; + } else { + field_0xB0A = -0x1777; + field_0xB0A *= (0.8f + (0.1f * _weird_zero)); + field_0xB06 = 0x5B0; + } + } break; + case CUT_DIR_R: { + angle.y = linkedAngleY + 182 * rndAngle(11.0f) + 0x1C72; + angle.x -= 0x900; + if (field_0xB1C == 0) { + s32 ang = relativeAngle.abs(); + if (ang - 0x3C73 <= 0x71Au) { + field_0xB08 = -0x1777; + angle.x = 0; + } else { + field_0xB0A = 0x1777; + field_0xB0A *= (0.8f + (0.1f * _weird_zero)); + field_0xB06 = 0x5B0; + } + } else { + field_0xB06 = -0x1777; + field_0xB06 *= (0.8f + (0.1f * _weird_zero)); + field_0xB0A = 0x222; + } + } break; + case CUT_DIR_LD: { + angle.y = linkedAngleY + 182 * rndAngle(11.0f) + -0x1C72; + angle.x += 0x700; + mRotation.y = angle.y + 0x1555; + s32 ang = relativeAngle.abs(); + if (ang < 0x471C) { + field_0xB0A = 0x1777; + field_0xB0A *= (0.8f + (0.1f * _weird_zero)); + field_0xB06 = -0x222; + field_0xB08 = -0x5B0; + } else { + field_0xB0A = -0x1777; + field_0xB0A *= (0.8f + (0.1f * _weird_zero)); + field_0xB06 = -0x5B0; + field_0xB08 = -0x5B0; + } + } break; + case CUT_DIR_LU: { + angle.y = linkedAngleY + 182 * rndAngle(11.0f) + -0x1C72; + angle.x -= 0x900; + mRotation.y = angle.y + 0x1555; + s32 ang = relativeAngle.abs(); + if (ang < 0x471C) { + field_0xB0A = -0x1777; + field_0xB0A *= (0.8f + (0.1f * _weird_zero)); + field_0xB06 = 0x5B0; + } else { + field_0xB0A = 0x1777; + field_0xB0A *= (0.8f + (0.1f * _weird_zero)); + field_0xB06 = 0x5B0; + } + } break; + case CUT_DIR_L: { + angle.y = linkedAngleY + 182 * rndAngle(11.0f) - 0x1C72; + angle.x -= 0x900; + if (field_0xB1C == 0) { + s32 ang = relativeAngle.abs(); + if (ang - 0x3C73 <= 0x71Au) { + field_0xB08 = 0x1777; + angle.x = 0; + } else { + field_0xB0A = 0x1777; + field_0xB0A *= (0.8f + (0.1f * _weird_zero)); + field_0xB06 = 0x5B0; + } + } else { + field_0xB06 = 0x1777; + field_0xB06 *= (0.8f + (0.1f * _weird_zero)); + field_0xB0A = 0x222; + } + } break; + case CUT_DIR_U: { + angle.y = linkedAngleY + (182 * rndAngle(11.0f)); + angle.x -= 0x1500; + if (field_0xB1C == 1) { + s32 ang = relativeAngle.abs(); + if (ang < 0x31C7) { + field_0xB0A = 0x1777; + } else if (ang < 0x3C72) { + mRotation.y = angle.y + 0x6AAB; + field_0xB06 = 0x1777; + field_0xB06 *= (0.8f + (0.1f * _weird_zero)); + field_0xB0A = 0x222; + } else if (ang < 0x438E) { + field_0xB06 = 0x1777; + } else if (ang < 0x4E39) { + mRotation.y = angle.y + 0x1C72; + field_0xB06 = -0x1777; + field_0xB06 *= (0.8f + (0.1f * _weird_zero)); + field_0xB0A = 0x222; + } else { + field_0xB0A = -0x1777; + } + } else { + field_0xB08 = 0x1777; + field_0xB08 *= (0.8f + (0.1f * _weird_zero)); + field_0xB0A = 0x222; + } + } break; + case CUT_DIR_D: { + angle.y = linkedAngleY + 182 * rndAngle(11.0f); + angle.x += 0x1500; + if (field_0xB1C == 1) { + s32 ang = relativeAngle.abs(); + if (ang < 0x31C7) { + field_0xB0A = -0x1777; + } else if (ang < 0x38E4) { + mRotation.y = angle.y + 0x6AAB; + field_0xB06 = -0x1777; + field_0xB06 *= (0.8f + (0.1f * _weird_zero)); + field_0xB0A = 0x222; + } else if (ang < 0x471C) { + field_0xB06 = -0x1777; + } else if (ang < 0x4E39) { + mRotation.y = angle.y + 0x1C72; + field_0xB06 = 0x1777; + field_0xB06 *= (0.8f + (0.1f * _weird_zero)); + field_0xB0A = 0x222; + } else { + field_0xB0A = 0x1777; + } + } else { + field_0xB08 = 0x1777; + field_0xB08 *= (0.8f + (0.1f * _weird_zero)); + field_0xB0A = 0x222; + } + } break; + default: { + s32 ang = relativeAngle.abs(); + if (ang - 0x38E5 <= 0xE36u) { + angle.y = mAng((s32)angleToPlayer) + 182 * rndAngle(31.0f) - 0x8000; + } else { + angle.y = mAng((s32)angleToPlayer) + 182 * rndAngle(31.0f) - 0x8000; + } + angle.x += 0x1500; + if (field_0xB1C == 1) { + field_0xB06 = -0x1777; + field_0xB06 *= (0.8f + (0.1f * _weird_zero)); + field_0xB0A = 0x222; + } else { + field_0xB08 = -0x1777; + field_0xB08 *= (0.8f + (0.1f * _weird_zero)); + field_0xB0A = 0x222; + } + } break; + } + sSomeAngle = mAng(0x1777); + + mAngle.y = dAcPy_c::GetLink()->mRotation.y; + s32 ang = angDiff.abs(); + if (ang < 0x31C7) { + field_0xB02 = angle.y; + field_0xB00 = angle.x; + } else { + setB00(angle.x, inAngle.y, angle.z); + } + + mAngle.x = field_0xB00; + mAngle.y = field_0xB02; + mAngle.z = field_0xB04; + + field_0xB16 = 20; + field_0xB20 = 2; + mEmitter1.remove(true); + field_0xB27 = 1; + field_0xB26 = 1; +} From 6b23b9c4fdaea23db371c35cd29cdf4bfbabff0b Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 28 Sep 2026 18:29:02 -0400 Subject: [PATCH 2/5] d_a_obj_girahimu_knife --- .../rels/d_a_obj_girahimu_knifeNP/symbols.txt | 101 ++- config/SOUE01/symbols.txt | 4 +- include/d/a/b/d_a_b_girahimu2.h | 6 + include/d/a/e/d_a_en_base.h | 3 + include/d/a/obj/d_a_obj_base.h | 2 +- include/d/a/obj/d_a_obj_girahimu_knife.h | 86 +- include/d/col/c/c_cc_d.h | 12 +- include/d/d_player_act.h | 6 + include/m/m_angle.h | 3 + src/REL/d/a/obj/d_a_obj_girahimu_knife.cpp | 840 +++++++++++++++++- 10 files changed, 983 insertions(+), 80 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_girahimu_knifeNP/symbols.txt b/config/SOUE01/rels/d_a_obj_girahimu_knifeNP/symbols.txt index c92cd0b1..67fa59b2 100644 --- a/config/SOUE01/rels/d_a_obj_girahimu_knifeNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_girahimu_knifeNP/symbols.txt @@ -4,19 +4,19 @@ _unresolved = .text:0x00000060; // type:function size:0x4 scope:global __register_global_object = .text:0x00000070; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global dAcObjGirahimuKnife_c_classInit__Fv = .text:0x000000F0; // type:function size:0x150 -fn_239_240 = .text:0x00000240; // type:function size:0x58 -fn_239_2A0 = .text:0x000002A0; // type:function size:0x90 +__dt__15dShadowCircle_cFv = .text:0x00000240; // type:function size:0x58 +__dt__22dCcD_Linked<8dCcD_Sph>Fv = .text:0x000002A0; // type:function size:0x90 __dt__34sFState_c<21dAcObjGirahimuKnife_c>Fv = .text:0x00000330; // type:function size:0x58 __dt__37sFStateFct_c<21dAcObjGirahimuKnife_c>Fv = .text:0x00000390; // type:function size:0x6C __dt__90sStateMgr_c<21dAcObjGirahimuKnife_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000400; // type:function size:0xA0 __dt__60sFStateMgr_c<21dAcObjGirahimuKnife_c,20sStateMethodUsr_FI_c>Fv = .text:0x000004A0; // type:function size:0xA4 -AcObjGirahimuKnife__initModels = .text:0x00000550; // type:function size:0x84 -AcObjGirahimuKnife__init = .text:0x000005E0; // type:function size:0x74 +createHeap__21dAcObjGirahimuKnife_cFv = .text:0x00000550; // type:function size:0x84 +create__21dAcObjGirahimuKnife_cFv = .text:0x000005E0; // type:function size:0x74 changeState__90sStateMgr_c<21dAcObjGirahimuKnife_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000660; // type:function size:0x10 -AcObjGirahimuKnife__initCollidersAndEffects = .text:0x00000670; // type:function size:0x170 -AcObjGirahimuKnife__update = .text:0x000007E0; // type:function size:0x1C4 +init__21dAcObjGirahimuKnife_cFv = .text:0x00000670; // type:function size:0x170 +actorExecute__21dAcObjGirahimuKnife_cFv = .text:0x000007E0; // type:function size:0x1C4 executeState__90sStateMgr_c<21dAcObjGirahimuKnife_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000009B0; // type:function size:0x10 -AcObjGirahimuKnife__draw = .text:0x000009C0; // type:function size:0xC8 +draw__21dAcObjGirahimuKnife_cFv = .text:0x000009C0; // type:function size:0xC8 initializeState_Wait__21dAcObjGirahimuKnife_cFv = .text:0x00000A90; // type:function size:0x64 executeState_Wait__21dAcObjGirahimuKnife_cFv = .text:0x00000B00; // type:function size:0x110 finalizeState_Wait__21dAcObjGirahimuKnife_cFv = .text:0x00000C10; // type:function size:0x48 @@ -28,14 +28,14 @@ executeState_AttackEnd__21dAcObjGirahimuKnife_cFv = .text:0x00000FA0; // type:fu finalizeState_AttackEnd__21dAcObjGirahimuKnife_cFv = .text:0x00001010; // type:function size:0x4 initializeState_Return__21dAcObjGirahimuKnife_cFv = .text:0x00001020; // type:function size:0x148 executeState_Return__21dAcObjGirahimuKnife_cFv = .text:0x00001170; // type:function size:0x13C -fn_239_12B0 = .text:0x000012B0; // type:function size:0x48 +ChkAtHit__8cCcD_ObjFv = .text:0x000012B0; // type:function size:0x48 finalizeState_Return__21dAcObjGirahimuKnife_cFv = .text:0x00001300; // type:function size:0x4 initializeState_Hit__21dAcObjGirahimuKnife_cFv = .text:0x00001310; // type:function size:0x3C executeState_Hit__21dAcObjGirahimuKnife_cFv = .text:0x00001350; // type:function size:0xC8 finalizeState_Hit__21dAcObjGirahimuKnife_cFv = .text:0x00001420; // type:function size:0x4 initializeState_SpinWait__21dAcObjGirahimuKnife_cFv = .text:0x00001430; // type:function size:0x6C executeState_SpinWait__21dAcObjGirahimuKnife_cFv = .text:0x000014A0; // type:function size:0x120 -fn_239_15C0 = .text:0x000015C0; // type:function size:0x4C +ChkTgHit__8cCcD_ObjFv = .text:0x000015C0; // type:function size:0x4C finalizeState_SpinWait__21dAcObjGirahimuKnife_cFv = .text:0x00001610; // type:function size:0x48 initializeState_SpinWaitPreAttack__21dAcObjGirahimuKnife_cFv = .text:0x00001660; // type:function size:0x34 executeState_SpinWaitPreAttack__21dAcObjGirahimuKnife_cFv = .text:0x000016A0; // type:function size:0x104 @@ -49,29 +49,29 @@ finalizeState_FreeWait__21dAcObjGirahimuKnife_cFv = .text:0x00001A60; // type:fu initializeState_CircleWait__21dAcObjGirahimuKnife_cFv = .text:0x00001AB0; // type:function size:0x84 executeState_CircleWait__21dAcObjGirahimuKnife_cFv = .text:0x00001B40; // type:function size:0xAC finalizeState_CircleWait__21dAcObjGirahimuKnife_cFv = .text:0x00001BF0; // type:function size:0x50 -fn_239_1C40 = .text:0x00001C40; // type:function size:0x170 -fn_239_1DB0 = .text:0x00001DB0; // type:function size:0x198 -fn_239_1F50 = .text:0x00001F50; // type:function size:0x1C0 -fn_239_2110 = .text:0x00002110; // type:function size:0x224 -fn_239_2340 = .text:0x00002340; // type:function size:0x1C -fn_239_2360 = .text:0x00002360; // type:function size:0xF4 -fn_239_2460 = .text:0x00002460; // type:function size:0x154 -AcObjGirahimuKnife__isInWaitState = .text:0x000025C0; // type:function size:0x134 +fn_239_1C40__21dAcObjGirahimuKnife_cFv = .text:0x00001C40; // type:function size:0x170 +fn_239_1DB0__21dAcObjGirahimuKnife_cFRC7mVec3_cRC7mVec3_c = .text:0x00001DB0; // type:function size:0x198 +fn_239_1F50__21dAcObjGirahimuKnife_cFRC7mVec3_cf = .text:0x00001F50; // type:function size:0x1C0 +fn_239_2110__21dAcObjGirahimuKnife_cFRC7mVec3_cfs = .text:0x00002110; // type:function size:0x224 +setTarget__21dAcObjGirahimuKnife_cFRC7mVec3_c = .text:0x00002340; // type:function size:0x1C +fn_239_2360__21dAcObjGirahimuKnife_cFbbf = .text:0x00002360; // type:function size:0xF4 +fn_239_2460__21dAcObjGirahimuKnife_cFbbf = .text:0x00002460; // type:function size:0x154 +isWaiting__21dAcObjGirahimuKnife_cFv = .text:0x000025C0; // type:function size:0x134 getStateID__90sStateMgr_c<21dAcObjGirahimuKnife_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00002700; // type:function size:0x10 -fn_239_2710 = .text:0x00002710; // type:function size:0x44 -fn_239_2760 = .text:0x00002760; // type:function size:0x198 -fn_239_2900 = .text:0x00002900; // type:function size:0xC8 -fn_239_29D0 = .text:0x000029D0; // type:function size:0x138 -fn_239_2B10 = .text:0x00002B10; // type:function size:0x510 -AcObjGirahimuKnife__playerAttackMatchesDartAlignmentMaybe = .text:0x00003020; // type:function size:0x224 -fn_239_3250 = .text:0x00003250; // type:function size:0x20 -fn_239_3270 = .text:0x00003270; // type:function size:0x18 -fn_239_3290 = .text:0x00003290; // type:function size:0x1CC -fn_239_3460 = .text:0x00003460; // type:function size:0x1AC -fn_239_3610 = .text:0x00003610; // type:function size:0x8 -fn_239_3620 = .text:0x00003620; // type:function size:0x4 -fn_239_3630 = .text:0x00003630; // type:function size:0x4 -AcObjGirahimuKnife__getEnemyLink = .text:0x00003640; // type:function size:0x8 +isCircleWait__21dAcObjGirahimuKnife_cFv = .text:0x00002710; // type:function size:0x44 +lineCheck__21dAcObjGirahimuKnife_cFv = .text:0x00002760; // type:function size:0x198 +updateMdlMatrix__21dAcObjGirahimuKnife_cFv = .text:0x00002900; // type:function size:0xC8 +startEmitters__21dAcObjGirahimuKnife_cFv = .text:0x000029D0; // type:function size:0x138 +fn_239_2B10__21dAcObjGirahimuKnife_cFv = .text:0x00002B10; // type:function size:0x510 +checkCutDir__21dAcObjGirahimuKnife_cFl = .text:0x00003020; // type:function size:0x224 +setWait__21dAcObjGirahimuKnife_cFv = .text:0x00003250; // type:function size:0x20 +setSpinWaitPreAttack__21dAcObjGirahimuKnife_cFv = .text:0x00003270; // type:function size:0x18 +getReflectForce__21dAcObjGirahimuKnife_cFR8cCcD_ObjfR7mVec3_c = .text:0x00003290; // type:function size:0x1CC +adjustVelocity__21dAcObjGirahimuKnife_cFRC7mVec3_cff = .text:0x00003460; // type:function size:0x1AC +vt_0x88__11dAcEnBase_cFi = .text:0x00003610; // type:function size:0x8 +vt_0x84__11dAcEnBase_cFv = .text:0x00003620; // type:function size:0x4 +vt_0x80__11dAcEnBase_cFv = .text:0x00003630; // type:function size:0x4 +getObjectListEntry__11dAcEnBase_cFv = .text:0x00003640; // type:function size:0x8 __dt__21dAcObjGirahimuKnife_cFv = .text:0x00003650; // type:function size:0x188 build__37sFStateFct_c<21dAcObjGirahimuKnife_c>FRC12sStateIDIf_c = .text:0x000037E0; // type:function size:0x60 dispose__37sFStateFct_c<21dAcObjGirahimuKnife_c>FRP10sStateIf_c = .text:0x00003840; // type:function size:0xC @@ -90,7 +90,7 @@ initializeState__36sFStateID_c<21dAcObjGirahimuKnife_c>CFR21dAcObjGirahimuKnife_ __sinit_\d_a_obj_girahimu_knife_cpp = .text:0x000039A0; // type:function size:0x7A0 scope:local __dt__36sFStateID_c<21dAcObjGirahimuKnife_c>Fv = .text:0x00004140; // type:function size:0x58 isSameName__36sFStateID_c<21dAcObjGirahimuKnife_c>CFPCc = .text:0x000041A0; // type:function size:0x88 -fn_239_4230 = .text:0x00004230; // type:function size:0x8 +@272@__dt__22dCcD_Linked<8dCcD_Sph>Fv = .text:0x00004230; // type:function size:0x8 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global @@ -108,7 +108,7 @@ lbl_239_rodata_50 = .rodata:0x00000050; // type:object size:0x4 align:4 data:flo lbl_239_rodata_54 = .rodata:0x00000054; // type:object size:0xC align:4 data:float lbl_239_rodata_60 = .rodata:0x00000060; // type:object size:0x4 align:4 data:float lbl_239_rodata_64 = .rodata:0x00000064; // type:object size:0x34 align:4 data:float -lbl_239_data_0 = .data:0x00000000; // type:object size:0x30 data:4byte +sSrcSph = .data:0x00000000; // type:object size:0x30 data:4byte g_profile_OBJ_GH_KNIFE = .data:0x00000030; // type:object size:0x10 lbl_239_data_40 = .data:0x00000040; // type:object size:0xD data:string lbl_239_data_50 = .data:0x00000050; // type:object size:0xE data:string @@ -116,22 +116,27 @@ lbl_239_data_60 = .data:0x00000060; // type:object size:0x23 data:string lbl_239_data_84 = .data:0x00000084; // type:object size:0x4 data:4byte lbl_239_data_88 = .data:0x00000088; // type:object size:0xC data:4byte lbl_239_data_94 = .data:0x00000094; // type:object size:0xC data:4byte -AcObjGirahimuKnife__vtable = .data:0x000000A0; // type:object size:0x90 -lbl_239_data_130 = .data:0x00000130; // type:object size:0x30 -lbl_239_data_160 = .data:0x00000160; // type:object size:0x30 -lbl_239_data_190 = .data:0x00000190; // type:object size:0x18 -lbl_239_data_1A8 = .data:0x000001A8; // type:object size:0x18 -lbl_239_data_1C0 = .data:0x000001C0; // type:object size:0x70 -lbl_239_data_230 = .data:0x00000230; // type:object size:0x314 +__vt__21dAcObjGirahimuKnife_c = .data:0x000000A0; // type:object size:0x90 +__vt__60sFStateMgr_c<21dAcObjGirahimuKnife_c,20sStateMethodUsr_FI_c> = .data:0x00000130; // type:object size:0x30 +__vt__90sStateMgr_c<21dAcObjGirahimuKnife_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000160; // type:object size:0x30 +__vt__37sFStateFct_c<21dAcObjGirahimuKnife_c> = .data:0x00000190; // type:object size:0x18 +__vt__34sFState_c<21dAcObjGirahimuKnife_c> = .data:0x000001A8; // type:object size:0x18 +__vt__22dCcD_Linked<8dCcD_Sph> = .data:0x000001C0; // type:object size:0x70 +__vt__15dShadowCircle_c = .data:0x00000230; // type:object size:0x314 lbl_239_data_544 = .data:0x00000544; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_239_bss_8 = .bss:0x00000008; // type:object size:0x8 data:4byte -lbl_239_bss_10 = .bss:0x00000010; // type:object size:0x2 data:2byte -lbl_239_bss_12 = .bss:0x00000012; // type:object size:0xE data:2byte -AcObjGirahimuKnife__STATE_WAIT = .bss:0x00000020; // type:object size:0x80 data:4byte -AcObjGirahimuKnife__STATE_SPIN_WAIT_PRE_ATTACK = .bss:0x000000A0; // type:object size:0xC0 data:4byte -AcObjGirahimuKnife__STATE_ATTACK = .bss:0x00000160; // type:object size:0x40 data:4byte -AcObjGirahimuKnife__STATE_ATTACK_END = .bss:0x000001A0; // type:object size:0xC0 data:4byte -AcObjGirahimuKnife__STATE_CIRCLE_WAIT = .bss:0x00000260; // type:object size:0x30 data:4byte +sSomething0__21dAcObjGirahimuKnife_c = .bss:0x00000008; // type:object size:0x8 data:4byte +sSomething1__21dAcObjGirahimuKnife_c = .bss:0x00000010; // type:object size:0x2 data:2byte +sSomething2__21dAcObjGirahimuKnife_c = .bss:0x00000012; // type:object size:0xE data:2byte +StateID_Wait__21dAcObjGirahimuKnife_c = .bss:0x00000020; // type:object size:0x30 data:4byte +StateID_SpinWait__21dAcObjGirahimuKnife_c = .bss:0x00000060; // type:object size:0x30 data:4byte +StateID_SpinWaitPreAttack__21dAcObjGirahimuKnife_c = .bss:0x000000A0; // type:object size:0x30 data:4byte +StateID_SpinFreeWait__21dAcObjGirahimuKnife_c = .bss:0x000000E0; // type:object size:0x30 data:4byte +StateID_FreeWait__21dAcObjGirahimuKnife_c = .bss:0x00000120; // type:object size:0x30 data:4byte +StateID_Attack__21dAcObjGirahimuKnife_c = .bss:0x00000160; // type:object size:0x30 data:4byte +StateID_AttackEnd__21dAcObjGirahimuKnife_c = .bss:0x000001A0; // type:object size:0x30 data:4byte +StateID_Return__21dAcObjGirahimuKnife_c = .bss:0x000001E0; // type:object size:0x30 data:4byte +StateID_Hit__21dAcObjGirahimuKnife_c = .bss:0x00000220; // type:object size:0x30 data:4byte +StateID_CircleWait__21dAcObjGirahimuKnife_c = .bss:0x00000260; // type:object size:0x30 data:4byte lbl_239_bss_290 = .bss:0x00000290; // type:object size:0x8 data:byte lbl_239_bss_298 = .bss:0x00000298; // type:object size:0x10 align:4 data:float diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 3fefff01..9ea5e85b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -1120,10 +1120,10 @@ getObjectListEntry__12dAcObjBase_cFv = .text:0x8002E5B0; // type:function size:0 restorePosRotFromCopy__12dAcObjBase_cFv = .text:0x8002E5C0; // type:function size:0x70 create__12dAcObjBase_cFQ28fProfile14PROFILE_NAME_eUlUlPC7mVec3_cPC7mAng3_cPC7mVec3_cUl = .text:0x8002E630; // type:function size:0x98 create__12dAcObjBase_cFPCcUlUlPC7mVec3_cPC7mAng3_cPC7mVec3_cUlUsSc = .text:0x8002E6D0; // type:function size:0xA0 -ActorObjectBase__findObject = .text:0x8002E770; // type:function size:0x7C +findObject__12dAcObjBase_cFQ28fProfile14PROFILE_NAME_eP9fLiMgBa_cP12dAcObjBase_c = .text:0x8002E770; // type:function size:0x7C getNextObject__12dAcObjBase_cFP9fLiMgBa_cP12dAcObjBase_c = .text:0x8002E7F0; // type:function size:0x58 isPlayer__12dAcObjBase_cFv = .text:0x8002E850; // type:function size:0x14 -ActorObjectBase__calcVelocity = .text:0x8002E870; // type:function size:0x68 +calcVelocity__12dAcObjBase_cFR7mVec3_cf = .text:0x8002E870; // type:function size:0x68 calcVelocity__12dAcObjBase_cFv = .text:0x8002E8E0; // type:function size:0xB8 updateMatrix__12dAcObjBase_cFv = .text:0x8002E9A0; // type:function size:0x58 ActorObjectBase__setDefaultCullDistance = .text:0x8002EA00; // type:function size:0xC diff --git a/include/d/a/b/d_a_b_girahimu2.h b/include/d/a/b/d_a_b_girahimu2.h index 67a39339..a825633c 100644 --- a/include/d/a/b/d_a_b_girahimu2.h +++ b/include/d/a/b/d_a_b_girahimu2.h @@ -9,8 +9,14 @@ public: dAcGirahimu2_c() : mStateMgr(*this) {} virtual ~dAcGirahimu2_c() {} + void setField_0xD52(u16 val) { + field_0xD52 = val; + } + private: /* 0x??? */ STATE_MGR_DECLARE(dAcGirahimu2_c); + + /* 0xD52 */ u16 field_0xD52; }; #endif diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h index ac03f2b2..88f78f97 100644 --- a/include/d/a/e/d_a_en_base.h +++ b/include/d/a/e/d_a_en_base.h @@ -100,6 +100,9 @@ public: static dAcEnBase_c *GetNextEnemy(dAcEnBase_c *pParent) { return static_cast(getNextObject(&sEnemyList, pParent)); } + static dAcEnBase_c *FindEnemy(fProfile::PROFILE_NAME_e profile, dAcEnBase_c *pParent = nullptr) { + return static_cast(findObject(profile, &sEnemyList, pParent)); + } protected: // TODO: Make accessors for this list to auto-convert to dAcEnBase? diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index a72d3ea6..7dd7161a 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -203,7 +203,7 @@ public: const mVec3_c *scale, u32 params2, u32 roomId ); - static dAcObjBase_c *findObject(fProfile::PROFILE_NAME_e actorId, fLiNdBa_c *refList, dAcObjBase_c *parent); + static dAcObjBase_c *findObject(fProfile::PROFILE_NAME_e actorId, fLiMgBa_c *refList, dAcObjBase_c *parent); static dAcObjBase_c *getNextObject(fLiMgBa_c *ref, dAcObjBase_c *parent); bool isPlayer(); void calcVelocity(mVec3_c &pos, f32 speed); diff --git a/include/d/a/obj/d_a_obj_girahimu_knife.h b/include/d/a/obj/d_a_obj_girahimu_knife.h index a94ed7e9..9d6ddf8a 100644 --- a/include/d/a/obj/d_a_obj_girahimu_knife.h +++ b/include/d/a/obj/d_a_obj_girahimu_knife.h @@ -2,13 +2,28 @@ #define D_A_OBJ_GIRAHIMU_KNIFE_H #include "d/a/e/d_a_en_base.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_cc.h" +#include "d/d_shadow.h" +#include "m/m3d/m_smdl.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" +#include "m/m_quat.h" +#include "m/m_vec.h" #include "s/s_State.hpp" +#include "toBeSorted/d_emitter.h" class dAcObjGirahimuKnife_c : public dAcEnBase_c { public: - dAcObjGirahimuKnife_c() : mStateMgr(*this) {} + dAcObjGirahimuKnife_c() : mGlowEmitter(this), mTrailEmitter(this), mStateMgr(*this) {} virtual ~dAcObjGirahimuKnife_c() {} + virtual int create() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorExecute() override; + STATE_FUNC_DECLARE(dAcObjGirahimuKnife_c, Wait); STATE_FUNC_DECLARE(dAcObjGirahimuKnife_c, SpinWait); STATE_FUNC_DECLARE(dAcObjGirahimuKnife_c, SpinWaitPreAttack); @@ -20,8 +35,75 @@ public: STATE_FUNC_DECLARE(dAcObjGirahimuKnife_c, Hit); STATE_FUNC_DECLARE(dAcObjGirahimuKnife_c, CircleWait); + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcObjGirahimuKnife_c); + STATE_MGR_DEFINE_UTIL_ISSTATE(dAcObjGirahimuKnife_c); + STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcObjGirahimuKnife_c); + STATE_MGR_DEFINE_UTIL_GETSTATEID(dAcObjGirahimuKnife_c); + + void init(); + + void fn_239_1C40(); + void fn_239_1DB0(const mVec3_c &base, const mVec3_c &target); + void fn_239_1F50(const mVec3_c &target, f32 add); + void fn_239_2110(const mVec3_c &target, f32 add, s16 ang); + void setTarget(const mVec3_c &t); + void fn_239_2360(bool, bool, f32 zVel); + void fn_239_2460(bool, bool, f32 velMult); + bool isWaiting(); + bool isCircleWait(); + bool lineCheck(); + void updateMdlMatrix(); + void startEmitters(); + void fn_239_2B10(); + bool checkCutDir(s32 cutDir); + void setWait(); + void setSpinWaitPreAttack(); + void getReflectForce(cCcD_Obj &cc, f32 forceMult, mVec3_c &outforce); + void adjustVelocity(const mVec3_c &force, f32 yVel, f32 forwardVel); + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcObjGirahimuKnife_c); + /* 0x378 */ m3d::smdl_c mMdl; + /* 0x394 */ dShadowCircle_c mShadow; + /* 0x39C */ dEmitter_c mGlowEmitter; + /* 0x3D0 */ dEmitter_c mTrailEmitter; + /* 0x404 */ dCcD_Linked mSph0; + /* 0x564 */ dCcD_Linked mSph1; + /* 0x6C0 */ dColliderLinkedList mCollider; + /* 0x6D0 */ s16 field_0x6D0; + /* 0x6D2 */ u16 mGlowEmitterId; + /* 0x6D4 */ u16 mTrailEmitterId; + /* 0x6D6 */ u16 field_0x6D6; + /* 0x6D8 */ mVec3_c field_0x6D8; + /* 0x6E4 */ mVec3_c field_0x6E4; + /* 0x6F0 */ mAng3_c field_0x6F0; + /* 0x6F6 */ mAng3_c field_0x6F6; + /* 0x7FC */ u8 _0x6FC[0x704 - 0x6FC]; + /* 0x704 */ mQuat_c field_0x704; + /* 0x714 */ mMtx_c field_0x714; + /* 0x744 */ mVec3_c field_0x744; + /* 0x750 */ mVec3_c field_0x750; + /* 0x75C */ mVec3_c field_0x75C; + /* 0x768 */ mVec3_c field_0x768; + /* 0x774 */ f32 field_0x774; + /* 0x778 */ s16 field_0x778; + /* 0x77C */ f32 field_0x77C; + /* 0x780 */ mAng field_0x780; + /* 0x784 */ s32 field_0x784; + /* 0x788 */ s32 mState; + /* 0x78C */ bool field_0x78C; + /* 0x78D */ bool field_0x78D; + /* 0x78E */ bool field_0x78E; + /* 0x78F */ bool field_0x78F; + /* 0x790 */ bool field_0x790; + /* 0x791 */ bool field_0x791; + /* 0x792 */ bool field_0x792; + /* 0x793 */ bool field_0x793; + /* 0x794 */ STATE_MGR_DECLARE(dAcObjGirahimuKnife_c); + + static s32 sSomething0; + static s32 sSomething0_1; + static mAng sSomething1; + static s16 sSomething2; }; #endif diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 6c701aeb..0b82074b 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -572,6 +572,9 @@ public: void SetInfo_0x0(u8 val) { mSrc.mInfo.field_0x0 = val; } + void SetSrc_0xE(u8 val) { + mSrc.field_0xE = val; + } const cCcD_SrcGObjAt &GetSrc() const { return mSrc; @@ -881,6 +884,10 @@ public: void SetAtFlag(u32 flag) { mAt.SetSPrm(flag); } + + void SetAtFlag2(u32 flag) { + mAt.SetAtFlag(flag); + } void SetAtGrp(u32 grp) { mAt.SetAtFlag(GetAtGrp() | grp); } @@ -1037,13 +1044,16 @@ public: void SetAtInfo_0x0(u8 amount) { mAt.SetInfo_0x0(amount); } + void SetAt_0xE(u8 val) { + mAt.SetSrc_0xE(val); + } void SetAtDamage(u8 amount) { mAt.SetAtDamage(amount); } void SetAtModifier(u16 modifier) { mAt.SetSrcModifer(modifier); - } + } // Tg diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h index 3506940c..55efefc3 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -664,6 +664,12 @@ public: bool isAttackingSpin() const { return isAttackingSpinHorizontal() || isAttackingSpinVertical(); } + bool isAttackingHorizontal() const { + return isAttackingLeft() || isAttackingRight(); + } + bool isAttackingVertical() const { + return isAttackingUp() || isAttackingDown(); + } void setBonkRelatedAnimFlag(bool b); void setPosYRot(const mVec3_c &pos, mAng rot, bool force = false, UNKWORD = 0, UNKWORD = 0); void setTransform(const mMtx_c &mtx, bool force, UNKWORD, UNKWORD); diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 7282ac39..d5e01d4d 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -112,6 +112,9 @@ public: f32 radian_c() const { return mVal * sAngToRad; } + f32 normal_c() const { + return mVal * sAngToNorm; + } public: static s16 d2s(f32 deg) { diff --git a/src/REL/d/a/obj/d_a_obj_girahimu_knife.cpp b/src/REL/d/a/obj/d_a_obj_girahimu_knife.cpp index f3e930e4..7610a9d8 100644 --- a/src/REL/d/a/obj/d_a_obj_girahimu_knife.cpp +++ b/src/REL/d/a/obj/d_a_obj_girahimu_knife.cpp @@ -1,7 +1,45 @@ #include "d/a/obj/d_a_obj_girahimu_knife.h" +#include "c/c_lib.h" +#include "c/c_math.h" +#include "common.h" +#include "d/a/b/d_a_b_girahimu2.h" +#include "d/a/d_a_player.h" +#include "d/a/e/d_a_en_base.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_lin_chk.h" +#include "d/col/c/c_cc_d.h" +#include "d/snd/d_snd_wzsound.h" +#include "f/f_base.h" +#include "f/f_profile_name.h" +#include "m/m_angle.h" +#include "m/m_color.h" +#include "m/m_mtx.h" +#include "m/m_quat.h" +#include "m/m_sphere.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/math/math_arithmetic.h" +#include "nw4r/math/math_types.h" +#include "s/s_Math.h" +#include "toBeSorted/d_emitter.h" + +static dCcD_SrcSph sSrcSph = { + /* mObjInf */ + {/* mObjAt */ {AT_TYPE_DAMAGE, 0xD, {9, 0, 0}, 2, 0, 0, 0, CUT_DIR_NONE, 0}, + /* mObjTg */ {~(AT_TYPE_COMMON0 & ~AT_TYPE_WIND), 0x111, {9, 0x18, 0x40F}, 0, CUT_DIR_NONE}, + /* mObjCo */ {0x25}}, + /* mSphInf */ + {30.0f} +}; + SPECIAL_ACTOR_PROFILE(OBJ_GH_KNIFE, dAcObjGirahimuKnife_c, fProfile::OBJ_GH_KNIFE, 0x115, 0, 2); +s32 dAcObjGirahimuKnife_c::sSomething0; +s32 dAcObjGirahimuKnife_c::sSomething0_1; +mAng dAcObjGirahimuKnife_c::sSomething1; +s16 dAcObjGirahimuKnife_c::sSomething2; + STATE_DEFINE(dAcObjGirahimuKnife_c, Wait); STATE_DEFINE(dAcObjGirahimuKnife_c, SpinWait); STATE_DEFINE(dAcObjGirahimuKnife_c, SpinWaitPreAttack); @@ -13,33 +51,783 @@ STATE_DEFINE(dAcObjGirahimuKnife_c, Return); STATE_DEFINE(dAcObjGirahimuKnife_c, Hit); STATE_DEFINE(dAcObjGirahimuKnife_c, CircleWait); -void dAcObjGirahimuKnife_c::initializeState_Wait() {} -void dAcObjGirahimuKnife_c::executeState_Wait() {} -void dAcObjGirahimuKnife_c::finalizeState_Wait() {} -void dAcObjGirahimuKnife_c::initializeState_SpinWait() {} -void dAcObjGirahimuKnife_c::executeState_SpinWait() {} -void dAcObjGirahimuKnife_c::finalizeState_SpinWait() {} -void dAcObjGirahimuKnife_c::initializeState_SpinWaitPreAttack() {} -void dAcObjGirahimuKnife_c::executeState_SpinWaitPreAttack() {} -void dAcObjGirahimuKnife_c::finalizeState_SpinWaitPreAttack() {} -void dAcObjGirahimuKnife_c::initializeState_SpinFreeWait() {} -void dAcObjGirahimuKnife_c::executeState_SpinFreeWait() {} -void dAcObjGirahimuKnife_c::finalizeState_SpinFreeWait() {} -void dAcObjGirahimuKnife_c::initializeState_FreeWait() {} -void dAcObjGirahimuKnife_c::executeState_FreeWait() {} -void dAcObjGirahimuKnife_c::finalizeState_FreeWait() {} -void dAcObjGirahimuKnife_c::initializeState_Attack() {} -void dAcObjGirahimuKnife_c::executeState_Attack() {} +bool dAcObjGirahimuKnife_c::createHeap() { + nw4r::g3d::ResFile res(nullptr); + res = nw4r::g3d::ResFile(getOarcResFile("GirahimKnife")); + TRY_CREATE(mMdl.create(res.GetResMdl("GirahimKnifeA"), &mAllocator, 0x20, 1, nullptr)); + return true; +} + +int dAcObjGirahimuKnife_c::create() { + CREATE_ALLOCATOR(dAcObjGirahimuKnife_c); + init(); + changeState(StateID_Wait); + return SUCCEEDED; +} + +void dAcObjGirahimuKnife_c::init() { + sSomething2 = 1; + field_0x793 = true; + field_0x750.set(0.0f, 0.0f, 0.0f); + mAcceleration = 0.0f; + field_0x792 = true; + mStts.SetRank(12); + mMaxSpeed = -6000.0f; + mBoundingBox.Set(mVec3_c(-100.0f, -100.0f, -100.0f), mVec3_c(100.0f, 100.0f, 100.0f)); + field_0x75C.set(1.2f, 0.0f, 1.2f); + field_0x774 = 20.0f; + + mCollider.addCc(mSph1, sSrcSph); + mCollider.addCc(mSph0, sSrcSph); + mCollider.SetStts(mStts); + + mSph1.SetR(15.0f); + mSph0.SetR(30.0f); + + mSph1.OnAtSet(); + mSph1.ClrTgSet(); + + mSph0.ClrAtSet(); + mSph0.OnTgSet(); + + mSph0.SetTg_0x50(2); + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_685_, mPosition, nullptr, nullptr, nullptr, nullptr, 0, 0); +} + +int dAcObjGirahimuKnife_c::actorExecute() { + field_0x768.set(field_0x75C); + if (--field_0x6D0 <= 0) { + field_0x6D0 = 0; + } + + executeState(); + + mVelocity.y -= mAcceleration; + mPosition += mVelocity; + + mSph1.SetAtVec(mVelocity); + + mSph1.SetC(mPosition); + mSph0.SetC(mPosition); + mCollider.registerColliders(); + + updateMdlMatrix(); + startEmitters(); + + if (mPosition.y <= -1000.0f) { + deleteRequest(); + } + + mVec3_c compare(1.2f, 1.2f, 1.2f); + if (field_0x768 == compare && field_0x75C != compare) { + startSound(SE_OGhKf_DISAPPEAR); + dJEffManager_c::spawnEffect( + PARTICLE_RESOURCE_ID_MAPPING_685_, mPosition, nullptr, nullptr, nullptr, nullptr, 0, 0 + ); + } + return SUCCEEDED; +} + +int dAcObjGirahimuKnife_c::draw() { + static mSphere_c sph(mVec3_c(0.0f, 60.0f, 0.0f), 100.0f); + f32 f = mPosition.y; + drawModelType1(&mMdl); + fn_8002edb0(mShadow, mMdl, &sph, -1, -1, f); + return SUCCEEDED; +} + +void dAcObjGirahimuKnife_c::initializeState_Wait() { + field_0x6F6.x = cM::rndInt(64000); + field_0x6F6.z = cM::rndInt(64000); + + field_0x778 = cM::rndInt(32000); + field_0x774 = 20.0f; +} +void dAcObjGirahimuKnife_c::executeState_Wait() { + if (!dAcPy_c::GetLink()->isAttacking()) { + mSph0.ClrTgSet(); + } else { + mSph0.OnTgSet(); + } + + if (mState == 4) { + changeState(StateID_SpinWait); + } else if (mState == 5) { + changeState(StateID_SpinFreeWait); + } else if (mState == 6) { + changeState(StateID_CircleWait); + } else if (mState == 8) { + changeState(StateID_FreeWait); + } else { + fn_239_2B10(); + fn_239_1DB0(field_0x6D8, field_0x744); + field_0x778 += 0x500; + fn_239_1C40(); + } +} +void dAcObjGirahimuKnife_c::finalizeState_Wait() { + mSph0.OnTgSet(); + field_0x714.toQuat(field_0x704); + mSph0.SetTg_0x4C(0); +} + +void dAcObjGirahimuKnife_c::initializeState_Attack() { + mSph1.OnAtSet(); + mSph1.ClrCoSet(); + mSph0.ClrCoSet(); + + mAcceleration = 0.0f; + field_0x78C = true; + + if (mState != 6) { + sSomething2 = 1; + } + + if (sSomething2 == 0 || !field_0x793) { + mSph1.ClrAtSet(); + } +} +void dAcObjGirahimuKnife_c::executeState_Attack() { + holdSound(SE_OGhKf_FLY_LV); + + if (sSomething2 == 0 || !field_0x793) { + mSph1.ClrAtSet(); + } + fn_239_2B10(); + sLib::chase(&field_0x774, 0.0f, 2.0f); + field_0x778 += 0x700; + if (lineCheck()) { + changeState(StateID_AttackEnd); + return; + } + + if (field_0x790) { + mVec3_c v0 = dAcPy_c::GetLink()->mPosition; + if (field_0x791) { + mVec3_c mod(field_0x744.x, field_0x744.y, 0.0f); + mod.rotY(dAcPy_c::GetLink()->mRotation.y + 0x8000); + v0 += mod; + } else { + v0.y += 100.0f; + } + + mVec3_c diff = v0 - mPosition; + if (diff.dot(mVelocity) > 0.0f) { + sLib::chaseAngle(mAngle.y.ref(), diff.atan2sX_Z(), 0x100); + mVec3_c vel(0.0f, mVelocity.y, 60.0f); + vel.rotY(mAngle.y); + mVelocity.set(vel); + } + } + mVec3_c norm = mVelocity; + norm.normalizeRS(); + mQuat_c q; + q.slerp(mVec3_c(0.0f, 0.0f, 1.0f), norm, 1.0f); + field_0x704.slerpTo(q, 0.5f, field_0x704); + field_0x714.fromQuat(field_0x704); +} void dAcObjGirahimuKnife_c::finalizeState_Attack() {} -void dAcObjGirahimuKnife_c::initializeState_AttackEnd() {} -void dAcObjGirahimuKnife_c::executeState_AttackEnd() {} + +void dAcObjGirahimuKnife_c::initializeState_AttackEnd() { + field_0x6D0 = 0x3C; + mSph1.ClrAtSet(); + mSph0.ClrTgSet(); +} +void dAcObjGirahimuKnife_c::executeState_AttackEnd() { + mVelocity.set(0.0f, 0.0f, 0.0f); + mAcceleration = 0.0f; + if (field_0x6D0 <= 0 && sLib::chase(&field_0x75C.y, 0.0f, 0.1f)) { + deleteRequest(); + } +} void dAcObjGirahimuKnife_c::finalizeState_AttackEnd() {} -void dAcObjGirahimuKnife_c::initializeState_Return() {} -void dAcObjGirahimuKnife_c::executeState_Return() {} + +void dAcObjGirahimuKnife_c::initializeState_Return() { + mSph1.SetAt_0xE(0); + mAcceleration = 1.0f; + + mVec3_c v0 = field_0x6D8; + mVec3_c v1 = mPosition - field_0x6D8; + mVec3_c pos(cM::rndFX(50.0f), 100.0f + cM::rndFX(50.0f), -100.0f); + pos.rotY(v1.atan2sX_Z()); + + v0 += pos; + f32 speed = (v1.absXZ() / 500.0f); + speed *= 4.0f; + calcVelocity(v0, speed); + mSph0.ClrTgSet(); +} +void dAcObjGirahimuKnife_c::executeState_Return() { + mSph1.SetAtFlag2(2); + mSph1.OnAtSet(); + mSph0.ClrTgSet(); + mSph1.SetR(50.0f); + if (lineCheck()) { + changeState(StateID_AttackEnd); + } else if (mSph1.ChkAtHit()) { + deleteRequest(); + } else { + mVec3_c norm = mVelocity; + norm.normalizeRS(); + mQuat_c q; + q.slerp(mVec3_c(0.0f, 0.0f, 1.0f), norm, 1.0f); + field_0x704.slerpTo(q, 0.5f, field_0x704); + field_0x714.fromQuat(field_0x704); + } +} void dAcObjGirahimuKnife_c::finalizeState_Return() {} -void dAcObjGirahimuKnife_c::initializeState_Hit() {} -void dAcObjGirahimuKnife_c::executeState_Hit() {} + +void dAcObjGirahimuKnife_c::initializeState_Hit() { + mAcceleration = 1.0f; + mSph1.ClrAtSet(); + if (mState == 8) { + mSph1.ClrAtSet(); + mSph0.ClrTgSet(); + } +} +void dAcObjGirahimuKnife_c::executeState_Hit() { + if (lineCheck()) { + changeState(StateID_AttackEnd); + return; + } + mVec3_c norm = mVelocity; + norm.normalizeRS(); + mQuat_c q; + f32 f = 20.0f; // Forces rodata pool + f = 1.0f; + q.slerp(mVec3_c(0.0f, 0.0f, 1.0f), norm, f); + field_0x704.slerpTo(q, 0.5f, field_0x704); + field_0x714.fromQuat(field_0x704); +} void dAcObjGirahimuKnife_c::finalizeState_Hit() {} -void dAcObjGirahimuKnife_c::initializeState_CircleWait() {} -void dAcObjGirahimuKnife_c::executeState_CircleWait() {} -void dAcObjGirahimuKnife_c::finalizeState_CircleWait() {} + +void dAcObjGirahimuKnife_c::initializeState_SpinWait() { + field_0x6F6.x = cM::rndInt(64000); + field_0x6F6.z = cM::rndInt(64000); + field_0x778 = cM::rndInt(32000); + mSph0.SetTg_0x4C(-1); + field_0x774 = 10.0f; +} +void dAcObjGirahimuKnife_c::executeState_SpinWait() { + mSph1.ClrAtSet(); + mSph0.SetR(50.0f); + field_0x78F = true; + + if (checkCutDir(dAcPy_c::GetLink()->getSpecificAttackDirection())) { + mSph0.OnTgSet(); + } else { + mSph0.ClrTgSet(); + } + + fn_239_2B10(); + if (mSph0.ChkTgHit()) { + dAcEnBase_c *pEn = FindEnemy(fProfile::B_GIRAHIMU2); + if (pEn != nullptr) { + static_cast(pEn)->setField_0xD52(120); + } + } + fn_239_1DB0(field_0x6D8, field_0x744); + field_0x778 += 0x500; + fn_239_1C40(); + if (field_0x792) { + holdSound(SE_OGhKf_SPIN_LV); + } +} +void dAcObjGirahimuKnife_c::finalizeState_SpinWait() { + mSph0.OnTgSet(); + field_0x714.toQuat(field_0x704); + mSph0.SetTg_0x4C(0); +} + +void dAcObjGirahimuKnife_c::initializeState_SpinWaitPreAttack() { + mSph0.SetTg_0x4C(-1); + field_0x744.x *= 1.5f; + field_0x744.z = 50.0f; + field_0x792 = false; +} +void dAcObjGirahimuKnife_c::executeState_SpinWaitPreAttack() { + if (!dAcPy_c::GetLink()->isAttacking()) { + mSph0.ClrTgSet(); + } else { + mSph0.OnTgSet(); + } + + field_0x778 += 0x500; + if (field_0x78E) { + mSph1.ClrCoSet(); + mSph0.ClrCoSet(); + if (sLib::chase(&field_0x75C.y, 0.0f, 0.1f)) { + deleteRequest(); + } + } else { + sLib::chase(&field_0x75C.y, 1.2f, 0.1f); + } + mSph1.ClrAtSet(); + mSph0.SetR(50.0f); + fn_239_2B10(); + fn_239_1DB0(field_0x6D8, field_0x744); + fn_239_1C40(); +} +void dAcObjGirahimuKnife_c::finalizeState_SpinWaitPreAttack() { + mSph0.OnTgSet(); + field_0x714.toQuat(field_0x704); + mSph0.SetTg_0x4C(0); +} + +void dAcObjGirahimuKnife_c::initializeState_SpinFreeWait() { + sSomething0++; + field_0x778 = cM::rndInt(32000); + mSph0.SetTg_0x4C(-1); + // NOTE - This is needed to force the rodata pool loading despite not emitting anything + field_0x774 = 20.0f; + field_0x774 = 0.0f; + sSomething1 += mAng(0x1000); + field_0x77C = 120.0f; + field_0x780 = sSomething1; +} +void dAcObjGirahimuKnife_c::executeState_SpinFreeWait() { + mSph1.ClrAtSet(); + mSph0.SetR(50.0f); + field_0x78F = true; + mSph0.ClrTgSet(); + fn_239_2B10(); + fn_239_2110(field_0x6D8, 150.0f, 0x4000); + fn_239_1C40(); +} +void dAcObjGirahimuKnife_c::finalizeState_SpinFreeWait() { + sSomething1 = mAng(0); + mSph0.OnTgSet(); + field_0x714.toQuat(field_0x704); + mSph0.SetTg_0x4C(0); +} + +void dAcObjGirahimuKnife_c::initializeState_FreeWait() { + field_0x6F6.x = cM::rndInt(64000); + field_0x6F6.z = cM::rndInt(64000); + field_0x778 = cM::rndInt(32000); + field_0x774 = 10.0f; +} +void dAcObjGirahimuKnife_c::executeState_FreeWait() { + mSph1.ClrAtSet(); + mSph0.SetR(50.0f); + field_0x78F = true; + fn_239_2B10(); + fn_239_1DB0(field_0x6D8, field_0x744); + field_0x778 += 0x500; + fn_239_1C40(); +} +void dAcObjGirahimuKnife_c::finalizeState_FreeWait() { + mSph0.OnTgSet(); + field_0x714.toQuat(field_0x704); + mSph0.SetTg_0x4C(0); +} + +// NONMATCHING +void dAcObjGirahimuKnife_c::initializeState_CircleWait() { + mSph0.SetTg_0x4C(-1); + field_0x774 = 0.0f; + // Dont think about it + mAng som = sSomething1; + mAng newval = som + 0x1000; + if (field_0x784 == 7) { + newval = som - 0x800; + } + sSomething1 = newval; + field_0x77C = 200.0f; + + field_0x780 = sSomething1; + mSph0.OnTgSet(); + field_0x790 = true; + mSph1.ClrCoSet(); + mSph0.ClrCoSet(); +} +void dAcObjGirahimuKnife_c::executeState_CircleWait() { + mSph1.ClrAtSet(); + mSph0.SetR(50.0f); + field_0x78F = true; + fn_239_2B10(); + if (field_0x784 == 7) { + fn_239_1F50(dAcPy_c::GetLink()->mPosition, 50.0f); + } else { + fn_239_2110(dAcPy_c::GetLink()->mPosition, 150.0f, 0); + } + fn_239_1C40(); +} +void dAcObjGirahimuKnife_c::finalizeState_CircleWait() { + mSph0.OnTgSet(); + field_0x714.toQuat(field_0x704); + mSph0.SetTg_0x4C(0); + sSomething1 = mAng(0); +} + +void dAcObjGirahimuKnife_c::fn_239_1C40() { + if (field_0x78E != 0) { + mSph1.ClrCoSet(); + mSph0.ClrCoSet(); + if (sLib::chase(&field_0x75C.y, 0.0f, 0.1f) != false) { + deleteRequest(); + } + } else { + sLib::chase(&field_0x75C.y, 1.2f, 0.1f); + } + + if (field_0x792) { + field_0x6F6.x = field_0x6F6.x + 0x1700; + field_0x6F6.y = field_0x6F0.y + 0x4000; + field_0x6F6.z = field_0x6F6.z + 0x1700; + field_0x714.ZXYrotS(field_0x6F6); + } else { + mVec3_c v = dAcPy_c::GetLink()->mPosition; + v.y += 100.0f; + mVec3_c norm = v - mPosition; + norm.normalizeRS(); + + mQuat_c q; + q.slerp(mVec3_c(0.0f, 0.0f, 1.0f), norm, 1.0f); + field_0x704.slerpTo(q, 0.5f, field_0x704); + field_0x714.fromQuat(field_0x704); + } +} + +// NONMATCHING - UGH +void dAcObjGirahimuKnife_c::fn_239_1DB0(const mVec3_c &i_base, const mVec3_c &i_target) { + mVec3_c base = i_base; + mVec3_c target = i_target; + target.rotY(field_0x6F0.y); + + mVec3_c toGoal = 0.05f * (base + target - mPosition); + toGoal += mVelocity; + toGoal *= 0.9f; + + mVelocity.set(toGoal); + mPosition += mVelocity; +} + +// NONMATCHING - UGH +void dAcObjGirahimuKnife_c::fn_239_1F50(const mVec3_c &i_target, f32 add) { + mVec3_c target = i_target; + mVec3_c front(0.0f, 0.0f, field_0x77C); + + mMtx_c m; + m.YrotS(dAcPy_c::GetLink()->mRotation.y); + m.XrotM(field_0x780); + m.multVec(front, front); + mVec3_c goal = target + front; + goal.y += add; + mPosition += mVelocity = (mVelocity + (goal - mPosition) * 0.05f) * 0.9f; +} + +// NONMATCHING - UGH +void dAcObjGirahimuKnife_c::fn_239_2110(const mVec3_c &i_target, f32 add, s16 ang) { + if (field_0x792) { + field_0x780 += mAng(0x400); + } + mVec3_c target = i_target; + mVec3_c front(0.0f, 0.0f, field_0x77C); + + mMtx_c m; + m.YrotS(field_0x6F0.y + field_0x780); + m.multVec(front, front); + + m.YrotS(field_0x6F0.y); + m.XrotM(ang); + m.YrotM(-field_0x6F0.y); + m.multVec(front, front); + + mVec3_c goal = target + front; + goal.y += add; + mVec3_c v = (mVelocity + (goal - mPosition) * 0.05f) * 0.9f; + mVelocity.set(v); + mPosition += mVelocity; +} + +void dAcObjGirahimuKnife_c::setTarget(const mVec3_c &t) { + field_0x744.set(t); +} + +void dAcObjGirahimuKnife_c::fn_239_2360(bool b0, bool b1, f32 zVel) { + if (b0 && !isWaiting()) { + return; + } + + field_0x790 = b1; + field_0x791 = b1; + + changeState(StateID_Attack); + field_0x78F = true; + mVec3_c diff = dAcPy_c::GetLink()->mPosition - field_0x6D8; + mAng toPlayer = diff.atan2sX_Z(); + mAngle.y = toPlayer; + mVelocity.set(0.0f, 0.0f, zVel); + mVelocity.rotY(toPlayer); + field_0x6D6 = 0xFF; +} + +void dAcObjGirahimuKnife_c::fn_239_2460(bool b0, bool b1, f32 velMult) { + if (b0 && !isWaiting()) { + return; + } + + if (!isCircleWait()) { + field_0x790 = true; + } else { + field_0x790 = false; + } + changeState(StateID_Attack); + + mSph0.SetR(100.f); + + field_0x78F = b1; + mVec3_c playerOffset = dAcPy_c::GetLink()->mPosition; + playerOffset.y += 100.0f; + mVec3_c diff = playerOffset - mPosition; + mAngle.y = diff.atan2sX_Z(); + + diff.normalizeRS(); + diff *= velMult; + mVelocity.set(diff); + field_0x6D6 = 0xFF; +} + +bool dAcObjGirahimuKnife_c::isWaiting() { + if (getStateID().isEqual(StateID_Wait) || getStateID().isEqual(StateID_SpinWait) || + getStateID().isEqual(StateID_SpinFreeWait) || getStateID().isEqual(StateID_FreeWait) || + getStateID().isEqual(StateID_CircleWait)) { + return true; + } + return false; +} + +bool dAcObjGirahimuKnife_c::isCircleWait() { + return getStateID().isEqual(StateID_CircleWait); +} + +bool dAcObjGirahimuKnife_c::lineCheck() { + mVec3_c start, end; + start = mPosition; + mMtx_c m0 = field_0x714; + + mVec3_c offset(0.0f, 0.0f, -72.0f); + m0.multVec(offset, offset); + offset += mPosition; + + start = offset; + end = mPosition; + + dBgS_ObjLinChk linChk; + linChk.Set(&start, &end, nullptr); + if (dBgS::GetInstance()->LineCross(&linChk)) { + mPosition.set(linChk.GetLinEnd()); + mVelocity.set(0.0f, 0.0f, 0.0f); + return true; + } + + return false; +} + +void dAcObjGirahimuKnife_c::updateMdlMatrix() { + mRotation.z = 0x4000; + mWorldMtx.transS(mPosition.x, mPosition.y + field_0x774 * mAng(field_0x778).sin(), mPosition.z); + mWorldMtx.concat(field_0x714); + mWorldMtx.ZXYrotM(mRotation); + mWorldMtx.scaleM(field_0x75C); + mMdl.setLocalMtx(mWorldMtx); +} + +void dAcObjGirahimuKnife_c::startEmitters() { + if (!field_0x792 && cM::isZero(VEC3LenSq(mVelocity))) { + return; + } + mGlowEmitterId = PARTICLE_RESOURCE_ID_MAPPING_686_; + mGlowEmitter.holdEffect(mGlowEmitterId, mWorldMtx, nullptr, nullptr); + if (field_0x78C) { + mTrailEmitterId = PARTICLE_RESOURCE_ID_MAPPING_1_; + mWorldMtx.transM(0.0f, 0.0f, -30.0f); + mColor c0(0, 0, 0, 0xFF); + mColor c1(0, 0, 0, 0xFF); + mTrailEmitter.holdEffect(mTrailEmitterId, mWorldMtx, &c0, &c1); + mWorldMtx.transM(0.0f, 0.0f, 30.0f); + } +} + +void dAcObjGirahimuKnife_c::fn_239_2B10() { + someEnemyDamageCollisionStuffMaybe(mCollider, nullptr); + cCcD_Obj *pTgCc = mCollider.findTgHit(); + if (pTgCc == &mSph0) { + switch (mSph0.GetTgAtHitType()) { + case AT_TYPE_SWORD: + case AT_TYPE_0x800000: { + if (getStateID().isEqual(StateID_CircleWait)) { + if (checkCutDir(mSph0.GetTgAtCutDir())) { + field_0x78D = true; + sSomething2 = 0; + changeState(StateID_Return); + } else if (field_0x792) { + mVec3_c force; + getReflectForce(mSph0, 20.0f, force); + force.rotY(dAcPy_c::GetLink()->mRotation.y); + mVelocity.set(force); + } else { + mVec3_c force; + getReflectForce(mSph0, 100.0f + cM::rndF(20.0f), force); + force.rotY(dAcPy_c::GetLink()->mRotation.y); + mVelocity.set(force); + changeState(StateID_Hit); + } + } else if (isWaiting()) { + mVec3_c force; + getReflectForce(mSph0, 100.0f + cM::rndF(20.0f), force); + force.rotY(dAcPy_c::GetLink()->mRotation.y); + mVelocity.set(force); + changeState(StateID_Hit); + } else if (checkCutDir(mSph0.GetTgAtCutDir())) { + field_0x78D = true; + sSomething2 = 0; + changeState(StateID_Return); + } else { + mVec3_c force; + getReflectForce(mSph0, 100.0f + cM::rndF(20.0f), force); + force.rotY(dAcPy_c::GetLink()->mRotation.y); + mVelocity.set(force); + if (mState == 8) { + field_0x793 = false; + } else { + sSomething2 = 0; + } + changeState(StateID_Hit); + } + } break; + case AT_TYPE_BELLOWS: { + mVec3_c force(0.0f, 0.0f, 100.0f + cM::rndF(20.0f)); + force.rotY(dAcPy_c::GetLink()->mRotation.y); + mVelocity.set(force); + changeState(StateID_Hit); + } break; + } + } + + cCcD_Obj *pAtCc = mCollider.findAtHit(); + if (pAtCc != nullptr) { + if (pAtCc->GetAtFlag0x8()) { + if (mState == 8) { + mVec3_c force = mPosition - dAcPy_c::GetLink()->mPosition; + force.y = 0.0f; + force.normalizeRS(); + adjustVelocity(force, 10.0f, 0.2f); + changeState(StateID_Hit); + } else { + field_0x78D = true; + changeState(StateID_Return); + } + } else if (pAtCc->GetAtFlag0x2()) { + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + s16 angY = cLib::targetAngleY(pPlayer->mPosition, mPosition); + s16 diff = pPlayer->mRotation.y - angY; + mVec3_c force(0.0f, 0.0f, 1.0f); + if (diff >= 0) { + force.rotY(dAcPy_c::GetLink()->mRotation.y + -0x2000); + } else { + force.rotY(dAcPy_c::GetLink()->mRotation.y + 0x2000); + } + adjustVelocity(force, 10.0f, 1.0f); + changeState(StateID_Hit); + } + } +} + +bool dAcObjGirahimuKnife_c::checkCutDir(s32 cutDir) { + if (!field_0x78F) { + return false; + } + if (dAcPy_c::GetLink()->isAttackingSpin() && dAcPy_c::GetLink()->isAttackingHorizontal()) { + if (field_0x784 == 0 || field_0x784 == 6) { + return true; + } + } + if (dAcPy_c::GetLink()->isAttackingSpin() && dAcPy_c::GetLink()->isAttackingVertical()) { + if (field_0x784 == 3 || field_0x784 == 7) { + return true; + } + } + + switch (cutDir) { + case CUT_DIR_U: + case CUT_DIR_D: + if (field_0x784 == 3) { + return true; + } + break; + + case CUT_DIR_RD: + case CUT_DIR_LU: + if (field_0x784 == 2) { + return true; + } + break; + + case CUT_DIR_R: + case CUT_DIR_L: + if (field_0x784 == 0) { + return true; + } + break; + + case CUT_DIR_RU: + case CUT_DIR_LD: + if (field_0x784 == 1) { + return true; + } + break; + + case CUT_DIR_STAB: break; + } + return false; +} + +void dAcObjGirahimuKnife_c::setWait() { + mState = 9; + changeState(StateID_Wait); +} + +void dAcObjGirahimuKnife_c::setSpinWaitPreAttack() { + changeState(StateID_SpinWaitPreAttack); +} +void dAcObjGirahimuKnife_c::getReflectForce(cCcD_Obj &cc, f32 forceMult, mVec3_c &outforce) { + mVec3_c force; + switch (cc.GetTgAtCutDir()) { + case CUT_DIR_U: force.set(0.0f, -0.5f, 0.5f); break; + case CUT_DIR_D: force.set(0.0f, 0.5f, 0.5f); break; + case CUT_DIR_LU: force.set(-0.5f, -0.5f, 0.5f); break; + case CUT_DIR_RD: force.set(0.5f, 0.5f, 0.5f); break; + case CUT_DIR_L: force.set(-0.5f, 0.0f, 0.5f); break; + case CUT_DIR_R: force.set(0.5f, 0.0f, 0.5f); break; + case CUT_DIR_LD: force.set(-0.5f, 0.5f, 0.5f); break; + case CUT_DIR_RU: force.set(0.5f, -0.5f, 0.5f); break; + default: force.set(0.0f, 0.0f, 1.0f); break; + } + force.normalizeRS(); + force *= forceMult; + outforce.set(force); +} + +void dAcObjGirahimuKnife_c::adjustVelocity(const mVec3_c &force, f32 yVel, f32 forwardVel) { + mVec3_c v0(-mVelocity.x, 0.0f, -mVelocity.z); + + s32 dirVel = v0.atan2sX_Z(); + s32 dirForce = force.atan2sX_Z(); + mAng diff = (s32)(dirVel - dirForce); + + f32 norm = nw4r::math::FAbs(diff.normal_c()); + if (norm <= 0.1f) { + norm = 0.1f; + } + if (norm >= 1.0f) { + norm = 1.0f; + } + + f32 mag = 2.0f * v0.dot(force) / force.mag(); + mVelocity = force * mag - v0; + mVelocity.x *= forwardVel + norm; + mVelocity.y = yVel; + mVelocity.z *= forwardVel + norm; +} From f3b7eb581f14a68218dbd5f9397d756fbb41085c Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Tue, 29 Sep 2026 20:40:45 -0400 Subject: [PATCH 3/5] d_a_obj_girahumu_sword_link --- .../d_a_obj_girahimu_sword_linkNP/symbols.txt | 80 +-- config/SOUE01/symbols.txt | 6 +- include/d/a/obj/d_a_obj_base.h | 3 +- include/d/a/obj/d_a_obj_girahimu_sword_link.h | 56 ++- include/d/d_player_act.h | 3 +- include/toBeSorted/d_enemy_sword_mdl.h | 8 +- .../d/a/obj/d_a_obj_girahimu_sword_link.cpp | 458 +++++++++++++++++- src/toBeSorted/d_enemy_sword_mdl.cpp | 2 +- 8 files changed, 550 insertions(+), 66 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_girahimu_sword_linkNP/symbols.txt b/config/SOUE01/rels/d_a_obj_girahimu_sword_linkNP/symbols.txt index d151141c..941e6db6 100644 --- a/config/SOUE01/rels/d_a_obj_girahimu_sword_linkNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_girahimu_sword_linkNP/symbols.txt @@ -4,23 +4,23 @@ _unresolved = .text:0x00000060; // type:function size:0x4 scope:global __register_global_object = .text:0x00000070; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global dAcObjGirahimuSwordLink_c_classInit__Fv = .text:0x000000F0; // type:function size:0x1A4 -fn_238_2A0 = .text:0x000002A0; // type:function size:0x84 -fn_238_330 = .text:0x00000330; // type:function size:0x58 -fn_238_390 = .text:0x00000390; // type:function size:0x90 -fn_238_420 = .text:0x00000420; // type:function size:0xCC -fn_238_4F0 = .text:0x000004F0; // type:function size:0x58 +__dt__26dSwordSwingEffectProcMgr_cFv = .text:0x000002A0; // type:function size:0x84 +__ct__22dCcD_Linked<8dCcD_Cps>Fv = .text:0x00000330; // type:function size:0x58 +__dt__22dCcD_Linked<8dCcD_Cps>Fv = .text:0x00000390; // type:function size:0x90 +__dt__16dEnemySwordMdl_cFv = .text:0x00000420; // type:function size:0xCC +__dt__15dShadowCircle_cFv = .text:0x000004F0; // type:function size:0x58 __dt__38sFState_c<25dAcObjGirahimuSwordLink_c>Fv = .text:0x00000550; // type:function size:0x58 __dt__41sFStateFct_c<25dAcObjGirahimuSwordLink_c>Fv = .text:0x000005B0; // type:function size:0x6C __dt__94sStateMgr_c<25dAcObjGirahimuSwordLink_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000620; // type:function size:0xA0 __dt__64sFStateMgr_c<25dAcObjGirahimuSwordLink_c,20sStateMethodUsr_FI_c>Fv = .text:0x000006C0; // type:function size:0xA4 -AcObjGirahimuSwordLink__initModels = .text:0x00000770; // type:function size:0xB4 -AcObjGirahimuSwordLink__init = .text:0x00000830; // type:function size:0x74 +createHeap__25dAcObjGirahimuSwordLink_cFv = .text:0x00000770; // type:function size:0xB4 +create__25dAcObjGirahimuSwordLink_cFv = .text:0x00000830; // type:function size:0x74 changeState__94sStateMgr_c<25dAcObjGirahimuSwordLink_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000008B0; // type:function size:0x10 -AcObjGirahimuSwordLink__boundingBoxStuff = .text:0x000008C0; // type:function size:0x100 -AcObjGirahimuSwordLink__update = .text:0x000009C0; // type:function size:0x108 +init__25dAcObjGirahimuSwordLink_cFv = .text:0x000008C0; // type:function size:0x100 +actorExecute__25dAcObjGirahimuSwordLink_cFv = .text:0x000009C0; // type:function size:0x108 executeState__94sStateMgr_c<25dAcObjGirahimuSwordLink_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000AD0; // type:function size:0x10 getStateID__94sStateMgr_c<25dAcObjGirahimuSwordLink_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000AE0; // type:function size:0x10 -AcObjGirahimuSwordLink__draw = .text:0x00000AF0; // type:function size:0x104 +draw__25dAcObjGirahimuSwordLink_cFv = .text:0x00000AF0; // type:function size:0x104 initializeState_Hide__25dAcObjGirahimuSwordLink_cFv = .text:0x00000C00; // type:function size:0x4 executeState_Hide__25dAcObjGirahimuSwordLink_cFv = .text:0x00000C10; // type:function size:0x4 finalizeState_Hide__25dAcObjGirahimuSwordLink_cFv = .text:0x00000C20; // type:function size:0x4 @@ -35,7 +35,7 @@ executeState_Throw__25dAcObjGirahimuSwordLink_cFv = .text:0x00000E00; // type:fu finalizeState_Throw__25dAcObjGirahimuSwordLink_cFv = .text:0x00000F60; // type:function size:0xC initializeState_AtThrow__25dAcObjGirahimuSwordLink_cFv = .text:0x00000F70; // type:function size:0x3C executeState_AtThrow__25dAcObjGirahimuSwordLink_cFv = .text:0x00000FB0; // type:function size:0x278 -fn_238_1230 = .text:0x00001230; // type:function size:0x48 +ChkAtHit__8cCcD_ObjFv = .text:0x00001230; // type:function size:0x48 finalizeState_AtThrow__25dAcObjGirahimuSwordLink_cFv = .text:0x00001280; // type:function size:0xC initializeState_Stick__25dAcObjGirahimuSwordLink_cFv = .text:0x00001290; // type:function size:0x50 executeState_Stick__25dAcObjGirahimuSwordLink_cFv = .text:0x000012E0; // type:function size:0x14C @@ -43,18 +43,18 @@ finalizeState_Stick__25dAcObjGirahimuSwordLink_cFv = .text:0x00001430; // type:f initializeState_Reflect__25dAcObjGirahimuSwordLink_cFv = .text:0x00001440; // type:function size:0x74 executeState_Reflect__25dAcObjGirahimuSwordLink_cFv = .text:0x000014C0; // type:function size:0x3F0 finalizeState_Reflect__25dAcObjGirahimuSwordLink_cFv = .text:0x000018B0; // type:function size:0xC -AcObjGirahimuSwordLink__setStateEquip = .text:0x000018C0; // type:function size:0x18 -AcObjGirahimuSwordLink__setStateGetSword = .text:0x000018E0; // type:function size:0x18 -AcObjGirahimuSwordLink__setStateHide = .text:0x00001900; // type:function size:0x18 -AcObjGirahimuSwordLink__setStateThrow = .text:0x00001920; // type:function size:0x5C -AcObjGirahimuSwordLink__setStateAtThrow = .text:0x00001980; // type:function size:0x48 -fn_238_19D0 = .text:0x000019D0; // type:function size:0x4 -fn_238_19E0 = .text:0x000019E0; // type:function size:0xA4 -AcObjGirahimuSwordLink__setSwordModelMatrixMaybe = .text:0x00001A90; // type:function size:0xE0 -AcObjGirahimuSwordLink__isInStateHide = .text:0x00001B70; // type:function size:0x44 -AcObjGirahimuSwordLink__isInStateStick = .text:0x00001BC0; // type:function size:0x44 -fn_238_1C10 = .text:0x00001C10; // type:function size:0x1D0 -AcObjGirahimuSwordLink__someCollisionCheck = .text:0x00001DE0; // type:function size:0x420 +setEquip__25dAcObjGirahimuSwordLink_cFv = .text:0x000018C0; // type:function size:0x18 +setGetSword__25dAcObjGirahimuSwordLink_cFv = .text:0x000018E0; // type:function size:0x18 +setHide__25dAcObjGirahimuSwordLink_cFv = .text:0x00001900; // type:function size:0x18 +setThrow__25dAcObjGirahimuSwordLink_cFRC7mVec3_c4mAngf = .text:0x00001920; // type:function size:0x5C +setAtThrow__25dAcObjGirahimuSwordLink_cFRC7mVec3_c = .text:0x00001980; // type:function size:0x48 +fn_238_19D0__25dAcObjGirahimuSwordLink_cFv = .text:0x000019D0; // type:function size:0x4 +updateModelMatrix__25dAcObjGirahimuSwordLink_cFv = .text:0x000019E0; // type:function size:0xA4 +setTransform__25dAcObjGirahimuSwordLink_cFRC6mMtx_cRC7mVec3_c = .text:0x00001A90; // type:function size:0xE0 +isHide__25dAcObjGirahimuSwordLink_cFv = .text:0x00001B70; // type:function size:0x44 +isStick__25dAcObjGirahimuSwordLink_cFv = .text:0x00001BC0; // type:function size:0x44 +reflect__25dAcObjGirahimuSwordLink_cFRC7mVec3_cfff = .text:0x00001C10; // type:function size:0x1D0 +lineCheck__25dAcObjGirahimuSwordLink_cFv = .text:0x00001DE0; // type:function size:0x420 __dt__25dAcObjGirahimuSwordLink_cFv = .text:0x00002200; // type:function size:0x170 build__41sFStateFct_c<25dAcObjGirahimuSwordLink_c>FRC12sStateIDIf_c = .text:0x00002370; // type:function size:0x60 dispose__41sFStateFct_c<25dAcObjGirahimuSwordLink_c>FRP10sStateIf_c = .text:0x000023D0; // type:function size:0xC @@ -73,7 +73,7 @@ initializeState__40sFStateID_c<25dAcObjGirahimuSwordLink_c>CFR25dAcObjGirahimuSw __sinit_\d_a_obj_girahimu_sword_link_cpp = .text:0x00002530; // type:function size:0x56C scope:local __dt__40sFStateID_c<25dAcObjGirahimuSwordLink_c>Fv = .text:0x00002AA0; // type:function size:0x58 isSameName__40sFStateID_c<25dAcObjGirahimuSwordLink_c>CFPCc = .text:0x00002B00; // type:function size:0x88 -fn_238_2B90 = .text:0x00002B90; // type:function size:0x8 +@272@__dt__22dCcD_Linked<8dCcD_Cps>Fv = .text:0x00002B90; // type:function size:0x8 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global @@ -88,22 +88,22 @@ lbl_238_data_40 = .data:0x00000040; // type:object size:0x4 data:4byte lbl_238_data_44 = .data:0x00000044; // type:object size:0xC data:4byte lbl_238_data_50 = .data:0x00000050; // type:object size:0x1C data:4byte lbl_238_data_6C = .data:0x0000006C; // type:object size:0x4 data:4byte -AcObjGirahimuSwordLink__vtable = .data:0x00000070; // type:object size:0x80 -lbl_238_data_F0 = .data:0x000000F0; // type:object size:0x30 -lbl_238_data_120 = .data:0x00000120; // type:object size:0x30 -lbl_238_data_150 = .data:0x00000150; // type:object size:0x18 -lbl_238_data_168 = .data:0x00000168; // type:object size:0x18 -lbl_238_data_180 = .data:0x00000180; // type:object size:0x10 -lbl_238_data_190 = .data:0x00000190; // type:object size:0x70 -lbl_238_data_200 = .data:0x00000200; // type:object size:0xC -lbl_238_data_20C = .data:0x0000020C; // type:object size:0x23C +__vt__25dAcObjGirahimuSwordLink_c = .data:0x00000070; // type:object size:0x80 +__vt__64sFStateMgr_c<25dAcObjGirahimuSwordLink_c,20sStateMethodUsr_FI_c> = .data:0x000000F0; // type:object size:0x30 +__vt__94sStateMgr_c<25dAcObjGirahimuSwordLink_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000120; // type:object size:0x30 +__vt__41sFStateFct_c<25dAcObjGirahimuSwordLink_c> = .data:0x00000150; // type:object size:0x18 +__vt__38sFState_c<25dAcObjGirahimuSwordLink_c> = .data:0x00000168; // type:object size:0x18 +__vt__16dEnemySwordMdl_c = .data:0x00000180; // type:object size:0x10 +__vt__22dCcD_Linked<8dCcD_Cps> = .data:0x00000190; // type:object size:0x70 +__vt__26dSwordSwingEffectProcMgr_c = .data:0x00000200; // type:object size:0xC +__vt__15dShadowCircle_c = .data:0x0000020C; // type:object size:0x23C lbl_238_data_448 = .data:0x00000448; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global lbl_238_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -AcObjGirahimuSwordLink__STATE_HIDE = .bss:0x00000018; // type:object size:0x40 data:4byte -AcObjGirahimuSwordLink__STATE_EQUIP = .bss:0x00000058; // type:object size:0x40 data:4byte -AcObjGirahimuSwordLink__STATE_GET_SWORD = .bss:0x00000098; // type:object size:0x40 data:4byte -AcObjGirahimuSwordLink__STATE_THROW = .bss:0x000000D8; // type:object size:0x40 data:4byte -AcObjGirahimuSwordLink__STATE_AT_THROW = .bss:0x00000118; // type:object size:0x40 data:4byte -AcObjGirahimuSwordLink__STATE_STICK = .bss:0x00000158; // type:object size:0x40 data:4byte -AcObjGirahimuSwordLink__STATE_REFLECT = .bss:0x00000198; // type:object size:0x48 data:4byte +StateID_Hide__25dAcObjGirahimuSwordLink_c = .bss:0x00000018; // type:object size:0x40 data:4byte +StateID_Equip__25dAcObjGirahimuSwordLink_c = .bss:0x00000058; // type:object size:0x40 data:4byte +StateID_GetSword__25dAcObjGirahimuSwordLink_c = .bss:0x00000098; // type:object size:0x40 data:4byte +StateID_Throw__25dAcObjGirahimuSwordLink_c = .bss:0x000000D8; // type:object size:0x40 data:4byte +StateID_AtThrow__25dAcObjGirahimuSwordLink_c = .bss:0x00000118; // type:object size:0x40 data:4byte +StateID_Stick__25dAcObjGirahimuSwordLink_c = .bss:0x00000158; // type:object size:0x40 data:4byte +StateID_Reflect__25dAcObjGirahimuSwordLink_c = .bss:0x00000198; // type:object size:0x48 data:4byte diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 9ea5e85b..ad6a76d2 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -1123,7 +1123,7 @@ create__12dAcObjBase_cFPCcUlUlPC7mVec3_cPC7mAng3_cPC7mVec3_cUlUsSc = .text:0x800 findObject__12dAcObjBase_cFQ28fProfile14PROFILE_NAME_eP9fLiMgBa_cP12dAcObjBase_c = .text:0x8002E770; // type:function size:0x7C getNextObject__12dAcObjBase_cFP9fLiMgBa_cP12dAcObjBase_c = .text:0x8002E7F0; // type:function size:0x58 isPlayer__12dAcObjBase_cFv = .text:0x8002E850; // type:function size:0x14 -calcVelocity__12dAcObjBase_cFR7mVec3_cf = .text:0x8002E870; // type:function size:0x68 +calcVelocity__12dAcObjBase_cFRC7mVec3_cf = .text:0x8002E870; // type:function size:0x68 calcVelocity__12dAcObjBase_cFv = .text:0x8002E8E0; // type:function size:0xB8 updateMatrix__12dAcObjBase_cFv = .text:0x8002E9A0; // type:function size:0x58 ActorObjectBase__setDefaultCullDistance = .text:0x8002EA00; // type:function size:0xC @@ -3051,7 +3051,7 @@ createSwingEntries__26dSwordSwingEffectProcMgr_cFRC7mVec3_cRC7mVec3_c = .text:0x calc__26dSwordSwingEffectProcMgr_cFRC7mVec3_cRC7mVec3_c = .text:0x8006B310; // type:function size:0x94 entry__26dSwordSwingEffectProcMgr_cFv = .text:0x8006B3B0; // type:function size:0x10 create__16dEnemySwordMdl_cFP12mAllocator_cPvPCcUlRC7mVec3_cRC7mVec3_cR9cCcD_SttsPQ23EGG7ResTIMGiPUl = .text:0x8006B3C0; // type:function size:0x140 -create__16dEnemySwordMdl_cFP12mAllocator_cQ34nw4r3g3d7ResFilePCcUlRC7mVec3_cRC7mVec3_cR9cCcD_SttsPQ23EGG7ResTIMGiPUl = .text:0x8006B500; // type:function size:0x13C +create__16dEnemySwordMdl_cFP12mAllocator_cRQ34nw4r3g3d7ResFilePCcUlRC7mVec3_cRC7mVec3_cR9cCcD_SttsPQ23EGG7ResTIMGiPUl = .text:0x8006B500; // type:function size:0x13C enableAttack__16dEnemySwordMdl_cFv = .text:0x8006B640; // type:function size:0x20 fn_8006B660__16dEnemySwordMdl_cFiiiiiiiiif = .text:0x8006B660; // type:function size:0xB4 setDamageMaybe__16dEnemySwordMdl_cFUc = .text:0x8006B720; // type:function size:0x10 @@ -3059,7 +3059,7 @@ fn_8006B730 = .text:0x8006B730; // type:function size:0x5C fn_8006B790 = .text:0x8006B790; // type:function size:0x10 fn_8006B7A0__16dEnemySwordMdl_cFUl = .text:0x8006B7A0; // type:function size:0x5C fn_8006B800__16dEnemySwordMdl_cFUl = .text:0x8006B800; // type:function size:0x10 -fn_8006B810 = .text:0x8006B810; // type:function size:0x5C +SetGrp__16dEnemySwordMdl_cFUl = .text:0x8006B810; // type:function size:0x5C fn_8006B870 = .text:0x8006B870; // type:function size:0x10 calc__16dEnemySwordMdl_cFRC6mMtx_cRC7mVec3_cb = .text:0x8006B880; // type:function size:0x2A8 entry__16dEnemySwordMdl_cFP12dAcObjBase_cP15dShadowCircle_cP9mSphere_c = .text:0x8006BB30; // type:function size:0xA4 diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 7dd7161a..393f38b0 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -206,13 +206,14 @@ public: static dAcObjBase_c *findObject(fProfile::PROFILE_NAME_e actorId, fLiMgBa_c *refList, dAcObjBase_c *parent); static dAcObjBase_c *getNextObject(fLiMgBa_c *ref, dAcObjBase_c *parent); bool isPlayer(); - void calcVelocity(mVec3_c &pos, f32 speed); + void calcVelocity(const mVec3_c &pos, f32 speed); void calcVelocity(); void updateMatrix(); void setDefaultCullDistance(); void fn_8002EA30(f32, f32, f32, f32, f32, void *); void fn_8002EA60(void *); void fn_8002EB30(void *); + void putInODesert(f32 depth, mVec3_c *position); void fn_8002ECD0(m3d::smdl_c *smdl, UNKWORD); // Disabling makes Items and Link Disappear diff --git a/include/d/a/obj/d_a_obj_girahimu_sword_link.h b/include/d/a/obj/d_a_obj_girahimu_sword_link.h index b510f157..7dc57214 100644 --- a/include/d/a/obj/d_a_obj_girahimu_sword_link.h +++ b/include/d/a/obj/d_a_obj_girahimu_sword_link.h @@ -2,13 +2,41 @@ #define D_A_OBJ_GIRAHIMU_SWORD_LINK_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s_acch.h" +#include "d/d_shadow.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" +#include "m/m_quat.h" +#include "m/m_vec.h" #include "s/s_State.hpp" +#include "toBeSorted/d_emitter.h" +#include "toBeSorted/d_enemy_sword_mdl.h" class dAcObjGirahimuSwordLink_c : public dAcObjBase_c { public: - dAcObjGirahimuSwordLink_c() : mStateMgr(*this) {} + dAcObjGirahimuSwordLink_c() : mEmitter(this), mStateMgr(*this) {} virtual ~dAcObjGirahimuSwordLink_c() {} + virtual int create() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorExecute() override; + + void init(); + + void setEquip(); + void setGetSword(); + void setHide(); + void setThrow(const mVec3_c &force, mAng angle, f32 rate); + void setAtThrow(const mVec3_c &velocity); + void fn_238_19D0(); + void updateModelMatrix(); + void setTransform(const mMtx_c &mtx, const mVec3_c &pos); + bool isHide(); + bool isStick(); + void reflect(const mVec3_c &rot, f32 gravity, f32, f32 force); + bool lineCheck(); + STATE_FUNC_DECLARE(dAcObjGirahimuSwordLink_c, Hide); STATE_FUNC_DECLARE(dAcObjGirahimuSwordLink_c, Equip); STATE_FUNC_DECLARE(dAcObjGirahimuSwordLink_c, GetSword); @@ -17,8 +45,32 @@ public: STATE_FUNC_DECLARE(dAcObjGirahimuSwordLink_c, Stick); STATE_FUNC_DECLARE(dAcObjGirahimuSwordLink_c, Reflect); + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcObjGirahimuSwordLink_c); + STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcObjGirahimuSwordLink_c); + STATE_MGR_DEFINE_UTIL_ISSTATE(dAcObjGirahimuSwordLink_c); + STATE_MGR_DEFINE_UTIL_GETSTATEID(dAcObjGirahimuSwordLink_c); + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcObjGirahimuSwordLink_c); + /* 0x330 */ dEnemySwordMdl_c mMdl; + /* 0x86C */ dShadowCircle_c mShadow; + /* 0x874 */ dEmitter_c mEmitter; + + /* 0x8A8 */ s16 field_0x8A8; + /* 0x8AA */ s16 field_0x8AA; + /* 0x8AC */ u16 mTrailEmitterID; + /* 0x8B0 */ mMtx_c field_0x8B0; + /* 0x8E0 */ dBgS_AcchCir mAcchCir; + /* 0x93C */ dBgS_ObjAcch mAcch; + + /* 0xCEC */ mVec3_c mGhirahimPos; + /* 0xCF8 */ mAng3_c mAngleCopy; + /* 0xD00 */ mQuat_c field_0xD00; + /* 0xD10 */ mAng field_0xD10; + /* 0xD14 */ mVec3_c field_0xD14; + /* 0xD20 */ u8 field_0xD20[4]; + /* 0xD24 */ mAng field_0xD24; + /* 0xD26 */ bool field_0xD26; + /* 0xD28 */ STATE_MGR_DECLARE(dAcObjGirahimuSwordLink_c); }; #endif diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h index 55efefc3..4f614842 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -684,7 +684,8 @@ public: static s32 getCurrentTunicType(); static s32 getCurrentSwordType(); - static const char *getSwordName(s32); + + static const char *getSwordName(s32 = sCurrentSword); static s32 getCurrentlyEquippedShieldType(); static const mColor &getEarringsColor(); diff --git a/include/toBeSorted/d_enemy_sword_mdl.h b/include/toBeSorted/d_enemy_sword_mdl.h index 28fea0f0..b640de60 100644 --- a/include/toBeSorted/d_enemy_sword_mdl.h +++ b/include/toBeSorted/d_enemy_sword_mdl.h @@ -43,7 +43,7 @@ public: cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize ); bool create( - mAllocator_c *alloc, nw4r::g3d::ResFile resFile, const char *mdlName, u32 bufferOption, const mVec3_c &v1, + mAllocator_c *alloc, nw4r::g3d::ResFile &resFile, const char *mdlName, u32 bufferOption, const mVec3_c &v1, const mVec3_c &v2, cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize ); @@ -60,14 +60,18 @@ public: void setDamageMaybe(u8 damage); void fn_8006B7A0(u32); void fn_8006B800(u32); + void SetGrp(u32); void enable() { enableAttack(); mProc.setActive(true); } - void disable() { + void setInactive() { mIsActive = false; + } + void disable() { + setInactive(); mProc.setActive(false); } }; diff --git a/src/REL/d/a/obj/d_a_obj_girahimu_sword_link.cpp b/src/REL/d/a/obj/d_a_obj_girahimu_sword_link.cpp index dddc4cb6..ddec988d 100644 --- a/src/REL/d/a/obj/d_a_obj_girahimu_sword_link.cpp +++ b/src/REL/d/a/obj/d_a_obj_girahimu_sword_link.cpp @@ -1,5 +1,24 @@ #include "d/a/obj/d_a_obj_girahimu_sword_link.h" +#include "common.h" +#include "d/a/d_a_player.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_lin_chk.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/c/c_m3d_g_pla.h" +#include "d/snd/d_snd_wzsound.h" +#include "f/f_base.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" +#include "m/m_quat.h" +#include "m/m_sphere.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/math/math_arithmetic.h" +#include "s/s_Math.h" +#include "toBeSorted/attention.h" +#include "toBeSorted/d_emitter.h" + SPECIAL_ACTOR_PROFILE(OBJ_GH_SW_L, dAcObjGirahimuSwordLink_c, fProfile::OBJ_GH_SW_L, 0x114, 0, 2); STATE_DEFINE(dAcObjGirahimuSwordLink_c, Hide); @@ -10,24 +29,431 @@ STATE_DEFINE(dAcObjGirahimuSwordLink_c, AtThrow); STATE_DEFINE(dAcObjGirahimuSwordLink_c, Stick); STATE_DEFINE(dAcObjGirahimuSwordLink_c, Reflect); +bool dAcObjGirahimuSwordLink_c::createHeap() { + nw4r::g3d::ResFile res = dAcPy_c::GetLink()->getSwordResFile(); + TRY_CREATE(mMdl.create( + &mAllocator, res, dAcPy_c::getSwordName(), 0x130, mVec3_c::Zero, mVec3_c(100.0f, 0.0f, 0.0f), mStts, nullptr, 1, + nullptr + )); + return true; +} + +int dAcObjGirahimuSwordLink_c::create() { + CREATE_ALLOCATOR(dAcObjGirahimuSwordLink_c); + init(); + changeState(StateID_Hide); + return SUCCEEDED; +} + +void dAcObjGirahimuSwordLink_c::init() { + mAcceleration = 0.0f; + mStts.SetRank(12); + mMaxSpeed = -6000.0f; + mBoundingBox.Set(mVec3_c(-100.0f, -100.0f, -100.0f), mVec3_c(100.0f, 100.0f, 100.0f)); + mAcch.Set(&mPosition, &mOldPosition, this, 1, &mAcchCir, nullptr, nullptr, nullptr); + mAcchCir.SetWall(0.0f, 50.0f); + mMdl.fn_8006B660(4, 1, 0, 0, 0, 0, 0, 0x400, 12, 40.0f); +} + +int dAcObjGirahimuSwordLink_c::actorExecute() { + if (--field_0x8A8 <= 0) { + field_0x8A8 = 0; + } + executeState(); + fn_238_19D0(); + mAcch.CrrPos(*dBgS::GetInstance()); + updateModelMatrix(); + if (getStateID().isEqual(StateID_Stick)) { + mPositionCopy3 = mPosition; + mPositionCopy3.y += 50.0f; + mPositionCopy2 = mPositionCopy3; + + AttentionManager::GetInstance()->addUnk3Target(*this, 0x2 | 0x1, 600.0f, 50.0f, -200.0f, 200.0f); + } + return SUCCEEDED; +} + +int dAcObjGirahimuSwordLink_c::draw() { + if (getStateID().isEqual(StateID_Hide)) { + return true; + } + + mMdl.entry(this, nullptr, nullptr); + static mSphere_c sph(mVec3_c(0.0f, 100.0f, 0.0f), 200.0f); + fn_8002edb0(mShadow, mMdl.mMdl, &sph, -1, -1, 0.0f); + return true; +} + void dAcObjGirahimuSwordLink_c::initializeState_Hide() {} void dAcObjGirahimuSwordLink_c::executeState_Hide() {} void dAcObjGirahimuSwordLink_c::finalizeState_Hide() {} -void dAcObjGirahimuSwordLink_c::initializeState_Equip() {} + +void dAcObjGirahimuSwordLink_c::initializeState_Equip() { + mAcceleration = 0.0f; + mVelocity.set(0.0f, 0.0f, 0.0f); + mRotation.set(mAng(0), mAng(0), mAng(0)); + mMdl.SetGrp(0xC); +} void dAcObjGirahimuSwordLink_c::executeState_Equip() {} void dAcObjGirahimuSwordLink_c::finalizeState_Equip() {} -void dAcObjGirahimuSwordLink_c::initializeState_GetSword() {} -void dAcObjGirahimuSwordLink_c::executeState_GetSword() {} -void dAcObjGirahimuSwordLink_c::finalizeState_GetSword() {} -void dAcObjGirahimuSwordLink_c::initializeState_Throw() {} -void dAcObjGirahimuSwordLink_c::executeState_Throw() {} -void dAcObjGirahimuSwordLink_c::finalizeState_Throw() {} -void dAcObjGirahimuSwordLink_c::initializeState_AtThrow() {} -void dAcObjGirahimuSwordLink_c::executeState_AtThrow() {} -void dAcObjGirahimuSwordLink_c::finalizeState_AtThrow() {} -void dAcObjGirahimuSwordLink_c::initializeState_Stick() {} -void dAcObjGirahimuSwordLink_c::executeState_Stick() {} -void dAcObjGirahimuSwordLink_c::finalizeState_Stick() {} -void dAcObjGirahimuSwordLink_c::initializeState_Reflect() {} -void dAcObjGirahimuSwordLink_c::executeState_Reflect() {} -void dAcObjGirahimuSwordLink_c::finalizeState_Reflect() {} + +void dAcObjGirahimuSwordLink_c::initializeState_GetSword() { + mAcceleration = 3.0f; + mVec3_c v(-7.0f, 112.0f, 36.0f); + v.rotY(mAngleCopy.y); + v += mGhirahimPos; + calcVelocity(v, 29.0f); + mMdl.SetGrp(0xC); + mRotation.z = 0; +} +void dAcObjGirahimuSwordLink_c::executeState_GetSword() { + mRotation.z -= 0x2000; + mVelocity.y -= mAcceleration; + mPosition += mVelocity; +} +void dAcObjGirahimuSwordLink_c::finalizeState_GetSword() { + mRotation.z = 0; +} + +void dAcObjGirahimuSwordLink_c::initializeState_Throw() { + field_0x8B0.toQuat(field_0xD00); + mMdl.enableAttack(); +} +void dAcObjGirahimuSwordLink_c::executeState_Throw() { + mVec3_c to(-1.0f, 0.0f, 0.0f); + mQuat_c q; + mVec3_c from(1.0f, 0.0f, 0.0f); + q.slerp(from, to, 1.0f); + field_0xD00.slerpTo(q, 0.2f, field_0xD00); + field_0x8B0.fromQuat(field_0xD00); + + mVelocity.y -= mAcceleration; + mRotation.z += field_0xD10; + mPosition += mVelocity; + + if (lineCheck()) { + changeState(StateID_Reflect); + return; + } + if (mPosition.y <= mGhirahimPos.y - 500.0f) { + mPosition.y = mGhirahimPos.y; + field_0xD14.set(0.0f, 1.0f, 0.0f); + changeState(StateID_Reflect); + } +} +void dAcObjGirahimuSwordLink_c::finalizeState_Throw() { + mMdl.setInactive(); +} + +void dAcObjGirahimuSwordLink_c::initializeState_AtThrow() { + field_0x8B0.toQuat(field_0xD00); + mMdl.enableAttack(); +} +void dAcObjGirahimuSwordLink_c::executeState_AtThrow() { + holdSound(SE_OGhSwL_FLY_LV); + + cCcD_Obj *pCcAt = mMdl.mCcList.findAtHit(); + if (pCcAt != nullptr) { + if (pCcAt->GetAtActor()->isActorPlayer() && pCcAt->GetAtFlag0x2()) { + field_0xD14.set(0.0f, 0.0f, 1.0f); + field_0xD14.rotY(dAcPy_c::GetLink()->mRotation.y); + + changeState(StateID_Reflect); + return; + } + } + + mVec3_c moveDir = mVelocity; + moveDir.normalizeRS(); + (void)mVelocity.mag(); // lol + + mQuat_c q; + mVec3_c from(1.0f, 0.0f, 0.0f); + q.slerp(from, moveDir, 1.0f); + field_0xD00.slerpTo(q, 0.5f, field_0xD00); + field_0x8B0.fromQuat(field_0xD00); + + mVelocity.y -= mAcceleration; + mPosition += mVelocity; + if (lineCheck()) { + changeState(StateID_Reflect); + return; + } + + if (mPosition.y <= mGhirahimPos.y + 5.0f) { + field_0xD14.set(0.0f, 1.0f, 0.0f); + changeState(StateID_Reflect); + return; + } + + mTrailEmitterID = PARTICLE_RESOURCE_ID_MAPPING_1_; + mWorldMtx.transM(30.0f, 0.0f, 0.0f); + mEmitter.holdEffect(mTrailEmitterID, mWorldMtx, nullptr, nullptr); + mWorldMtx.transM(-30.0f, 0.0f, 0.0f); +} +void dAcObjGirahimuSwordLink_c::finalizeState_AtThrow() { + mMdl.setInactive(); +} + +void dAcObjGirahimuSwordLink_c::initializeState_Stick() { + holdSound(SE_OGhSwL_BOUND); + mMdl.setInactive(); + mAcceleration = 0.0f; + mVelocity.set(0.0f, 0.0f, 0.0f); +} +void dAcObjGirahimuSwordLink_c::executeState_Stick() { + mVec3_c to(-1.0f, 0.0f, 0.0f); + field_0x8B0.multVec(to, to); + to.y = 0.0f; + to.normalizeRS(); + + mQuat_c q; + mVec3_c from(-1.0f, 0.0f, 0.0f); + q.slerp(from, to, 1.0f); + field_0xD00.slerpTo(q, 0.5f, field_0xD00); + field_0x8B0.fromQuat(field_0xD00); + + from = mPosition - dAcPy_c::GetLink()->mPosition; + if (from.absXZ() < 60.0f) { + changeState(StateID_Hide); + dAcPy_c::GetLinkM()->relatedToUsingItem0x11(); + } +} +void dAcObjGirahimuSwordLink_c::finalizeState_Stick() { + mRotation.z = 0; +} + +void dAcObjGirahimuSwordLink_c::initializeState_Reflect() { + s32 _weird_zero = 0; + reflect(field_0xD14, 3.0f, 10.f + _weird_zero, 0.5f); + field_0x8AA = 0; +} +void dAcObjGirahimuSwordLink_c::executeState_Reflect() { + sLib::chaseAngle(mRotation.z.ref(), 0, 0x1000); + mVec3_c direction = mVelocity; + + if (field_0xD26) { + mMdl.mCcList.findAtHit(); + mMdl.SetGrp(0x3E); + } + + switch (field_0x8AA) { + case 0: + field_0xD24 += 0x1000; + direction.normalizeRS(); + // fatll-through + case 1: + field_0xD24 += 0x1000; + direction.normalizeRS(); + direction.y = field_0xD24.sin() * 0.3f; + direction.normalizeRS(); + break; + case 2: + field_0xD24 += 0x1000; + direction.normalizeRS(); + direction.y = field_0xD24.sin() * 0.3f; + direction.normalizeRS(); + } + mQuat_c q; + mVec3_c from(1.0f, 0.0f, 0.0f); + q.slerp(from, direction, 1.0f); + field_0xD00.slerpTo(q, 0.5f, field_0xD00); + field_0x8B0.fromQuat(field_0xD00); + + mVelocity.y -= mAcceleration; + mPosition += mVelocity; + if (lineCheck()) { + if (mPosition.y < 40.0f) { + field_0x8AA++; + } + if (field_0x8AA >= 3) { + changeState(StateID_Stick); + } else { + reflect(field_0xD14, 3.0f, 5.0f, 0.5f); + } + } else { + if (mPosition.y <= mGhirahimPos.y + 5.0f) { + mPosition.y = mGhirahimPos.y + 5.0f; + field_0xD14.set(0.0f, 1.0f, 0.0f); + + if (mPosition.y < 40.0f) { + field_0x8AA++; + } + if (field_0x8AA < 3) { + reflect(field_0xD14, 3.0f, 5.0f, 0.5f); + } else { + direction.set(1.0f, 0.0f, 0.0f); + field_0x8B0.multVec(direction, direction); + direction.y = 0.0f; + direction.normalizeRS(); + mQuat_c q; + mVec3_c from(1.0f, 0.0f, 0.0f); + q.slerp(from, direction, 1.0f); + field_0xD00.slerpTo(q, 0.5f, field_0xD00); + field_0x8B0.fromQuat(field_0xD00); + + changeState(StateID_Stick); + } + } + } + + mTrailEmitterID = PARTICLE_RESOURCE_ID_MAPPING_1_; + mWorldMtx.transM(30.0f, 0.0f, 0.0f); + mEmitter.holdEffect(mTrailEmitterID, mWorldMtx, nullptr, nullptr); + mWorldMtx.transM(-30.0f, 0.0f, 0.0f); +} +void dAcObjGirahimuSwordLink_c::finalizeState_Reflect() { + field_0xD26 = false; +} + +void dAcObjGirahimuSwordLink_c::setEquip() { + changeState(StateID_Equip); +} + +void dAcObjGirahimuSwordLink_c::setGetSword() { + changeState(StateID_GetSword); +} + +void dAcObjGirahimuSwordLink_c::setHide() { + changeState(StateID_Hide); +} + +void dAcObjGirahimuSwordLink_c::setThrow(const mVec3_c &force, mAng angle, f32 rate) { + mAcceleration = 3.0f; + field_0xD10 = angle; + calcVelocity(force, rate); + changeState(StateID_Throw); +} + +void dAcObjGirahimuSwordLink_c::setAtThrow(const mVec3_c &velocity) { + mAcceleration = 0.0f; + field_0xD10 = 0; + mVelocity.set(velocity); + changeState(StateID_AtThrow); +} + +void dAcObjGirahimuSwordLink_c::fn_238_19D0() { + return; +} + +void dAcObjGirahimuSwordLink_c::updateModelMatrix() { + mWorldMtx.transS(mPosition.x, mPosition.y, mPosition.z); + mWorldMtx.concat(field_0x8B0); + mWorldMtx.ZXYrotM(mRotation); + mMdl.calc(mWorldMtx, mPosition - mOldPosition, false); +} + +void dAcObjGirahimuSwordLink_c::setTransform(const mMtx_c &mtx, const mVec3_c &pos) { + field_0x8B0 = mtx; + field_0x8B0.ZrotM(-0x4000); + field_0x8B0.XrotM(0x4000); + setPosition(pos); + setOldPosition(pos); +} + +bool dAcObjGirahimuSwordLink_c::isHide() { + return getStateID().isEqual(StateID_Hide); +} + +bool dAcObjGirahimuSwordLink_c::isStick() { + return getStateID().isEqual(StateID_Stick); +} + +// NONMATCHING +void dAcObjGirahimuSwordLink_c::reflect(const mVec3_c &rot, f32 gravity, f32, f32 force) { + if (rot.y == 1.0f) { + startSound(SE_OGhSwL_BOUND); + } else { + startSound(SE_OGhSwL_HIT); + } + + mVec3_c v0(-mVelocity.x, -mVelocity.y, -mVelocity.z); + mAng a1 = v0.atan2sX_Z(); + mAng a2 = rot.atan2sX_Z(); + s32 s = a1 - a2; + f32 mag = nw4r::math::FAbs(mAng(s).normal_c()); + if (mag <= 0.1f) { + mag = 0.1f; + } + if (mag >= 1.0f) { + mag = 1.0f; + } + + f32 m = rot.mag(); + f32 dot = v0.dot(rot); + f32 scale = dot * 2.0f / m; + + mVec3_c v; + mVelocity = rot * scale - v0; + mVelocity *= force; + + if (gravity < 0.0f) { + gravity = -gravity; + } + mAcceleration = gravity; +} + +bool dAcObjGirahimuSwordLink_c::lineCheck() { + mMtx_c m = field_0x8B0; + m.ZXYrotM(mRotation); + + mVec3_c start, end; + start = mPosition; + mVec3_c v0(100.0f, 0.0f, 0.0f); + m.multVec(v0, v0); + v0 += mPosition; + end = v0; + + v0.set(0.0f, mVelocity.mag(), 0.0f); + m.multVec(v0, v0); + v0 += mPosition; + start = v0; + + dBgS_ObjLinChk linChk; + linChk.Set(&start, &end, nullptr); + if (dBgS::GetInstance()->LineCross(&linChk)) { + cM3dGPla pla; + if (dBgS::GetInstance()->GetTriPla(linChk, &pla)) { + field_0xD14.x = pla.GetN().x; + field_0xD14.y = pla.GetN().y; + field_0xD14.z = pla.GetN().z; + } + + if (mVelocity.dot(field_0xD14) < 0.0f) { + mVec3_c newPos = linChk.GetLinEnd(); + mVec3_c v1 = field_0xD14; + v1.normalizeRS(); + v1 *= 5.0f; + newPos += v1; + mPosition = newPos; + if (mPosition.y <= mGhirahimPos.y + 5.0f) { + mPosition.y = mGhirahimPos.y + 5.0f; + } + return true; + } + } else { + linChk.Set(&end, &start, nullptr); + if (dBgS::GetInstance()->LineCross(&linChk)) { + cM3dGPla pla; + if (dBgS::GetInstance()->GetTriPla(linChk, &pla)) { + field_0xD14.x = pla.GetN().x; + field_0xD14.y = pla.GetN().y; + field_0xD14.z = pla.GetN().z; + } + + if (mVelocity.dot(field_0xD14) < 0.0f) { + mVec3_c newPos = linChk.GetLinEnd(); + mVec3_c v1 = field_0xD14; + v1.normalizeRS(); + v1.multScalar(5.0f); + newPos += v1; + mPosition = newPos; + if (mPosition.y <= mGhirahimPos.y + 5.0f) { + mPosition.y = mGhirahimPos.y + 5.0f; + } + return true; + } + } + } + return false; +} diff --git a/src/toBeSorted/d_enemy_sword_mdl.cpp b/src/toBeSorted/d_enemy_sword_mdl.cpp index 366a5535..cf76bf8c 100644 --- a/src/toBeSorted/d_enemy_sword_mdl.cpp +++ b/src/toBeSorted/d_enemy_sword_mdl.cpp @@ -47,7 +47,7 @@ bool dEnemySwordMdl_c::create( } bool dEnemySwordMdl_c::create( - mAllocator_c *alloc, nw4r::g3d::ResFile resFile, const char *mdlName, u32 bufferOption, const mVec3_c &v1, + mAllocator_c *alloc, nw4r::g3d::ResFile &resFile, const char *mdlName, u32 bufferOption, const mVec3_c &v1, const mVec3_c &v2, cCcD_Stts &stts, EGG::ResTIMG *pImg, int nView, u32 *pSize ) { nw4r::g3d::ResMdl mdl = resFile.GetResMdl(mdlName); From 43a34af9563c30b911725d563c44d6b2f889d8de Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Wed, 30 Sep 2026 10:15:46 -0400 Subject: [PATCH 4/5] d_a_obj_girahimu_floor --- .../rels/d_a_obj_girahimu_floorNP/symbols.txt | 44 +- configure.py | 2 +- include/d/a/obj/d_a_obj_girahimu_floor.h | 65 ++- src/REL/d/a/obj/d_a_obj_girahimu_floor.cpp | 386 +++++++++++++++++- 4 files changed, 465 insertions(+), 32 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_girahimu_floorNP/symbols.txt b/config/SOUE01/rels/d_a_obj_girahimu_floorNP/symbols.txt index 60a9efe1..a05f0b6a 100644 --- a/config/SOUE01/rels/d_a_obj_girahimu_floorNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_girahimu_floorNP/symbols.txt @@ -8,17 +8,17 @@ __dt__32sFState_c<19dAcOGirahimuFloor_c>Fv = .text:0x00000240; // type:function __dt__35sFStateFct_c<19dAcOGirahimuFloor_c>Fv = .text:0x000002A0; // type:function size:0x6C __dt__88sStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000310; // type:function size:0xA0 __dt__58sFStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003B0; // type:function size:0xA4 -fn_604_460 = .text:0x00000460; // type:function size:0x64 -AcOGirahimuFloor__initModels = .text:0x000004D0; // type:function size:0x28C -AcOGirahimuFloor__init1 = .text:0x00000760; // type:function size:0x1D4 +__ct__Q23m3d11anmMatClr_cFv = .text:0x00000460; // type:function size:0x64 +createHeap__19dAcOGirahimuFloor_cFv = .text:0x000004D0; // type:function size:0x28C +actorCreate__19dAcOGirahimuFloor_cFv = .text:0x00000760; // type:function size:0x1D4 changeState__88sStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000940; // type:function size:0x10 -AcOGirahimuFloor__init2 = .text:0x00000950; // type:function size:0x12C -fn_604_A80 = .text:0x00000A80; // type:function size:0x8 -AcOGirahimuFloor__update = .text:0x00000A90; // type:function size:0x39C +actorPostCreate__19dAcOGirahimuFloor_cFv = .text:0x00000950; // type:function size:0x12C +doDelete__19dAcOGirahimuFloor_cFv = .text:0x00000A80; // type:function size:0x8 +actorExecute__19dAcOGirahimuFloor_cFv = .text:0x00000A90; // type:function size:0x39C getStateID__88sStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000E30; // type:function size:0x10 executeState__88sStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000E40; // type:function size:0x10 -cLib_calcTimer = .text:0x00000E50; // type:function size:0x1C -AcOGirahimuFloor__draw = .text:0x00000E70; // type:function size:0x28 +calcTimer__4sLibFPUc_Uc = .text:0x00000E50; // type:function size:0x1C +draw__19dAcOGirahimuFloor_cFv = .text:0x00000E70; // type:function size:0x28 initializeState_Wait__19dAcOGirahimuFloor_cFv = .text:0x00000EA0; // type:function size:0x60 executeState_Wait__19dAcOGirahimuFloor_cFv = .text:0x00000F00; // type:function size:0x78 finalizeState_Wait__19dAcOGirahimuFloor_cFv = .text:0x00000F80; // type:function size:0x4 @@ -34,11 +34,11 @@ finalizeState_Broken__19dAcOGirahimuFloor_cFv = .text:0x000013A0; // type:functi initializeState_Move__19dAcOGirahimuFloor_cFv = .text:0x000013B0; // type:function size:0x4 executeState_Move__19dAcOGirahimuFloor_cFv = .text:0x000013C0; // type:function size:0xA0 finalizeState_Move__19dAcOGirahimuFloor_cFv = .text:0x00001460; // type:function size:0x4 -fn_604_1470 = .text:0x00001470; // type:function size:0x1A0 -AcOGirahimuFloor__checkNoOtherFloor = .text:0x00001610; // type:function size:0x28 -checksToSeeIfLinkIsInFinalBlow = .text:0x00001640; // type:function size:0xF0 -AcOGirahimuFloor__movePlatform = .text:0x00001730; // type:function size:0x54 -fn_604_1790 = .text:0x00001790; // type:function size:0x98 +isPlayerAndGhirahimOffFloor__19dAcOGirahimuFloor_cFv = .text:0x00001470; // type:function size:0x1A0 +isGenerateNoChild__19dAcOGirahimuFloor_cFv = .text:0x00001610; // type:function size:0x28 +isSuccessfulFinalBlow__19dAcOGirahimuFloor_cFv = .text:0x00001640; // type:function size:0xF0 +movePosition__19dAcOGirahimuFloor_cFv = .text:0x00001730; // type:function size:0x54 +doShatter__19dAcOGirahimuFloor_cFv = .text:0x00001790; // type:function size:0x98 __dt__19dAcOGirahimuFloor_cFv = .text:0x00001830; // type:function size:0x128 build__35sFStateFct_c<19dAcOGirahimuFloor_c>FRC12sStateIDIf_c = .text:0x00001960; // type:function size:0x60 dispose__35sFStateFct_c<19dAcOGirahimuFloor_c>FRP10sStateIf_c = .text:0x000019C0; // type:function size:0xC @@ -72,14 +72,16 @@ lbl_604_data_10 = .data:0x00000010; // type:object size:0xA data:string lbl_604_data_20 = .data:0x00000020; // type:object size:0x10 data:string lbl_604_data_30 = .data:0x00000030; // type:object size:0x40 lbl_604_data_70 = .data:0x00000070; // type:object size:0x21 data:string -AcOGirahimuFloor__vtable = .data:0x00000098; // type:object size:0x80 -lbl_604_data_118 = .data:0x00000118; // type:object size:0x30 -lbl_604_data_148 = .data:0x00000148; // type:object size:0x30 -lbl_604_data_178 = .data:0x00000178; // type:object size:0x18 -lbl_604_data_190 = .data:0x00000190; // type:object size:0x184 +__vt__19dAcOGirahimuFloor_c = .data:0x00000098; // type:object size:0x80 +__vt__58sFStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c> = .data:0x00000118; // type:object size:0x30 +__vt__88sStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000148; // type:object size:0x30 +__vt__35sFStateFct_c<19dAcOGirahimuFloor_c> = .data:0x00000178; // type:object size:0x18 +__vt__32sFState_c<19dAcOGirahimuFloor_c> = .data:0x00000190; // type:object size:0x184 lbl_604_data_314 = .data:0x00000314; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global lbl_604_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -AcOGirahimuFloor__StateID_Wait = .bss:0x00000018; // type:object size:0x40 data:4byte -AcOGirahimuFloor__StateID_Return = .bss:0x00000058; // type:object size:0x40 data:4byte -AcOGirahimuFloor__StateID_Generate = .bss:0x00000098; // type:object size:0xB0 data:4byte +StateID_Wait__19dAcOGirahimuFloor_c = .bss:0x00000018; // type:object size:0x30 data:4byte +StateID_Return__19dAcOGirahimuFloor_c = .bss:0x00000058; // type:object size:0x30 data:4byte +StateID_Generate__19dAcOGirahimuFloor_c = .bss:0x00000098; // type:object size:0x30 data:4byte +StateID_Broken__19dAcOGirahimuFloor_c = .bss:0x000000D8; // type:object size:0x30 data:4byte +StateID_Move__19dAcOGirahimuFloor_c = .bss:0x00000118; // type:object size:0x30 data:4byte diff --git a/configure.py b/configure.py index e7616299..a2b8919a 100644 --- a/configure.py +++ b/configure.py @@ -2521,7 +2521,7 @@ config.libs = [ Rel(NonMatching, "d_a_obj_fruit_tree", "REL/d/a/obj/d_a_obj_fruit_tree.cpp"), Rel(NonMatching, "d_a_obj_gear", "REL/d/a/obj/d_a_obj_gear.cpp"), Rel( - NonMatching, "d_a_obj_girahimu_floor", "REL/d/a/obj/d_a_obj_girahimu_floor.cpp" + Matching, "d_a_obj_girahimu_floor", "REL/d/a/obj/d_a_obj_girahimu_floor.cpp" ), Rel( NonMatching, "d_a_obj_girahimu_knife", "REL/d/a/obj/d_a_obj_girahimu_knife.cpp" diff --git a/include/d/a/obj/d_a_obj_girahimu_floor.h b/include/d/a/obj/d_a_obj_girahimu_floor.h index c1eee1c1..6d6def7b 100644 --- a/include/d/a/obj/d_a_obj_girahimu_floor.h +++ b/include/d/a/obj/d_a_obj_girahimu_floor.h @@ -1,22 +1,85 @@ #ifndef D_A_OBJ_GIRAHIMU_FLOOR_H #define D_A_OBJ_GIRAHIMU_FLOOR_H +#include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "m/m3d/m_anmmatclr.h" +#include "m/m3d/m_anmtexsrt.h" +#include "m/m3d/m_smdl.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" +class dAcGirahimu3First_c; class dAcOGirahimuFloor_c : public dAcObjBase_c { public: dAcOGirahimuFloor_c() : mStateMgr(*this) {} virtual ~dAcOGirahimuFloor_c() {} + enum Type_e { + TYPE_Normal, + TYPE_Generate, + TYPE_Max + }; + + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + STATE_FUNC_DECLARE(dAcOGirahimuFloor_c, Wait); STATE_FUNC_DECLARE(dAcOGirahimuFloor_c, Return); STATE_FUNC_DECLARE(dAcOGirahimuFloor_c, Generate); STATE_FUNC_DECLARE(dAcOGirahimuFloor_c, Broken); STATE_FUNC_DECLARE(dAcOGirahimuFloor_c, Move); + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcOGirahimuFloor_c); + STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcOGirahimuFloor_c); + STATE_MGR_DEFINE_UTIL_ISSTATE(dAcOGirahimuFloor_c); + STATE_MGR_DEFINE_UTIL_GETSTATEID(dAcOGirahimuFloor_c); + + // Used to request deletion upon both Player and Boss off the platform + bool isPlayerAndGhirahimOffFloor(); + + // If it is the generate type and there is no linked child + bool isGenerateNoChild(); + + // Checks if Link is in a final blow state and has connected + // with something other than the platform (like ghirahim) + bool isSuccessfulFinalBlow(); + + // Moves the position to the target destinaton + void movePosition(); + + // Breaks the platform, releases mBg and requests deletion + void doShatter(); + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOGirahimuFloor_c); + /* 0x330 */ nw4r::g3d::ResFile mRes; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ dBgW mBg[3]; + /* 0x980 */ STATE_MGR_DECLARE(dAcOGirahimuFloor_c); + /* 0x9BC */ m3d::anmTexSrt_c mAnmTexSrt; + /* 0x9E8 */ m3d::anmMatClr_c mAnmMatClr[3]; + /* 0xA6C */ dAcRef_c mGhirahimRef; + /* 0xA78 */ dAcRef_c mChild; + /* 0xA64 */ mVec3_c mHomePos; + /* 0xA90 */ mVec3_c mTargetPos; + /* 0xA9C */ mVec3_c mScaleBg0; + /* 0xAA8 */ mVec3_c mScaleBg1; + /* 0xAB4 */ f32 mMoveRate; + /* 0xAB4 */ f32 mGndHeight; + /* 0xABC */ u8 mType; + /* 0xABD */ u8 field_0xABD; + /* 0xABE */ u8 field_0xABE; + /* 0xAC0 */ s32 field_0xAC0; + /* 0xAC4 */ bool mbIsHome; + /* 0xAC5 */ bool mbMediumSize; + /* 0xAC6 */ bool mbRequestShatter; + /* 0xAC7 */ bool mbRequestMove; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_girahimu_floor.cpp b/src/REL/d/a/obj/d_a_obj_girahimu_floor.cpp index 4f9dce53..7761a827 100644 --- a/src/REL/d/a/obj/d_a_obj_girahimu_floor.cpp +++ b/src/REL/d/a/obj/d_a_obj_girahimu_floor.cpp @@ -1,5 +1,28 @@ #include "d/a/obj/d_a_obj_girahimu_floor.h" +#include "c/c_lib.h" +#include "common.h" +#include "d/a/b/d_a_b_girahimu3_first.h" +#include "d/a/d_a_base.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_plc.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/bg/d_bg_w.h" +#include "d/snd/d_snd_wzsound.h" +#include "f/f_base.h" +#include "f/f_manager.h" +#include "f/f_profile_name.h" +#include "m/m3d/m_fanm.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resanmclr.h" +#include "nw4r/g3d/res/g3d_resanmtexsrt.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "s/s_Math.h" +#include "toBeSorted/d_emitter.h" + SPECIAL_ACTOR_PROFILE(OBJ_GIRAHIMU_FLOOR, dAcOGirahimuFloor_c, fProfile::OBJ_GIRAHIMU_FLOOR, 0x25F, 0, 2); STATE_DEFINE(dAcOGirahimuFloor_c, Wait); @@ -8,18 +31,363 @@ STATE_DEFINE(dAcOGirahimuFloor_c, Generate); STATE_DEFINE(dAcOGirahimuFloor_c, Broken); STATE_DEFINE(dAcOGirahimuFloor_c, Move); -void dAcOGirahimuFloor_c::initializeState_Wait() {} -void dAcOGirahimuFloor_c::executeState_Wait() {} +static const char *sResAnmNames[3] = { + "F403Floor", + "F403FloorSpread", + "F403FloorSpread2", +}; + +struct dAcOGirahimuFloor_HIO_c { + const f32 field_0x00; + const f32 field_0x04; + const f32 field_0x08; + static const dAcOGirahimuFloor_HIO_c sHio; +}; +const dAcOGirahimuFloor_HIO_c dAcOGirahimuFloor_HIO_c::sHio = { + 1.0f, + 10.0f, + 0.4f, +}; + +bool dAcOGirahimuFloor_c::createHeap() { + mRes = nw4r::g3d::ResFile(getOarcFile("F403Floor", "g3d/model.brres")); + nw4r::g3d::ResMdl resMdl = mRes.GetResMdl("F403Floor"); + TRY_CREATE(mMdl.create(resMdl, &mAllocator, 0x324)); + + nw4r::g3d::ResAnmTexSrt resTexSrt = mRes.GetResAnmTexSrt(sResAnmNames[0]); + TRY_CREATE(mAnmTexSrt.create(resMdl, resTexSrt, &mAllocator, nullptr, 1)); + mMdl.setAnm(mAnmTexSrt); + mAnmTexSrt.setRate(1.0f, 0); + + for (int i = 0; i < 3; ++i) { + nw4r::g3d::ResAnmClr resAnmClr = mRes.GetResAnmClr(sResAnmNames[i]); + TRY_CREATE(mAnmMatClr[i].create(resMdl, resAnmClr, &mAllocator, nullptr, 1)); + + mAnmMatClr[i].setAnm(mMdl, resAnmClr, 0, m3d::PLAY_MODE_4); + mAnmMatClr[i].setRate(0.0f, 0); + mAnmMatClr[i].setFrame(mAnmTexSrt.getFrameMax(i) - 1.0f, 0); + mAnmMatClr[i].setPlayMode(m3d::PLAY_MODE_1, 0); + } + + cBgD_t *dzb = static_cast(getOarcDZB("F403Floor", "F403Floor")); + PLC *plc = static_cast(getOarcPLC("F403Floor", "F403Floor")); + updateMatrix(); + + mScaleBg0.set(0.5f, 0.5f, 0.5f); + mScaleBg1.set(0.735f, 0.735f, 0.735f); + TRY_CREATE(!mBg[0].Set(dzb, plc, 1, &mWorldMtx, &mScaleBg0)); + TRY_CREATE(!mBg[1].Set(dzb, plc, 1, &mWorldMtx, &mScaleBg1)); + TRY_CREATE(!mBg[2].Set(dzb, plc, 1, &mWorldMtx, &mScale)); + + return true; +} + +int dAcOGirahimuFloor_c::actorCreate() { + mType = getFromParams(0, 0x3); + if (mType >= TYPE_Max) { + mType = TYPE_Normal; + } + + CREATE_ALLOCATOR(dAcOGirahimuFloor_c); + for (int i = 0; i < 3; ++i) { + mBg[i].SetCrrFunc(dBgS_MoveBGProc_Typical); + } + dBgS::GetInstance()->Regist(&mBg[1], this); + + mAnmMatClr[2].setFrame(0.0f, 0); + + mAcceleration = 0.0f; + mMaxSpeed = -40.0f; + mMdl.setPriorityDraw(0x22, 9); + if (mType == TYPE_Generate) { + mMdl.setAnm(mAnmMatClr[0]); + changeState(StateID_Generate); + } else { + mMdl.setAnm(mAnmMatClr[1]); + changeState(StateID_Wait); + } + + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + for (int i = 0; i < 3; ++i) { + mBg[i].Move(); + } + + mBoundingBox.Set(mVec3_c(-2900.0f, -120.0f, -2900.0f), mVec3_c(3100.0f, 100.0f, 2900.0f)); + return true; +} + +int dAcOGirahimuFloor_c::actorPostCreate() { + fBase_c *pActor = nullptr; + dAcGirahimu3First_c *pGirahim; + while ( + (pGirahim = + static_cast(fManager_c::searchBaseByProfName(fProfile::B_GIRAHIMU3_FIRST, pActor)), + pActor = pGirahim) + ) { + if (mPosition.squareDistanceToXZ(pGirahim->getPosition()) < 9000000.0f) { + mGhirahimRef.link(pGirahim); + } + } + + if (mType == TYPE_Generate) { + while ((pActor = fManager_c::searchBaseByProfName(fProfile::OBJ_GIRAHIMU_FLOOR, pActor))) { + dAcOGirahimuFloor_c *pChild = static_cast(pActor); + if (pChild != this) { + mChild.link(pChild); + mHomePos = pChild->mHomePos; + } + } + } else { + mHomePos = mPosition; + } + + return SUCCEEDED; +} + +int dAcOGirahimuFloor_c::doDelete() { + return SUCCEEDED; +} + +int dAcOGirahimuFloor_c::actorExecute() { + if (!isState(StateID_Broken)) { + if (isSuccessfulFinalBlow()) { + changeState(StateID_Broken); + return SUCCEEDED; + } + + if (0 == sLib::calcTimer(&field_0xABE)) { + field_0xABE = 15; + if (isPlayerAndGhirahimOffFloor()) { + changeState(StateID_Broken); + return SUCCEEDED; + } + } + + if (mbRequestShatter) { + doShatter(); + return SUCCEEDED; + } + + if (mbMediumSize) { + mAnmMatClr[1].setRate(1.0f, 0); + dBgS::GetInstance()->Regist(&mBg[1], this); + dBgS::GetInstance()->Release(&mBg[0]); + + if (field_0xAC0 == 1 && mAnmMatClr[1].getFrame(0) == mAnmMatClr[1].getFrameMax(0) - 1.0f) { + mMdl.setAnm(mAnmMatClr[2]); + mAnmMatClr[2].setRate(1.0f, 0); + + dBgS::GetInstance()->Regist(&mBg[2], this); + dBgS::GetInstance()->Release(&mBg[1]); + } else { + mMdl.setAnm(mAnmMatClr[1]); + } + } + + if (!isState(StateID_Move) && mbRequestMove) { + changeState(StateID_Move); + movePosition(); + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + for (int i = 0; i < 3; ++i) { + mBg[i].Move(); + } + return SUCCEEDED; + } + } + + executeState(); + mAnmTexSrt.play(); + for (int i = 0; i < 3; ++i) { + mAnmMatClr[i].play(); + } + if (!isState(StateID_Wait)) { + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + for (int i = 0; i < 3; ++i) { + mBg[i].Move(); + } + } else { + updateMatrix(); + mMdl.setScale(mScale); + mMdl.setLocalMtx(mWorldMtx); + for (int i = 0; i < 3; ++i) { + mBg[i].Move(); + } + } + return SUCCEEDED; +} + +int dAcOGirahimuFloor_c::draw() { + drawModelType1(&mMdl); + return SUCCEEDED; +} + +void dAcOGirahimuFloor_c::initializeState_Wait() { + for (int i = 0; i < 3; ++i) { + mAnmMatClr[i].setRate(0.0f, 0); + } +} +void dAcOGirahimuFloor_c::executeState_Wait() { + if (!mbIsHome && 0 == sLib::calcTimer(&field_0xABD)) { + field_0xABD = 15; + if (isGenerateNoChild()) { + changeState(StateID_Return); + } + } +} void dAcOGirahimuFloor_c::finalizeState_Wait() {} + void dAcOGirahimuFloor_c::initializeState_Return() {} -void dAcOGirahimuFloor_c::executeState_Return() {} -void dAcOGirahimuFloor_c::finalizeState_Return() {} -void dAcOGirahimuFloor_c::initializeState_Generate() {} -void dAcOGirahimuFloor_c::executeState_Generate() {} +void dAcOGirahimuFloor_c::executeState_Return() { + if (!mbRequestMove && cLib::chasePos(mPosition, mHomePos, 10.0f)) { + changeState(StateID_Wait); + } +} +void dAcOGirahimuFloor_c::finalizeState_Return() { + mbIsHome = true; +} + +void dAcOGirahimuFloor_c::initializeState_Generate() { + for (int i = 0; i < 3; ++i) { + mAnmMatClr[i].setFrame(0.0f, 0); + if (i != 0) { + mAnmMatClr[i].setRate(0.0f, 0); + } + } + mAnmMatClr[0].setRate(1.0f, 0); + mMdl.setAnm(mAnmMatClr[0]); +} +void dAcOGirahimuFloor_c::executeState_Generate() { + if (mAnmMatClr[0].getFrame(0) == mAnmMatClr[0].getFrameMax(0) - 1.0f) { + mAnmMatClr[0].setRate(0.0f, 0); + } + if (!mbMediumSize) { + dBgS::GetInstance()->Regist(&mBg[0], this); + dBgS::GetInstance()->Release(&mBg[1]); + dBgS::GetInstance()->Release(&mBg[2]); + } + if (mAnmMatClr[2].isStop(0)) { + if (mAnmMatClr[2].getFrame(0) == mAnmMatClr[2].getFrameMax(0) - 1.0f) { + changeState(StateID_Wait); + } + } +} void dAcOGirahimuFloor_c::finalizeState_Generate() {} -void dAcOGirahimuFloor_c::initializeState_Broken() {} -void dAcOGirahimuFloor_c::executeState_Broken() {} + +void dAcOGirahimuFloor_c::initializeState_Broken() { + mAnmMatClr[2].setRate(-1.0f, 0); + mScaleBg0.set(0.0f, 0.0f, 0.0f); + for (int i = 0; i < 3; ++i) { + dBgS::GetInstance()->Release(&mBg[i]); + } + mMdl.setAnm(mAnmMatClr[2]); +} +void dAcOGirahimuFloor_c::executeState_Broken() { + if (mAnmMatClr[2].getFrame(0) == 0.0f) { + mAnmMatClr[1].setRate(-1.0f, 0); + mAnmMatClr[2].setRate(0.0f, 0); + if (mAnmMatClr[1].getFrame(0) == 0.0f) { + mAnmMatClr[0].setRate(-1.0f, 0); + mAnmMatClr[1].setRate(0.0f, 0); + mMdl.setAnm(mAnmMatClr[0]); + } else { + mMdl.setAnm(mAnmMatClr[1]); + } + } + + if (mAnmMatClr[0].getFrame(0) == 0.0f) { + deleteRequest(); + } +} void dAcOGirahimuFloor_c::finalizeState_Broken() {} + void dAcOGirahimuFloor_c::initializeState_Move() {} -void dAcOGirahimuFloor_c::executeState_Move() {} +void dAcOGirahimuFloor_c::executeState_Move() { + movePosition(); + + if (dBgS_ObjGndChk::CheckPos(mPosition)) { + mGndHeight = dBgS_ObjGndChk::GetGroundHeight(); + if (mPosition.y <= mGndHeight) { + doShatter(); + return; + } + } else { + mPosition.y = mGndHeight; + doShatter(); + return; + } + + if (!mbRequestMove) { + changeState(StateID_Wait); + } +} void dAcOGirahimuFloor_c::finalizeState_Move() {} + +bool dAcOGirahimuFloor_c::isPlayerAndGhirahimOffFloor() { + const dAcObjBase_c *pObj = nullptr; + + if (dBgS_ObjGndChk::CheckPos(dAcPy_c::GetLink()->mPosition + mVec3_c::Ey * 50.0f)) { + pObj = dBgS::GetInstance()->GetActorPointer(dBgS_ObjGndChk::GetInstance()); + } + if (pObj == this || !(pObj != nullptr && pObj->mProfileName == fProfile::OBJ_GIRAHIMU_FLOOR)) { + return false; + } + + pObj = nullptr; + bool bGetObj = mGhirahimRef.isLinked(); + if (bGetObj) { + bGetObj = dBgS_ObjGndChk::CheckPos(mGhirahimRef.get()->mPosition + mVec3_c::Ey * 50.0f); + } + if (bGetObj) { + pObj = dBgS::GetInstance()->GetActorPointer(dBgS_ObjGndChk::GetInstance()); + } + + if (pObj == this || !(pObj != nullptr && pObj->mProfileName == fProfile::OBJ_GIRAHIMU_FLOOR)) { + return false; + } + + return true; +} + +bool dAcOGirahimuFloor_c::isGenerateNoChild() { + return mType == TYPE_Generate && !mChild.isLinked(); +} + +bool dAcOGirahimuFloor_c::isSuccessfulFinalBlow() { + if (dAcPy_c::GetLink()->checkCurrentAction(96 /* FINAL_BLOW */)) { + const dAcObjBase_c *pObj = nullptr; + bool bGetObj = mGhirahimRef.isLinked(); + if (bGetObj) { + bGetObj = dBgS_ObjGndChk::CheckPos(mGhirahimRef.get()->mPosition + mVec3_c::Ey * 50.0f); + } + if (bGetObj) { + pObj = dBgS::GetInstance()->GetActorPointer(dBgS_ObjGndChk::GetInstance()); + } + + if (pObj != this) { + return true; + } + } + return false; +} + +void dAcOGirahimuFloor_c::movePosition() { + if (mbRequestMove && cLib::chasePos(mPosition, mTargetPos, mMoveRate)) { + mbRequestMove = false; + } +} + +void dAcOGirahimuFloor_c::doShatter() { + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_876_, mPosition, nullptr, nullptr, nullptr, nullptr, 0, 0); + startSound(SE_BGh3_GIRAHIM_STAGE_BREAK); + for (int i = 0; i < 3; ++i) { + dBgS::GetInstance()->Release(&mBg[i]); + } + deleteRequest(); +} + +void something() { + static const f32 f = 9000000.0f; +} From 364cd71a1e71184999d481ded529033c7c38a1ff Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 3 Oct 2026 11:25:29 +0200 Subject: [PATCH 5/5] Correct function call --- src/REL/d/a/obj/d_a_obj_girahimu_sword_link.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/REL/d/a/obj/d_a_obj_girahimu_sword_link.cpp b/src/REL/d/a/obj/d_a_obj_girahimu_sword_link.cpp index ddec988d..aba45d67 100644 --- a/src/REL/d/a/obj/d_a_obj_girahimu_sword_link.cpp +++ b/src/REL/d/a/obj/d_a_obj_girahimu_sword_link.cpp @@ -196,7 +196,7 @@ void dAcObjGirahimuSwordLink_c::finalizeState_AtThrow() { } void dAcObjGirahimuSwordLink_c::initializeState_Stick() { - holdSound(SE_OGhSwL_BOUND); + startSound(SE_OGhSwL_BOUND); mMdl.setInactive(); mAcceleration = 0.0f; mVelocity.set(0.0f, 0.0f, 0.0f);