From f3b7eb581f14a68218dbd5f9397d756fbb41085c Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Tue, 29 Sep 2026 20:40:45 -0400 Subject: [PATCH] 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);