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__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 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)); +}