d_a_b_lastboss remove typing crime

This commit is contained in:
elijah-thomas774
2026-09-28 14:24:03 -04:00
parent 7bab8b97b8
commit 785bb10922
4 changed files with 124 additions and 147 deletions
@@ -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
+10
View File
@@ -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<dCcD_Sph> 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);
-7
View File
@@ -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;
+112 -138
View File
@@ -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);
}