From d629cc383bb89b1558154efdcb89192b7bd826c9 Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Tue, 5 Aug 2025 04:37:09 -0400 Subject: [PATCH] d_a_e_bg matching (#2567) --- config/GZ2E01/rels/d_a_e_bg/symbols.txt | 2 +- config/ShieldD/rels/d_a_e_bgD/symbols.txt | 2 +- configure.py | 2 +- include/d/actor/d_a_e_bg.h | 45 +- src/d/actor/d_a_e_bg.cpp | 2095 ++++++++++++++------- 5 files changed, 1386 insertions(+), 760 deletions(-) diff --git a/config/GZ2E01/rels/d_a_e_bg/symbols.txt b/config/GZ2E01/rels/d_a_e_bg/symbols.txt index cc3fcbdef71..4a630a49c48 100644 --- a/config/GZ2E01/rels/d_a_e_bg/symbols.txt +++ b/config/GZ2E01/rels/d_a_e_bg/symbols.txt @@ -105,6 +105,6 @@ __vt__12dBgS_ObjAcch = .data:0x00000160; // type:object size:0x24 scope:global __vt__12J3DFrameCtrl = .data:0x00000184; // type:object size:0xC scope:global __vt__12daE_BG_HIO_c = .data:0x00000190; // type:object size:0xC scope:global __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_174_bss_8 = .bss:0x00000008; // type:object size:0x1 data:byte +l_initHIO = .bss:0x00000008; // type:object size:0x1 data:byte @3763 = .bss:0x0000000C; // type:object size:0xC scope:local l_HIO = .bss:0x00000018; // type:object size:0x24 scope:global data:byte diff --git a/config/ShieldD/rels/d_a_e_bgD/symbols.txt b/config/ShieldD/rels/d_a_e_bgD/symbols.txt index 30e93b12821..05549aca71f 100644 --- a/config/ShieldD/rels/d_a_e_bgD/symbols.txt +++ b/config/ShieldD/rels/d_a_e_bgD/symbols.txt @@ -142,5 +142,5 @@ lbl_165_data_298 = .data:0x00000298; // type:object size:0x24 @119823 = .data:0x000004A4; // type:object size:0x11 scope:local data:string @119824 = .data:0x000004CC; // type:object size:0xD scope:local data:string lbl_165_data_4D9 = .data:0x000004D9; // type:object size:0x93 -lbl_165_bss_0 = .bss:0x00000000; // type:object size:0x1 data:byte +l_initHIO = .bss:0x00000000; // type:object size:0x1 data:byte l_HIO = .bss:0x00000004; // type:object size:0x24 scope:global data:byte diff --git a/configure.py b/configure.py index 0d70fe5e00c..65876a55b8d 100755 --- a/configure.py +++ b/configure.py @@ -1651,7 +1651,7 @@ config.libs = [ ActorRel(MatchingFor("GZ2E01"), "d_a_e_arrow"), ActorRel(Equivalent, "d_a_e_ba"), # weak func order ActorRel(NonMatching, "d_a_e_bee"), - ActorRel(NonMatching, "d_a_e_bg"), + ActorRel(MatchingFor("GZ2E01"), "d_a_e_bg"), ActorRel(NonMatching, "d_a_e_bi"), ActorRel(MatchingFor("GZ2E01"), "d_a_e_bi_leaf"), ActorRel(Equivalent, "d_a_e_bs"), # weak func order diff --git a/include/d/actor/d_a_e_bg.h b/include/d/actor/d_a_e_bg.h index fb66dd632c7..5aeb2d1ffe1 100644 --- a/include/d/actor/d_a_e_bg.h +++ b/include/d/actor/d_a_e_bg.h @@ -17,19 +17,19 @@ */ class daE_BG_c : public fopEn_enemy_c { public: - /* 8068585C */ void ctrlJoint(J3DJoint*, J3DModel*); - /* 80685948 */ void JointCallBack(J3DJoint*, int); - /* 80685994 */ void draw(); + /* 8068585C */ int ctrlJoint(J3DJoint*, J3DModel*); + /* 80685948 */ static int JointCallBack(J3DJoint*, int); + /* 80685994 */ int draw(); /* 80685B70 */ void setBck(int, u8, f32, f32); /* 80685C14 */ void setActionMode(int, int); /* 80685C2C */ void damage_check(); /* 80685DBC */ void setSparkEffect(); - /* 80685F04 */ void search_esa(); + /* 80685F04 */ fopAc_ac_c* search_esa(); /* 80685F88 */ void executeBorn(); /* 80686210 */ void executeSwim(); /* 80686C90 */ void executeAttack(); /* 80687B38 */ void executeDamage(); - /* 80687CD8 */ void setBombCarry(int); + /* 80687CD8 */ bool setBombCarry(int); /* 80687DEC */ void executeBomb(); /* 80687FC4 */ void executeBirth(); /* 8068838C */ void executeHook(); @@ -37,10 +37,10 @@ public: /* 80689168 */ void action(); /* 80689544 */ void mtx_set(); /* 8068966C */ void cc_set(); - /* 806897EC */ void execute(); - /* 80689978 */ void _delete(); - /* 80689A0C */ void CreateHeap(); - /* 80689C38 */ void create(); + /* 806897EC */ int execute(); + /* 80689978 */ int _delete(); + /* 80689A0C */ int CreateHeap(); + /* 80689C38 */ int create(); void setBgId(u32 i_bgId) { mBgId = i_bgId; } bool isBomb() { return mIsBomb; } @@ -55,7 +55,7 @@ private: /* 0x670 */ s32 mActionMode; /* 0x674 */ s32 mMoveMode; /* 0x678 */ u32 mShadowKey; - /* 0x67C */ u8 field_0x67C[0x684 - 0x67C]; + /* 0x67C */ u8 field_0x67c[0x684 - 0x67C]; /* 0x684 */ f32 field_0x684; /* 0x688 */ f32 field_0x688; /* 0x68C */ u8 field_0x68c; @@ -70,24 +70,21 @@ private: /* 0x69E */ s16 field_0x69e; /* 0x6A0 */ s16 field_0x6a0; /* 0x6A2 */ s16 field_0x6a2; - /* 0x6A4 */ s16 field_0x6a4; - /* 0x6A6 */ s16 field_0x6a6; - /* 0x6A8 */ s16 field_0x6a8; + /* 0x6A4 */ s16 field_0x6a4[3]; /* 0x6AA */ s16 field_0x6aa; /* 0x6AC */ s16 field_0x6ac; /* 0x6AE */ u8 field_0x6ae; /* 0x6AF */ u8 field_0x6af; /* 0x6B0 */ u8 field_0x6b0; /* 0x6B1 */ bool mIsBomb; - /* 0x6B2 */ u8 field_0x6B2[0x6B4 - 0x6B2]; + /* 0x6B2 */ u8 field_0x6b2[0x6B4 - 0x6B2]; /* 0x6B4 */ dBgS_AcchCir mAcchCir; /* 0x6F4 */ dBgS_ObjAcch mObjAcch; /* 0x8CC */ dCcD_Stts mStts; /* 0x908 */ dCcD_Sph mSphere; /* 0xA40 */ dCcD_Sph mAtSphere; /* 0xB78 */ dCcU_AtInfo mAtInfo; - /* 0xB9C */ u32 mParticle; - /* 0xBA0 */ u8 field_0xBA0[0xBB0 - 0xBA0]; + /* 0xB9C */ u32 mParticle[5]; /* 0xBB0 */ u32 mParticle2; /* 0xBB4 */ u32 mParticle3; /* 0xBB8 */ u8 mHIOInit; @@ -98,18 +95,18 @@ STATIC_ASSERT(sizeof(daE_BG_c) == 0xbbc); class daE_BG_HIO_c : public JORReflexible { public: /* 8068580C */ daE_BG_HIO_c(); - /* 8068A19C */ virtual ~daE_BG_HIO_c(); + /* 8068A19C */ virtual ~daE_BG_HIO_c() {} void genMessage(JORMContext*); /* 0x04 */ s8 field_0x4; - /* 0x08 */ f32 tracking_speed; - /* 0x0C */ f32 rush_speed; - /* 0x10 */ f32 waiting_distance_before_charging; - /* 0x14 */ f32 player_search_distance; - /* 0x18 */ f32 attack_range; - /* 0x1C */ f32 swimming_range; - /* 0x20 */ f32 spring_time; + /* 0x08 */ f32 mTrackingSpeed; + /* 0x0C */ f32 mRushSpeed; + /* 0x10 */ f32 mWaitDistanceBeforeCharging; + /* 0x14 */ f32 mPlayerSearchDistance; + /* 0x18 */ f32 mAttackRange; + /* 0x1C */ f32 mSwimRange; + /* 0x20 */ f32 mJumpTime; }; #endif /* D_A_E_BG_H */ diff --git a/src/d/actor/d_a_e_bg.cpp b/src/d/actor/d_a_e_bg.cpp index 14c915bb409..99e1d8a6868 100644 --- a/src/d/actor/d_a_e_bg.cpp +++ b/src/d/actor/d_a_e_bg.cpp @@ -4,856 +4,1485 @@ */ #include "d/actor/d_a_e_bg.h" -#include "dol2asm.h" - - - - -// -// Forward References: -// - -extern "C" void __ct__12daE_BG_HIO_cFv(); -extern "C" void ctrlJoint__8daE_BG_cFP8J3DJointP8J3DModel(); -extern "C" void JointCallBack__8daE_BG_cFP8J3DJointi(); -extern "C" void draw__8daE_BG_cFv(); -extern "C" static void daE_BG_Draw__FP8daE_BG_c(); -extern "C" void setBck__8daE_BG_cFiUcff(); -extern "C" void setActionMode__8daE_BG_cFii(); -extern "C" void damage_check__8daE_BG_cFv(); -extern "C" void setSparkEffect__8daE_BG_cFv(); -extern "C" void search_esa__8daE_BG_cFv(); -extern "C" void executeBorn__8daE_BG_cFv(); -extern "C" void executeSwim__8daE_BG_cFv(); -extern "C" void executeAttack__8daE_BG_cFv(); -extern "C" void executeDamage__8daE_BG_cFv(); -extern "C" void setBombCarry__8daE_BG_cFi(); -extern "C" void executeBomb__8daE_BG_cFv(); -extern "C" void executeBirth__8daE_BG_cFv(); -extern "C" void executeHook__8daE_BG_cFv(); -extern "C" void executeEat__8daE_BG_cFv(); -extern "C" void action__8daE_BG_cFv(); -extern "C" void mtx_set__8daE_BG_cFv(); -extern "C" void cc_set__8daE_BG_cFv(); -extern "C" void execute__8daE_BG_cFv(); -extern "C" static void daE_BG_Execute__FP8daE_BG_c(); -extern "C" static bool daE_BG_IsDelete__FP8daE_BG_c(); -extern "C" void _delete__8daE_BG_cFv(); -extern "C" static void daE_BG_Delete__FP8daE_BG_c(); -extern "C" void CreateHeap__8daE_BG_cFv(); -extern "C" void __dt__12J3DFrameCtrlFv(); -extern "C" static void useHeapInit__FP10fopAc_ac_c(); -extern "C" void create__8daE_BG_cFv(); -extern "C" void __dt__8cM3dGSphFv(); -extern "C" void __dt__8cM3dGAabFv(); -extern "C" void __dt__12dBgS_ObjAcchFv(); -extern "C" static void daE_BG_Create__FP8daE_BG_c(); -extern "C" void __dt__12daE_BG_HIO_cFv(); -extern "C" void __sinit_d_a_e_bg_cpp(); -extern "C" static void func_8068A220(); -extern "C" static void func_8068A228(); -extern "C" extern char const* const d_a_e_bg__stringBase0; - -// -// External References: -// - -extern "C" void mDoMtx_ZXYrotM__FPA4_fsss(); -extern "C" void mDoMtx_YrotM__FPA4_fs(); -extern "C" void transM__14mDoMtx_stack_cFfff(); -extern "C" void play__14mDoExt_baseAnmFv(); -extern "C" void init__13mDoExt_brkAnmFP16J3DMaterialTableP15J3DAnmTevRegKeyiifss(); -extern "C" void entry__13mDoExt_brkAnmFP16J3DMaterialTablef(); -extern "C" void -__ct__16mDoExt_McaMorfSOFP12J3DModelDataP25mDoExt_McaMorfCallBack1_cP25mDoExt_McaMorfCallBack2_cP15J3DAnmTransformifiiP10Z2CreatureUlUl(); -extern "C" void setAnm__16mDoExt_McaMorfSOFP15J3DAnmTransformiffff(); -extern "C" void play__16mDoExt_McaMorfSOFUlSc(); -extern "C" void entryDL__16mDoExt_McaMorfSOFv(); -extern "C" void modelCalc__16mDoExt_McaMorfSOFv(); -extern "C" void __ct__10fopAc_ac_cFv(); -extern "C" void fopAcIt_Judge__FPFPvPv_PvPv(); -extern "C" void fopAcM_SearchByID__FUiPP10fopAc_ac_c(); -extern "C" void fopAcM_delete__FP10fopAc_ac_c(); -extern "C" void fopAcM_fastCreate__FsUlPC4cXyziPC5csXyzPC4cXyzScPFPv_iPv(); -extern "C" void fopAcM_createChild__FsUiUlPC4cXyziPC5csXyzPC4cXyzScPFPv_i(); -extern "C" void fopAcM_entrySolidHeap__FP10fopAc_ac_cPFP10fopAc_ac_c_iUl(); -extern "C" void fopAcM_SetMin__FP10fopAc_ac_cfff(); -extern "C" void fopAcM_SetMax__FP10fopAc_ac_cfff(); -extern "C" void fopAcM_posMoveF__FP10fopAc_ac_cPC4cXyz(); -extern "C" void fopAcM_searchActorAngleY__FPC10fopAc_ac_cPC10fopAc_ac_c(); -extern "C" void fopAcM_searchActorAngleX__FPC10fopAc_ac_cPC10fopAc_ac_c(); -extern "C" void fopAcM_searchActorDistance__FPC10fopAc_ac_cPC10fopAc_ac_c(); -extern "C" void fopAcM_otherBgCheck__FPC10fopAc_ac_cPC10fopAc_ac_c(); -extern "C" void fpcSch_JudgeForPName__FPvPv(); -extern "C" void fpcSch_JudgeByID__FPvPv(); -extern "C" void dComIfG_resLoad__FP30request_of_phase_process_classPCc(); -extern "C" void dComIfG_resDelete__FP30request_of_phase_process_classPCc(); -extern "C" void dComIfGp_getReverb__Fi(); -extern "C" void -dComIfGd_setShadow__FUlScP8J3DModelP4cXyzffffR13cBgS_PolyInfoP12dKy_tevstr_csfP9_GXTexObj(); -extern "C" void onSwitch__10dSv_info_cFii(); -extern "C" void isSwitch__10dSv_info_cCFii(); -extern "C" void getRes__14dRes_control_cFPCclP11dRes_info_ci(); -extern "C" void getEmitter__Q213dPa_control_c7level_cFUl(); -extern "C" void -set__13dPa_control_cFUlUcUsPC4cXyzPC12dKy_tevstr_cPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyzf(); -extern "C" void LockonTarget__12dAttention_cFl(); -extern "C" void LockonTruth__12dAttention_cFv(); -extern "C" void LineCross__4cBgSFP11cBgS_LinChk(); -extern "C" void GroundCross__4cBgSFP11cBgS_GndChk(); -extern "C" void __ct__12dBgS_AcchCirFv(); -extern "C" void SetWall__12dBgS_AcchCirFff(); -extern "C" void __dt__9dBgS_AcchFv(); -extern "C" void __ct__9dBgS_AcchFv(); -extern "C" void Set__9dBgS_AcchFP4cXyzP4cXyzP10fopAc_ac_ciP12dBgS_AcchCirP4cXyzP5csXyzP5csXyz(); -extern "C" void CrrPos__9dBgS_AcchFR4dBgS(); -extern "C" void __ct__11dBgS_GndChkFv(); -extern "C" void __dt__11dBgS_GndChkFv(); -extern "C" void __ct__18dBgS_ObjGndChk_SplFv(); -extern "C" void __dt__18dBgS_ObjGndChk_SplFv(); -extern "C" void __ct__11dBgS_LinChkFv(); -extern "C" void __dt__11dBgS_LinChkFv(); -extern "C" void Set__11dBgS_LinChkFPC4cXyzPC4cXyzPC10fopAc_ac_c(); -extern "C" void SetObj__16dBgS_PolyPassChkFv(); -extern "C" void __ct__10dCcD_GSttsFv(); -extern "C" void Move__10dCcD_GSttsFv(); -extern "C" void Init__9dCcD_SttsFiiP10fopAc_ac_c(); -extern "C" void __ct__12dCcD_GObjInfFv(); -extern "C" void ChkAtHit__12dCcD_GObjInfFv(); -extern "C" void GetAtHitObj__12dCcD_GObjInfFv(); -extern "C" void ChkTgHit__12dCcD_GObjInfFv(); -extern "C" void GetTgHitObj__12dCcD_GObjInfFv(); -extern "C" void Set__8dCcD_SphFRC11dCcD_SrcSph(); -extern "C" void cc_at_check__FP10fopAc_ac_cP11dCcU_AtInfo(); -extern "C" void settingTevStruct__18dScnKy_env_light_cFiP4cXyzP12dKy_tevstr_c(); -extern "C" void setLightTevColorType_MAJI__18dScnKy_env_light_cFP12J3DModelDataP12dKy_tevstr_c(); -extern "C" void GetAc__8cCcD_ObjFv(); -extern "C" void Set__4cCcSFP8cCcD_Obj(); -extern "C" void cM_rnd__Fv(); -extern "C" void cM_rndF__Ff(); -extern "C" void cM_rndFX__Ff(); -extern "C" void SetPos__11cBgS_GndChkFPC3Vec(); -extern "C" void SetPos__11cBgS_GndChkFPC4cXyz(); -extern "C" void SetC__8cM3dGSphFRC4cXyz(); -extern "C" void SetR__8cM3dGSphFf(); -extern "C" void cLib_addCalcAngleS__FPsssss(); -extern "C" void cLib_chaseF__FPfff(); -extern "C" void cLib_chaseAngleS__FPsss(); -extern "C" void cLib_targetAngleY__FPC3VecPC3Vec(); -extern "C" void cLib_targetAngleX__FPC4cXyzPC4cXyz(); -extern "C" void cLib_distanceAngleS__Fss(); -extern "C" void func_802807E0(); -extern "C" void __ct__15Z2CreatureEnemyFv(); -extern "C" void init__15Z2CreatureEnemyFP3VecP3VecUcUc(); -extern "C" void setLinkSearch__15Z2CreatureEnemyFb(); -extern "C" void setEnemyName__15Z2CreatureEnemyFPCc(); -extern "C" void* __nw__FUl(); -extern "C" void __dl__FPv(); -extern "C" void init__12J3DFrameCtrlFs(); -extern "C" void _savegpr_24(); -extern "C" void _savegpr_25(); -extern "C" void _savegpr_28(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_24(); -extern "C" void _restgpr_25(); -extern "C" void _restgpr_28(); -extern "C" void _restgpr_29(); -extern "C" extern void* __vt__8dCcD_Sph[36]; -extern "C" extern void* __vt__9dCcD_Stts[11]; -extern "C" extern void* __vt__12cCcD_SphAttr[25]; -extern "C" extern void* __vt__14cCcD_ShapeAttr[22]; -extern "C" extern void* __vt__9cCcD_Stts[8]; -extern "C" u8 now__14mDoMtx_stack_c[48]; -extern "C" extern u8 g_dComIfG_gameInfo[122384]; -extern "C" u8 mSimpleTexObj__21dDlst_shadowControl_c[32]; -extern "C" u8 mCurrentMtx__6J3DSys[48]; -extern "C" u8 sincosTable___5JMath[65536]; -extern "C" extern u8 mStayNo__20dStage_roomControl_c[4]; -extern "C" extern u8 pauseTimer__9dScnPly_c[4]; -extern "C" void __register_global_object(); - -// -// Declarations: -// - -/* ############################################################################################## */ -/* 8068A244-8068A248 000000 0004+00 12/12 0/0 0/0 .rodata @3768 */ -SECTION_RODATA static f32 const lit_3768 = 8.0f; -COMPILER_STRIP_GATE(0x8068A244, &lit_3768); - -/* 8068A248-8068A24C 000004 0004+00 0/1 0/0 0/0 .rodata @3769 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3769 = 16.0f; -COMPILER_STRIP_GATE(0x8068A248, &lit_3769); -#pragma pop - -/* 8068A24C-8068A250 000008 0004+00 0/1 0/0 0/0 .rodata @3770 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3770 = 1000.0f; -COMPILER_STRIP_GATE(0x8068A24C, &lit_3770); -#pragma pop - -/* 8068A250-8068A254 00000C 0004+00 1/3 0/0 0/0 .rodata @3771 */ -SECTION_RODATA static f32 const lit_3771 = 500.0f; -COMPILER_STRIP_GATE(0x8068A250, &lit_3771); - -/* 8068A254-8068A258 000010 0004+00 1/5 0/0 0/0 .rodata @3772 */ -SECTION_RODATA static f32 const lit_3772 = 100.0f; -COMPILER_STRIP_GATE(0x8068A254, &lit_3772); - -/* 8068A314-8068A354 000000 0040+00 1/1 0/0 0/0 .data cc_bg_src__22@unnamed@d_a_e_bg_cpp@ - */ -SECTION_DATA static u8 data_8068A314[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xD8, 0xFB, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x75, 0x09, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x20, 0x00, 0x00, -}; - -/* 8068A354-8068A394 000040 0040+00 1/1 0/0 0/0 .data cc_bg_at_src__22@unnamed@d_a_e_bg_cpp@ */ -SECTION_DATA static u8 data_8068A354[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x20, 0x00, 0x00, -}; - -/* 8068A394-8068A3A0 000080 000A+02 1/1 0/0 0/0 .data enemyBombID$3951 */ -SECTION_DATA static u8 enemyBombID[10 + 2 /* padding */] = { - 0x0A, - 0x0D, - 0x0A, - 0x0E, - 0x0A, - 0x0F, - 0x0A, - 0x10, - 0x0A, - 0x11, - /* padding */ - 0x00, - 0x00, -}; - -/* 8068A3A0-8068A3CC -00001 002C+00 1/1 0/0 0/0 .data @4648 */ -SECTION_DATA static void* lit_4648[11] = { - (void*)(((char*)executeAttack__8daE_BG_cFv) + 0x278), - (void*)(((char*)executeAttack__8daE_BG_cFv) + 0x484), - (void*)(((char*)executeAttack__8daE_BG_cFv) + 0xA54), - (void*)(((char*)executeAttack__8daE_BG_cFv) + 0xB4C), - (void*)(((char*)executeAttack__8daE_BG_cFv) + 0xC38), - (void*)(((char*)executeAttack__8daE_BG_cFv) + 0xDC0), - (void*)(((char*)executeAttack__8daE_BG_cFv) + 0xE7C), - (void*)(((char*)executeAttack__8daE_BG_cFv) + 0xE7C), - (void*)(((char*)executeAttack__8daE_BG_cFv) + 0xE7C), - (void*)(((char*)executeAttack__8daE_BG_cFv) + 0xE7C), - (void*)(((char*)executeAttack__8daE_BG_cFv) + 0x3F0), -}; - -/* 8068A3CC-8068A3EC -00001 0020+00 1/1 0/0 0/0 .data @5098 */ -SECTION_DATA static void* lit_5098[8] = { - (void*)(((char*)executeEat__8daE_BG_cFv) + 0xAC), - (void*)(((char*)executeEat__8daE_BG_cFv) + 0x190), - (void*)(((char*)executeEat__8daE_BG_cFv) + 0x250), - (void*)(((char*)executeEat__8daE_BG_cFv) + 0x424), - (void*)(((char*)executeEat__8daE_BG_cFv) + 0xD70), - (void*)(((char*)executeEat__8daE_BG_cFv) + 0x6D0), - (void*)(((char*)executeEat__8daE_BG_cFv) + 0x794), - (void*)(((char*)executeEat__8daE_BG_cFv) + 0x970), -}; - -/* 8068A3EC-8068A40C -00001 0020+00 1/1 0/0 0/0 .data @5159 */ -SECTION_DATA static void* lit_5159[8] = { - (void*)(((char*)action__8daE_BG_cFv) + 0x5C), (void*)(((char*)action__8daE_BG_cFv) + 0x68), - (void*)(((char*)action__8daE_BG_cFv) + 0x74), (void*)(((char*)action__8daE_BG_cFv) + 0x84), - (void*)(((char*)action__8daE_BG_cFv) + 0x90), (void*)(((char*)action__8daE_BG_cFv) + 0x9C), - (void*)(((char*)action__8daE_BG_cFv) + 0xA8), (void*)(((char*)action__8daE_BG_cFv) + 0xB4), -}; - -/* 8068A40C-8068A42C -00001 0020+00 1/0 0/0 0/0 .data l_daE_BG_Method */ -static actor_method_class l_daE_BG_Method = { - (process_method_func)daE_BG_Create__FP8daE_BG_c, - (process_method_func)daE_BG_Delete__FP8daE_BG_c, - (process_method_func)daE_BG_Execute__FP8daE_BG_c, - (process_method_func)daE_BG_IsDelete__FP8daE_BG_c, - (process_method_func)daE_BG_Draw__FP8daE_BG_c, -}; - -/* 8068A42C-8068A45C -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_BG */ -extern actor_process_profile_definition g_profile_E_BG = { - fpcLy_CURRENT_e, // mLayerID - 7, // mListID - fpcPi_CURRENT_e, // mListPrio - PROC_E_BG, // mProcName - &g_fpcLf_Method.base, // sub_method - sizeof(daE_BG_c), // mSize - 0, // mSizeOther - 0, // mParameters - &g_fopAc_Method.base, // sub_method - 204, // mPriority - &l_daE_BG_Method, // sub_method - 0x000D0100, // mStatus - fopAc_ENEMY_e, // mActorType - fopAc_CULLBOX_CUSTOM_e, // cullType -}; - -/* 8068A45C-8068A468 000148 000C+00 2/2 0/0 0/0 .data __vt__8cM3dGSph */ -SECTION_DATA extern void* __vt__8cM3dGSph[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGSphFv, -}; - -/* 8068A468-8068A474 000154 000C+00 2/2 0/0 0/0 .data __vt__8cM3dGAab */ -SECTION_DATA extern void* __vt__8cM3dGAab[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGAabFv, -}; - -/* 8068A474-8068A498 000160 0024+00 2/2 0/0 0/0 .data __vt__12dBgS_ObjAcch */ -SECTION_DATA extern void* __vt__12dBgS_ObjAcch[9] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12dBgS_ObjAcchFv, - (void*)NULL, - (void*)NULL, - (void*)func_8068A228, - (void*)NULL, - (void*)NULL, - (void*)func_8068A220, -}; - -/* 8068A498-8068A4A4 000184 000C+00 2/2 0/0 0/0 .data __vt__12J3DFrameCtrl */ -SECTION_DATA extern void* __vt__12J3DFrameCtrl[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12J3DFrameCtrlFv, -}; - -/* 8068A4A4-8068A4B0 000190 000C+00 2/2 0/0 0/0 .data __vt__12daE_BG_HIO_c */ -SECTION_DATA extern void* __vt__12daE_BG_HIO_c[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12daE_BG_HIO_cFv, -}; +#include "SSystem/SComponent/c_math.h" +#include "d/actor/d_a_e_df.h" +#include "d/actor/d_a_mg_rod.h" +#include "d/actor/d_a_player.h" +#include "d/d_bomb.h" +#include "d/d_com_inf_game.h" +#include "d/d_drawlist.h" +#include "d/d_s_play.h" /* 8068580C-8068585C 0000EC 0050+00 1/1 0/0 0/0 .text __ct__12daE_BG_HIO_cFv */ daE_BG_HIO_c::daE_BG_HIO_c() { - // NONMATCHING + field_0x4 = -1; + mTrackingSpeed = 8.0f; + mRushSpeed = 16.0f; + mPlayerSearchDistance = 1000.0f; + mAttackRange = 1000.0f; + mSwimRange = 500.0f; + mWaitDistanceBeforeCharging = 500.0f; + mJumpTime = 100.0f; +} + +#if DEBUG +void daE_BG_HIO_c::genMessage(JORMContext* ctx) { + // "Bomb fish" + ctx->genLabel("爆弾魚", 0x80000001, 0, NULL, 0xffff, 0xffff, 0x200, 0x18); + ctx->genSlider("追跡速度", &mTrackingSpeed, 0.0, 100.0f, 0, NULL, 0xffff, 0xffff, 0x200, 0x18); + ctx->genSlider("突進速度", &mRushSpeed, 0.0, 100.0f, 0, NULL, 0xffff, 0xffff, 0x200, 0x18); + ctx->genSlider("プレイヤーサーチ距離", &mPlayerSearchDistance, 0.0, 2000.0f, 0, NULL, 0xffff, + 0xffff, 0x200, 0x18); + ctx->genSlider("攻撃行動範囲", &mAttackRange, 0.0, 2000.0f, 0, NULL, 0xffff, 0xffff, 0x200, + 0x18); + ctx->genSlider("遊泳行動範囲", &mSwimRange, 0.0, 2000.0f, 0, NULL, 0xffff, 0xffff, 0x200, 0x18); + ctx->genSlider("突進前待機距離", &mWaitDistanceBeforeCharging, 0.0, 1000.0f, 0, NULL, 0xffff, + 0xffff, 0x200, 0x18); + ctx->genSlider("湧き出し時間", &mJumpTime, 0.0, 1000.0f, 0, NULL, 0xffff, 0xffff, 0x200, 0x18); +} +#endif + +namespace { +/* 8068A314-8068A354 000000 0040+00 1/1 0/0 0/0 .data cc_bg_src__22@unnamed@d_a_e_bg_cpp@ + */ +dCcD_SrcSph cc_bg_src = { + { + {0x0, {{0x0, 0x0, 0x0}, {(s32)0xD8FBFDFF, 0x03}, 0x75}}, // mObj + {dCcD_SE_METAL, 0x0, 0x0, 0x0, 0x0}, // mGObjAt + {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg + {0x0}, // mGObjCo + }, // mObjInf + { + {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph + } // mSphAttr +}; + +/* 8068A354-8068A394 000040 0040+00 1/1 0/0 0/0 .data cc_bg_at_src__22@unnamed@d_a_e_bg_cpp@ */ +dCcD_SrcSph cc_bg_at_src = { + { + {0x0, {{0x400, 0x1, 0xD}, {0x0, 0x0}, 0x0}}, // mObj + {dCcD_SE_METAL, 0x0, 0x0, 0x0, 0x0}, // mGObjAt + {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x02}, // mGObjTg + {0x0}, // mGObjCo + }, // mObjInf + { + {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph + } // mSphAttr +}; } /* 8068585C-80685948 00013C 00EC+00 1/1 0/0 0/0 .text ctrlJoint__8daE_BG_cFP8J3DJointP8J3DModel */ -void daE_BG_c::ctrlJoint(J3DJoint* param_0, J3DModel* param_1) { - // NONMATCHING +int daE_BG_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) { + J3DJoint* joint = i_joint; + s32 jointNo = joint->getJntNo(); + + mDoMtx_stack_c::copy(i_model->getAnmMtx(jointNo)); + + if (jointNo != 0) { + if (jointNo == 1) { + if (field_0x6b0 == 0) { + mDoMtx_stack_c::YrotM(field_0x6aa + nREG_S(7)); + } else { + mDoMtx_stack_c::YrotM(-field_0x6a4[0] + field_0x6aa + nREG_S(7)); + } + } else { + mDoMtx_stack_c::YrotM(field_0x6a4[jointNo - 2]); + } + } + + i_model->setAnmMtx(jointNo, mDoMtx_stack_c::get()); + + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + + return 1; } /* 80685948-80685994 000228 004C+00 2/2 0/0 0/0 .text JointCallBack__8daE_BG_cFP8J3DJointi */ -void daE_BG_c::JointCallBack(J3DJoint* param_0, int param_1) { - // NONMATCHING +int daE_BG_c::JointCallBack(J3DJoint* i_joint, int param_1) { + if (param_1 == NULL) { + J3DModel* model = j3dSys.getModel(); + daE_BG_c* bg = (daE_BG_c*)model->getUserArea(); + if (bg != NULL) { + bg->ctrlJoint(i_joint, model); + } + } + + return 1; } -/* ############################################################################################## */ -/* 8068A258-8068A25C 000014 0004+00 0/2 0/0 0/0 .rodata @3887 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3887 = 30.0f; -COMPILER_STRIP_GATE(0x8068A258, &lit_3887); -#pragma pop - -/* 8068A25C-8068A260 000018 0004+00 0/1 0/0 0/0 .rodata @3888 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3888 = 32.0f; -COMPILER_STRIP_GATE(0x8068A25C, &lit_3888); -#pragma pop - -/* 8068A260-8068A264 00001C 0004+00 0/2 0/0 0/0 .rodata @3889 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3889 = 200.0f; -COMPILER_STRIP_GATE(0x8068A260, &lit_3889); -#pragma pop - -/* 8068A264-8068A268 000020 0004+00 1/11 0/0 0/0 .rodata @3890 */ -SECTION_RODATA static u8 const lit_3890[4] = { - 0x00, - 0x00, - 0x00, - 0x00, -}; -COMPILER_STRIP_GATE(0x8068A264, &lit_3890); - -/* 8068A268-8068A26C 000024 0004+00 2/7 0/0 0/0 .rodata @3891 */ -SECTION_RODATA static f32 const lit_3891 = 1.0f; -COMPILER_STRIP_GATE(0x8068A268, &lit_3891); - /* 80685994-80685B50 000274 01BC+00 1/1 0/0 0/0 .text draw__8daE_BG_cFv */ -void daE_BG_c::draw() { - // NONMATCHING +int daE_BG_c::draw() { + if (field_0x6af != 0) { + return 1; + } + + J3DModel* model = mpMorfSO->getModel(); + + g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType_MAJI(model, &tevStr); + + mpBrkAnm->entry(model->getModelData()); + + if ((mActionMode == 3 || mActionMode == 4) && field_0x694 != 0) { + J3DGXColorS10 color; + color.r = 32.0f - fabsf(cM_scos(field_0x698) * 30.0f); + color.g = 0; + color.b = 0; + color.a = 0; + + J3DMaterial* mat = model->getModelData()->getMaterialNodePointer(0); + mat->setTevColor(0, &color); + mat = model->getModelData()->getMaterialNodePointer(1); + mat->setTevColor(0, &color); + } + + mpMorfSO->entryDL(); + + cXyz offsetPos; + offsetPos.set(current.pos.x, current.pos.y + 100.0f, current.pos.z); + + GXTexObj* texObj = dDlst_shadowControl_c::getSimpleTex(); + + mShadowKey = dComIfGd_setShadow(mShadowKey, 0x01, model, &offsetPos, 200.0f, 0.0f, current.pos.y, + mObjAcch.GetGroundH(), mObjAcch.m_gnd, &tevStr, 0, 1.0f, texObj); + + return 1; } /* 80685B50-80685B70 000430 0020+00 1/0 0/0 0/0 .text daE_BG_Draw__FP8daE_BG_c */ -static void daE_BG_Draw(daE_BG_c* param_0) { - // NONMATCHING +static int daE_BG_Draw(daE_BG_c* i_this) { + return i_this->draw(); } -/* ############################################################################################## */ -/* 8068A26C-8068A270 000028 0004+00 1/1 0/0 0/0 .rodata @3905 */ -SECTION_RODATA static f32 const lit_3905 = -1.0f; -COMPILER_STRIP_GATE(0x8068A26C, &lit_3905); - -/* 8068A308-8068A308 0000C4 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_8068A308 = "E_BG"; -#pragma pop - /* 80685B70-80685C14 000450 00A4+00 2/2 0/0 0/0 .text setBck__8daE_BG_cFiUcff */ void daE_BG_c::setBck(int param_0, u8 param_1, f32 param_2, f32 param_3) { - // NONMATCHING + mpMorfSO->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("E_BG", param_0), param_1, param_2, + param_3, 0.0f, -1.0f); } /* 80685C14-80685C2C 0004F4 0018+00 7/7 0/0 0/0 .text setActionMode__8daE_BG_cFii */ void daE_BG_c::setActionMode(int i_action, int i_mode) { - // NONMATCHING + if (mActionMode != i_action) { + mActionMode = i_action; + mMoveMode = i_mode; + } } /* 80685C2C-80685DBC 00050C 0190+00 1/1 0/0 0/0 .text damage_check__8daE_BG_cFv */ void daE_BG_c::damage_check() { - // NONMATCHING + if (field_0x68e != 0) { + return; + } + + mStts.Move(); + if (!mSphere.ChkTgHit()) { + return; + } + + if (field_0x694 != 0) { + if (field_0x68d == 0 && field_0x68c != 0xff) { + dComIfGs_onSwitch(field_0x68c, fopAcM_GetRoomNo(this)); + } + + dBomb_c::createWaterBombExplode(¤t.pos); + + fopAcM_delete(this); + } else { + mAtInfo.mpCollider = mSphere.GetTgHitObj(); + + // bug? + fopAc_ac_c* actor = dCc_GetAc(mAtInfo.mpCollider->GetAc()); + cc_at_check(this, &mAtInfo); + + if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_UNK)) { + field_0x68e = 20; + } else { + field_0x68e = 10; + } + + if (mAtInfo.mAttackPower <= 1) { + field_0x68e = 10 + KREG_S(8); + } + dScnPly_c::setPauseTimer(0); + mSphere.ClrTgHit(); + mCreatureSound.startCreatureVoice(Z2SE_EN_BG_V_DAMAGE, -1); + if (mAtInfo.mpCollider->ChkAtType(AT_TYPE_HOOKSHOT)) { + setActionMode(6, 0); + } else { + setActionMode(3, 0); + } + } } /* 80685DBC-80685F04 00069C 0148+00 1/1 0/0 0/0 .text setSparkEffect__8daE_BG_cFv */ void daE_BG_c::setSparkEffect() { - // NONMATCHING + static u16 enemyBombID[5] = { + 0x0A0D, + 0x0A0E, + 0x0A0F, + 0x0A10, + 0x0A11, + }; + + mDoMtx_stack_c::copy(mpMorfSO->getModel()->getAnmMtx(1)); + + for (s32 i = 0; i < 5; i++) { + mParticle[i] = dComIfGp_particle_set(mParticle[i], enemyBombID[i], ¤t.pos, &tevStr); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mParticle[i]); + if (emitter != NULL) { + emitter->setGlobalRTMatrix(mDoMtx_stack_c::get()); + } + } + + mCreatureSound.startCreatureSoundLevel(Z2SE_OBJ_BOMB_IGNITION, 0, + dComIfGp_getReverb(dComIfGp_roomControl_getStayNo())); } -/* ############################################################################################## */ -/* 8068A270-8068A274 00002C 0004+00 1/5 0/0 0/0 .rodata @4007 */ -SECTION_RODATA static f32 const lit_4007 = 20.0f; -COMPILER_STRIP_GATE(0x8068A270, &lit_4007); - /* 80685F04-80685F88 0007E4 0084+00 2/2 0/0 0/0 .text search_esa__8daE_BG_cFv */ -void daE_BG_c::search_esa() { - // NONMATCHING +fopAc_ac_c* daE_BG_c::search_esa() { + dmg_rod_class* rod = (dmg_rod_class*)fopAcM_SearchByName(PROC_MG_ROD); + if (rod != NULL && rod->field_0xf7c == 1 && rod->field_0xf7e != 5 && rod->field_0x100d != 0 && + rod->current.pos.y < rod->field_0x590 - 20.0f) { + return rod; + } else { + return NULL; + } } /* ############################################################################################## */ /* 8068A4B8-8068A4BC 000008 0004+00 2/2 0/0 0/0 .bss None */ -static u8 data_8068A4B8[4]; - -/* 8068A4BC-8068A4C8 00000C 000C+00 1/1 0/0 0/0 .bss @3763 */ -static u8 lit_3763[12]; +static u8 l_initHIO; /* 8068A4C8-8068A4EC 000018 0024+00 5/5 0/0 0/0 .bss l_HIO */ -static u8 l_HIO[36]; +static daE_BG_HIO_c l_HIO; /* 80685F88-80686210 000868 0288+00 1/1 0/0 0/0 .text executeBorn__8daE_BG_cFv */ void daE_BG_c::executeBorn() { - // NONMATCHING + dBgS_GndChk gndChk; + cXyz currentWithOffset; + switch (mMoveMode) { + case 0: { + field_0x6ac = 0; + field_0x6af = 1; + mBgId = 0xffffffff; + mMoveMode = 1; + field_0x68f = 0; + attention_info.flags = 0; + + currentWithOffset = current.pos; + currentWithOffset.y += 100.0f; + + gndChk.SetPos(¤tWithOffset); + current.pos.y = dComIfG_Bgsp().GroundCross(&gndChk); + } + case 1: { + if (field_0x68c != 0xff) { + if (dComIfGs_isSwitch(field_0x68c, fopAcM_GetRoomNo(this))) { + return; + } + } + + if (mBgId == 0xffffffff) { + if (fopAcM_searchPlayerDistance(this) < 500.0f) { + field_0x68f = l_HIO.mJumpTime; + mMoveMode = 2; + } + } else { + if (fopAcM_SearchByID(mBgId) == NULL) { + mBgId = 0xffffffff; + } + } + + break; + } + case 2: { + if (field_0x68c != 0xff) { + if (dComIfGs_isSwitch(field_0x68c, fopAcM_GetRoomNo(this))) { + return; + } + } + + if (field_0x68f == 0) { + mBgId = fopAcM_createChild(PROC_E_BG, fopAcM_GetID(this), 0xffffff02, ¤t.pos, + fopAcM_GetRoomNo(this), &shape_angle, NULL, -1, NULL); + mMoveMode = 3; + } + + break; + } + case 3: { + if (field_0x68c != 0xff) { + if (dComIfGs_isSwitch(field_0x68c, fopAcM_GetRoomNo(this))) { + return; + } + } + + if (fopAcM_SearchByID(mBgId) != NULL) { + mMoveMode = 1; + } + + break; + } + } } -/* ############################################################################################## */ -/* 8068A274-8068A27C 000030 0008+00 0/3 0/0 0/0 .rodata @4347 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_4347[8] = { - 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x8068A274, &lit_4347); -#pragma pop - -/* 8068A27C-8068A284 000038 0008+00 0/3 0/0 0/0 .rodata @4348 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_4348[8] = { - 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x8068A27C, &lit_4348); -#pragma pop - -/* 8068A284-8068A28C 000040 0008+00 0/3 0/0 0/0 .rodata @4349 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_4349[8] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x8068A284, &lit_4349); -#pragma pop - -/* 8068A28C-8068A290 000048 0004+00 0/4 0/0 0/0 .rodata @4350 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4350 = -1000000000.0f; -COMPILER_STRIP_GATE(0x8068A28C, &lit_4350); -#pragma pop - -/* 8068A290-8068A294 00004C 0004+00 0/3 0/0 0/0 .rodata @4351 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4351 = 50.0f; -COMPILER_STRIP_GATE(0x8068A290, &lit_4351); -#pragma pop - -/* 8068A294-8068A298 000050 0004+00 0/1 0/0 0/0 .rodata @4352 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4352 = 16000.0f; -COMPILER_STRIP_GATE(0x8068A294, &lit_4352); -#pragma pop - -/* 8068A298-8068A29C 000054 0004+00 0/2 0/0 0/0 .rodata @4353 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4353 = 8192.0f; -COMPILER_STRIP_GATE(0x8068A298, &lit_4353); -#pragma pop - -/* 8068A29C-8068A2A0 000058 0004+00 0/1 0/0 0/0 .rodata @4354 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4354 = 90.0f; -COMPILER_STRIP_GATE(0x8068A29C, &lit_4354); -#pragma pop - -/* 8068A2A0-8068A2A4 00005C 0004+00 0/2 0/0 0/0 .rodata @4355 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4355 = 4.0f; -COMPILER_STRIP_GATE(0x8068A2A0, &lit_4355); -#pragma pop - -/* 8068A2A4-8068A2A8 000060 0004+00 0/5 0/0 0/0 .rodata @4356 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4356 = 1.0f / 5.0f; -COMPILER_STRIP_GATE(0x8068A2A4, &lit_4356); -#pragma pop - -/* 8068A2A8-8068A2AC 000064 0004+00 0/1 0/0 0/0 .rodata @4357 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4357 = 1.0f / 10.0f; -COMPILER_STRIP_GATE(0x8068A2A8, &lit_4357); -#pragma pop - -/* 8068A2AC-8068A2B4 000068 0004+04 0/1 0/0 0/0 .rodata @4358 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4358[1 + 1 /* padding */] = { - 2.0f, - /* padding */ - 0.0f, -}; -COMPILER_STRIP_GATE(0x8068A2AC, &lit_4358); -#pragma pop - -/* 8068A2B4-8068A2BC 000070 0008+00 0/1 0/0 0/0 .rodata @4360 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_4360[8] = { - 0x43, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x8068A2B4, &lit_4360); -#pragma pop - /* 80686210-80686C90 000AF0 0A80+00 1/1 0/0 0/0 .text executeSwim__8daE_BG_cFv */ void daE_BG_c::executeSwim() { - // NONMATCHING -} + field_0x6a2 = nREG_S(0) + 0xc00; + field_0x69c += field_0x6a0; -/* ############################################################################################## */ -/* 8068A2BC-8068A2C0 000078 0004+00 0/1 0/0 0/0 .rodata @4646 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4646 = -5.0f; -COMPILER_STRIP_GATE(0x8068A2BC, &lit_4646); -#pragma pop + if (current.pos.abs(home.pos) < l_HIO.mAttackRange) { + if (daPy_getPlayerActorClass()->current.pos.abs(home.pos) < l_HIO.mAttackRange && + fopAcM_searchPlayerDistance(this) < l_HIO.mPlayerSearchDistance) + { + if (!fopAcM_otherBgCheck(this, daPy_getPlayerActorClass())) { + if (daPy_getPlayerActorClass()->checkEquipHeavyBoots()) { + if (field_0x684 != -1e+09f) { + if (daPy_getPlayerActorClass()->current.pos.y < field_0x684 - 20.0f) { + setActionMode(2, 0); + return; + } + } else { + setActionMode(2, 0); + return; + } + } else if (dComIfGp_checkPlayerStatus0(0, fopAcM_STATUS_HOOK_CARRY_NOW)) { + setActionMode(2, 0); + return; + } + } + } + + if (search_esa() != NULL) { + setActionMode(7, 0); + return; + } + } + + switch (mMoveMode) { + case 0: { + field_0x660.y = home.pos.y + cM_rndFX(500.0f); + if (field_0x684 != -1e+09f && field_0x660.y > field_0x684 - 50.0f) { + field_0x660.y = field_0x684 - 50.0f; + } + + if (current.pos.absXZ(home.pos) < l_HIO.mSwimRange - 100.0f) { + field_0x69a = shape_angle.y - 0x8000 + cM_rndFX(16000.0f); + } else { + field_0x69a = cLib_targetAngleY(¤t.pos, &home.pos) + cM_rndFX(8192.0f); + } + + field_0x660.x = cM_ssin(field_0x69a) * 500.0f; + field_0x660.z = cM_scos(field_0x69a) * 500.0f; + + field_0x68f = cM_rndFX(20.0f) + 90.0f; + + mMoveMode = 1; + } + case 1: { + field_0x6ac = field_0x69a - shape_angle.y; + + cLib_addCalcAngleS(&shape_angle.y, field_0x69a, 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, 0, 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, cM_scos(shape_angle.x) * 4.0f, 0.2f); + cLib_chaseF(&speed.y, cM_ssin(shape_angle.x) * 4.0f, 0.2f); + + field_0x6a0 = 0x2000; + if (abs((s16)(shape_angle.y - field_0x69a)) < 0x800) { + mMoveMode = 2; + } + break; + } + case 2: { + field_0x6ac = field_0x69a - shape_angle.y; + + cLib_addCalcAngleS(&shape_angle.y, field_0x69a, 0x10, 0x400, 0x100); + s32 targetAngleX = cLib_targetAngleX(¤t.pos, &field_0x660); + cLib_addCalcAngleS(&shape_angle.x, targetAngleX, 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, cM_scos(shape_angle.x) * 4.0f, 0.2f); + cLib_chaseF(&speed.y, cM_ssin(shape_angle.x) * 4.0f, 0.2f); + + cLib_addCalcAngleS(&field_0x6a0, 0xc00, 8, 0x400, 0x100); + + if (speed.y > 0.0f && field_0x684 != -1e+09f && current.pos.y > field_0x684 - 50.0f) { + mMoveMode = 3; + } + + if (current.pos.abs(home.pos) > l_HIO.mSwimRange) { + if (abs((s16)(cLib_targetAngleY(¤t.pos, &home.pos) - field_0x69a)) > 0x2000) { + mMoveMode = 3; + } + } + + if (field_0x68f == 0) { + mMoveMode = 3; + } + + break; + } + case 3: { + field_0x6ac = field_0x69a - shape_angle.y; + cLib_addCalcAngleS(&shape_angle.y, field_0x69a, 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, 0, 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&field_0x6a0, 0x800, 8, 0x400, 0x100); + + cLib_chaseF(&speedF, cM_scos(shape_angle.x), 0.1f); + cLib_chaseF(&speed.y, cM_ssin(shape_angle.x), 0.1f); + + if (speed.abs() <= 2.0f) { + mMoveMode = 0; + } + + break; + } + } + + current.angle.y = shape_angle.y; +} /* 80686C90-80687B38 001570 0EA8+00 2/1 0/0 0/0 .text executeAttack__8daE_BG_cFv */ void daE_BG_c::executeAttack() { - // NONMATCHING + s16 unusedShort1 = 0; + u8 unkFlag1; + s16 unkShort1; + cXyz unkXyz1; + + camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + + cXyz playerPos = daPy_getPlayerActorClass()->current.pos; + + dBgS_LinChk linChk; + + field_0x6a2 = nREG_S(0) + 0xc00; + field_0x69c += field_0x6a0; + + if (mMoveMode <= 2) { + if (daPy_getPlayerActorClass()->checkEquipHeavyBoots()) { + if (field_0x684 != -1e+09f && playerPos.y >= field_0x684 - 20.0f) { + setActionMode(1, 0); + return; + } + } else { + if (!dComIfGp_checkPlayerStatus0(0, fopAcM_STATUS_HOOK_CARRY_NOW)) { + setActionMode(1, 0); + return; + } + } + + if (current.pos.abs(home.pos) > l_HIO.mAttackRange || + fopAcM_searchPlayerDistance(this) > l_HIO.mPlayerSearchDistance) + { + setActionMode(1, 0); + return; + } + } + + switch (mMoveMode) { + case 0: + field_0x6ac = fopAcM_searchPlayerAngleY(this) - shape_angle.y; + + cLib_addCalcAngleS(&field_0x6a0, 0x2400, 8, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, fopAcM_searchPlayerAngleX(this), 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, l_HIO.mTrackingSpeed * cM_scos(shape_angle.x), 1.0f); + cLib_chaseF(&speed.y, l_HIO.mTrackingSpeed * cM_ssin(shape_angle.x), 1.0f); + + if (!dComIfGp_checkPlayerStatus0(0, fopAcM_STATUS_HOOK_CARRY_NOW)) { + if (daPy_getPlayerActorClass()->checkEquipHeavyBoots()) { + mMoveMode = 1; + field_0x69a = cM_rndFX(8192.0f); + } + } + + if (mAtSphere.ChkAtHit()) { + fopAc_ac_c* hitActor = dCc_GetAc(mAtSphere.GetAtHitObj()->GetAc()); + if (fopAcM_GetName(hitActor) == PROC_ALINK) { + mMoveMode = 10; + field_0x68f = 30; + speedF = cM_rndFX(1.0f) + -5.0f; + shape_angle.x = 0x1800; + field_0x6a0 = 0x4000; + } + } + break; + case 10: + field_0x6a2 = nREG_S(0) + 0x1000; + + cLib_addCalcAngleS(&field_0x6a0, 0x1000, 8, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, 0, 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, 0.0f, 0.1f); + cLib_chaseF(&speed.y, 0.0f, 1.0f); + + if (field_0x68f == 0) { + mMoveMode = 0; + } + + break; + case 1: + field_0x6a2 = nREG_S(0) + 0xc00; + unkShort1 = field_0x69a + fopCamM_GetAngleY(camera); + unkXyz1 = playerPos; + unkXyz1.x += l_HIO.mWaitDistanceBeforeCharging * cM_ssin(unkShort1); + unkXyz1.y += 200.0f; + unkXyz1.z += l_HIO.mWaitDistanceBeforeCharging * cM_scos(unkShort1); + linChk.Set(&playerPos, &unkXyz1, NULL); + + if (dComIfG_Bgsp().LineCross(&linChk)) { + unkXyz1 = linChk.GetCross(); + } + + cLib_addCalcAngleS(&field_0x6a0, 0x1800, 8, 0x400, 0x100); + + field_0x6ac = cLib_targetAngleY(¤t.pos, &unkXyz1) - shape_angle.y; + + cLib_addCalcAngleS(&shape_angle.y, (s16)cLib_targetAngleY(¤t.pos, &unkXyz1), 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, (s16)cLib_targetAngleX(¤t.pos, &unkXyz1), 0x10, 0x400, 0x100); + + if (current.pos.abs(playerPos) > l_HIO.mWaitDistanceBeforeCharging + 300.0f) { + cLib_chaseF(&speedF, l_HIO.mTrackingSpeed * cM_scos(shape_angle.x), 1.0f); + cLib_chaseF(&speed.y, l_HIO.mTrackingSpeed * cM_ssin(shape_angle.x), 1.0f); + } else { + cLib_chaseF(&speedF, cM_scos(shape_angle.x) * 4.0f, 1.0f); + cLib_chaseF(&speed.y, cM_ssin(shape_angle.x) * 4.0f, 1.0f); + } + + if (current.pos.abs(unkXyz1) < 200.0f) { + field_0x6ae++; + if (field_0x6ae > 30) { + field_0x6ae = 0; + field_0x69a = cM_rndFX(8192.0f); + } + } else { + field_0x6ae = 0; + } + + if (dComIfGp_checkPlayerStatus0(0, fopAcM_STATUS_HOOK_CARRY_NOW)) { + mMoveMode = 0; + break; + } + + if (field_0x690 != 0) { + break; + } + + unkFlag1 = false; + if (dComIfGp_getAttention()->LockonTruth() && + dComIfGp_getAttention()->LockonTarget(0) == this) { + unkFlag1 = true; + } else { + if ((s16)cLib_distanceAngleS(unkShort1, fopAcM_searchPlayerAngleY(this)) > 0x6800) { + if (current.pos.abs(unkXyz1) < 200.0f) { + unkFlag1 = true; + } else if (mObjAcch.ChkWallHit()) { + unkFlag1 = true; + } + } + } + + if (unkFlag1) { + mMoveMode = 2; + field_0x68f = 30; + } + break; + case 2: + unkXyz1 = playerPos; + unkXyz1.y += 200.0f; + + cLib_addCalcAngleS(&field_0x6a0, 0x800, 8, 0x400, 0x100); + field_0x6ac = cLib_targetAngleY(¤t.pos, &unkXyz1) - shape_angle.y; + + cLib_addCalcAngleS(&shape_angle.y, (s16)cLib_targetAngleY(¤t.pos, &unkXyz1), 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, 0, 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, 0.0f, 1.0f); + cLib_chaseF(&speed.y, 0.0f, 1.0f); + + if (dComIfGp_checkPlayerStatus0(0, fopAcM_STATUS_HOOK_CARRY_NOW)) { + mMoveMode = 0; + } else { + if (field_0x68f == 0) { + mMoveMode = 3; + field_0x68f = 10; + field_0x6a0 = 0x2000; + } + } + break; + case 3: + field_0x6b0 = 0x01; + field_0x6a2 = nREG_S(0) + 0x1000; + + unkXyz1 = playerPos; + unkXyz1.y += 100.0f; + + cLib_addCalcAngleS(&field_0x6a0, 0x2000, 8, 0x400, 0x100); + + field_0x6ac = cLib_targetAngleY(¤t.pos, &unkXyz1) - shape_angle.y; + + cLib_addCalcAngleS(&shape_angle.y, (s16)cLib_targetAngleY(¤t.pos, &unkXyz1), 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, (s16)cLib_targetAngleX(¤t.pos, &unkXyz1), 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, 0.0f, 1.0f); + cLib_chaseF(&speed.y, 0.0f, 1.0f); + + if (field_0x68f == 0) { + mMoveMode = 4; + field_0x68f = 60; + } + + break; + case 4: + field_0x6b0 = 1; + field_0x6a2 = nREG_S(0) + 0x1000; + + unkXyz1 = playerPos; + unkXyz1.y += 100.0f; + + cLib_addCalcAngleS(&field_0x6a0, 0x1000, 8, 0x400, 0x100); + + field_0x6ac = cLib_targetAngleY(¤t.pos, &unkXyz1) - shape_angle.y; + + cLib_addCalcAngleS(&shape_angle.y, (s16)cLib_targetAngleY(¤t.pos, &unkXyz1), 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, (s16)cLib_targetAngleX(¤t.pos, &unkXyz1), 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, l_HIO.mRushSpeed * cM_scos(shape_angle.x), 1.0f); + cLib_chaseF(&speed.y, l_HIO.mRushSpeed * cM_ssin(shape_angle.x), 1.0f); + + if (mAtSphere.ChkAtHit()) { + fopAc_ac_c* hitActor = dCc_GetAc(mAtSphere.GetAtHitObj()->GetAc()); + if (fopAcM_GetName(hitActor) == PROC_ALINK) { + mMoveMode = 5; + field_0x68f = 30; + + speedF = -5.0f; + shape_angle.x = 0x1800; + + field_0x6a0 = 0x2000; + + return; + } + } + if (field_0x68f == 0) { + mMoveMode = 0; + field_0x690 = 200; + } + + break; + case 5: + unkXyz1 = playerPos; + unkXyz1.y += 100.0f; + + field_0x6a2 = nREG_S(0) + 0x1000; + + cLib_addCalcAngleS(&field_0x6a0, 0x1000, 8, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.y, (s16)cLib_targetAngleY(¤t.pos, &unkXyz1), 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, 0, 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, 0.0f, 0.1f); + cLib_chaseF(&speed.y, 0.0f, 1.0f); + + if (field_0x68f == 0) { + mMoveMode = 0; + field_0x690 = 200; + } + + break; + } + + current.angle.y = shape_angle.y; } -/* ############################################################################################## */ -/* 8068A2C0-8068A2C4 00007C 0004+00 0/0 0/0 0/0 .rodata @4647 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4647 = 300.0f; -COMPILER_STRIP_GATE(0x8068A2C0, &lit_4647); -#pragma pop - -/* 8068A2C4-8068A2C8 000080 0004+00 0/2 0/0 0/0 .rodata @4678 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4678 = 3.0f; -COMPILER_STRIP_GATE(0x8068A2C4, &lit_4678); -#pragma pop - -/* 8068A2C8-8068A2CC 000084 0004+00 0/4 0/0 0/0 .rodata @4679 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4679 = 10.0f; -COMPILER_STRIP_GATE(0x8068A2C8, &lit_4679); -#pragma pop - -/* 8068A2CC-8068A2D0 000088 0004+00 0/3 0/0 0/0 .rodata @4680 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4680 = 5.0f; -COMPILER_STRIP_GATE(0x8068A2CC, &lit_4680); -#pragma pop - -/* 8068A2D0-8068A2D4 00008C 0004+00 0/3 0/0 0/0 .rodata @4681 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4681 = -1.0f / 10.0f; -COMPILER_STRIP_GATE(0x8068A2D0, &lit_4681); -#pragma pop - -/* 8068A2D4-8068A2D8 000090 0004+00 0/3 0/0 0/0 .rodata @4682 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4682 = -3.0f; -COMPILER_STRIP_GATE(0x8068A2D4, &lit_4682); -#pragma pop - /* 80687B38-80687CD8 002418 01A0+00 1/1 0/0 0/0 .text executeDamage__8daE_BG_cFv */ void daE_BG_c::executeDamage() { - // NONMATCHING + field_0x694 = 160; + + switch (mMoveMode) { + case 0: + field_0x6ac = field_0x6a2 = 0; + + mSphere.OffTgSetBit(); + mAtSphere.OffAtSetBit(); + + attention_info.flags = 0; + + setBck(6, 0, 3.0f, 1.0f); + + mMoveMode = 1; + + current.angle.y = mAtInfo.mHitDirection.y + 0x8000; + + speedF = 10.0f; + field_0x69a = 0x1000; + speed.y = 0.0f; + case 1: + cLib_chaseF(&field_0x688, 0.0f, 5.0f); + + shape_angle.y += field_0x69a; + shape_angle.x += field_0x69a; + + if (mObjAcch.ChkGroundHit()) { + cLib_chaseAngleS(&field_0x69a, 0, 0x80); + } else { + cLib_chaseAngleS(&field_0x69a, 0x100, 0x60); + } + + cLib_chaseF(&speedF, 0.0f, 0.2f); + if (speedF < 5.0f) { + gravity = -0.1f; + maxFallSpeed = -3.0f; + } + + if (mpMorfSO->isStop()) { + setActionMode(4, 0); + } + + mpBrkAnm->play(); + + break; + } } /* 80687CD8-80687DEC 0025B8 0114+00 3/3 0/0 0/0 .text setBombCarry__8daE_BG_cFi */ -void daE_BG_c::setBombCarry(int param_0) { - // NONMATCHING +bool daE_BG_c::setBombCarry(int param_0) { + fopAc_ac_c* bomb = NULL; + + if (param_0 == 0) { +#if VERSION == VERSION_SHIELD_DEBUG + cLib_onBit(attention_info.flags, 0x80); +#else + cLib_onBit(attention_info.flags, 0x10); +#endif + + if (fopAcM_checkCarryNow(this)) { + shape_angle.x = 0; + bomb = + dBomb_c::createEnemyWaterBomb(¤t.pos, &shape_angle, fopAcM_GetRoomNo(this)); + } + } else { + shape_angle.x = 0; + bomb = dBomb_c::createEnemyWaterBombHookshot(¤t.pos, &shape_angle, + fopAcM_GetRoomNo(this)); + } + + if (bomb != NULL) { + fopAc_ac_c* unkActor1; + fopAcM_SearchByID(fopAcM_GetLinkId(this), &unkActor1); + if (unkActor1 != NULL) { + ((daE_BG_c*)unkActor1)->setBgId(fopAcM_GetID(bomb)); + } + + fopAcM_delete(this); + + return true; + } + + return false; } /* 80687DEC-80687FC4 0026CC 01D8+00 1/1 0/0 0/0 .text executeBomb__8daE_BG_cFv */ void daE_BG_c::executeBomb() { - // NONMATCHING + switch (mMoveMode) { + case 0: + mSphere.OnTgSetBit(); + + field_0x6ac = field_0x6a2 = 0; + + setBck(5, 2, 3.0f, 1.0f); + + mMoveMode = 1; + case 1: + field_0x694 = 0xa0; + + shape_angle.y += field_0x69a; + shape_angle.x += field_0x69a; + + if (mObjAcch.ChkGroundHit()) { + mMoveMode = 2; + speed.y = 1.0f; + } else { + cLib_chaseAngleS(&field_0x69a, 0x100, 0x80); + } + + if (speedF < 5.0f) { + gravity = -0.1f; + maxFallSpeed = -3.0f; + } + + cLib_chaseF(&speedF, 0.0f, 0.2f); + + break; + case 2: + shape_angle.y += field_0x69a; + + if (mObjAcch.ChkGroundHit()) { + if (field_0x68f != 0) { + cLib_chaseAngleS(&shape_angle.x, -0x8000, 0x80); + } + + cLib_chaseAngleS(&field_0x69a, 0, 0x80); + + if (setBombCarry(0)) { + return; + } + } else { + field_0x68f = 10; + cLib_chaseAngleS(&field_0x69a, 0x100, 0x80); + cLib_chaseAngleS(&shape_angle.x, -0x8000, 0x80); + } + + if (speedF < 5.0f) { + gravity = -0.1f; + maxFallSpeed = -3.0f; + } + + cLib_chaseF(&speedF, 0.0f, 0.2f); + + break; + } } -/* ############################################################################################## */ -/* 8068A2D8-8068A2DC 000094 0004+00 0/1 0/0 0/0 .rodata @4834 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4834 = -100.0f; -COMPILER_STRIP_GATE(0x8068A2D8, &lit_4834); -#pragma pop - -/* 8068A2DC-8068A2E0 000098 0004+00 0/1 0/0 0/0 .rodata @4835 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4835 = -40.0f; -COMPILER_STRIP_GATE(0x8068A2DC, &lit_4835); -#pragma pop - /* 80687FC4-8068838C 0028A4 03C8+00 1/1 0/0 0/0 .text executeBirth__8daE_BG_cFv */ void daE_BG_c::executeBirth() { - // NONMATCHING + field_0x6ac = 0; + field_0x6a2 = 0xc00; + field_0x69c += field_0x6a0; + + switch (mMoveMode) { + case 0: + mAtSphere.OffAtSetBit(); + + mMoveMode = 1; + + field_0x688 = -100.0f; + field_0x68f = 30; + gravity = -0.1f; + maxFallSpeed = -3.0f; + field_0x6a0 = 0x3000; + shape_angle.x = 0x2000; + +#if VERSION == VERSION_SHIELD_DEBUG + cLib_onBit(attention_info.flags, 0x80); +#else + cLib_onBit(attention_info.flags, 0x10); +#endif + + mCreatureSound.startCreatureSound(Z2SE_EN_BG_SANDSMOKE, 0, -1); + + break; + case 1: + field_0x6b0 = 1; + + if (setBombCarry(0)) { + return; + } + + cLib_chaseF(&field_0x688, -40.0f, 5.0f); + + if (field_0x68f == 0) { + mMoveMode = 2; + field_0x68f = 0x1e; + } + + break; + case 2: + field_0x6b0 = 1; + + if (setBombCarry(0)) { + return; + } + + cLib_chaseF(&field_0x688, 0.0f, 1.0f); + if (field_0x68f == 0) { + mMoveMode = 3; + field_0x688 = 0.0f; + speed.y = 10.0f; + +#if VERSION == VERSION_SHIELD_DEBUG + cLib_offBit(attention_info.flags, 0x80); +#else + cLib_offBit(attention_info.flags, 0x10); +#endif + + mAtSphere.OnAtSetBit(); + } + + break; + case 3: + cLib_chaseF(&speed.y, 0.0f, 0.2f); + cLib_addCalcAngleS(&field_0x6a0, 0x1000, 0x10, 0x200, 0x100); + + shape_angle.y += field_0x69a; + shape_angle.x += field_0x69a; + + if (cLib_chaseAngleS(&field_0x69a, 0, 0x100) != 0) { + cLib_chaseAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 0x100); + cLib_chaseAngleS(&shape_angle.x, 0, 0x180); + + if (speed.y <= 0.0f) { + field_0x68f = 0x0f; + mMoveMode = 4; + gravity = 0.0f; + maxFallSpeed = -40.0f; + speed.y = 0.0f; + home.pos = current.pos; + } + } + + break; + case 4: + cLib_addCalcAngleS(&field_0x6a0, 0x800, 8, 0x400, 0x100); + + cLib_chaseAngleS(&shape_angle.y, fopAcM_searchPlayerAngleY(this), 0x100); + cLib_chaseAngleS(&shape_angle.x, 0, 0x100); + + if (field_0x68f == 0) { + setActionMode(2, 0); + } + } + + if (mMoveMode >= 1 && mMoveMode <= 3) { + mParticle2 = dComIfGp_particle_set(mParticle2, 0x84c4, &home.pos, &shape_angle, 0); + mParticle3 = dComIfGp_particle_set(mParticle3, 0x84c5, &home.pos, &shape_angle, 0); + } } /* 8068838C-806883D0 002C6C 0044+00 1/1 0/0 0/0 .text executeHook__8daE_BG_cFv */ void daE_BG_c::executeHook() { - // NONMATCHING -} + field_0x6ac = 0; + field_0x6a2 = 0xc00; + field_0x69c += field_0x6a0; -/* ############################################################################################## */ -/* 8068A2E0-8068A2E4 00009C 0004+00 0/1 0/0 0/0 .rodata @5094 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5094 = 0.5f; -COMPILER_STRIP_GATE(0x8068A2E0, &lit_5094); -#pragma pop + setBombCarry(1); +} /* 806883D0-80689168 002CB0 0D98+00 2/1 0/0 0/0 .text executeEat__8daE_BG_cFv */ void daE_BG_c::executeEat() { - // NONMATCHING + fopAc_ac_c* rod = search_esa(); + if (rod == 0) { + setActionMode(1, 0); + return; + } + + cXyz rodPos = rod->current.pos; + s32 targetAngleY = cLib_targetAngleY(¤t.pos, &rodPos); + field_0x6a2 = nREG_S(0) + 0xc00; + field_0x69c += field_0x6a0; + + switch (this->mMoveMode) { + case 0: + field_0x660.y = rodPos.y + cM_rndFX(100.0f); + if (field_0x684 != -1e+09f && field_0x660.y > field_0x684 - 50.0f) { + field_0x660.y = field_0x684 - 50.0f; + } + + if (cM_rnd() < 0.5f) { + field_0x69a = targetAngleY + 0x2000; + } else { + field_0x69a = targetAngleY + -0x2000; + } + + field_0x660.x = (cM_rndF(100.0f) + 200.0f) * cM_ssin(field_0x69a); + field_0x660.z = (cM_rndF(100.0f) + 200.0f) * cM_scos(field_0x69a); + + field_0x68f = cM_rndFX(10.0f) + 30.0f; + mMoveMode = 1; + case 1: + field_0x6ac = field_0x69a - shape_angle.y; + cLib_addCalcAngleS(&shape_angle.y, field_0x69a, 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, 0, 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, cM_scos(shape_angle.x) * 4.0f, 0.2f); + cLib_chaseF(&speed.y, cM_ssin(shape_angle.x) * 4.0f, 0.2f); + + field_0x6a0 = 0x2000; + + if (abs((s16)(shape_angle.y - field_0x69a)) < 0x800) { + mMoveMode = 2; + } + case 2: + field_0x6ac = field_0x69a - shape_angle.y; + cLib_addCalcAngleS(&shape_angle.y, field_0x69a, 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, (s16)cLib_targetAngleX(¤t.pos, &field_0x660), 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, cM_scos(shape_angle.x) * 4.0f, 0.2f); + cLib_chaseF(&speed.y, cM_ssin(shape_angle.x) * 4.0f, 0.2f); + + cLib_addCalcAngleS(&field_0x6a0, 0xc00, 8, 0x400, 0x100); + + if (field_0x660.abs(current.pos) < 50.0f) { + mMoveMode = 3; + } + + if (field_0x68f == 0) { + mMoveMode = 3; + } + + break; + case 3: + field_0x6ac = field_0x69a - shape_angle.y; + cLib_addCalcAngleS(&shape_angle.y, field_0x69a, 0x10, 0x400, + 0x100); + cLib_addCalcAngleS(&shape_angle.x, 0, 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&field_0x6a0, 0x800, 8, 0x400, 0x100); + cLib_chaseF(&speedF, cM_scos(shape_angle.x), 0.1f); + cLib_chaseF(&speed.y, cM_ssin(shape_angle.x), 0.1f); + if (speed.abs() <= 2.0f) { + if (rodPos.abs(current.pos) < 100.0f) { + mMoveMode = 5; + } else { + mMoveMode = 0; + } + } + break; + case 5: + field_0x6ac = targetAngleY - shape_angle.y; + + cLib_addCalcAngleS(&field_0x6a0, 0x800, 8, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.y, targetAngleY, 0x10, 0x400, 0x100); + + cLib_addCalcAngleS(&shape_angle.x, (s16)cLib_targetAngleX(¤t.pos, &rodPos), 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, cM_scos(shape_angle.x), 0.1f); + cLib_chaseF(&speed.y, cM_ssin(shape_angle.x), 0.1f); + + if (abs((s16)(shape_angle.y - targetAngleY)) < 0x800) { + mMoveMode = 6; + } + case 6: + field_0x6ac = targetAngleY - shape_angle.y; + cLib_addCalcAngleS(&field_0x6a0, 0x2400, 8, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.y, targetAngleY, 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, (s16)cLib_targetAngleX(¤t.pos, &rodPos), 0x10, 0x400, 0x100); + + cLib_chaseF(&speedF, cM_scos(shape_angle.x) * 2.0f, 0.5f); + cLib_chaseF(&speed.y, cM_ssin(shape_angle.x) * 2.0f, 0.5f); + + if (rodPos.abs(current.pos) < 30.0f) { + mMoveMode = 7; + field_0x68f = cM_rndF(30.0f) + 60.0f; + } + + break; + case 7: + field_0x6ac = targetAngleY - shape_angle.y; + + cLib_addCalcAngleS(&field_0x6a0, 0x2000, 8, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.y, targetAngleY, 0x10, 0x400, 0x100); + cLib_addCalcAngleS(&shape_angle.x, 0, 0x10, 0x400, 0x100); + + if (rodPos.abs(current.pos) > 70.0f) { + cM_scos(shape_angle.x); + cLib_chaseF(&speedF, 0.0f, 0.1f); + cM_ssin(shape_angle.x); + cLib_chaseF(&speed.y, 0.0f, 0.1f); + } else { + cLib_chaseF(&speedF, cM_scos(shape_angle.x) * -1.0f, 0.3f); + cLib_chaseF(&speed.y, cM_ssin(shape_angle.x) * -1.0f, 0.3f); + } + + if (rodPos.abs(current.pos) > 70.0f && !speed.abs()) { + mMoveMode = 5; + + field_0x68f = cM_rndF(30.0f) + 30.0f; + + if (cM_rnd() < 0.3f) { + mMoveMode = 0; + } + } + + return; + } + + current.angle.y = shape_angle.y; } /* 80689168-80689544 003A48 03DC+00 2/1 0/0 0/0 .text action__8daE_BG_cFv */ void daE_BG_c::action() { - // NONMATCHING + damage_check(); + field_0x6b0 = 0; + BOOL isAttacking = FALSE; + + switch (this->mActionMode) { + case 0: + executeBorn(); + break; + case 1: + executeSwim(); + break; + case 2: + executeAttack(); + isAttacking = TRUE; + break; + case 3: + executeDamage(); + break; + case 4: + executeBomb(); + break; + case 5: + executeBirth(); + break; + case 6: + executeHook(); + break; + case 7: + executeEat(); + break; + } + + mCreatureSound.setLinkSearch(isAttacking); + if (mActionMode != 0 && mActionMode != 3) { + dBgS_LinChk linChk; + linChk.Set(&dComIfGp_getCamera(0)->lookat.eye, &attention_info.position, this); + if (dComIfG_Bgsp().LineCross(&linChk)) { + attention_info.flags &= ~0x4; + } else { + attention_info.flags |= 0x4; + } + } + + if (field_0x6ac > 0x2000) { + field_0x6ac = 0x2000; + } + if (field_0x6ac < -0x2000) { + field_0x6ac = -0x2000; + } + + cLib_addCalcAngleS(&field_0x6aa, field_0x6ac, 0x10, 0x100, 0x10); + + f32 unkFloat1 = field_0x6a0 / 0x1000; + if (unkFloat1 > 1.0f) { + unkFloat1 = 1.0f; + } + if (field_0x69c < 0 && field_0x69e >= 0) { + mCreatureSound.startCreatureSound(Z2SE_EN_BG_SWIM, 0, -1); + } + + if (field_0x6b0 != 0 && field_0x69c > 0 && field_0x69e <= 0) { + mCreatureSound.startCreatureSound(Z2SE_EN_BG_SWIM, 0, -1); + } + + field_0x69e = field_0x69c; + field_0x6a4[0] = (f32)field_0x6a2 * unkFloat1 * cM_ssin(field_0x69c); + field_0x6a4[1] = (f32)field_0x6a2 * unkFloat1 * cM_ssin(field_0x69c + 0x4000) * 1.5f; + field_0x6a4[2] = (f32)field_0x6a2 * unkFloat1 * cM_ssin(field_0x69c + 0x8000) * 3.0f; + + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + + if (field_0x684 != -1e+09f && current.pos.y > field_0x684 - 50.0f) { + current.pos.y = field_0x684 - 50.0f; + if (speed.y > 0.0f) { + speed.y = 0.0f; + } + } + + mObjAcch.CrrPos(dComIfG_Bgsp()); + + mpMorfSO->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); } -/* ############################################################################################## */ -/* 8068A2E4-8068A2E8 0000A0 0004+00 0/0 0/0 0/0 .rodata @5095 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5095 = 60.0f; -COMPILER_STRIP_GATE(0x8068A2E4, &lit_5095); -#pragma pop - -/* 8068A2E8-8068A2EC 0000A4 0004+00 0/0 0/0 0/0 .rodata @5096 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5096 = 70.0f; -COMPILER_STRIP_GATE(0x8068A2E8, &lit_5096); -#pragma pop - -/* 8068A2EC-8068A2F0 0000A8 0004+00 0/0 0/0 0/0 .rodata @5097 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5097 = 3.0f / 10.0f; -COMPILER_STRIP_GATE(0x8068A2EC, &lit_5097); -#pragma pop - -/* 8068A2F0-8068A2F4 0000AC 0004+00 0/0 0/0 0/0 .rodata @5158 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5158 = 1.5f; -COMPILER_STRIP_GATE(0x8068A2F0, &lit_5158); -#pragma pop - -/* 8068A2F4-8068A2F8 0000B0 0004+00 0/2 0/0 0/0 .rodata @5220 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5220 = 25.0f; -COMPILER_STRIP_GATE(0x8068A2F4, &lit_5220); -#pragma pop - -/* 8068A2F8-8068A2FC 0000B4 0004+00 0/1 0/0 0/0 .rodata @5221 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5221 = -25.0f; -COMPILER_STRIP_GATE(0x8068A2F8, &lit_5221); -#pragma pop - /* 80689544-8068966C 003E24 0128+00 1/1 0/0 0/0 .text mtx_set__8daE_BG_cFv */ void daE_BG_c::mtx_set() { - // NONMATCHING -} + mDoMtx_stack_c::transS(current.pos.x, current.pos.y + field_0x688, current.pos.z); + mDoMtx_stack_c::transM(0.0f, 25.0f, 0.0f); + mDoMtx_stack_c::ZXYrotM(-shape_angle.x, shape_angle.y, shape_angle.z); + mDoMtx_stack_c::transM(0.0f, -25.0f, 0.0f); -/* ############################################################################################## */ -/* 8068A2FC-8068A300 0000B8 0004+00 0/1 0/0 0/0 .rodata @5270 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5270 = 35.0f; -COMPILER_STRIP_GATE(0x8068A2FC, &lit_5270); -#pragma pop + J3DModel* model = mpMorfSO->getModel(); + + model->setBaseTRMtx(mDoMtx_stack_c::get()); + model->setUserArea((u32)this); + + for (u16 i = 1; i < model->getModelData()->getJointNum(); i++) { + model->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBack); + } + + mpMorfSO->modelCalc(); + + for (u16 i = 1; i < model->getModelData()->getJointNum(); i++) { + model->getModelData()->getJointNodePointer(i)->setCallBack(NULL); + } +} /* 8068966C-806897EC 003F4C 0180+00 1/1 0/0 0/0 .text cc_set__8daE_BG_cFv */ void daE_BG_c::cc_set() { - // NONMATCHING + cXyz unkXyz1; + cXyz center; + + J3DModel* model = mpMorfSO->getModel(); + + if (field_0x6af == 0) { + mDoMtx_stack_c::copy(model->getAnmMtx(0)); + + unkXyz1.set(0.0f, 25.0f, 0.0f); + mDoMtx_stack_c::multVec(&unkXyz1,&eyePos); + + attention_info.position = eyePos; + attention_info.position.y += 25.0f; + + mDoMtx_stack_c::copy(model->getAnmMtx(0)); + + unkXyz1.set(0.0f, 25.0f, 0.0f); + mDoMtx_stack_c::multVec(&unkXyz1, ¢er); + + mSphere.SetC(center); + mSphere.SetR(35.0f); + + dComIfG_Ccsp()->Set(&mSphere); + + mDoMtx_stack_c::copy(model->getAnmMtx(0)); + + unkXyz1.set(0.0f, 25.0f, 20.0f); + mDoMtx_stack_c::multVec(&unkXyz1, ¢er); + + mAtSphere.SetC(center); + mAtSphere.SetR(20.0f); + + dComIfG_Ccsp()->Set(&mAtSphere); + } } /* 806897EC-80689950 0040CC 0164+00 1/1 0/0 0/0 .text execute__8daE_BG_cFv */ -void daE_BG_c::execute() { - // NONMATCHING +int daE_BG_c::execute() { + if (field_0x68f != 0) { + field_0x68f--; + } + + if (field_0x690 != 0) { + field_0x690--; + } + + if (field_0x68e != 0) { + field_0x68e--; + } + + if (field_0x694 != 0) { + setSparkEffect(); + + field_0x694--; + + mIsBomb = true; + + if (field_0x694 < 30) { + field_0x698 += (s16)0x1000; + } else if (field_0x694 < 45) { + field_0x698 += (s16)0x800; + } else { + field_0x698 += (s16)0x300; + } + + if (field_0x694 == 0) { + if (field_0x68d == 0 && field_0x68c != 0xff) { + dComIfGs_onSwitch(field_0x68c, fopAcM_GetRoomNo(this)); + } + + dBomb_c::createWaterBombExplode(¤t.pos); + + fopAcM_delete(this); + + return 1; + } + } else { + mIsBomb = false; + } + + action(); + mtx_set(); + cc_set(); + + return 1; } /* 80689950-80689970 004230 0020+00 2/1 0/0 0/0 .text daE_BG_Execute__FP8daE_BG_c */ -static void daE_BG_Execute(daE_BG_c* param_0) { - // NONMATCHING +static int daE_BG_Execute(daE_BG_c* i_this) { + return i_this->execute(); } /* 80689970-80689978 004250 0008+00 1/0 0/0 0/0 .text daE_BG_IsDelete__FP8daE_BG_c */ -static bool daE_BG_IsDelete(daE_BG_c* param_0) { - return true; +static int daE_BG_IsDelete(daE_BG_c* i_this) { + return TRUE; } /* 80689978-806899EC 004258 0074+00 1/1 0/0 0/0 .text _delete__8daE_BG_cFv */ -void daE_BG_c::_delete() { - // NONMATCHING +int daE_BG_c::_delete() { + dComIfG_resDelete(&mPhaseReq, "E_BG"); + + if (mHIOInit) { + l_initHIO = FALSE; + mDoHIO_DELETE_CHILD(l_HIO.field_0x4); + } + + if (heap != NULL) { + mCreatureSound.deleteObject(); + } + + return 1; } /* 806899EC-80689A0C 0042CC 0020+00 1/0 0/0 0/0 .text daE_BG_Delete__FP8daE_BG_c */ -static void daE_BG_Delete(daE_BG_c* param_0) { - // NONMATCHING +static int daE_BG_Delete(daE_BG_c* i_this) { + fpc_ProcID id = fopAcM_GetID(i_this); + return i_this->_delete(); } -/* ############################################################################################## */ -/* 8068A308-8068A308 0000C4 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_8068A30D = "E_bg"; -#pragma pop - /* 80689A0C-80689BD0 0042EC 01C4+00 1/1 0/0 0/0 .text CreateHeap__8daE_BG_cFv */ -void daE_BG_c::CreateHeap() { - // NONMATCHING -} +int daE_BG_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_BG", 10); + JUT_ASSERT(0, modelData != 0); -/* 80689BD0-80689C18 0044B0 0048+00 1/0 0/0 0/0 .text __dt__12J3DFrameCtrlFv */ -// J3DFrameCtrl::~J3DFrameCtrl() { -extern "C" void __dt__12J3DFrameCtrlFv() { - // NONMATCHING + mpMorfSO = new mDoExt_McaMorfSO(modelData, NULL, NULL, + (J3DAnmTransform*)dComIfG_getObjectRes("E_BG", 7), 0, 1.0f, 0, + -1, &mCreatureSound, 0x80000, 0x11000084); + if (mpMorfSO == NULL || mpMorfSO->getModel() == NULL) { + return 0; + } + + J3DModel* model = mpMorfSO->getModel(); + + model->setUserArea((u32)this); + + for (u16 i = 1; i < model->getModelData()->getJointNum(); i++) { + model->getModelData()->getJointNodePointer(i)->setCallBack(JointCallBack); + } + + mpBrkAnm = new mDoExt_brkAnm(); + if (mpBrkAnm == NULL) { + return 0; + } + + if (!mpBrkAnm->init(model->getModelData(), (J3DAnmTevRegKey*)dComIfG_getObjectRes("E_bg", 13), + 1, 0, 1.0f, 0, -1)) + { + return 0; + } + + return 1; } /* 80689C18-80689C38 0044F8 0020+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ -static void useHeapInit(fopAc_ac_c* param_0) { - // NONMATCHING +static int useHeapInit(fopAc_ac_c* i_this) { + daE_BG_c* bg = (daE_BG_c*)i_this; + return bg->CreateHeap(); } -/* ############################################################################################## */ -/* 8068A300-8068A304 0000BC 0004+00 0/1 0/0 0/0 .rodata @5533 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5533 = -50.0f; -COMPILER_STRIP_GATE(0x8068A300, &lit_5533); -#pragma pop - -/* 8068A304-8068A308 0000C0 0004+00 0/1 0/0 0/0 .rodata @5534 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5534 = 3000.0f; -COMPILER_STRIP_GATE(0x8068A304, &lit_5534); -#pragma pop - /* 80689C38-8068A07C 004518 0444+00 1/1 0/0 0/0 .text create__8daE_BG_cFv */ -void daE_BG_c::create() { - // NONMATCHING -} +int daE_BG_c::create() { + fopAcM_SetupActor(this, daE_BG_c); -/* 8068A07C-8068A0C4 00495C 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGSphFv */ -// cM3dGSph::~cM3dGSph() { -extern "C" void __dt__8cM3dGSphFv() { - // NONMATCHING -} + field_0x68d = fopAcM_GetParam(this); + if (field_0x68d == 0xff) { + field_0x68d = 0; + } -/* 8068A0C4-8068A10C 0049A4 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGAabFv */ -// cM3dGAab::~cM3dGAab() { -extern "C" void __dt__8cM3dGAabFv() { - // NONMATCHING -} + field_0x68c = (fopAcM_GetParam(this) >> 16) & 0xff; + if (field_0x68c != 0xff) { + if (dComIfGs_isSwitch(field_0x68c, fopAcM_GetRoomNo(this))) { + // "I won't reset it because I've already been defeated" + OS_REPORT("E_BG やられ後なので再セットしません\n"); + return cPhs_ERROR_e; + } + } -/* 8068A10C-8068A17C 0049EC 0070+00 3/2 0/0 0/0 .text __dt__12dBgS_ObjAcchFv */ -// dBgS_ObjAcch::~dBgS_ObjAcch() { -extern "C" void __dt__12dBgS_ObjAcchFv() { - // NONMATCHING + s32 loadResult = dComIfG_resLoad(&this->mPhaseReq, "E_BG"); + if (loadResult == cPhs_COMPLEATE_e) { + OS_REPORT("E_BG PARAM %x\n", fopAcM_GetParam(this)); + if (!fopAcM_entrySolidHeap(this, useHeapInit, 0x1100)) { + return cPhs_ERROR_e; + } + + if (l_initHIO == FALSE) { + l_initHIO = 1; + mHIOInit = 1; + l_HIO.field_0x4 = mDoHIO_CREATE_CHILD("爆弾魚", &l_HIO); + } + + attention_info.flags = 4; + + fopAcM_SetMtx(this, mpMorfSO->getModel()->getBaseTRMtx()); + fopAcM_SetMin(this, -50.0f, -50.0f, -50.0f); + fopAcM_SetMax(this, 50.0f, 50.0f, 50.0f); + + mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL); + mAcchCir.SetWall(10.0f, 20.0f); + + field_0x560 = health = 10; + + mStts.Init(100, 0, this); + + mSphere.Set(*(dCcD_SrcSph*)&cc_bg_src); + mSphere.SetStts(&mStts); + + mAtSphere.Set(*(dCcD_SrcSph*)&cc_bg_at_src); + mAtSphere.SetStts(&mStts); + + mCreatureSound.init(¤t.pos, &eyePos, 3, 1); + mCreatureSound.setEnemyName("E_bg"); + + mAtInfo.mpSound = &mCreatureSound; + mAtInfo.mPowerType = 1; + + gravity = 0.0f; + + attention_info.distances[fopAc_attn_BATTLE_e] = 3; + + Vec gndChkPos = current.pos; + gndChkPos.y += 3000.0f; + dBgS_ObjGndChk_Spl gndChkSpl; + gndChkSpl.SetPos(&gndChkPos); + + field_0x684 = dComIfG_Bgsp().GroundCross(&gndChkSpl); + if (field_0x684 != -1e+09f && current.pos.y > field_0x684 - 50.0f) { + current.pos.y = field_0x684 - 50.0f; + } + + if (field_0x68d == 1) { + setActionMode(0, 0); + } else if (field_0x68d == 0x02) { + setActionMode(5, 0); + } else { + setActionMode(1, 0); + } + + onWolfNoLock(); + + daE_BG_Execute(this); + } + + return loadResult; } /* 8068A17C-8068A19C 004A5C 0020+00 1/0 0/0 0/0 .text daE_BG_Create__FP8daE_BG_c */ -static void daE_BG_Create(daE_BG_c* param_0) { - // NONMATCHING +static int daE_BG_Create(daE_BG_c* i_this) { + return i_this->create(); } -/* 8068A19C-8068A1E4 004A7C 0048+00 2/1 0/0 0/0 .text __dt__12daE_BG_HIO_cFv */ -daE_BG_HIO_c::~daE_BG_HIO_c() { - // NONMATCHING -} +/* 8068A40C-8068A42C -00001 0020+00 1/0 0/0 0/0 .data l_daE_BG_Method */ +static actor_method_class l_daE_BG_Method = { + (process_method_func)daE_BG_Create, + (process_method_func)daE_BG_Delete, + (process_method_func)daE_BG_Execute, + (process_method_func)daE_BG_IsDelete, + (process_method_func)daE_BG_Draw, +}; -/* 8068A1E4-8068A220 004AC4 003C+00 0/0 1/0 0/0 .text __sinit_d_a_e_bg_cpp */ -void __sinit_d_a_e_bg_cpp() { - // NONMATCHING -} - -#pragma push -#pragma force_active on -REGISTER_CTORS(0x8068A1E4, __sinit_d_a_e_bg_cpp); -#pragma pop - -/* 8068A220-8068A228 004B00 0008+00 1/0 0/0 0/0 .text @36@__dt__12dBgS_ObjAcchFv */ -static void func_8068A220() { - // NONMATCHING -} - -/* 8068A228-8068A230 004B08 0008+00 1/0 0/0 0/0 .text @20@__dt__12dBgS_ObjAcchFv */ -static void func_8068A228() { - // NONMATCHING -} - -/* 8068A308-8068A308 0000C4 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ +/* 8068A42C-8068A45C -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_BG */ +extern actor_process_profile_definition g_profile_E_BG = { + fpcLy_CURRENT_e, // mLayerID + 7, // mListID + fpcPi_CURRENT_e, // mListPrio + PROC_E_BG, // mProcName + &g_fpcLf_Method.base, // sub_method + sizeof(daE_BG_c), // mSize + 0, // mSizeOther + 0, // mParameters + &g_fopAc_Method.base, // sub_method + 204, // mPriority + &l_daE_BG_Method, // sub_method + 0x000D0100, // mStatus + fopAc_ENEMY_e, // mActorType + fopAc_CULLBOX_CUSTOM_e, // cullType + };