summaryrefslogtreecommitdiff
path: root/src/REL/d
diff options
context:
space:
mode:
authorelijah-thomas774 <elijahthomas774@gmail.com>2026-10-19 22:51:09 -0400
committerelijah-thomas774 <elijahthomas774@gmail.com>2026-10-19 22:51:09 -0400
commit484bae876d0832fcecd5b0eea2cea0bc49264690 (patch)
tree2cc5655714abe8049e7888289763c49db5150460 /src/REL/d
parentd6e5efbbe5d12f481b35cb09ad0515d9f0c22a14 (diff)
parentfcb030b4813c35d530ffa3d8f6e6a7fcb3788a89 (diff)
Merge remote-tracking branch 'upstream/HEAD' into bases
Diffstat (limited to 'src/REL/d')
-rw-r--r--src/REL/d/a/obj/d_a_obj_D3_dummy.cpp123
-rw-r--r--src/REL/d/a/obj/d_a_obj_control_panel.cpp4
2 files changed, 125 insertions, 2 deletions
diff --git a/src/REL/d/a/obj/d_a_obj_D3_dummy.cpp b/src/REL/d/a/obj/d_a_obj_D3_dummy.cpp
index fe42fcca..fd854446 100644
--- a/src/REL/d/a/obj/d_a_obj_D3_dummy.cpp
+++ b/src/REL/d/a/obj/d_a_obj_D3_dummy.cpp
@@ -1,9 +1,132 @@
#include "d/a/obj/d_a_obj_D3_dummy.h"
+#include "common.h"
+#include "d/a/obj/d_a_obj_base.h"
+#include "d/col/bg/d_bg_s.h"
+#include "d/d_sc_game.h"
+#include "d/flag/dungeonflag_manager.h"
+#include "f/f_base.h"
+#include "m/m_vec.h"
+
+const char *d3Stages[8] = {
+ "D003_0", "D003_1", "D003_2", "D003_3", "D003_4", "D003_5", "D003_6", "D003_7",
+};
+
SPECIAL_ACTOR_PROFILE(OBJ_D3_DUMMY, dAcOD3Dummy_c, fProfile::OBJ_D3_DUMMY, 0x15E, 0, 6);
STATE_DEFINE(dAcOD3Dummy_c, Wait);
+bool dAcOD3Dummy_c::createHeap() {
+ const char *oarcName = "D3MapDummy";
+ const char *iconName = "dat/d3icon.bil";
+ const char *names[8] = {
+ "00", "01", "02", "03", "04", "05", "06", "07",
+ };
+ mCurrentRoomTileId = getCurrentSkyKeepRoomTileId();
+ updateTileMtx();
+
+ for (int i = 0; i < 8; i++) {
+ if (i == mCurrentRoomTileId) {
+ continue;
+ }
+ void *dzb = getOarcDZB(oarcName, names[i]);
+ void *plc = getOarcPLC(oarcName, names[i]);
+ if (mTileBgWs[i].Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, &mTileMtx[i], &mScale)) {
+ return false;
+ }
+ bool result = mTileBgWs[i].InitMapStuff(&mAllocator);
+ if (!result) {
+ return false;
+ }
+ mTileBgWs[i].Set0x2F(i);
+ }
+
+ mIconData = getOarcFile(oarcName, iconName);
+ if (mIconData == nullptr) {
+ return false;
+ }
+
+ return true;
+}
+
+int dAcOD3Dummy_c::create() {
+ CREATE_ALLOCATOR_SIZE(dAcOD3Dummy_c, 0x40000);
+ // check has map
+ if (DungeonflagManager::sInstance->getCounterOrFlag(2, 8)) {
+ registerBgs();
+ }
+ mAcceleration = 0.f;
+ mMaxSpeed = 0.f;
+ mStateMgr.changeState(StateID_Wait);
+ mBoundingBox.Set(mVec3_c(-0.f, -0.f, -0.f), mVec3_c(0.f, 0.f, 0.f));
+ return SUCCEEDED;
+}
+
+int dAcOD3Dummy_c::doDelete() {
+ return SUCCEEDED;
+}
+
+int dAcOD3Dummy_c::actorExecute() {
+ // check has map
+ if (DungeonflagManager::sInstance->getCounterOrFlag(2, 8)) {
+ registerBgs();
+ }
+ mStateMgr.executeState();
+ if (mUpdateTilePositions) {
+ updateTileMtx();
+ for (int i = 0; i < 8; i++) {
+ if (i != mCurrentRoomTileId) {
+ mTileBgWs[i].Move();
+ }
+ }
+ }
+ mUpdateTilePositions = false;
+ return SUCCEEDED;
+}
+
+int dAcOD3Dummy_c::draw() {
+ return SUCCEEDED;
+}
+
void dAcOD3Dummy_c::initializeState_Wait() {}
void dAcOD3Dummy_c::executeState_Wait() {}
void dAcOD3Dummy_c::finalizeState_Wait() {}
+
+s32 dAcOD3Dummy_c::getCurrentSkyKeepRoomTileId() {
+ for (int i = 0; i < 8; i++) {
+ if (dScGame_c::isCurrentStage(d3Stages[i])) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+void dAcOD3Dummy_c::updateTileMtx() {
+ s32 currentStageSpot = getSpotForTile(mCurrentRoomTileId);
+
+ for (int i = 0; i < 8; i++) {
+ if (i == mCurrentRoomTileId) {
+ continue;
+ }
+ s32 spot = getSpotForTile(i);
+ if (spot < 0) {
+ continue;
+ }
+ mVec3_c vec(
+ (spot % 3 - currentStageSpot % 3) * 7000.f, mPosition.y, (spot / 3 - currentStageSpot / 3) * 7000.f
+ );
+ mTileMtx[i].transS(vec);
+ }
+}
+
+void dAcOD3Dummy_c::registerBgs() {
+ if (!mHasBgsRegistered) {
+ for (int i = 0; i < 8; i++) {
+ if (i == mCurrentRoomTileId) {
+ continue;
+ }
+ dBgS::GetInstance()->RegistBg(&mTileBgWs[i], this);
+ }
+ mHasBgsRegistered = true;
+ }
+}
diff --git a/src/REL/d/a/obj/d_a_obj_control_panel.cpp b/src/REL/d/a/obj/d_a_obj_control_panel.cpp
index dc7b09c5..4aff586d 100644
--- a/src/REL/d/a/obj/d_a_obj_control_panel.cpp
+++ b/src/REL/d/a/obj/d_a_obj_control_panel.cpp
@@ -261,7 +261,7 @@ void dAcOCtrlPnl_c::finishMove() {
sIsInSkykeepPuzzle = false;
savePuzzleState();
if (mD3DummyRef.isLinked()) {
- mD3DummyRef.get()->setField_0x1570(1);
+ mD3DummyRef.get()->setUpdateTilePositionsSignal(1);
}
if (changed) {
mStateMgr.changeState(StateID_EndEvent);
@@ -477,7 +477,7 @@ void dAcOCtrlPnl_c::handleControl() {
dAcOD3Dummy_c *dummy = mD3DummyRef.get();
if (dummy != nullptr) {
savePuzzleState();
- dummy->setField_0x1570(1);
+ dummy->setUpdateTilePositionsSignal(1);
}
}
allowInteraction = false;