summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-12-31 15:34:40 +0100
committerrobojumper <robojumper@gmail.com>2026-01-28 19:14:17 +0100
commit85be0bc8f0da5a8c2c5b8b1d9782f26365adba0c (patch)
tree740ea13f859536680e34a74e7b720c0bdf953cd0
parentf6ac925487969efbecef775fae10365fee2cb037 (diff)
State funcs done
-rw-r--r--include/d/a/b/d_a_b_lastboss.h32
-rw-r--r--include/d/a/e/d_a_en_base.h12
-rw-r--r--include/d/col/c/c_cc_d.h4
-rw-r--r--src/REL/d/a/b/d_a_b_lastboss.cpp561
-rw-r--r--src/REL/d/a/e/d_a_e_sm.cpp8
5 files changed, 532 insertions, 85 deletions
diff --git a/include/d/a/b/d_a_b_lastboss.h b/include/d/a/b/d_a_b_lastboss.h
index e1831a06..404b9723 100644
--- a/include/d/a/b/d_a_b_lastboss.h
+++ b/include/d/a/b/d_a_b_lastboss.h
@@ -205,15 +205,20 @@ class dAcBlastboss_c : public dAcEnBase_c {
// TODO: mFightState probably means different things in
// different states, so maybe we need to either remove
// this again or split this up further.
- enum FightState_e {
- FIGHT_STATE_0 = 0,
- FIGHT_STATE_1,
- FIGHT_STATE_2,
- FIGHT_STATE_3,
- FIGHT_STATE_4,
-
- FIGHT_STATE_10 = 10,
- FIGHT_STATE_11,
+ enum SubState_e {
+ SUB_STATE_0 = 0,
+ SUB_STATE_1,
+ SUB_STATE_2,
+ SUB_STATE_3,
+ SUB_STATE_4,
+ SUB_STATE_5,
+ SUB_STATE_6,
+
+ SUB_STATE_10 = 10,
+ SUB_STATE_11,
+
+ SUB_STATE_20 = 20,
+ SUB_STATE_21,
};
public:
@@ -311,7 +316,7 @@ private:
/* 0x1162 */ u8 _0x1162[0x1164 - 0x1162];
/* 0x1164 */ s16 field_0x1164;
- /* 0x1166 */ s16 mFightState;
+ /* 0x1166 */ s16 mSubState;
/* 0x1168 */ u8 _0x1168[0x116A - 0x1168];
@@ -359,8 +364,9 @@ private:
/* 0x11BC */ f32 field_0x11BC;
/* 0x11C0 */ f32 field_0x11C0;
- /* 0x11C4 */ u8 _0x11C4[0x11CC - 0x11C4];
+ /* 0x11C4 */ u8 _0x11C4[0x11C8 - 0x11C4];
+ /* 0x11CC */ f32 field_0x11C8;
/* 0x11CC */ f32 field_0x11CC;
/* 0x11D0 */ u8 _0x11D0[0x11D4 - 0x11D0];
@@ -393,7 +399,9 @@ private:
/* 0x2C9C */ dEmitter_c mEmitter7;
/* 0x2CD0 */ LIGHT_INFLUENCE mLightInfo;
/* 0x2CEC */ s16 field_0x2CEC;
- /* 0x2CEE */ u8 _0x2CEE[0x2D1C - 0x2CEE];
+ /* 0x2CEE */ u8 _0x2CEE[0x2D00 - 0x2CEE];
+ /* 0x2D00 */ f32 field_0x2D00;
+ /* 0x2D04 */ u8 _0x2D04[0x2D1C - 0x2D04];
/* 0x2D1C */ const char *mpCurrentAnm;
/* 0x2D20 */ dTgSwordBattleGame_c *mpSwordBattleGame;
};
diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h
index 10cb60d1..6bd97f91 100644
--- a/include/d/a/e/d_a_en_base.h
+++ b/include/d/a/e/d_a_en_base.h
@@ -16,6 +16,14 @@ struct dAcEnData {
// non-official name
class dAcEnBase_c : public dAcObjBase_c {
public:
+ enum InteractionFlags_e {
+ INTERACT_0x1 = (1 << 0),
+ INTERACT_0x4 = (1 << 2),
+ INTERACT_0x40 = (1 << 6),
+ INTERACT_0x1000 = (1 << 12),
+ };
+
+public:
dAcEnBase_c();
virtual ~dAcEnBase_c();
@@ -36,7 +44,9 @@ public:
/* 0x33C */ u32 mInteractionFlags;
/* 0x340 */ u16 field_0x338;
/* 0x342 */ u16 mHealth;
- /* 0x344 */ u8 _344[0x374 - 0x344];
+ /* 0x344 */ u8 _344[0x358 - 0x344];
+ /* 0x358 */ mVec3_c mFinalBlowPosition;
+ /* 0x364 */ u8 _364[0x374 - 0x364];
/* 0x374 */ dAcEnData *mpEnemyData;
bool checkInteractionFlags(u32 mask) {
diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h
index 06b81841..b4f7f4f2 100644
--- a/include/d/col/c/c_cc_d.h
+++ b/include/d/col/c/c_cc_d.h
@@ -843,6 +843,7 @@ public:
mAt.SetRPrm(f);
}
+ // Related to directional attacks?
void SetTgFlag_0xA(u16 flag) {
mTg.SetFlag_0xA(flag);
}
@@ -986,6 +987,9 @@ public:
void OnTgElectric() {
return mTg.OnSPrm(0x40000);
}
+ void OnTg_0x8000000() {
+ return mTg.OnSPrm(0x8000000);
+ }
void ClrTgElectric() {
return mTg.OffSPrm(0x40000);
}
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 a16ed5e3..fb4737fb 100644
--- a/src/REL/d/a/b/d_a_b_lastboss.cpp
+++ b/src/REL/d/a/b/d_a_b_lastboss.cpp
@@ -305,7 +305,7 @@ int dAcBlastboss_c::actorExecute() {
mRotation.x = mAngle.x;
mRotation.z = mAngle.z;
- sLib::addCalcAngle(&mRotation.y.mVal, mAngle.y, 2, 0x800);
+ sLib::addCalcAngle(mRotation.y.ref(), mAngle.y, 2, 0x800);
mMdl.play();
if (!field_0x114F) {
@@ -938,7 +938,7 @@ void dAcBlastboss_c::callback_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *m
void dAcBlastboss_c::initializeState_Fight() {
setAnm("WaitBt", 20.0f);
mAnmRate = 1.0f;
- mFightState = FIGHT_STATE_0;
+ mSubState = SUB_STATE_0;
field_0x118A = 0;
if (field_0x1149 == 0) {
field_0x1156[2] = cM::rndF(50.0f) + 50.0f;
@@ -962,17 +962,17 @@ void dAcBlastboss_c::executeState_Fight() {
field_0x1156[2] = cM::rndF(50.0f) + 100.0f;
}
- switch (mFightState) {
- case FIGHT_STATE_0: {
+ switch (mSubState) {
+ case SUB_STATE_0: {
b = true;
field_0x118C = 0;
targetAnmRate = 1.0f;
field_0x117E = 0;
if (mXZDistanceToLink > puVar2 + 450.0f) {
- mFightState = FIGHT_STATE_2;
+ mSubState = SUB_STATE_2;
break;
} else if (mXZDistanceToLink < puVar2 + 250.0f + 100.0f) {
- mFightState = FIGHT_STATE_1;
+ mSubState = SUB_STATE_1;
field_0x1156[0] = 8;
mAnmRate = -1.0f;
field_0x1180 = 0;
@@ -981,7 +981,7 @@ void dAcBlastboss_c::executeState_Fight() {
setAnm("WaitBt", 20.0f);
mAnmRate = 1.0f;
if (diff < -0x1000 || diff > 0x1000) {
- mFightState = FIGHT_STATE_4;
+ mSubState = SUB_STATE_4;
if (diff < 0) {
setAnm("TurnL", 10.0f);
} else {
@@ -991,7 +991,7 @@ void dAcBlastboss_c::executeState_Fight() {
break;
}
}
- case FIGHT_STATE_1: {
+ case SUB_STATE_1: {
b = true;
setAnm("WalkBt", 20.0f);
targetSpeed = -5.0f;
@@ -1003,15 +1003,15 @@ void dAcBlastboss_c::executeState_Fight() {
return;
}
} else if (mXZDistanceToLink >= puVar2 + 200.0f && field_0x1156[0] == 0) {
- mFightState = FIGHT_STATE_0;
+ mSubState = SUB_STATE_0;
}
break;
}
- case FIGHT_STATE_2: {
+ case SUB_STATE_2: {
b = true;
field_0x117E = 0;
if (mXZDistanceToLink > puVar2 + 850.0f) {
- mFightState = FIGHT_STATE_3;
+ mSubState = SUB_STATE_3;
} else {
setAnm("WalkBt", 20.0f);
if (mMdl.getAnm().getFrame() >= 25.0f && mMdl.getAnm().getFrame() <= 50.0f) {
@@ -1021,7 +1021,7 @@ void dAcBlastboss_c::executeState_Fight() {
targetAnmRate = 1.5f;
}
if (mXZDistanceToLink < puVar2 + 400.0f) {
- mFightState = FIGHT_STATE_0;
+ mSubState = SUB_STATE_0;
if (field_0x1149 == 0) {
field_0x1156[2] = cM::rndF(50.0f) + 50.0f;
} else {
@@ -1030,13 +1030,13 @@ void dAcBlastboss_c::executeState_Fight() {
}
break;
}
- case FIGHT_STATE_3: {
+ case SUB_STATE_3: {
setAnm("Walk", 20.0f);
targetSpeed = 7.5f;
field_0x11A4 = 7.5f;
targetAnmRate = 1.0f;
if (mXZDistanceToLink < puVar2 + 750.0f) {
- mFightState = FIGHT_STATE_2;
+ mSubState = SUB_STATE_2;
} else if (!link->isRecovering()) {
field_0x117E++;
if (field_0x117E > 70) {
@@ -1048,11 +1048,11 @@ void dAcBlastboss_c::executeState_Fight() {
}
break;
}
- case FIGHT_STATE_4: {
+ case SUB_STATE_4: {
field_0x117E = 0;
b = true;
if (mMdl.getAnm().isStop()) {
- mFightState = FIGHT_STATE_0;
+ mSubState = SUB_STATE_0;
}
break;
}
@@ -1062,7 +1062,7 @@ void dAcBlastboss_c::executeState_Fight() {
setAnmRate(mAnmRate);
sLib::addCalcScaledDiff(&mSpeed, targetSpeed, 1.0f, 2.0f);
- if (mFightState != FIGHT_STATE_0) {
+ if (mSubState != SUB_STATE_0) {
sLib::addCalcAngle(field_0x118C.ref(), 0x800, 1, 100);
sLib::addCalcAngle(mAngle.y.ref(), mYAngleToLink, 2, field_0x118C);
}
@@ -1115,7 +1115,7 @@ void dAcBlastboss_c::executeState_Fight() {
}
if (field_0x1156[4] == 1) {
- field_0x1178 = 0x28;
+ field_0x1178 = 40;
} else if (field_0x1156[4] <= 10) {
field_0x1136 = 0;
field_0x1135 = 0;
@@ -1127,7 +1127,7 @@ void dAcBlastboss_c::finalizeState_Fight() {}
void dAcBlastboss_c::initializeState_Attack() {
f32 rnd = cM::rnd();
- mFightState = FIGHT_STATE_0;
+ mSubState = SUB_STATE_0;
if (rnd < 0.3333f) {
setAnm("AttackU", 5.0f);
} else if (rnd < 0.6666f) {
@@ -1150,8 +1150,8 @@ void dAcBlastboss_c::executeState_Attack() {
// 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);
- switch (mFightState) {
- case FIGHT_STATE_0: {
+ switch (mSubState) {
+ case SUB_STATE_0: {
if (field_0x1152 >= 15 && mMdl.getAnm().checkFrame(7.0f) && cM::rnd() < 0.1f) {
mStateMgr.changeState(StateID_Fight);
field_0x113F = 20;
@@ -1167,10 +1167,10 @@ void dAcBlastboss_c::executeState_Attack() {
field_0x113D = 10;
}
if (atHit != nullptr) {
- mFightState = FIGHT_STATE_1;
+ mSubState = SUB_STATE_1;
} else {
if (mMdl.getAnm().getFrame() > 28.0f) {
- mFightState = FIGHT_STATE_1;
+ mSubState = SUB_STATE_1;
if (field_0x113E != 0) {
setAnmRate(0.5f);
}
@@ -1179,7 +1179,7 @@ void dAcBlastboss_c::executeState_Attack() {
}
break;
}
- case FIGHT_STATE_1: {
+ case SUB_STATE_1: {
if (mMdl.getAnm().isStop()) {
mStateMgr.changeState(StateID_Fight);
}
@@ -1193,7 +1193,7 @@ void dAcBlastboss_c::executeState_Attack() {
}
if (field_0x113E != 0) {
if (field_0x1149) {
- mFightState = FIGHT_STATE_0;
+ mSubState = SUB_STATE_0;
mStateMgr.changeState(StateID_CounterAttack);
return;
}
@@ -1204,7 +1204,7 @@ void dAcBlastboss_c::executeState_Attack() {
} else if (mpCurrentAnm == "AttackL") {
mCc1.SetTgFlag_0xA(0xE0);
} else {
- mCc1.SetTgFlag_0xA(1);
+ mCc1.SetTgFlag_0xA(0x1);
}
}
fn_143_77C0();
@@ -1213,7 +1213,7 @@ void dAcBlastboss_c::finalizeState_Attack() {}
void dAcBlastboss_c::initializeState_CounterAttack() {
mSwordMdl.fn_8006B7A0(0x20000);
- if (mFightState == 0) {
+ if (mSubState == 0) {
setAnm("Counter", 5.0f);
} else {
f32 rnd = cM::rnd();
@@ -1236,7 +1236,7 @@ void dAcBlastboss_c::executeState_CounterAttack() {
f32 speed = 0.0f;
bool b = false;
field_0x1131 = 1;
- if (mFightState == FIGHT_STATE_0) {
+ if (mSubState == SUB_STATE_0) {
if (mMdl.getAnm().getFrame() < 15.0f) {
speed = -10.0f;
}
@@ -1298,7 +1298,7 @@ void dAcBlastboss_c::finalizeState_CounterAttack() {}
void dAcBlastboss_c::initializeState_PunchAttack() {
setAnm("AttackBreak", 5.0f);
mSwordMdl.fn_8006B7A0(0x20000);
- mFightState = 0;
+ mSubState = 0;
}
void dAcBlastboss_c::executeState_PunchAttack() {
f32 speed = 0.0f;
@@ -1325,7 +1325,7 @@ void dAcBlastboss_c::executeState_PunchAttack() {
void dAcBlastboss_c::finalizeState_PunchAttack() {}
void dAcBlastboss_c::initializeState_DashAttack() {
- mFightState = 0;
+ mSubState = 0;
mSwordMdl.setDamageMaybe(8);
mSwordMdl.fn_8006B7A0(0x20000);
}
@@ -1335,42 +1335,42 @@ void dAcBlastboss_c::executeState_DashAttack() {
f32 stepSize = 40.0f; // never set differently
mCc1.SetTgFlag_0xA(0x1FF);
sLib::addCalcAngle(mAngle.y.ref(), mYAngleToLink, 2, 0x1000);
- switch (mFightState) {
- case FIGHT_STATE_0: {
+ switch (mSubState) {
+ case SUB_STATE_0: {
if (mXZDistanceToLink < 400.0f) {
mStateMgr.changeState(StateID_CounterAttack);
return;
}
setAnm("AttackJumpStart", 5.0f);
mSwordMdl.fn_8006B7A0(0x20000);
- mFightState = FIGHT_STATE_1;
+ mSubState = SUB_STATE_1;
// fall-through
}
- case FIGHT_STATE_1: {
+ case SUB_STATE_1: {
if (mMdl.getAnm().getFrame() >= 23.0f) {
field_0x11A4 = 30.0f;
targetSpeed = 40.0f;
}
if (mMdl.getAnm().isStop()) {
setAnm("AttackJumpLoop", 0.0f);
- mFightState = FIGHT_STATE_2;
+ mSubState = SUB_STATE_2;
field_0x1156[0] = 200;
}
break;
}
- case FIGHT_STATE_2: {
+ case SUB_STATE_2: {
field_0x11A4 = 30.0f;
targetSpeed = 80.0f;
field_0x11B8 = 5.0f;
if (mXZDistanceToLink < 750.0f) {
setAnm("AttackJumpEnd", 0.0f);
- mFightState = FIGHT_STATE_3;
+ mSubState = SUB_STATE_3;
} else if (field_0x1156[0] == 0) {
mStateMgr.changeState(StateID_Fight);
}
break;
}
- case FIGHT_STATE_3: {
+ case SUB_STATE_3: {
if (mXZDistanceToLink > 300.0f && mMdl.getAnm().getFrame() <= 6.0f) {
targetSpeed = 80.0f;
} else {
@@ -1401,7 +1401,7 @@ void dAcBlastboss_c::finalizeState_DashAttack() {}
void dAcBlastboss_c::initializeState_SmallAttack() {
setAnm("AttackSwordBreak", 5.0f);
- mFightState = FIGHT_STATE_0;
+ mSubState = SUB_STATE_0;
}
void dAcBlastboss_c::executeState_SmallAttack() {
dAcPy_c *link = dAcPy_c::GetLinkM();
@@ -1409,8 +1409,8 @@ void dAcBlastboss_c::executeState_SmallAttack() {
f32 targetSpeed = 0.0f;
mCc1.SetTgFlag_0xA(0);
- switch (mFightState) {
- case FIGHT_STATE_0: {
+ switch (mSubState) {
+ case SUB_STATE_0: {
if (mMdl.getAnm().getFrame() >= 31.0f && mMdl.getAnm().getFrame() <= 33.0f) {
field_0x11A4 = 15.0f;
if (fn_143_9420()) {
@@ -1423,14 +1423,14 @@ void dAcBlastboss_c::executeState_SmallAttack() {
dRumble_c::start(dRumble_c::sRumblePreset4, dRumble_c::FLAG_SLOT0);
startSound(SE_BLasBos_SwordBySword);
link->onForceOrPreventActionFlags(0x80000);
- mFightState = FIGHT_STATE_1;
+ mSubState = SUB_STATE_1;
}
}
break;
}
}
- if (mMdl.getAnm().checkFrame(44.0f) && mFightState != FIGHT_STATE_1) {
+ if (mMdl.getAnm().checkFrame(44.0f) && mSubState != SUB_STATE_1) {
mStateMgr.changeState(StateID_Fight);
mpCurrentAnm = nullptr;
setAnm("WaitBt", 40.0f);
@@ -1455,7 +1455,7 @@ void dAcBlastboss_c::finalizeState_SmallAttack() {}
void dAcBlastboss_c::initializeState_ThunderAttack() {
setAnm("AttackThunder", 5.0f);
- mFightState = FIGHT_STATE_0;
+ mSubState = SUB_STATE_0;
}
void dAcBlastboss_c::executeState_ThunderAttack() {
field_0x1131 = 1;
@@ -1495,7 +1495,7 @@ void dAcBlastboss_c::executeState_ThunderAttack() {
void dAcBlastboss_c::finalizeState_ThunderAttack() {}
void dAcBlastboss_c::initializeState_Guard() {
- mFightState = FIGHT_STATE_0;
+ mSubState = SUB_STATE_0;
mMdlCallback.field_0x30 = 0.0f;
mMdlCallback.field_0x18 = 0;
}
@@ -1508,12 +1508,23 @@ void dAcBlastboss_c::executeState_Guard() {
"GuardR", "GuardRU", "GuardRD", "GuardL", "GuardLU", "GuardLD", "GuardU", "GuardD", "GuardC", "WaitBt",
};
- static const u32 sGuardFlags[] = {0xE, 0xE, 0x1E, 0xE0, 0xE0, 0xF0, 0x83, 0x38, 0x100, 0x1FF};
+ static const u32 sGuardFlags[] = {
+ 0x8 | 0x4 | 0x2,
+ 0x8 | 0x4 | 0x2,
+ 0x10 | 0x8 | 0x4 | 0x2,
+ 0x80 | 0x40 | 0x20,
+ 0x80 | 0x40 | 0x20,
+ 0x80 | 0x40 | 0x20 | 0x10,
+ 0x80 | 0x2 | 0x1,
+ 0x20 | 0x10 | 0x8,
+ 0x100,
+ 0x100 | 0x80 | 0x40 | 0x20 | 0x10 | 0x8 | 0x4 | 0x2 | 0x1,
+ };
- switch (mFightState) {
- case FIGHT_STATE_0: {
+ switch (mSubState) {
+ case SUB_STATE_0: {
if (link->isAttackingJumpSlash()) {
- mFightState = FIGHT_STATE_2;
+ mSubState = SUB_STATE_2;
setAnm("WalkBt", 2.0f);
setAnmRate(-2.0f);
field_0x1156[0] = 5;
@@ -1525,11 +1536,11 @@ void dAcBlastboss_c::executeState_Guard() {
} else {
setAnm(sGuardNames[field_0x1144], 3.0f);
}
- mFightState = FIGHT_STATE_1;
+ mSubState = SUB_STATE_1;
// fall-through
}
}
- case FIGHT_STATE_1: {
+ case SUB_STATE_1: {
if (link->isAttackingSpin()) {
field_0x1156[0] = 5;
}
@@ -1550,17 +1561,17 @@ void dAcBlastboss_c::executeState_Guard() {
}
break;
}
- case FIGHT_STATE_2: {
+ case SUB_STATE_2: {
field_0x11A4 = 20.0f;
targetSpeed = -30.0f;
if (field_0x1156[0] == 0) {
field_0x1144 = 6;
forceSetAnm(sGuardNames[field_0x1144], 3.0);
- mFightState = FIGHT_STATE_1;
+ mSubState = SUB_STATE_1;
}
break;
}
- case FIGHT_STATE_10: {
+ case SUB_STATE_10: {
if (field_0x1144 == 0) {
setAnm("AttackRGuard", 3.0f);
} else if (field_0x1144 == 3) {
@@ -1568,10 +1579,10 @@ void dAcBlastboss_c::executeState_Guard() {
} else {
setAnm("GuardU", 3.0f);
}
- mFightState = FIGHT_STATE_11;
+ mSubState = SUB_STATE_11;
// fall-through
}
- case FIGHT_STATE_11: {
+ case SUB_STATE_11: {
if (mMdl.getAnm().getFrame() >= 13.0f) {
mStateMgr.changeState(StateID_Fight);
field_0x1156[4] = 15;
@@ -1608,28 +1619,442 @@ void dAcBlastboss_c::executeState_Guard() {
}
void dAcBlastboss_c::finalizeState_Guard() {}
-void dAcBlastboss_c::initializeState_GuardBreak() {}
-void dAcBlastboss_c::executeState_GuardBreak() {}
+void dAcBlastboss_c::initializeState_GuardBreak() {
+ s32 side;
+ s32 attackDir = dAcPy_c::GetLinkM()->getSpecificAttackDirection();
+ if (attackDir == daPlayerActBase_c::ATTACK_DIRECTION_LEFT ||
+ attackDir == daPlayerActBase_c::ATTACK_DIRECTION_DOWNLEFT ||
+ attackDir == daPlayerActBase_c::ATTACK_DIRECTION_UPLEFT) {
+ side = 0;
+ } else if (attackDir == daPlayerActBase_c::ATTACK_DIRECTION_RIGHT ||
+ attackDir == daPlayerActBase_c::ATTACK_DIRECTION_DOWNRIGHT ||
+ attackDir == daPlayerActBase_c::ATTACK_DIRECTION_UPRIGHT) {
+ side = 1;
+ } else {
+ side = (s32)cM::rndF(1.99f);
+ }
+
+ if (side == 0) {
+ setAnm("GuardBreak", 5.0f);
+ } else {
+ setAnm("GuardBreakB", 5.0f);
+ }
+ mSubState = 0;
+ field_0x1156[0] = 3;
+}
+void dAcBlastboss_c::executeState_GuardBreak() {
+ if (mMdl.getAnm().isStop()) {
+ mStateMgr.changeState(StateID_Fight);
+ field_0x1156[4] = 15;
+ }
+
+ if (field_0x1156[0] == 1) {
+ mSpeed = -30.0f;
+ }
+ sLib::addCalcScaled(&mSpeed, 1.0f, 4.0f);
+ mCc1.SetTgFlag_0xA(0x1FF);
+ fn_143_77C0();
+}
void dAcBlastboss_c::finalizeState_GuardBreak() {}
-void dAcBlastboss_c::initializeState_Damage() {}
-void dAcBlastboss_c::executeState_Damage() {}
+void dAcBlastboss_c::initializeState_Damage() {
+ forceSetAnm("Damage", 5.0f);
+ mSubState = SUB_STATE_0;
+ mSpeed = -20.0f;
+ field_0x113A++;
+ field_0x1142 = 5;
+ startSound(SE_BLasBos_VO_DamageNormal);
+}
+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);
+ field_0x1156[4] = 15;
+ field_0x1156[2] = 0;
+ }
+ field_0x113E = 0;
+ if (field_0x1149 == 0 && !link->isAttackingSpin()) {
+ mCc1.SetTgFlag_0xA(0x1FF);
+ }
+ fn_143_77C0();
+}
void dAcBlastboss_c::finalizeState_Damage() {}
-void dAcBlastboss_c::initializeState_SitDamage() {}
-void dAcBlastboss_c::executeState_SitDamage() {}
+void dAcBlastboss_c::initializeState_SitDamage() {
+ setAnm("Chance", 5.0f);
+ mSubState = 0;
+ mSpeed = -20.0f;
+ field_0x113A = 0;
+ field_0x1156[0] = 80;
+ field_0x1142 = 5;
+ field_0x113C++;
+}
+void dAcBlastboss_c::executeState_SitDamage() {
+ sLib::addCalcScaled(&mSpeed, 1.0f, 2.0f);
+ switch (mSubState) {
+ case SUB_STATE_0: {
+ if (mMdl.getAnm().isStop()) {
+ setAnm("ChanceLoop", 0.0f);
+ mSubState = SUB_STATE_1;
+ }
+ break;
+ }
+ case SUB_STATE_1: {
+ if (field_0x1156[0] == 0 || field_0x113A >= 5) {
+ setAnm("ChanceReverse", 5.0f);
+ mSubState = SUB_STATE_2;
+ // fall-through
+ } else {
+ break;
+ }
+ }
+ case SUB_STATE_2: {
+ if (mMdl.getAnm().isStop()) {
+ mStateMgr.changeState(StateID_Fight);
+ field_0x1156[4] = 15;
+ }
+ fn_143_77C0();
+ mCc1.SetTgFlag_0xA(0x1FF);
+ return;
+ }
+ case SUB_STATE_5: {
+ if (field_0x1137 == 0) {
+ setAnm("ChanceDamageU", 2.0f);
+ } else if (field_0x1137 == 1) {
+ setAnm("ChanceDamageR", 2.0f);
+ } else if (field_0x1137 == 2) {
+ setAnm("ChanceDamageL", 2.0f);
+ } else {
+ setAnm("ChanceDamageD", 2.0f);
+ }
+ mSubState = SUB_STATE_6;
+ break;
+ }
+ case SUB_STATE_6: {
+ if (field_0x1156[0] == 0 || field_0x113A >= 5) {
+ setAnm("ChanceReverse", 5.0f);
+ mSubState = SUB_STATE_2;
+ // fall-through
+ } else if (mMdl.getAnm().isStop()) {
+ setAnm("ChanceLoop", 0.0f);
+ mSubState = SUB_STATE_1;
+ }
+ }
+ }
+ mCc1.SetTgFlag_0xA(0);
+}
void dAcBlastboss_c::finalizeState_SitDamage() {}
-void dAcBlastboss_c::initializeState_Down() {}
-void dAcBlastboss_c::executeState_Down() {}
+void dAcBlastboss_c::initializeState_Down() {
+ setAnm("DownBStart", 5.0f);
+ mSubState = SUB_STATE_0;
+ mSpeed = -20.0f;
+ mAcceleration = -5.0f;
+ mVelocity.y = 60.0f;
+ mIsSwordEmpowered = false;
+ mCc1.ClrTg_0x8000000();
+ mSwordMdl.fn_8006B800(0);
+}
+void dAcBlastboss_c::executeState_Down() {
+ mVec3_c v;
+ mMtx_c mtx;
+
+ field_0x1141 = 1;
+ field_0x1142 = 5;
+ bool b = false;
+ fn_143_A110(30);
+ field_0x1144 = -1;
+
+ // TODO: Are all these fall-throughs intentional??????
+ switch (mSubState) {
+ case SUB_STATE_0: {
+ if (mMdl.getAnm().isStop()) {
+ mSubState = SUB_STATE_1;
+ setAnm("DownBLoop", 0.0f);
+ field_0x11C0 = 20.0f;
+ }
+ // fall-through
+ }
+ case SUB_STATE_1: {
+ sLib::addCalcAngle(mAngle.x.ref(), -0x4000, 2, 0x300);
+ if (field_0x11BC <= -10.0f && field_0x1140) {
+ mSubState = SUB_STATE_2;
+ b = true;
+ setAnm("DownBEnd", 2.0f);
+ mVelocity.y = 30.0f;
+ } else {
+ field_0x11A4 = -30.0f;
+ break;
+ }
+ // fall-through
+ }
+ case SUB_STATE_2: {
+ if (mVelocity.y < 0.0f) {
+ field_0x11C0 = -35.0f;
+ }
+ sLib::addCalcAngle(mAngle.x.ref(), -0x4000, 2, 0x300);
+ if (field_0x11BC <= -10.0f && field_0x1140) {
+ b = true;
+ }
+ if (mMdl.getAnm().isStop()) {
+ setAnm("DownLoop", 0.0f);
+ mSubState = SUB_STATE_3;
+ if (field_0x113B >= 3 || field_0x2CEC != 0) {
+ field_0x1156[0] = 70;
+ } else if (field_0x113B == 2) {
+ field_0x1156[0] = 40;
+ } else {
+ field_0x1156[0] = 25;
+ }
+ field_0x113B++;
+ } else {
+ sLib::addCalcScaled(&mSpeed, 1.0f, 1.0f);
+ if (mSpeed < 1.0f) {
+ mFinalBlowPosition.set(mChestTranslation.x, mChestTranslation.y, mChestTranslation.z);
+ setInteractionFlags(INTERACT_0x1);
+ }
+ break;
+ }
+ // fall-through
+ }
+ case SUB_STATE_3: {
+ mFinalBlowPosition.set(mChestTranslation.x, mChestTranslation.y, mChestTranslation.z);
+ sLib::addCalcScaled(&mSpeed, 1.0f, 1.0f);
+ if (checkInteractionFlags(INTERACT_0x1000)) {
+ setAnm("End", 3.0f);
+ mSubState = 50;
+ field_0x2CEC = 100;
+ startSound(SE_BLasBos_LastHit);
+ field_0x114F = 1;
+ resetInteractionFlags(INTERACT_0x1000);
+ resetInteractionFlags(INTERACT_0x1);
+ } else if (field_0x1156[0] == 0) {
+ if (cM::rnd() < 0.5f || field_0x2CEC != 0) {
+ setAnm("DownEscapeR", 10.0f);
+ } else {
+ setAnm("DownEscapeL", 10.0f);
+ }
+ setAnmRate(0.65f);
+ mSubState = SUB_STATE_5;
+ field_0x11C8 = 0.0f;
+ resetInteractionFlags(INTERACT_0x1);
+ if (field_0x2CEC != 0) {
+ field_0x2CEC = 3;
+ field_0x2D00 = 0.0f;
+ dLightEnv_c::GetPInstance()->setField_0x38DC(1);
+ }
+ }
+ break;
+ }
+ case SUB_STATE_4: {
+ if (mMdl.getAnm().getFrame() >= 52.0f) {
+ field_0x1141 = 0;
+ sLib::addCalcAngle(mAngle.x.ref(), 0, 1, 910);
+ }
+ if (mMdl.getAnm().getFrame() >= 170.0f) {
+ field_0x1131 = 2;
+ }
+ if (mMdl.getAnm().isStop()) {
+ mStateMgr.changeState(StateID_Fight);
+ field_0x1156[4] = 15;
+ }
+ break;
+ }
+ case SUB_STATE_5: {
+ sLib::addCalcAngle(mAngle.x.ref(), 0, 1, 0x400);
+ if ((int)mMdl.getAnm().getFrame() <= 14) {
+ sLib::addCalcScaledDiff(&field_0x11C8, 15.0f, 1.0f, 5.0f);
+ field_0x11A4 = 20.0f;
+ } else {
+ field_0x1141 = 0;
+ sLib::addCalcAngle(mAngle.y.ref(), mYAngleToLink, 2, 0x800);
+ sLib::addCalcScaled(&field_0x11C8, 1.0f, 5.0f);
+ }
+ mtx.YrotS(mRotation.y);
+ if (mpCurrentAnm == "DownEscapeR") {
+ v.set(-field_0x11C8, 0.0f, 0.0f);
+ } else {
+ v.set(field_0x11C8, 0.0f, 0.0f);
+ }
+ MTXMultVec(mtx, v, v);
+ mPosition.x += v.x;
+ mPosition.z += v.z;
+
+ if (mMdl.getAnm().isStop()) {
+ if (field_0x2CEC != 0) {
+ setAnm("ThunderDemo", 10.0f);
+ mSubState = SUB_STATE_20;
+ } else {
+ if (field_0x113B >= 3 && mXZDistanceToLink < 500.0f) {
+ mStateMgr.changeState(StateID_Attack);
+ mMdl.setFrame(10.0f);
+ } else {
+ mStateMgr.changeState(StateID_Fight);
+ field_0x1156[4] = 15;
+ }
+ }
+ }
+ break;
+ }
+ case SUB_STATE_10: {
+ // TODO: Is this state ever set?
+ if (mMdl.getAnm().isStop()) {
+ setAnm("DownGetUp", 10.0f);
+ mSubState = SUB_STATE_4;
+ }
+ break;
+ }
+ case SUB_STATE_20: {
+ field_0x1141 = 0;
+ if (mMdl.getAnm().isStop()) {
+ mSubState = SUB_STATE_21;
+ setAnm("CatchThunderLoop", 0.0f);
+ }
+ break;
+ }
+ case SUB_STATE_21: {
+ field_0x1141 = 0;
+ if (mMdl.getAnm().isStop()) {
+ mStateMgr.changeState(StateID_Fight);
+ field_0x1156[4] = 15;
+ field_0x2CEC = 1000;
+ }
+ break;
+ }
+ }
+
+ if (b) {
+ v.set(0.0f, 0.0f, -100.0f);
+ mtx.YrotS(mRotation.y);
+ MTXMultVec(mtx, v, v);
+ v.x += mBackbone1Translation.x;
+ v.z += mBackbone1Translation.z;
+ v.y = 10.0f;
+
+ static mVec3_c sScale(3.0f, 3.0f, 3.0f);
+ dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_91_, v, nullptr, &sScale, nullptr, nullptr, 0, 0);
+ }
+}
void dAcBlastboss_c::finalizeState_Down() {}
-void dAcBlastboss_c::initializeState_Stun() {}
-void dAcBlastboss_c::executeState_Stun() {}
+void dAcBlastboss_c::initializeState_Stun() {
+ setAnm("Stan", 3.0f);
+ mSubState = SUB_STATE_0;
+ field_0x113A = 0;
+ field_0x1143 = 10;
+ field_0x1154++;
+ mIsSwordEmpowered = false;
+ mCc1.ClrTg_0x8000000();
+ mSwordMdl.fn_8006B800(0);
+ startSound(SE_BLasBos_HitThunderBeam);
+}
+void dAcBlastboss_c::executeState_Stun() {
+ fn_143_A110(40);
+ field_0x114B = 1;
+ int frame = mMdl.getAnm().getFrame();
+ switch (mSubState) {
+ case SUB_STATE_0: {
+ if (mMdl.getAnm().isStop()) {
+ mSubState = SUB_STATE_1;
+ setAnm("StanLoop", 0.0f);
+ field_0x1156[0] = 100;
+ }
+ break;
+ }
+ case SUB_STATE_1: {
+ if (field_0x1156[0] == 0) {
+ mSubState = SUB_STATE_2;
+ setAnm("StanReverse", 10.0f);
+ }
+ break;
+ }
+ case SUB_STATE_2: {
+ if (frame <= 58) {
+ if (frame == 58) {
+ field_0x114B = 2;
+ }
+ } else {
+ field_0x114B = 0;
+ if (frame <= 61) {
+ field_0x11A4 = 25.0f;
+ }
+ }
+ if (mMdl.getAnm().isStop()) {
+ mStateMgr.changeState(StateID_Fight);
+ }
+ break;
+ }
+ }
+
+ sLib::addCalcScaled(&mSpeed, 1.0f, 10.0f);
+ if (field_0x113A >= 7) {
+ mCc1.SetTgFlag_0xA(0x1FF);
+ fn_143_77C0();
+ } else {
+ if (field_0x1143 != 0) {
+ mCc1.SetTgFlag_0xA(0x1FF);
+ } else {
+ mCc1.SetTgFlag_0xA(0);
+ }
+ }
+}
void dAcBlastboss_c::finalizeState_Stun() {}
-void dAcBlastboss_c::initializeState_ThunderWait() {}
-void dAcBlastboss_c::executeState_ThunderWait() {}
+void dAcBlastboss_c::initializeState_ThunderWait() {
+ setAnm("CatchThunderStart", 10.0f);
+ mSubState = SUB_STATE_0;
+ field_0x1144 = -1;
+ field_0x1156[0] = 30;
+}
+void dAcBlastboss_c::executeState_ThunderWait() {
+ dAcPy_c *link = dAcPy_c::GetLinkM();
+ mCc1.SetTgFlag_0xA(0);
+
+ switch (mSubState) {
+ case SUB_STATE_0: {
+ if (mMdl.getAnm().isStop()) {
+ mSubState = SUB_STATE_1;
+ setAnm("CatchThunderLoop", 0.0f);
+ }
+ // fall-through
+ }
+ case SUB_STATE_1: {
+ if (link->checkSwordAndMoreStates(0x400000)) {
+ mStateMgr.changeState(StateID_Fight);
+ } else if (field_0x1156[0] == 0) {
+ dLightEnv_c::GetPInstance()->setField_0x38DC(7);
+ mSubState = SUB_STATE_5;
+ setAnm("CatchThunderEnd", 5.0f);
+ mVec3_c vEff;
+ vEff.x = field_0x1208.x;
+ vEff.y = field_0x1208.y + 110.0f;
+ vEff.z = field_0x1208.z;
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_624_, vEff, nullptr, nullptr, nullptr, nullptr, 0, 0
+ );
+ field_0x1156[3] = cM::rndF(100.0f) + 900.0f;
+ mIsSwordEmpowered = true;
+ mSwordMdl.fn_8006B800(4);
+ mCc1.OnTg_0x8000000();
+ field_0x114A = 10;
+ startSound(SE_BLasBos_ThunderFallSword);
+ }
+ break;
+ }
+ case SUB_STATE_5: {
+ if (mMdl.getAnm().getFrame() >= 20.0f) {
+ mCc1.SetTgFlag_0xA(0x1FF);
+ fn_143_77C0();
+ }
+ if (mMdl.getAnm().isStop()) {
+ mStateMgr.changeState(StateID_Fight);
+ }
+ break;
+ }
+ }
+ sLib::addCalcScaled(&mSpeed, 1.0f, 4.0f);
+}
void dAcBlastboss_c::finalizeState_ThunderWait() {}
void dAcBlastboss_c::setAnm(const char *name, f32 blend) {
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 7616f56e..01fb52ae 100644
--- a/src/REL/d/a/e/d_a_e_sm.cpp
+++ b/src/REL/d/a/e/d_a_e_sm.cpp
@@ -265,7 +265,7 @@ int dAcEsm_c::actorCreate() {
mAnmTexPat.setFrame(anim_frame, 0);
- setInteractionFlags(0x40);
+ setInteractionFlags(INTERACT_0x40);
fn_187_44C0();
@@ -369,7 +369,7 @@ int dAcEsm_c::actorExecute() {
if (timeCheck != 0) {
if (field_0xBBF == 3) {
- if (checkInteractionFlags(4)) {
+ if (checkInteractionFlags(INTERACT_0x4)) {
fn_800306d0();
}
return SUCCEEDED;
@@ -400,7 +400,7 @@ int dAcEsm_c::actorExecute() {
}
if (field_0xBBF == 3 && mTimeArea.isNearZero()) {
- if (checkInteractionFlags(4)) {
+ if (checkInteractionFlags(INTERACT_0x4)) {
fn_800306d0();
}
return SUCCEEDED;
@@ -1430,7 +1430,7 @@ void dAcEsm_c::fn_187_6C20(bool param0) {
mSph.SetAtFlagsUpper(0);
sTimer = 0;
- setInteractionFlags(4);
+ setInteractionFlags(INTERACT_0x4);
fn_187_44C0();
field_0xBAC = 60;