From 73cdc25674ada89d56445eb2fb4d090077bf371d Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 21 Sep 2026 21:25:05 -0400 Subject: [PATCH] dAcBomb_c renamings --- config/SOUE01/symbols.txt | 6 +- include/d/a/d_a_player.h | 4 +- include/d/a/obj/d_a_obj_bomb.h | 76 ++--- include/d/d_player_act.h | 4 + src/REL/d/a/d_a_bombf.cpp | 4 +- src/REL/d/a/e/d_a_e_sm.cpp | 4 +- src/REL/d/t/d_t_action.cpp | 2 +- src/d/a/obj/d_a_obj_bomb.cpp | 540 +++++++++++++++++---------------- 8 files changed, 325 insertions(+), 315 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 4f9c2e7a..d9d65341 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -12375,8 +12375,8 @@ getBombUnknown1_1__7dAcPy_cFv = .text:0x80202CF0; // type:function size:0x8 getBombAcceleration__7dAcPy_cFv = .text:0x80202D00; // type:function size:0x8 getBombMaxSpeed__7dAcPy_cFv = .text:0x80202D10; // type:function size:0x8 getBombBounceSpeed__7dAcPy_cFv = .text:0x80202D20; // type:function size:0x8 -getBombUnkFloat_0__7dAcPy_cFv = .text:0x80202D30; // type:function size:0x8 -getBombUnkFloat_1__7dAcPy_cFv = .text:0x80202D40; // type:function size:0x8 +getBombStopSpeedY__7dAcPy_cFv = .text:0x80202D30; // type:function size:0x8 +getBombMaxSpeedY__7dAcPy_cFv = .text:0x80202D40; // type:function size:0x8 getBombParticleScale__7dAcPy_cFv = .text:0x80202D50; // type:function size:0x8 getBombExplodeRadius__7dAcPy_cFv = .text:0x80202D60; // type:function size:0x8 getBombAcceleration_1__7dAcPy_cFv = .text:0x80202D70; // type:function size:0x8 @@ -13992,7 +13992,7 @@ setTransformFromFlower__9dAcBomb_cFRC6mMtx_c = .text:0x80259F90; // type:functio setPickupTarget__9dAcBomb_cFv = .text:0x8025A0E0; // type:function size:0x20 lookAt__9dAcBomb_cFv = .text:0x8025A100; // type:function size:0x50 bounceWall__9dAcBomb_cF4mAng = .text:0x8025A150; // type:function size:0x94 -fn_8025A1F0__9dAcBomb_cFR7mVec3_c = .text:0x8025A1F0; // type:function size:0x1CC +getVelocity__9dAcBomb_cFR7mVec3_c = .text:0x8025A1F0; // type:function size:0x1CC initializeState_Explode__9dAcBomb_cFv = .text:0x8025A3C0; // type:function size:0x690 getOldStateID__77sStateMgr_c<9dAcBomb_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8025AA50; // type:function size:0x10 executeState_Explode__9dAcBomb_cFv = .text:0x8025AA60; // type:function size:0x68 diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index efee6641..69849bc9 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -68,8 +68,8 @@ public: static f32 getBombBounceSpeed(); static f32 getBombParticleScale(); static f32 getBombExplodeRadius(); - static f32 getBombUnkFloat_0(); - static f32 getBombUnkFloat_1(); + static f32 getBombStopSpeedY(); + static f32 getBombMaxSpeedY(); // Beetle Functions [0x8021AA70 - 0x8021BE20] s16 getBeetleFlightTime(); diff --git a/include/d/a/obj/d_a_obj_bomb.h b/include/d/a/obj/d_a_obj_bomb.h index b93a8157..bba6e2e6 100644 --- a/include/d/a/obj/d_a_obj_bomb.h +++ b/include/d/a/obj/d_a_obj_bomb.h @@ -23,45 +23,45 @@ public: enum Type_e { BOMB_0 = 0, // Explode - BOMB_1 = 1, // Flower - BOMB_2 = 2, // Flower - BOMB_3 = 3, // Carry - BOMB_4 = 4, // Explode - BOMB_5 = 5, // Flower - BOMB_6 = 6, // Explode - BOMB_7 = 7, // Carry + BOMBF = 1, + BOMBF_CRAWLSPACE = 2, + BOMB_PLAYER_CARRY = 3, // Carry + BOMB_4 = 4, // Explode + BOMB_5 = 5, // Flower + BOMB_EXPLODE_NO_DAMAGE = 6, + BOMB_BOCO_CARRY = 7, BOMB_MAX, }; enum Flag_e { - FLAG_0x1 = (1 << 0), // Player Make - FLAG_0x2 = (1 << 1), - FLAG_0x4 = (1 << 2), // Bomb Hit ? + FLAG_PLAYER_MAKE = (1 << 0), + FLAG_CHAIN_BOMB = (1 << 1), // When another bomb blows another bomb up + FLAG_BOMB_HIT = (1 << 2), FLAG_0x8 = (1 << 3), FLAG_0x10 = (1 << 4), - FLAG_0x20 = (1 << 5), // Underwater? + FLAG_UNDERWATER = (1 << 5), FLAG_0x40 = (1 << 6), FLAG_0x80 = (1 << 7), FLAG_0x100 = (1 << 8), - FLAG_0x200 = (1 << 9), + FLAG_NEAR_TIMEDOOR = (1 << 9), FLAG_0x400 = (1 << 10), - FLAG_0x800 = (1 << 11), - FLAG_0x1000 = (1 << 12), + FLAG_FALL_IN_WATER = (1 << 11), + FLAG_DELETE_BOMB = (1 << 12), FLAG_0x2000 = (1 << 13), FLAG_0x4000 = (1 << 14), FLAG_0x8000 = (1 << 15), FLAG_0x10000 = (1 << 16), FLAG_0x20000 = (1 << 17), - FLAG_0x40000 = (1 << 18), + FLAG_ROLL = (1 << 18), FLAG_0x80000 = (1 << 19), FLAG_0x100000 = (1 << 20), FLAG_0x200000 = (1 << 21), FLAG_0x400000 = (1 << 22), - FLAG_0x800000 = (1 << 23), - FLAG_0x1000000 = (1 << 24), - FLAG_0x2000000 = (1 << 25), + FLAG_FUSE_PAUSED = (1 << 23), // Like in cutscenes + FLAG_FLOWER = (1 << 24), + FLAG_BEETLE_CARRY = (1 << 25), FLAG_0x4000000 = (1 << 26), - FLAG_0x8000000 = (1 << 27), + FLAG_BOKO_CARRY = (1 << 27), FLAG_0x10000000 = (1 << 28), FLAG_0x20000000 = (1 << 29), FLAG_0x40000000 = (1 << 30), @@ -103,7 +103,7 @@ public: bool checkExplode(); void lookAt(); void bounceWall(mAng angle); - void fn_8025A1F0(mVec3_c &out); + void getVelocity(mVec3_c &out); void setBombColor(); void rollTo(const mVec3_c &dir); void rollToInternal(const mVec3_c &dir); @@ -111,14 +111,14 @@ public: s16 getFuseTimer() const { return mFuseTime; } - bool check0xA3C(u32 mask) const { - return (field_0xA3C & mask); + bool checkFlag(u32 mask) const { + return (mFlag & mask); } - void unset0xA3C(u32 mask) { - field_0xA3C &= ~mask; + void unsetFlag(u32 mask) { + mFlag &= ~mask; } - void set0xA3C(u32 mask) { - field_0xA3C |= mask; + void setFlag(u32 mask) { + mFlag |= mask; } u32 getBombType() const { @@ -141,22 +141,22 @@ public: /* 0x9A8 */ dAcObjRef_unk mUnkRef; /* 0x9D4 */ dEmitter_c mEffect1; /* 0xA08 */ dEmitter_c mEffect2; - /* 0xA3C */ u32 field_0xA3C; - /* 0xA40 */ u8 field_0xA40; + /* 0xA3C */ u32 mFlag; + /* 0xA40 */ u8 mRollFrameTimer; // Set to `60` upon roll - Uses additional force to roll bomb /* 0xA41 */ u8 mMainMatID; /* 0xA42 */ u8 field_0xA42; /* 0xA44 */ s16 mFuseTime; - /* 0xA46 */ u16 field_0xA46; - /* 0xA48 */ mAng field_0xA48; - /* 0xA4A */ mAng mBombRotationY; - /* 0xA4C */ f32 mBombSpeed; + /* 0xA46 */ u16 mCarryTimer; + /* 0xA48 */ mAng mGndAngle; + /* 0xA4A */ mAng mRollRotationY; + /* 0xA4C */ f32 mRollSpeed; /* 0xA50 */ f32 field_0xA50; - /* 0xA54 */ mVec3_c field_0xA54; - /* 0xA60 */ mVec3_c field_0xA60; - /* 0xA6C */ mVec3_c field_0xA6C; - /* 0xA78 */ mVec3_c field_0xA78; - /* 0xA84 */ mVec3_c field_0xA84; - /* 0xA90 */ mVec3_c field_0xA90; + /* 0xA54 */ mVec3_c mSmokePosNext; + /* 0xA60 */ mVec3_c mSmokePosPrev; + /* 0xA6C */ mVec3_c mSmokePos; + /* 0xA78 */ mVec3_c mExternalTranslation; + /* 0xA84 */ mVec3_c mHitForce; + /* 0xA90 */ mVec3_c mStreamForce; /* 0xA9C */ STATE_MGR_DECLARE(dAcBomb_c); }; diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h index fdcfb671..4c1e77a2 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -551,6 +551,10 @@ public: FLG0_HANGING_ITEM | FLG0_HANGING_LEDGE | FLG0_UNK_0x10 | FLG0_IN_AIR, }; + enum dAcPy_FLG1 { + ActFLG1_INCRAWLSPACE = 0x400000 + }; + inline bool checkFlags0x340(u32 mask) const { return (someFlags_0x340 & mask) != 0; } diff --git a/src/REL/d/a/d_a_bombf.cpp b/src/REL/d/a/d_a_bombf.cpp index 8ad94510..14d84eaa 100644 --- a/src/REL/d/a/d_a_bombf.cpp +++ b/src/REL/d/a/d_a_bombf.cpp @@ -144,9 +144,9 @@ void dAcBombf_c::regrowBomb() { // These params are hell s8 viewclip_idx = checkActorProperty(dAcBase_c::AC_PROP_0x1) ? mViewClipIdx : -1; u32 actorParams1; - actorParams1 = 1; + actorParams1 = dAcBomb_c::BOMBF; if (field_0x3D0) { - actorParams1 = 2; + actorParams1 = dAcBomb_c::BOMBF_CRAWLSPACE; } dAcObjBase_c *ac = dAcObjBase_c::create( "Bomb", mRoomID, actorParams1, &mPosition, nullptr, nullptr, 0xFFFFFFFF, 0xFFFF, viewclip_idx 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 b3f7f47e..e7d89d7d 100644 --- a/src/REL/d/a/e/d_a_e_sm.cpp +++ b/src/REL/d/a/e/d_a_e_sm.cpp @@ -1093,8 +1093,8 @@ bool dAcEsm_c::fn_187_4B50() { if (mBombRef.isLinked()) { dAcBomb_c *pBomb = mBombRef.get(); if (pBomb) { - pBomb->set0xA3C(0x4); - pBomb->unset0xA3C(0x800000); + pBomb->setFlag(dAcBomb_c::FLAG_BOMB_HIT); + pBomb->unsetFlag(dAcBomb_c::FLAG_FUSE_PAUSED); mBombRef.unlink(); } diff --git a/src/REL/d/t/d_t_action.cpp b/src/REL/d/t/d_t_action.cpp index d2d269db..5ea4bf52 100644 --- a/src/REL/d/t/d_t_action.cpp +++ b/src/REL/d/t/d_t_action.cpp @@ -52,7 +52,7 @@ int dTgAction_c::actorExecute() { } if (pObj->mProfileName == fProfile::BOMB) { if (checkAreaBox(mActiveMtx, pObj->getPosition())) { - reinterpret_cast(pObj)->set0xA3C(0x20000000); + reinterpret_cast(pObj)->setFlag(dAcBomb_c::FLAG_0x20000000); } } } diff --git a/src/d/a/obj/d_a_obj_bomb.cpp b/src/d/a/obj/d_a_obj_bomb.cpp index 0e7f7148..e786e0f8 100644 --- a/src/d/a/obj/d_a_obj_bomb.cpp +++ b/src/d/a/obj/d_a_obj_bomb.cpp @@ -52,7 +52,7 @@ inline T MyClamp(T value, T min, T max) { SPECIAL_ACTOR_PROFILE(BOMB, dAcBomb_c, fProfile::BOMB, 0x128, 0, 2); -static const Vec vec_fn_80259E80 = {0, 60, 0}; +static const Vec sSmokeOffset = {0, 60, 0}; struct dAcBomc_HIO_c { static const f32 getBBoxX() { @@ -77,7 +77,6 @@ struct dAcBomc_HIO_c { return mVec3_c(bbox_x, bbox_y, bbox_x); } static const f32 bbox_x, bbox_y, bbox_z; - static const f32 bbox_min_y; }; static dAcBomc_HIO_c sHIO = {}; @@ -106,7 +105,7 @@ void dAcBomb_c::coHitCallback(cCcD_Obj *i_objInfB) { return; } - set0xA3C(FLAG_0x4); + setFlag(dAcBomb_c::FLAG_BOMB_HIT); setActorProperty(AC_PROP_0x4); } @@ -120,10 +119,10 @@ void dAcBomb_c::tgHitCallback(dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfA, cCcD_ if ((i_objInfB->ChkAtType(AT_TYPE_WIND | AT_TYPE_BELLOWS) && i_objInfB->GetAtSrcModifier() == AT_MOD_WIND) && !(i_actorB && (i_actorB->mProfileName == fProfile::OBJ_WIND || i_actorB->mProfileName == fProfile::OBJ_TORNADO))) { - if (!getLinkage().checkState(dLinkage_c::STATE_ACTIVE) && !check0xA3C(FLAG_0x4)) { + if (!getLinkage().checkState(dLinkage_c::STATE_ACTIVE) && !checkFlag(dAcBomb_c::FLAG_BOMB_HIT)) { if (!(isState(StateID_FlowerWait) || isState(StateID_Explode))) { - cLib::addCalcPosXZ(&field_0xA84, i_objInfA->GetTgAtHitDir() * 0.5f, 0.5f, 10.f, 1.f); - set0xA3C(FLAG_0x8000); + cLib::addCalcPosXZ(&mHitForce, i_objInfA->GetTgAtHitDir() * 0.5f, 0.5f, 10.f, 1.f); + setFlag(dAcBomb_c::FLAG_0x8000); } } } else if (!i_objInfB->ChkAtType(AT_TYPE_0x40 | AT_TYPE_WIND | AT_TYPE_WHIP | AT_TYPE_BEETLE) || @@ -142,21 +141,21 @@ void dAcBomb_c::tgHitCallback(dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfA, cCcD_ } else if (i_objInfB->ChkAtType( AT_TYPE_SWORD | AT_TYPE_0x40 | AT_TYPE_SLINGSHOT | AT_TYPE_0x20000 | AT_TYPE_BEETLE ) && - check0xA3C(FLAG_0x1000000 | FLAG_0x400000)) { - unset0xA3C(FLAG_0x1000000); - set0xA3C(FLAG_0x400000); + checkFlag(dAcBomb_c::FLAG_FLOWER | dAcBomb_c::FLAG_0x400000)) { + unsetFlag(dAcBomb_c::FLAG_FLOWER); + setFlag(dAcBomb_c::FLAG_0x400000); unsetActorProperty(AC_PROP_0x1); if (isState(StateID_FlowerWait)) { dAcPy_c::insertOwnedObject(this); } - if (!check0xA3C(FLAG_0x100) && i_objInfB->ChkAtType(AT_TYPE_SWORD)) { - set0xA3C(FLAG_0x100); + if (!checkFlag(dAcBomb_c::FLAG_0x100) && i_objInfB->ChkAtType(AT_TYPE_SWORD)) { + setFlag(dAcBomb_c::FLAG_0x100); } } else { - set0xA3C(FLAG_0x4); + setFlag(dAcBomb_c::FLAG_BOMB_HIT); setActorProperty(AC_PROP_0x4); if (i_objInfB->ChkAtType(AT_TYPE_BOMB)) { - set0xA3C(FLAG_0x2); + setFlag(dAcBomb_c::FLAG_CHAIN_BOMB); } } } @@ -178,7 +177,7 @@ bool dAcBomb_c::createHeap() { mMainMatID = m3d::getMatID(mdl, "m_Main"); - if (getBombType() == BOMB_2) { + if (getBombType() == BOMBF_CRAWLSPACE) { mMdl.setPriorityDraw(0x82, 0x7F); } return result; @@ -199,7 +198,7 @@ int dAcBomb_c::create() { mAcchCir.SetWall(30.f, 30.f); - if (getBombType() == BOMB_2) { + if (getBombType() == BOMBF_CRAWLSPACE) { mStts.SetRank(4); } else { mStts.SetRank(5); @@ -230,26 +229,26 @@ int dAcBomb_c::create() { switch (getBombType()) { case BOMB_0: case BOMB_4: - case BOMB_6: { + case BOMB_EXPLODE_NO_DAMAGE: { changeState(StateID_Explode); } break; - case BOMB_3: { - set0xA3C(FLAG_0x200000); - set0xA3C(FLAG_0x1); + case BOMB_PLAYER_CARRY: { + setFlag(dAcBomb_c::FLAG_0x200000); + setFlag(dAcBomb_c::FLAG_PLAYER_MAKE); if (checkWaterIn()) { - set0xA3C(FLAG_0x20); + setFlag(dAcBomb_c::FLAG_UNDERWATER); mAcceleration = dAcPy_c::getBombAcceleration_1(); mMaxSpeed = dAcPy_c::getBombMaxSpeed_1(); } changeState(StateID_Carry); } break; - case BOMB_7: { - set0xA3C(FLAG_0x8000000); + case BOMB_BOCO_CARRY: { + setFlag(dAcBomb_c::FLAG_BOKO_CARRY); changeState(StateID_Carry); } break; - case BOMB_1: - case BOMB_2: - case BOMB_5: { + case BOMBF: + case BOMBF_CRAWLSPACE: + case BOMB_5: { mPosition = pos; changeState(StateID_FlowerWait); } break; @@ -276,7 +275,7 @@ int dAcBomb_c::create() { setBombColor(); mMdl.calc(false); setSmokePos(); - field_0xA78 = mPosition; + mExternalTranslation = mPosition; return SUCCEEDED; } @@ -296,15 +295,19 @@ int dAcBomb_c::doDelete() { // NONMATCHING bool dAcBomb_c::checkExplode() { - if (field_0xA46 != 0) { - field_0xA46--; + if (mCarryTimer != 0) { + mCarryTimer--; } if (mFuseTime > 0) { - bool b = !check0xA3C(FLAG_0x1000000 | FLAG_0x200000 | FLAG_0x800 | FLAG_0x200) && !isState(StateID_Explode); + bool b = !checkFlag( + dAcBomb_c::FLAG_FLOWER | dAcBomb_c::FLAG_0x200000 | dAcBomb_c::FLAG_FALL_IN_WATER | + dAcBomb_c::FLAG_NEAR_TIMEDOOR + ) && + !isState(StateID_Explode); if (b) { mFuseTime--; - if (check0xA3C(FLAG_0x8000000 | FLAG_0x800000)) { + if (checkFlag(dAcBomb_c::FLAG_BOKO_CARRY | dAcBomb_c::FLAG_FUSE_PAUSED)) { s16 explodeTimer = dAcPy_c::getBombExplodeTimer(); if (mFuseTime == (explodeTimer >> 1) || mFuseTime == (explodeTimer >> 2) || mFuseTime == (explodeTimer >> 3) || mFuseTime == (explodeTimer >> 4)) { @@ -314,14 +317,14 @@ bool dAcBomb_c::checkExplode() { } } - if (check0xA3C(FLAG_0x800000 | FLAG_0x800 | FLAG_0x200)) { + if (checkFlag(dAcBomb_c::FLAG_FUSE_PAUSED | dAcBomb_c::FLAG_FALL_IN_WATER | dAcBomb_c::FLAG_NEAR_TIMEDOOR)) { return false; } - if (mFuseTime == 0 || check0xA3C(FLAG_0x4) || + if (mFuseTime == 0 || checkFlag(dAcBomb_c::FLAG_BOMB_HIT) || (mSph.ChkCoHit() && mSph.GetCoActor()->isActorPlayer() && static_cast(mSph.GetCoActor())->isBurning()) || - (check0xA3C(FLAG_0x2000000) && field_0xA46 == 0) && + (checkFlag(dAcBomb_c::FLAG_BEETLE_CARRY) && mCarryTimer == 0) && ( // Check Beetle or Chu grab (mSph.ChkCoHit() && mSph.GetCoActor()->mProfileName != fProfile::BOOMERANG && mSph.GetCoActor()->mProfileName != fProfile::E_SM) || @@ -361,13 +364,13 @@ void dAcBomb_c::setRoomId() { } void dAcBomb_c::setSmokePos() { - mVec3_c in = vec_fn_80259E80; - mWorldMtx.multVec(in, field_0xA54); - field_0xA6C = (field_0xA54 - field_0xA60) * 0.5f; + mVec3_c in = sSmokeOffset; + mWorldMtx.multVec(in, mSmokePosNext); + mSmokePos = (mSmokePosNext - mSmokePosPrev) * 0.5f; } bool dAcBomb_c::checkWaterIn() { - return check0xA3C(FLAG_0x20000000) || + return checkFlag(dAcBomb_c::FLAG_0x20000000) || (mAcch.ChkWaterHit() && (mPosition.y + mScale.x * sHIO.getBombScale() < mAcch.GetWtrGroundH())); } @@ -383,14 +386,14 @@ void dAcBomb_c::setTransformFromFlower(const mMtx_c &m) { m0.multVecSR(mVec3_c::Ey, out); f32 f = field_0xA50 * (25.f * mScale.y); - m.getTranslation(field_0xA78); + m.getTranslation(mExternalTranslation); - mPosition = field_0xA78 + out * f; + mPosition = mExternalTranslation + out * f; mPosition.y -= f; } void dAcBomb_c::setPickupTarget() { - if (check0xA3C(FLAG_0x800)) { + if (checkFlag(dAcBomb_c::FLAG_FALL_IN_WATER)) { return; } @@ -403,20 +406,21 @@ void dAcBomb_c::lookAt() { void dAcBomb_c::bounceWall(mAng angle) { mSpeed *= dAcPy_c::getBombBounceSpeed(); - mBombSpeed *= dAcPy_c::getBombBounceSpeed(); + mRollSpeed *= dAcPy_c::getBombBounceSpeed(); mAngle.y = angle - mAng((mAngle.y + 0x8000) - angle); - mBombRotationY = angle - mAng((mBombRotationY + 0x8000) - angle); + mRollRotationY = angle - mAng((mRollRotationY + 0x8000) - angle); } -void dAcBomb_c::fn_8025A1F0(mVec3_c &out) { +void dAcBomb_c::getVelocity(mVec3_c &out) { + // out = Bomb Speed (Standard Parameters) setXYZCirclePoint(out, mAngle.y, mSpeed, mVelocity.y); - if (field_0xA40 != 0) { - f32 f = MyClamp(field_0xA40 * 0.02f, 0.f, 1.f); + if (mRollFrameTimer != 0) { + f32 f = MyClamp(mRollFrameTimer * 0.02f, 0.f, 1.f); mVec3_c v; - setXYZCirclePoint(v, mBombRotationY, mBombSpeed, 0.f); + setXYZCirclePoint(v, mRollRotationY, mRollSpeed, 0.f); out = out * (1.f - f) + v * f; } @@ -434,7 +438,7 @@ void dAcBomb_c::initializeState_Explode() { } mRotation.y = cM::rndF(65536); - field_0xA6C = mVec3_c::Zero; + mSmokePos = mVec3_c::Zero; mVec3_c out; if (getOldStateID() == StateID_FlowerWait || dBgS::GetInstance()->ChkPolySafe(mUnkInfo)) { if (getOldStateID() == StateID_FlowerWait) { @@ -489,7 +493,7 @@ void dAcBomb_c::initializeState_Explode() { if (pEmitter != nullptr) { pEmitter->setRate(5.f); } - } else if (check0xA3C(FLAG_0x2)) { + } else if (checkFlag(dAcBomb_c::FLAG_CHAIN_BOMB)) { (void)dJEffManager_c::spawnEffect( PARTICLE_RESOURCE_ID_MAPPING_321_, mPosition, nullptr, &temp, nullptr, nullptr, 0, 0 ); @@ -521,13 +525,13 @@ void dAcBomb_c::initializeState_Explode() { mSph.ClrTgSet(); mSph.ClrCoSet(); - if (getBombType() == BOMB_6) { + if (getBombType() == BOMB_EXPLODE_NO_DAMAGE) { mSph.ClrAtSet(); } else { mSph.OnAtSet(); } - if (getBombType() == BOMB_2) { + if (getBombType() == BOMBF_CRAWLSPACE) { mSph.SetR(200.f); } else { mSph.SetR(dAcPy_c::getBombExplodeRadius()); @@ -565,11 +569,11 @@ void dAcBomb_c::executeState_Explode() { void dAcBomb_c::finalizeState_Explode() {} void dAcBomb_c::initializeState_Carry() { - unset0xA3C(FLAG_0x2000000 | FLAG_0x80000 | FLAG_0x40000 | FLAG_0x10000); - field_0xA84 = mVec3_c::Zero; + unsetFlag(dAcBomb_c::FLAG_BEETLE_CARRY | dAcBomb_c::FLAG_0x80000 | dAcBomb_c::FLAG_ROLL | dAcBomb_c::FLAG_0x10000); + mHitForce = mVec3_c::Zero; if (mLinkage.checkConnection(dLinkage_c::CONNECTION_5)) { - set0xA3C(FLAG_0x2000000); - field_0xA46 = 5; + setFlag(dAcBomb_c::FLAG_BEETLE_CARRY); + mCarryTimer = 5; mLinkage.offFlag(0x20000000); } else { dAcBase_c *pObj = mLinkage.getControllingActor(); @@ -593,11 +597,11 @@ void dAcBomb_c::executeState_Carry() { dAcPy_c *pPlayer = dAcPy_c::GetLink2(); if (checkExplode()) { - unset0xA3C(FLAG_0x8000000 | FLAG_0x1000000 | FLAG_0x200000); + unsetFlag(dAcBomb_c::FLAG_BOKO_CARRY | dAcBomb_c::FLAG_FLOWER | dAcBomb_c::FLAG_0x200000); } else { if (!mLinkage.checkState(dLinkage_c::STATE_ACTIVE)) { - if (check0xA3C(FLAG_0x100000)) { - unset0xA3C(FLAG_0x100000); + if (checkFlag(dAcBomb_c::FLAG_0x100000)) { + unsetFlag(dAcBomb_c::FLAG_0x100000); mMtx.ZrotS(-mRotation.z); mMtx.XrotM(-mRotation.x); mMtx.YrotM(-mRotation.y); @@ -607,15 +611,15 @@ void dAcBomb_c::executeState_Carry() { mMtx.m[2][3] = 0.f; } if (mLinkage.checkState(dLinkage_c::STATE_3)) { - set0xA3C(FLAG_0x80000 | FLAG_0x40000); - mBombRotationY = pPlayer->mRotation.y; - mBombSpeed = mSpeed; - field_0xA40 = 60; + setFlag(dAcBomb_c::FLAG_0x80000 | dAcBomb_c::FLAG_ROLL); + mRollRotationY = pPlayer->mRotation.y; + mRollSpeed = mSpeed; + mRollFrameTimer = 60; } - unset0xA3C(FLAG_0x8000000 | FLAG_0x1000000 | FLAG_0x200000); + unsetFlag(dAcBomb_c::FLAG_BOKO_CARRY | dAcBomb_c::FLAG_FLOWER | dAcBomb_c::FLAG_0x200000); changeState(StateID_Wait); } else if (!mLinkage.checkConnection(dLinkage_c::CONNECTION_5)) { - unset0xA3C(FLAG_0x2000000 | FLAG_0x1000000); + unsetFlag(dAcBomb_c::FLAG_BEETLE_CARRY | dAcBomb_c::FLAG_FLOWER); } mLinkage.bushTpFunc(mAcch); setRoomId(); @@ -635,9 +639,9 @@ void dAcBomb_c::initializeState_Wait() { mSph.OnCoSet(); mSph.SetCoCallback(dAcBomb_coHitCallback); field_0xA42 = 5; - if (check0xA3C(FLAG_0x4000000)) { - unset0xA3C(FLAG_0x4000000); - set0xA3C(FLAG_0x2000000); + if (checkFlag(dAcBomb_c::FLAG_0x4000000)) { + unsetFlag(dAcBomb_c::FLAG_0x4000000); + setFlag(dAcBomb_c::FLAG_BEETLE_CARRY); } } // NONMATCHING @@ -660,216 +664,213 @@ void dAcBomb_c::executeState_Wait() { field_0xA42--; } - mVec3_c out; - fn_8025A1F0(out); + mVec3_c bombVelocity; + getVelocity(bombVelocity); - s16 s = out.atan2sX_Z(); - f32 d = out.absXZ(); + s16 bombAngleY = bombVelocity.atan2sX_Z(); + f32 bombSpeed = bombVelocity.absXZ(); - mAng out_s; + mAng gndAngle; if (mAcch.ChkGndHit()) { - mAng a = mAcch.GetGnd().GetAngle(s); - mVelocity.y -= d * nw4r::math::FAbs(a.sin()); - f32 cos = a.cos(); + gndAngle = mAcch.GetGnd().GetAngle(bombAngleY); + mVelocity.y -= bombSpeed * nw4r::math::FAbs(gndAngle.sin()); - out.x *= cos; - out.z *= cos; - if (field_0xA40 != 0) { - field_0xA40--; + bombVelocity *= gndAngle.cos(); + + if (mRollFrameTimer != 0) { + mRollFrameTimer--; } - out_s = a; - } else { - out_s = 0; + gndAngle = 0; } - f32 acc = mAcceleration; - f32 vely = mVelocity.y; - out.y += mVelocity.y + mAcceleration; - if (out.y < mMaxSpeed) { - out.y = mMaxSpeed; - } - mVelocity.y = out.y; + f32 prevAccel = mAcceleration; + mVelocity.y = nw4r::ut::Max(mVelocity.y + mAcceleration, mMaxSpeed); + bombVelocity.y = mVelocity.y; + mPosition += bombVelocity; + mPosition += mStts.GetCcMove(); - mPosition += out + mStts.GetCcMove(); - - if (check0xA3C(FLAG_0x10000) && check0xA3C(FLAG_0x20) && mAcch.ChkWaterHit()) { - if (mAcch.GetWtrGroundH() <= mPosition.y + (mScale.x * 30.f) + 1.f) { + if (checkFlag(dAcBomb_c::FLAG_0x10000) && checkFlag(dAcBomb_c::FLAG_UNDERWATER) && mAcch.ChkWaterHit()) { + if (mPosition.y + (mScale.x * sHIO.getBombScale()) + 1.f >= mAcch.GetWtrGroundH()) { + mPosition.y = mAcch.GetWtrGroundH() - (mScale.x * sHIO.getBombScale()) - 1.f; mVelocity.y = 0.f; - mPosition.y = mAcch.GetWtrGroundH() - (mScale.x * 30.f) - 1.f; } } - mAcceleration = acc; + mAcceleration = prevAccel; + f32 prevVelocityY = mVelocity.y; + s16 a0 = 0; + s16 a1 = 0; f32 f = 1.f; - if (mAcch.ChkGndHit() && field_0xA84.squareMagXY() > 1.f) { + if (mAcch.ChkGndHit() && mHitForce.squareMagXZ() > 1.f) { cM3dGPla plane; dBgS::GetInstance()->GetTriPla(mAcch.GetGnd(), &plane); - f = plane.GetAngle(field_0xA84.atan2sX_Z()).cos(); + f = plane.GetAngle(mHitForce.atan2sX_Z()).cos(); f *= f; } - mPosition += (field_0xA84 * f) + field_0xA90; + mPosition += (mHitForce * f) + mStreamForce; mAcch.CrrPos(*dBgS::GetInstance()); - f32 f1 = 0.f; - f32 f2 = 4.f; + f32 sinkTarget = 0.f; + f32 sinkRate = 4.f; mVec3_c force = mVec3_c::Zero; - f32 offs = mYOffset; + f32 sinkValue = mYOffset; if (mAcch.ChkGndHit() && !mLinkage.checkState(dLinkage_c::STATE_ACTIVE)) { - s32 attr = dBgS::GetInstance()->GetSpecialCode(mAcch.GetGnd()); + s32 attr = dBgS::GetInstance()->GetSpecialCode(mAcch.mGnd); if (attr == POLY_ATTR_CURSED_WATER) { - f1 = -60.f; - if (mYOffset >= 0.f) { - vely *= 0.5f; + sinkTarget = -60.f; + if (sinkValue >= 0.f) { + prevVelocityY *= 0.5f; mSpeed *= 0.5f; } - f2 = nw4r::math::FAbs(vely); - mVelocity.y = vely; + sinkRate = nw4r::math::FAbs(prevVelocityY); + mVelocity.y = prevVelocityY; mAcceleration = dAcPy_c::getBombAcceleration_1(); mMaxSpeed = dAcPy_c::getBombMaxSpeed_1(); } else if (attr == POLY_ATTR_SAND_DEEP_INSTANT || attr == POLY_ATTR_SAND_DEEP_SLOW || attr == POLY_ATTR_SAND_MED) { - f1 = -10.f; - f2 = 1.f; + sinkTarget = -10.f; + sinkRate = 1.f; } if (attr == POLY_ATTR_SAND_DEEP_SLOW || attr == POLY_ATTR_SAND_MED) { dTgStream_c::getForce(mPosition, force, dTgStream_c::sSandStreamList); } + } + cLib::addCalcPosXZ(&mStreamForce, force, 0.5f, 10.f, 3.f); + sLib::chase(&sinkValue, sinkTarget, sinkRate); + mYOffset = sinkValue; + if (sinkValue <= -60.f) { + setFlag(dAcBomb_c::FLAG_DELETE_BOMB); + } + setRoomId(); - cLib::addCalcPosXZ(&field_0xA90, force, 0.5f, 10.f, 3.f); - sLib::chase(&offs, f1, f2); - mYOffset = offs; - if (offs <= -60.f) { - set0xA3C(FLAG_0x1000); - } - setRoomId(); + if (mAcch.ChkGndHit()) { + cM3dGPla plane; + dBgS::GetInstance()->GetTriPla(mAcch.GetGnd(), &plane); + mGndAngle = cM::atan2s(plane.GetN().absXZ(), plane.GetN().y); - mAng a0, a1; + a1 = plane.GetN().atan2sX_Z(); + a0 = a1 - bombAngleY; + } + bool hit = false; + f32 outXZ = bombVelocity.absXZ(); + if (mAcch.ChkWallHit(nullptr) && mAng::abs(mAcchCir.GetWallAngleY() - bombAngleY) > 0x4400 && outXZ > 1.0f) { + bounceWall(mAcchCir.GetWallAngleY()); + hit = true; + startSoundWithFloatParam(SE_BM_BOUND, outXZ); + } else if (mAcch.ChkRoofHit() && mVelocity.y > 0.f) { + startSoundWithFloatParam(SE_BM_BOUND, mVelocity.y); + mVelocity.y = 0.f; + } else if (mAcch.ChkGroundLanding() && mSpeed > 5.0f && mGndAngle >= mAng::fromDeg(50.f) && + mAng::abs(a0) >= 0x4000) { + bounceWall(a1); + mVelocity.y = prevVelocityY; + mAcch.ClrGroundLanding(); + mAcch.i_ClrGroundHit(); + hit = true; + } else if (mSph.ChkCoHit() && field_0xA42 == 0 && mStts.GetCcMove().absXZ() >= 1.f) { + bounceWall(mStts.GetCcMove().atan2sX_Z()); + field_0xA42 = 5; + hit = true; + } + + mAng hitGndAngle = gndAngle; + if (hit) { + getVelocity(bombVelocity); + s16 sVar15 = bombVelocity.atan2sX_Z(); if (mAcch.ChkGndHit()) { - cM3dGPla plane; - dBgS::GetInstance()->GetTriPla(mAcch.GetGnd(), &plane); - field_0xA48 = cM::atan2s(plane.GetN().absXZ(), plane.GetN().y); - a1 = plane.GetN().atan2sX_Z(); - a0 = a1 - s; + hitGndAngle = mAcch.GetGnd().GetAngle(sVar15); } + } - bool hit = false; - f32 outXZ = out.absXZ(); - if (mAcch.ChkWallHit(nullptr) && mAng::abs(mAcchCir.GetWallAngleY() - s) > 0x4400 && outXZ > 1.0f) { - bounceWall(mAcchCir.GetWallAngleY()); - hit = true; - startSoundWithFloatParam(SE_BM_BOUND, mVelocity.y); - } else if (mAcch.ChkRoofHit() && mVelocity.y > 0.f) { - startSoundWithFloatParam(SE_BM_BOUND, mVelocity.y); - mVelocity.y = 0.f; - } else if (mAcch.ChkGroundLanding() && mSpeed > 5.0f && field_0xA48 < mAng::fromDeg(50.f) && - mAng::abs(s) > 0x4000) { - bounceWall(a1); - hit = true; - mVelocity.y = vely; - mAcch.ClrGroundLanding(); - mAcch.i_ClrGroundHit(); - } else if (mSph.ChkCoHit() && field_0xA42 == 0 && mStts.GetCcMove().absXZ() >= 1.f) { - bounceWall(mStts.GetCcMove().atan2sX_Z()); - field_0xA42 = 5; - hit = true; - } - - if (hit) { - fn_8025A1F0(out); - s16 sVar15 = out.atan2sX_Z(); - if (mAcch.ChkGndHit()) { - out_s = mAcch.GetGnd().GetAngle(sVar15); + if (mAcch.ChkGroundLanding()) { + if (prevVelocityY < -5.f) { + startSoundWithFloatParam(SE_BM_BOUND, prevVelocityY * -1.0f); + if (dBgS::GetInstance()->GetPolyAtt0(mAcch.GetGnd()) != POLY_ATT_0_LAVA) { + dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 0.8f, field_0x1B0); } } - if (mAcch.ChkGroundLanding()) { - if (vely < -5.f) { - startSoundWithFloatParam(SE_BM_BOUND, vely * -1.0f); - if (dBgS::GetInstance()->GetPolyAtt0(mAcch.GetGnd()) != POLY_ATT_0_LAVA) { - dJEffManager_c::spawnGroundEffect( - mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 0.8f, field_0x1B0 - ); - } + prevVelocityY *= -dAcPy_c::getBombBounceSpeed(); + s32 attr = dBgS::GetInstance()->GetSpecialCode(mAcch.mGnd); + + if (!checkFlag(dAcBomb_c::FLAG_ROLL) && + (prevVelocityY < dAcPy_c::getBombStopSpeedY() || + (attr == POLY_ATTR_SAND_DEEP_INSTANT || + (attr == POLY_ATTR_CURSED_WATER || attr == POLY_ATTR_SAND_DEEP_SLOW || attr == POLY_ATTR_SAND_MED)))) { + sLib::chase(&mSpeed, 0.0f, 7.0f); + } else { + mSpeed *= 0.9f; + mRollSpeed *= 0.9f; + + if (hitGndAngle < 0) { + mSpeed *= hitGndAngle.cos(); + mRollSpeed *= hitGndAngle.cos(); } - f32 f3 = dAcPy_c::getBombBounceSpeed(); - f32 f4 = vely * -f3; - s32 attr = dBgS::GetInstance()->GetSpecialCode(mAcch.GetGnd()); - - if (check0xA3C(FLAG_0x40000) || - !((f3 < dAcPy_c::getBombUnkFloat_0() || attr != POLY_ATTR_SAND_DEEP_INSTANT) && - (attr != POLY_ATTR_CURSED_WATER && attr != POLY_ATTR_SAND_DEEP_SLOW && attr != POLY_ATTR_SAND_MED))) { - sLib::chase(&mSpeed, 0.0f, 7.0f); + if (checkFlag(dAcBomb_c::FLAG_0x80000)) { + unsetFlag(dAcBomb_c::FLAG_0x80000); + mVelocity.y = 0.f; + } else if (prevVelocityY > dAcPy_c::getBombMaxSpeedY()) { + mVelocity.y = dAcPy_c::getBombMaxSpeedY(); } else { - mSpeed *= 0.9f; - mBombSpeed *= 0.9f; - if (out_s < 0) { - mSpeed *= out_s.cos(); - mBombSpeed *= out_s.cos(); - } - if (check0xA3C(FLAG_0x80000)) { - unset0xA3C(FLAG_0x80000); - mVelocity.y = 0.f; - } else if (f4 > dAcPy_c::getBombUnkFloat_1()) { - mVelocity.y = dAcPy_c::getBombUnkFloat_1(); - } else { - mVelocity.y = f4; - } + mVelocity.y = prevVelocityY; } - } else if (mAcch.ChkGndHit()) { - cM3dGPla plane; - dBgS::GetInstance()->GetTriPla(mAcch.GetGnd(), &plane); - int code = dBgS::GetInstance()->GetSpecialCode(mAcch.GetGnd()); - if (check0xA3C(FLAG_0x40000)) { - if (code == POLY_ATTR_SAND_DEEP_SLOW || code == POLY_ATTR_SAND_MED) { - outXZ = 0.2f; - } else { - outXZ = 0.1f; - } + } + } else if (mAcch.ChkGndHit()) { + cM3dGPla plane; + dBgS::GetInstance()->GetTriPla(mAcch.mGnd, &plane); + int code = dBgS::GetInstance()->GetSpecialCode(mAcch.mGnd); + + f32 step; + if (checkFlag(dAcBomb_c::FLAG_ROLL)) { + if (code == POLY_ATTR_SAND_DEEP_SLOW || code == POLY_ATTR_SAND_MED) { + step = 0.2f; } else { - outXZ = 0.75f; + step = 0.1f; } - if (code != POLY_ATTR_CURSED_WATER) { - if (field_0xA48 < mAng::fromDeg(20.0f)) { - mVec3_c v0 = plane.GetN() * 2.f; - mVec3_c v1 = v0 * field_0xA48.sin(); - v1.y = 0.0f; + } else { + step = 0.75f; + } + if (code != POLY_ATTR_CURSED_WATER) { + if (mGndAngle >= mAng::fromDeg(20.0f)) { + mVec3_c v1 = 2.f * plane.GetN() * mGndAngle.sin(); + v1.y = 0.0f; - mAng yRot = v1.atan2sX_Z(); - if (field_0xA84.squareMagXZ() > 1.0f) { - mAng rot = mAng::fromVec(field_0xA84); - if (mAng::abs(yRot - rot) >= 0x4000) { - field_0xA84.rotY(-yRot); - field_0xA84.z *= 0.99f; - sLib::chase(&field_0xA84.z, 0.0f, 1.0f); - field_0xA84.rotY(yRot); - } + mAng yRot = v1.atan2sX_Z(); + f32 compare = mHitForce.squareMagXZ(); + if (compare > 1.0f) { + s32 a = yRot - mAng::fromVec(mHitForce); + if (mAng::abs(a) >= 0x4000) { + mHitForce.rotY(-yRot); + mHitForce.z *= 0.99f; + sLib::chase(&mHitForce.z, 0.0f, 1.0f); + mHitForce.rotY(yRot); } + } - if (mAng::abs(yRot - mAngle.y) >= 0x4000) { - sLib::chase(&mSpeed, 0.0f, outXZ); - } - mSpeed *= 0.9f; - rollTo(v1); - mSpeed = nw4r::ut::Min(mSpeed, 30.f); + if (mAng::abs(yRot - mAngle.y) >= 0x4000) { + sLib::chase(&mSpeed, 0.0f, step); + } + mSpeed *= 0.99f; + rollTo(v1); + mSpeed = nw4r::ut::Min(mSpeed, 30.f); - if (mAng::abs(yRot - mBombRotationY) >= 0x4000) { - sLib::chase(&mBombSpeed, 0.0f, outXZ); - } - mBombSpeed *= 0.9f; - rollToInternal(v1); - mBombSpeed = nw4r::ut::Min(mBombSpeed, 30.f); - } else { - sLib::chase(&mBombSpeed, 0.0f, outXZ); - if (sLib::chase(&mSpeed, 0.0f, outXZ)) { - if (field_0xA84.getSquareMag() < 1.f && field_0xA90.getSquareMag() < 1.f) { - setPickupTarget(); - } - unset0xA3C(FLAG_0x40000); - mSph.ClrAtSet(); + if (mAng::abs(yRot - mRollRotationY) >= 0x4000) { + sLib::chase(&mRollSpeed, 0.0f, step); + } + mRollSpeed *= 0.99f; + rollToInternal(v1); + mRollSpeed = nw4r::ut::Min(mRollSpeed, 30.f); + } else { + sLib::chase(&mRollSpeed, 0.0f, step); + if (sLib::chase(&mSpeed, 0.0f, step)) { + if (mHitForce.getSquareMag() < 1.f && mStreamForce.getSquareMag() < 1.f) { + setPickupTarget(); } + unsetFlag(dAcBomb_c::FLAG_ROLL); + mSph.ClrAtSet(); } } } @@ -883,7 +884,7 @@ void dAcBomb_c::finalizeState_Wait() { } void dAcBomb_c::initializeState_FlowerWait() { - set0xA3C(FLAG_0x1000000); + setFlag(dAcBomb_c::FLAG_FLOWER); mSph.ClrTgSet(); mScale.set(0.1f, 0.1f, 0.1f); mStts.SetRank(0xD); @@ -895,8 +896,8 @@ void dAcBomb_c::executeState_FlowerWait() { if (mScale.x < 1.f || field_0xA50 < 1.f) { if (mScale.x < 0.15f && !MinigameManager::GetInstance()->checkInThrillDigger() && - ((getBombType() == BOMB_2 && pPlayer->checkActionFlagsCont(0x400000)) || - (getBombType() != BOMB_2 && !pPlayer->checkActionFlagsCont(0x400000)))) { + ((getBombType() == BOMBF_CRAWLSPACE && pPlayer->checkActionFlagsCont(dAcPy_c::ActFLG1_INCRAWLSPACE)) || + (getBombType() != BOMBF_CRAWLSPACE && !pPlayer->checkActionFlagsCont(dAcPy_c::ActFLG1_INCRAWLSPACE)))) { startSound(SE_O_BOMB_FLOWER_SPROUT); } sLib::chase(&mScale.x, 1.0f, 0.1f); @@ -905,7 +906,7 @@ void dAcBomb_c::executeState_FlowerWait() { mMdl.setScale(scale); mMtx_c m = mMtx; - m.setTranslation(field_0xA78); + m.setTranslation(mExternalTranslation); setTransformFromFlower(m); mSph.ClrTgSet(); return; @@ -929,11 +930,11 @@ void dAcBomb_c::executeState_FlowerWait() { setPickupTarget(); } void dAcBomb_c::finalizeState_FlowerWait() { - if (!(mLinkage.checkConnection(dLinkage_c::CONNECTION_5) && check0xA3C(FLAG_0x1000000))) { - unset0xA3C(FLAG_0x1000000); + if (!(mLinkage.checkConnection(dLinkage_c::CONNECTION_5) && checkFlag(dAcBomb_c::FLAG_FLOWER))) { + unsetFlag(dAcBomb_c::FLAG_FLOWER); } - if (getBombType() == BOMB_2) { + if (getBombType() == BOMBF_CRAWLSPACE) { mStts.SetRank(4); } else { mStts.SetRank(5); @@ -944,11 +945,11 @@ void dAcBomb_c::finalizeState_FlowerWait() { } void dAcBomb_c::initializeState_WindCarry() { - unset0xA3C(FLAG_0x2000000 | FLAG_0x80000 | FLAG_0x40000 | FLAG_0x10000); - field_0xA84 = mVec3_c::Zero; + unsetFlag(dAcBomb_c::FLAG_BEETLE_CARRY | dAcBomb_c::FLAG_0x80000 | dAcBomb_c::FLAG_ROLL | dAcBomb_c::FLAG_0x10000); + mHitForce = mVec3_c::Zero; mSpeed = 0.f; mVelocity = mVec3_c::Zero; - mBombSpeed = 0.f; + mRollSpeed = 0.f; mLinkage.bushTpFunc(mAcch); setRoomId(); } @@ -981,11 +982,15 @@ void dAcBomb_c::finalizeState_WindCarry() {} void dAcBomb_c::setBombColor() { mColor clr(0, 0, 0, 0xFF); - if (!check0xA3C(FLAG_0x800)) { - bool b = !check0xA3C(FLAG_0x1000000 | FLAG_0x200000 | FLAG_0x800 | FLAG_0x200) && !isState(StateID_Explode); + if (!checkFlag(dAcBomb_c::FLAG_FALL_IN_WATER)) { + bool b = !checkFlag( + dAcBomb_c::FLAG_FLOWER | dAcBomb_c::FLAG_0x200000 | dAcBomb_c::FLAG_FALL_IN_WATER | + dAcBomb_c::FLAG_NEAR_TIMEDOOR + ) && + !isState(StateID_Explode); if (b) { mEffect1.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_974_, mWorldMtx, nullptr, nullptr); - if (!check0xA3C(FLAG_0x8000000)) { + if (!checkFlag(dAcBomb_c::FLAG_BOKO_CARRY)) { mEffect2.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_975_, mWorldMtx, nullptr, nullptr); } @@ -1041,17 +1046,17 @@ void dAcBomb_c::rollTo(const mVec3_c &dir) { } void dAcBomb_c::rollToInternal(const mVec3_c &dir) { - if (field_0xA40 == 0) { + if (mRollFrameTimer == 0) { return; } mVec3_c v; - setXYZCirclePoint(v, mBombRotationY, mBombSpeed, 0.f); + setXYZCirclePoint(v, mRollRotationY, mRollSpeed, 0.f); v += dir; v.y = 0.f; - mBombRotationY = v.atan2sX_Z(); - mBombSpeed = v.absXZ(); + mRollRotationY = v.atan2sX_Z(); + mRollSpeed = v.absXZ(); } void dAcBomb_c::registerInEvent() { @@ -1079,35 +1084,35 @@ void dAcBomb_c::unkVirtFunc_0x6C() { // NONMATCHING int dAcBomb_c::actorExecute() { - unset0xA3C(FLAG_0x400000 | FLAG_0x100); + unsetFlag(dAcBomb_c::FLAG_0x400000 | dAcBomb_c::FLAG_0x100); mVec3_c v; - fn_8025A1F0(v); + getVelocity(v); - f32 f = field_0xA84.getSquareMag(); - if (!check0xA3C(FLAG_0x8000)) { + f32 f = mHitForce.getSquareMag(); + if (!checkFlag(dAcBomb_c::FLAG_0x8000)) { if (f > 1.f) { - v += field_0xA84; - rollTo(field_0xA84); - rollToInternal(field_0xA84); + v += mHitForce; + rollTo(mHitForce); + rollToInternal(mHitForce); } f = 0.f; - field_0xA84 = mVec3_c::Zero; + mHitForce = mVec3_c::Zero; } else { - unset0xA3C(FLAG_0x8000); + unsetFlag(dAcBomb_c::FLAG_0x8000); } - field_0xA48 = 0; - field_0xA60 = field_0xA54; + mGndAngle = 0; + mSmokePosPrev = mSmokePosNext; executeState(); - if (check0xA3C(FLAG_0x1000)) { + if (checkFlag(dAcBomb_c::FLAG_DELETE_BOMB)) { deleteRequest(); return SUCCEEDED; } if (!isState(StateID_Explode)) { - if (check0xA3C(FLAG_0x800)) { + if (checkFlag(dAcBomb_c::FLAG_FALL_IN_WATER)) { if (sLib::chase(&mScale.x, 0.f, 0.0875f)) { deleteRequest(); return SUCCEEDED; @@ -1122,8 +1127,8 @@ int dAcBomb_c::actorExecute() { } if (checkWaterIn()) { - if (!check0xA3C(FLAG_0x800 | FLAG_0x20)) { - if (!check0xA3C(FLAG_0x20000000)) { + if (!checkFlag(dAcBomb_c::FLAG_FALL_IN_WATER | dAcBomb_c::FLAG_UNDERWATER)) { + if (!checkFlag(dAcBomb_c::FLAG_0x20000000)) { mVec3_c pos; // !!! FPR alloc here is weird I guess f32 diff0 = nw4r::math::FAbs(mOldPosition.y - mPosition.y); @@ -1145,9 +1150,9 @@ int dAcBomb_c::actorExecute() { if (mLinkage.checkState(dLinkage_c::STATE_ACTIVE)) { mLinkage.forceRemove(this); } - set0xA3C(FLAG_0x800); + setFlag(dAcBomb_c::FLAG_FALL_IN_WATER); - field_0xA6C = mVec3_c::Zero; + mSmokePos = mVec3_c::Zero; mSpeed *= 0.5f; mVelocity.y *= 0.5f; @@ -1155,13 +1160,13 @@ int dAcBomb_c::actorExecute() { mMaxSpeed = dAcPy_c::getBombMaxSpeed_1(); } - if (check0xA3C(FLAG_0x1000)) { + if (checkFlag(dAcBomb_c::FLAG_DELETE_BOMB)) { deleteRequest(); - field_0xA6C = mVec3_c::Zero; + mSmokePos = mVec3_c::Zero; return SUCCEEDED; } } else { - unset0xA3C(FLAG_0x20); + unsetFlag(dAcBomb_c::FLAG_UNDERWATER); mAcceleration = dAcPy_c::getBombAcceleration(); mMaxSpeed = dAcPy_c::getBombMaxSpeed(); } @@ -1171,7 +1176,7 @@ int dAcBomb_c::actorExecute() { setXYZCirclePoint(v, mAngle.y, mSpeed, 0.f); bool gndNotHit = true; if (f > 1.f) { - v += field_0xA84; + v += mHitForce; } else if (mAcch.ChkGndHit()) { gndNotHit = false; } @@ -1192,9 +1197,9 @@ int dAcBomb_c::actorExecute() { f32 scale = mScale.y * 25.f; f32 f = 0.f; - if (field_0xA48 != 0 && field_0xA48 < 0x4000) { - /// !! Need to load field_0xA48 again - f32 f0 = field_0xA48.cos(); + if (mGndAngle != 0 && mGndAngle < 0x4000) { + /// !! Need to load mGndAngle again + f32 f0 = mGndAngle.cos(); f32 f_temp = ((1.0f / f0) - 1.f); f = scale * nw4r::ut::Min(f_temp * 0.75f, 0.5f); } @@ -1218,7 +1223,7 @@ int dAcBomb_c::actorExecute() { mPositionCopy3 = mPositionCopy2; mSph.moveCenter(mPositionCopy2); mSph.SetR(mScale.x * sHIO.getBombScale() * field_0xA50); - if (check0xA3C(FLAG_0x800)) { + if (checkFlag(dAcBomb_c::FLAG_FALL_IN_WATER)) { mSph.ClrTgSet(); mSph.ClrTgHit(); } @@ -1229,7 +1234,7 @@ int dAcBomb_c::actorExecute() { mSph.ClrTgHit(); } - if (!check0xA3C(FLAG_0x800)) { + if (!checkFlag(dAcBomb_c::FLAG_FALL_IN_WATER)) { setSmokePos(); } @@ -1241,7 +1246,8 @@ int dAcBomb_c::actorExecute() { } int dAcBomb_c::draw() { - if (isState(StateID_Explode) || (getBombType() == BOMB_2 && !dAcPy_c::GetLink()->checkActionFlagsCont(0x400000))) { + if (isState(StateID_Explode) || + (getBombType() == BOMBF_CRAWLSPACE && !dAcPy_c::GetLink()->checkActionFlagsCont(0x400000))) { return SUCCEEDED; }