diff --git a/config/SOUE01/rels/d_a_obj_impa_doorNP/symbols.txt b/config/SOUE01/rels/d_a_obj_impa_doorNP/symbols.txt index 2cf360f1..8798ffa7 100644 --- a/config/SOUE01/rels/d_a_obj_impa_doorNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_impa_doorNP/symbols.txt @@ -8,13 +8,13 @@ __dt__27sFState_c<14dAcOimpaDoor_c>Fv = .text:0x000001B0; // type:function size: __dt__30sFStateFct_c<14dAcOimpaDoor_c>Fv = .text:0x00000210; // type:function size:0x6C __dt__83sStateMgr_c<14dAcOimpaDoor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000280; // type:function size:0xA0 __dt__53sFStateMgr_c<14dAcOimpaDoor_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000320; // type:function size:0xA4 -fn_421_3D0 = .text:0x000003D0; // type:function size:0x88 -fn_421_460 = .text:0x00000460; // type:function size:0xE8 +createHeap__14dAcOimpaDoor_cFv = .text:0x000003D0; // type:function size:0x88 +create__14dAcOimpaDoor_cFv = .text:0x00000460; // type:function size:0xE8 changeState__83sStateMgr_c<14dAcOimpaDoor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000550; // type:function size:0x10 -fn_421_560 = .text:0x00000560; // type:function size:0x8 -fn_421_570 = .text:0x00000570; // type:function size:0x30 +doDelete__14dAcOimpaDoor_cFv = .text:0x00000560; // type:function size:0x8 +actorExecute__14dAcOimpaDoor_cFv = .text:0x00000570; // type:function size:0x30 executeState__83sStateMgr_c<14dAcOimpaDoor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000005A0; // type:function size:0x10 -fn_421_5B0 = .text:0x000005B0; // type:function size:0x28 +draw__14dAcOimpaDoor_cFv = .text:0x000005B0; // type:function size:0x28 initializeState_Wait__14dAcOimpaDoor_cFv = .text:0x000005E0; // type:function size:0x4 executeState_Wait__14dAcOimpaDoor_cFv = .text:0x000005F0; // type:function size:0x4 finalizeState_Wait__14dAcOimpaDoor_cFv = .text:0x00000600; // type:function size:0x4 @@ -40,11 +40,11 @@ isSameName__29sFStateID_c<14dAcOimpaDoor_c>CFPCc = .text:0x00000A20; // type:fun _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 -lbl_421_rodata_0 = .rodata:0x00000000; // type:object size:0x18 data:float +lbl_421_rodata_0 = .rodata:0x00000000; // type:object size:0x18 data:float scope:local g_profile_OBJ_IMPA_DOOR = .data:0x00000000; // type:object size:0x10 data:4byte -lbl_421_data_10 = .data:0x00000010; // type:object size:0x8 -lbl_421_data_18 = .data:0x00000018; // type:object size:0x10 data:string -lbl_421_data_28 = .data:0x00000028; // type:object size:0x20 +lbl_421_data_10 = .data:0x00000010; // type:object size:0x8 scope:local +lbl_421_data_18 = .data:0x00000018; // type:object size:0x10 data:string scope:local +lbl_421_data_28 = .data:0x00000028; // type:object size:0x20 scope:local lbl_421_data_48 = .data:0x00000048; // type:object size:0x80 lbl_421_data_C8 = .data:0x000000C8; // type:object size:0x30 lbl_421_data_F8 = .data:0x000000F8; // type:object size:0x30 @@ -52,5 +52,5 @@ lbl_421_data_128 = .data:0x00000128; // type:object size:0x18 lbl_421_data_140 = .data:0x00000140; // type:object size:0x5C lbl_421_data_19C = .data:0x0000019C; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_421_bss_8 = .bss:0x00000008; // type:object size:0x10 -lbl_421_bss_18 = .bss:0x00000018; // type:object size:0x30 data:4byte +lbl_421_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local +lbl_421_bss_18 = .bss:0x00000018; // type:object size:0x30 data:4byte scope:local diff --git a/configure.py b/configure.py index b330066f..71c72273 100644 --- a/configure.py +++ b/configure.py @@ -2106,7 +2106,7 @@ config.libs = [ Rel(NonMatching, "d_a_obj_hit_lever_sw", "REL/d/a/obj/d_a_obj_hit_lever_sw.cpp"), Rel(NonMatching, "d_a_obj_hole", "REL/d/a/obj/d_a_obj_hole.cpp"), Rel(NonMatching, "d_a_obj_hole_minigame", "REL/d/a/obj/d_a_obj_hole_minigame.cpp"), - Rel(NonMatching, "d_a_obj_impa_door", "REL/d/a/obj/d_a_obj_impa_door.cpp"), + Rel(Matching, "d_a_obj_impa_door", "REL/d/a/obj/d_a_obj_impa_door.cpp"), Rel(NonMatching, "d_a_obj_insect_island", "REL/d/a/obj/d_a_obj_insect_island.cpp"), Rel(NonMatching, "d_a_obj_into_hole", "REL/d/a/obj/d_a_obj_into_hole.cpp"), Rel(Matching, "d_a_obj_iron_stage", "REL/d/a/obj/d_a_obj_iron_stage.cpp"), diff --git a/include/d/a/obj/d_a_obj_impa_door.h b/include/d/a/obj/d_a_obj_impa_door.h index c30c6606..2ba7f85f 100644 --- a/include/d/a/obj/d_a_obj_impa_door.h +++ b/include/d/a/obj/d_a_obj_impa_door.h @@ -2,8 +2,9 @@ #define D_A_OBJ_IMPA_DOOR_H #include "d/a/obj/d_a_obj_base.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 dAcOimpaDoor_c : public dAcObjBase_c { public: @@ -12,8 +13,16 @@ public: STATE_FUNC_DECLARE(dAcOimpaDoor_c, Wait); + virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int actorExecute() override; + virtual int draw() override; + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOimpaDoor_c); + /* 0x330 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ STATE_MGR_DECLARE(dAcOimpaDoor_c); }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_impa_door.cpp b/src/REL/d/a/obj/d_a_obj_impa_door.cpp index ce75d5fd..5bd57c4f 100644 --- a/src/REL/d/a/obj/d_a_obj_impa_door.cpp +++ b/src/REL/d/a/obj/d_a_obj_impa_door.cpp @@ -1,9 +1,48 @@ #include "d/a/obj/d_a_obj_impa_door.h" +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "f/f_base.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" + SPECIAL_ACTOR_PROFILE(OBJ_IMPA_DOOR, dAcOimpaDoor_c, fProfile::OBJ_IMPA_DOOR, 0x20C, 0, 3); STATE_DEFINE(dAcOimpaDoor_c, Wait); +bool dAcOimpaDoor_c::createHeap() { + void *data = getOarcFile("DoorG", "g3d/model.brres"); + mResFile = nw4r::g3d::ResFile(data); + nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("DoorG"); + TRY_CREATE(mMdl.create(mdl, &heap_allocator, 0x120, 1, nullptr)); + return true; +} + +int dAcOimpaDoor_c::create() { + CREATE_ALLOCATOR(dAcOimpaDoor_c); + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + mStateMgr.changeState(StateID_Wait); + mMdl.setPriorityDraw(0x1C, 9); + boundingBox.Set(mVec3_c(-250.0f, 0.0f, -30.0f), mVec3_c(250.0f, 940.0f, 30.0f)); + return SUCCEEDED; +} + +int dAcOimpaDoor_c::doDelete() { + return SUCCEEDED; +} + +int dAcOimpaDoor_c::actorExecute() { + mStateMgr.executeState(); + return SUCCEEDED; +} + +int dAcOimpaDoor_c::draw() { + drawModelType1(&mMdl); + return SUCCEEDED; +} + void dAcOimpaDoor_c::initializeState_Wait() {} void dAcOimpaDoor_c::executeState_Wait() {} void dAcOimpaDoor_c::finalizeState_Wait() {}