dAcEKs_c: all non-state functions

This commit is contained in:
elijah-thomas774
2026-05-16 00:35:00 -04:00
parent d2d52cc88c
commit 1737da2a21
5 changed files with 606 additions and 75 deletions
+10 -10
View File
@@ -65,13 +65,13 @@ fn_155_3E90__8dAcEKs_cFv = .text:0x00003E90; // type:function size:0x24
fn_155_3EC0__8dAcEKs_cFv = .text:0x00003EC0; // type:function size:0x24
fn_155_3EF0__8dAcEKs_cFv = .text:0x00003EF0; // type:function size:0x5C
fn_155_3F50__8dAcEKs_cFv = .text:0x00003F50; // type:function size:0x10C
AcEKs__initModels = .text:0x00004060; // type:function size:0x120
AcEKs__init1 = .text:0x00004180; // type:function size:0x57C
AcEKs__init2 = .text:0x00004700; // type:function size:0x178
AcEKs__destroy = .text:0x00004880; // type:function size:0x44
AcEKs__update = .text:0x000048D0; // type:function size:0xCEC
createHeap__8dAcEKs_cFv = .text:0x00004060; // type:function size:0x120
actorCreate__8dAcEKs_cFv = .text:0x00004180; // type:function size:0x57C
actorPostCreate__8dAcEKs_cFv = .text:0x00004700; // type:function size:0x178
doDelete__8dAcEKs_cFv = .text:0x00004880; // type:function size:0x44
actorExecute__8dAcEKs_cFv = .text:0x000048D0; // type:function size:0xCEC
executeState__76sStateMgr_c<8dAcEKs_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000055C0; // type:function size:0x10
AcEKs__draw = .text:0x000055D0; // type:function size:0x1F4
draw__8dAcEKs_cFv = .text:0x000055D0; // type:function size:0x1F4
initializeState_Wait__8dAcEKs_cFv = .text:0x000057D0; // type:function size:0x1EC
executeState_Wait__8dAcEKs_cFv = .text:0x000059C0; // type:function size:0x768
finalizeState_Wait__8dAcEKs_cFv = .text:0x00006130; // type:function size:0xA4
@@ -114,10 +114,10 @@ finalizeState_WindBlow__8dAcEKs_cFv = .text:0x000092E0; // type:function size:0x
initializeState_PathMove__8dAcEKs_cFv = .text:0x00009380; // type:function size:0x184
executeState_PathMove__8dAcEKs_cFv = .text:0x00009510; // type:function size:0x7A8
finalizeState_PathMove__8dAcEKs_cFv = .text:0x00009CC0; // type:function size:0xC
fn_155_9CD0 = .text:0x00009CD0; // type:function size:0x8
fn_155_9CE0 = .text:0x00009CE0; // type:function size:0x4
fn_155_9CF0 = .text:0x00009CF0; // type:function size:0x4
fn_155_9D00 = .text:0x00009D00; // type:function size:0x8
vt_0x88__11dAcEnBase_cFi = .text:0x00009CD0; // type:function size:0x8
vt_0x84__11dAcEnBase_cFv = .text:0x00009CE0; // type:function size:0x4
vt_0x80__11dAcEnBase_cFv = .text:0x00009CF0; // type:function size:0x4
getObjectListEntry__11dAcEnBase_cFv = .text:0x00009D00; // type:function size:0x8
__dt__8dAcEKs_cFv = .text:0x00009D10; // type:function size:0x16C
build__23sFStateFct_c<8dAcEKs_c>FRC12sStateIDIf_c = .text:0x00009E80; // type:function size:0x60
dispose__23sFStateFct_c<8dAcEKs_c>FRP10sStateIf_c = .text:0x00009EE0; // type:function size:0xC
+63 -18
View File
@@ -6,18 +6,20 @@
#include "d/a/e/d_a_en_base.h"
#include "d/col/bg/d_bg_s_acch.h"
#include "d/col/cc/d_cc_d.h"
#include "d/d_light_env.h"
#include "m/m3d/m_anmtexpat.h"
#include "m/m_color.h"
#include "m/m_mtx.h"
#include "m/m_vec.h"
#include "nw4r/g3d/res/g3d_resfile.h"
#include "s/s_State.hpp"
#include "toBeSorted/d_emitter.h"
#include "toBeSorted/d_path.h"
#include "toBeSorted/time_area_mgr.h"
class dTgKiesuTag_c;
class dAcEKs_c : public dAcEnBase_c {
public:
dAcEKs_c() : mStateMgr(*this), field_0xAA8(0.f), field_0xAB0(0) {}
dAcEKs_c() : mStateMgr(*this) {}
virtual ~dAcEKs_c() {}
virtual int doDelete() override;
@@ -46,6 +48,38 @@ public:
STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcEKs_c);
STATE_MGR_DEFINE_UTIL_ISSTATE(dAcEKs_c);
enum Type_e {
EKS_NORMAL,
EKS_FIRE,
EKS_ELECTRIC,
EKS_CURSED,
};
enum StartingStateParam_e {
EKS_STARTSTATE_Move = 0,
EKS_STARTSTATE_Wait = 1,
EKS_STARTSTATE_PathMove = 2,
};
enum State_e {
EKS_STATE_Move = 0,
EKS_STATE_Wait = 1,
EKS_STATE_PathMove = 2,
EKS_STATE_WakeUp = 4,
EKS_STATE_ReturnToWait = 5,
EKS_STATE_Chase = 6,
EKS_STATE_ChaseAttack = 7,
EKS_STATE_Fighting = 8,
EKS_STATE_AttackReady = 9,
EKS_STATE_Attack = 10,
EKS_STATE_Damage = 11,
EKS_STATE_Stun = 12,
EKS_STATE_WindBlow = 13,
};
enum AnmTexPat_e {
EKS_TEXPAT_BLINK1,
EKS_TEXPAT_BLINK2,
EKS_TEXPAT_BLINK3,
};
public:
void linkKiesuTag(dTgKiesuTag_c *pTgKs);
void setStartingState();
@@ -125,13 +159,13 @@ private:
/* 0x9F8 */ dEmitter_c mEmitter2;
/* 0xA2C */ dWaterEffect_c mWaterEmitter;
/* 0xA74 */ ActorOnRail_Ext mRail;
/* 0xAA8 */ f32 field_0xAA8;
/* 0xAAC */ UNKWORD field_0xAAC;
/* 0xAA8 */ u8 field_0xAB0;
/* 0xAB1 */ u8 _0xAB1[0xB14 - 0xAB1];
/* 0xAA8 */ TimeAreaStruct mTimeArea;
/* 0xAB4 */ mMtx_c mCenterWorldMtx;
/* 0xAE4 */ mMtx_c field_0xAE4;
/* 0xB14 */ mVec3_c mPnts[10];
/* 0xB8C */ mVec3_c field_0xB8C;
/* 0xB98 */ u8 _0xB98[0xBB0 - 0xB98];
/* 0xB98 */ mVec3_c field_0xB98;
/* 0xBA4 */ mVec3_c field_0xBA4;
/* 0xBB0 */ mVec3_c mTargetPos;
/* 0xBBC */ mVec3_c field_0xBBC;
/* 0xBC8 */ mVec3_c field_0xBC8;
@@ -152,7 +186,9 @@ private:
/* 0xC48 */ f32 field_0xC48;
/* 0xC4C */ u8 _0xC4C[0xC70 - 0xC4C];
/* 0xC70 */ f32 field_0xC70;
/* 0xC74 */ u8 _0xC74[0xD00 - 0xC74];
/* 0xC74 */ u8 _0xC74[0xCE4 - 0xC74];
/* 0xCE4 */ f32 field_0xCE4;
/* 0xCE8 */ u8 _0xCE8[0xD00 - 0xCE8];
/* 0xD00 */ f32 field_0xD00;
/* 0xD04 */ f32 field_0xD04;
/* 0xD08 */ f32 field_0xD08;
@@ -162,15 +198,22 @@ private:
/* 0xD18 */ f32 field_0xD18;
/* 0xD1C */ f32 field_0xD1C;
/* 0xD20 */ f32 field_0xD20;
/* 0xD24 */ u8 _0xD24[0xD32 - 0xD24];
/* 0xD32 */ s16 mTimer;
/* 0xD24 */ f32 field_0xD24;
/* 0xD28 */ f32 field_0xD28;
/* 0xD2C */ u32 mCenterNode;
/* 0xD30 */ u8 field_0xD30;
/* 0xD31 */ u8 field_0xD31;
/* 0xD32 */ u16 mTimer;
/* 0xD34 */ u8 _0xD34[0xD52 - 0xD34];
/* 0xD52 */ s16 field_0xD52;
/* 0xD54 */ s16 field_0xD54;
/* 0xD56 */ u8 _0xD56[0xD5E - 0xD56];
/* 0xD5E */ s16 field_0xD5E;
/* 0xD60 */ s16 field_0xD60;
/* 0xD62 */ u8 _0xD62[0xD6A - 0xD62];
/* 0xD62 */ s16 field_0xD62;
/* 0xD64 */ s16 field_0xD64;
/* 0xD66 */ s16 field_0xD66;
/* 0xD68 */ s16 field_0xD68;
/* 0xD6A */ s16 field_0xD6A;
/* 0xD6C */ s16 field_0xD6C;
/* 0xD6E */ s16 field_0xD6E;
@@ -199,13 +242,18 @@ private:
/* 0xD9C */ s16 field_0xD9C;
/* 0xD9E */ s16 field_0xD9E;
/* 0xDA0 */ s16 field_0xDA0;
/* 0xDA2 */ u8 _0xDA2[0xDA5 - 0xDA2];
/* 0xDA2 */ u8 _0xDA2[0xDA4 - 0xDA2];
/* 0xDA4 */ u8 field_0xDA4;
/* 0xDA5 */ u8 field_0xDA5;
/* 0xDA6 */ u8 field_0xDA6;
/* 0xDA7 */ u8 field_0xDA7;
/* 0xDA8 */ u8 field_0xDA8;
/* 0xDA9 */ u8 field_0xDA9;
/* 0xDAA */ u8 _0xDAA[0xDAF - 0xDAA];
/* 0xDAA */ u8 field_0xDAA;
/* 0xDAB */ u8 field_0xDAB;
/* 0xDAC */ u8 field_0xDAC;
/* 0xDAD */ u8 field_0xDAD;
/* 0xDAE */ u8 field_0xDAE;
/* 0xDAF */ u8 field_0xDAF;
/* 0xDB0 */ u8 field_0xDB0;
/* 0xDB1 */ u8 field_0xDB1;
@@ -237,11 +285,8 @@ private:
/* 0xDCB */ u8 field_0xDCB;
/* 0xDCC */ u8 _0xDCC[0xDCF - 0xDCC];
/* 0xDCF */ u8 field_0xDCF;
/* 0xDD0 */ u8 _0xDD0[0xDD4 - 0xDD0];
/* 0xDD4 */ mVec3_c mHomePos;
/* 0xDE0 */ mColor mColor;
/* 0xDE4 */ f32 field_0xDE4;
/* 0xDE8 */ u8 _0xDE8[0xDF0 - 0xDE8];
/* 0xDD0 */ u8 field_0xDD0;
/* 0xDD4 */ LIGHT_INFLUENCE mLightInfluence;
// Controlled by dTgKiesuTag_c
static bool lbl_155_bss_388;
+3
View File
@@ -1124,6 +1124,9 @@ public:
void SetCo_0x400() {
mCo.OnSPrm(0x400);
}
void SetCo_0x8000() {
mCo.OnSPrm(0x8000);
}
void SetCo_0x40000000() {
mCo.OnSPrm(0x40000000);
}
+5
View File
@@ -31,6 +31,10 @@ public:
field_0x456++;
}
void setField_0x47A() {
field_0x47A = true;
}
private:
/* 0x0FC */ STATE_MGR_DECLARE(dTgKiesuTag_c);
/* 0x138 */ dAcRef_c<dAcEKs_c> mKsRefs[16];
@@ -90,6 +94,7 @@ private:
/* 0x44A */ s16 mNumKsControl;
/* 0x474 */ bool field_0x474;
/* 0x47A */ bool field_0x47A;
/* 0x47E */ bool mbAllKsActive;
/* 0x48A */ u8 field_0x48A; // Related to getting spawnPos/ Type?
+525 -47
View File
@@ -13,15 +13,27 @@
#include "d/col/bg/d_bg_s_roof_chk.h"
#include "d/col/bg/d_bg_s_wtr_chk.h"
#include "d/col/c/c_cc_d.h"
#include "d/col/cc/d_cc_d.h"
#include "d/col/cc/d_cc_s.h"
#include "d/d_camera.h"
#include "d/d_light_env.h"
#include "d/d_pouch.h"
#include "d/d_sc_game.h"
#include "d/d_stage_mgr.h"
#include "d/flag/storyflag_manager.h"
#include "d/snd/d_snd_wzsound.h"
#include "d/t/d_t_ks.h"
#include "f/f_base.h"
#include "f/f_profile_name.h"
#include "m/m3d/m_fanm.h"
#include "m/m_angle.h"
#include "m/m_color.h"
#include "m/m_quat.h"
#include "m/m_vec.h"
#include "nw4r/g3d/res/g3d_resanmtexpat.h"
#include "nw4r/g3d/res/g3d_resfile.h"
#include "nw4r/g3d/res/g3d_resmdl.h"
#include "nw4r/g3d/res/g3d_resnode.h"
#include "s/s_Math.h"
#include "toBeSorted/attention.h"
#include "toBeSorted/d_emitter.h"
@@ -84,12 +96,16 @@ struct dAcEKs_HIO_c {
f32 _0xB0; // 3.0
s16 _0xB4; // 3h
s16 _0xB6; // 1h
f32 _0xB8; // 0.0099999998
f32 _0xB8; // 0.01
f32 _0xBC; // 100.0
s16 _0xC0; // AABh
s16 _0xC2; // 0h
f32 _0xC4; // -0.5
const s32 getZero() const {
s32 _weird_zero = 0;
return _0x04;
}
static const dAcEKs_HIO_c sInstance;
};
const dAcEKs_HIO_c dAcEKs_HIO_c::sInstance = {
@@ -101,6 +117,8 @@ const dAcEKs_HIO_c dAcEKs_HIO_c::sInstance = {
SPECIAL_ACTOR_PROFILE(E_KS, dAcEKs_c, fProfile::E_KS, 0xFE, 0, 4099);
static dCcD_SrcSph sSrcSph = {{0x400}};
STATE_DEFINE(dAcEKs_c, Wait);
STATE_DEFINE(dAcEKs_c, WakeUp);
STATE_DEFINE(dAcEKs_c, ReturnToWait);
@@ -122,25 +140,25 @@ bool dAcEKs_c::lbl_155_bss_389;
bool dAcEKs_c::restorePosRotFromCopy() {
if (field_0xDCF == 0) {
if (dTimeAreaMgr_c::GetInstance()->fn_800B9B60(mRoomID, mPosition) != 0) {
field_0xAA8 = 0.f;
mTimeArea.setField0x00(0);
mSph.ClrCoSet();
mSph.ClrTgSet();
mSph.ClrAtSet();
fn_800306D0();
if (mType == 1 || mType == 2) {
if (mType == EKS_FIRE || mType == EKS_ELECTRIC) {
field_0xD20 = 0.f;
field_0xDE4 = 0.f;
mLightInfluence.SetScale(0);
if (mEmitter1.hasEmitters()) {
mEmitter1.remove(true);
}
}
} else {
field_0xAA8 = 1.f;
mTimeArea.setField0x00(1);
fn_80030700();
mSph.OnCoSet();
mSph.OnTgSet();
}
mMdl.getModel().setScale(mScale * field_0xAA8);
mMdl.getModel().setScale(mScale * mTimeArea.getDistMaybe());
}
return true;
}
@@ -152,7 +170,7 @@ void dAcEKs_c::linkKiesuTag(dTgKiesuTag_c *pTgKs) {
void dAcEKs_c::setStartingState() {
mTimer = cM::rndInt(1000);
switch (mStartingState) {
case 0: {
case EKS_STARTSTATE_Move: {
changeState(StateID_Move);
mCurrentState = mStartingState;
mAcch.ClrRoofNone();
@@ -160,7 +178,7 @@ void dAcEKs_c::setStartingState() {
mAcch.SetGroundUpY(30.f);
mAcchCir.SetWall(20.f, 60.f);
} break;
case 1: {
case EKS_STARTSTATE_Wait: {
changeState(StateID_Wait);
mCurrentState = mStartingState;
if ((s32)getFromParams(30, 0x3) == 1) {
@@ -172,7 +190,7 @@ void dAcEKs_c::setStartingState() {
mAcchCir.SetWall(0.f, 5.f);
} break;
case 2: {
case EKS_STARTSTATE_PathMove: {
mCurrentState = mStartingState;
mAcch.ClrRoofNone();
mAcch.SetField_0xD4(55.f);
@@ -191,21 +209,21 @@ void dAcEKs_c::setStartingState() {
void dAcEKs_c::setIdleState() {
switch (mStartingState) {
case 0: {
case EKS_STARTSTATE_Move: {
changeState(StateID_Move);
mCurrentState = 0;
mCurrentState = EKS_STATE_Move;
} break;
case 1: {
case EKS_STARTSTATE_Wait: {
changeState(StateID_ReturnToWait);
mCurrentState = 5;
mCurrentState = EKS_STATE_ReturnToWait;
} break;
case 2: {
case EKS_STARTSTATE_PathMove: {
changeState(StateID_PathMove);
mCurrentState = 2;
mCurrentState = EKS_STATE_PathMove;
} break;
default: {
changeState(StateID_Move);
mCurrentState = 0;
mCurrentState = EKS_STATE_Move;
} break;
}
}
@@ -368,7 +386,7 @@ void dAcEKs_c::kill(bool dropItem) {
if (field_0xDB6 != 0) {
killWithFlagNoItemDrop();
} else if (dropItem == true) {
if (mType == 3) {
if (mType == EKS_CURSED) {
if (tryDropItem(0.05f)) {
spawnDrop(ITEM_EVIL_CRYSTAL, mRoomID, mPosition, mAngle);
}
@@ -393,8 +411,8 @@ void dAcEKs_c::chaseTargetY(f32 ratio, f32 maxStepSize) {
void dAcEKs_c::playBlinkAnm() {
mAnmTexPat.play();
if (mAnmTexPat.isStop(0)) {
if (mCurrentAnmTexPat == 2) {
setBlink(0);
if (mCurrentAnmTexPat == EKS_TEXPAT_BLINK3) {
setBlink(EKS_TEXPAT_BLINK1);
}
mBlinkTimer--;
@@ -446,7 +464,7 @@ void dAcEKs_c::fn_155_1470() {
field_0xDC1 = 0;
if (getStartingPos().squareDistanceToXZ(mPosition) < 6400.f) {
changeState(StateID_WaitReady);
mCurrentState = 1;
mCurrentState = EKS_STATE_Wait;
return;
}
} else {
@@ -732,7 +750,7 @@ void dAcEKs_c::fn_155_2270() {
y = y - mRotation.y;
if (field_0xDA6 != 0) {
if (transitionToNextState()) {
if (mType == 2) {
if (mType == EKS_ELECTRIC) {
fn_155_3EC0();
field_0xDA9 = 1;
}
@@ -765,9 +783,9 @@ void dAcEKs_c::fn_155_2270() {
mTgRef.get()->incrementField_0x456();
}
changeState(StateID_AttackReady);
mCurrentState = 9;
mCurrentState = EKS_STATE_AttackReady;
if (mType == 2) {
if (mType == EKS_ELECTRIC) {
fn_155_3EC0();
field_0xDA9 = 1;
}
@@ -1072,19 +1090,19 @@ void dAcEKs_c::fn_155_3480() {
bool dAcEKs_c::transitionToNextState() {
if (mCurrentState != mNextState) {
switch (mNextState) {
case 0: changeState(StateID_Move); break;
case 1: changeState(StateID_Wait); break;
case 4: changeState(StateID_WakeUp); break;
case 5: changeState(StateID_ReturnToWait); break;
case 6: changeState(StateID_Chase); break;
case 7: changeState(StateID_ChaseAttack); break;
case 8: changeState(StateID_Fighting); break;
case 9: changeState(StateID_AttackReady); break;
case 10: changeState(StateID_Attack); break;
case 11: changeState(StateID_Damage); break;
case 12: changeState(StateID_Stun); break;
case 13: changeState(StateID_WindBlow); break;
case 2: changeState(StateID_PathMove); break;
case EKS_STATE_Move: changeState(StateID_Move); break;
case EKS_STATE_Wait: changeState(StateID_Wait); break;
case EKS_STATE_WakeUp: changeState(StateID_WakeUp); break;
case EKS_STATE_ReturnToWait: changeState(StateID_ReturnToWait); break;
case EKS_STATE_Chase: changeState(StateID_Chase); break;
case EKS_STATE_ChaseAttack: changeState(StateID_ChaseAttack); break;
case EKS_STATE_Fighting: changeState(StateID_Fighting); break;
case EKS_STATE_AttackReady: changeState(StateID_AttackReady); break;
case EKS_STATE_Attack: changeState(StateID_Attack); break;
case EKS_STATE_Damage: changeState(StateID_Damage); break;
case EKS_STATE_Stun: changeState(StateID_Stun); break;
case EKS_STATE_WindBlow: changeState(StateID_WindBlow); break;
case EKS_STATE_PathMove: changeState(StateID_PathMove); break;
}
mCurrentState = mNextState;
return true;
@@ -1111,16 +1129,16 @@ void dAcEKs_c::fn_155_3720(f32 scale, f32 rate) {
void dAcEKs_c::fn_155_3750(u8 state) {
switch (state) {
case 0: mNextState = state; break;
case 1: mNextState = 5; break;
case 2: mNextState = state; break;
default: mNextState = 0; break;
case EKS_STATE_Move: mNextState = state; break;
case EKS_STATE_Wait: mNextState = EKS_STATE_ReturnToWait; break;
case EKS_STATE_PathMove: mNextState = state; break;
default: mNextState = EKS_STATE_Move; break;
}
}
void dAcEKs_c::fn_155_37A0() {
mSph.OnAtSet();
if (mType == 2) {
if (mType == EKS_ELECTRIC) {
fn_155_3E90();
field_0xDA9 = 0;
field_0xD60 = 0;
@@ -1128,7 +1146,7 @@ void dAcEKs_c::fn_155_37A0() {
}
void dAcEKs_c::fn_155_37F0() {
if (mType == 2) {
if (mType == EKS_ELECTRIC) {
fn_155_3E90();
field_0xDA9 = 0;
field_0xD60 = 0;
@@ -1137,14 +1155,14 @@ void dAcEKs_c::fn_155_37F0() {
void dAcEKs_c::fn_155_3840() {
mSph.ClrAtSet();
if (mType == 2) {
if (mType == EKS_ELECTRIC) {
fn_155_3EC0();
field_0xDA9 = 1;
}
}
void dAcEKs_c::fn_155_3890() {
if (mType == 2) {
if (mType == EKS_ELECTRIC) {
fn_155_3EC0();
field_0xDA9 = 1;
}
@@ -1207,9 +1225,9 @@ void dAcEKs_c::setBlink(u8 blink) {
nw4r::g3d::ResAnmTexPat pat(nullptr);
mCurrentAnmTexPat = blink;
switch (mCurrentAnmTexPat) {
case 0: pat = mResFile.GetResAnmTexPat("blink_1"); break;
case 1: pat = mResFile.GetResAnmTexPat("blink_2"); break;
case 2: pat = mResFile.GetResAnmTexPat("blink_3"); break;
case EKS_TEXPAT_BLINK1: pat = mResFile.GetResAnmTexPat("blink_1"); break;
case EKS_TEXPAT_BLINK2: pat = mResFile.GetResAnmTexPat("blink_2"); break;
case EKS_TEXPAT_BLINK3: pat = mResFile.GetResAnmTexPat("blink_3"); break;
}
mAnmTexPat.setAnm(mMdl.getModel(), pat, 0, m3d::PLAY_MODE_4);
}
@@ -1270,6 +1288,466 @@ void dAcEKs_c::fn_155_3F50() {
}
}
bool dAcEKs_c::createHeap() {
static const char *resFiles[] = {"Kiesu", "Kiesu_fire", "Kiesu_electric", "KiesuDevil"};
static const char *mdlNames[] = {"kiesu", "F_kiesu", "EKiesu", "DKiesu"};
mType = getFromParams(0, 0x7);
nw4r::g3d::ResFile mdlResFile(getOarcResFile(resFiles[mType]));
nw4r::g3d::ResFile anmResFile(getOarcResFile("Kiesu_anime"));
TRY_CREATE(mMdl.create3(*this, mdlResFile.ptr(), anmResFile.ptr(), mdlNames[mType], "fly", 0x133));
mResFile = mdlResFile;
nw4r::g3d::ResAnmTexPat anmTexPat(mResFile.GetResAnmTexPat("blink_1"));
TRY_CREATE(mAnmTexPat.create(mMdl.getModel().getResMdl(), anmTexPat, &mAllocator, nullptr, 1));
fn_80030980(mMdl.getModel(), 1, false);
mMdl.getModel().setAnm(mAnmTexPat);
return true;
}
int dAcEKs_c::actorCreate() {
if (StoryflagManager::sInstance->getFlag(STORYFLAG_GRATITUDE_QUEST_FINISHED)) {
if (dScGame_c::isCurrentStage("F000") || dScGame_c::isCurrentStage("D000")) {
return FAILED;
}
}
CREATE_ALLOCATOR(dAcEKs_c);
mAcch.Set(this, 1, &mAcchCir);
mAcchCir.SetWall(20, 60);
mStts.SetRank(2);
mSph.Set(sSrcSph);
mSph.SetStts(mStts);
mAcceleration = 0.f;
mMaxSpeed = -40.f;
setStartingPosition(mPosition);
field_0xBE0 = mPosition;
field_0xBEC.set(0, 100, 0);
field_0xC10.set(0, 0, 0);
field_0xCE4 = 500.f;
field_0xDB7 = 0;
field_0xDA5 = 0;
field_0xDA9 = 0;
field_0xDAA = 0;
field_0xDB6 = 0;
field_0xDAC = 1;
field_0xDBE = 45;
field_0xDBB = 0;
field_0xDC1 = 0;
mSph.ClrAtSet();
mHealth = 4;
field_0xD84 = 0;
mEmitter1.init(this);
mEmitter2.init(this);
field_0xDA7 = 0;
field_0xDAD = 0;
field_0xDAE = 0;
field_0xDC8 = 0;
field_0xD04 = 0.f;
field_0xD00 = 0.f;
field_0xD88 = mRotation.y;
field_0xD8A = mRotation.y - 0x8000;
field_0xDBF = 0;
field_0xD60 = 0;
field_0xD62 = 10 + cM::rndInt(5);
field_0xDB1 = 0;
field_0xDCF = (mRotation.z >> 12) & 1;
field_0xD9A = 0;
if (field_0xDCF == 0) {
field_0xDD0 = 0;
mTimeArea.setField0x08(1);
mTimeArea.setField0x00(1);
if (dScGame_c::isCurrentStage("D301")) {
setActorProperty(AC_PROP_0x400);
}
}
field_0xC3C = getFromParams(6, 0xF) * 100.f;
field_0xC40 = getFromParams(10, 0xF) * 100.f;
field_0xC44 = ((mRotation.z >> 0) & 0xF) * 100.f;
field_0xC48 = ((mRotation.z >> 4) & 0xF) * 100.f;
if (!mTgRef.isLinked() || ((mRotation.z >> 8) & 0xF) < 3) {
field_0xDA6 = 0;
}
mAngle.z = mRotation.z = 0;
lbl_155_bss_388 = 0;
lbl_155_bss_389 = 0;
field_0xDB0 = mRail.init(getFromParams(22, 0xFF), mRoomID, 1, 0, false, 0.f, 0.f, 0.01f);
if (field_0xDB0 != 0) {
mRail.setSpeed(15.f);
}
if (field_0xDB0 != 0) {
mStartingState = 2;
} else {
mStartingState = getFromParams(3, 0x7);
}
mVec3_c bboxMin(-250, -800, -250);
mVec3_c bboxMax(250, 250, 250);
mBoundingBox.Set(bboxMin, bboxMax);
field_0xD9C = cM::rndF(0x10000);
field_0xD9E = 0;
mScale.set(1.2, 1.2, 1.2);
mMdl.getModel().setScale(mScale);
mWaterEmitter.init(this, 30, 1, 0);
if (mType != EKS_NORMAL) {
field_0xDA4 = 1;
nw4r::g3d::ResNode node = mMdl.getModel().getResMdl().GetResNode("center");
mCenterNode = node.GetID();
} else {
field_0xDA4 = 0;
}
if (mType == EKS_FIRE) {
mSph.SetAtModifier(AT_MOD_FIRE);
mSph.SetCo_0x8000();
mTargetFiTextID = 0xE;
} else if (mType == EKS_ELECTRIC) {
mSph.SetAtModifier(AT_MOD_ELECTRIC);
field_0xDA9 = 1;
mTargetFiTextID = 0xD;
} else if (mType == EKS_CURSED) {
mSph.SetAtModifier(AT_MOD_CURSED);
mTargetFiTextID = 0xC;
}
if (mType == EKS_FIRE) {
mLightInfluence.mPos = mPosition;
mLightInfluence.mClr.Set(0xFF, 0xA0, 0x50, 0xFF);
mLightInfluence.SetScale(400);
field_0xD20 = 400.f;
field_0xD24 = 1.f;
field_0xD28 = 40.f;
dLightEnv_c::GetPInstance()->plight_set(&mLightInfluence);
} else if (mType == EKS_ELECTRIC) {
mLightInfluence.mPos = mPosition;
mLightInfluence.mClr.Set(0x64, 0xFF, 0xFF, 0xFF);
mLightInfluence.SetScale(300);
field_0xD20 = 400.f;
field_0xD24 = 1.f;
field_0xD28 = 40.f;
dLightEnv_c::GetPInstance()->plight_set(&mLightInfluence);
}
setStartingState();
mAcch.CrrPos(*dBgS::GetInstance());
return SUCCEEDED;
}
int dAcEKs_c::actorPostCreate() {
if (field_0xDCF == 0) {
if (dTimeAreaMgr_c::GetInstance()->fn_800B9B60(mRoomID, mPosition)) {
mTimeArea.setField0x00(0.f);
}
mMdl.getModel().setScale(mScale * mTimeArea.getDistMaybe());
}
if (isState(StateID_Wait)) {
mPosition.y = getLineCrossYRange(mPosition, 200);
setStartingPosition(mPosition);
}
mPnts[0].set(mStartingPos);
if (isState(StateID_Wait)) {
mPnts[0].y -= 20.f;
}
updateMatrix();
return SUCCEEDED;
}
int dAcEKs_c::doDelete() {
if (mType == EKS_FIRE || mType == EKS_ELECTRIC) {
dLightEnv_c::GetPInstance()->plight_cut(&mLightInfluence);
}
return SUCCEEDED;
}
int dAcEKs_c::actorExecute() {
s32 _weird_zero = 0;
mTimer++;
if (field_0xDCF == 0) {
int checkedTime = mTimeArea.check(mRoomID, mPosition, 0, 30, 0.2);
if (checkedTime != 0) {
if (checkedTime > 0) {
startSound(SE_TIMESLIP_TIMESLIP);
field_0xD9A = 15;
} else {
startSound(SE_TIMESLIP_TIMESLIP_REV);
mSph.OnCoSet();
mSph.OnTgSet();
}
static mVec3_c effScale(1, 1, 1);
dJEffManager_c::spawnEffect(
PARTICLE_RESOURCE_ID_MAPPING_464_, mPosition, nullptr, &effScale, nullptr, nullptr, 0, 0
);
fn_80030700();
}
if (mTimeArea.isNearZero()) {
mSph.ClrCoSet();
mSph.ClrTgSet();
mSph.ClrAtSet();
fn_800306D0();
if (mType == EKS_FIRE || mType == EKS_ELECTRIC) {
field_0xD20 = 0.f;
mLightInfluence.SetScale(0.f);
}
return SUCCEEDED;
}
if (field_0xD9A > 0) {
field_0xD9A--;
}
}
if (mHealth != 0) {
fn_155_A60();
}
mStateMgr.executeState();
field_0xD9C++;
if (isState(StateID_Chase) || isState(StateID_ChaseAttack) || isState(StateID_Fighting) ||
isState(StateID_AttackReady) || isState(StateID_Attack) || isState(StateID_WindBlow)) {
fn_155_3F50();
}
if (mType == EKS_FIRE) {
if (field_0xDA9 != 0 || isState(StateID_Wait)) {
field_0xD20 = 0.f;
mLightInfluence.SetScale(0.f);
} else {
if (field_0xD60 > 0) {
field_0xD20 = 0.f;
} else {
field_0xD20 = 400.f;
}
}
mLightInfluence.mClr.Set(0xFF, 0xA0, 0x50, 0xFF);
sLib::addCalcScaledDiff(&mLightInfluence.mScale, field_0xD20, field_0xD24, field_0xD28);
} else if (mType == EKS_ELECTRIC) {
if (field_0xDA9 != 0 || isState(StateID_Wait) || field_0xD60 > 0) {
field_0xD20 = 0.f;
mLightInfluence.SetScale(0.f);
} else {
if ((dScGame_c::getUpdateFrameCount() & 8) != 0) {
mLightInfluence.SetScale(300.f);
} else {
mLightInfluence.SetScale(200.f);
}
}
mLightInfluence.mClr.Set(0x64, 0xFF, 0xFF, 0xFF);
}
if (!isState(StateID_WindBlow)) {
if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_BELLOWS) && mSph.GetTgDamageFlags() == 0x8) {
if (field_0xDA6 != 0) {
mCurrentState = EKS_STATE_WindBlow;
if (mTgRef.isLinked()) {
mTgRef.get()->setField_0x47A();
}
}
mVelocity.set(0, 0, 0);
mAngle.y = cLib::targetAngleY(dAcPy_c::GetLink()->mPositionCopy2, mPosition);
mAngle.x = cLib::targetAngleX(dAcPy_c::GetLink()->mPositionCopy2, mPosition);
// I Guess we funky
s32 t = 7281;
field_0xD66 = (cM::rndFX(0.25f + (0.01f * _weird_zero)) + (0.75f + (0.01f * _weird_zero))) * t;
field_0xD68 = (cM::rndFX(0.25f + (0.01f * _weird_zero)) + (0.65f + (0.01f * _weird_zero))) * t;
if (field_0xD66 < 0) {
field_0xD64 = -910;
} else {
field_0xD64 = 910;
}
if (isState(StateID_Wait)) {
mSpeed = 0.f;
mVelocity.set(0, 0, 0);
field_0xDAA = 1;
mPosition.y -= 30.f;
changeState(StateID_WindBlow);
} else {
mSpeed = 35.f;
if (mAngle.x > 0xAAB) {
mVelocity.y = 15.f;
} else if (mAngle.x < -0xAAB) {
mVelocity.y = -15.f;
}
changeState(StateID_WindBlow);
}
}
}
calcVelocity();
mPosition += mVelocity;
mPosition += mStts.GetCcMove();
if (!(isState(StateID_Wait) || isState(StateID_WaitReady))) {
mAcch.CrrPos(*dBgS::GetInstance());
mWaterEmitter.execute(mAcch.GetWtrGroundH(), mAcch.GetGroundH());
}
if (field_0xDCF == 0) {
mMdl.getModel().setScale(mScale * mTimeArea.getDistMaybe());
} else {
mMdl.getModel().setScale(mScale);
}
updateMatrix();
mMdl.getModel().setLocalMtx(mWorldMtx);
mMdl.getModel().calc(false);
mSph.SetC(mPosition + field_0xC10);
dCcS::GetInstance()->Set(&mSph);
if (isNotWaitingNorDamage()) {
mPositionCopy2.set(mPosition);
mPositionCopy3.set(mPosition);
if (!isState(StateID_Stun)) {
mPositionCopy3.y += 60.f;
} else {
mPositionCopy3.y += 40.f;
}
fn_80030c20(0x2, 700, 50, -500, 500);
}
fn_80030400(mMdl.getModel(), 100, false, field_0xDBF);
if (field_0xD30 != 0) {
if (checkObjectProperty(OBJ_PROP_0x1)) {
field_0xD31 = 0;
} else {
if ((mTimer % 12) == 0) {
mVec3_c start = mPosition;
mVec3_c end = dScGame_c::getCamera()->getPosition();
end.y += 100.f;
end += start;
end *= 0.5f;
if (dBgS_ObjLinChk::LineCross(&start, &end, nullptr)) {
field_0xD31 = 0;
} else {
field_0xD31 = 1;
}
}
}
} else {
field_0xD31 = 1;
if (checkObjectProperty(OBJ_PROP_0x1)) {
field_0xD31 = 0;
}
}
if (field_0xDA9 == 0) {
if (!isState(StateID_Wait) && field_0xDA4 != 0) {
if (mType == EKS_FIRE) {
if (field_0xD60 > 0) {
field_0xD60--;
} else {
if (field_0xD31 != 0) {
holdSound(SE_EKs_FIRE_LV);
mMdl.getModel().getNodeWorldMtx(mCenterNode, mCenterWorldMtx);
mCenterWorldMtx.getTranslation(field_0xB98);
mEmitter1.holdEffect(
PARTICLE_RESOURCE_ID_MAPPING_402_, field_0xB98, nullptr, &mScale, nullptr, nullptr
);
mLightInfluence.mPos = field_0xB98;
}
}
} else if (mType == EKS_ELECTRIC) {
if (field_0xD60 > 0) {
field_0xD60--;
} else {
if (field_0xD31 != 0) {
fn_155_3E90();
holdSound(SE_EKs_ELEC_LV);
mMdl.getModel().getNodeWorldMtx(mCenterNode, mCenterWorldMtx);
mCenterWorldMtx.getTranslation(field_0xB98);
mEmitter1.holdEffect(
PARTICLE_RESOURCE_ID_MAPPING_401_, field_0xB98, nullptr, &mScale, nullptr, nullptr
);
mLightInfluence.mPos = field_0xB98;
}
}
} else if (mType == EKS_CURSED) {
if (field_0xD60 > 0) {
field_0xD60--;
} else {
if (field_0xD31 != 0) {
holdSound(SE_EKs_MA_LV);
mMdl.getModel().getNodeWorldMtx(mCenterNode, mCenterWorldMtx);
mCenterWorldMtx.getTranslation(field_0xB98);
mEmitter1.holdEffect(
PARTICLE_RESOURCE_ID_MAPPING_400_, field_0xB98, nullptr, &mScale, nullptr, nullptr
);
mEmitter1.setGlobalAlpha(dStageMgr_c::GetInstance()->getGlobalAlpha());
}
}
}
}
}
return SUCCEEDED;
}
int dAcEKs_c::draw() {
if (field_0xDCF == 0 && mTimeArea.isNearZero()) {
return SUCCEEDED;
}
if (field_0xDA9 == 0 && !isState(StateID_Wait) && field_0xDA4 != 0) {
if (mType == EKS_FIRE || mType == EKS_ELECTRIC) {
mLightingInfo.mLightingCode = 0xF;
}
}
drawModelType1(&mMdl.getModel());
if (!isState(StateID_Wait)) {
field_0xD18 = mPosition.y - mAcch.GetGroundH();
// I hate this xD
mQuat_c shadowRot(
mVec3_c(0.f + dAcEKs_HIO_c::sInstance.getZero(), 5, 0.f + dAcEKs_HIO_c::sInstance.getZero()),
50.f + dAcEKs_HIO_c::sInstance.getZero()
);
field_0xAE4.transS(mPosition);
drawShadow(mShadow, nullptr, field_0xAE4, &shadowRot, -1, -1, -1, -1, -1, field_0xD18);
}
return SUCCEEDED;
}
void dAcEKs_c::initializeState_Wait() {}
void dAcEKs_c::executeState_Wait() {}
void dAcEKs_c::finalizeState_Wait() {}