More funcs (one regswap in dAcBlastboss_c::checkDamage)

This commit is contained in:
robojumper
2026-01-01 02:09:12 +01:00
parent 85be0bc8f0
commit 81a599e313
6 changed files with 488 additions and 76 deletions
@@ -75,13 +75,13 @@ finalizeState_Stun__14dAcBlastboss_cFv = .text:0x00006490; // type:function size
initializeState_ThunderWait__14dAcBlastboss_cFv = .text:0x000064A0; // type:function size:0x54
executeState_ThunderWait__14dAcBlastboss_cFv = .text:0x00006500; // type:function size:0x204
finalizeState_ThunderWait__14dAcBlastboss_cFv = .text:0x00006710; // type:function size:0x4
fn_143_6720__14dAcBlastboss_cFv = .text:0x00006720; // type:function size:0xBB4
fn_143_72E0 = .text:0x000072E0; // type:function size:0x1C
checkDamage__14dAcBlastboss_cFv = .text:0x00006720; // type:function size:0xBB4
calcTimer<Uc>__4sLibFPUc_Uc = .text:0x000072E0; // type:function size:0x1C
setAnm__14dAcBlastboss_cFPCcf = .text:0x00007300; // type:function size:0x58
forceSetAnm__14dAcBlastboss_cFPCcf = .text:0x00007360; // type:function size:0x50
setAnmRate__14dAcBlastboss_cFf = .text:0x000073B0; // type:function size:0x10
draw__14dAcBlastboss_cFv = .text:0x000073C0; // type:function size:0x60
fn_143_7420__14dAcBlastboss_cFv = .text:0x00007420; // type:function size:0x17C
checkForCloseRangeAttack__14dAcBlastboss_cFv = .text:0x00007420; // type:function size:0x17C
fn_143_75A0__14dAcBlastboss_cFv = .text:0x000075A0; // type:function size:0x218
fn_143_77C0__14dAcBlastboss_cFv = .text:0x000077C0; // type:function size:0x338
fn_143_7B00__14dAcBlastboss_cFv = .text:0x00007B00; // type:function size:0x478
@@ -89,7 +89,7 @@ fn_143_7F80__14dAcBlastboss_cFv = .text:0x00007F80; // type:function size:0x674
fn_143_8600 = .text:0x00008600; // type:function size:0x860
fn_143_8E60 = .text:0x00008E60; // type:function size:0x5B4
fn_143_9420__14dAcBlastboss_cFv = .text:0x00009420; // type:function size:0x148
fn_143_9570 = .text:0x00009570; // type:function size:0x9C
fn_143_9570__14dAcBlastboss_cFl = .text:0x00009570; // type:function size:0x9C
fn_143_9610__14dAcBlastboss_cFv = .text:0x00009610; // type:function size:0xAF4
fn_143_A110__14dAcBlastboss_cFl = .text:0x0000A110; // type:function size:0xBC
vt_0x88__11dAcEnBase_cFi = .text:0x0000A1D0; // type:function size:0x8
+24 -16
View File
@@ -221,6 +221,17 @@ class dAcBlastboss_c : public dAcEnBase_c {
SUB_STATE_21,
};
enum Timer_e {
TIMER_0,
TIMER_1,
TIMER_2,
TIMER_3,
TIMER_4,
TIMER_5,
TIMER_MAX,
};
public:
dAcBlastboss_c() : mStateMgr(*this, sStateID::null), mScnCallback(this) {}
virtual ~dAcBlastboss_c() {}
@@ -251,13 +262,14 @@ private:
void forceSetAnm(const char *anim, f32 blend);
void setAnmRate(f32 rate);
void fn_143_6720();
bool fn_143_7420();
bool checkDamage();
bool checkForCloseRangeAttack();
bool fn_143_75A0();
bool fn_143_77C0();
void fn_143_7B00();
void fn_143_7F80();
bool fn_143_9420();
u8 fn_143_9570(s32 dir);
void fn_143_9610();
void fn_143_A110(s32);
@@ -281,14 +293,14 @@ private:
/* 0x1132 */ u8 field_0x1132;
/* 0x1133 */ u8 field_0x1133;
/* 0x1134 */ u8 field_0x1134;
/* 0x1135 */ u8 field_0x1135;
/* 0x1136 */ u8 field_0x1136;
/* 0x1135 */ s8 field_0x1135;
/* 0x1136 */ s8 field_0x1136;
/* 0x1137 */ u8 field_0x1137;
/* 0x1138 */ u8 field_0x1138;
/* 0x1139 */ u8 field_0x1139;
/* 0x113A */ u8 field_0x113A;
/* 0x113A */ u8 mChanceAttackCounter;
/* 0x113B */ u8 field_0x113B;
/* 0x113C */ u8 field_0x113C;
/* 0x113C */ u8 mChanceCounter;
/* 0x113D */ u8 field_0x113D;
/* 0x113E */ u8 field_0x113E;
/* 0x113F */ u8 field_0x113F;
@@ -297,7 +309,7 @@ private:
/* 0x1142 */ u8 field_0x1142;
/* 0x1143 */ u8 field_0x1143;
/* 0x1144 */ s8 field_0x1144;
/* 0x1145 */ u8 field_0x1145;
/* 0x1145 */ s8 mLinkCloseRangeShieldTime;
/* 0x1146 */ bool mIsSwordEmpowered;
/* 0x1147 */ u8 field_0x1147;
/* 0x1148 */ u8 field_0x1148;
@@ -311,10 +323,8 @@ private:
/* 0x1150 */ u8 field_0x1150;
/* 0x1152 */ u16 field_0x1152;
/* 0x1154 */ u16 field_0x1154;
/* 0x1156 */ u16 field_0x1156[6];
/* 0x1162 */ u8 _0x1162[0x1164 - 0x1162];
/* 0x1156 */ u16 mTimers[TIMER_MAX];
/* 0x1162 */ u16 field_0x1162;
/* 0x1164 */ s16 field_0x1164;
/* 0x1166 */ s16 mSubState;
@@ -333,12 +343,10 @@ private:
/* 0x117C */ s16 field_0x117C;
/* 0x117E */ s16 field_0x117E;
/* 0x1180 */ s16 field_0x1180;
/* 0x1180 */ s16 field_0x1182;
/* 0x1182 */ s16 field_0x1182;
/* 0x1184 */ s16 field_0x1184;
/* 0x1186 */ s16 mYRotationRelativeToLink;
/* 0x1188 */ u8 _0x1188[0x118A - 0x1188];
/* 0x1188 */ s16 field_0x1188;
/* 0x118A */ mAng field_0x118A;
/* 0x118C */ mAng field_0x118C;
@@ -371,7 +379,7 @@ private:
/* 0x11D0 */ u8 _0x11D0[0x11D4 - 0x11D0];
/* 0x11D4 */ s32 field_0x11D4;
/* 0x11D4 */ s32 mLastAttackDir;
/* 0x11D8 */ s32 field_0x11D8;
/* 0x11DC */ mAng3_c field_0x11DC;
+3
View File
@@ -4,6 +4,7 @@
#include "common.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/a/obj/d_a_obj_bomb.h"
#include "d/d_cc.h"
#include "m/m_angle.h"
#include "m/m_vec.h"
@@ -72,6 +73,8 @@ public:
void fn_80030700();
void fn_80030c20(u32 flags, f32, f32, f32, f32);
s32 someEnemyDamageCollisionStuffMaybe(dColliderLinkedList &list, u16 *pOutFlags);
bool ChkCrossPlayer(f32 height);
protected:
+2 -2
View File
@@ -434,11 +434,11 @@ public:
return field_0x2F1C;
}
u32 getField_0x38DC() const {
s32 getField_0x38DC() const {
return field_0x38DC;
}
void setField_0x38DC(u32 v) {
void setField_0x38DC(s32 v) {
field_0x38DC = v;
}
+2
View File
@@ -101,6 +101,8 @@ public:
// always returns false
bool weirdCheckAlwaysFalse();
void fn_80372D70(UNKWORD);
dSndBgmSound_c *getActiveBgmSound();
// I don't love this inline but it fixes one regswap
// TODO look into getting rid of this one
+453 -54
View File
@@ -15,6 +15,7 @@
#include "d/d_sc_game.h"
#include "d/d_stage_mgr.h"
#include "d/flag/sceneflag_manager.h"
#include "d/snd/d_snd_bgm_mgr.h"
#include "d/snd/d_snd_wzsound.h"
#include "d/t/d_t_sword_battle_game.h"
#include "f/f_base.h"
@@ -211,7 +212,7 @@ int dAcBlastboss_c::create() {
mHealth = 400;
mPositionCopy3 = mPosition;
field_0x11D4 = field_0x11D8 = -1;
mLastAttackDir = field_0x11D8 = -1;
mWaterEmitter.init(this);
mEmitter2.init(this);
@@ -261,9 +262,9 @@ int dAcBlastboss_c::actorExecute() {
mLightInfo.mScale = 0.0f;
field_0x11B0 = 0.7f;
for (int i = 0; i < 6; i++) {
if (field_0x1156[i] != 0) {
field_0x1156[i]--;
for (int i = 0; i < TIMER_MAX; i++) {
if (mTimers[i] != 0) {
mTimers[i]--;
}
}
@@ -298,7 +299,7 @@ int dAcBlastboss_c::actorExecute() {
mCc4.ClrAtSet();
mCc5.ClrAtSet();
fn_143_6720();
checkDamage();
if (mpSwordBattleGame == nullptr || mpSwordBattleGame->checkFightStarted() == true) {
mStateMgr.executeState();
}
@@ -941,9 +942,9 @@ void dAcBlastboss_c::initializeState_Fight() {
mSubState = SUB_STATE_0;
field_0x118A = 0;
if (field_0x1149 == 0) {
field_0x1156[2] = cM::rndF(50.0f) + 50.0f;
mTimers[TIMER_2] = cM::rndF(50.0f) + 50.0f;
} else {
field_0x1156[2] = cM::rndF(20.0f) + 10.0f;
mTimers[TIMER_2] = cM::rndF(20.0f) + 10.0f;
}
field_0x1144 = 9;
}
@@ -959,7 +960,7 @@ void dAcBlastboss_c::executeState_Fight() {
if (field_0x2CEC >= 200 && field_0x2CEC < 300) {
puVar2 = -100.0f;
field_0x1156[2] = cM::rndF(50.0f) + 100.0f;
mTimers[TIMER_2] = cM::rndF(50.0f) + 100.0f;
}
switch (mSubState) {
@@ -973,7 +974,7 @@ void dAcBlastboss_c::executeState_Fight() {
break;
} else if (mXZDistanceToLink < puVar2 + 250.0f + 100.0f) {
mSubState = SUB_STATE_1;
field_0x1156[0] = 8;
mTimers[TIMER_0] = 8;
mAnmRate = -1.0f;
field_0x1180 = 0;
// fall-through...
@@ -1002,7 +1003,7 @@ void dAcBlastboss_c::executeState_Fight() {
mStateMgr.changeState(StateID_PunchAttack);
return;
}
} else if (mXZDistanceToLink >= puVar2 + 200.0f && field_0x1156[0] == 0) {
} else if (mXZDistanceToLink >= puVar2 + 200.0f && mTimers[TIMER_0] == 0) {
mSubState = SUB_STATE_0;
}
break;
@@ -1023,9 +1024,9 @@ void dAcBlastboss_c::executeState_Fight() {
if (mXZDistanceToLink < puVar2 + 400.0f) {
mSubState = SUB_STATE_0;
if (field_0x1149 == 0) {
field_0x1156[2] = cM::rndF(50.0f) + 50.0f;
mTimers[TIMER_2] = cM::rndF(50.0f) + 50.0f;
} else {
field_0x1156[2] = cM::rndF(20.0f) + 10.0f;
mTimers[TIMER_2] = cM::rndF(20.0f) + 10.0f;
}
}
break;
@@ -1105,7 +1106,7 @@ void dAcBlastboss_c::executeState_Fight() {
if (field_0x117C == 0) {
if (!fn_143_75A0()) {
fn_143_7420();
checkForCloseRangeAttack();
fn_143_77C0();
}
mCc1.SetTgFlag_0xA(0x1FF);
@@ -1114,13 +1115,13 @@ void dAcBlastboss_c::executeState_Fight() {
mCc1.SetTgFlag_0xA(0);
}
if (field_0x1156[4] == 1) {
if (mTimers[TIMER_4] == 1) {
field_0x1178 = 40;
} else if (field_0x1156[4] <= 10) {
} else if (mTimers[TIMER_4] <= 10) {
field_0x1136 = 0;
field_0x1135 = 0;
field_0x113A = 0;
field_0x11D4 = field_0x11D8 = -1;
mChanceAttackCounter = 0;
mLastAttackDir = field_0x11D8 = -1;
}
}
void dAcBlastboss_c::finalizeState_Fight() {}
@@ -1229,7 +1230,7 @@ void dAcBlastboss_c::initializeState_CounterAttack() {
field_0x1136 = 0;
field_0x1135 = 0;
field_0x11D4 = field_0x11D8 = -1;
mLastAttackDir = field_0x11D8 = -1;
}
void dAcBlastboss_c::executeState_CounterAttack() {
dAcPy_c *link = dAcPy_c::GetLinkM();
@@ -1354,7 +1355,7 @@ void dAcBlastboss_c::executeState_DashAttack() {
if (mMdl.getAnm().isStop()) {
setAnm("AttackJumpLoop", 0.0f);
mSubState = SUB_STATE_2;
field_0x1156[0] = 200;
mTimers[TIMER_0] = 200;
}
break;
}
@@ -1365,7 +1366,7 @@ void dAcBlastboss_c::executeState_DashAttack() {
if (mXZDistanceToLink < 750.0f) {
setAnm("AttackJumpEnd", 0.0f);
mSubState = SUB_STATE_3;
} else if (field_0x1156[0] == 0) {
} else if (mTimers[TIMER_0] == 0) {
mStateMgr.changeState(StateID_Fight);
}
break;
@@ -1527,12 +1528,12 @@ void dAcBlastboss_c::executeState_Guard() {
mSubState = SUB_STATE_2;
setAnm("WalkBt", 2.0f);
setAnmRate(-2.0f);
field_0x1156[0] = 5;
mTimers[TIMER_0] = 5;
break;
} else {
if (field_0x1144 == 9) {
setAnm(sGuardNames[field_0x1144], 3.0f);
field_0x1156[0] = 14;
mTimers[TIMER_0] = 14;
} else {
setAnm(sGuardNames[field_0x1144], 3.0f);
}
@@ -1542,18 +1543,18 @@ void dAcBlastboss_c::executeState_Guard() {
}
case SUB_STATE_1: {
if (link->isAttackingSpin()) {
field_0x1156[0] = 5;
mTimers[TIMER_0] = 5;
}
if (field_0x1144 == 9) {
field_0x1133 = 1;
if (field_0x1156[0] == 0) {
if (mTimers[TIMER_0] == 0) {
mStateMgr.changeState(StateID_Fight);
field_0x1156[4] = 15;
mTimers[TIMER_4] = 15;
}
} else if (mMdl.getAnm().getFrame() >= 13.0f) {
mStateMgr.changeState(StateID_Fight);
field_0x1156[4] = 15;
mTimers[TIMER_4] = 15;
}
if (!link->isAttackingJumpSlash()) {
@@ -1564,7 +1565,7 @@ void dAcBlastboss_c::executeState_Guard() {
case SUB_STATE_2: {
field_0x11A4 = 20.0f;
targetSpeed = -30.0f;
if (field_0x1156[0] == 0) {
if (mTimers[TIMER_0] == 0) {
field_0x1144 = 6;
forceSetAnm(sGuardNames[field_0x1144], 3.0);
mSubState = SUB_STATE_1;
@@ -1585,7 +1586,7 @@ void dAcBlastboss_c::executeState_Guard() {
case SUB_STATE_11: {
if (mMdl.getAnm().getFrame() >= 13.0f) {
mStateMgr.changeState(StateID_Fight);
field_0x1156[4] = 15;
mTimers[TIMER_4] = 15;
}
break;
}
@@ -1640,15 +1641,15 @@ void dAcBlastboss_c::initializeState_GuardBreak() {
setAnm("GuardBreakB", 5.0f);
}
mSubState = 0;
field_0x1156[0] = 3;
mTimers[TIMER_0] = 3;
}
void dAcBlastboss_c::executeState_GuardBreak() {
if (mMdl.getAnm().isStop()) {
mStateMgr.changeState(StateID_Fight);
field_0x1156[4] = 15;
mTimers[TIMER_4] = 15;
}
if (field_0x1156[0] == 1) {
if (mTimers[TIMER_0] == 1) {
mSpeed = -30.0f;
}
sLib::addCalcScaled(&mSpeed, 1.0f, 4.0f);
@@ -1661,7 +1662,7 @@ void dAcBlastboss_c::initializeState_Damage() {
forceSetAnm("Damage", 5.0f);
mSubState = SUB_STATE_0;
mSpeed = -20.0f;
field_0x113A++;
mChanceAttackCounter++;
field_0x1142 = 5;
startSound(SE_BLasBos_VO_DamageNormal);
}
@@ -1670,8 +1671,8 @@ void dAcBlastboss_c::executeState_Damage() {
sLib::addCalcScaled(&mSpeed, 1.0f, 2.0f);
if (mMdl.getAnm().isStop()) {
mStateMgr.changeState(StateID_Fight);
field_0x1156[4] = 15;
field_0x1156[2] = 0;
mTimers[TIMER_4] = 15;
mTimers[TIMER_2] = 0;
}
field_0x113E = 0;
if (field_0x1149 == 0 && !link->isAttackingSpin()) {
@@ -1685,10 +1686,10 @@ void dAcBlastboss_c::initializeState_SitDamage() {
setAnm("Chance", 5.0f);
mSubState = 0;
mSpeed = -20.0f;
field_0x113A = 0;
field_0x1156[0] = 80;
mChanceAttackCounter = 0;
mTimers[TIMER_0] = 80;
field_0x1142 = 5;
field_0x113C++;
mChanceCounter++;
}
void dAcBlastboss_c::executeState_SitDamage() {
sLib::addCalcScaled(&mSpeed, 1.0f, 2.0f);
@@ -1701,7 +1702,7 @@ void dAcBlastboss_c::executeState_SitDamage() {
break;
}
case SUB_STATE_1: {
if (field_0x1156[0] == 0 || field_0x113A >= 5) {
if (mTimers[TIMER_0] == 0 || mChanceAttackCounter >= 5) {
setAnm("ChanceReverse", 5.0f);
mSubState = SUB_STATE_2;
// fall-through
@@ -1712,7 +1713,7 @@ void dAcBlastboss_c::executeState_SitDamage() {
case SUB_STATE_2: {
if (mMdl.getAnm().isStop()) {
mStateMgr.changeState(StateID_Fight);
field_0x1156[4] = 15;
mTimers[TIMER_4] = 15;
}
fn_143_77C0();
mCc1.SetTgFlag_0xA(0x1FF);
@@ -1732,7 +1733,7 @@ void dAcBlastboss_c::executeState_SitDamage() {
break;
}
case SUB_STATE_6: {
if (field_0x1156[0] == 0 || field_0x113A >= 5) {
if (mTimers[TIMER_0] == 0 || mChanceAttackCounter >= 5) {
setAnm("ChanceReverse", 5.0f);
mSubState = SUB_STATE_2;
// fall-through
@@ -1801,11 +1802,11 @@ void dAcBlastboss_c::executeState_Down() {
setAnm("DownLoop", 0.0f);
mSubState = SUB_STATE_3;
if (field_0x113B >= 3 || field_0x2CEC != 0) {
field_0x1156[0] = 70;
mTimers[TIMER_0] = 70;
} else if (field_0x113B == 2) {
field_0x1156[0] = 40;
mTimers[TIMER_0] = 40;
} else {
field_0x1156[0] = 25;
mTimers[TIMER_0] = 25;
}
field_0x113B++;
} else {
@@ -1829,7 +1830,7 @@ void dAcBlastboss_c::executeState_Down() {
field_0x114F = 1;
resetInteractionFlags(INTERACT_0x1000);
resetInteractionFlags(INTERACT_0x1);
} else if (field_0x1156[0] == 0) {
} else if (mTimers[TIMER_0] == 0) {
if (cM::rnd() < 0.5f || field_0x2CEC != 0) {
setAnm("DownEscapeR", 10.0f);
} else {
@@ -1857,7 +1858,7 @@ void dAcBlastboss_c::executeState_Down() {
}
if (mMdl.getAnm().isStop()) {
mStateMgr.changeState(StateID_Fight);
field_0x1156[4] = 15;
mTimers[TIMER_4] = 15;
}
break;
}
@@ -1891,7 +1892,7 @@ void dAcBlastboss_c::executeState_Down() {
mMdl.setFrame(10.0f);
} else {
mStateMgr.changeState(StateID_Fight);
field_0x1156[4] = 15;
mTimers[TIMER_4] = 15;
}
}
}
@@ -1917,7 +1918,7 @@ void dAcBlastboss_c::executeState_Down() {
field_0x1141 = 0;
if (mMdl.getAnm().isStop()) {
mStateMgr.changeState(StateID_Fight);
field_0x1156[4] = 15;
mTimers[TIMER_4] = 15;
field_0x2CEC = 1000;
}
break;
@@ -1941,7 +1942,7 @@ void dAcBlastboss_c::finalizeState_Down() {}
void dAcBlastboss_c::initializeState_Stun() {
setAnm("Stan", 3.0f);
mSubState = SUB_STATE_0;
field_0x113A = 0;
mChanceAttackCounter = 0;
field_0x1143 = 10;
field_0x1154++;
mIsSwordEmpowered = false;
@@ -1958,12 +1959,12 @@ void dAcBlastboss_c::executeState_Stun() {
if (mMdl.getAnm().isStop()) {
mSubState = SUB_STATE_1;
setAnm("StanLoop", 0.0f);
field_0x1156[0] = 100;
mTimers[TIMER_0] = 100;
}
break;
}
case SUB_STATE_1: {
if (field_0x1156[0] == 0) {
if (mTimers[TIMER_0] == 0) {
mSubState = SUB_STATE_2;
setAnm("StanReverse", 10.0f);
}
@@ -1988,7 +1989,7 @@ void dAcBlastboss_c::executeState_Stun() {
}
sLib::addCalcScaled(&mSpeed, 1.0f, 10.0f);
if (field_0x113A >= 7) {
if (mChanceAttackCounter >= 7) {
mCc1.SetTgFlag_0xA(0x1FF);
fn_143_77C0();
} else {
@@ -2005,7 +2006,7 @@ void dAcBlastboss_c::initializeState_ThunderWait() {
setAnm("CatchThunderStart", 10.0f);
mSubState = SUB_STATE_0;
field_0x1144 = -1;
field_0x1156[0] = 30;
mTimers[TIMER_0] = 30;
}
void dAcBlastboss_c::executeState_ThunderWait() {
dAcPy_c *link = dAcPy_c::GetLinkM();
@@ -2022,7 +2023,7 @@ void dAcBlastboss_c::executeState_ThunderWait() {
case SUB_STATE_1: {
if (link->checkSwordAndMoreStates(0x400000)) {
mStateMgr.changeState(StateID_Fight);
} else if (field_0x1156[0] == 0) {
} else if (mTimers[TIMER_0] == 0) {
dLightEnv_c::GetPInstance()->setField_0x38DC(7);
mSubState = SUB_STATE_5;
setAnm("CatchThunderEnd", 5.0f);
@@ -2033,7 +2034,7 @@ void dAcBlastboss_c::executeState_ThunderWait() {
dJEffManager_c::spawnEffect(
PARTICLE_RESOURCE_ID_MAPPING_624_, vEff, nullptr, nullptr, nullptr, nullptr, 0, 0
);
field_0x1156[3] = cM::rndF(100.0f) + 900.0f;
mTimers[TIMER_3] = cM::rndF(100.0f) + 900.0f;
mIsSwordEmpowered = true;
mSwordMdl.fn_8006B800(4);
mCc1.OnTg_0x8000000();
@@ -2057,6 +2058,309 @@ void dAcBlastboss_c::executeState_ThunderWait() {
}
void dAcBlastboss_c::finalizeState_ThunderWait() {}
bool dAcBlastboss_c::checkDamage() {
mVec3_c v;
mVec3_c v2;
mMtx_c mtx;
mHealth = 400;
// TODO: typing crime
cCcD_Obj *atHit = mSwordMdl.mCcList.find((dColliderLinkedList::ccPtmf)&dCcD_Check::ChkAtHit);
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);
if (tgHit == nullptr) {
return false;
}
dAcPy_c *link = dAcPy_c::GetLinkM();
s32 attackDir = link->getSpecificAttackDirection();
// TODO: enum?
switch (unk) {
case 0: {
break;
}
case 6: {
startSound(SE_BLasBos_SwordBySword);
// TODO inline?
if (tgHit->GetTgDamageFlags() & 0x4) {
v.x = 0.0f;
v.y = 0.0f;
v.z = 20.0f;
mtx.YrotS(link->mRotation.y);
MTXMultVec(mtx, v, v2);
field_0x119C = v2.x;
field_0x11A0 = v2.z;
mStateMgr.changeState(StateID_Stun);
break;
}
if (tgHit->ChkTgAtHitType(AT_TYPE_0x800000)) {
field_0x1144 = 6;
mStateMgr.changeState(StateID_Guard);
break;
}
mMdlCallback.field_0x04.set(7);
if (field_0x113F != 0) {
mSubState = SUB_STATE_1;
mStateMgr.changeState(StateID_CounterAttack);
break;
} else if (field_0x1144 == 9) {
if (fn_143_9570(attackDir) == fn_143_9570(mLastAttackDir)) {
field_0x1135++;
} else {
field_0x1136++;
}
if (field_0x1136 >= 2) {
mSubState = SUB_STATE_1;
mStateMgr.changeState(StateID_CounterAttack);
break;
}
if (fn_143_9570(attackDir) == 0) {
mMdlCallback.field_0x30 += 3.0f;
mMdlCallback.field_0x18 += 0x7D0;
} else if (fn_143_9570(attackDir) == 1) {
mMdlCallback.field_0x30 -= 3.0f;
mMdlCallback.field_0x18 -= 0x7D0;
}
if (field_0x1135 >= 1) {
mStateMgr.changeState(StateID_GuardBreak);
}
} else if (mLastAttackDir >= 0) {
if (fn_143_9570(attackDir) == fn_143_9570(mLastAttackDir)) {
field_0x1136++;
} else {
field_0x1135++;
}
s8 x = 3;
if (fn_143_9570(attackDir) == fn_143_9570(mLastAttackDir)) {
x = 1;
}
// TODO the branches here are wrong
if (field_0x1136 >= x ||
(field_0x11D8 >= 0 && (fn_143_9570(field_0x11D8) & 2) == (fn_143_9570(attackDir) & 2))) {
mSubState = SUB_STATE_0;
mStateMgr.changeState(StateID_CounterAttack);
} else {
if (field_0x1135 >= 1) {
field_0x113E = 25;
field_0x1135 = 1;
field_0x1182 = 20;
}
}
}
v.x = 0.0f;
v.y = 0.0f;
v.z = -5.0f;
mtx.YrotS(mYAngleToLink);
MTXMultVec(mtx, v, v2);
field_0x119C = v2.x;
field_0x11A0 = v2.z;
mLastAttackDir = attackDir;
break;
}
case 7: {
break;
}
default: {
if (tgHit != nullptr &&
(tgHit->ChkTgAtHitType(AT_TYPE_SLINGSHOT) || tgHit->ChkTgAtHitType(AT_TYPE_CLAWSHOT) ||
tgHit->ChkTgAtHitType(AT_TYPE_BOMB) || tgHit->ChkTgAtHitType(AT_TYPE_ARROW) ||
tgHit->ChkTgAtHitType(AT_TYPE_WHIP) || tgHit->ChkTgAtHitType(AT_TYPE_0x40))) {
field_0x1144 = 6;
mStateMgr.changeState(StateID_Guard);
if (tgHit->ChkTgAtHitType(AT_TYPE_BOMB)) {
field_0x11A4 = 30.0f;
field_0x11B8 = 15.0f;
v.x = 0.0f;
v.y = 0.0f;
v.z = -10.0f;
mtx.YrotS(mRotation.y);
MTXMultVec(mtx, v, v2);
field_0x119C = v2.x;
field_0x11A0 = v2.z;
}
break;
}
// TODO inline?
if (tgHit->GetTgDamageFlags() & 4) {
v.x = 0.0f;
v.y = 0.0f;
v.z = 20.0f;
mtx.YrotS(link->mRotation.y);
MTXMultVec(mtx, v, v2);
field_0x119C = v2.x;
field_0x11A0 = v2.z;
mStateMgr.changeState(StateID_Stun);
break;
}
field_0x1152++;
if (field_0x1152 == 15) {
dSndBgmMgr_c::GetInstance()->fn_80372D70(3);
}
if (field_0x1149 >= 0) {
if (field_0x1152 == 30) {
dStageMgr_c::GetInstance()->fn_80199B60(4);
mStateMgr.changeState(StateID_Down);
field_0x2CEC = 1;
startSound(SE_BLasBos_DownHit);
break;
}
} else {
if (field_0x1152 == 50) {
mStateMgr.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)) {
field_0x1188 = 10;
break;
}
if (field_0x113E != 0 && field_0x1149 != 0) {
field_0x1188 = 10;
break;
}
if (mStateMgr.isState(StateID_Stun)) {
field_0x1136 = 0;
field_0x11D8 = attackDir;
mChanceAttackCounter++;
v.x = 0.0f;
v.y = 0.0f;
v.z = -20.0f;
mtx.YrotS(mYAngleToLink);
MTXMultVec(mtx, v, v2);
field_0x119C = v2.x;
field_0x11A0 = v2.z;
field_0x1138 = 10;
field_0x11B8 = 5.0f;
field_0x11A4 = 7.0f;
if (attackDir == daPlayerActBase_c::ATTACK_DIRECTION_LEFT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_DOWNLEFT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_UPLEFT) {
field_0x1137 = 1;
} else if (attackDir == daPlayerActBase_c::ATTACK_DIRECTION_RIGHT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_DOWNRIGHT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_UPRIGHT) {
field_0x1137 = 2;
} else if (attackDir == daPlayerActBase_c::ATTACK_DIRECTION_STAB) {
field_0x1137 = 3;
} else {
field_0x1137 = 0;
}
startSound(SE_BLasBos_VO_DamageChance);
break;
}
if (mStateMgr.isState(StateID_SitDamage)) {
field_0x1136 = 0;
field_0x11D8 = attackDir;
mChanceAttackCounter++;
if (mChanceAttackCounter >= 5 && mChanceCounter >= 3) {
if (field_0x1149 >= 0) {
mChanceAttackCounter = 0;
field_0x1152 = 30;
dStageMgr_c::GetInstance()->fn_80199B60(4);
mStateMgr.changeState(StateID_Down);
field_0x2CEC = 1;
startSound(SE_BLasBos_DownHit);
break;
}
mStateMgr.changeState(StateID_Down);
field_0x1152 = 45;
break;
}
v.x = 0.0f;
v.y = 0.0f;
v.z = -20.0f;
mtx.YrotS(mYAngleToLink);
MTXMultVec(mtx, v, v2);
field_0x119C = v2.x;
field_0x11A0 = v2.z;
field_0x11B8 = 5.0f;
field_0x11A4 = 7.0f;
if (attackDir == daPlayerActBase_c::ATTACK_DIRECTION_LEFT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_DOWNLEFT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_UPLEFT) {
field_0x1137 = 1;
} else if (attackDir == daPlayerActBase_c::ATTACK_DIRECTION_RIGHT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_DOWNRIGHT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_UPRIGHT) {
field_0x1137 = 2;
} else if (attackDir == daPlayerActBase_c::ATTACK_DIRECTION_DOWN) {
field_0x1137 = 3;
} else {
field_0x1137 = 0;
}
mSubState = SUB_STATE_5;
startSound(SE_BLasBos_VO_DamageChance);
break;
}
if (mChanceAttackCounter >= 3) {
mStateMgr.changeState(StateID_SitDamage);
mChanceAttackCounter = 0;
} else {
mStateMgr.changeState(StateID_Damage);
}
field_0x1136 = -1;
field_0x11D8 = attackDir;
v.x = 0.0f;
v.y = 0.0f;
v.z = -20.0f;
mtx.YrotS(mYAngleToLink);
MTXMultVec(mtx, v, v2);
field_0x119C = v2.x;
field_0x11A0 = v2.z;
field_0x1138 = 10;
field_0x11B8 = 5.0f;
field_0x11A4 = 7.0f;
if (attackDir == daPlayerActBase_c::ATTACK_DIRECTION_LEFT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_DOWNLEFT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_UPLEFT) {
field_0x1137 = 1;
} else if (attackDir == daPlayerActBase_c::ATTACK_DIRECTION_RIGHT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_DOWNRIGHT ||
attackDir == daPlayerActBase_c::ATTACK_DIRECTION_UPRIGHT) {
field_0x1137 = 2;
} else if (attackDir == daPlayerActBase_c::ATTACK_DIRECTION_STAB) {
field_0x1137 = 3;
} else {
field_0x1137 = 0;
}
break;
}
}
}
return true;
}
void dAcBlastboss_c::setAnm(const char *name, f32 blend) {
if (mpCurrentAnm != name) {
mMdl.setAnm(name, m3d::PLAY_MODE_4, blend);
@@ -2081,3 +2385,98 @@ int dAcBlastboss_c::draw() {
}
return SUCCEEDED;
}
bool dAcBlastboss_c::checkForCloseRangeAttack() {
dAcPy_c *link = dAcPy_c::GetLinkM();
bool ret = false;
if (mXZDistanceToLink < 500.0f) {
if (field_0x1149 != 0) {
if (mTimers[TIMER_2] == 0) {
mStateMgr.changeState(StateID_Attack);
ret = true;
}
} else {
if (link->isUsingShield()) {
mLinkCloseRangeShieldTime++;
} else {
mLinkCloseRangeShieldTime = 0;
}
if (mLinkCloseRangeShieldTime > 40) {
mStateMgr.changeState(StateID_PunchAttack);
ret = true;
} else if (mTimers[TIMER_2] == 0) {
if (fn_143_9420() && cM::rnd() < 0.35f) {
mStateMgr.changeState(StateID_SmallAttack);
ret = true;
} else {
mStateMgr.changeState(StateID_Attack);
ret = true;
}
mLinkCloseRangeShieldTime = 0;
}
// ret = true;
}
} else {
mLinkCloseRangeShieldTime = 0;
}
return ret;
}
bool dAcBlastboss_c::fn_143_75A0() {
dAcPy_c *link = dAcPy_c::GetLinkM();
bool ret = false;
if (field_0x1149 != 0 && !link->isRecovering() && field_0x1154 != 0 && link->getSwordPos().y > 270.0f) {
field_0x1162++;
} else {
field_0x1162 = 0;
}
if (field_0x1149 != 0) {
if (field_0x1162 >= 20) {
mStateMgr.changeState(StateID_DashAttack);
return true;
} else if (mIsSwordEmpowered) {
if ((link->checkSwordAndMoreStates(0x400000) && field_0x1154 != 0) ||
(mXZDistanceToLink < 1500.0f && mTimers[TIMER_3] == 0)) {
mStateMgr.changeState(StateID_ThunderAttack);
ret = true;
}
} else {
if (link->checkSwordAndMoreStates(0x400000)) {
if ((field_0x1164 & 7) == 0 && field_0x1154 != 0) {
mStateMgr.changeState(StateID_DashAttack);
ret = true;
}
} else {
if (mXZDistanceToLink < 1500.0f && dLightEnv_c::GetPInstance()->getField_0x38DC() == 6) {
if (field_0x1162 > 10) {
mStateMgr.changeState(StateID_DashAttack);
ret = true;
} else {
mStateMgr.changeState(StateID_ThunderWait);
ret = true;
}
}
}
}
}
return ret;
}
bool dAcBlastboss_c::fn_143_77C0() {}
void dAcBlastboss_c::fn_143_7B00() {}
void dAcBlastboss_c::fn_143_7F80() {}
bool dAcBlastboss_c::fn_143_9420() {
return true;
}
void dAcBlastboss_c::fn_143_9610() {}