From 785bb10922bbd164fb0c946a3a2ad0bdbdb27708 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 28 Sep 2026 14:24:03 -0400 Subject: [PATCH] d_a_b_lastboss remove typing crime --- .../SOUE01/rels/d_a_b_lastbossNP/symbols.txt | 4 +- include/d/a/b/d_a_b_lastboss.h | 10 + include/d/d_cc.h | 7 - src/REL/d/a/b/d_a_b_lastboss.cpp | 250 ++++++++---------- 4 files changed, 124 insertions(+), 147 deletions(-) diff --git a/config/SOUE01/rels/d_a_b_lastbossNP/symbols.txt b/config/SOUE01/rels/d_a_b_lastbossNP/symbols.txt index 37f81471..16799fb3 100644 --- a/config/SOUE01/rels/d_a_b_lastbossNP/symbols.txt +++ b/config/SOUE01/rels/d_a_b_lastbossNP/symbols.txt @@ -30,8 +30,8 @@ doDelete__14dAcBlastboss_cFv = .text:0x000015A0; // type:function size:0x34 actorExecute__14dAcBlastboss_cFv = .text:0x000015E0; // type:function size:0x17A8 executeState__83sStateMgr_c<14dAcBlastboss_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00002D90; // type:function size:0x10 getStateID__83sStateMgr_c<14dAcBlastboss_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00002DA0; // type:function size:0x10 -ChkAtHit__10dCcD_CheckFv = .text:0x00002DB0; // type:function size:0x48 -ChkTgHit__10dCcD_CheckFv = .text:0x00002E00; // type:function size:0x4C +ChkAtHit__8cCcD_ObjFv = .text:0x00002DB0; // type:function size:0x48 +ChkTgHit__8cCcD_ObjFv = .text:0x00002E00; // type:function size:0x4C timingB__Q214dAcBlastboss_c10callback_cFUlPQ34nw4r3g3d13WorldMtxManipQ34nw4r3g3d6ResMdl = .text:0x00002E50; // type:function size:0x85C initializeState_Fight__14dAcBlastboss_cFv = .text:0x000036B0; // type:function size:0xBC executeState_Fight__14dAcBlastboss_cFv = .text:0x00003770; // type:function size:0x718 diff --git a/include/d/a/b/d_a_b_lastboss.h b/include/d/a/b/d_a_b_lastboss.h index 3adbcf20..a76701d3 100644 --- a/include/d/a/b/d_a_b_lastboss.h +++ b/include/d/a/b/d_a_b_lastboss.h @@ -10,6 +10,7 @@ #include "m/m3d/m_smdl.h" #include "m/m_angle.h" #include "m/m_vec.h" +#include "nw4r/math/math_arithmetic.h" #include "s/s_State.hpp" #include "toBeSorted/d_emitter.h" #include "toBeSorted/d_enemy_sword_mdl.h" @@ -42,6 +43,10 @@ struct UnkLastBossCcSph2 { /* 0x08C */ mVec3_c field_0x08C[10]; /* 0x104 */ mVec3_c field_0x104[10]; /* 0x17C */ dCcD_Linked mCc; + + f32 getAbs_0x010() const { + return nw4r::math::FAbs(field_0x010); + } }; class dAcBlastboss_c : public dAcEnBase_c { @@ -297,6 +302,11 @@ public: STATE_FUNC_DECLARE(dAcBlastboss_c, Stun); STATE_FUNC_DECLARE(dAcBlastboss_c, ThunderWait); + STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcBlastboss_c); + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcBlastboss_c); + STATE_MGR_DEFINE_UTIL_ISSTATE(dAcBlastboss_c); + STATE_MGR_DEFINE_UTIL_GETSTATEID(dAcBlastboss_c); + private: void setAnm(const char *anim, f32 blend); void forceSetAnm(const char *anim, f32 blend); diff --git a/include/d/d_cc.h b/include/d/d_cc.h index 7da5092d..8619e1e3 100644 --- a/include/d/d_cc.h +++ b/include/d/d_cc.h @@ -55,13 +55,6 @@ public: void foreachCc(ccCbFunc f, void *cbArg) const; void foreachCc2(ccCbFunc f, void *cbArg) const; - // This find function is used by a lot of other - // TUs, all of which own the function passed as - // a ptmf. It's not immediately clear how this works, - // does every actor subclass the LinkedCollider___, - // or are the functions all added here for the other - // files to implement? d_a_b_lastboss commits a typing crime here - // to make it work... typedef bool (cCcD_Obj::*ccPtmf)(); cCcD_Obj *find(ccPtmf f) const; diff --git a/src/REL/d/a/b/d_a_b_lastboss.cpp b/src/REL/d/a/b/d_a_b_lastboss.cpp index 7fd2b306..b0e68a20 100644 --- a/src/REL/d/a/b/d_a_b_lastboss.cpp +++ b/src/REL/d/a/b/d_a_b_lastboss.cpp @@ -207,7 +207,7 @@ int dAcBlastboss_c::create() { mMaxSpeed = -80.0f; mBoundingBox.Set(mVec3_c(-200.0f, -300.0f, -200.0f), mVec3_c(200.0f, 300.0f, 200.0f)); - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); field_0x1132 = true; mCounter = cM::rndF(65536.0f); @@ -304,7 +304,7 @@ int dAcBlastboss_c::actorExecute() { checkDamage(); if (mpSwordBattleGame == nullptr || mpSwordBattleGame->checkFightStarted() == true) { - mStateMgr.executeState(); + executeState(); } mRotation.x = mAngle.x; @@ -439,7 +439,7 @@ int dAcBlastboss_c::actorExecute() { nodeMtx.YrotS(mRotation.y); mVec3_c tmpCc; - if (link->isAttacking() && mStateMgr.isState(StateID_Guard)) { + if (link->isAttacking() && isState(StateID_Guard)) { if (mGuardDirection == GUARD_BT) { tmpCc.x = 0.0f; tmpCc.y = 0.0f; @@ -456,7 +456,7 @@ int dAcBlastboss_c::actorExecute() { tmpCc.z = 130.0f; } mCc1.SetR(20.0f); - } else if (mStateMgr.isState(StateID_ThunderWait)) { + } else if (isState(StateID_ThunderWait)) { tmpCc.set(0.0f, 0.0f, 0.0f); mCc1.SetR(150.0f); } else { @@ -699,7 +699,7 @@ int dAcBlastboss_c::actorExecute() { MTXMultVec(rotMtx, v3, v3); mAttackKnockbackX = v3.x; mAttackKnockbackZ = v3.z; - mStateMgr.changeState(StateID_Stun); + changeState(StateID_Stun); } } mLightInfo.mPos = mThunderBeamPosition; @@ -750,7 +750,7 @@ int dAcBlastboss_c::actorExecute() { SceneflagManager *mgr = SceneflagManager::sInstance; if (mgr != nullptr) { - if (mStateMgr.isState(StateID_ThunderWait)) { + if (isState(StateID_ThunderWait)) { mgr->setFlag(getRoomId(), mThunderWaitSceneFlag); } else { mgr->unsetFlag(getRoomId(), mThunderWaitSceneFlag); @@ -768,25 +768,6 @@ int dAcBlastboss_c::actorExecute() { return SUCCEEDED; } -struct dCcD_Check : public cCcD_Obj { - bool ChkAtHit(); - bool ChkTgHit(); -}; - -bool dCcD_Check::ChkAtHit() { - if (cCcD_Obj::ChkAtHit()) { - return true; - } - return false; -} - -bool dCcD_Check::ChkTgHit() { - if (cCcD_Obj::ChkTgHit()) { - return true; - } - return false; -} - void dAcBlastboss_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *manip, nw4r::g3d::ResMdl mdl) { u32 baseNodeIdSkirt = 0; u32 baseNodeIdHair = 0; @@ -1001,7 +982,7 @@ void dAcBlastboss_c::executeState_Fight() { if (mXZDistanceToLink < 200.0f) { field_0x1180++; if (field_0x1180 > 40) { - mStateMgr.changeState(StateID_PunchAttack); + changeState(StateID_PunchAttack); return; } } else if (mXZDistanceToLink >= puVar2 + 200.0f && mTimers[TIMER_0] == 0) { @@ -1042,7 +1023,7 @@ void dAcBlastboss_c::executeState_Fight() { } else if (!link->isRecovering()) { field_0x117E++; if (field_0x117E > 70) { - mStateMgr.changeState(StateID_DashAttack); + changeState(StateID_DashAttack); return; } } else { @@ -1148,13 +1129,12 @@ void dAcBlastboss_c::executeState_Attack() { dAcPy_c *link = dAcPy_c::GetLinkM(); field_0x1131 = 1; f32 speed = 0.0f; - // TODO major typing crime here but I'm not sure how this actually works - cCcD_Obj *atHit = mSwordMdl.mCcList.find((dColliderLinkedList::ccPtmf)&dCcD_Check::ChkAtHit); + cCcD_Obj *atHit = mSwordMdl.mCcList.findAtHit(); switch (mSubState) { case SUB_STATE_0: { if (field_0x1152 >= 15 && mMdl.getAnm().checkFrame(7.0f) && cM::rnd() < 0.1f) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); field_0x113F = 20; } else { if (mMdl.getAnm().getFrame() < 20.0f) { @@ -1182,7 +1162,7 @@ void dAcBlastboss_c::executeState_Attack() { } case SUB_STATE_1: { if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); } break; } @@ -1195,7 +1175,7 @@ void dAcBlastboss_c::executeState_Attack() { if (field_0x113E != 0) { if (mIsPhaseTwo) { mSubState = SUB_STATE_0; - mStateMgr.changeState(StateID_CounterAttack); + changeState(StateID_CounterAttack); return; } mCc1.SetTgCutDir(CUT_DIR_NONE); @@ -1255,7 +1235,7 @@ void dAcBlastboss_c::executeState_CounterAttack() { int targetFrame = 42; if (mMdl.getAnm().checkFrame(targetFrame) && mXZDistanceToLink > 400.0f) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); return; } if (mMdl.getAnm().getFrame() >= 52.0f) { @@ -1290,7 +1270,7 @@ void dAcBlastboss_c::executeState_CounterAttack() { } if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); } mSpeed = speed; } @@ -1319,7 +1299,7 @@ void dAcBlastboss_c::executeState_PunchAttack() { field_0x1139 = 0; } if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); } mSpeed = speed; } @@ -1339,7 +1319,7 @@ void dAcBlastboss_c::executeState_DashAttack() { switch (mSubState) { case SUB_STATE_0: { if (mXZDistanceToLink < 400.0f) { - mStateMgr.changeState(StateID_CounterAttack); + changeState(StateID_CounterAttack); return; } setAnm("AttackJumpStart", 5.0f); @@ -1367,7 +1347,7 @@ void dAcBlastboss_c::executeState_DashAttack() { setAnm("AttackJumpEnd", 0.0f); mSubState = SUB_STATE_3; } else if (mTimers[TIMER_0] == 0) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); } break; } @@ -1383,7 +1363,7 @@ void dAcBlastboss_c::executeState_DashAttack() { } if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); } break; } @@ -1432,7 +1412,7 @@ void dAcBlastboss_c::executeState_SmallAttack() { } if (mMdl.getAnm().checkFrame(44.0f) && mSubState != SUB_STATE_1) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); mpCurrentAnm = nullptr; setAnm("WaitBt", 40.0f); field_0x113E = 10; @@ -1446,7 +1426,7 @@ void dAcBlastboss_c::executeState_SmallAttack() { } if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); } sLib::addCalcScaledDiff(&mSpeed, targetSpeed, 1.0f, 20.0f); @@ -1488,7 +1468,7 @@ void dAcBlastboss_c::executeState_ThunderAttack() { } } if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); } sLib::addCalcScaledDiff(&mSpeed, targetSpeed, 1.0f, 5.0f); @@ -1510,15 +1490,15 @@ void dAcBlastboss_c::executeState_Guard() { }; static const u32 sGuardFlags[] = { - CUT_DIR_LD | CUT_DIR_L | CUT_DIR_LU, // GUARD_RIGHT - CUT_DIR_LD | CUT_DIR_L | CUT_DIR_LU, // GUARD_UPRIGHT + CUT_DIR_LD | CUT_DIR_L | CUT_DIR_LU, // GUARD_RIGHT + CUT_DIR_LD | CUT_DIR_L | CUT_DIR_LU, // GUARD_UPRIGHT CUT_DIR_D | CUT_DIR_LD | CUT_DIR_L | CUT_DIR_LU, // GUARD_DOWNRIGHT - CUT_DIR_RU | CUT_DIR_R | CUT_DIR_RD, // GUARD_LEFT - CUT_DIR_RU | CUT_DIR_R | CUT_DIR_RD, // GUARD_UPLEFT + CUT_DIR_RU | CUT_DIR_R | CUT_DIR_RD, // GUARD_LEFT + CUT_DIR_RU | CUT_DIR_R | CUT_DIR_RD, // GUARD_UPLEFT CUT_DIR_RU | CUT_DIR_R | CUT_DIR_RD | CUT_DIR_D, // GUARD_DOWNLEFT - CUT_DIR_RU | CUT_DIR_LU | CUT_DIR_U, // GUARD_UP - CUT_DIR_RD | CUT_DIR_D | CUT_DIR_LD, // GUARD_DOWN - CUT_DIR_STAB, // GUARD_CENTER + CUT_DIR_RU | CUT_DIR_LU | CUT_DIR_U, // GUARD_UP + CUT_DIR_RD | CUT_DIR_D | CUT_DIR_LD, // GUARD_DOWN + CUT_DIR_STAB, // GUARD_CENTER CUT_DIR_ALL, }; @@ -1549,11 +1529,11 @@ void dAcBlastboss_c::executeState_Guard() { if (mGuardDirection == GUARD_BT) { field_0x1133 = 1; if (mTimers[TIMER_0] == 0) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); mTimers[TIMER_4] = 15; } } else if (mMdl.getAnm().getFrame() >= 13.0f) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); mTimers[TIMER_4] = 15; } @@ -1585,7 +1565,7 @@ void dAcBlastboss_c::executeState_Guard() { } case SUB_STATE_11: { if (mMdl.getAnm().getFrame() >= 13.0f) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); mTimers[TIMER_4] = 15; } break; @@ -1609,7 +1589,7 @@ void dAcBlastboss_c::executeState_Guard() { case CUT_DIR_LU: mGuardDirection = GUARD_UPRIGHT; break; case CUT_DIR_LD: mGuardDirection = GUARD_DOWNRIGHT; break; case CUT_DIR_D: mGuardDirection = GUARD_DOWN; break; - default: mGuardDirection = GUARD_CENTER; break; + default: mGuardDirection = GUARD_CENTER; break; } setAnm(sGuardNames[mGuardDirection], 3.0); } @@ -1641,7 +1621,7 @@ void dAcBlastboss_c::initializeState_GuardBreak() { } void dAcBlastboss_c::executeState_GuardBreak() { if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); mTimers[TIMER_4] = 15; } @@ -1666,7 +1646,7 @@ void dAcBlastboss_c::executeState_Damage() { dAcPy_c *link = dAcPy_c::GetLinkM(); sLib::addCalcScaled(&mSpeed, 1.0f, 2.0f); if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); mTimers[TIMER_4] = 15; mTimers[TIMER_2] = 0; } @@ -1708,7 +1688,7 @@ void dAcBlastboss_c::executeState_SitDamage() { } case SUB_STATE_2: { if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); mTimers[TIMER_4] = 15; } checkForCounter(); @@ -1853,7 +1833,7 @@ void dAcBlastboss_c::executeState_Down() { field_0x1131 = 2; } if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); mTimers[TIMER_4] = 15; } break; @@ -1884,10 +1864,10 @@ void dAcBlastboss_c::executeState_Down() { mSubState = SUB_STATE_20; } else { if (field_0x113B >= 3 && mXZDistanceToLink < 500.0f) { - mStateMgr.changeState(StateID_Attack); + changeState(StateID_Attack); mMdl.setFrame(10.0f); } else { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); mTimers[TIMER_4] = 15; } } @@ -1913,7 +1893,7 @@ void dAcBlastboss_c::executeState_Down() { case SUB_STATE_21: { mIsDown = false; if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); mTimers[TIMER_4] = 15; mLightingStrikeState = LIGHTNING_STRIKE_FINISH; } @@ -1978,7 +1958,7 @@ void dAcBlastboss_c::executeState_Stun() { } } if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); } break; } @@ -2018,7 +1998,7 @@ void dAcBlastboss_c::executeState_ThunderWait() { } case SUB_STATE_1: { if (link->checkSwordAndMoreStates(0x400000)) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); } else if (mTimers[TIMER_0] == 0) { dLightEnv_c::GetPInstance()->setField_0x38DC(7); mSubState = SUB_STATE_5; @@ -2045,7 +2025,7 @@ void dAcBlastboss_c::executeState_ThunderWait() { checkForCounter(); } if (mMdl.getAnm().isStop()) { - mStateMgr.changeState(StateID_Fight); + changeState(StateID_Fight); } break; } @@ -2060,25 +2040,21 @@ bool dAcBlastboss_c::checkDamage() { mMtx_c mtx; mHealth = 400; - // TODO: typing crime - cCcD_Obj *atHit = mSwordMdl.mCcList.find((dColliderLinkedList::ccPtmf)&dCcD_Check::ChkAtHit); + cCcD_Obj *atHit = mSwordMdl.mCcList.findAtHit(); if (atHit != nullptr && atHit->GetAtFlag0x8()) { field_0x113E = 20; } if (sLib::calcTimer(&field_0x1134) == 0) { - // TODO: regswap between unk and link. - // Making this a u16 or s16 fixes regalloc but breaks instructions... s32 unk = someEnemyDamageCollisionStuffMaybe(mCcList, nullptr); - // TODO: typing crime - cCcD_Obj *tgHit = mCcList.find((dColliderLinkedList::ccPtmf)&dCcD_Check::ChkTgHit); + cCcD_Obj *tgHit = mCcList.findTgHit(); if (tgHit == nullptr) { return false; } - dAcPy_c *link = dAcPy_c::GetLinkM(); - s32 mLastAttackDirection = link->getSpecificAttackDirection(); + s32 mLastAttackDirection = dAcPy_c::GetLinkM()->getSpecificAttackDirection(); + const dAcPy_c *link = dAcPy_c::GetLink(); // TODO: enum? switch (unk) { @@ -2096,19 +2072,19 @@ bool dAcBlastboss_c::checkDamage() { MTXMultVec(mtx, v, v2); mAttackKnockbackX = v2.x; mAttackKnockbackZ = v2.z; - mStateMgr.changeState(StateID_Stun); + changeState(StateID_Stun); break; } if (tgHit->ChkTgAtHitType(AT_TYPE_0x800000)) { mGuardDirection = GUARD_UP; - mStateMgr.changeState(StateID_Guard); + changeState(StateID_Guard); break; } mMdlCallback.field_0x04.set(7); if (field_0x113F != 0) { mSubState = SUB_STATE_1; - mStateMgr.changeState(StateID_CounterAttack); + changeState(StateID_CounterAttack); break; } else if (mGuardDirection == GUARD_BT) { if (classifyAttackDirection(mLastAttackDirection) == classifyAttackDirection(mLastAttackDir)) { @@ -2118,7 +2094,7 @@ bool dAcBlastboss_c::checkDamage() { } if (mNumConsecutiveSameDirectionAttacks >= 2) { mSubState = SUB_STATE_1; - mStateMgr.changeState(StateID_CounterAttack); + changeState(StateID_CounterAttack); break; } @@ -2132,7 +2108,7 @@ bool dAcBlastboss_c::checkDamage() { mMdlCallback.field_0x18 -= 0x7D0; } if (mNumConsecutiveOppositeDirectionAttacks >= 1) { - mStateMgr.changeState(StateID_GuardBreak); + changeState(StateID_GuardBreak); } } else if (mLastAttackDir >= 0) { if (classifyAttackDirection(mLastAttackDirection) == classifyAttackDirection(mLastAttackDir)) { @@ -2148,7 +2124,7 @@ bool dAcBlastboss_c::checkDamage() { (mSecondLastAttackDirection >= 0 && (classifyAttackDirection(mSecondLastAttackDirection) & 2) == (classifyAttackDirection(mLastAttackDirection) & 2))) { mSubState = SUB_STATE_0; - mStateMgr.changeState(StateID_CounterAttack); + changeState(StateID_CounterAttack); } else { if (mNumConsecutiveOppositeDirectionAttacks >= 1) { field_0x113E = 25; @@ -2176,7 +2152,7 @@ bool dAcBlastboss_c::checkDamage() { tgHit->ChkTgAtHitType(AT_TYPE_BOMB) || tgHit->ChkTgAtHitType(AT_TYPE_ARROW) || tgHit->ChkTgAtHitType(AT_TYPE_WHIP) || tgHit->ChkTgAtHitType(AT_TYPE_0x40))) { mGuardDirection = GUARD_UP; - mStateMgr.changeState(StateID_Guard); + changeState(StateID_Guard); if (tgHit->ChkTgAtHitType(AT_TYPE_BOMB)) { field_0x11A4 = 30.0f; @@ -2202,7 +2178,7 @@ bool dAcBlastboss_c::checkDamage() { MTXMultVec(mtx, v, v2); mAttackKnockbackX = v2.x; mAttackKnockbackZ = v2.z; - mStateMgr.changeState(StateID_Stun); + changeState(StateID_Stun); break; } @@ -2214,22 +2190,22 @@ bool dAcBlastboss_c::checkDamage() { if (mIsPhaseTwo >= 0) { if (field_0x1152 == 30) { dStageMgr_c::GetInstance()->fn_80199B60(4); - mStateMgr.changeState(StateID_Down); + changeState(StateID_Down); mLightingStrikeState = LIGHTNING_STRIKE_START_DEMO; startSound(SE_BLasBos_DownHit); break; } } else { if (field_0x1152 == 50) { - mStateMgr.changeState(StateID_Down); + changeState(StateID_Down); field_0x1152 = 45; break; } } - if ((!field_0x113E && (mStateMgr.isState(StateID_Attack) || mStateMgr.isState(StateID_SmallAttack) || - mStateMgr.isState(StateID_CounterAttack))) || - mStateMgr.isState(StateID_ThunderWait)) { + if ((!field_0x113E && + (isState(StateID_Attack) || isState(StateID_SmallAttack) || isState(StateID_CounterAttack))) || + isState(StateID_ThunderWait)) { field_0x1188 = 10; break; } @@ -2239,7 +2215,7 @@ bool dAcBlastboss_c::checkDamage() { break; } - if (mStateMgr.isState(StateID_Stun)) { + if (isState(StateID_Stun)) { mNumConsecutiveSameDirectionAttacks = 0; mSecondLastAttackDirection = mLastAttackDirection; mChanceAttackCounter++; @@ -2269,7 +2245,7 @@ bool dAcBlastboss_c::checkDamage() { break; } - if (mStateMgr.isState(StateID_SitDamage)) { + if (isState(StateID_SitDamage)) { mNumConsecutiveSameDirectionAttacks = 0; mSecondLastAttackDirection = mLastAttackDirection; mChanceAttackCounter++; @@ -2279,12 +2255,12 @@ bool dAcBlastboss_c::checkDamage() { mChanceAttackCounter = 0; field_0x1152 = 30; dStageMgr_c::GetInstance()->fn_80199B60(4); - mStateMgr.changeState(StateID_Down); + changeState(StateID_Down); mLightingStrikeState = LIGHTNING_STRIKE_START_DEMO; startSound(SE_BLasBos_DownHit); break; } - mStateMgr.changeState(StateID_Down); + changeState(StateID_Down); field_0x1152 = 45; break; } @@ -2315,10 +2291,10 @@ bool dAcBlastboss_c::checkDamage() { } if (mChanceAttackCounter >= 3) { - mStateMgr.changeState(StateID_SitDamage); + changeState(StateID_SitDamage); mChanceAttackCounter = 0; } else { - mStateMgr.changeState(StateID_Damage); + changeState(StateID_Damage); } mNumConsecutiveSameDirectionAttacks = -1; @@ -2384,7 +2360,7 @@ bool dAcBlastboss_c::checkForCloseRangeAttack() { if (mXZDistanceToLink < 500.0f) { if (mIsPhaseTwo != 0) { if (mTimers[TIMER_2] == 0) { - mStateMgr.changeState(StateID_Attack); + changeState(StateID_Attack); ret = true; } } else { @@ -2394,14 +2370,14 @@ bool dAcBlastboss_c::checkForCloseRangeAttack() { mLinkCloseRangeShieldTime = 0; } if (mLinkCloseRangeShieldTime > 40) { - mStateMgr.changeState(StateID_PunchAttack); + changeState(StateID_PunchAttack); ret = true; } else if (mTimers[TIMER_2] == 0) { if (checkForLinkSwordBySwordHit() && cM::rnd() < 0.35f) { - mStateMgr.changeState(StateID_SmallAttack); + changeState(StateID_SmallAttack); ret = true; } else { - mStateMgr.changeState(StateID_Attack); + changeState(StateID_Attack); ret = true; } mLinkCloseRangeShieldTime = 0; @@ -2428,27 +2404,27 @@ bool dAcBlastboss_c::checkForRangeAttack() { if (mIsPhaseTwo != 0) { if (field_0x1162 >= 20) { - mStateMgr.changeState(StateID_DashAttack); + changeState(StateID_DashAttack); return true; } else if (mIsSwordEmpowered) { if ((link->checkSwordAndMoreStates(0x400000) && mStunCounter != 0) || (mXZDistanceToLink < 1500.0f && mTimers[TIMER_3] == 0)) { - mStateMgr.changeState(StateID_ThunderAttack); + changeState(StateID_ThunderAttack); ret = true; } } else { if (link->checkSwordAndMoreStates(0x400000)) { if ((mCounter & 0x7) == 0 && mStunCounter != 0) { - mStateMgr.changeState(StateID_DashAttack); + changeState(StateID_DashAttack); ret = true; } } else { if (mXZDistanceToLink < 1500.0f && dLightEnv_c::GetPInstance()->getField_0x38DC() == 6) { if (field_0x1162 > 10) { - mStateMgr.changeState(StateID_DashAttack); + changeState(StateID_DashAttack); ret = true; } else { - mStateMgr.changeState(StateID_ThunderWait); + changeState(StateID_ThunderWait); ret = true; } } @@ -2482,12 +2458,12 @@ bool dAcBlastboss_c::checkForCounter() { s32 attackDir = link->getSpecificAttackDirection(); - if (mStateMgr.isState(StateID_Attack)) { + if (isState(StateID_Attack)) { if (mpCurrentAnm == "AttackR" && - (attackDir == CUT_DIR_L || attackDir == CUT_DIR_LD || attackDir == CUT_DIR_LU)) { + (attackDir == CUT_DIR_L || attackDir == CUT_DIR_LD || attackDir == CUT_DIR_LU)) { mGuardDirection = GUARD_RIGHT; } else if (mpCurrentAnm == "AttackL" && - (attackDir == CUT_DIR_R || attackDir == CUT_DIR_RD || attackDir == CUT_DIR_RU)) { + (attackDir == CUT_DIR_R || attackDir == CUT_DIR_RD || attackDir == CUT_DIR_RU)) { mGuardDirection = GUARD_LEFT; } else if (mpCurrentAnm == "AttackU" && attackDir == CUT_DIR_U) { mGuardDirection = GUARD_UP; @@ -2495,7 +2471,7 @@ bool dAcBlastboss_c::checkForCounter() { return false; } - mStateMgr.changeState(StateID_Guard); + changeState(StateID_Guard); mSubState = SUB_STATE_10; } else { if ((mIsPhaseTwo > 0 || mXZDistanceToLink < 200.0f) && mNumConsecutiveOppositeDirectionAttacks < 1) { @@ -2511,10 +2487,10 @@ bool dAcBlastboss_c::checkForCounter() { case CUT_DIR_LU: mGuardDirection = GUARD_UPRIGHT; break; case CUT_DIR_LD: mGuardDirection = GUARD_DOWNRIGHT; break; case CUT_DIR_D: mGuardDirection = GUARD_DOWN; break; - default: mGuardDirection = GUARD_CENTER; break; + default: mGuardDirection = GUARD_CENTER; break; } - if (!mStateMgr.isState(StateID_Guard)) { - mStateMgr.changeState(StateID_Guard); + if (!isState(StateID_Guard)) { + changeState(StateID_Guard); } mSubState = SUB_STATE_0; @@ -2629,7 +2605,6 @@ void dAcBlastboss_c::updateMainNodeTransforms() { sLib::addCalcAngle(mMdlCallback.field_0x1A.ref(), 0, 4, 400); } } - void dAcBlastboss_c::updateSkirtHairTransforms() { static const u16 sNodeIds[] = { B_LAST_BOSS_NODE_skirtAU1, B_LAST_BOSS_NODE_skirtBU1, B_LAST_BOSS_NODE_skirtCU1, B_LAST_BOSS_NODE_skirtDU1, @@ -2678,14 +2653,11 @@ void dAcBlastboss_c::updateSkirtHairTransforms() { MTXMultVec(mtx, t, field_0x1268[i].field_0x014[0]); field_0x1268[i].field_0x014[0] += v; if (nw4r::math::FAbs(field_0x1268[i].field_0x010) < 1.0f) { - // TODO - regswaps between tmp and abs result - f32 tmp = field_0x1268[(i + 1) & 7].field_0x010; - if (nw4r::math::FAbs(tmp) > 1.0f) { - field_0x1268[i].field_0x010 = tmp * 0.5f; + if (nw4r::ut::Abs(field_0x1268[(i + 1) & 7].field_0x010) > 1.0f) { + field_0x1268[i].field_0x010 = field_0x1268[(i + 1) & 7].field_0x010 * 0.5f; } - tmp = field_0x1268[(i - 1) & 7].field_0x010; - if (nw4r::math::FAbs(tmp) > 1.0f) { - field_0x1268[i].field_0x010 = tmp * 0.5f; + if (nw4r::ut::Abs(field_0x1268[(i - 1) & 7].field_0x010) > 1.0f) { + field_0x1268[i].field_0x010 = field_0x1268[(i - 1) & 7].field_0x010 * 0.5f; } } @@ -2938,56 +2910,56 @@ void dAcBlastboss_c::updateHairTransform(s32 level) { mtx.YrotS(cc.field_0x002); mtx.XrotM(cc.field_0x004); - MTXMultVec(mtx, t2, t2); + mtx.multVec(t2, t2); - f32 f1 = field_0x11B8; + f32 f13; + f32 fX2; f32 f2 = -field_0x11B8; + f32 fZ2; f32 f4 = 0.9f; f32 fAdd = -5.0f; + f32 f1 = field_0x11B8; f32 fScale = 1.0f; for (u32 i = 1; i < 5; i++, v1++, v2++, v3++) { v.x = f1 * mAng(mCounter * 12000 - (i * 20000)).sin(); v.y = f1 * mAng(mCounter * 10000 - (i * 20000)).sin(); v.z = f2; - v.x += mAng(mCounter * 10000 - (i * 20000)).sin() * fScale; - v.y += mAng(mCounter * 12000 - (i * 20000)).sin() * fScale; - MTXMultVec(mtx, v, v); - + v.x += fScale * mAng(mCounter * 10000 - (i * 20000)).sin(); + v.y += fScale * mAng(mCounter * 12000 - (i * 20000)).sin(); + mtx.multVec(v, v); f1 *= 1.6f; - f32 f13; if (field_0x113D != 0) { - f13 = fAdd + v1[0].y + t2.y + v3[0].y + v.y; - if (f13 < mPositionCopy2.y) { - f13 = mPositionCopy2.y; + f32 f = v1[0].y + fAdd + t2.y + v3[0].y + v.y; + if (f < mPositionCopy2.y) { + f = mPositionCopy2.y; } - f13 = f13 - v1[-1].y; + f13 = f - v1[-1].y; } else if (mIsDown) { - f13 = fAdd + v1[0].y + v3[0].y; - if (f13 <= 0.0f) { - f13 = 0.0f; + f32 f = v1[0].y + fAdd + v3[0].y; + if (f <= 0.0f) { + f = 0.0f; } - f13 = f13 - v1[-1].y; + f13 = f - v1[-1].y; v.set(0.0f, 0.0f, 0.0f); } else { - f13 = fAdd + (v1[0].y - v1[-1].y) + t2.y + v3[0].y + v.y; + f13 = (v1[0].y - v1[-1].y) + fAdd + t2.y + v3[0].y + v.y; } - f32 fX2 = (v1[0].x - v1[-1].x) + t2.x + v3[0].x + v.x; - f32 fZ2 = (v1[0].z - v1[-1].z) + t2.z + v3[0].z + v.z; + fX2 = (v1[0].x - v1[-1].x) + t2.x + v3[0].x + v.x; + fZ2 = (v1[0].z - v1[-1].z) + t2.z + v3[0].z + v.z; t2.x *= 0.6f; t2.y *= 0.6f; t2.z *= 0.6f; v2[0].y = cM::atan2s(fX2, fZ2); - f32 f8 = nw4r::math::FSqrt(fX2 * fX2 + fZ2 * fZ2); - v2[0].x = -cM::atan2s(f13, f8); + v2[0].x = -cM::atan2s(f13, nw4r::math::FSqrt(fX2 * fX2 + fZ2 * fZ2)); v2[0].z = cc.field_0x006; mtx2.YrotS(v2[0].y); mtx2.XrotM(v2[0].x); - MTXMultVec(mtx2, t1, v); + mtx2.multVec(t1, v); v3[0] = v1[0]; v1[0] = v1[-1] + v; @@ -3027,6 +2999,10 @@ bool dAcBlastboss_c::checkForLinkSwordBySwordHit() { return ret; } +inline f32 getScale() { + s32 scale = 95; + return scale / 100.0f; +} u8 dAcBlastboss_c::classifyAttackDirection(s32 attackDir) { switch (attackDir) { case CUT_DIR_R: @@ -3042,7 +3018,7 @@ u8 dAcBlastboss_c::classifyAttackDirection(s32 attackDir) { case CUT_DIR_STAB: return 4; - default: return -1; + default: return -1; } } @@ -3288,9 +3264,7 @@ void dAcBlastboss_c::executeLightningStrike() { cam->setEventCamView(tmp1, field_0x2D04, field_0x2CFC, 0.0f); if (b2) { mtx1.transS(0.5f, 0.5f, 0.0f); - // REGSWAP - s32 scale = 95; - mtx1.scaleM(scale / 100.0f, scale / 100.0f, 0.0f); + mtx1.scaleM(getScale(), getScale(), 0.0f); mtx1.transM(-0.5f, -0.5f, 0.0f); dStageMgr_c::GetInstance()->procfn_800192F0(0x96, mtx1, 0x32); }