summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelijah-thomas774 <elijahthomas774@gmail.com>2026-09-24 17:21:34 -0400
committerelijah-thomas774 <elijahthomas774@gmail.com>2026-09-24 17:21:34 -0400
commitfe566ba5dbc764a01774643f8a47b7ff5d53fd87 (patch)
treedbdcba8daa19d66a0512154aa1a0576b189b1923
parent93e4f125268d37b96059629a00ae76aa18a46d7c (diff)
d_a_e_skytail OK
-rw-r--r--config/SOUE01/rels/d_a_birdNP/symbols.txt4
-rw-r--r--config/SOUE01/rels/d_a_e_skytailNP/symbols.txt86
-rw-r--r--config/SOUE01/symbols.txt2
-rw-r--r--configure.py2
-rw-r--r--include/d/a/d_a_bird.h22
-rw-r--r--include/d/a/e/d_a_e_skytail.h211
-rw-r--r--include/d/a/e/d_a_en_base.h2
-rw-r--r--src/REL/d/a/e/d_a_e_skytail.cpp1225
-rw-r--r--src/d/a/e/d_a_en_base.cpp18
9 files changed, 1508 insertions, 64 deletions
diff --git a/config/SOUE01/rels/d_a_birdNP/symbols.txt b/config/SOUE01/rels/d_a_birdNP/symbols.txt
index a458e3bd..8ad9fb31 100644
--- a/config/SOUE01/rels/d_a_birdNP/symbols.txt
+++ b/config/SOUE01/rels/d_a_birdNP/symbols.txt
@@ -138,7 +138,7 @@ fn_129_C390 = .text:0x0000C390; // type:function size:0x40
fn_129_C3D0 = .text:0x0000C3D0; // type:function size:0xA8
fn_129_C480 = .text:0x0000C480; // type:function size:0x14
fn_129_C494 = .text:0x0000C494; // type:function size:0x4
-fn_129_C4A0 = .text:0x0000C4A0; // type:function size:0xA4
+fn_129_C4A0__7dBird_cFR7mVec3_cUs = .text:0x0000C4A0; // type:function size:0xA4
AcBird__handleDamage = .text:0x0000C550; // type:function size:0x208
fn_129_C760 = .text:0x0000C760; // type:function size:0x4C
AcBird__setDamageAnim = .text:0x0000C7B0; // type:function size:0x50
@@ -149,7 +149,7 @@ fn_129_C980 = .text:0x0000C980; // type:function size:0xC4
fn_129_CA50 = .text:0x0000CA50; // type:function size:0x298
fn_129_CCF0 = .text:0x0000CCF0; // type:function size:0x18
fn_129_CD10 = .text:0x0000CD10; // type:function size:0x29C
-fn_129_CFB0 = .text:0x0000CFB0; // type:function size:0x24
+fn_129_CFB0__7dBird_cFv = .text:0x0000CFB0; // type:function size:0x24
fn_129_CFE0 = .text:0x0000CFE0; // type:function size:0x50
fn_129_D030 = .text:0x0000D030; // type:function size:0x4
fn_129_D040 = .text:0x0000D040; // type:function size:0x28
diff --git a/config/SOUE01/rels/d_a_e_skytailNP/symbols.txt b/config/SOUE01/rels/d_a_e_skytailNP/symbols.txt
index b668e169..007c3a42 100644
--- a/config/SOUE01/rels/d_a_e_skytailNP/symbols.txt
+++ b/config/SOUE01/rels/d_a_e_skytailNP/symbols.txt
@@ -3,32 +3,32 @@ _epilog = .text:0x00000030; // type:function size:0x2C scope:global
_unresolved = .text:0x00000060; // type:function size:0x4 scope:global
__register_global_object = .text:0x00000070; // type:function size:0x1C scope:global
__destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global
-fn_172_F0 = .text:0x000000F0; // type:function size:0x40
+__dt__7mVec3_cFv = .text:0x000000F0; // type:function size:0x40
dAcESkytail_c_classInit__Fv = .text:0x00000130; // type:function size:0x164
-fn_172_2A0 = .text:0x000002A0; // type:function size:0x58
-fn_172_300 = .text:0x00000300; // type:function size:0x90
+__ct__22dCcD_Linked<8dCcD_Sph>Fv = .text:0x000002A0; // type:function size:0x58
+__dt__22dCcD_Linked<8dCcD_Sph>Fv = .text:0x00000300; // type:function size:0x90
__dt__26sFState_c<13dAcESkytail_c>Fv = .text:0x00000390; // type:function size:0x58
__dt__29sFStateFct_c<13dAcESkytail_c>Fv = .text:0x000003F0; // type:function size:0x6C
__dt__82sStateMgr_c<13dAcESkytail_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000460; // type:function size:0xA0
__dt__52sFStateMgr_c<13dAcESkytail_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000500; // type:function size:0xA4
-fn_172_5B0 = .text:0x000005B0; // type:function size:0x4
-fn_172_5C0 = .text:0x000005C0; // type:function size:0x74
-fn_172_640 = .text:0x00000640; // type:function size:0x58
-fn_172_6A0 = .text:0x000006A0; // type:function size:0x74
-fn_172_720 = .text:0x00000720; // type:function size:0x264
-fn_172_990 = .text:0x00000990; // type:function size:0xB0
-fn_172_A40 = .text:0x00000A40; // type:function size:0x1FC
-fn_172_C40 = .text:0x00000C40; // type:function size:0x4C
+__ct__7mVec3_cFv = .text:0x000005B0; // type:function size:0x4
+__dt__Q213dAcESkytail_c14callbackBody_cFv = .text:0x000005C0; // type:function size:0x74
+__ct__Q213dAcESkytail_c17callbackAntenna_cFv = .text:0x00000640; // type:function size:0x58
+__dt__Q213dAcESkytail_c17callbackAntenna_cFv = .text:0x000006A0; // type:function size:0x74
+timingB__Q213dAcESkytail_c14callbackBody_cFUlPQ34nw4r3g3d13WorldMtxManipQ34nw4r3g3d6ResMdl = .text:0x00000720; // type:function size:0x264
+timingB__Q213dAcESkytail_c17callbackAntenna_cFUlPQ34nw4r3g3d13WorldMtxManipQ34nw4r3g3d6ResMdl = .text:0x00000990; // type:function size:0xB0
+fn_172_A40__13dAcESkytail_cFv = .text:0x00000A40; // type:function size:0x1FC
+ChkTgHit__8cCcD_ObjFv = .text:0x00000C40; // type:function size:0x4C
changeState__82sStateMgr_c<13dAcESkytail_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000C90; // type:function size:0x10
-fn_172_CA0 = .text:0x00000CA0; // type:function size:0x1C
-fn_172_CC0 = .text:0x00000CC0; // type:function size:0xE8
-fn_172_DB0 = .text:0x00000DB0; // type:function size:0x31C
-fn_172_10D0 = .text:0x000010D0; // type:function size:0x8
-fn_172_10E0 = .text:0x000010E0; // type:function size:0xC0C
+calcTimer<s>__4sLibFPs_s = .text:0x00000CA0; // type:function size:0x1C
+createHeap__13dAcESkytail_cFv = .text:0x00000CC0; // type:function size:0xE8
+create__13dAcESkytail_cFv = .text:0x00000DB0; // type:function size:0x31C
+doDelete__13dAcESkytail_cFv = .text:0x000010D0; // type:function size:0x8
+actorExecute__13dAcESkytail_cFv = .text:0x000010E0; // type:function size:0xC0C
getStateID__82sStateMgr_c<13dAcESkytail_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00001CF0; // type:function size:0x10
executeState__82sStateMgr_c<13dAcESkytail_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00001D00; // type:function size:0x10
-fn_172_1D10 = .text:0x00001D10; // type:function size:0x4C
-fn_172_1D60 = .text:0x00001D60; // type:function size:0x68
+ChkCoHit__8cCcD_ObjFv = .text:0x00001D10; // type:function size:0x4C
+draw__13dAcESkytail_cFv = .text:0x00001D60; // type:function size:0x68
initializeState_RandomMove__13dAcESkytail_cFv = .text:0x00001DD0; // type:function size:0x9C
executeState_RandomMove__13dAcESkytail_cFv = .text:0x00001E70; // type:function size:0x1EC
finalizeState_RandomMove__13dAcESkytail_cFv = .text:0x00002060; // type:function size:0x10
@@ -37,7 +37,7 @@ executeState_Move__13dAcESkytail_cFv = .text:0x00002080; // type:function size:0
finalizeState_Move__13dAcESkytail_cFv = .text:0x00002430; // type:function size:0x4
initializeState_ParallelMove__13dAcESkytail_cFv = .text:0x00002440; // type:function size:0x90
executeState_ParallelMove__13dAcESkytail_cFv = .text:0x000024D0; // type:function size:0xB30
-fn_172_3000 = .text:0x00003000; // type:function size:0x48
+ChkAtHit__8cCcD_ObjFv = .text:0x00003000; // type:function size:0x48
finalizeState_ParallelMove__13dAcESkytail_cFv = .text:0x00003050; // type:function size:0x1C
initializeState_FrontAttack__13dAcESkytail_cFv = .text:0x00003070; // type:function size:0x78
executeState_FrontAttack__13dAcESkytail_cFv = .text:0x000030F0; // type:function size:0x588
@@ -51,15 +51,15 @@ finalizeState_Dead__13dAcESkytail_cFv = .text:0x00003B80; // type:function size:
initializeState_Skytail__13dAcESkytail_cFv = .text:0x00003B90; // type:function size:0x4
executeState_Skytail__13dAcESkytail_cFv = .text:0x00003BA0; // type:function size:0x118
finalizeState_Skytail__13dAcESkytail_cFv = .text:0x00003CC0; // type:function size:0x4
-fn_172_3CD0 = .text:0x00003CD0; // type:function size:0x570
-fn_172_4240 = .text:0x00004240; // type:function size:0x384
-fn_172_45D0 = .text:0x000045D0; // type:function size:0x4
-fn_172_45E0 = .text:0x000045E0; // type:function size:0x4
-fn_172_45F0 = .text:0x000045F0; // type:function size:0x40
-fn_172_4630 = .text:0x00004630; // type:function size:0x8
-fn_172_4640 = .text:0x00004640; // type:function size:0x4
-fn_172_4650 = .text:0x00004650; // type:function size:0x4
-fn_172_4660 = .text:0x00004660; // type:function size:0x8
+fn_172_3CD0__13dAcESkytail_cFv = .text:0x00003CD0; // type:function size:0x570
+fn_172_4240__13dAcESkytail_cFl = .text:0x00004240; // type:function size:0x384
+fn_172_45D0__13dAcESkytail_cFv = .text:0x000045D0; // type:function size:0x4
+fn_172_45E0__13dAcESkytail_cFv = .text:0x000045E0; // type:function size:0x4
+fn_172_45F0__13dAcESkytail_cFv = .text:0x000045F0; // type:function size:0x40
+vt_0x88__11dAcEnBase_cFi = .text:0x00004630; // type:function size:0x8
+vt_0x84__11dAcEnBase_cFv = .text:0x00004640; // type:function size:0x4
+vt_0x80__11dAcEnBase_cFv = .text:0x00004650; // type:function size:0x4
+getObjectListEntry__11dAcEnBase_cFv = .text:0x00004660; // type:function size:0x8
__dt__13dAcESkytail_cFv = .text:0x00004670; // type:function size:0x164
build__29sFStateFct_c<13dAcESkytail_c>FRC12sStateIDIf_c = .text:0x000047E0; // type:function size:0x60
dispose__29sFStateFct_c<13dAcESkytail_c>FRP10sStateIf_c = .text:0x00004840; // type:function size:0xC
@@ -78,7 +78,7 @@ initializeState__28sFStateID_c<13dAcESkytail_c>CFR13dAcESkytail_c = .text:0x0000
__sinit_\d_a_e_skytail_cpp = .text:0x000049A0; // type:function size:0x5DC scope:local
__dt__28sFStateID_c<13dAcESkytail_c>Fv = .text:0x00004F80; // type:function size:0x58
isSameName__28sFStateID_c<13dAcESkytail_c>CFPCc = .text:0x00004FE0; // type:function size:0x88
-fn_172_5070 = .text:0x00005070; // type:function size:0x8
+@272@__dt__22dCcD_Linked<8dCcD_Sph>Fv = .text:0x00005070; // type:function size:0x8
_ctors = .ctors:0x00000000; // type:label scope:global
_dtors = .dtors:0x00000000; // type:label scope:global
__destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global
@@ -97,21 +97,23 @@ lbl_172_data_F0 = .data:0x000000F0; // type:object size:0xC data:4byte
lbl_172_data_FC = .data:0x000000FC; // type:object size:0x4 data:4byte
lbl_172_data_100 = .data:0x00000100; // type:object size:0x4 data:4byte
lbl_172_data_104 = .data:0x00000104; // type:object size:0x4 data:4byte
-lbl_172_data_108 = .data:0x00000108; // type:object size:0x90
-lbl_172_data_198 = .data:0x00000198; // type:object size:0x30
-lbl_172_data_1C8 = .data:0x000001C8; // type:object size:0x30
-lbl_172_data_1F8 = .data:0x000001F8; // type:object size:0x18
-lbl_172_data_210 = .data:0x00000210; // type:object size:0x18
-lbl_172_data_228 = .data:0x00000228; // type:object size:0x70
-lbl_172_data_298 = .data:0x00000298; // type:object size:0x18
-lbl_172_data_2B0 = .data:0x000002B0; // type:object size:0x1F8
+__vt__13dAcESkytail_c = .data:0x00000108; // type:object size:0x8C
+__vt__52sFStateMgr_c<13dAcESkytail_c,20sStateMethodUsr_FI_c> = .data:0x00000198; // type:object size:0x30
+__vt__82sStateMgr_c<13dAcESkytail_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x000001C8; // type:object size:0x30
+__vt__29sFStateFct_c<13dAcESkytail_c> = .data:0x000001F8; // type:object size:0x14
+__vt__26sFState_c<13dAcESkytail_c> = .data:0x00000210; // type:object size:0x18
+__vt__22dCcD_Linked<8dCcD_Sph> = .data:0x00000228; // type:object size:0x70
+__vt__Q213dAcESkytail_c17callbackAntenna_c = .data:0x00000298; // type:object size:0x18
+__vt__Q213dAcESkytail_c14callbackBody_c = .data:0x000002B0; // type:object size:0x1F8
lbl_172_data_4A8 = .data:0x000004A8; // type:object size:0x34
__global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global
lbl_172_bss_8 = .bss:0x00000008; // type:object size:0x10 align:4 data:float
-lbl_172_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte
-lbl_172_bss_58 = .bss:0x00000058; // type:object size:0x40 data:4byte
-lbl_172_bss_98 = .bss:0x00000098; // type:object size:0x40 data:4byte
-lbl_172_bss_D8 = .bss:0x000000D8; // type:object size:0x80 data:4byte
-lbl_172_bss_158 = .bss:0x00000158; // type:object size:0xCC data:4byte
+StateID_RandomMove__13dAcESkytail_c = .bss:0x00000018; // type:object size:0x30 data:4byte
+StateID_Move__13dAcESkytail_c = .bss:0x00000058; // type:object size:0x30 data:4byte
+StateID_ParallelMove__13dAcESkytail_c = .bss:0x00000098; // type:object size:0x30 data:4byte
+StateID_FrontAttack__13dAcESkytail_c = .bss:0x000000D8; // type:object size:0x30 data:4byte
+StateID_Charge__13dAcESkytail_c = .bss:0x00000118; // type:object size:0x30 data:4byte
+StateID_Dead__13dAcESkytail_c = .bss:0x00000158; // type:object size:0x30 data:4byte
+StateID_Skytail__13dAcESkytail_c = .bss:0x00000198; // type:object size:0x30 data:4byte
lbl_172_bss_224 = .bss:0x00000224; // type:object size:0x1 data:byte
lbl_172_bss_228 = .bss:0x00000228; // type:object size:0xC align:4 data:float
diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt
index ebb23b73..deff4dfd 100644
--- a/config/SOUE01/symbols.txt
+++ b/config/SOUE01/symbols.txt
@@ -1187,7 +1187,7 @@ fn_800307E0 = .text:0x800307E0; // type:function size:0x34
fn_80030820 = .text:0x80030820; // type:function size:0x14
fn_80030840 = .text:0x80030840; // type:function size:0x13C
fn_80030980__11dAcEnBase_cFRQ23m3d5mdl_clb = .text:0x80030980; // type:function size:0x188
-fn_80030B10 = .text:0x80030B10; // type:function size:0x10C
+isWithinCameraView__11dAcEnBase_cFff = .text:0x80030B10; // type:function size:0x10C
fn_80030c20__11dAcEnBase_cFUlffff = .text:0x80030C20; // type:function size:0x28
fn_80030C50 = .text:0x80030C50; // type:function size:0x8
fn_80030C60 = .text:0x80030C60; // type:function size:0x4
diff --git a/configure.py b/configure.py
index ac00f458..c4088ae7 100644
--- a/configure.py
+++ b/configure.py
@@ -2138,7 +2138,7 @@ config.libs = [
Rel(NonMatching, "d_a_e_sf4", "REL/d/a/e/d_a_e_sf4.cpp"),
Rel(NonMatching, "d_a_e_sf", "REL/d/a/e/d_a_e_sf.cpp"),
Rel(NonMatching, "d_a_e_siren", "REL/d/a/e/d_a_e_siren.cpp"),
- Rel(NonMatching, "d_a_e_skytail", "REL/d/a/e/d_a_e_skytail.cpp"),
+ Rel(Matching, "d_a_e_skytail", "REL/d/a/e/d_a_e_skytail.cpp"),
Rel(NonMatching, "d_a_e_sm", "REL/d/a/e/d_a_e_sm.cpp"),
Rel(NonMatching, "d_a_e_spark", "REL/d/a/e/d_a_e_spark.cpp"),
Rel(NonMatching, "d_a_e_st", "REL/d/a/e/d_a_e_st.cpp"),
diff --git a/include/d/a/d_a_bird.h b/include/d/a/d_a_bird.h
index a4afd616..cbe18b90 100644
--- a/include/d/a/d_a_bird.h
+++ b/include/d/a/d_a_bird.h
@@ -2,6 +2,7 @@
#define D_A_BIRD_H
#include "d/a/obj/d_a_obj_base.h"
+#include "m/m_vec.h"
#include "s/s_State.hpp"
class dBird_c : public dAcObjBase_c {
@@ -28,19 +29,38 @@ public:
// fn_129_8DD0, only referenced by d_a_obj_bird_sp
void accelerateTowards(mVec3_c &targetDirection);
+ void fn_129_C4A0(mVec3_c &out, u16);
+ bool fn_129_CFB0();
+
s16 getNumDashes() const {
return mNumDashes;
}
+ const mVec3_c &getField_0xFAC() const {
+ return field_0xFAC;
+ }
+ s16 getField_0xFCC() const {
+ return field_0xFCC;
+ }
static dBird_c *getInstance() {
return spInstance;
}
+ dAcObjRef_c &getRef_0xEB8() {
+ return field_0xEB8;
+ }
+
private:
static dBird_c *spInstance;
/* 0x??? */ STATE_MGR_DECLARE(dBird_c);
- u8 _0x36C[0xF8E - 0x36C];
+ u8 _0x36C[0xEB8 - 0x36C];
+ /* 0xEB8 */ dAcObjRef_c field_0xEB8;
+ u8 _0xEC4[0xF8E - 0xEC4];
/* 0xF8E */ s16 mNumDashes;
+ /* 0xFB0 */ u8 _0xFB90[0xFAC - 0xF90];
+ /* 0xFAC */ mVec3_c field_0xFAC;
+ /* 0xFB8 */ u8 _0xFB8[0xFCC - 0xFB8];
+ /* 0xFCC */ s16 field_0xFCC;
};
#endif
diff --git a/include/d/a/e/d_a_e_skytail.h b/include/d/a/e/d_a_e_skytail.h
index dea260dd..9a5e1561 100644
--- a/include/d/a/e/d_a_e_skytail.h
+++ b/include/d/a/e/d_a_e_skytail.h
@@ -2,13 +2,121 @@
#define D_A_E_SKYTAIL_H
#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_cc.h"
+#include "m/m3d/m_mdl.h"
+#include "m/m_angle.h"
+#include "m/m_mtx.h"
+#include "m/m_vec.h"
#include "s/s_State.hpp"
+#include "toBeSorted/d_d3d.h"
class dAcESkytail_c : public dAcEnBase_c {
+ class callbackBody_c : public m3d::callback_c {
+ public:
+ callbackBody_c() {}
+ virtual ~callbackBody_c() {}
+
+ virtual void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override;
+
+ // Node Center -> then all spines
+ mVec3_c mPos[12];
+ mAng3_c mAng[12];
+
+ f32 mScaleSpine11;
+ s16 field_0x10DC;
+ s16 field_0x10DE;
+ s16 field_0x10E0;
+ };
+ enum BodyNode_e {
+ BODY_NODE_Center,
+ BODY_NODE_Head,
+ BODY_NODE_Hair,
+ BODY_NODE_LMouthBig,
+ BODY_NODE_LMouthSmall,
+ BODY_NODE_RMouthBig,
+ BODY_NODE_RMouthSmall,
+ BODY_NODE_Spine01,
+ BODY_NODE_Spine02,
+ BODY_NODE_Spine03,
+ BODY_NODE_L1wing01,
+ BODY_NODE_L1wing02,
+ BODY_NODE_L1wing03,
+ BODY_NODE_L1wing04,
+ BODY_NODE_L1wing05,
+ BODY_NODE_R1wing01,
+ BODY_NODE_R1wing02,
+ BODY_NODE_R1wing03,
+ BODY_NODE_R1wing04,
+ BODY_NODE_R1wing05,
+ BODY_NODE_Spine04,
+ BODY_NODE_Spine05,
+ BODY_NODE_L2wing01,
+ BODY_NODE_L2wing02,
+ BODY_NODE_L2wing03,
+ BODY_NODE_L2wing04,
+ BODY_NODE_R2wing01,
+ BODY_NODE_R2wing02,
+ BODY_NODE_R2wing03,
+ BODY_NODE_R2wing04,
+ BODY_NODE_Spine06,
+ BODY_NODE_Spine07,
+ BODY_NODE_L3wing01,
+ BODY_NODE_L3wing02,
+ BODY_NODE_L3wing03,
+ BODY_NODE_L3wing04,
+ BODY_NODE_R3wing01,
+ BODY_NODE_R3wing02,
+ BODY_NODE_R3wing03,
+ BODY_NODE_R3wing04,
+ BODY_NODE_Spine08,
+ BODY_NODE_Spine09,
+ BODY_NODE_Spine10,
+ BODY_NODE_Spine11
+ };
+
+ class callbackAntenna_c : public m3d::callback_c {
+ public:
+ callbackAntenna_c() {}
+ virtual ~callbackAntenna_c() {}
+
+ virtual void timingB(u32, nw4r::g3d::WorldMtxManip *, nw4r::g3d::ResMdl) override;
+
+ // Corresponds to the AntennaNode_e
+ mVec3_c mPos[9];
+ mAng3_c mAng[9];
+ };
+ enum AntennaNode_e {
+ ANTENNA_NODE_AntennaCenter,
+ ANTENNA_NODE_Antenna01,
+ ANTENNA_NODE_Antenna02,
+ ANTENNA_NODE_Antenna03,
+ ANTENNA_NODE_Antenna04,
+ ANTENNA_NODE_Antenna05,
+ ANTENNA_NODE_Antenna06,
+ ANTENNA_NODE_Antenna07,
+ ANTENNA_NODE_Antenna08,
+ };
+
+ enum CollisionIdx_e {
+ COLLIDER_Head,
+ COLLIDER_Spine4,
+ COLLIDER_Spine6,
+ COLLIDER_Spine8,
+ COLLIDER_Rear,
+ };
+
public:
dAcESkytail_c() : mStateMgr(*this) {}
virtual ~dAcESkytail_c() {}
+ virtual int create() override;
+ virtual int doDelete() override;
+ virtual int draw() override;
+ virtual bool createHeap() override;
+ virtual int actorExecute() override;
+
STATE_FUNC_DECLARE(dAcESkytail_c, RandomMove);
STATE_FUNC_DECLARE(dAcESkytail_c, Move);
STATE_FUNC_DECLARE(dAcESkytail_c, ParallelMove);
@@ -17,8 +125,109 @@ public:
STATE_FUNC_DECLARE(dAcESkytail_c, Dead);
STATE_FUNC_DECLARE(dAcESkytail_c, Skytail);
+ STATE_MGR_DEFINE_UTIL_ISSTATE(dAcESkytail_c);
+ STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcESkytail_c);
+ STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcESkytail_c);
+
+ void fn_172_A40();
+ void fn_172_3CD0();
+ void fn_172_4240(s32);
+ void fn_172_45D0();
+ void fn_172_45E0();
+ void fn_172_45F0();
+
private:
- /* 0x??? */ STATE_MGR_DECLARE(dAcESkytail_c);
+ /* 0x0378 */ d3d::AnmMdlWrapper mBodyMdl;
+ /* 0x03E8 */ d3d::AnmMdlWrapper mAntennaMdl[2];
+ /* 0x04C8 */ dBgS_AcchCir mAcchCir;
+ /* 0x0524 */ dBgS_ObjAcch mAcch;
+ /* 0x08D4 */ dCcD_Linked<dCcD_Sph> mCc[5];
+ /* 0x0FB4 */ dColliderLinkedList mCollider;
+ /* 0x0FC0 */ STATE_MGR_DECLARE(dAcESkytail_c);
+ /* 0x0FFC */ callbackBody_c mBodyTransform;
+ /* 0x10E4 */ callbackAntenna_c mAntennaTransform[2];
+ /* 0x1234 */ mMtx_c field_0x1234;
+ /* 0x1264 */ mVec3_c field_0x1264;
+ /* 0x1270 */ mVec3_c field_0x1270;
+ /* 0x127C */ mVec3_c field_0x127C;
+ /* 0x1288 */ mVec3_c field_0x1288;
+ /* 0x1294 */ mVec3_c field_0x1294;
+ /* 0x12A0 */ mVec3_c field_0x12A0;
+ /* 0x12AC */ mVec3_c field_0x12AC;
+ /* 0x12B8 */ mVec3_c field_0x12B8;
+ /* 0x12C4 */ mVec3_c mBirdPosition;
+ /* 0x12D0 */ mVec3_c field_0x12D0;
+ /* 0x12DC */ mVec3_c field_0x12DC;
+ /* 0x12E8 */ mVec3_c field_0x12E8;
+ /* 0x12F4 */ mVec3_c field_0x12F4;
+ /* 0x1300 */ mAng3_c field_0x1300;
+ /* 0x1306 */ mAng3_c mBirdRotation;
+ /* 0x130C */ f32 field_0x130C;
+ /* 0x1310 */ f32 field_0x1310;
+ /* 0x1314 */ f32 mScaleF;
+ /* 0x1318 */ f32 field_0x1318;
+ /* 0x131C */ f32 field_0x131C;
+ /* 0x1310 */ f32 field_0x1320;
+ /* 0x1324 */ f32 mDistanceToBird;
+ /* 0x1328 */ f32 field_0x1328;
+ /* 0x132C */ f32 field_0x132C;
+ /* 0x1330 */ f32 field_0x1330;
+ /* 0x1334 */ f32 field_0x1334;
+ /* 0x1338 */ f32 field_0x1338;
+ /* 0x133C */ f32 field_0x133C;
+ /* 0x1340 */ f32 field_0x1340;
+ /* 0x1344 */ f32 field_0x1344;
+ /* 0x1348 */ f32 field_0x1348;
+ /* 0x134C */ f32 field_0x134C;
+ /* 0x1350 */ u8 _0x1350[0x135C - 0x1350];
+ /* 0x135C */ s32 field_0x135C;
+ /* 0x1360 */ s32 field_0x1360;
+ /* 0x1364 */ s32 field_0x1364;
+ /* 0x1368 */ s16 field_0x1368;
+ /* 0x136A */ s16 field_0x136A;
+ /* 0x136C */ s16 field_0x136C;
+ /* 0x136E */ s16 field_0x136E;
+ /* 0x1370 */ s16 field_0x1370;
+ /* 0x1372 */ s16 field_0x1372;
+ /* 0x1376 */ s16 field_0x1374;
+ /* 0x1376 */ s16 field_0x1376;
+ /* 0x1378 */ s16 field_0x1378;
+ /* 0x137A */ s16 field_0x137A;
+ /* 0x137C */ s16 field_0x137C;
+ /* 0x137E */ s16 field_0x137E;
+ /* 0x1380 */ s16 field_0x1380;
+ /* 0x1382 */ s16 field_0x1382;
+ /* 0x1384 */ s16 field_0x1384;
+ /* 0x1386 */ s16 field_0x1386;
+ /* 0x1388 */ s16 field_0x1388;
+ /* 0x1388 */ s16 field_0x138A;
+ /* 0x138C */ s16 field_0x138C;
+ /* 0x138E */ s16 field_0x138E;
+ /* 0x1390 */ s16 field_0x1390;
+ /* 0x1392 */ s16 field_0x1392;
+ /* 0x1394 */ s16 field_0x1394;
+ /* 0x1394 */ s16 field_0x1396;
+ /* 0x1398 */ s16 field_0x1398;
+ /* 0x139A */ s16 field_0x139A;
+ /* 0x139A */ s16 field_0x139C;
+ /* 0x139E */ s16 field_0x139E;
+ /* 0x13A0 */ s16 field_0x13A0;
+ /* 0x13A2 */ s16 field_0x13A2;
+ /* 0x13A4 */ u16 field_0x13A4[3];
+ /* 0x13AA */ u16 field_0x13AA;
+ /* 0x13AC */ u8 field_0x13AC;
+ /* 0x13AD */ u8 field_0x13AD;
+ /* 0x13AE */ u8 field_0x13AE;
+ /* 0x13AF */ u8 field_0x13AF;
+ /* 0x13B0 */ u8 field_0x13B0;
+ /* 0x13B1 */ u8 field_0x13B1;
+ /* 0x13B2 */ u8 field_0x13B2;
+ /* 0x13B3 */ u8 field_0x13B3;
+ /* 0x13B4 */ u8 field_0x13B4;
+ /* 0x13B5 */ u8 field_0x13B5;
+ /* 0x13B6 */ u8 field_0x13B6;
+ /* 0x13B7 */ bool field_0x13B7; // Maybe Bird has Player?
+ /* 0x13B8 */ u8 field_0x13B8;
};
#endif
diff --git a/include/d/a/e/d_a_en_base.h b/include/d/a/e/d_a_en_base.h
index adbc1d0c..30d477b1 100644
--- a/include/d/a/e/d_a_en_base.h
+++ b/include/d/a/e/d_a_en_base.h
@@ -88,7 +88,7 @@ public:
void fn_80030700();
dAcObjBase_c *targetPlayerOrScrapper(f32 biasToScrapper);
static void fn_80030980(m3d::mdl_c &, s32, bool markDirty);
-
+ bool isWithinCameraView(f32, f32);
void fn_80030c20(u32 flags, f32, f32, f32, f32);
s32 someEnemyDamageCollisionStuffMaybe(dColliderLinkedList &list, u16 *pOutFlags);
diff --git a/src/REL/d/a/e/d_a_e_skytail.cpp b/src/REL/d/a/e/d_a_e_skytail.cpp
index fb1e61b4..4608fbb8 100644
--- a/src/REL/d/a/e/d_a_e_skytail.cpp
+++ b/src/REL/d/a/e/d_a_e_skytail.cpp
@@ -1,5 +1,30 @@
+
#include "d/a/e/d_a_e_skytail.h"
+#include "c/c_lib.h"
+#include "c/c_math.h"
+#include "common.h"
+#include "d/a/d_a_base.h"
+#include "d/a/d_a_bird.h"
+#include "d/a/obj/d_a_obj_base.h"
+#include "d/col/bg/d_bg_s.h"
+#include "d/col/c/c_bg_s_poly_info.h"
+#include "d/col/c/c_cc_d.h"
+#include "d/col/cc/d_cc_d.h"
+#include "d/d_cc.h"
+#include "d/snd/d_snd_wzsound.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_mtx.h"
+#include "m/m_vec.h"
+#include "nw4r/g3d/res/g3d_resfile.h"
+#include "nw4r/math/math_arithmetic.h"
+#include "rvl/GX/GXTypes.h"
+#include "s/s_Math.h"
+#include "toBeSorted/d_emitter.h"
+
SPECIAL_ACTOR_PROFILE(E_SKYTAIL, dAcESkytail_c, fProfile::E_SKYTAIL, 0xD7, 0, 2);
STATE_DEFINE(dAcESkytail_c, RandomMove);
@@ -10,24 +35,1194 @@ STATE_DEFINE(dAcESkytail_c, Charge);
STATE_DEFINE(dAcESkytail_c, Dead);
STATE_DEFINE(dAcESkytail_c, Skytail);
-void dAcESkytail_c::initializeState_RandomMove() {}
-void dAcESkytail_c::executeState_RandomMove() {}
-void dAcESkytail_c::finalizeState_RandomMove() {}
-void dAcESkytail_c::initializeState_Move() {}
-void dAcESkytail_c::executeState_Move() {}
+static mVec3_c sArrVecs[5] = {
+ mVec3_c(1500.0f, -300.0f, -500.0f), //
+ mVec3_c(1200.0f, 100.0f, -800.0f), //
+ mVec3_c(0.0f, 300.0f, 0.0f), //
+ mVec3_c(-1200.0f, 100.0f, -800.0f), //
+ mVec3_c(-1500.0f, -300.0f, -500.0f), //
+};
+
+/* clang-format off */
+static dCcD_SrcSph sCcSrcHead = {
+ {{AT_TYPE_DAMAGE,0x1D, {0, 0, 0}, 4, 0, 0, 0},
+ {~(AT_TYPE_COMMON0 | AT_TYPE_PHYSICS), 0x303, {0, 0x18, 0x407}, 0, 0},
+ {0xC5}},
+ {180.0f},};
+static dCcD_SrcSph sCcSrcSpine = {
+ {{AT_TYPE_DAMAGE,0x1D, {0, 0, 0}, 4, 0, 0, 0},
+ {~(AT_TYPE_COMMON0 | AT_TYPE_PHYSICS), 0x303, {0, 0x18, 0x407}, 0, 0},
+ {0xC5}},
+ {170.0f},};
+static dCcD_SrcSph sCcSrcRear = {
+ {{0, 0, {0, 0, 0}, 0, 0, 0, 0},
+ {~(AT_TYPE_COMMON0 | AT_TYPE_PHYSICS), 0x303, {0, 0, 0x407}, 0, 0},
+ {0xC5}},
+ {200.0f},};
+/* clang-format on */
+
+class dAcESkytail_HIO_c {
+public:
+ f32 field_0x00;
+ s32 field_0x04;
+ f32 field_0x08;
+ f32 field_0x0C;
+ f32 field_0x10;
+ f32 field_0x14;
+ f32 field_0x18;
+ f32 field_0x1C;
+ f32 field_0x20;
+ f32 field_0x24;
+ f32 field_0x28;
+ f32 field_0x2C;
+ f32 field_0x30;
+ f32 field_0x34;
+ u16 field_0x38;
+ u16 field_0x3A;
+ f32 field_0x3C;
+ f32 field_0x40;
+ f32 field_0x44;
+ f32 field_0x48;
+ f32 field_0x4C;
+ u16 field_0x50;
+ u16 field_0x52;
+ u16 field_0x54;
+ f32 field_0x58;
+ f32 field_0x5C;
+ f32 field_0x60;
+ f32 field_0x64;
+ f32 field_0x68;
+ f32 field_0x6C;
+ u16 field_0x70;
+ u16 field_0x72;
+ f32 field_0x74;
+ f32 field_0x78;
+
+ static const dAcESkytail_HIO_c sInstance;
+};
+/* clang-format off */
+ const dAcESkytail_HIO_c dAcESkytail_HIO_c::sInstance = {
+ 0.8f,
+ 1,
+ 70.0f,
+ 1.0f,
+ 3.0f,
+ 10000.0f,
+ 6000.0f,
+ 800.0f,
+ 100.0f,
+ 1.0f,
+ 1.0f,
+ 3000.0f,
+ 1000.0f,
+ 800.0f,
+ 5,
+ 5,
+ 80.0f,
+ 1.0f,
+ 1.0f,
+ 4000.0f,
+ 800.0f,
+ 12,
+ 15,
+ 15,
+ 12.0f,
+ 200.0f,
+ 3000.0f,
+ 150.0f,
+ 1.0f,
+ 1.0f,
+ 30,
+ 30,
+ 500.0f,
+ 5000.0f
+};
+/* clang-format on */
+
+void dAcESkytail_c::callbackBody_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *result, nw4r::g3d::ResMdl) {
+ static const s32 spines[] = {
+ BODY_NODE_Spine01, BODY_NODE_Spine02, BODY_NODE_Spine03, BODY_NODE_Spine04,
+ BODY_NODE_Spine05, BODY_NODE_Spine06, BODY_NODE_Spine07, BODY_NODE_Spine08,
+ BODY_NODE_Spine09, BODY_NODE_Spine10, BODY_NODE_Spine11,
+ };
+
+ mMtx_c m, m3, m4, m5, m6;
+ s32 idx = -1;
+
+ for (int i = 0; i < (s32)ARRAY_LENGTH(spines); ++i) {
+ if ((s32)nodeId == spines[i]) {
+ idx = i + 1; // Head is idx 0 in the callbackBody, we want to alter the spines
+ break;
+ }
+ }
+ // Center (The Head) is idx 0 - so only adjust the spines
+ if (idx >= 1) {
+ m.transS(mPos[idx]);
+ m.YrotM(mAng[idx].y);
+ m.XrotM(mAng[idx].x);
+ m.ZrotM(-mAng[idx].z);
+ if (idx >= 10 /* Last 2 nodes */) {
+ mMtx_c scale;
+ scale.scaleS(mScaleSpine11, mScaleSpine11, mScaleSpine11);
+ m.concat(scale);
+ }
+ m.YrotM(-0x4000);
+ result->SetMtx(m);
+ }
+
+ if (nodeId == BODY_NODE_LMouthBig) {
+ result->GetMtx(m3);
+ m3.YrotM(field_0x10DE);
+ result->SetMtx(m3);
+ } else if (nodeId == BODY_NODE_LMouthSmall) {
+ result->GetMtx(m4);
+ m4.YrotM(field_0x10E0);
+ result->SetMtx(m4);
+ } else if (nodeId == BODY_NODE_RMouthBig) {
+ mMtx_c m;
+ result->GetMtx(m5);
+ m5.YrotM(-field_0x10DE);
+ result->SetMtx(m5);
+ } else if (nodeId == BODY_NODE_RMouthSmall) {
+ result->GetMtx(m6);
+ m6.YrotM(-field_0x10E0);
+ result->SetMtx(m6);
+ }
+}
+void dAcESkytail_c::callbackAntenna_c::timingB(u32 nodeId, nw4r::g3d::WorldMtxManip *result, nw4r::g3d::ResMdl) {
+ mMtx_c m;
+ m.transS(mPos[nodeId]);
+ m.YrotM(mAng[nodeId].y);
+ m.XrotM(mAng[nodeId].x);
+ m.YrotM(-0x4000);
+ result->SetMtx(m);
+}
+
+void dAcESkytail_c::fn_172_A40() {
+ if (sLib::calcTimer(&field_0x13A2) == 0) {
+ u32 col = someEnemyDamageCollisionStuffMaybe(mCollider, nullptr);
+
+ cCcD_Obj *pCcObj = mCollider.findTgHit();
+ if (pCcObj != nullptr) {
+ if (pCcObj->GetTgAtHitType() == AT_TYPE_KOLOKTOS_SWORD) {
+ dJEffManager_c::spawnHitMarkEffect(7, *pCcObj, nullptr, true);
+ if (pCcObj == &mCc[COLLIDER_Rear]) {
+ startSound(SE_ESktl_DOWN);
+ field_0x1364 = 0;
+ } else {
+ field_0x1364 = 1;
+ }
+
+ mCollider.ClrTg();
+ field_0x13A2 = 500;
+ mHealth = 0;
+ changeState(StateID_Dead);
+ } else if (pCcObj == &mCc[COLLIDER_Rear]) {
+ switch (col) {
+ case 0:
+ case 6:
+ case 7: dJEffManager_c::spawnHitMarkEffect(3, mCc[COLLIDER_Rear], nullptr, true); break;
+ default:
+ dJEffManager_c::spawnHitMarkEffect(7, mCc[COLLIDER_Rear], nullptr, true);
+ startSound(SE_ESktl_DOWN);
+ field_0x1364 = 0;
+ mCollider.ClrTg();
+ field_0x13A2 = 500;
+ mHealth = 0;
+ changeState(StateID_Dead);
+ break;
+ }
+ } else if (pCcObj == &mCc[COLLIDER_Head] || pCcObj == &mCc[COLLIDER_Spine4] ||
+ pCcObj == &mCc[COLLIDER_Spine6] || pCcObj == &mCc[COLLIDER_Spine8]) {
+ dJEffManager_c::spawnHitMarkEffect(3, *pCcObj, nullptr, true);
+ mCollider.ClrTg();
+ field_0x13A2 = 500;
+ }
+ }
+ }
+}
+
+bool dAcESkytail_c::createHeap() {
+ nw4r::g3d::ResFile res(getOarcResFile("Skytail"));
+
+ TRY_CREATE(mBodyMdl.create3(*this, res.ptr(), "Skytail", "Fly", 0x130));
+
+ mBodyMdl.getModel().setCallback(&mBodyTransform);
+ for (int i = 0; i < (s32)ARRAY_LENGTH(mAntennaMdl); ++i) {
+ TRY_CREATE(mAntennaMdl[i].create3(*this, res.ptr(), "SkytailAntenna", "SkytailAntenna", 0x130));
+ mAntennaMdl[i].getModel().setCallback(&mAntennaTransform[i]);
+ }
+ return true;
+}
+
+int dAcESkytail_c::create() {
+ CREATE_ALLOCATOR(dAcESkytail_c);
+
+ mAcch.Set(this, 1, &mAcchCir);
+ mAcchCir.SetWall(20.0f, 100.0f);
+ mStts.SetRank(11);
+
+ mCollider.addCc(mCc[COLLIDER_Rear], sCcSrcRear);
+ mCollider.addCc(mCc[COLLIDER_Head], sCcSrcHead);
+ for (int i = 1; i < (s32)ARRAY_LENGTH(mCc) - 1; ++i) {
+ mCollider.addCc(mCc[i], sCcSrcSpine);
+ }
+ mCollider.SetStts(mStts);
+ for (int i = 0; i < (s32)ARRAY_LENGTH(mCc); ++i) {
+ mCc[i].SetC(mPosition);
+ }
+ mAcceleration = -0.0f;
+ mMaxSpeed = -80.0f;
+ mHealth = 4;
+ mSpeed = 70.0f;
+ field_0x13B6 = 0;
+ field_0x13B8 = 0;
+ field_0x1364 = 2;
+ setStartingPosition(mPosition);
+ field_0x12D0.set(mPosition);
+
+ mCc[COLLIDER_Head].ClrAtSet();
+ mCollider.ClrAt();
+
+ mBodyTransform.mScaleSpine11 = 1.0f;
+ field_0x1368 = cM::rndF(65536.0f);
+ mScaleF = 1.0f;
+ field_0x1382 = cM::rndF(65536.0f);
+
+ field_0x1390 = cM::rndF(65536.0f);
+ field_0x1388 = field_0x1390;
+ field_0x138E = 0;
+ field_0x1396 = 0;
+
+ mBodyMdl.getModel().setScale(mScaleF, mScaleF, mScaleF);
+
+ field_0x13B7 = false;
+ field_0x135C = 0;
+
+ field_0x1338 = 0.0f;
+ field_0x1334 = 0.0f;
+ field_0x1330 = 0.0f;
+ field_0x133C = 0.0f;
+
+ field_0x1370 = 0;
+ field_0x136C = 0;
+ field_0x136A = 0;
+ field_0x136E = 0;
+
+ field_0x1344 = 0.0f;
+ field_0x1340 = 0.0f;
+
+ field_0x139E = 0;
+
+ mWorldMtx.transS(mPosition);
+ mWorldMtx.YrotM(mRotation.y);
+ mWorldMtx.XrotM(mRotation.x);
+ mWorldMtx.ZrotM(mRotation.z);
+ mBodyMdl.getModel().setLocalMtx(mWorldMtx);
+
+ fn_172_3CD0();
+ mBodyMdl.getModel().calc(true);
+
+ for (int i = 0; i < (s32)ARRAY_LENGTH(mAntennaMdl); ++i) {
+ fn_172_4240(i);
+ mAntennaMdl[i].getModel().calc(true);
+ }
+
+ changeState(StateID_RandomMove);
+
+ mBodyMdl.setAnm("Fly", m3d::PLAY_MODE_4);
+
+ mBoundingBox.Set(mVec3_c(-2000.0f, -2000.0f, -2000.0f), mVec3_c(2000.0f, 2000.0f, 2000.0f));
+
+ return SUCCEEDED;
+}
+
+int dAcESkytail_c::doDelete() {
+ return SUCCEEDED;
+}
+
+int dAcESkytail_c::actorExecute() {
+ field_0x1368++;
+
+ for (int i = 0; i < 3; ++i) {
+ if (field_0x13A4[i] != 0) {
+ field_0x13A4[i]--;
+ }
+ }
+
+ if (field_0x13A4[0] == 0) {
+ field_0x13B8 = 0;
+ }
+
+ setStartingPosition(mPosition);
+
+ dBird_c *pBird = dBird_c::getInstance();
+ mBirdPosition.set(pBird->getPosition());
+ mDistanceToBird = mPosition.distance(mBirdPosition);
+ field_0x13B7 = pBird->getRef_0xEB8().isLinked();
+ mBirdRotation = pBird->getAngle();
+
+ if (!field_0x13B7 || field_0x13B6 == 0) {
+ if (!isState(StateID_RandomMove) && !isState(StateID_Dead)) {
+ changeState(StateID_RandomMove);
+ }
+ }
+ if (field_0x13A2 > 0) {
+ mCollider.ClrTg();
+ if (!pBird->fn_129_CFB0() && !isState(StateID_Dead)) {
+ field_0x13A2 = 0;
+ mCollider.TgSet();
+ }
+ } else {
+ if (!isState(StateID_Dead)) {
+ mCollider.TgSet();
+ }
+ }
+
+ executeState();
+
+ // Pulse the Rear Bulb
+ if (!isState(StateID_Dead)) {
+ mBodyTransform.mScaleSpine11 = mAng(field_0x139E).sin() * 0.2f + 1.3f;
+ f32 rate = mBodyMdl.getAnm().getRate();
+ if (rate > 2.0f) {
+ rate = 2.0f;
+ }
+ field_0x139E = field_0x139E + mAng::fromDeg(180.0f / (20.001f - 5.0f * rate));
+ }
+
+ if (!isState(StateID_Dead)) {
+ fn_172_A40();
+ }
+ fn_172_45E0();
+ mRotation.set(mAngle);
+ fn_172_45F0();
+ // Bug oops!
+
+ if (!(field_0x1368 & 0xF) & (cM::rndF(1.0f) < 0.2f)) {
+ field_0x1386 = 1000.0f + cM::rndF(1000.f);
+ field_0x138C = field_0x1394 = field_0x1398 + 3000.0f + cM::rndF(3000.0f);
+ }
+
+ field_0x1382 = (f32)field_0x1382 + (f32)field_0x1384;
+ sLib::addCalcAngle(&field_0x1384, field_0x1386, 2, 200);
+ field_0x1390 += field_0x1392;
+ sLib::addCalcAngle(&field_0x1392, field_0x1394, 2, 200);
+ field_0x1388 = (f32)field_0x1388 + (f32)field_0x1392 * 2.0f;
+ sLib::addCalcAngle(&field_0x138A, field_0x138C, 2, 200);
+
+ if (!isState(StateID_ParallelMove) || field_0x13AC != 2) {
+ sLib::addCalcScaled(&field_0x1340, 0.1f, 0.1f);
+ sLib::addCalcScaled(&field_0x133C, 0.1f, 0.1f);
+ sLib::addCalcAngle(&field_0x1372, 0, 1, 1000);
+ }
+
+ mAng sin = mAng(field_0x1382).sin() * 3000.0f;
+ if (isState(StateID_ParallelMove) && (field_0x13AC == 3 || field_0x13AC == 4)) {
+ mVelocity = field_0x127C * mSpeed;
+ } else {
+ mMtx_c m;
+ m.YrotS(mRotation.y);
+ m.XrotM(sin + mRotation.x);
+ mVec3_c v(0.0f, 0.0f, mSpeed);
+ v.x += field_0x1348;
+ v.y += field_0x134C;
+ m.multVecSR(v);
+ mVelocity.set(v);
+ if (isState(StateID_Dead)) {
+ mVelocity.y = -60.0f;
+ mVelocity.y += v.y;
+ }
+ }
+ mPosition += mVelocity;
+ mPosition += mStts.GetCcMove() * 0.3f;
+ mVec3_c v = mPosition;
+ mAcch.CrrPos(*dBgS::GetInstance());
+ mPosition.set(v);
+ cBgS_PolyInfo info;
+ if (!mAcch.fn_80340ca0(info)) {
+ dBgS::GetInstance()->ChkMoveBG(info, true);
+ const dAcObjBase_c *pObj = dBgS::GetInstance()->GetActorPointer(info);
+ if (pObj != nullptr && pObj->mProfileName != fProfile::OBJ_CUMUL_CLOUD) {
+ mVelocity.set(0.0f, 0.0f, 0.0f);
+ static mVec3_c scale(2.0f, 2.0f, 2.0f);
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_320_, mBodyTransform.mPos[6], &mRotation, &scale, nullptr, nullptr, 0, 0
+ );
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_320_, mBodyTransform.mPos[4], &mRotation, &scale, nullptr, nullptr, 0, 0
+ );
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_320_, mBodyTransform.mPos[2], &mRotation, &scale, nullptr, nullptr, 0, 0
+ );
+ playDeathEffect0(mPosition, &scale, true);
+ killWithFlagNoItemDrop();
+ }
+ }
+
+ mBodyMdl.play();
+ mWorldMtx.transS(mPosition);
+ mWorldMtx.YrotM(mRotation.y);
+ mWorldMtx.XrotM(mRotation.x);
+ mWorldMtx.ZrotM(mRotation.z);
+ mBodyMdl.getModel().setLocalMtx(mWorldMtx);
+ fn_172_3CD0();
+ mBodyMdl.getModel().calc(false);
+ for (int i = 0; i < (s32)ARRAY_LENGTH(mAntennaMdl); ++i) {
+ fn_172_4240(i);
+ mAntennaMdl[i].getModel().calc(false);
+ }
+
+ cCcD_Obj *pCcObj = mCollider.findCoHit();
+ if (pCcObj != nullptr && pCcObj == &mCc[COLLIDER_Head]) {
+ dAcObjBase_c *pObj = pCcObj->GetCoActor();
+ if (pObj->mProfileName == fProfile::E_SKYTAIL) {
+ field_0x13B8 = 1;
+ mMtx_c m;
+ mVec3_c v = pObj->mPosition - mPosition;
+ m.YrotS(v.atan2sX_Z());
+ mVec3_c in(0.0f, 0.0f, 430.0f);
+ m.multVecSR(in);
+ field_0x12DC.set(in);
+ if (mPosition.y < pObj->mPosition.y) {
+ field_0x12DC.y -= 350.f;
+ } else {
+ field_0x12DC.y += 350.f;
+ }
+
+ field_0x12E8.set(field_0x12A0 + field_0x12DC);
+ field_0x1378 = cLib::targetAngleY(mPosition, field_0x12E8);
+ field_0x137A = -cLib::targetAngleX(mPosition, field_0x12E8);
+ fn_172_45D0();
+ field_0x13A4[0] += 5;
+ } else if (pObj->mProfileName == fProfile::B_NUSI) {
+ mVelocity.set(0.0f, 0.0f, 0.0f);
+ static mVec3_c scale(2.0f, 2.0f, 2.0f);
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_320_, mBodyTransform.mPos[6], &mRotation, &scale, nullptr, nullptr, 0, 0
+ );
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_320_, mBodyTransform.mPos[4], &mRotation, &scale, nullptr, nullptr, 0, 0
+ );
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_320_, mBodyTransform.mPos[2], &mRotation, &scale, nullptr, nullptr, 0, 0
+ );
+ playDeathEffect0(mPosition, &scale, true);
+ killWithFlagNoItemDrop();
+ }
+ }
+
+ if (field_0x13B8 != 0) {
+ cLib::addCalcPos2(&field_0x12A0, field_0x12E8, 1.0f, 131.0f);
+ }
+ mCc[COLLIDER_Head].SetC(mPosition);
+ mCc[COLLIDER_Spine4].SetC(mBodyTransform.mPos[4 /* BODY_NODE_Spine04 */]);
+ mCc[COLLIDER_Spine6].SetC(mBodyTransform.mPos[6 /* BODY_NODE_Spine06 */]);
+ mCc[COLLIDER_Spine8].SetC(mBodyTransform.mPos[8 /* BODY_NODE_Spine08 */]);
+ mCc[COLLIDER_Rear].SetC(mBodyTransform.mPos[11 /* BODY_NODE_Spine11 */]);
+ mCollider.registerColliders();
+ return SUCCEEDED;
+}
+
+int dAcESkytail_c::draw() {
+ drawModelType1(&mBodyMdl.getModel());
+ for (int i = 0; i < (s32)ARRAY_LENGTH(mAntennaMdl); ++i) {
+ drawModelType1(&mAntennaMdl[i].getModel());
+ }
+ return SUCCEEDED;
+}
+
+void dAcESkytail_c::initializeState_RandomMove() {
+ field_0x12A0.set(
+ field_0x12D0.x + cM::rndFX(2000.0f), //
+ field_0x12D0.y + cM::rndFX(2000.0f), //
+ field_0x12D0.z + cM::rndFX(2000.0f) //
+ );
+ setActorProperty(AC_PROP_0x1);
+}
+void dAcESkytail_c::executeState_RandomMove() {
+ if (field_0x13A4[0] == 0) {
+ field_0x12A0.x = field_0x12D0.x + cM::rndFX(2000.0f);
+ field_0x12A0.y = field_0x12D0.y + +2000.0f + cM::rndFX(1000.0f);
+ field_0x12A0.z = field_0x12D0.z + cM::rndFX(2000.0f);
+
+ field_0x137C = 0;
+ field_0x137E = cM::rndF(1000.0f) + 1000.0f;
+ field_0x1378 = cLib::targetAngleY(mPosition, field_0x12A0);
+ field_0x137A = -cLib::targetAngleX(mPosition, field_0x12A0);
+ fn_172_45D0();
+ field_0x1318 = cM::rndF(0.2f) + 1.0f;
+ field_0x13A4[0] = cM::rndF(60.0f) + 30.0f;
+ }
+ s16 zTarget = mAngle.y;
+ sLib::addCalcAngle(mAngle.y.ref(), field_0x1378, 8, field_0x137C);
+ sLib::addCalcAngle(mAngle.x.ref(), field_0x137A, 8, field_0x137C);
+ zTarget -= mAngle.y;
+ sLib::addCalcAngle(mAngle.z.ref(), zTarget * 8, 2, 3000);
+ sLib::addCalcAngle(&field_0x137C, field_0x137E, 1, 100);
+ sLib::addCalcScaledDiff(&mSpeed, field_0x1318 * 50.0f, 0.1f, 1.0f);
+ mBodyMdl.setRate(mSpeed / 50.0f);
+ if (field_0x13B6 != 0 && field_0x13B7 != 0) {
+ changeState(StateID_Move);
+ }
+}
+void dAcESkytail_c::finalizeState_RandomMove() {
+ unsetActorProperty(AC_PROP_0x1);
+}
+
+void dAcESkytail_c::initializeState_Move() {
+ field_0x13AC = 0;
+}
+
+void dAcESkytail_c::executeState_Move() {
+ mVec3_c v0;
+ f32 distf0 = 6000.0f;
+ f32 f = 12.0f;
+ dBird_c::getInstance()->fn_129_C4A0(v0, f);
+ f32 distXZ = v0.absXZTo(mPosition);
+ switch (field_0x13AC) {
+ case 0: {
+ if (field_0x13A4[0] == 0) {
+ field_0x1264.set(0.0f, 0.0f, 10000.0f);
+ field_0x12A0.set(0.0f, 0.0f, 0.0f);
+ field_0x1234.transS(mBirdPosition);
+ field_0x1234.ZXYrotM(mBirdRotation);
+ field_0x1234.multVec(field_0x1264, field_0x12A0);
+ field_0x137E = 500.0f + cM::rndF(1000.0f);
+ field_0x1378 = cLib::targetAngleY(mPosition, field_0x12A0);
+ field_0x137A = -cLib::targetAngleX(mPosition, field_0x12A0);
+ fn_172_45D0();
+ field_0x13A4[0] = 10.0f + cM::rndF(5.0f);
+ }
+ if (isWithinCameraView(0.0f, 0.0f)) {
+ if (distXZ > distf0) {
+ field_0x13AC = 1;
+ field_0x13A4[0] = 0;
+ }
+ } else {
+ changeState(StateID_ParallelMove);
+ return;
+ }
+ } break;
+ case 1: {
+ if (field_0x13A4[0] == 0) {
+ field_0x137E = 1000.0f + cM::rndF(500.0f);
+ field_0x1378 = cLib::targetAngleY(mPosition, v0);
+ field_0x137A = -cLib::targetAngleX(mPosition, v0);
+ fn_172_45D0();
+ }
+ if (isWithinCameraView(0.0f, 0.0f)) {
+ if (distXZ < 4000.0f) {
+ mVec3_c v1 = mPosition - v0;
+ field_0x135C = 30 + (s32)(v1.mag() / mSpeed);
+ changeState(StateID_FrontAttack);
+ return;
+ }
+ } else {
+ changeState(StateID_ParallelMove);
+ return;
+ }
+ } break;
+ }
+
+ s16 zTarget = mAngle.y;
+ sLib::addCalcAngle(mAngle.y.ref(), field_0x1378, 8, field_0x137C);
+ sLib::addCalcAngle(mAngle.x.ref(), field_0x137A, 8, field_0x137C);
+ zTarget -= mAngle.y;
+ sLib::addCalcAngle(mAngle.z.ref(), zTarget * 8, 2, 3000);
+ sLib::addCalcAngle(&field_0x137C, field_0x137E, 1, 100);
+ sLib::addCalcScaledDiff(&mSpeed, 70.0f, 1.0f, 3.0f);
+ mBodyMdl.setRate(mSpeed / 50.0f);
+}
void dAcESkytail_c::finalizeState_Move() {}
-void dAcESkytail_c::initializeState_ParallelMove() {}
-void dAcESkytail_c::executeState_ParallelMove() {}
-void dAcESkytail_c::finalizeState_ParallelMove() {}
-void dAcESkytail_c::initializeState_FrontAttack() {}
-void dAcESkytail_c::executeState_FrontAttack() {}
-void dAcESkytail_c::finalizeState_FrontAttack() {}
+
+void dAcESkytail_c::initializeState_ParallelMove() {
+ field_0x13AC = 0;
+ field_0x13AA = 90 + cM::rndInt(60);
+ field_0x130C = 100.0f;
+ field_0x139A = 5 + cM::rndInt(5);
+ field_0x13B5 = 50 + cM::rndInt(20);
+ field_0x1344 = 0.0f;
+ field_0x1340 = 0.0f;
+ field_0x1380 = 0;
+ field_0x133C = 0.0f;
+ field_0x139C = 0;
+}
+
+void dAcESkytail_c::executeState_ParallelMove() {
+ mVec3_c v0;
+ f32 distf0 = 1000.0f;
+ f32 f = 12.0f;
+ dBird_c::getInstance()->fn_129_C4A0(v0, f);
+ f32 distXZ = v0.absXZTo(mPosition);
+ switch (field_0x13AC) {
+ case 0: {
+ if (field_0x13A4[0] == 0) {
+ field_0x1264.set(0.0f, 0.0f, 3000.0f);
+ field_0x12A0.set(0.0f, 0.0f, 0.0f);
+ field_0x1234.transS(mBirdPosition);
+ field_0x1234.ZXYrotM(mBirdRotation);
+ field_0x1234.multVec(field_0x1264, field_0x12A0);
+ field_0x137E = 500.0f + cM::rndF(1000.0f);
+ field_0x1378 = cLib::targetAngleY(mPosition, field_0x12A0);
+ field_0x137A = -cLib::targetAngleX(mPosition, field_0x12A0);
+ fn_172_45D0();
+ field_0x13A4[0] = 10.0f + cM::rndF(5.0f);
+ }
+ if (isWithinCameraView(0.0f, 0.0f)) {
+ if (distXZ > distf0) {
+ field_0x13AC = 1;
+ field_0x13A4[0] = 0;
+ field_0x139A = 5 + cM::rndInt(5);
+ field_0x139C = 0;
+ field_0x1360 = 1 + cM::rndInt(3);
+ }
+ }
+ } break;
+ case 1: {
+ if (field_0x13AA != 0) {
+ field_0x13AA--;
+ } else {
+ field_0x13AA = 90 + cM::rndInt(60);
+ field_0x1360 = 1 + cM::rndInt(3);
+ }
+
+ field_0x12AC.set(sArrVecs[field_0x1360]);
+ field_0x1234.transS(mBirdPosition);
+ field_0x1234.ZXYrotM(mBirdRotation);
+ field_0x1234.multVec(field_0x12AC, field_0x12AC);
+ field_0x12A0.set(field_0x12AC);
+ field_0x1264.set(0.0f, 0.0f, 3000.0f);
+ field_0x1234.multVecSR(field_0x1264, field_0x1264);
+ field_0x12A0 += field_0x1264;
+
+ distXZ = mBirdPosition.distance(field_0x12A0);
+
+ if (field_0x13A4[0] == 0) {
+ field_0x137E = 500.0f + cM::rndF(1000.0f);
+ field_0x1378 = cLib::targetAngleY(mPosition, field_0x12A0);
+ field_0x137A = -cLib::targetAngleX(mPosition, field_0x12A0);
+ fn_172_45D0();
+ field_0x13A4[0] = 25.0f + cM::rndF(10.0f);
+ if (field_0x139A > 0) {
+ field_0x139A--;
+ }
+ }
+ if (isWithinCameraView(0.0f, 0.0f)) {
+ f32 dist = mPosition.distance(field_0x12A0);
+ field_0x130C = (dBird_c::getInstance()->getField_0xFAC().mag() * (1.0f + dist / distXZ)) * 0.5f;
+
+ if (field_0x130C <= 30.0f) {
+ field_0x130C = 30.0f;
+ }
+ field_0x139C = 0;
+ if (field_0x139A <= 0) {
+ field_0x13AC = 2;
+ field_0x1340 = 0.0f;
+ field_0x1344 = 1.0f;
+ field_0x13B5 = 50 + cM::rndInt(20);
+ field_0x139A = 5 + cM::rndInt(5);
+ }
+ } else if (dBird_c::getInstance()->getField_0xFCC() > 0 && --field_0x139A < 0) {
+ field_0x13AC = 2;
+ field_0x1340 = 0.0f;
+ field_0x1344 = 1.0f;
+ field_0x13B5 = 50 + cM::rndInt(20);
+ field_0x139A = 5 + cM::rndInt(5);
+ field_0x139C = 0;
+ } else if (++field_0x139C > 0) {
+ field_0x13AC = 0;
+ field_0x13A4[0] = 0;
+ field_0x130C = 100.0f;
+ field_0x139C = 0;
+ }
+ } break;
+ case 2: {
+ field_0x12AC.set(sArrVecs[field_0x1360]);
+ field_0x1234.transS(mBirdPosition);
+ field_0x1234.ZXYrotM(mBirdRotation);
+ field_0x1234.multVec(field_0x12AC, field_0x12AC);
+ field_0x12A0.set(field_0x12AC);
+ field_0x1264.set(0.0f, 0.0f, 3000.0f);
+ field_0x1234.multVecSR(field_0x1264, field_0x1264);
+ field_0x12A0 += field_0x1264;
+
+ distXZ = mBirdPosition.distance(field_0x12A0);
+
+ if (field_0x13A4[0] == 0) {
+ field_0x137E = 500.0f + cM::rndF(1000.0f);
+ field_0x1378 = cLib::targetAngleY(mPosition, field_0x12A0);
+ field_0x137A = -cLib::targetAngleX(mPosition, field_0x12A0);
+ fn_172_45D0();
+ field_0x13A4[0] = 20.0f + cM::rndF(10.0f);
+ }
+
+ f32 dist = mPosition.distance(field_0x12A0);
+ field_0x130C = (dBird_c::getInstance()->getField_0xFAC().mag() * (1.0f + dist / distXZ)) * 0.5f;
+ if (field_0x130C <= 30.0f) {
+ field_0x130C = 30.0f;
+ }
+ if (field_0x13B5 != 0) {
+ field_0x13B5--;
+ } else {
+ field_0x13B4 = 60;
+ mCollider.AtSet();
+ startSound(SE_ESktl_V_ATTACK);
+ field_0x13AC = 3;
+ field_0x127C.set(v0 - mPosition);
+ field_0x127C.normalizeRS();
+ field_0x130C = 80.0f;
+ if (dBird_c::getInstance()->getField_0xFAC().mag() > field_0x130C) {
+ field_0x130C = dBird_c::getInstance()->getField_0xFAC().mag();
+ }
+ field_0x1378 = cLib::targetAngleY(mPosition, v0);
+ field_0x137A = -cLib::targetAngleX(mPosition, v0);
+ fn_172_45D0();
+ }
+
+ sLib::addCalcScaledDiff(&field_0x1340, field_0x1344, 0.1f, 0.1f);
+ sLib::addCalcScaledDiff(&field_0x133C, 2.0f, 0.1f, 0.1f);
+ sLib::addCalcAngle(&field_0x1372, 4000, 1, 1000);
+ } break;
+
+ case 3: {
+ mVec3_c v2 = v0 - mPosition;
+ v2.normalizeRS();
+ cLib::chasePos(field_0x127C, v2, 0.01f);
+
+ field_0x137E = 500.0f + cM::rndF(1000.0f);
+ field_0x1378 = cLib::targetAngleY(mPosition, mPosition + field_0x127C * mSpeed);
+ field_0x137A = -cLib::targetAngleX(mPosition, mPosition + field_0x127C * mSpeed);
+ fn_172_45D0();
+ if (field_0x13B4 != 0) {
+ field_0x13B4--;
+ } else {
+ if (isWithinCameraView(0.0f, 0.0f)) {
+ changeState(StateID_Move);
+ } else {
+ changeState(StateID_ParallelMove);
+ }
+ return;
+ }
+
+ cCcD_Obj *pCcObj = mCollider.findAtHit();
+ if (pCcObj != nullptr) {
+ if (pCcObj->GetAtActor()->mProfileName == fProfile::BIRD) {
+ mCollider.ClrAt();
+ field_0x13AC = 4;
+ } else if (pCcObj->GetAtActor()->isActorPlayer()) {
+ mCollider.ClrAt();
+ field_0x13AC = 4;
+ }
+ }
+ } break;
+ case 4: {
+ if (field_0x13B4 != 0) {
+ field_0x13B4--;
+ } else {
+ if (isWithinCameraView(0.0f, 0.0f)) {
+ changeState(StateID_Move);
+ } else {
+ changeState(StateID_ParallelMove);
+ }
+ return;
+ }
+ } break;
+ }
+
+ s16 zTarget = mAngle.y;
+ sLib::addCalcAngle(mAngle.y.ref(), field_0x1378, 8, field_0x137C);
+ sLib::addCalcAngle(mAngle.x.ref(), field_0x137A, 8, field_0x137C);
+ zTarget -= mAngle.y;
+ sLib::addCalcAngle(mAngle.z.ref(), zTarget * 8, 2, 3000);
+ sLib::addCalcAngle(&field_0x137C, field_0x137E, 1, 100);
+ sLib::addCalcScaledDiff(&mSpeed, field_0x130C, 1.0f, 3.0f);
+ f32 rate = mSpeed / 50.0f + field_0x1340;
+ if (rate > 5.0f) {
+ mBodyMdl.setRate(5.0f);
+ } else {
+ mBodyMdl.setRate(rate);
+ }
+}
+void dAcESkytail_c::finalizeState_ParallelMove() {
+ field_0x133C = 0.0f;
+ field_0x1372 = 0;
+ mCollider.ClrAt();
+}
+
+void dAcESkytail_c::initializeState_FrontAttack() {
+ field_0x13B1 = 1;
+ field_0x1396 = 2000;
+ field_0x138E = 0;
+ field_0x1398 = 4000;
+ mCollider.AtSet();
+ field_0x13A4[0] = 10.0f + cM::rndF(5.0f);
+}
+void dAcESkytail_c::executeState_FrontAttack() {
+ f32 f = 12.0f;
+ mVec3_c v_unused = mBirdPosition;
+ mVec3_c v0;
+ dBird_c::getInstance()->fn_129_C4A0(v0, f);
+ f32 distXZ = v0.absXZTo(mPosition);
+ distXZ = mPosition.distance(v0);
+ switch (field_0x13B1) {
+ case 1: {
+ if (field_0x13A4[0] == 0) {
+ field_0x137E = 1000.0f + cM::rndF(500.0f);
+ field_0x1378 = cLib::targetAngleY(mPosition, v0);
+ field_0x137A = -cLib::targetAngleX(mPosition, v0);
+ fn_172_45D0();
+ field_0x13A4[0] = 10.0f + cM::rndF(5.0f);
+ }
+ if (isWithinCameraView(0.0f, 0.0f)) {
+ if (distXZ < 2500.0f) {
+ field_0x13B1 = 0;
+ mVec3_c v = mPosition - v0;
+ field_0x135C = 30 + (s32)(v.mag() / mSpeed);
+ }
+ } else {
+ changeState(StateID_ParallelMove);
+ return;
+ }
+ } break;
+ case 0: {
+ field_0x135C--;
+ field_0x1378 = cLib::targetAngleY(mPosition, v0);
+ field_0x137A = -cLib::targetAngleX(mPosition, v0);
+ fn_172_45D0();
+
+ if (isWithinCameraView(0.0f, 0.0f)) {
+ if (distXZ < 1300.0f) {
+ startSound(SE_ESktl_V_ATTACK);
+ field_0x13B1 = 2;
+ mVec3_c v = mPosition - v0;
+ field_0x135C = 30 + (s32)(v.mag() / mSpeed);
+ }
+
+ } else if (!isWithinCameraView(0.0f, 0.0f) || field_0x135C <= 0) {
+ changeState(StateID_ParallelMove);
+ return;
+ }
+ } break;
+ case 2: {
+ field_0x135C--;
+ if (isWithinCameraView(0.0f, 0.0f)) {
+ if (distXZ < 800.0f) {
+ field_0x13B1 = 4;
+ mVec3_c v = mPosition - v0;
+ field_0x135C = 120 + (s32)(v.mag() / mSpeed);
+ }
+ } else if (!isWithinCameraView(0.0f, 0.0f) || field_0x135C <= 0) {
+ changeState(StateID_ParallelMove);
+ return;
+ }
+ } break;
+ case 4: {
+ field_0x135C--;
+ isWithinCameraView(0.0f, 0.0f);
+ if (field_0x135C <= 0) {
+ if (isWithinCameraView(0.0f, 0.0f)) {
+ changeState(StateID_Move);
+ } else {
+ changeState(StateID_ParallelMove);
+ }
+ return;
+ }
+ } break;
+ }
+ s16 zTarget = mAngle.y;
+ sLib::addCalcAngle(mAngle.y.ref(), field_0x1378, 8, field_0x137C);
+ sLib::addCalcAngle(mAngle.x.ref(), field_0x137A, 8, field_0x137C);
+ zTarget -= mAngle.y;
+ sLib::addCalcAngle(mAngle.z.ref(), zTarget * 8, 2, 3000);
+ sLib::addCalcAngle(&field_0x137C, field_0x137E, 1, 100);
+ cCcD_Obj *pCcObj = mCollider.findAtHit();
+ if (pCcObj != nullptr) {
+ if (pCcObj->GetAtActor()->mProfileName == fProfile::BIRD) {
+ mCollider.ClrAt();
+ } else if (pCcObj->GetAtActor()->isActorPlayer()) {
+ mCollider.ClrAt();
+ }
+ }
+ sLib::addCalcScaledDiff(&mSpeed, 80.0f, 1.0f, 1.0f);
+ mBodyMdl.setRate(mSpeed / 50.0f);
+}
+void dAcESkytail_c::finalizeState_FrontAttack() {
+ mCollider.ClrAt();
+ field_0x138E = 0;
+ field_0x1396 = 0;
+ field_0x1398 = 0;
+}
+
void dAcESkytail_c::initializeState_Charge() {}
void dAcESkytail_c::executeState_Charge() {}
-void dAcESkytail_c::finalizeState_Charge() {}
-void dAcESkytail_c::initializeState_Dead() {}
-void dAcESkytail_c::executeState_Dead() {}
+void dAcESkytail_c::finalizeState_Charge() {
+ mCc[COLLIDER_Head].ClrAtSet();
+}
+
+void dAcESkytail_c::initializeState_Dead() {
+ field_0x13AF = 0;
+ field_0x13A0 = 0;
+ field_0x1334 = 8.0f + cM::rndFX(1.0f);
+ field_0x1330 = 8.0f + cM::rndFX(1.0f);
+ field_0x1338 = 7.0f + cM::rndFX(1.0f);
+ field_0x136E = 6000 + cM::rndInt(1000);
+ field_0x136A = 6000 + cM::rndInt(1000);
+ field_0x136C = 7500 + cM::rndInt(500);
+ field_0x1370 = 6000 + cM::rndInt(1000);
+ mBodyMdl.setRate(mSpeed / 50.0f);
+ mCollider.ClrTg();
+ mCollider.ClrCo();
+ mCollider.ClrAt();
+}
+
+void dAcESkytail_c::executeState_Dead() {
+ field_0x13A0++;
+ field_0x13A2 = 500;
+ field_0x1264.set(0.0f, 0.0f, 5000.0f);
+ field_0x12A0.set(0.0f, 0.0f, 0.0f);
+
+ field_0x1234.transS(mBirdPosition);
+ field_0x1234.ZXYrotM(mBirdRotation);
+ field_0x1234.multVec(field_0x1264, field_0x12A0);
+
+ field_0x137E = 500.0f + cM::rndF(1000.0f);
+ field_0x1378 = cLib::targetAngleY(mPosition, field_0x12A0);
+ field_0x137A = -cLib::targetAngleX(mPosition, field_0x12A0);
+
+ fn_172_45D0();
+
+ sLib::addCalcAngle(mAngle.y.ref(), field_0x1378, 8, field_0x137C);
+ sLib::addCalcAngle(mAngle.x.ref(), field_0x137A, 8, field_0x137C);
+ mAngle.z += -0xAAA;
+
+ field_0x1374 += -4000;
+ field_0x1376 += -4000;
+
+ field_0x1348 = mAng(field_0x1374).cos() * 20.0f;
+ field_0x134C = mAng(field_0x1376).sin() * 20.0f;
+
+ sLib::addCalcScaledDiff(&mSpeed, 150.0f, 1.0f, 5.0f);
+ mBodyMdl.setRate(mSpeed / 50.0f);
+
+ bool bVar = false;
+ if (field_0x13A0 > 15) {
+ bVar = fn_80030570(mBodyMdl.getModel(), 1, 2.0f);
+ for (int i = 0; i < (s32)ARRAY_LENGTH(mAntennaMdl); ++i) {
+ fn_80030570(mAntennaMdl[i].getModel(), 0, 2.0f);
+ }
+ }
+
+ static mVec3_c scale(2.0f, 2.0f, 2.0f);
+ switch (field_0x1364) {
+ case 0: {
+ mBodyTransform.mScaleSpine11 = 0.0f;
+ if (mBodyTransform.mScaleSpine11 == 0.0f) {
+ mBodyMdl.getModel().setCullMode(3, GX_CULL_ALL, false);
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_460_, mBodyTransform.mPos[10], &mRotation, &scale, nullptr, nullptr, 0,
+ 0
+ );
+ field_0x1364 = 2;
+ }
+ } break;
+ case 1: {
+ if (field_0x13A0 > 15) {
+ mBodyMdl.getModel().setCullMode(3, GX_CULL_ALL, false);
+ field_0x1364 = 2;
+ }
+
+ } break;
+ }
+
+ if (bVar) {
+ itemDroppingAndGivingRelated(&mBodyTransform.mPos[11], 4);
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_320_, mBodyTransform.mPos[6], &mRotation, &scale, nullptr, nullptr, 0, 0
+ );
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_320_, mBodyTransform.mPos[4], &mRotation, &scale, nullptr, nullptr, 0, 0
+ );
+ dJEffManager_c::spawnEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_320_, mBodyTransform.mPos[2], &mRotation, &scale, nullptr, nullptr, 0, 0
+ );
+ playDeathEffect0(mPosition, &scale, false);
+ }
+}
void dAcESkytail_c::finalizeState_Dead() {}
+
void dAcESkytail_c::initializeState_Skytail() {}
-void dAcESkytail_c::executeState_Skytail() {}
+void dAcESkytail_c::executeState_Skytail() {
+ if (dBird_c::getInstance()->fn_129_CFB0()) {
+ mSpeed = 50.0f;
+ return;
+ }
+
+ mSpeed = 150.0f;
+ mVec3_c v0(0.0f, -200.0f, 2100.0f);
+ field_0x1234.transS(mBirdPosition);
+ field_0x1234.ZXYrotM(mBirdRotation);
+ field_0x1234.multVec(v0, mPosition);
+ field_0x1378 = mBirdRotation.y;
+ field_0x137A = mBirdRotation.x;
+ fn_172_45D0();
+ mAngle.y = mBirdRotation.y;
+ mAngle.x = mBirdRotation.x;
+
+ mBodyMdl.setRate(mSpeed / 50.0f);
+ mBodyMdl.setRate(mSpeed / 50.0f);
+}
void dAcESkytail_c::finalizeState_Skytail() {}
+
+void dAcESkytail_c::fn_172_3CD0() {
+ mMtx_c m1, m0;
+ mVec3_c v3, v0, v1, v2;
+ mVec3_c *pos;
+ mAng3_c *ang;
+
+ mBodyTransform.mPos[0] = mPosition;
+ mBodyTransform.mAng[0].y = mRotation.y;
+ mBodyTransform.mAng[0].x = mRotation.x;
+
+ pos = &mBodyTransform.mPos[1];
+ ang = &mBodyTransform.mAng[1];
+
+ v0.set(0.0f, 0.0f, 0.0f);
+
+ m0.YrotS(mRotation.y);
+ m0.XrotM(mRotation.x);
+
+ f32 fVar2 = field_0x1334 + 1.3f + field_0x133C;
+ f32 fVar14 = field_0x1330 + 1.3f;
+
+ for (u32 i = 1; i < ARRAY_LENGTH(mBodyTransform.mPos); ++i, ++pos, ++ang) {
+ if (i >= 11) {
+ s16 ang0 = field_0x1368 * 0.85f * field_0x136A - (i * field_0x136C);
+ f32 sin0 = mAng(ang0).sin();
+
+ s16 ang1 = field_0x1368 * (field_0x136E + field_0x1372 + 0x600) - (i * 8000);
+ f32 sin1 = mAng(ang1).sin();
+
+ v1.set(
+ fVar14 * (sin0 * 1.5f), mBodyTransform.mScaleSpine11 * (fVar2 * (sin1 * 5.0f)),
+ mBodyTransform.mScaleSpine11 * -10.0f
+ );
+ } else {
+ s16 ang0 = field_0x1368 * 0.85f * field_0x136A - (i * field_0x136C);
+ f32 sin0 = mAng(ang0).sin();
+
+ s16 ang1 = field_0x1368 * (field_0x136E + field_0x1372 + 0x600) - (i * 8000);
+ f32 sin1 = mAng(ang1).sin();
+
+ sin1 = fVar2 * (sin1 * 5.0f);
+ sin0 = fVar14 * (sin0 * 1.5f);
+ v1.set(sin0, sin1, -10.f);
+ }
+
+ m0.multVec(v1, v2);
+ v3 = (pos[0] - pos[-1]) + v2;
+
+ ang[0].y = v3.atan2sX_Z();
+ ang[0].x = -cM::atan2s(v3.y, nw4r::math::FSqrt(v3.squareMagXZ()));
+
+ m1.YrotS(ang[0].y);
+ m1.XrotM(ang[0].x);
+ m1.multVec(v0, v1);
+
+ pos[0] = pos[-1] + v1;
+
+ if (i >= 11) {
+ v0.z = mBodyTransform.mScaleSpine11 * 100.0f;
+ } else {
+ v0.z = 100.0f;
+ }
+
+ ang[0].z = mRotation.z;
+
+ fVar2 *= 1.15f;
+ fVar14 *= 1.15f;
+ }
+
+ mBodyTransform.field_0x10DE = (field_0x1396 + 6000) * ((mAng(field_0x1390).sin() * 0.6f - 0.4f) - 0.1f);
+ mBodyTransform.field_0x10E0 = (field_0x138E + 4000) * ((mAng(field_0x1388).sin() * 0.6f - 0.4f) - 0.8f);
+
+ f32 scale = 0.8f;
+}
+
+void dAcESkytail_c::fn_172_4240(s32 idx) {
+ mMtx_c m0, m1;
+ mVec3_c v3, v0, v1, v2;
+ mVec3_c *pos;
+ mAng3_c *ang;
+
+ m0.YrotS(mRotation.y);
+ m0.XrotM(mRotation.x);
+ m0.ZrotM(mRotation.z);
+
+ v0.y = -24.0f;
+ v0.z = -28.0f;
+
+ f32 fVar1;
+ if (idx == 0) {
+ v0.x = 122.0f;
+ fVar1 = 100.0f;
+ } else {
+ v0.x = -122.0f;
+ fVar1 = -100.0f;
+ }
+
+ m0.multVec(v0, mAntennaTransform[idx].mPos[0]);
+ mAntennaTransform[idx].mPos[0] += mPosition;
+
+ pos = &mAntennaTransform[idx].mPos[1];
+ ang = &mAntennaTransform[idx].mAng[1];
+
+ v0.set(0.0f, 0.0f, 70.0f);
+
+ m1.YrotS(mRotation.y);
+ m1.XrotM(mRotation.x);
+ m1.ZrotM(mRotation.z);
+
+ f32 fVar2 = 1.0f;
+ f32 fVar3 = field_0x1338 + 1.0f;
+ for (u32 i = 1; i < ARRAY_LENGTH(mAntennaTransform[idx].mPos); ++i, ++ang, ++pos) {
+ s16 angle = field_0x1368 * (field_0x1370 + 0x600) - (i * 8000);
+ v1.set(fVar1 * fVar2, 0.0f, 50.0f * mAng(angle).sin() * fVar3);
+
+ m1.multVec(v1, v2);
+
+ v3 = (pos[0] - pos[-1]) + v2;
+
+ ang[0].y = v3.atan2sX_Z();
+ ang[0].x = -cM::atan2s(v3.y, nw4r::math::FSqrt(v3.squareMagXZ()));
+
+ m0.YrotS(ang[0].y);
+ m0.XrotM(ang[0].x);
+ m0.multVec(v0, v1);
+
+ pos[0] = pos[-1] + v1;
+
+ v0.z = 130.0f;
+
+ fVar2 *= 0.8f;
+ fVar3 *= 0.8f;
+ }
+
+ mAntennaTransform[idx].mAng[0] = mAntennaTransform[idx].mAng[1];
+}
+
+void dAcESkytail_c::fn_172_45D0() {
+ return;
+}
+
+void dAcESkytail_c::fn_172_45E0() {
+ return;
+}
+
+void dAcESkytail_c::fn_172_45F0() {
+ if (mRotation.x - 7282 <= (u32)mAng::d2s(140) - 1) {
+ mRotation.x = 7281; // 40 deg
+ } else if (mRotation.x + 0x8000 <= (u32)mAng::d2s(140)) {
+ mRotation.x = -7281; // -40 deg
+ }
+}
diff --git a/src/d/a/e/d_a_en_base.cpp b/src/d/a/e/d_a_en_base.cpp
new file mode 100644
index 00000000..5dad582a
--- /dev/null
+++ b/src/d/a/e/d_a_en_base.cpp
@@ -0,0 +1,18 @@
+#include "d/a/e/d_a_en_base.h"
+
+#include "d/d_stage_mgr.h"
+#include "m/m_vec.h"
+#include "nw4r/g3d/g3d_camera.h"
+
+bool dAcEnBase_c::isWithinCameraView(f32 w, f32 h) {
+ nw4r::g3d::Camera cam = dStageMgr_c::GetInstance()->getCamera(0);
+
+ f32 x, y, width, height, near, far;
+ cam.GetViewport(&x, &y, &width, &height, &near, &far);
+
+ mVec3_c src;
+ cam.Project(src, mPosition);
+
+ return ((width * w <= src.x) && (src.x < width * (1.0f - w))) &&
+ ((height * h <= src.y) && src.y < height * (1.0f - h)) && ((near <= src.z) && (src.z < far));
+}