Merge remote-tracking branch 'upstream/HEAD' into bases

This commit is contained in:
elijah-thomas774
2026-10-19 13:13:46 -04:00
7 changed files with 1077 additions and 98 deletions
+11 -1
View File
@@ -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
+123 -2
View File
@@ -1,20 +1,141 @@
#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 tileId, const mVec3_c &vec, f32 f) {
mTilePositions[tileId] = vec;
mTileScales[tileId] = f;
}
void setNodeID(int i, s32 nodeID) {
mTileNodeIDs[i] = nodeID;
}
private:
/* 0x00 */ mVec3_c mTilePositions[8];
/* 0x20 */ f32 mTileScales[8];
/* 0x40 */ s32 mTileNodeIDs[8];
};
friend class callback_c;
struct Spot {
/* 0x00 */ Spot *mNeighbors[4];
/* 0x10 */ u8 mSpot;
/* 0x11 */ u8 mCurrentTile;
Spot *getNeighbor(s32 direction) {
return mNeighbors[direction];
}
};
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 setLinkVisibility(bool);
void updateTileColors();
void afterControlPanel();
void afterControlPanelFirst();
void enterMove();
void finishMove();
bool changedPuzzle();
bool isFirstTime();
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:
* 0 | 1 | 2
* ---+---+---
* 3 | 4 | 5
* ---+---+---
* 6 | 7 | 8
*/
/* 0x66C */ Spot mSpots[9];
/* 0x720 */ dAcRef_c<dAcOD3Dummy_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
@@ -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);
+5
View File
@@ -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[];