From 600cefbc7dd1e00772c591be90a86f4567d2ab43 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 20 Sep 2026 11:53:53 -0400 Subject: [PATCH] unrelated Bomb Changes --- config/SOUE01/symbols.txt | 6 +- include/d/a/d_a_player.h | 26 +++++++- include/d/a/e/d_a_en_base.h | 1 + include/d/a/obj/d_a_obj_base.h | 3 - include/d/col/bg/d_bg_pc.h | 1 + include/d/col/bg/d_bg_s_acch.h | 21 ++++-- include/d/col/c/c_cc_d.h | 17 +++++ include/d/col/c/c_m3d_g_pla.h | 7 +- include/d/col/cc/d_cc_s.h | 3 + include/d/d_linkage.h | 27 ++++++-- include/d/d_player_act.h | 7 +- include/s/s_State.hpp | 10 +++ src/REL/d/a/e/d_a_e_ks.cpp | 14 ++-- src/REL/d/a/e/d_a_e_remly.cpp | 4 +- src/REL/d/a/e/d_a_e_sm.cpp | 2 +- src/REL/d/a/obj/d_a_obj_tubo.cpp | 2 +- src/d/a/d_a_item.cpp | 2 +- src/d/a/d_a_player.cpp | 105 ++++++++++++++++++++++++++++++ src/d/a/obj/d_a_obj_boomerang.cpp | 2 +- src/d/col/bg/d_bg_s_acch.cpp | 24 +++---- 20 files changed, 235 insertions(+), 49 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index d616b4be..441cea25 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2507,7 +2507,7 @@ isBottleOut__17daPlayerActBase_cFv = .text:0x8005C640; // type:function size:0x8 isHealingShield__17daPlayerActBase_cFv = .text:0x8005C650; // type:function size:0x8 isDrinkingPotion__17daPlayerActBase_cFv = .text:0x8005C660; // type:function size:0x8 isRecovering__17daPlayerActBase_cCFv = .text:0x8005C670; // type:function size:0x8 -lookTowardItem__17daPlayerActBase_cFv = .text:0x8005C680; // type:function size:0x4 +lookTowardItem__17daPlayerActBase_cFRC7mVec3_cUl4mAngfff = .text:0x8005C680; // type:function size:0x4 isRunningUpWall__17daPlayerActBase_cFv = .text:0x8005C690; // type:function size:0x8 doGameOver__17daPlayerActBase_cFv = .text:0x8005C6A0; // type:function size:0x4 getDieLargeDamageDir__17daPlayerActBase_cFv = .text:0x8005C6B0; // type:function size:0x8 @@ -2561,7 +2561,7 @@ ifHasHealthAndSomethingElse__17daPlayerActBase_cFv = .text:0x8005C9A0; // type:f unlinkActorRef1__17daPlayerActBase_cFv = .text:0x8005C9B0; // type:function size:0x4 doesActorRef1Exist__17daPlayerActBase_cFv = .text:0x8005C9C0; // type:function size:0x8 getActorInActorRef1__17daPlayerActBase_cFv = .text:0x8005C9D0; // type:function size:0x8 -vt_0x1BC__17daPlayerActBase_cFv = .text:0x8005C9E0; // type:function size:0x8 +getBeetleHeldActor__17daPlayerActBase_cFv = .text:0x8005C9E0; // type:function size:0x8 canHandleGameOver__17daPlayerActBase_cFv = .text:0x8005C9F0; // type:function size:0x4 isByte0x434eEqual7__17daPlayerActBase_cFv = .text:0x8005CA00; // type:function size:0x8 isItemFairyFromBugnet__17daPlayerActBase_cFv = .text:0x8005CA10; // type:function size:0x8 @@ -12361,7 +12361,7 @@ fn_80202270 = .text:0x80202270; // type:function size:0x170 ActorLink__pushingLog = .text:0x802023E0; // type:function size:0x12C fn_80202510 = .text:0x80202510; // type:function size:0x1A8 ActorLink__logPushed = .text:0x802026C0; // type:function size:0x298 -isObjectFromBeetle = .text:0x80202960; // type:function size:0x13C +insert__Q27dAcPy_c11ObjectArrayFP12dAcObjBase_c = .text:0x80202960; // type:function size:0x13C fn_80202AA0 = .text:0x80202AA0; // type:function size:0x13C fn_80202BE0 = .text:0x80202BE0; // type:function size:0x10 ActorLink__checkBeetleActorReferenceAtIndex = .text:0x80202BF0; // type:function size:0x20 diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index e5e6669c..a768c823 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -4,6 +4,7 @@ #include "common.h" #include "d/a/d_a_base.h" #include "d/a/d_a_item.h" +#include "d/a/obj/d_a_obj_base.h" #include "d/col/c/c_bg_s_poly_info.h" #include "d/d_player_mdl.h" #include "m/m_angle.h" @@ -32,8 +33,22 @@ public: /* vt 0x314 */ virtual void vt_0x314(); /* vt 0x318 */ virtual void vt_0x318(); + struct ObjectArray { + static const size_t sNumObjects = 16; + + bool insert(dAcObjBase_c *); + void execute(); + dAcObjBase_c *get(s32 index); + void removeBombs(); + + dAcObjRef_c mObjs[sNumObjects]; + u32 mCounter[sNumObjects]; + }; + protected: - /* 0x137C */ u8 _0x137C[0x16F0 - 0x137C]; + /* 0x137C */ ObjectArray mOwnedObjects; + /* 0x147C */ ObjectArray mOwnedProjectiles; + /* 0x157C */ u8 _0x157C[0x16F0 - 0x157C]; /* 0x16F0 */ nw4r::g3d::ResFile mHeldResFile; /* 0x16F4 */ u8 _0x16F4[0x4564 - 0x16F4]; /* 0x4564 */ f32 field_0x4564; @@ -58,6 +73,7 @@ public: void setBeetleFlashClr(const mColor &); void setBeetleBackAnim(); s32 getBeetleWarningTimeLeft(); + void setBeetleReleasedObject(dAcObjBase_c *pObj); // Item select/equip/use functions [0x801E3160 - 0x801E7AD0] ? static s32 calcItemWheelSelection(bool reset, s32 numOptions); @@ -117,6 +133,14 @@ public: return LINK2; } + static bool insertOwnedObject(dAcObjBase_c *pObj) { + return LINK2->mOwnedObjects.insert(pObj); + } + + ObjectArray &getOwnedObjects() { + return mOwnedObjects; + } + void onShieldUpdate(); static dAcPy_c *LINK; diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h index adbc1d0c..1c1382e8 100644 --- a/include/d/a/e/d_a_en_base.h +++ b/include/d/a/e/d_a_en_base.h @@ -86,6 +86,7 @@ public: bool fn_80030570(m3d::mdl_c &, u8, f32); // lighting related void fn_800306D0(); void fn_80030700(); + static void fn_800307E0(mVec3_c *pPos, s32); dAcObjBase_c *targetPlayerOrScrapper(f32 biasToScrapper); static void fn_80030980(m3d::mdl_c &, s32, bool markDirty); diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index fab81e6d..1d8eff2e 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -1,7 +1,6 @@ #ifndef D_A_OBJ_BASE_H #define D_A_OBJ_BASE_H -#include "c/c_math.h" #include "common.h" #include "d/a/d_a_base.h" #include "d/a/d_a_salbage_if.h" @@ -14,11 +13,9 @@ #include "m/m3d/m_shadow.h" #include "m/m3d/m_smdl.h" #include "m/m_angle.h" -#include "m/m_color.h" #include "m/m_mtx.h" #include "m/m_vec.h" #include "m/types_m.h" -#include "nw4r/math/math_arithmetic.h" // Ghidra: ActorObjectBase // size: 0x330 diff --git a/include/d/col/bg/d_bg_pc.h b/include/d/col/bg/d_bg_pc.h index e3b05ced..a5845962 100644 --- a/include/d/col/bg/d_bg_pc.h +++ b/include/d/col/bg/d_bg_pc.h @@ -61,6 +61,7 @@ enum dBgPc_Attribute { POLY_ATTR_DAMAGE = 13, POLY_ATTR_SLOPE_RUN = 15, POLY_ATTR_SAND_DEEP_SLOW = 16, + POLY_ATTR_CURSED_WATER = 17, }; class dBgPc { public: diff --git a/include/d/col/bg/d_bg_s_acch.h b/include/d/col/bg/d_bg_s_acch.h index 6756420f..6eb05d22 100644 --- a/include/d/col/bg/d_bg_s_acch.h +++ b/include/d/col/bg/d_bg_s_acch.h @@ -532,8 +532,17 @@ public: return mRoof; } - void SetField_0xD4(f32 v) { - field_0x0D4 = v; + void SetGndChkOffset(f32 v) { + mGndChkOffset = v; + } + void SetRoofCrrHeight(f32 v) { + mRoofCrrHeight = v; + } + void SetWaterCheckOffset(f32 v) { + mWtrCheckOffset = v; + } + void SetWtrChkMode(u8 v) { + mWtrMode = v; } public: @@ -555,12 +564,12 @@ public: /* 0x0A8 */ f32 field_0x0A8; /* 0x0AC */ f32 field_0x0AC; /* 0x0B0 */ f32 mGroundHeight; - /* 0x0B4 */ f32 field_0x0B4; + /* 0x0B4 */ f32 mGndChkOffset; /* 0x0B8 */ cM3dGPla mPlane_0x0B8; /* 0x0C8 */ f32 field_0x0C8; /* 0x0CC */ f32 field_0x0CC; /* 0x0D0 */ f32 mRoofHeight; - /* 0x0D4 */ f32 field_0x0D4; + /* 0x0D4 */ f32 mRoofCrrHeight; /* 0x0D8 */ f32 field_0x0D8; /* 0x0DC */ cBgS_PolyInfo *mpOutPolyInfo; /* 0x0E0 */ f32 mRoofH_0x0E0; @@ -572,9 +581,9 @@ public: /* 0x1D0 */ f32 field_0x1D0; /* 0x1D4 */ dBgS_GndChk mGnd; /* 0x264 */ dBgS_RoofChk mRoof; - /* 0x2F4 */ f32 field_0x2F4; + /* 0x2F4 */ f32 mWtrCheckOffset; /* 0x2F8 */ dBgS_WtrChk mWtr; - /* 0x390 */ u8 field_0x390; + /* 0x390 */ u8 mWtrMode; /* 0x394 */ s32 field_0x394; /* 0x398 */ mVec3_c field_0x398; /* 0x3A4 */ mVec3_c field_0x3A4; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index fa5fec03..a6165353 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -526,6 +526,9 @@ public: void SetSrcModifer(u32 modifier) { mSrc.mInfo.mModifier = modifier; } + u32 GetSrcModifer() const { + return mSrc.mInfo.mModifier; + } void OnSrcModifer(u32 m) { mSrc.mInfo.mModifier |= m; } @@ -949,6 +952,10 @@ public: mAt.SetCallback(cb); } + void SetTgCallback(cCcD_HitCallback cb) { + mTg.SetCallback(cb); + } + void SetCoCallback(cCcD_HitCallback cb) { mCo.SetCallback(cb); } @@ -1006,6 +1013,13 @@ public: void OnAt_0x4000() { mAt.OnSPrm(0x4000); } + // Related to Beetle (no hook) + u32 ChkAt_0x4000() { + return mAt.MskSPrm(0x4000); + } + u32 GetAtSrcModifier() const { + return mAt.GetSrcModifer(); + } void SetAtInfo_0x0(u8 amount) { @@ -1115,6 +1129,9 @@ public: void ClrCo_0x400() { mCo.OffSPrm(0x400); } + u32 ChkCo_0x8000() { + return mCo.MskSPrm(0x8000); + } void OnCo_0x8000() { mCo.OnSPrm(0x8000); } diff --git a/include/d/col/c/c_m3d_g_pla.h b/include/d/col/c/c_m3d_g_pla.h index 2e178d45..9fdf5ffb 100644 --- a/include/d/col/c/c_m3d_g_pla.h +++ b/include/d/col/c/c_m3d_g_pla.h @@ -5,6 +5,7 @@ #include "d/col/c/c_m3d.h" #include "m/m_angle.h" #include "m/m_vec.h" +#include "nw4r/math/math_types.h" #include "rvl/MTX/vec.h" // Plane with a normal @@ -29,8 +30,12 @@ public: mD = -VECDotProduct(mNormal, point); } + void SetupNP(const mVec3_c &normal, const mVec3_c &point) { + mNormal = normal; + mD = -nw4r::math::VEC3Dot(mNormal, point); + } + // Unused - // void SetupNP(const mVec3_c &, const mVec3_c &); // bool getCrossY(const mVec3_c &, f32 *) const; // void Set(const cM3dGPla *); diff --git a/include/d/col/cc/d_cc_s.h b/include/d/col/cc/d_cc_s.h index 65b6d518..ae0f4945 100644 --- a/include/d/col/cc/d_cc_s.h +++ b/include/d/col/cc/d_cc_s.h @@ -41,6 +41,9 @@ public: dCcMassS_Mng &GetMassMng() { return mMassMng; } + void SetMass(cCcD_Obj *p_obj, u8 priority) { + mMassMng.SetObj(p_obj, priority); + } void Ct(); void Dt(); diff --git a/include/d/d_linkage.h b/include/d/d_linkage.h index 2739ab49..9cf24418 100644 --- a/include/d/d_linkage.h +++ b/include/d/d_linkage.h @@ -19,15 +19,15 @@ public: public: enum ConnectionType_e { CONNECTION_0 = 0, - CONNECTION_1 = 1, + CONNECTION_1 = 1, // Standard CONNECTION_2 = 2, CONNECTION_3 = 3, - CONNECTION_4 = 4, - CONNECTION_5 = 5, - CONNECTION_6 = 6, - CONNECTION_7 = 7, - CONNECTION_8 = 8, - CONNECTION_9 = 9, + CONNECTION_4 = 4, // clawshot + CONNECTION_5 = 5, // Beetle + CONNECTION_6 = 6, // From Sword Swing? + CONNECTION_7 = 7, // Whip + CONNECTION_8 = 8, // Arrow/Heartf + CONNECTION_9 = 9, // Chandelier/lotus flower }; enum State_e { STATE_0 = 0, @@ -87,6 +87,19 @@ public: return field_0xA0->getArrowOffsetPosAndAngle(param_1, param_2, param_3, param_4, param_5); } + dAcBase_c *getControllingActor() { + return static_cast(mControllingActor.p_owner); + } + + void setField_0x8C_0x90(f32 f0, f32 f1) { + field_0x8C = f0; + field_0x90 = f1; + } + void setField_0x94_0x98(f32 f0, f32 f1) { + field_0x94 = f0; + field_0x98 = f1; + } + public: void set(u32 flags, f32, f32, f32, void *unk); bool tryAttach(dAcObjBase_c *, dAcObjBase_c *, dAcRefBase_c *, ConnectionType_e, bool); diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h index a9a9a2b3..0ddaaedf 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -2,10 +2,11 @@ #define D_A_PLAYER_ACT_H #include "d/a/d_a_base.h" -#include "d/a/obj/d_a_obj_bomb.h" +#include "d/a/obj/d_a_obj_base.h" #include "d/d_player_base.h" #include "m/m_vec.h" + class dAcEnBase_c; class dAcOFairy_c; @@ -247,7 +248,7 @@ public: return false; } /* vt 0x1B8 */ virtual void canHandleGameOver() {} - /* vt 0x1BC */ virtual UNKWORD vt_0x1BC() { + /* vt 0x1BC */ virtual dAcObjBase_c *getBeetleHeldActor() { return 0; } @@ -414,7 +415,7 @@ public: /* vt 0x2A4 */ virtual bool isRunningUpWall() { return false; } - /* vt 0x2A8 */ virtual void lookTowardItem() {} + /* vt 0x2A8 */ virtual void lookTowardItem(const mVec3_c &, u32, mAng, f32, f32, f32) {} /* vt 0x2AC */ virtual void vt_0x2AC() {} /* vt 0x2B0 */ virtual void vt_0x2B0() {} /* vt 0x2B4 */ virtual void triggerMoveEventMaybe(u32, u32, u32, const mVec3_c *, const mAng &, u32, u32) {} diff --git a/include/s/s_State.hpp b/include/s/s_State.hpp index 807a1bd9..fb8ab775 100644 --- a/include/s/s_State.hpp +++ b/include/s/s_State.hpp @@ -48,11 +48,21 @@ return *mStateMgr.getStateID() == value; \ } +#define STATE_MGR_DEFINE_UTIL_GETSTATEID(class_name) \ + const sFStateID_c &getStateID() const { \ + return (sFStateID_c &)*mStateMgr.getStateID(); \ + } + #define STATE_MGR_DEFINE_UTIL_GETOLDSTATEID(class_name) \ const sFStateID_c &getOldStateID() const { \ return (sFStateID_c &)*mStateMgr.getOldStateID(); \ } +#define STATE_MGR_DEFINE_UTIL_GETNEWSTATEID(class_name) \ + const sFStateID_c &getNewStateID() const { \ + return (sFStateID_c &)*mStateMgr.getNewStateID(); \ + } + // Use this when you need need sFStateID_c vtables to appear in a different order #define STATE_MGR_DEFINE_UTIL_INSTANCIATE_STATE(class_name) \ bool dummy_need_state_instanciation(const sFStateID_c &value) const { \ 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 + 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(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(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(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(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; }