dAcBlastboss_c::actorExecute OK

This commit is contained in:
robojumper
2025-12-29 18:55:43 +01:00
parent 12c5c2862d
commit 6dd18a9bce
7 changed files with 576 additions and 85 deletions
+180 -28
View File
@@ -8,6 +8,8 @@
#include "m/m3d/m_anmtexsrt.h"
#include "m/m3d/m_mdl.h"
#include "m/m3d/m_smdl.h"
#include "m/m_angle.h"
#include "m/m_vec.h"
#include "s/s_State.hpp"
#include "toBeSorted/d_emitter.h"
#include "toBeSorted/d_enemy_sword_mdl.h"
@@ -46,6 +48,145 @@ class dAcBlastboss_c : public dAcEnBase_c {
/* 0x34 */ dAcBlastboss_c *mpOwner;
};
// BLastBoss.arc > g3d > model.brres > 3DModels(NW4R) > LastBoss > Bones > ...
enum BLastBossModelNode_e {
B_LAST_BOSS_NODE_center = 0,
B_LAST_BOSS_NODE_backbone1 = 1,
B_LAST_BOSS_NODE_backbone2 = 2,
B_LAST_BOSS_NODE_chest = 3,
B_LAST_BOSS_NODE_neck = 4,
B_LAST_BOSS_NODE_head = 5,
B_LAST_BOSS_NODE_browL = 6,
B_LAST_BOSS_NODE_browR = 7,
B_LAST_BOSS_NODE_chin = 8,
B_LAST_BOSS_NODE_hairA1 = 9,
B_LAST_BOSS_NODE_hairA2 = 10,
B_LAST_BOSS_NODE_hairA3 = 11,
B_LAST_BOSS_NODE_hairA4 = 12,
B_LAST_BOSS_NODE_hairBL1 = 13,
B_LAST_BOSS_NODE_hairBL2 = 14,
B_LAST_BOSS_NODE_hairBL3 = 15,
B_LAST_BOSS_NODE_hairBR1 = 16,
B_LAST_BOSS_NODE_hairBR2 = 17,
B_LAST_BOSS_NODE_hairBR3 = 18,
B_LAST_BOSS_NODE_hairC1 = 19,
B_LAST_BOSS_NODE_hairC2 = 20,
B_LAST_BOSS_NODE_hairC3 = 21,
B_LAST_BOSS_NODE_mouthL = 22,
B_LAST_BOSS_NODE_mouthR = 23,
B_LAST_BOSS_NODE_shoulderL = 24,
B_LAST_BOSS_NODE_armL1 = 25,
B_LAST_BOSS_NODE_armL2 = 26,
B_LAST_BOSS_NODE_assistanceL = 27,
B_LAST_BOSS_NODE_wristL = 28,
B_LAST_BOSS_NODE_indexL1 = 29,
B_LAST_BOSS_NODE_indexL2 = 30,
B_LAST_BOSS_NODE_littleL1 = 31,
B_LAST_BOSS_NODE_littleL2 = 32,
B_LAST_BOSS_NODE_middleL1 = 33,
B_LAST_BOSS_NODE_middleL2 = 34,
B_LAST_BOSS_NODE_ringL1 = 35,
B_LAST_BOSS_NODE_ringL2 = 36,
B_LAST_BOSS_NODE_thumbL1 = 37,
B_LAST_BOSS_NODE_thumbL2 = 38,
B_LAST_BOSS_NODE_shoulderR = 39,
B_LAST_BOSS_NODE_armR1 = 40,
B_LAST_BOSS_NODE_armR2 = 41,
B_LAST_BOSS_NODE_assistanceR = 42,
B_LAST_BOSS_NODE_wristR = 43,
B_LAST_BOSS_NODE_indexR1 = 44,
B_LAST_BOSS_NODE_indexR2 = 45,
B_LAST_BOSS_NODE_littleR1 = 46,
B_LAST_BOSS_NODE_littleR2 = 47,
B_LAST_BOSS_NODE_loc_sword01 = 48,
B_LAST_BOSS_NODE_middleR1 = 49,
B_LAST_BOSS_NODE_middleR2 = 50,
B_LAST_BOSS_NODE_ringR1 = 51,
B_LAST_BOSS_NODE_ringR2 = 52,
B_LAST_BOSS_NODE_thumbR1 = 53,
B_LAST_BOSS_NODE_thumbR2 = 54,
B_LAST_BOSS_NODE_belly = 55,
B_LAST_BOSS_NODE_waist = 56,
B_LAST_BOSS_NODE_legL1 = 57,
B_LAST_BOSS_NODE_legL2 = 58,
B_LAST_BOSS_NODE_ankleL = 59,
B_LAST_BOSS_NODE_toeL = 60,
B_LAST_BOSS_NODE_legR1 = 61,
B_LAST_BOSS_NODE_legR2 = 62,
B_LAST_BOSS_NODE_ankleR = 63,
B_LAST_BOSS_NODE_toeR = 64,
B_LAST_BOSS_NODE_skirtA1 = 65,
B_LAST_BOSS_NODE_skirtA2 = 66,
B_LAST_BOSS_NODE_skirtAU1 = 67,
B_LAST_BOSS_NODE_skirtB1 = 68,
B_LAST_BOSS_NODE_skirtB2 = 69,
B_LAST_BOSS_NODE_skirtB3 = 70,
B_LAST_BOSS_NODE_skirtB4 = 71,
B_LAST_BOSS_NODE_skirtB5 = 72,
B_LAST_BOSS_NODE_skirtB6 = 73,
B_LAST_BOSS_NODE_skirtB7 = 74,
B_LAST_BOSS_NODE_skirtB8 = 75,
B_LAST_BOSS_NODE_skirtB9 = 76,
B_LAST_BOSS_NODE_skirtBU1 = 77,
B_LAST_BOSS_NODE_skirtC1 = 78,
B_LAST_BOSS_NODE_skirtC2 = 79,
B_LAST_BOSS_NODE_skirtC3 = 80,
B_LAST_BOSS_NODE_skirtC4 = 81,
B_LAST_BOSS_NODE_skirtC5 = 82,
B_LAST_BOSS_NODE_skirtC6 = 83,
B_LAST_BOSS_NODE_skirtC7 = 84,
B_LAST_BOSS_NODE_skirtC8 = 85,
B_LAST_BOSS_NODE_skirtC9 = 86,
B_LAST_BOSS_NODE_skirtCU1 = 87,
B_LAST_BOSS_NODE_skirtD1 = 88,
B_LAST_BOSS_NODE_skirtD2 = 89,
B_LAST_BOSS_NODE_skirtD3 = 90,
B_LAST_BOSS_NODE_skirtD4 = 91,
B_LAST_BOSS_NODE_skirtD5 = 92,
B_LAST_BOSS_NODE_skirtD6 = 93,
B_LAST_BOSS_NODE_skirtD7 = 94,
B_LAST_BOSS_NODE_skirtD8 = 95,
B_LAST_BOSS_NODE_skirtD9 = 96,
B_LAST_BOSS_NODE_skirtDU1 = 97,
B_LAST_BOSS_NODE_skirtE1 = 98,
B_LAST_BOSS_NODE_skirtE2 = 99,
B_LAST_BOSS_NODE_skirtE3 = 100,
B_LAST_BOSS_NODE_skirtE4 = 101,
B_LAST_BOSS_NODE_skirtE5 = 102,
B_LAST_BOSS_NODE_skirtE6 = 103,
B_LAST_BOSS_NODE_skirtE7 = 104,
B_LAST_BOSS_NODE_skirtE8 = 105,
B_LAST_BOSS_NODE_skirtE9 = 106,
B_LAST_BOSS_NODE_skirtEU1 = 107,
B_LAST_BOSS_NODE_skirtEU2 = 108,
B_LAST_BOSS_NODE_skirtF1 = 109,
B_LAST_BOSS_NODE_skirtF2 = 110,
B_LAST_BOSS_NODE_skirtF3 = 111,
B_LAST_BOSS_NODE_skirtF4 = 112,
B_LAST_BOSS_NODE_skirtF5 = 113,
B_LAST_BOSS_NODE_skirtF6 = 114,
B_LAST_BOSS_NODE_skirtF7 = 115,
B_LAST_BOSS_NODE_skirtF8 = 116,
B_LAST_BOSS_NODE_skirtF9 = 117,
B_LAST_BOSS_NODE_skirtFU1 = 118,
B_LAST_BOSS_NODE_skirtG1 = 119,
B_LAST_BOSS_NODE_skirtG2 = 120,
B_LAST_BOSS_NODE_skirtG3 = 121,
B_LAST_BOSS_NODE_skirtG4 = 122,
B_LAST_BOSS_NODE_skirtG5 = 123,
B_LAST_BOSS_NODE_skirtG6 = 124,
B_LAST_BOSS_NODE_skirtG7 = 125,
B_LAST_BOSS_NODE_skirtG8 = 126,
B_LAST_BOSS_NODE_skirtG9 = 127,
B_LAST_BOSS_NODE_skirtGU1 = 128,
B_LAST_BOSS_NODE_skirtH1 = 129,
B_LAST_BOSS_NODE_skirtH2 = 130,
B_LAST_BOSS_NODE_skirtH3 = 131,
B_LAST_BOSS_NODE_skirtH4 = 132,
B_LAST_BOSS_NODE_skirtH5 = 133,
B_LAST_BOSS_NODE_skirtHU1 = 134,
};
public:
dAcBlastboss_c() : mStateMgr(*this, sStateID::null), mScnCallback(this) {}
virtual ~dAcBlastboss_c() {}
@@ -75,6 +216,8 @@ private:
void fn_143_6720();
void fn_143_A110(s32);
void fn_143_7B00();
void fn_143_7F80();
void fn_143_9610();
/* 0x0378 */ d3d::AnmMdlWrapper mMdl;
/* 0x03E8 */ m3d::anmTexSrt_c mAnmTexSrt;
@@ -91,14 +234,19 @@ private:
/* 0x0BAC */ STATE_MGR_DECLARE(dAcBlastboss_c);
/* 0x0BE8 */ dColliderLinkedList mCcList;
/* 0x0BF4 */ dEnemySwordMdl_c mSwordMdl;
/* 0x1130 */ u8 field_0x1130;
/* 0x1131 */ u8 field_0x1131;
/* 0x1132 */ u8 field_0x1132;
/* 0x1133 */ u8 field_0x1133;
/* 0x1134 */ u8 _0x1134[0x113D - 0x1134];
/* 0x1134 */ u8 field_0x1134;
/* 0x1135 */ u8 field_0x1135;
/* 0x1136 */ u8 field_0x1136;
/* 0x1137 */ u8 field_0x1137;
/* 0x1138 */ u8 field_0x1138;
/* 0x1139 */ u8 field_0x1139;
/* 0x113A */ u8 field_0x113A;
/* 0x113B */ u8 field_0x113B;
/* 0x113C */ u8 field_0x113C;
/* 0x113D */ u8 field_0x113D;
/* 0x113E */ u8 field_0x113E;
/* 0x113F */ u8 field_0x113F;
@@ -109,28 +257,25 @@ private:
/* 0x1144 */ u8 field_0x1144;
/* 0x1145 */ u8 field_0x1145;
/* 0x1146 */ bool mIsSwordEmpowered;
/* 0x1147 */ u8 _0x1147[0x114B - 0x1147];
/* 0x1147 */ u8 field_0x1147;
/* 0x1148 */ u8 field_0x1148;
/* 0x1149 */ s8 field_0x1149;
/* 0x114A */ u8 field_0x114A;
/* 0x114B */ u8 field_0x114B;
/* 0x114C */ u8 field_0x114C;
/* 0x114D */ u8 field_0x114D;
/* 0x114E */ u8 field_0x114E;
/* 0x114F */ u8 field_0x114F;
/* 0x1150 */ u8 field_0x1150;
/* 0x1150 */ u8 _0x1150[0x1156 - 0x1150];
/* 0x1151 */ u8 _0x1151[0x1156 - 0x1151];
/* 0x1156 */ u16 field_0x1156[6];
/* 0x1156 */ u16 field_0x1156;
/* 0x1158 */ u16 field_0x1158;
/* 0x115A */ u16 field_0x115A;
/* 0x115C */ u16 field_0x115C;
/* 0x115E */ u16 field_0x115E;
/* 0x1160 */ u16 field_0x1160;
/* 0x1162 */ u8 _0x1162[0x1164 - 0x1162];
/* 0x1164 */ s16 field_0x1164;
/* 0x1166 */ u8 _0x1166[0x116A - 0x1166];
/* 0x116A */ s16 field_0x116A;
@@ -139,8 +284,9 @@ private:
/* 0x117C */ s16 field_0x117C;
/* 0x1186 */ u8 _0x117E[0x1186 - 0x117E];
/* 0x117E */ u8 _0x117E[0x1184 - 0x117E];
/* 0x1184 */ s16 field_0x1184;
/* 0x1186 */ s16 field_0x1186;
/* 0x1188 */ u8 _0x1188[0x1190 - 0x1188];
@@ -162,27 +308,32 @@ private:
/* 0x11BC */ f32 field_0x11BC;
/* 0x11C0 */ f32 field_0x11C0;
/* 0x11C4 */ u8 _0x11C4[0x11D4 - 0x11C4];
/* 0x11C4 */ u8 _0x11C4[0x11CC - 0x11C4];
/* 0x11CC */ f32 field_0x11CC;
/* 0x11D0 */ u8 _0x11D0[0x11D4 - 0x11D0];
/* 0x11D4 */ s32 field_0x11D4;
/* 0x11D8 */ s32 field_0x11D8;
/* 0x11DC */ u8 _0x11DC[0x11E4 - 0x11DC];
/* 0x11E4 */ mVec3_c field_0x11E4;
/* 0x11F0 */ mVec3_c field_0x11F0;
/* 0x11FC */ mVec3_c field_0x11FC;
/* 0x11DC */ mAng3_c field_0x11DC;
/* 0x11E4 */ mVec3_c mThumbL2Translation;
/* 0x11F0 */ mVec3_c mBackbone1Translation;
/* 0x11FC */ mVec3_c mChestTranslation;
/* 0x1208 */ mVec3_c field_0x1208;
/* 0x1214 */ u8 _0x1214[0x1238 - 0x1214];
/* 0x1214 */ u8 _0x1214[0x1220 - 0x1214];
/* 0x1238 */ mVec3_c field_0x1238[2];
/* 0x1220 */ mVec3_c field_0x1220;
/* 0x122C */ mVec3_c field_0x122C;
/* 0x1238 */ mVec3_c mToeTranslation[2];
/* 0x1250 */ mVec3_c field_0x1250[2];
/* 0x1268 */ UnkLastBossCcSph2 field_0x1260[8];
/* 0x2948 */ UnkLastBossCcSph1 field_0x2948[1];
/* 0x2B64 */ dEmitter_c mEmitter1;
/* 0x2B64 */ dEmitter_c mWaterEmitter;
/* 0x2B98 */ dEmitter_c mEmitter2;
/* 0x2BCC */ dEmitter_c mEmitter3;
/* 0x2C00 */ dEmitter_c mEmitter4;
@@ -191,7 +342,8 @@ private:
/* 0x2C9C */ dEmitter_c mEmitter7;
/* 0x2CD0 */ LIGHT_INFLUENCE mLightInfo;
/* 0x2CEC */ u16 field_0x2CEC;
/* 0x2CEE */ u8 _0x2CEE[0x2D20 - 0x2CEE];
/* 0x2CEE */ u8 _0x2CEE[0x2D1C - 0x2CEE];
/* 0x2D1C */ const char *field_0x2D1C;
/* 0x2D20 */ dTgSwordBattleGame_c *mpSwordBattleGame;
};
+12 -1
View File
@@ -836,6 +836,12 @@ public:
void OffAtGrp(u32 grp) {
mAt.SetAtFlag(GetAtGrp() & ~grp);
}
void SetTgRpm(u32 f) {
mTg.SetRPrm(f);
}
void SetAtRpm(u32 f) {
mAt.SetRPrm(f);
}
void SetTgFlag_0xA(u16 flag) {
mTg.SetFlag_0xA(flag);
@@ -878,7 +884,9 @@ public:
return mTg.ChkSet();
}
void ClrAtActorInfo() { mAt.ClrActorInfo(); }
void ClrTgActorInfo() { mTg.ClrActorInfo(); }
void ClrCoActorInfo() { mCo.ClrActorInfo(); }
bool ChkAtEffCounter() { return mAt.ChkEffCounter(); }
bool ChkTgEffCounter() { return mTg.ChkEffCounter(); }
void ClrAtEffCounter() { mAt.ClrEffCounter(); }
@@ -981,6 +989,9 @@ public:
void ClrTgElectric() {
return mTg.OffSPrm(0x40000);
}
void ClrTg_0x10000() {
return mTg.OffSPrm(0x10000);
}
u32 ChkTgBonk() const {
return mTg.MskSPrm(0x200000);
}
+12
View File
@@ -414,6 +414,10 @@ public:
return currentSpf;
}
SpfSetting &GetOverrideSpf() {
return mOverrideSpfSetting;
}
const PaletteEAF_smol_entry &getSmallEAF(s32 idx1, s32 idx2) {
return field_0x38E4.field_0x00[idx1].field_0x00[idx2];
}
@@ -430,6 +434,14 @@ public:
return field_0x2F1C;
}
u32 getField_0x38DC() const {
return field_0x38DC;
}
void setField_0x38DC(u32 v) {
field_0x38DC = v;
}
private:
/* 0x0004 */ Spf currentSpf;
/* 0x020C */ Spf spfs[20];
+2
View File
@@ -169,6 +169,8 @@ public:
nw4r::g3d::Camera getCamera(s32 idx);
void fn_80199B60(u8);
dFader_c *getFader() {
return &mFader;
}
+6
View File
@@ -8,6 +8,7 @@
#include "egg/gfx/eggTexture.h"
#include "m/m3d/m_smdl.h"
#include "m/m_allocator.h"
#include "m/m_angle.h"
#include "m/m_mtx.h"
#include "m/m_quat.h"
#include "m/m_vec.h"
@@ -45,6 +46,11 @@ public:
);
void calc(const mMtx_c &mtx, const mVec3_c &v1, bool mass);
void calc(const mMtx_c &mtx, mAng angle, bool mass) {
// A bit of a wild inline but this vector is very low on the dAcBlastboss_c::actorExecute stack
mVec3_c v1 = mVec3_c(angle.sin(), 0.0f, angle.cos());
calc(mtx, v1, mass);
}
bool entry(dAcObjBase_c *obj, dShadowCircle_c *shadow, mQuat_c *quat);
void fn_8006B640();
+363 -54
View File
@@ -5,15 +5,21 @@
#include "common.h"
#include "d/a/d_a_player.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/col/cc/d_cc_s.h"
#include "d/d_base.h"
#include "d/d_light_env.h"
#include "d/d_rumble.h"
#include "d/d_sc_game.h"
#include "d/d_stage_mgr.h"
#include "d/d_vec.h"
#include "d/flag/sceneflag_manager.h"
#include "d/snd/d_snd_wzsound.h"
#include "d/t/d_t_sword_battle_game.h"
#include "f/f_base.h"
#include "f/f_manager.h"
#include "f/f_profile_name.h"
#include "m/m3d/m_fanm.h"
#include "m/m_angle.h"
#include "m/m_mtx.h"
#include "m/m_vec.h"
#include "nw4r/g3d/res/g3d_resfile.h"
@@ -205,7 +211,7 @@ int dAcBlastboss_c::create() {
field_0x11D4 = field_0x11D8 = -1;
mEmitter1.init(this);
mWaterEmitter.init(this);
mEmitter2.init(this);
// mEmitter3.init(this); // TODO why not this one...
mEmitter4.init(this);
@@ -226,6 +232,9 @@ int dAcBlastboss_c::create() {
return SUCCEEDED;
}
// TODO
extern "C" const s16 notsure[] = {0xA000, 0xC000, 0xE000, 0xF000, 0x0000, 0x1000, 0x2000, 0x4000};
int dAcBlastboss_c::doDelete() {
dLightEnv_c::GetPInstance()->plight_cut(&mLightInfo);
return SUCCEEDED;
@@ -245,33 +254,15 @@ int dAcBlastboss_c::actorExecute() {
field_0x1131 = 0;
field_0x1141 = 0;
field_0x114E = 0;
field_0x11A4 = 0.0f;
mLightInfo.mScale = 0.0f;
field_0x11B0 = 0.7f;
if (field_0x1156 != 0) {
field_0x1156--;
}
if (field_0x1158 != 0) {
field_0x1158--;
}
if (field_0x115A != 0) {
field_0x115A--;
}
if (field_0x115C != 0) {
field_0x115C--;
}
if (field_0x115E != 0) {
field_0x115E--;
}
if (field_0x1160 != 0) {
field_0x1160--;
for (int i = 0; i < 6; i++) {
if (field_0x1156[i] != 0) {
field_0x1156[i]--;
}
}
if (mMdlCallback.field_0x04 != 0) {
@@ -294,16 +285,14 @@ int dAcBlastboss_c::actorExecute() {
field_0x113E--;
}
mVec3_c vEff;
mVec3_c linkPos = link->getPosition();
field_0x116A = cLib::targetAngleY(mPosition, linkPos);
// TODO maybe inline
mVec3_c posDiff = link->getPosition() - mPosition;
field_0x1190 = posDiff.absXZ();
field_0x1190 = link->getPosition().absXZTo(mPosition);
field_0x1186 = field_0x116A - mRotation.y;
mSwordMdl.setAttackActive(false);
mCc4.ClrAtSet();
mCc5.ClrAtSet();
@@ -312,9 +301,9 @@ int dAcBlastboss_c::actorExecute() {
mStateMgr.executeState();
}
mRotation.x = mRotationCopy.x;
mRotation.z = mRotationCopy.z;
sLib::addCalcAngle(&mRotation.y.mVal, mRotationCopy.y, 2, 0x800);
mRotation.x = mAngle.x;
mRotation.z = mAngle.z;
sLib::addCalcAngle(&mRotation.y.mVal, mAngle.y, 2, 0x800);
mMdl.play();
if (!field_0x114F) {
@@ -350,7 +339,7 @@ int dAcBlastboss_c::actorExecute() {
mScale.set(0.95f, 0.95f, 0.95f);
mMdl.getModel().setScale(mScale);
mMdl.getModel().setLocalMtx(mWorldMtx);
if (!field_0x114F) {
if (!field_0x1141) {
mAnmTexSrt.play();
}
@@ -359,15 +348,15 @@ int dAcBlastboss_c::actorExecute() {
nw4r::g3d::ResMdl resMdl = mMdl.getModel().getResMdl();
mMtx_c nodeMtx;
mMdl.getModel().getNodeWorldMtx(resMdl.GetResNode("loc_sword01").GetID(), nodeMtx);
mMtx_c rotMtx;
mMtx_c scaleMtx;
scaleMtx.scaleS(1.05f, 1.05f, 1.05f);
MTXConcat(nodeMtx, scaleMtx, nodeMtx);
// TODO - inline?
mVec3_c v(mRotation.y.sin(), 0.0f, mRotation.y.cos());
mSwordMdl.calc(nodeMtx, v, false);
mSwordMdl.calc(nodeMtx, mRotation.y, false);
mVec3_c vEff(0.0f, -120.0f, 0.0f);
vEff.set(0.0f, -120.0f, 0.0f);
// TODO number
if ((s32)field_0x1144 == 9) {
vEff.y = -80.0f;
if (field_0x1190 > 300.0f) {
@@ -415,40 +404,360 @@ int dAcBlastboss_c::actorExecute() {
field_0x114B = 0;
}
// TODO NODE IDs
mMdl.getModel().getNodeWorldMtx(0x26, nodeMtx);
nodeMtx.getTranslation(field_0x11E4);
mMdl.getModel().getNodeWorldMtx(1, nodeMtx);
nodeMtx.getTranslation(field_0x11F0);
mMdl.getModel().getNodeWorldMtx(3, nodeMtx);
nodeMtx.getTranslation(field_0x11FC);
mMdl.getModel().getNodeWorldMtx(0x3C, nodeMtx);
nodeMtx.getTranslation(field_0x1238[0]);
mMdl.getModel().getNodeWorldMtx(0x40, nodeMtx);
nodeMtx.getTranslation(field_0x1238[1]);
mMdl.getModel().getNodeWorldMtx(B_LAST_BOSS_NODE_thumbL2, nodeMtx);
nodeMtx.getTranslation(mThumbL2Translation);
mMdl.getModel().getNodeWorldMtx(B_LAST_BOSS_NODE_backbone1, nodeMtx);
nodeMtx.getTranslation(mBackbone1Translation);
mMdl.getModel().getNodeWorldMtx(B_LAST_BOSS_NODE_chest, nodeMtx);
nodeMtx.getTranslation(mChestTranslation);
mMdl.getModel().getNodeWorldMtx(B_LAST_BOSS_NODE_toeL, nodeMtx);
nodeMtx.getTranslation(mToeTranslation[0]);
mMdl.getModel().getNodeWorldMtx(B_LAST_BOSS_NODE_toeR, nodeMtx);
nodeMtx.getTranslation(mToeTranslation[1]);
mMdl.getModel().getNodeWorldMtx(5, nodeMtx);
mMdl.getModel().getNodeWorldMtx(B_LAST_BOSS_NODE_head, nodeMtx);
mVec3_c tmp1(0.0f, 0.0f, 0.0f);
MTXMultVec(nodeMtx, tmp1, mPositionCopy2);
// TODO
mPositionCopy3 = mVec3_c(mPositionCopy2.x, mPositionCopy2.y + 50.0f, mPositionCopy2.z);
mVec3_c v3;
v3.x = mPositionCopy2.x;
v3.y = mPositionCopy2.y + 50.0f;
v3.z = mPositionCopy2.z;
mPositionCopy3 = v3;
if (field_0x1132) {
fn_80030c20(0, 1500.0f, 50.0f, -200.0f, 200.0f);
}
nodeMtx.YrotS(mRotation.y);
mVec3_c tmpCc;
if (link->isAttacking() && *mStateMgr.getStateID() == StateID_Guard) {
if (field_0x1144 == 9) {
if (link->isAttacking() && mStateMgr.isState(StateID_Guard)) {
// TODO number
if ((s32)field_0x1144 == 9) {
tmpCc.x = 0.0f;
tmpCc.y = 0.0f;
tmpCc.z = 100.0f;
// TODO - ...
if (field_0x1190 > 300.0f) {
tmpCc.z = (field_0x1190 - 300.0f) + 100.0f;
if (tmpCc.z > 300) {
tmpCc.z = 300.0f;
}
}
} else {
tmpCc.x = 0.0f;
tmpCc.y = 0.0f;
tmpCc.z = 130.0f;
}
mCc1.SetR(20.0f);
} else if (mStateMgr.isState(StateID_ThunderWait)) {
tmpCc.set(0.0f, 0.0f, 0.0f);
mCc1.SetR(150.0f);
} else {
tmpCc.set(0.0f, 0.0f, 80.0f);
mCc1.SetR(55.0f);
}
MTXMultVec(nodeMtx, tmpCc, tmpCc);
tmpCc += mPosition;
if (link->isAttacking() && field_0x1190 < 400.0f) {
tmpCc.y += 100.0f;
mCc1.SetH(100.0f);
} else {
mCc1.SetH(250.0f);
}
mCc1.SetC(tmpCc);
// TODO - ...
tmpCc.x = mChestTranslation.x;
tmpCc.y = mChestTranslation.y;
tmpCc.z = mChestTranslation.z;
tmpCc.y = mPosition.y;
if (!field_0x1141) {
mCc3.SetR(100.0f);
} else {
mCc3.SetR(200.0f);
}
mCc3.SetC(tmpCc);
tmpCc.x = mPosition.x;
tmpCc.y = mPosition.y + 150.0f;
tmpCc.z = mPosition.z;
mCc2.SetC(tmpCc);
// TODO
field_0x1250[0] = mToeTranslation[0] + (mToeTranslation[1] - mToeTranslation[0]) * 0.5f;
// UB: this should use string comparison functions for robustness, but
// probably works fine in MWCC
if ((field_0x2D1C == "CatchThunderEnd" || field_0x2D1C == "Stan") && mMdl.getAnm().getFrame() <= 3.0f) {
field_0x11A4 = 25.0f;
}
fn_143_7F80();
if (!link->isAttacking()) {
field_0x1143 = 1;
}
if (field_0x1143 == 0) {
mCc1.SetTg_0x4B(1);
// TODO
mCc1.mTg.field_0x6C = field_0x1208;
} else {
field_0x1143--;
tmpCc.set(0.0f, -10000.0f, 0.0);
mCc1.SetTg_0x4B(1);
// TODO
mCc1.mTg.field_0x6C = tmpCc;
}
mCc1.ClrTg_0x10000();
if (field_0x1142 != 0) {
field_0x1142--;
mCcList.ClrTg();
} else {
mCcList.TgSet();
}
mCcList.registerColliders();
if (field_0x1139 != 0) {
mCc4.OnAtSet();
if (field_0x1139 == 1) {
mCc4.setCenter(mThumbL2Translation);
field_0x1139 = 2;
} else {
mCc4.moveCenter(mThumbL2Translation);
}
dCcS::GetInstance()->Set(&mCc4);
}
static mAng3_c sEffRot(0, 0, 0);
static mVec3_c sEffScale(1.5f, 1.5f, 1.5f);
mVec3_c effPos(mPosition.x, 10.0f, mPosition.z);
// Basically the same code as in dWaterEffect_c::execute
mWaterEmitter.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_127_, effPos, &sEffRot, &sEffScale, nullptr, nullptr);
f32 rate = nw4r::math::FAbs(mSpeed) * 0.02f;
rate = rate > 0.95f ? 0.95f : rate;
mWaterEmitter.setRate(rate + 0.05f);
bool footSplash[2] = {false, false};
// UB: this should use string comparison functions for robustness, but
// probably works fine in MWCC
if (field_0x2D1C == "Walk" || field_0x2D1C == "WalkBt") {
if (mMdl.getAnm().checkFrame(22.0f)) {
footSplash[0] = true;
} else if (mMdl.getAnm().checkFrame(48.0f)) {
footSplash[1] = true;
}
} else if (field_0x2D1C == "TurnR") {
if (mMdl.getAnm().checkFrame(31.0f)) {
footSplash[0] = true;
} else if (mMdl.getAnm().checkFrame(19.0f)) {
footSplash[1] = true;
}
} else if (field_0x2D1C == "TurnL") {
if (mMdl.getAnm().checkFrame(31.0f)) {
footSplash[1] = true;
} else if (mMdl.getAnm().checkFrame(19.0f)) {
footSplash[0] = true;
}
} else if (field_0x2D1C == "AttackBreak") {
if (mMdl.getAnm().checkFrame(16.0f)) {
footSplash[0] = true;
}
} else if (field_0x2D1C == "AttackL") {
if (mMdl.getAnm().checkFrame(26.0f)) {
footSplash[1] = true;
}
} else if (field_0x2D1C == "AttackR") {
if (mMdl.getAnm().checkFrame(24.0f)) {
footSplash[1] = true;
}
} else if (field_0x2D1C == "AttackU") {
if (mMdl.getAnm().checkFrame(10.0f)) {
footSplash[1] = true;
} else if (mMdl.getAnm().checkFrame(24.0f)) {
footSplash[0] = true;
}
} else if (field_0x2D1C == "Counter") {
if (mMdl.getAnm().checkFrame(21.0f)) {
footSplash[0] = true;
} else if (mMdl.getAnm().checkFrame(45.0f)) {
footSplash[1] = true;
}
} else if (field_0x2D1C == "AttackJumpEnd") {
if (mMdl.getAnm().checkFrame(6.0f)) {
footSplash[1] = true;
}
} else if (field_0x2D1C == "DownGetUp") {
if (mMdl.getAnm().checkFrame(137.0f)) {
footSplash[1] = true;
}
} else if (field_0x2D1C == "DownEscapeL") {
if (mMdl.getAnm().checkFrame(15.0f)) {
footSplash[0] = true;
} else if (mMdl.getAnm().checkFrame(17.0f)) {
footSplash[1] = true;
}
} else if (field_0x2D1C == "DownEscapeR") {
if (mMdl.getAnm().checkFrame(15.0f)) {
footSplash[1] = true;
} else if (mMdl.getAnm().checkFrame(17.0f)) {
footSplash[0] = true;
}
} else if (field_0x2D1C == "ThunderDemo") {
if (mMdl.getAnm().checkFrame(18.0f)) {
footSplash[1] = true;
}
} else if (field_0x2D1C == "AttackThunder") {
if (mMdl.getAnm().checkFrame(25.0f)) {
footSplash[0] = true;
}
}
// Spawn splash effects
for (int i = 0; i < 2; i++) {
if (footSplash[i]) {
mToeTranslation[i].y = 10.0f;
dJEffManager_c::spawnEffect(
PARTICLE_RESOURCE_ID_MAPPING_855_, mToeTranslation[i], nullptr, nullptr, nullptr, nullptr, 0, 0
);
}
}
if (field_0x1149 != 0) {
if (!link->checkSwordAndMoreStates(0x400000) && (field_0x1149 < 0 || !mIsSwordEmpowered)) {
if (field_0x1184 == 0) {
if (dLightEnv_c::GetPInstance()->getField_0x38DC() == 0) {
dLightEnv_c::GetPInstance()->setField_0x38DC(1);
fn_143_A110(100);
}
} else if (!mIsSwordEmpowered || (dScGame_c::getUpdateFrameCount() & 0b11) == 0) {
field_0x1184--;
}
} else {
fn_143_A110(100);
}
sLib::addCalcScaledDiff(&field_0x11CC, 1.0f, 1.0f, 0.1f);
}
// TODO: inline doesn't work :(
dLightEnv_c::GetInstance().GetOverrideSpf().mIdxStart = 1;
dLightEnv_c::GetInstance().GetOverrideSpf().mIdxEnd = 2;
dLightEnv_c::GetInstance().GetOverrideSpf().mRatio = field_0x11CC;
if (field_0x1147 && field_0x1148 != 0) {
field_0x1148--;
field_0x1220 += field_0x122C;
nodeMtx.transS(field_0x1220);
nodeMtx.ZXYrotM(field_0x11DC);
if (!field_0x1150) {
if (mCc5.ChkAtHit() || mCc5.ChkTgHit()) {
dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_850_, nodeMtx, nullptr, nullptr, 0, 0);
if (mCc5.ChkTgHit() && mCc5.ChkTgAtHitType(AT_TYPE_BUGNET)) {
getSoundSource()->startSoundAtPosition2(SE_BLasBos_EmitThunderBeam, field_0x1220);
field_0x1148 = 0x3C;
field_0x122C *= -1.0f;
dRumble_c::start(dRumble_c::sRumblePreset2, dRumble_c::FLAG_SLOT0);
dStageMgr_c::GetInstance()->fn_80199B60(3);
field_0x1150 = 1;
} else {
field_0x1147 = 0;
mMtx_c mtx;
mtx.transS(0.0f, -100000.0f, 0.0f);
MTXConcat(nodeMtx, mtx, nodeMtx);
getSoundSource()->startSoundAtPosition2(SE_BLasBos_BeamCrossCrush, field_0x1220);
}
mCc5.SetTgRpm(0);
mCc5.ClrTgActorInfo();
mCc5.SubtractTgEffCounter();
mCc5.SetAtRpm(0);
mCc5.ClrAtActorInfo();
mCc5.SubtractAtEffCounter();
}
} else {
if ((field_0x1220 - mPosition).absXZ() < 150.0f) {
dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_850_, nodeMtx, nullptr, nullptr, 0, 0);
field_0x1147 = false;
mMtx_c mtx;
mtx.transS(0.0f, -100000.0f, 0.0f);
MTXConcat(nodeMtx, mtx, nodeMtx);
getSoundSource()->startSoundAtPosition2(SE_BLasBos_BeamCrossCrush, field_0x1220);
v3.set(0.0f, 0.0f, 20.0f);
rotMtx.YrotS(link->mRotation.y);
MTXMultVec(rotMtx, v3, v3);
field_0x119C = v3.x;
field_0x11A0 = v3.z;
mStateMgr.changeState(StateID_Stun);
}
}
mLightInfo.mPos = field_0x1220;
if ((dScGame_c::getUpdateFrameCount() & 2) != 0) {
mLightInfo.SetScale(300.0f);
} else {
mLightInfo.SetScale(200.0f);
}
if (field_0x1148 <= 10) {
// TODO: lightning timer?
if (field_0x1148 == 10) {
mEmitter5.setFading(10);
}
if (field_0x1148 == 0) {
field_0x1147 = 0;
}
mCc5.ClrAtSet();
} else {
if (!field_0x1150) {
mCc5.OnAtSet();
mCc5.SetR(100.0f);
mCc5.moveCenter(field_0x1220);
dCcS::GetInstance()->Set(&mCc5);
}
getSoundSource()->holdSoundAtPosition(SE_BLasBos_ThunderBeamFly, field_0x1220);
}
mEmitter5.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_618_, nodeMtx, nullptr, nullptr);
}
if (field_0x114A != 0) {
field_0x114A--;
mCc5.OnAtSet();
mCc5.SetC(mPosition);
mCc5.SetR(300.0f - field_0x114A * 30.0f);
mCc5.SetAtVec(link->getPosition() - mPosition);
dCcS::GetInstance()->Set(&mCc5);
if (field_0x114A == 8) {
vEff.x = mPosition.x;
vEff.y = 10.0f;
vEff.z = mPosition.z;
dJEffManager_c::spawnEffect(
PARTICLE_RESOURCE_ID_MAPPING_842_, vEff, nullptr, nullptr, nullptr, nullptr, 0, 0
);
}
}
fn_143_9610();
SceneflagManager *mgr = SceneflagManager::sInstance;
if (mgr != nullptr) {
if (mStateMgr.isState(StateID_ThunderWait)) {
mgr->setFlag(getRoomId(), field_0x1130);
} else {
mgr->unsetFlag(getRoomId(), field_0x1130);
}
}
if (field_0x1149) {
// "Target lock: Demise" (Phase 2)
mTargetFiTextID = 0x38;
} else {
// "Target lock: Demise" (Phase 1)
mTargetFiTextID = 0x37;
}
return SUCCEEDED;
}
+1 -2
View File
@@ -472,8 +472,7 @@ bool dSoundSource_c::startBgHitSound(
return startBgHitSound(soundLabelToSoundId(label), polyAttr0, polyAttr1, position);
}
// exact copy of startSoundAtPosition - used only for when the hookshot
// hits the water level
// exact copy of startSoundAtPosition
bool dSoundSource_c::startSoundAtPosition2(u32 soundId, const nw4r::math::VEC3 *position) {
if (!d_s_vt_0x1AC(soundId)) {
return false;