From 4b658f2165fc19b1d1b37a8c135ebe14bd3d47f3 Mon Sep 17 00:00:00 2001 From: lepelog <25211966+lepelog@users.noreply.github.com> Date: Fri, 9 Oct 2026 01:20:51 +0200 Subject: 97% --- include/d/a/obj/d_a_obj_D3_dummy.h | 12 ++- include/d/a/obj/d_a_obj_control_panel.h | 120 +++++++++++++++++++++++++++- include/d/lyt/msg_window/d_lyt_msg_window.h | 4 + 3 files changed, 133 insertions(+), 3 deletions(-) (limited to 'include') diff --git a/include/d/a/obj/d_a_obj_D3_dummy.h b/include/d/a/obj/d_a_obj_D3_dummy.h index 6038bd67..48892644 100644 --- a/include/d/a/obj/d_a_obj_D3_dummy.h +++ b/include/d/a/obj/d_a_obj_D3_dummy.h @@ -2,6 +2,7 @@ #define D_A_OBJ_D3_DUMMY_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" #include "s/s_State.hpp" class dAcOD3Dummy_c : public dAcObjBase_c { @@ -11,8 +12,17 @@ public: STATE_FUNC_DECLARE(dAcOD3Dummy_c, Wait); + void setField_0x1570(u8 val) { + field_0x1570 = val; + } + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOD3Dummy_c); + /* 0x0330 */ dBgW field_330[8]; + /* 0x13B0 */ u8 unk[0x180]; + /* 0x1530 */ STATE_MGR_DECLARE(dAcOD3Dummy_c); + /* 0x156C */ u8 field_0x156C[4]; + /* 0x1570 */ u8 field_0x1570; + /* 0x1571 */ u8 field_0x1571[0xB]; }; #endif diff --git a/include/d/a/obj/d_a_obj_control_panel.h b/include/d/a/obj/d_a_obj_control_panel.h index 4427b2c5..97df2c39 100644 --- a/include/d/a/obj/d_a_obj_control_panel.h +++ b/include/d/a/obj/d_a_obj_control_panel.h @@ -1,20 +1,136 @@ #ifndef D_A_OBJ_CONTROL_PANEL_H #define D_A_OBJ_CONTROL_PANEL_H +#include "c/c_lib.h" +#include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/obj/d_a_obj_D3_dummy.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "d/d_message.h" +#include "d/flag/sceneflag_manager.h" +#include "m/m3d/m_mdl.h" +#include "m/m3d/m_smdl.h" +#include "m/m_color.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" +#include "toBeSorted/actor_event.h" +#include "toBeSorted/d_flow_mgr.h" class dAcOCtrlPnl_c : public dAcObjBase_c { + class callback_c : public m3d::callback_c { + public: + void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override; + void setPosAndScale(int i, const mVec3_c& vec, f32 f) { + field_0x0[i] = vec; + field_0x20[i] = f; + } + void setNodeID(int i, s32 nodeID) { + mNodeIDs[i] = nodeID; + } + private: + /* 0x00 */ mVec3_c field_0x0[8]; + /* 0x20 */ f32 field_0x20[8]; + /* 0x40 */ s32 mNodeIDs[8]; + }; + friend class callback_c; + struct Spot { + /* 0x00 */ Spot* mNeighbors[4]; + /* 0x10 */ u8 mSpot; + /* 0x11 */ u8 mCurrentTile; + }; public: - dAcOCtrlPnl_c() : mStateMgr(*this) {} + dAcOCtrlPnl_c() : mStateMgr(*this), mEvent(*this, nullptr), mFlowMgr(&mFlow) {} virtual ~dAcOCtrlPnl_c() {} + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + virtual void doInteraction(s32 /* InteractionType */) override; + + void updatePuzzleFromFile(); + void savePuzzleState(); + bool handleSlidingTile(); + void setupNeighbors(); + void updateTileScales(); + bool hasAdjacentEmptySpot(s32); + bool getAdjacentEmptySpot(s32, s32*); + void handleEvent(); + void handleControl(); + void updateDoorSceneflags(); + u8 getSpotForCursor(mVec2_c&); + u8 getMoveDirection(s32, s32); + void setTileID(u32, u32); + u8 getTileID(u32); + void resetPuzzleState(); + void updateTilePositions(); + void updateSpotTilesFromPuzzle(); + void getScreenCenter(mVec3_c&); + void handleLinkObjProp0x200(bool); + void updateTileColors(); + void afterControlPanel(); + void afterControlPanelFirst(); + void enterMove(); + void finishMove(); + bool changedPuzzle(); + bool isFirstTime(); + + inline bool doChaseTilePosToTarget() { + return cLib::chasePos(mTilePositions[mMovingTile], mGrabTargetPosition, 10.f) > 0; + } + + void setSceneflag(u8 flag) { + SceneflagManager::sInstance->setFlag(mRoomID, flag); + } + + void unsetSceneflag(u8 flag) { + SceneflagManager::sInstance->unsetFlag(mRoomID, flag); + } STATE_FUNC_DECLARE(dAcOCtrlPnl_c, Wait); STATE_FUNC_DECLARE(dAcOCtrlPnl_c, Control); STATE_FUNC_DECLARE(dAcOCtrlPnl_c, EndEvent); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOCtrlPnl_c); + /* 0x330 */ nw4r::g3d::ResFile mRes; + /* 0x334 */ m3d::mdl_c mModel; + /* 0x358 */ mVec3_c mTilePositions[8]; + /* 0x3B8 */ STATE_MGR_DECLARE(dAcOCtrlPnl_c); + /* 0x3F4 */ ActorEventRelated mEvent; + /* 0x444 */ mVec3_c mGrabTargetPosition; + /* 0x450 */ s32 mMovingTile; + /* 0x454 */ dBgW mBgW; + /* 0x664 */ s32 mCurrentlyHoveredTile; + /* 0x668 */ s32 mCurrentlyHoveredSpot; + /** The spots where tiles can be, in the following order: + * TODO check + * 0 | 1 | 2 + * ---+---+--- + * 3 | 4 | 5 + * ---+---+--- + * 6 | 7 | 8 + */ + /* 0x66C */ Spot mSpots[9]; + /* 0x720 */ dAcRef_c mD3DummyRef; + /* 0x72C */ bool mIsGrabbing; + /* 0x72D */ u8 mGrabTargetMoveDirection; + /* 0x72E */ u8 mGrabTargetSpot; + /* 0x730 */ mVec2_c mGrabStartCursorPos; + /* 0x738 */ bool mHasMovedATile; + /* 0x739 */ bool mLeavePuzzle; + /* 0x73C */ dFlow_c mFlow; + /* 0x7A0 */ dFlowMgrBase_c mFlowMgr; + /* 0x7F8 */ u8 mSkykeepPuzzle[9]; + /* 0x801 */ u8 mSkykeepPuzzleOriginal[9]; + /* 0x80C */ callback_c mCallback; + /* 0x8B0 */ f32 mTileScales[8]; + /* 0x8D0 */ s32 mTilePlateMatIDs[8]; + /* 0x8F0 */ s32 mTriforceMatIDs[3]; + /* 0x8FC */ mColor mNormalPlateColor; + /* 0x900 */ s32 mTimer; }; #endif diff --git a/include/d/lyt/msg_window/d_lyt_msg_window.h b/include/d/lyt/msg_window/d_lyt_msg_window.h index d3cb9ae3..9bb648d6 100644 --- a/include/d/lyt/msg_window/d_lyt_msg_window.h +++ b/include/d/lyt/msg_window/d_lyt_msg_window.h @@ -126,6 +126,10 @@ public: mValidChangeBtnMask |= flag; } + static void setFlowMgr(dFlowMgrBase_c * flowMgr) { + sFlowMgr = flowMgr; + } + private: bool setTextToDisplay(const wchar_t *text); void createSubMsgManager(u8 type); -- cgit v1.2.3 From f5c650e46ad6a7690931fe911ecd2a3fffa6c928 Mon Sep 17 00:00:00 2001 From: lepelog <25211966+lepelog@users.noreply.github.com> Date: Fri, 16 Oct 2026 23:38:19 +0200 Subject: small improvements --- include/d/a/obj/d_a_obj_control_panel.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'include') diff --git a/include/d/a/obj/d_a_obj_control_panel.h b/include/d/a/obj/d_a_obj_control_panel.h index 97df2c39..b47a6139 100644 --- a/include/d/a/obj/d_a_obj_control_panel.h +++ b/include/d/a/obj/d_a_obj_control_panel.h @@ -39,6 +39,10 @@ class dAcOCtrlPnl_c : public dAcObjBase_c { /* 0x00 */ Spot* mNeighbors[4]; /* 0x10 */ u8 mSpot; /* 0x11 */ u8 mCurrentTile; + + Spot* getNeighbor(s32 direction) { + return mNeighbors[direction]; + } }; public: dAcOCtrlPnl_c() : mStateMgr(*this), mEvent(*this, nullptr), mFlowMgr(&mFlow) {} @@ -90,6 +94,10 @@ public: SceneflagManager::sInstance->unsetFlag(mRoomID, flag); } + s32 hasNoFlag() { + return getFromParams(0x10, 0xFF) >= 0xFF; + } + STATE_FUNC_DECLARE(dAcOCtrlPnl_c, Wait); STATE_FUNC_DECLARE(dAcOCtrlPnl_c, Control); STATE_FUNC_DECLARE(dAcOCtrlPnl_c, EndEvent); -- cgit v1.2.3 From 3ad9c6a55e37a6de73ead142e6dabed47220b397 Mon Sep 17 00:00:00 2001 From: lepelog <25211966+lepelog@users.noreply.github.com> Date: Sat, 17 Oct 2026 00:01:05 +0200 Subject: rename functions --- include/toBeSorted/misc_actor.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'include') diff --git a/include/toBeSorted/misc_actor.h b/include/toBeSorted/misc_actor.h index ade8210e..c921a729 100644 --- a/include/toBeSorted/misc_actor.h +++ b/include/toBeSorted/misc_actor.h @@ -12,6 +12,11 @@ bool checkIsInSkykeepPuzzle(); void restoreSkykeepPuzzleFromGlobal(); +s32 getSKDoorSceneflag(s32, s32); +bool checkSKDoorHasSceneflag(s32, s32); +s32 getCurrentSkyKeepRoomTileId(); + +extern bool sIsInSkykeepPuzzle; extern const u8 sTadtoneSceneflags[]; extern const u8 sTadtoneGroupSizes[]; -- cgit v1.2.3 From 9c195c0a982e7f39a7936340db589df210909e41 Mon Sep 17 00:00:00 2001 From: lepelog <25211966+lepelog@users.noreply.github.com> Date: Sat, 17 Oct 2026 00:12:17 +0200 Subject: format --- include/d/a/obj/d_a_obj_control_panel.h | 40 +++++++++++++++-------------- include/d/lyt/msg_window/d_lyt_msg_window.h | 2 +- 2 files changed, 22 insertions(+), 20 deletions(-) (limited to 'include') diff --git a/include/d/a/obj/d_a_obj_control_panel.h b/include/d/a/obj/d_a_obj_control_panel.h index b47a6139..da971ba5 100644 --- a/include/d/a/obj/d_a_obj_control_panel.h +++ b/include/d/a/obj/d_a_obj_control_panel.h @@ -20,30 +20,32 @@ class dAcOCtrlPnl_c : public dAcObjBase_c { class callback_c : public m3d::callback_c { - public: - void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override; - void setPosAndScale(int i, const mVec3_c& vec, f32 f) { - field_0x0[i] = vec; - field_0x20[i] = f; - } - void setNodeID(int i, s32 nodeID) { - mNodeIDs[i] = nodeID; - } - private: - /* 0x00 */ mVec3_c field_0x0[8]; - /* 0x20 */ f32 field_0x20[8]; - /* 0x40 */ s32 mNodeIDs[8]; - }; + public: + void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override; + void setPosAndScale(int i, const mVec3_c &vec, f32 f) { + field_0x0[i] = vec; + field_0x20[i] = f; + } + void setNodeID(int i, s32 nodeID) { + mNodeIDs[i] = nodeID; + } + + private: + /* 0x00 */ mVec3_c field_0x0[8]; + /* 0x20 */ f32 field_0x20[8]; + /* 0x40 */ s32 mNodeIDs[8]; + }; friend class callback_c; struct Spot { - /* 0x00 */ Spot* mNeighbors[4]; + /* 0x00 */ Spot *mNeighbors[4]; /* 0x10 */ u8 mSpot; /* 0x11 */ u8 mCurrentTile; - Spot* getNeighbor(s32 direction) { + Spot *getNeighbor(s32 direction) { return mNeighbors[direction]; } }; + public: dAcOCtrlPnl_c() : mStateMgr(*this), mEvent(*this, nullptr), mFlowMgr(&mFlow) {} virtual ~dAcOCtrlPnl_c() {} @@ -61,18 +63,18 @@ public: void setupNeighbors(); void updateTileScales(); bool hasAdjacentEmptySpot(s32); - bool getAdjacentEmptySpot(s32, s32*); + bool getAdjacentEmptySpot(s32, s32 *); void handleEvent(); void handleControl(); void updateDoorSceneflags(); - u8 getSpotForCursor(mVec2_c&); + u8 getSpotForCursor(mVec2_c &); u8 getMoveDirection(s32, s32); void setTileID(u32, u32); u8 getTileID(u32); void resetPuzzleState(); void updateTilePositions(); void updateSpotTilesFromPuzzle(); - void getScreenCenter(mVec3_c&); + void getScreenCenter(mVec3_c &); void handleLinkObjProp0x200(bool); void updateTileColors(); void afterControlPanel(); diff --git a/include/d/lyt/msg_window/d_lyt_msg_window.h b/include/d/lyt/msg_window/d_lyt_msg_window.h index 9bb648d6..a9d2b9b2 100644 --- a/include/d/lyt/msg_window/d_lyt_msg_window.h +++ b/include/d/lyt/msg_window/d_lyt_msg_window.h @@ -126,7 +126,7 @@ public: mValidChangeBtnMask |= flag; } - static void setFlowMgr(dFlowMgrBase_c * flowMgr) { + static void setFlowMgr(dFlowMgrBase_c *flowMgr) { sFlowMgr = flowMgr; } -- cgit v1.2.3 From 012a744e2bec62d69e872af688beb4a2e09bbc93 Mon Sep 17 00:00:00 2001 From: lepelog <25211966+lepelog@users.noreply.github.com> Date: Sat, 17 Oct 2026 00:18:07 +0200 Subject: small cleanup --- include/d/a/obj/d_a_obj_control_panel.h | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'include') diff --git a/include/d/a/obj/d_a_obj_control_panel.h b/include/d/a/obj/d_a_obj_control_panel.h index da971ba5..2932660d 100644 --- a/include/d/a/obj/d_a_obj_control_panel.h +++ b/include/d/a/obj/d_a_obj_control_panel.h @@ -22,18 +22,18 @@ class dAcOCtrlPnl_c : public dAcObjBase_c { class callback_c : public m3d::callback_c { public: void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override; - void setPosAndScale(int i, const mVec3_c &vec, f32 f) { - field_0x0[i] = vec; - field_0x20[i] = f; + void setPosAndScale(int tileId, const mVec3_c &vec, f32 f) { + mTilePositions[tileId] = vec; + mTileScales[tileId] = f; } void setNodeID(int i, s32 nodeID) { - mNodeIDs[i] = nodeID; + mTileNodeIDs[i] = nodeID; } private: - /* 0x00 */ mVec3_c field_0x0[8]; - /* 0x20 */ f32 field_0x20[8]; - /* 0x40 */ s32 mNodeIDs[8]; + /* 0x00 */ mVec3_c mTilePositions[8]; + /* 0x20 */ f32 mTileScales[8]; + /* 0x40 */ s32 mTileNodeIDs[8]; }; friend class callback_c; struct Spot { @@ -84,7 +84,7 @@ public: bool changedPuzzle(); bool isFirstTime(); - inline bool doChaseTilePosToTarget() { + bool doChaseTilePosToTarget() { return cLib::chasePos(mTilePositions[mMovingTile], mGrabTargetPosition, 10.f) > 0; } @@ -96,10 +96,6 @@ public: SceneflagManager::sInstance->unsetFlag(mRoomID, flag); } - s32 hasNoFlag() { - return getFromParams(0x10, 0xFF) >= 0xFF; - } - STATE_FUNC_DECLARE(dAcOCtrlPnl_c, Wait); STATE_FUNC_DECLARE(dAcOCtrlPnl_c, Control); STATE_FUNC_DECLARE(dAcOCtrlPnl_c, EndEvent); -- cgit v1.2.3 From 502cd46c8a112834276b96cd4095d0d19b0faf76 Mon Sep 17 00:00:00 2001 From: lepelog <25211966+lepelog@users.noreply.github.com> Date: Sat, 17 Oct 2026 01:53:56 +0200 Subject: updates --- include/d/a/obj/d_a_obj_control_panel.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'include') diff --git a/include/d/a/obj/d_a_obj_control_panel.h b/include/d/a/obj/d_a_obj_control_panel.h index 2932660d..7f32a5c8 100644 --- a/include/d/a/obj/d_a_obj_control_panel.h +++ b/include/d/a/obj/d_a_obj_control_panel.h @@ -75,7 +75,7 @@ public: void updateTilePositions(); void updateSpotTilesFromPuzzle(); void getScreenCenter(mVec3_c &); - void handleLinkObjProp0x200(bool); + void setLinkVisibility(bool); void updateTileColors(); void afterControlPanel(); void afterControlPanelFirst(); @@ -112,7 +112,6 @@ private: /* 0x664 */ s32 mCurrentlyHoveredTile; /* 0x668 */ s32 mCurrentlyHoveredSpot; /** The spots where tiles can be, in the following order: - * TODO check * 0 | 1 | 2 * ---+---+--- * 3 | 4 | 5 -- cgit v1.2.3