diff options
| author | elijah-thomas774 <elijahthomas774@gmail.com> | 2026-09-24 17:30:31 -0400 |
|---|---|---|
| committer | elijah-thomas774 <elijahthomas774@gmail.com> | 2026-09-24 17:30:31 -0400 |
| commit | c1a336a3b3feef2a258e7ec06fb90a37b58fa593 (patch) | |
| tree | 45ec0ff5c7ad4fb9029db3673e32af00601ac4e3 /src/d | |
| parent | 10e14b54f1deaf75295e75fee9529c2e533c8fa1 (diff) | |
| parent | 7b3cec08716d9b0fc89d9d279d3b7ef6cb855570 (diff) | |
Merge remote-tracking branch 'upstream/HEAD' into d_a_obj_bomb
Diffstat (limited to 'src/d')
| -rw-r--r-- | src/d/a/d_a_salbage_obj.cpp | 10 | ||||
| -rw-r--r-- | src/d/tg/d_t_alldie.cpp | 112 | ||||
| -rw-r--r-- | src/d/tg/d_t_view_clip.cpp | 93 |
3 files changed, 210 insertions, 5 deletions
diff --git a/src/d/a/d_a_salbage_obj.cpp b/src/d/a/d_a_salbage_obj.cpp index 73232f06..6fef71f6 100644 --- a/src/d/a/d_a_salbage_obj.cpp +++ b/src/d/a/d_a_salbage_obj.cpp @@ -97,9 +97,9 @@ int dAcSalbageObj_c::preExecute() { } } - getDowsingUnusedF32(); - field_0x95C.set(0.0f, getDowsingTargetYOffset(), 0.0f); - mDowsingTarget.setOffset(field_0x95C); + (void)getDowsingUnusedF32(); + mDowsingOffset.set(0.0f, getDowsingTargetYOffset(), 0.0f); + mDowsingTarget.setOffset(mDowsingOffset); return result; } @@ -312,7 +312,7 @@ void dAcSalbageObj_c::loadBehaviorFromParams() { } void dAcSalbageObj_c::initializeState_Wait() { - mDowsingTarget.initialize(getDowsingSlot(), 0, &field_0x95C, getDowsingUnusedF32()); + mDowsingTarget.initialize(getDowsingSlot(), 0, &mDowsingOffset, getDowsingUnusedF32()); mDowsingTarget.doRegister(); mIsDowsingRegistered = true; } @@ -323,7 +323,7 @@ void dAcSalbageObj_c::executeState_Wait() { dAcObjBase_c::create(fProfile::NPC_SLB, mRoomID, 0xFFFFFD01, &pos, nullptr, nullptr, -1); } - if (dSalvageMgr_c::sInstance->startedQuestForSalvageObj(this)) { + if (dSalvageMgr_c::sInstance->hasStartedQuestForSalvageObj(this)) { addAttentionTargetIfNeeded(); } } diff --git a/src/d/tg/d_t_alldie.cpp b/src/d/tg/d_t_alldie.cpp new file mode 100644 index 00000000..a205ce09 --- /dev/null +++ b/src/d/tg/d_t_alldie.cpp @@ -0,0 +1,112 @@ +#include "d/t/d_t_alldie.h" + +#include "common.h" +#include "d/a/d_a_player.h" +#include "d/a/e/d_a_en_base.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/d_stage.h" +#include "d/flag/sceneflag_manager.h" +#include "f/f_base.h" +#include "f/f_manager.h" +#include "f/f_profile_name.h" +#include "s/s_Math.h" +#include "toBeSorted/area_math.h" +#include "toBeSorted/event_manager.h" + +SPECIAL_ACTOR_PROFILE(ALLDIE_TAG, dTgAllDie_c, fProfile::ALLDIE_TAG, 0x23, 0, 4); + +int dTgAllDie_c::create() { + mSceneflag = getFromParams(4, 0xFF); + mType = getFromParams(12, 0x3); + mTimer0x140 = getFromParams(22, 0xFF); + field_0x148 = 0; + field_0x144 = getFromParams(30, 0xFF); + mRotation.x.set(0); + matrixCreateFromPosRotYScale(mArea, mPosition, mRotation.y, mScale, nullptr, 0.0f); + return SUCCEEDED; +} + +int dTgAllDie_c::doDelete() { + return SUCCEEDED; +} + +int dTgAllDie_c::actorExecute() { + if (!dStage_c::GetInstance()->isRoomID(mRoomID)) { + return SUCCEEDED; + } + + if (mType <= 1) { + if (dTimeAreaMgr_c::fn_800BBD40()) { + return SUCCEEDED; + } + + mTimeArea.check(mRoomID, mPosition, 0, 10.0f, 0.1f); + f32 f = mTimeArea.getDistMaybe(); + if (mType == 0 && f < 1.0f) { + return SUCCEEDED; + } + if (mType == 1 && 0.0f < f) { + return SUCCEEDED; + } + } + + mNumEnemiesInArea = 0; + dAcEnBase_c *pEnemy = nullptr; + while ((pEnemy = dAcEnBase_c::GetNextEnemy(pEnemy))) { + if (pEnemy->mRoomID == mRoomID && !pEnemy->checkInteractionFlags(0x2)) { + if (pEnemy->checkProcControl(DISABLE_EXECUTE) == 0 && pEnemy->mLifecycleState != TO_BE_DELETED) { + if (checkAreaBox(mArea, pEnemy->mPosition)) { + mNumEnemiesInArea++; + } + } + } + } + + if (mNumEnemiesInArea == 0) { + if (field_0x148 != 0 && EventManager::isInEvent()) { + return SUCCEEDED; + } + + if (sLib::calcTimer(&mTimer0x13C) == 0) { + if (mSceneflag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag)) { + SceneflagManager::sInstance->setFlag(mRoomID, mSceneflag); + } + } + } else { + mTimer0x13C = (mTimer0x140 <= 128 ? mTimer0x140 + 40 : 40 - (256 - mTimer0x140)); + if (mSceneflag < 0xFF && SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag)) { + SceneflagManager::sInstance->unsetFlag(mRoomID, mSceneflag); + } + } + return SUCCEEDED; +} + +int dTgAllDie_c::draw() { + return SUCCEEDED; +} + +dTgAllDie_c *dTgAllDie_c::getNearestToPlayer(s32 roomId) { + fBase_c *pPrev = nullptr; + dTgAllDie_c *pReturn = nullptr; + const dAcPy_c *pPlayer = dAcPy_c::GetLink(); + f32 minDist = 1e10f; + + while (true) { + dTgAllDie_c *pTgAllDie = + static_cast<dTgAllDie_c *>(fManager_c::searchBaseByProfName(fProfile::ALLDIE_TAG, pPrev)); + pPrev = pTgAllDie; + + if (pTgAllDie == nullptr) { + break; + } + + if (roomId == pTgAllDie->mRoomID) { + f32 dist = pPlayer->getPosition().squareDistanceToXZ(pTgAllDie->getPosition()); + if (dist < minDist) { + pReturn = pTgAllDie; + minDist = dist; + } + } + } + return pReturn; +} diff --git a/src/d/tg/d_t_view_clip.cpp b/src/d/tg/d_t_view_clip.cpp new file mode 100644 index 00000000..30ef9cba --- /dev/null +++ b/src/d/tg/d_t_view_clip.cpp @@ -0,0 +1,93 @@ +#include "d/t/d_t_view_clip.h" + +#include "common.h" +#include "d/d_camera.h" +#include "d/d_sc_game.h" +#include "f/f_base.h" +#include "toBeSorted/area_math.h" +#include "toBeSorted/area_utils.h" + +SPECIAL_ACTOR_PROFILE(VIEW_CLIP_TAG, dTgViewClip_c, fProfile::VIEW_CLIP_TAG, 0xB, 0, 0); + +u8 dTgViewClip_c::sViewClips[dTgViewClip_c::sNumEntries] = {}; + +int dTgViewClip_c::create() { + mIndex = getFromParams(0, 0x3F); + mType = getFromParams(8, 0xF); + if (mType == 0xF) { + mType = TYPE_FORCE_OFF; + } + + mAreaIndex = getFromParams(12, 0xFF); + matrixCreateFromPosRotYScale(mArea, mPosition, mRotation.y, mScale, nullptr, 0.0f); + + return SUCCEEDED; +} + +int dTgViewClip_c::doDelete() { + return SUCCEEDED; +} + +int dTgViewClip_c::actorExecute() { + return SUCCEEDED; +} + +int dTgViewClip_c::draw() { + dCamera_c *pCamera = dScGame_c::getCamera(); + if (!checkAreaBox(mArea, pCamera->getPosition())) { + if (mAreaIndex == 0xFF) { + return SUCCEEDED; + } + if (!checkPosInArea(mAreaIndex, mRoomID, pCamera->getPosition(), nullptr)) { + return SUCCEEDED; + } + } + + switch (mType) { + case TYPE_FORCE_ON: setViewClip(FLAG_FORCE_ON); break; + case TYPE_FORCE_OFF: setViewClip(FLAG_FORCE_OFF); break; + } + + return SUCCEEDED; +} + +void dTgViewClip_c::setViewClip(u8 setBit) { + setViewClipBit(mIndex, setBit); +} + +void dTgViewClip_c::resetViewClip() { + for (int i = 0; i < sNumEntries - 1; ++i) { + setViewClip(i, 0); + } +} + +f32 dTgViewClip_c::getCull(s32 idx, f32 cullDistance) { + if (idx > ARRAY_LENGTH(sViewClips) - 2) { + return cullDistance; + } + + if (getViewClipBit(idx, FLAG_FORCE_ON)) { + return FLOAT_MAX; + } else if (getViewClipBit(idx, FLAG_FORCE_OFF)) { + return -1.0f; + } + + return cullDistance; +} +bool dTgViewClip_c::checkForceOn(s32 idx) { + if (idx <= ARRAY_LENGTH(sViewClips) - 2) { + return getViewClipBit(idx, FLAG_FORCE_ON); + } + return false; +} + +u8 dTgViewClip_c::getViewClipBit(s32 idx, u8 setBit) { + return sViewClips[idx] & setBit; +} +void dTgViewClip_c::setViewClipBit(s32 idx, u8 setBit) { + sViewClips[idx] |= setBit; +} + +void dTgViewClip_c::setViewClip(s32 idx, u8 value) { + sViewClips[idx] = value; +} |
