diff --git a/config/SOUE01/rels/d_a_obj_girahim_footNP/symbols.txt b/config/SOUE01/rels/d_a_obj_girahim_footNP/symbols.txt index e1c14531..3366d7c3 100644 --- a/config/SOUE01/rels/d_a_obj_girahim_footNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_girahim_footNP/symbols.txt @@ -4,22 +4,21 @@ _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 dAcOgirahimFoot_c_classInit__Fv = .text:0x000000F0; // type:function size:0xD0 -fn_425_1C0 = .text:0x000001C0; // type:function size:0x58 +__dt__15dShadowCircle_cFv = .text:0x000001C0; // type:function size:0x58 __dt__30sFState_c<17dAcOgirahimFoot_c>Fv = .text:0x00000220; // type:function size:0x58 __dt__33sFStateFct_c<17dAcOgirahimFoot_c>Fv = .text:0x00000280; // type:function size:0x6C __dt__86sStateMgr_c<17dAcOgirahimFoot_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000002F0; // type:function size:0xA0 __dt__56sFStateMgr_c<17dAcOgirahimFoot_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000390; // type:function size:0xA4 -fn_425_440 = .text:0x00000440; // type:function size:0x80 -fn_425_4C0 = .text:0x000004C0; // type:function size:0xE8 +createHeap__17dAcOgirahimFoot_cFv = .text:0x00000440; // type:function size:0x80 +create__17dAcOgirahimFoot_cFv = .text:0x000004C0; // type:function size:0xE8 changeState__86sStateMgr_c<17dAcOgirahimFoot_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000005B0; // type:function size:0x10 -fn_425_5C0 = .text:0x000005C0; // type:function size:0x8 -fn_425_5D0 = .text:0x000005D0; // type:function size:0x30 +doDelete__17dAcOgirahimFoot_cFv = .text:0x000005C0; // type:function size:0x8 +actorExecute__17dAcOgirahimFoot_cFv = .text:0x000005D0; // type:function size:0x30 executeState__86sStateMgr_c<17dAcOgirahimFoot_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000600; // type:function size:0x10 -fn_425_610 = .text:0x00000610; // type:function size:0xF4 +draw__17dAcOgirahimFoot_cFv = .text:0x00000610; // type:function size:0xF4 getStateID__86sStateMgr_c<17dAcOgirahimFoot_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000710; // type:function size:0x10 initializeState_Wait__17dAcOgirahimFoot_cFv = .text:0x00000720; // type:function size:0xC -executeState_Wait__17dAcOgirahimFoot_cFv = .text:0x00000730; // type:function size:0x24 -fn_425_754 = .text:0x00000754; // type:function size:0x4 +executeState_Wait__17dAcOgirahimFoot_cFv = .text:0x00000730; // type:function size:0x28 finalizeState_Wait__17dAcOgirahimFoot_cFv = .text:0x00000760; // type:function size:0x4 initializeState_Appear__17dAcOgirahimFoot_cFv = .text:0x00000770; // type:function size:0xC executeState_Appear__17dAcOgirahimFoot_cFv = .text:0x00000780; // type:function size:0x68 @@ -47,15 +46,15 @@ _dtors = .dtors:0x00000000; // type:label scope:global __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global lbl_425_rodata_0 = .rodata:0x00000000; // type:object size:0x18 data:float g_profile_OBJ_GIRAHIM_FOOT = .data:0x00000000; // type:object size:0x10 data:4byte -lbl_425_data_10 = .data:0x00000010; // type:object size:0x10 -lbl_425_data_20 = .data:0x00000020; // type:object size:0x20 -lbl_425_data_40 = .data:0x00000040; // type:object size:0x80 -lbl_425_data_C0 = .data:0x000000C0; // type:object size:0x30 -lbl_425_data_F0 = .data:0x000000F0; // type:object size:0x30 -lbl_425_data_120 = .data:0x00000120; // type:object size:0x18 -lbl_425_data_138 = .data:0x00000138; // type:object size:0x18 -lbl_425_data_150 = .data:0x00000150; // type:object size:0x9C -lbl_425_data_1EC = .data:0x000001EC; // type:object size:0x34 +lbl_425_data_10 = .data:0x00000010; // type:object size:0x10 scope:local +lbl_425_data_20 = .data:0x00000020; // type:object size:0x20 scope:local +__vt__17dAcOgirahimFoot_c = .data:0x00000040; // type:object size:0x80 +lbl_425_data_C0 = .data:0x000000C0; // type:object size:0x30 scope:local +lbl_425_data_F0 = .data:0x000000F0; // type:object size:0x30 scope:local +lbl_425_data_120 = .data:0x00000120; // type:object size:0x18 scope:local +lbl_425_data_138 = .data:0x00000138; // type:object size:0x18 scope:local +lbl_425_data_150 = .data:0x00000150; // type:object size:0x9C scope:local +lbl_425_data_1EC = .data:0x000001EC; // type:object size:0x34 scope:local __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global lbl_425_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte lbl_425_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte diff --git a/include/d/a/obj/d_a_obj_girahim_foot.h b/include/d/a/obj/d_a_obj_girahim_foot.h index 01476278..ddc5199a 100644 --- a/include/d/a/obj/d_a_obj_girahim_foot.h +++ b/include/d/a/obj/d_a_obj_girahim_foot.h @@ -2,19 +2,32 @@ #define D_A_OBJ_GIRAHIM_FOOT_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/m3d/m_smdl.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" class dAcOgirahimFoot_c : public dAcObjBase_c { public: dAcOgirahimFoot_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOgirahimFoot_c() {} + virtual int create() override; + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorExecute() override; + STATE_FUNC_DECLARE(dAcOgirahimFoot_c, Wait); STATE_FUNC_DECLARE(dAcOgirahimFoot_c, Appear); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOgirahimFoot_c); + /* 0x330 */ nw4r::g3d::ResFile mRes; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ dShadowCircle_c mShadow; + /* 0x358 */ STATE_MGR_DECLARE(dAcOgirahimFoot_c); + /* 0x394 */ bool field_0x394; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_girahim_foot.cpp b/src/REL/d/a/obj/d_a_obj_girahim_foot.cpp index c873f90a..4e00ed88 100644 --- a/src/REL/d/a/obj/d_a_obj_girahim_foot.cpp +++ b/src/REL/d/a/obj/d_a_obj_girahim_foot.cpp @@ -1,13 +1,93 @@ #include "d/a/obj/d_a_obj_girahim_foot.h" +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "f/f_base.h" +#include "m/m_angle.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "s/s_State.hpp" +#include "toBeSorted/d_emitter.h" + SPECIAL_ACTOR_PROFILE(OBJ_GIRAHIM_FOOT, dAcOgirahimFoot_c, fProfile::OBJ_GIRAHIM_FOOT, 0x210, 0, 6); STATE_DEFINE(dAcOgirahimFoot_c, Wait); STATE_DEFINE(dAcOgirahimFoot_c, Appear); -void dAcOgirahimFoot_c::initializeState_Wait() {} -void dAcOgirahimFoot_c::executeState_Wait() {} +bool dAcOgirahimFoot_c::createHeap() { + mRes = nw4r::g3d::ResFile(getOarcResFile("Girahim_Foot")); + + nw4r::g3d::ResMdl resMdl = mRes.GetResMdl("Girahim_Foot"); + + TRY_CREATE(mMdl.create(resMdl, &heap_allocator, 0x120, 1, nullptr)); + + return true; +} + +int dAcOgirahimFoot_c::create() { + CREATE_ALLOCATOR(dAcOgirahimFoot_c); + + updateMatrix(); + + mMdl.setLocalMtx(mWorldMtx); + + mStateMgr.changeState(StateID_Wait); + + poscopy2.x = 13275.0f; + poscopy2.y = 2370.0f; + poscopy2.z = -11780.0f; + + mVec3_c min, max; + mMdl.getBounds(&min, &max); + boundingBox.Set(min, max); + + return SUCCEEDED; +} + +int dAcOgirahimFoot_c::doDelete() { + return SUCCEEDED; +}; + +int dAcOgirahimFoot_c::draw() { + if (*mStateMgr.getStateID() == StateID_Appear) { + drawModelType1(&mMdl); + static mQuat_c rot(0.0f, 25.0f, 0.0f, 200.0f); + fn_8002edb0(mShadow, mMdl, &rot, -1, -1, 0.0f); + } + return SUCCEEDED; +} + +int dAcOgirahimFoot_c::actorExecute() { + mStateMgr.executeState(); + return SUCCEEDED; +} + +void dAcOgirahimFoot_c::initializeState_Wait() { + field_0x394 = false; +} + +void dAcOgirahimFoot_c::executeState_Wait() { + if (field_0x394) { + mStateMgr.changeState(StateID_Appear); + } + return; +} + void dAcOgirahimFoot_c::finalizeState_Wait() {} -void dAcOgirahimFoot_c::initializeState_Appear() {} -void dAcOgirahimFoot_c::executeState_Appear() {} + +void dAcOgirahimFoot_c::initializeState_Appear() { + field_0x394 = true; +} + +// Not matching by one instruction +void dAcOgirahimFoot_c::executeState_Appear() { + if (field_0x394) { + return; + } + + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_77_, position, nullptr, &mScale, nullptr, nullptr, 0, 0); + + deleteRequest(); +} + void dAcOgirahimFoot_c::finalizeState_Appear() {}