From 86a321b23e12503a08dde566fb50d27afd91cebb Mon Sep 17 00:00:00 2001 From: swekka Date: Sat, 6 Dec 2025 15:31:18 +0100 Subject: [PATCH] d_a_obj_shed OK --- config/SOUE01/rels/d_a_obj_shedNP/symbols.txt | 44 +++---- configure.py | 2 +- include/d/a/obj/d_a_obj_shed.h | 24 +++- src/REL/d/a/obj/d_a_obj_shed.cpp | 113 +++++++++++++++++- 4 files changed, 154 insertions(+), 29 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_shedNP/symbols.txt b/config/SOUE01/rels/d_a_obj_shedNP/symbols.txt index 0523fa93..883dc90d 100644 --- a/config/SOUE01/rels/d_a_obj_shedNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_shedNP/symbols.txt @@ -8,19 +8,19 @@ __dt__23sFState_c<10dAcOShed_c>Fv = .text:0x000001D0; // type:function size:0x58 __dt__26sFStateFct_c<10dAcOShed_c>Fv = .text:0x00000230; // type:function size:0x6C __dt__79sStateMgr_c<10dAcOShed_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000002A0; // type:function size:0xA0 __dt__49sFStateMgr_c<10dAcOShed_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000340; // type:function size:0xA4 -AcOShed__initModels = .text:0x000003F0; // type:function size:0xE8 -AcOShed__init = .text:0x000004E0; // type:function size:0x1E4 +createHeap__10dAcOShed_cFv = .text:0x000003F0; // type:function size:0xE8 +create__10dAcOShed_cFv = .text:0x000004E0; // type:function size:0x1E4 changeState__79sStateMgr_c<10dAcOShed_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000006D0; // type:function size:0x10 -fn_587_6E0 = .text:0x000006E0; // type:function size:0x8 -AcOShed__update = .text:0x000006F0; // type:function size:0xAC +doDelete__10dAcOShed_cFv = .text:0x000006E0; // type:function size:0x8 +actorExecute__10dAcOShed_cFv = .text:0x000006F0; // type:function size:0xAC executeState__79sStateMgr_c<10dAcOShed_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000007A0; // type:function size:0x10 -AcOShed__draw = .text:0x000007B0; // type:function size:0x28 +draw__10dAcOShed_cFv = .text:0x000007B0; // type:function size:0x28 initializeState_Wait__10dAcOShed_cFv = .text:0x000007E0; // type:function size:0x4 executeState_Wait__10dAcOShed_cFv = .text:0x000007F0; // type:function size:0x88 finalizeState_Wait__10dAcOShed_cFv = .text:0x00000880; // type:function size:0x4 initializeState_Move__10dAcOShed_cFv = .text:0x00000890; // type:function size:0x120 executeState_Move__10dAcOShed_cFv = .text:0x000009B0; // type:function size:0x70 -AcOShed__decrement = .text:0x00000A20; // type:function size:0x1C +calcTimer__4sLibFPUc_Uc = .text:0x00000A20; // type:function size:0x1C finalizeState_Move__10dAcOShed_cFv = .text:0x00000A40; // type:function size:0xC __dt__10dAcOShed_cFv = .text:0x00000A50; // type:function size:0xE4 getStateID__79sStateMgr_c<10dAcOShed_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000B40; // type:function size:0x10 @@ -44,21 +44,21 @@ isSameName__25sFStateID_c<10dAcOShed_c>CFPCc = .text:0x00000F30; // type:functio _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_587_rodata_0 = .rodata:0x00000000; // type:object size:0x8 data:float -lbl_587_rodata_8 = .rodata:0x00000008; // type:object size:0x4 align:4 data:float -lbl_587_rodata_C = .rodata:0x0000000C; // type:object size:0x1C align:4 data:float -lbl_587_rodata_28 = .rodata:0x00000028; // type:object size:0x4 align:4 data:float +lbl_587_rodata_0 = .rodata:0x00000000; // type:object size:0x8 scope:local data:float +lbl_587_rodata_8 = .rodata:0x00000008; // type:object size:0x4 scope:local align:4 data:float +lbl_587_rodata_C = .rodata:0x0000000C; // type:object size:0x1C scope:local align:4 data:float +lbl_587_rodata_28 = .rodata:0x00000028; // type:object size:0x4 scope:local align:4 data:float g_profile_OBJ_SHED = .data:0x00000000; // type:object size:0x60 data:4byte -lbl_587_data_60 = .data:0x00000060; // type:object size:0x18 data:string -lbl_587_data_78 = .data:0x00000078; // type:object size:0x4 data:4byte -lbl_587_data_7C = .data:0x0000007C; // type:object size:0x4 data:4byte -AcOShed__vtable = .data:0x00000080; // type:object size:0x80 -lbl_587_data_100 = .data:0x00000100; // type:object size:0x30 -lbl_587_data_130 = .data:0x00000130; // type:object size:0x30 -lbl_587_data_160 = .data:0x00000160; // type:object size:0x18 -lbl_587_data_178 = .data:0x00000178; // type:object size:0x98 -lbl_587_data_210 = .data:0x00000210; // type:object size:0x34 +lbl_587_data_60 = .data:0x00000060; // type:object size:0x18 scope:local data:string +lbl_587_data_78 = .data:0x00000078; // type:object size:0x4 scope:local data:4byte +lbl_587_data_7C = .data:0x0000007C; // type:object size:0x4 scope:local data:4byte +__vt__10dAcOShed_c = .data:0x00000080; // type:object size:0x80 +__vt__49sFStateMgr_c<10dAcOShed_c,20sStateMethodUsr_FI_c> = .data:0x00000100; // type:object size:0x30 +__vt__79sStateMgr_c<10dAcOShed_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000130; // type:object size:0x30 +lbl_587_data_160 = .data:0x00000160; // type:object size:0x18 scope:local +lbl_587_data_178 = .data:0x00000178; // type:object size:0x98 scope:local +__vt__25sFStateID_c<10dAcOShed_c> = .data:0x00000210; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_587_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -AcOShed__STATE_WAIT = .bss:0x00000018; // type:object size:0x40 data:4byte -AcOShed__STATE_MOVE = .bss:0x00000058; // type:object size:0x30 data:4byte +lbl_587_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local data:4byte +AcOShed__STATE_WAIT = .bss:0x00000018; // type:object size:0x40 scope:local data:4byte +AcOShed__STATE_MOVE = .bss:0x00000058; // type:object size:0x30 scope:local data:4byte diff --git a/configure.py b/configure.py index 03e61e06..b26fcbfa 100644 --- a/configure.py +++ b/configure.py @@ -2643,7 +2643,7 @@ config.libs = [ Rel(NonMatching, "d_a_obj_sealed_door", "REL/d/a/obj/d_a_obj_sealed_door.cpp"), Rel(Matching, "d_a_obj_seat_sword", "REL/d/a/obj/d_a_obj_seat_sword.cpp"), Rel(NonMatching, "d_a_obj_sea_F301", "REL/d/a/obj/d_a_obj_sea_F301.cpp"), - Rel(NonMatching, "d_a_obj_shed", "REL/d/a/obj/d_a_obj_shed.cpp"), + Rel(Matching, "d_a_obj_shed", "REL/d/a/obj/d_a_obj_shed.cpp"), Rel(NonMatching, "d_a_obj_ship_window", "REL/d/a/obj/d_a_obj_ship_window.cpp"), Rel(Matching, "d_a_obj_shrine_after", "REL/d/a/obj/d_a_obj_shrine_after.cpp"), Rel(Matching, "d_a_obj_shrine_before", "REL/d/a/obj/d_a_obj_shrine_before.cpp"), diff --git a/include/d/a/obj/d_a_obj_shed.h b/include/d/a/obj/d_a_obj_shed.h index 9d472ef2..58f47398 100644 --- a/include/d/a/obj/d_a_obj_shed.h +++ b/include/d/a/obj/d_a_obj_shed.h @@ -2,19 +2,39 @@ #define D_A_OBJ_SHED_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "m/m3d/m_smdl.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" #include "s/s_StateMgr.hpp" +#include "toBeSorted/actor_event.h" class dAcOShed_c : public dAcObjBase_c { public: - dAcOShed_c() : mStateMgr(*this, sStateID::null) {} + dAcOShed_c() : mEvent(*this, nullptr), mStateMgr(*this, sStateID::null) {} virtual ~dAcOShed_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int draw() override; + virtual int actorExecute() override; + STATE_FUNC_DECLARE(dAcOShed_c, Wait); STATE_FUNC_DECLARE(dAcOShed_c, Move); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOShed_c); + /* 0x330 */ ActorEventRelated mEvent; + /* 0x380 */ nw4r::g3d::ResFile mResFile; + /* 0x384 */ m3d::smdl_c mMdl; + /* 0x3A0 */ dBgW mBgW; + /* 0x5B0 */ STATE_MGR_DECLARE(dAcOShed_c); + /* 0x5EC */ mVec3_c mVec; + /* 0x5F8 */ bool mIsOpen; + /* 0x5F9 */ u8 mSceneFlag; + /* 0x5FA */ u8 mEventId; + /* 0x5FB */ u8 mMoveTimer; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_shed.cpp b/src/REL/d/a/obj/d_a_obj_shed.cpp index bb941e8d..d23022d2 100644 --- a/src/REL/d/a/obj/d_a_obj_shed.cpp +++ b/src/REL/d/a/obj/d_a_obj_shed.cpp @@ -1,13 +1,118 @@ #include "d/a/obj/d_a_obj_shed.h" +#include "c/c_lib.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s.h" +#include "d/d_stage.h" +#include "d/flag/sceneflag_manager.h" +#include "f/f_base.h" +#include "m/m_angle.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "s/s_Math.h" +#include "toBeSorted/arc_managers/current_stage_arc_manager.h" +#include "toBeSorted/event.h" + SPECIAL_ACTOR_PROFILE(OBJ_SHED, dAcOShed_c, fProfile::OBJ_SHED, 0x256, 0, 6); STATE_DEFINE(dAcOShed_c, Wait); STATE_DEFINE(dAcOShed_c, Move); +// copy from d_a_obj_fairy - TODO move it to a shared file +inline static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor) { + target.x += factor * rot.sin(); + target.z += factor * rot.cos(); +} + +bool dAcOShed_c::createHeap() { + void *data = CurrentStageArcManager::GetInstance()->getData("g3d/stage.brres"); + mResFile = nw4r::g3d::ResFile(data); + dStage_c::bindSkyCmnToResFile(&mResFile); + nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("StageF000Shed"); + TRY_CREATE(mMdl.create(mdl, &mAllocator, 0x120, 1, nullptr)); + void *dzb = CurrentStageArcManager::GetInstance()->getData("dzb/StageF000Shed.dzb"); + void *plc = CurrentStageArcManager::GetInstance()->getData("dat/StageF000Shed.plc"); + updateMatrix(); + return !mBgW.Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, &mWorldMtx, &mScale); +} + +int dAcOShed_c::create() { + mEventId = getFromParams(0, 0xFF); + mSceneFlag = getFromParams(8, 0xFF); + CREATE_ALLOCATOR(dAcOShed_c); + mBgW.SetCrrFunc(dBgS_MoveBGProc_Typical); + dBgS::GetInstance()->Regist(&mBgW, this); + mAcceleration = 0.0f; + mMaxSpeed = -40.0f; + if (mSceneFlag < 0xFF) { + bool flag = SceneflagManager::sInstance->checkFlag(mRoomID, mSceneFlag); + if (flag) { + mIsOpen = true; + mVec = mPosition; + vecCylCalc(mVec, mRotation.y - 0x4000, 230.0f); + mPosition = mVec; + } + } + mStateMgr.changeState(StateID_Wait); + mBoundingBox.Set(mVec3_c(-115.0f, -0.0f, -10.0f), mVec3_c(115.0f, 260.0f, 10.0f)); + return SUCCEEDED; +} + +int dAcOShed_c::doDelete() { + return SUCCEEDED; +} + +int dAcOShed_c::actorExecute() { + mStateMgr.executeState(); + calcVelocity(); + mPosition += mVelocity; + mPosition += mStts.mCcMove; + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + mBgW.Move(); + return SUCCEEDED; +} + +int dAcOShed_c::draw() { + drawModelType1(&mMdl); + return SUCCEEDED; +} + void dAcOShed_c::initializeState_Wait() {} -void dAcOShed_c::executeState_Wait() {} + +void dAcOShed_c::executeState_Wait() { + if (!mIsOpen && mSceneFlag < 0xFF) { + if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneFlag)) { + mStateMgr.changeState(StateID_Move); + } + } +} + void dAcOShed_c::finalizeState_Wait() {} -void dAcOShed_c::initializeState_Move() {} -void dAcOShed_c::executeState_Move() {} -void dAcOShed_c::finalizeState_Move() {} + +volatile u32 FLAGS_1 = 0x00000001; +u32 FLAGS_2 = 0x00100001; + +void dAcOShed_c::initializeState_Move() { + if (mEventId != 0xFF) { + u32 f1 = FLAGS_1; + u32 f2 = FLAGS_2; + Event ev(mEventId, mRoomID, f2 & ~f1, 0, 0); + mEvent.scheduleEvent(ev, 0); + } + mAngle.y = mRotation.y + 0x4000; + mVec = mPosition; + vecCylCalc(mVec, mAngle.y, 230.0f); + mMoveTimer = 0x3c; +} + +void dAcOShed_c::executeState_Move() { + if (sLib::calcTimer(&mMoveTimer) == 0 && cLib::chasePosXZ(mPosition, mVec, 5.f)) { + mStateMgr.changeState(StateID_Wait); + } +} + +void dAcOShed_c::finalizeState_Move() { + mIsOpen = true; +}