summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorelijah-thomas774 <elijahthomas774@gmail.com>2026-09-20 11:53:53 -0400
committerelijah-thomas774 <elijahthomas774@gmail.com>2026-09-20 11:53:53 -0400
commit600cefbc7dd1e00772c591be90a86f4567d2ab43 (patch)
treee8ae834bf980256571cefba4ee74f1d2b840b9cc /src
parent9481f3ab62d690bd6534cb0adf7e02db5579b333 (diff)
unrelated Bomb Changes
Diffstat (limited to 'src')
-rw-r--r--src/REL/d/a/e/d_a_e_ks.cpp14
-rw-r--r--src/REL/d/a/e/d_a_e_remly.cpp4
-rw-r--r--src/REL/d/a/e/d_a_e_sm.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_tubo.cpp2
-rw-r--r--src/d/a/d_a_item.cpp2
-rw-r--r--src/d/a/d_a_player.cpp105
-rw-r--r--src/d/a/obj/d_a_obj_boomerang.cpp2
-rw-r--r--src/d/col/bg/d_bg_s_acch.cpp24
8 files changed, 130 insertions, 25 deletions
diff --git a/src/REL/d/a/e/d_a_e_ks.cpp b/src/REL/d/a/e/d_a_e_ks.cpp
index baee6dfc..e35e6123 100644
--- a/src/REL/d/a/e/d_a_e_ks.cpp
+++ b/src/REL/d/a/e/d_a_e_ks.cpp
@@ -187,7 +187,7 @@ void dAcEKs_c::setStartingState() {
changeState(StateID_Move);
mCurrentState = mStartingState;
mAcch.ClrRoofNone();
- mAcch.SetField_0xD4(55.f);
+ mAcch.SetRoofCrrHeight(55.f);
mAcch.SetGroundUpY(30.f);
mAcchCir.SetWall(20.f, 60.f);
} break;
@@ -199,14 +199,14 @@ void dAcEKs_c::setStartingState() {
}
mAcch.ClrRoofHit();
mAcch.SetGroundUpY(0.f);
- mAcch.SetField_0xD4(0.f);
+ mAcch.SetRoofCrrHeight(0.f);
mAcchCir.SetWall(0.f, 5.f);
} break;
case EKS_STARTSTATE_PathMove: {
mCurrentState = mStartingState;
mAcch.ClrRoofNone();
- mAcch.SetField_0xD4(55.f);
+ mAcch.SetRoofCrrHeight(55.f);
mAcch.SetGroundUpY(30.f);
mAcchCir.SetWall(20.f, 60.f);
changeState(StateID_PathMove);
@@ -1789,7 +1789,7 @@ void dAcEKs_c::initializeState_Wait() {
mRotation.y = field_0xD8A;
mRotation.x = mAng(0);
mAcch.ClrRoofHit();
- mAcch.SetField_0xD4(0);
+ mAcch.SetRoofCrrHeight(0);
mAcch.SetGroundUpY(0);
setBattleBgmRelated(0);
@@ -2042,7 +2042,7 @@ void dAcEKs_c::finalizeState_WakeUp() {
mAngle.y = mRotation.y;
mAcch.ClrRoofNone();
mAcchCir.SetWall(20, 60);
- mAcch.SetField_0xD4(55);
+ mAcch.SetRoofCrrHeight(55);
mAcch.SetGroundUpY(30);
}
@@ -2116,7 +2116,7 @@ void dAcEKs_c::initializeState_WaitReady() {
field_0xDA5 = 0;
field_0xD50 = 30;
mAcch.ClrRoofHit();
- mAcch.SetField_0xD4(0.f);
+ mAcch.SetRoofCrrHeight(0.f);
mAcch.SetGroundUpY(0.f);
field_0xDAD = 0;
field_0xDAE = 0;
@@ -2853,7 +2853,7 @@ void dAcEKs_c::initializeState_WindBlow() {
mAcceleration = -0.5f;
mAcch.ClrRoofNone();
mAcchCir.SetWall(20, 60);
- mAcch.SetField_0xD4(55);
+ mAcch.SetRoofCrrHeight(55);
mAcch.SetGroundUpY(30);
}
void dAcEKs_c::executeState_WindBlow() {
diff --git a/src/REL/d/a/e/d_a_e_remly.cpp b/src/REL/d/a/e/d_a_e_remly.cpp
index 90ad9b28..5df1fc7d 100644
--- a/src/REL/d/a/e/d_a_e_remly.cpp
+++ b/src/REL/d/a/e/d_a_e_remly.cpp
@@ -208,7 +208,7 @@ int dAcEremly_c::actorCreate() {
field_0xA50.z = mPosition.z;
mAcchCir.SetWall(mScaleF * 10.f, mScaleF * 60.f);
- mAcch.SetField_0xD4(100.f + _weird_zero);
+ mAcch.SetRoofCrrHeight(100.f + _weird_zero);
field_0xB04 = 60.f;
if (mIsHorwellsPet == 0) {
@@ -1113,7 +1113,7 @@ void dAcEremly_c::initializeState_Fly() {
mYOffset = 0.f;
mAnmStep = 0;
- mAcch.SetField_0xD4(f);
+ mAcch.SetRoofCrrHeight(f);
mVelocity.x = mVelocity.z = 0.f;
mSpeed = 0.f;
diff --git a/src/REL/d/a/e/d_a_e_sm.cpp b/src/REL/d/a/e/d_a_e_sm.cpp
index f63d96b7..af8edaca 100644
--- a/src/REL/d/a/e/d_a_e_sm.cpp
+++ b/src/REL/d/a/e/d_a_e_sm.cpp
@@ -164,7 +164,7 @@ int dAcEsm_c::actorCreate() {
mAcchCir.SetWall(mScaleTarget.y * 100.f, mScaleTarget.x * 100.f);
mStts.SetRank(10);
mObjAcch.SetGndThinCellingOff();
- mObjAcch.field_0x390 = 1;
+ mObjAcch.SetWtrChkMode(1);
mMaxSpeed = -40.f;
diff --git a/src/REL/d/a/obj/d_a_obj_tubo.cpp b/src/REL/d/a/obj/d_a_obj_tubo.cpp
index c204164b..91607903 100644
--- a/src/REL/d/a/obj/d_a_obj_tubo.cpp
+++ b/src/REL/d/a/obj/d_a_obj_tubo.cpp
@@ -320,7 +320,7 @@ void dAcOtubo_c::finalizeState_Grab() {
mSph.OnAtSet();
}
mObjAcch.ClrRoofNone();
- mObjAcch.field_0x0D4 = 50.f;
+ mObjAcch.SetRoofCrrHeight(50.f);
}
void dAcOtubo_c::initializeState_Put() {}
diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp
index 3de0f79f..1606c315 100644
--- a/src/d/a/d_a_item.cpp
+++ b/src/d/a/d_a_item.cpp
@@ -774,7 +774,7 @@ int dAcItem_c::create() {
getItemFlagStruct(getItemId())->field_0x01 * 0.5f, getItemFlagStruct(getItemId())->field_0x00 * 0.6f
);
mObjAcch.Set(this, 1, &mAcchCir);
- mObjAcch.field_0x0D4 = 50.0f;
+ mObjAcch.SetRoofCrrHeight(50.0f);
mObjAcch.SetClrSpeedY();
mObjAcch.SetField_0xC(4);
mAcceleration = -2.0f;
diff --git a/src/d/a/d_a_player.cpp b/src/d/a/d_a_player.cpp
index acffedc2..c11544aa 100644
--- a/src/d/a/d_a_player.cpp
+++ b/src/d/a/d_a_player.cpp
@@ -1,5 +1,14 @@
#include "d/a/d_a_player.h"
+#include "common.h"
+#include "d/a/d_a_base.h"
+#include "d/a/obj/d_a_obj_base.h"
+#include "d/a/obj/d_a_obj_bomb.h"
+#include "f/f_profile.h"
+#include "f/f_profile_name.h"
+
+#include <stddef.h>
+
dAcPy_c *dAcPy_c::LINK;
// TODO: Disable this pragma when the ctors are matching
@@ -8,3 +17,99 @@ dAcPy_c::dAcPy_c() {}
#pragma dont_inline reset
dAcPy_c::~dAcPy_c() {}
+
+namespace {
+bool isProfile(dAcBase_c *pActor, ProfileName profile) {
+ return pActor && pActor->mProfileName == profile;
+}
+} // namespace
+
+bool dAcPy_c::ObjectArray::insert(dAcObjBase_c *pObj) {
+ for (size_t i = 0; i < sNumObjects; ++i) {
+ if (mObjs[i].get() != pObj) {
+ continue;
+ }
+
+ if (isProfile(pObj, fProfile::BOMB)) {
+ mCounter[i] = MAX(0, static_cast<dAcBomb_c *>(pObj)->get0xA44()) + 3;
+ } else {
+ mCounter[i] = 90;
+ }
+ return true;
+ }
+
+ for (size_t i = 0; i < sNumObjects; ++i) {
+ if (mObjs[i].get() != nullptr) {
+ continue;
+ }
+
+ mObjs[i].link(pObj);
+
+ if (isProfile(pObj, fProfile::BOMB)) {
+ mCounter[i] = MAX(0, static_cast<dAcBomb_c *>(pObj)->get0xA44()) + 3;
+ } else {
+ mCounter[i] = 90;
+ }
+ return true;
+ }
+
+ return false;
+}
+
+void dAcPy_c::ObjectArray::execute() {
+ // Unlink Object as needed
+ for (int i = 0; i < sNumObjects; ++i) {
+ dAcObjBase_c *pObj = mObjs[i].get();
+ if (isProfile(pObj, fProfile::BOMB)) {
+ if (static_cast<dAcBomb_c *>(pObj)->isState(dAcBomb_c::StateID_Explode)) {
+ mObjs[i].unlink();
+ mCounter[i] = 0;
+ }
+ } else {
+ if (--mCounter[i] == 0) {
+ mObjs[i].unlink();
+ }
+ }
+ }
+
+ // Try to bubble objects left
+ // This seems buggy if multiple objects arent link consecutively
+ int lastOccupiedObject = sNumObjects;
+ for (int i = sNumObjects - 1; i >= 0; --i) {
+ // Skip Occupied objects
+ if (mObjs[i].isLinked()) {
+ lastOccupiedObject = i;
+ continue;
+ }
+
+ if (lastOccupiedObject != sNumObjects) {
+ mObjs[i].link(mObjs[lastOccupiedObject].get());
+ mCounter[i] = mCounter[lastOccupiedObject];
+ mObjs[lastOccupiedObject].unlink();
+
+ lastOccupiedObject = sNumObjects;
+ }
+ }
+}
+
+dAcObjBase_c *dAcPy_c::ObjectArray::get(s32 index) {
+ if (index >= sNumObjects) {
+ return nullptr;
+ }
+
+ return mObjs[index].get();
+}
+
+void dAcPy_c::ObjectArray::removeBombs() {
+ for (int i = 0; i < sNumObjects; ++i) {
+ dAcObjBase_c *pObj = get(i);
+ if (pObj != nullptr) {
+ if (pObj->mProfileName == fProfile::BOMB) {
+ dAcBomb_c *pBomb = static_cast<dAcBomb_c *>(pObj);
+ pBomb->deleteRequest();
+ pBomb->mEffect1.remove(true);
+ pBomb->mEffect2.remove(true);
+ }
+ }
+ }
+}
diff --git a/src/d/a/obj/d_a_obj_boomerang.cpp b/src/d/a/obj/d_a_obj_boomerang.cpp
index fa901893..e1bb4ab2 100644
--- a/src/d/a/obj/d_a_obj_boomerang.cpp
+++ b/src/d/a/obj/d_a_obj_boomerang.cpp
@@ -184,7 +184,7 @@ int dAcBoomerang_c::create() {
mAcch.Set(this, 1, &mAcchCir);
mAcch.SetGroundUpY(20.f);
- mAcch.SetField_0xD4(30.f);
+ mAcch.SetRoofCrrHeight(30.f);
mAcch.ClrRoofNone();
mAcch.SetBeetle();
mAcch.OnWaterGrp();
diff --git a/src/d/col/bg/d_bg_s_acch.cpp b/src/d/col/bg/d_bg_s_acch.cpp
index 63242f60..0746b8ae 100644
--- a/src/d/col/bg/d_bg_s_acch.cpp
+++ b/src/d/col/bg/d_bg_s_acch.cpp
@@ -53,19 +53,19 @@ dBgS_Acch::dBgS_Acch()
field_0x0A8(0.0f),
field_0x0AC(0.0f),
mGroundHeight(-1e9f),
- field_0x0B4(120.0f),
+ mGndChkOffset(120.0f),
field_0x0C8(0.0f),
field_0x0CC(0.0f),
mRoofHeight(1e9f),
- field_0x0D4(1.0f),
+ mRoofCrrHeight(1.0f),
field_0x0D8(0.0f),
mpOutPolyInfo(nullptr),
mRoofH_0x0E0(0.0f),
mGroundH_0x0E4(0.0f),
field_0x0E8(1e9f),
field_0x1D0(-1.0f),
- field_0x2F4(1000.0f),
- field_0x390(0),
+ mWtrCheckOffset(1000.0f),
+ mWtrMode(0),
field_0x394(0) {
SetPolyPassChk(GetPolyPassChkInfo());
SetGrpPassChk(GetGrpPassChkInfo());
@@ -159,7 +159,7 @@ void dBgS_Acch::GroundCheck(dBgS &bgs, bool param2) {
mVec3_c gnd_pos = *GetPos();
// This Ordering is weird
- f32 temp = (field_0x0B4 - field_0x0A8) + field_0x0AC;
+ f32 temp = (mGndChkOffset - field_0x0A8) + field_0x0AC;
if (mFlags & ACCH_FLAG_0x20000) {
if (temp <= 1.1f) {
temp = 1.1f;
@@ -199,7 +199,7 @@ void dBgS_Acch::GroundCheck(dBgS &bgs, bool param2) {
}
if (gnd_pos.y < mpPos->y + field_0x0E8 &&
- mpPos->y + field_0x0E8 < (field_0x0B4 - field_0x0A8) + field_0x0AC + mpPos->y) {
+ mpPos->y + field_0x0E8 < (mGndChkOffset - field_0x0A8) + field_0x0AC + mpPos->y) {
gnd_pos.y = mpPos->y + field_0x0E8;
}
@@ -277,11 +277,11 @@ void dBgS_Acch::GroundRoofProc(dBgS &bgs, bool param2) {
mRoofHeight = bgs.RoofChk(&mRoof);
if (mRoofHeight != 1e9f) {
- if (mpPos->y + field_0x0D4 > mRoofHeight) {
- field_0x0D8 = mRoofHeight - field_0x0D4;
+ if (mpPos->y + mRoofCrrHeight > mRoofHeight) {
+ field_0x0D8 = mRoofHeight - mRoofCrrHeight;
SetRoofHit();
- } else if (field_0x0C8 + field_0x0D4 > mRoofHeight) {
- field_0x0D8 = mRoofHeight - field_0x0D4;
+ } else if (field_0x0C8 + mRoofCrrHeight > mRoofHeight) {
+ field_0x0D8 = mRoofHeight - mRoofCrrHeight;
SetRoofHit();
}
}
@@ -414,8 +414,8 @@ void dBgS_Acch::SphCheck() {
if (height > field_0x0A8 && field_0x0A8 > 0.0f) {
height = field_0x0A8;
}
- if (height > field_0x0D4 && field_0x0D4 > 1.0f) {
- height = field_0x0D4;
+ if (height > mRoofCrrHeight && mRoofCrrHeight > 1.0f) {
+ height = mRoofCrrHeight;
}
height *= 0.8f;
}