diff options
| author | elijah-thomas774 <elijahthomas774@gmail.com> | 2026-10-19 22:51:09 -0400 |
|---|---|---|
| committer | elijah-thomas774 <elijahthomas774@gmail.com> | 2026-10-19 22:51:09 -0400 |
| commit | 484bae876d0832fcecd5b0eea2cea0bc49264690 (patch) | |
| tree | 2cc5655714abe8049e7888289763c49db5150460 /src | |
| parent | d6e5efbbe5d12f481b35cb09ad0515d9f0c22a14 (diff) | |
| parent | fcb030b4813c35d530ffa3d8f6e6a7fcb3788a89 (diff) | |
Merge remote-tracking branch 'upstream/HEAD' into bases
Diffstat (limited to 'src')
| -rw-r--r-- | src/REL/d/a/obj/d_a_obj_D3_dummy.cpp | 123 | ||||
| -rw-r--r-- | src/REL/d/a/obj/d_a_obj_control_panel.cpp | 4 | ||||
| -rw-r--r-- | src/d/col/bg/d_bg_w_base.cpp | 2 |
3 files changed, 126 insertions, 3 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; diff --git a/src/d/col/bg/d_bg_w_base.cpp b/src/d/col/bg/d_bg_w_base.cpp index 4efd5109..4df8b850 100644 --- a/src/d/col/bg/d_bg_w_base.cpp +++ b/src/d/col/bg/d_bg_w_base.cpp @@ -98,6 +98,6 @@ bool dBgW_Base::ChkReady() const { return true; } -void dBgW_Base::Set0x2F(u8 val) { +void dBgW_Base::Set0x2F(s32 val) { field_0x2F = val; } |
