diff --git a/configure.py b/configure.py index 8d8b59be76f..cf0f4b7f1a4 100755 --- a/configure.py +++ b/configure.py @@ -1674,7 +1674,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_e_sw"), ActorRel(Equivalent, "d_a_e_th"), # weak func order ActorRel(MatchingFor("GZ2E01"), "d_a_e_th_ball"), - ActorRel(NonMatching, "d_a_e_tk"), + ActorRel(MatchingFor("GZ2E01"), "d_a_e_tk"), ActorRel(NonMatching, "d_a_e_tk2"), ActorRel(NonMatching, "d_a_e_tk_ball"), ActorRel(NonMatching, "d_a_e_tt"), diff --git a/include/d/actor/d_a_e_tk.h b/include/d/actor/d_a_e_tk.h index 848f8a428c2..11611ad84e4 100644 --- a/include/d/actor/d_a_e_tk.h +++ b/include/d/actor/d_a_e_tk.h @@ -1,26 +1,78 @@ #ifndef D_A_E_TK_H #define D_A_E_TK_H -#include "f_op/f_op_actor_mng.h" + +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" +#include "d/d_cc_uty.h" +#include "d/d_path.h" +#include "f_op/f_op_actor.h" /** * @ingroup actors-enemies * @class e_tk_class * @brief Water Toadpoli - * - * @details - * + * + * @details Water Toadpoli in a Water Grotto. (And Goron Mines?) + * Frog-like creatures that emerge from the water and shoot a stone ball + * towards Link. If Link gets too close to the toadpoli, it will dive + * underwater, where it is invulnerable. It likes to swim around. */ + class e_tk_class : public fopEn_enemy_c { -private: - /* 0x5ac */ u8 field_0x5ac[0xa64 - 0x5ac]; +public: + /* 0x5AC */ request_of_phase_process_class mPhaseReq; + /* 0x5B4 */ u8 mArg0; + /* 0x5B5 */ u8 mArg1; + /* 0x5B6 */ u8 mArg2; + /* 0x5B7 */ u8 mParamPathIdx; + /* 0x5B8 */ s8 mPathLoaded; + /* 0x5BC */ dPath* mpPath; + /* 0x5C0 */ s8 mPathID; + /* 0x5C1 */ s8 mPathDirection; + /* 0x5C4 */ mDoExt_McaMorfSO* mpMorf; + /* 0x5C8 */ int mAnim; + /* 0x5CC */ Z2CreatureEnemy mSound; + /* 0x670 */ f32 mAnimSpeed; + /* 0x674 */ s16 mLifetime; + /* 0x676 */ s16 mAction; + /* 0x678 */ s16 mMode; + /* 0x67C */ cXyz mPos; + /* 0x688 */ s16 mSomeAngle; + /* 0x68A */ u8 field_0x68a[2]; + /* 0x68C */ s16 mPlayerAngleY; + /* 0x690 */ f32 mPlayerDistanceLimit; + /* 0x694 */ u8 field_0x694[2]; + /* 0x696 */ s16 mActionTimer[3]; + /* 0x69C */ s16 mExecuteState; + /* 0x69E */ s16 mInvincibilityTimer; + /* 0x6A0 */ s8 mAttentionOFF; + /* 0x6A1 */ s8 mTKBallSpawned; + /* 0x6A4 */ u32 mHamonSet; + /* 0x6A8 */ u8 field_0x6a8[4]; + /* 0x6AC */ fpc_ProcID mpBallID; + /* 0x6B0 */ dBgS_AcchCir mAcchCir; + /* 0x6F0 */ dBgS_ObjAcch mAcch; + /* 0x8C8 */ dCcD_Stts mStts; + /* 0x904 */ dCcD_Sph mSph; + /* 0xA3C */ dCcU_AtInfo mAtInfo; + /* 0xA60 */ bool mInitHIO; }; -STATIC_ASSERT(sizeof(e_tk_class) == 0xa64); +STATIC_ASSERT(sizeof(e_tk_class) == 0xA64); class daE_TK_HIO_c { +public: /* 807B81EC */ daE_TK_HIO_c(); - /* 807BA1C4 */ ~daE_TK_HIO_c(); + /* 807BA1C4 */ virtual ~daE_TK_HIO_c() {} + + /* 0x04 */ s8 field_0x04; + /* 0x08 */ f32 mRadiusScale; + /* 0x0C */ f32 mPlayerRange1; + /* 0x10 */ f32 mPlayerRange2; + /* 0x14 */ f32 mSpeedModifier1; + /* 0x18 */ f32 mSpeedModifier2; }; +STATIC_ASSERT(sizeof(daE_TK_HIO_c) == 0x1C); #endif /* D_A_E_TK_H */ diff --git a/include/d/actor/d_a_e_tk_ball.h b/include/d/actor/d_a_e_tk_ball.h index 739b7715778..5c990cb2b02 100644 --- a/include/d/actor/d_a_e_tk_ball.h +++ b/include/d/actor/d_a_e_tk_ball.h @@ -11,7 +11,7 @@ * */ class e_tk_ball_class : public fopEn_enemy_c { -private: +public: /* 0x5ac */ u8 field_0x5ac[0x8cc - 0x5ac]; }; diff --git a/src/d/actor/d_a_e_tk.cpp b/src/d/actor/d_a_e_tk.cpp index e1cee24c62f..b947fc64ed6 100644 --- a/src/d/actor/d_a_e_tk.cpp +++ b/src/d/actor/d_a_e_tk.cpp @@ -1,636 +1,790 @@ /** * @file d_a_e_tk.cpp - * -*/ + * + */ #include "d/actor/d_a_e_tk.h" -#include "d/d_cc_d.h" -#include "dol2asm.h" +#include "d/actor/d_a_e_tk_ball.h" +#include "d/d_com_inf_game.h" +#include "f_op/f_op_kankyo_mng.h" - - -// -// Forward References: -// - -extern "C" void __ct__12daE_TK_HIO_cFv(); -extern "C" static void anm_init__FP10e_tk_classifUcf(); -extern "C" static void daE_TK_Draw__FP10e_tk_class(); -extern "C" static void other_bg_check__FP10e_tk_classP10fopAc_ac_c(); -extern "C" static void pl_y_check__FP10e_tk_class(); -extern "C" static void pl_check__FP10e_tk_classfs(); -extern "C" static void damage_check__FP10e_tk_class(); -extern "C" static void way_bg_check__FP10e_tk_classf(); -extern "C" static void e_tk_wait_0__FP10e_tk_class(); -extern "C" static void e_tk_find__FP10e_tk_class(); -extern "C" static void e_tk_attack__FP10e_tk_class(); -extern "C" static void e_tk_pathswim__FP10e_tk_class(); -extern "C" static void e_tk_s_damage__FP10e_tk_class(); -extern "C" static void e_tk_damage__FP10e_tk_class(); -extern "C" static void action__FP10e_tk_class(); -extern "C" static void daE_TK_Execute__FP10e_tk_class(); -extern "C" static bool daE_TK_IsDelete__FP10e_tk_class(); -extern "C" static void daE_TK_Delete__FP10e_tk_class(); -extern "C" static void useHeapInit__FP10fopAc_ac_c(); -extern "C" static void daE_TK_Create__FP10fopAc_ac_c(); -extern "C" void __dt__8cM3dGSphFv(); -extern "C" void __dt__8cM3dGAabFv(); -extern "C" void __dt__12dBgS_ObjAcchFv(); -extern "C" void __dt__12daE_TK_HIO_cFv(); -extern "C" void __sinit_d_a_e_tk_cpp(); -extern "C" static void func_807BA248(); -extern "C" static void func_807BA250(); -extern "C" extern char const* const d_a_e_tk__stringBase0; - -// -// External References: -// - -extern "C" void mDoMtx_XrotM__FPA4_fs(); -extern "C" void mDoMtx_YrotS__FPA4_fs(); -extern "C" void mDoMtx_YrotM__FPA4_fs(); -extern "C" void scaleM__14mDoMtx_stack_cFfff(); -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 stopZelAnime__16mDoExt_McaMorfSOFv(); -extern "C" void __ct__10fopAc_ac_cFv(); -extern "C" void fopAcIt_Judge__FPFPvPv_PvPv(); -extern "C" void fopAcM_delete__FP10fopAc_ac_c(); -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_searchActorAngleY__FPC10fopAc_ac_cPC10fopAc_ac_c(); -extern "C" void fopAcM_searchActorDistance__FPC10fopAc_ac_cPC10fopAc_ac_c(); -extern "C" void fopAcM_createDisappear__FPC10fopAc_ac_cPC4cXyzUcUcUc(); -extern "C" void fopAcM_effHamonSet__FPUlPC4cXyzff(); -extern "C" void fopKyM_createWpillar__FPC4cXyzfi(); -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 getRes__14dRes_control_cFPCclP11dRes_info_ci(); -extern "C" void -set__13dPa_control_cFUcUsPC4cXyzPC12dKy_tevstr_cPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyzf(); -extern "C" void dPath_GetRoomPath__Fii(); -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__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 ChkTgHit__12dCcD_GObjInfFv(); -extern "C" void GetTgHitObj__12dCcD_GObjInfFv(); -extern "C" void Set__8dCcD_SphFRC11dCcD_SrcSph(); -extern "C" void at_power_check__FP11dCcU_AtInfo(); -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 Set__4cCcSFP8cCcD_Obj(); -extern "C" void __mi__4cXyzCFRC3Vec(); -extern "C" void cM_atan2s__Fff(); -extern "C" void cM_rndF__Ff(); -extern "C" void cM_rndFX__Ff(); -extern "C" void SetPos__11cBgS_GndChkFPC4cXyz(); -extern "C" void SetC__8cM3dGSphFRC4cXyz(); -extern "C" void SetR__8cM3dGSphFf(); -extern "C" void cLib_addCalc2__FPffff(); -extern "C" void cLib_addCalcAngleS2__FPssss(); -extern "C" void MtxPosition__FP4cXyzP4cXyz(); -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 checkPass__12J3DFrameCtrlFf(); -extern "C" void _savegpr_27(); -extern "C" void _savegpr_28(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_27(); -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" extern void* calc_mtx[1 + 1 /* padding */]; -extern "C" void __register_global_object(); - -// -// Declarations: -// - -/* ############################################################################################## */ -/* 807BA26C-807BA270 000000 0004+00 11/11 0/0 0/0 .rodata @3762 */ -SECTION_RODATA static f32 const lit_3762 = 19.0f / 10.0f; -COMPILER_STRIP_GATE(0x807BA26C, &lit_3762); - -/* 807BA270-807BA274 000004 0004+00 0/1 0/0 0/0 .rodata @3763 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3763 = 1400.0f; -COMPILER_STRIP_GATE(0x807BA270, &lit_3763); -#pragma pop - -/* 807BA274-807BA278 000008 0004+00 0/1 0/0 0/0 .rodata @3764 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3764 = 500.0f; -COMPILER_STRIP_GATE(0x807BA274, &lit_3764); -#pragma pop - -/* 807BA278-807BA27C 00000C 0004+00 0/2 0/0 0/0 .rodata @3765 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3765 = 10.0f; -COMPILER_STRIP_GATE(0x807BA278, &lit_3765); -#pragma pop - -/* 807BA27C-807BA280 000010 0004+00 0/1 0/0 0/0 .rodata @3766 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3766 = 25.0f; -COMPILER_STRIP_GATE(0x807BA27C, &lit_3766); -#pragma pop - -/* 807BA2F8-807BA32C -00001 0034+00 1/1 0/0 0/0 .data @4023 */ -SECTION_DATA static void* lit_4023[13] = { - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x5C), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x7C), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0xEC), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x134), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x154), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x344), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x344), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x344), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x344), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x344), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x1D8), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x1F8), - (void*)(((char*)e_tk_find__FP10e_tk_class) + 0x260), +enum Action { + /* 0x0 */ ACT_TK_WAIT, + /* 0x1 */ ACT_TK_FIND, + /* 0x2 */ ACT_TK_ATTACK, + /* 0x5 */ ACT_TK_PATHSWIM = 0x5, + /* 0x9 */ ACT_TK_S_DAMAGE = 0x9, + /* 0xA */ ACT_TK_DAMAGE, }; -/* 807BA32C-807BA358 -00001 002C+00 1/1 0/0 0/0 .data @4185 */ -SECTION_DATA static void* lit_4185[11] = { - (void*)(((char*)action__FP10e_tk_class) + 0x74), - (void*)(((char*)action__FP10e_tk_class) + 0x80), - (void*)(((char*)action__FP10e_tk_class) + 0x90), - (void*)(((char*)action__FP10e_tk_class) + 0xC0), - (void*)(((char*)action__FP10e_tk_class) + 0xC0), - (void*)(((char*)action__FP10e_tk_class) + 0xA0), - (void*)(((char*)action__FP10e_tk_class) + 0xC0), - (void*)(((char*)action__FP10e_tk_class) + 0xC0), - (void*)(((char*)action__FP10e_tk_class) + 0xC0), - (void*)(((char*)action__FP10e_tk_class) + 0xAC), - (void*)(((char*)action__FP10e_tk_class) + 0xB8), +enum Animation { + /* 0x4 */ ANM_TK_APPEAR = 0x4, + /* 0x5 */ ANM_TK_ATTACK, + /* 0x6 */ ANM_TK_DAMAGE, + /* 0x7 */ ANM_TK_HIDE, + /* 0x8 */ ANM_TK_KYORO2, + /* 0x9 */ ANM_TK_SWIM, + /* 0xA */ ANM_TK_WAIT01, }; +enum Mode { // Not sure if these are correct... + /* 0x0 */ MODE_TK_NONE, + /* 0x1 */ MODE_TK_APPEAR, + /* 0x2 */ MODE_TK_ATTACK, + /* 0x3 */ MODE_TK_DAMAGE, + /* 0x4 */ MODE_TK_HIDE, + /* 0xA */ MODE_TK_KYORO2 = 0xA, + /* 0xB */ MODE_TK_SWIM, + /* 0xC */ MODE_TK_WAIT01, +}; + +/* 807BA438-807BA43C 000008 0004+00 2/2 0/0 0/0 .bss None */ +static bool hioInit; + +/* 807BA448-807BA464 000018 001C+00 7/7 0/0 0/0 .bss l_HIO */ +static daE_TK_HIO_c l_HIO; + +/* 807B81EC-807B8234 0000EC 0048+00 1/1 0/0 0/0 .text __ct__12daE_TK_HIO_cFv */ +daE_TK_HIO_c::daE_TK_HIO_c() { + field_0x04 = -1; + mRadiusScale = 1.9f; + mPlayerRange2 = 1400.0f; + mPlayerRange1 = 500.0f; + mSpeedModifier1 = 10.0f; + mSpeedModifier2 = 25.0f; +} + +/* 807B8234-807B82E0 000134 00AC+00 6/6 0/0 0/0 .text anm_init__FP10e_tk_classifUcf */ +static void anm_init(e_tk_class* i_this, int i_index, f32 i_morf, u8 i_attr, f32 i_rate) { + J3DAnmTransform* anm = (J3DAnmTransform*)dComIfG_getObjectRes("E_tk", i_index); + + i_this->mpMorf->setAnm(anm, i_attr, i_morf, i_rate, 0.0f, -1.0f); + i_this->mAnim = i_index; +} + +/* 807B82E0-807B8350 0001E0 0070+00 1/0 0/0 0/0 .text daE_TK_Draw__FP10e_tk_class */ +static int daE_TK_Draw(e_tk_class* i_this) { + J3DModel* model = i_this->mpMorf->getModel(); + + g_env_light.settingTevStruct(0, &i_this->current.pos, &i_this->tevStr); + g_env_light.setLightTevColorType_MAJI(model, &i_this->tevStr); + i_this->mpMorf->entryDL(); + return 1; +} + +/* 807B8350-807B8428 000250 00D8+00 1/1 0/0 0/0 .text other_bg_check__FP10e_tk_classP10fopAc_ac_c + */ +static int other_bg_check(e_tk_class* i_this, fopAc_ac_c* i_ac) { + fopAc_ac_c* actor = i_this; + dBgS_LinChk line_check; + cXyz start_pos; + cXyz end_pos; + + end_pos = i_ac->current.pos; + end_pos.y += 100.0f; + start_pos = actor->current.pos; + start_pos.y = actor->eyePos.y; + + line_check.Set(&start_pos, &end_pos, actor); + + if (dComIfG_Bgsp().LineCross(&line_check)) { + return true; + } else { + return false; + } +} + +/* 807B8428-807B8460 000328 0038+00 3/3 0/0 0/0 .text pl_y_check__FP10e_tk_class */ +static int pl_y_check(e_tk_class* i_this) { + if (i_this->current.pos.y - dComIfGp_getPlayer(0)->current.pos.y > 130.0f) { + return 0; + } else { + return 1; + } +} + +/* 807B8460-807B84DC 000360 007C+00 4/4 0/0 0/0 .text pl_check__FP10e_tk_classfs */ +static int pl_check(e_tk_class* i_this, f32 i_limit, s16 i_max_diff) { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + if (i_this->mPlayerDistanceLimit < i_limit) { + s16 diff = i_this->shape_angle.y - i_this->mPlayerAngleY; + if (diff < i_max_diff && diff > (s16)-i_max_diff && !other_bg_check(i_this, player)) { + return 1; + } + } + + return 0; +} + +/* 807B84DC-807B85DC 0003DC 0100+00 1/1 0/0 0/0 .text damage_check__FP10e_tk_class */ +static void damage_check(e_tk_class* i_this) { + if (i_this->mInvincibilityTimer == 0) { + i_this->mStts.Move(); + + if (i_this->mSph.ChkTgHit()) { + i_this->mAtInfo.mpCollider = i_this->mSph.GetTgHitObj(); + at_power_check(&i_this->mAtInfo); + + if (i_this->mAtInfo.mpCollider->ChkAtType(AT_TYPE_UNK)) { + i_this->mInvincibilityTimer = 20; + } else { + i_this->mInvincibilityTimer = 10; + } + + if (i_this->mAtInfo.mpCollider->ChkAtType(AT_TYPE_HOOKSHOT)) { + i_this->mAction = ACT_TK_FIND; + i_this->mMode = MODE_TK_KYORO2; + i_this->mActionTimer[0] = 50; + } else { + cc_at_check(i_this, &i_this->mAtInfo); + if (i_this->mAtInfo.mHitType == HIT_TYPE_STUN) { + i_this->mAction = ACT_TK_S_DAMAGE; + } else { + i_this->mAction = ACT_TK_DAMAGE; + } + i_this->mMode = MODE_TK_NONE; + } + } + + if (i_this->health <= 1) { + i_this->health = 0; + i_this->mSph.SetTgHitMark(CcG_Tg_UNK_MARK_3); + } + } +} + +/* 807B85DC-807B86EC 0004DC 0110+00 1/1 0/0 0/0 .text way_bg_check__FP10e_tk_classf */ +static int way_bg_check(e_tk_class* i_this, f32 i_limit) { + fopAc_ac_c* actor = i_this; + dBgS_LinChk line_check; + + cXyz mtx_pos; + cXyz start_pos; + start_pos = actor->current.pos; + start_pos.y -= 50.0f; + + mDoMtx_YrotS(*calc_mtx, actor->shape_angle.y); + + cXyz end_pos; + mtx_pos.x = 0.0; + mtx_pos.y = -50.0f; + mtx_pos.z = i_limit; + + MtxPosition(&mtx_pos, &end_pos); + end_pos += actor->current.pos; + + line_check.Set(&start_pos, &end_pos, actor); + if (dComIfG_Bgsp().LineCross(&line_check)) { + return 1; + } else { + return 0; + } +} + +/* 807B86EC-807B8980 0005EC 0294+00 1/1 0/0 0/0 .text e_tk_wait_0__FP10e_tk_class */ +static void e_tk_wait_0(e_tk_class* i_this) { + cXyz src_pos; + f32 speed_mul = 1.0f; + + i_this->mAttentionOFF = true; + + switch (i_this->mMode) { + case MODE_TK_NONE: + anm_init(i_this, ANM_TK_SWIM, 5.0f, 0x2, 1.0f); + i_this->mMode = MODE_TK_APPEAR; + break; + + case MODE_TK_APPEAR: + if (i_this->mActionTimer[0] == 0) { + src_pos = i_this->home.pos - i_this->current.pos; + i_this->mSomeAngle = cM_atan2s(src_pos.x, src_pos.z) + (s16)cM_rndFX(8000.0f); + i_this->mActionTimer[0] = cM_rndF(30.0f) + 30.0f; + } + + if (i_this->mActionTimer[2] == 0 && way_bg_check(i_this, 200.0f)) { + i_this->mActionTimer[2] = 40; + src_pos = i_this->home.pos - i_this->current.pos; + i_this->mSomeAngle = cM_atan2s(src_pos.x, src_pos.z) + (s16)cM_rndFX(2000.0f); + i_this->mActionTimer[0] = cM_rndF(30.0f) + 30.0f; + } + + if (i_this->mActionTimer[1] == 0 && pl_y_check(i_this) && + pl_check(i_this, l_HIO.mPlayerRange2, 0x4000)) + { + i_this->mAction = ACT_TK_FIND; + if (pl_check(i_this, l_HIO.mPlayerRange1, 0x4000)) { + i_this->mMode = MODE_TK_WAIT01; + } else { + i_this->mMode = MODE_TK_NONE; + } + } + break; + } + + cLib_addCalcAngleS2(&i_this->shape_angle.y, i_this->mSomeAngle, 0x10, 0x400); + cLib_addCalcAngleS2(&i_this->shape_angle.x, 0, 0x10, 0x400); + cLib_addCalc2(&i_this->speedF, l_HIO.mSpeedModifier1 * speed_mul, 1.0f, 1.0f); + cMtx_YrotS(*calc_mtx, i_this->shape_angle.y); + + src_pos.x = 0.0f; + src_pos.y = 0.0f; + src_pos.z = i_this->speedF; + MtxPosition(&src_pos, &i_this->speed); + i_this->current.pos += i_this->speed; +} + +/* 807B8980-807B8D78 000880 03F8+00 2/1 0/0 0/0 .text e_tk_find__FP10e_tk_class */ +static void e_tk_find(e_tk_class* i_this) { + f32 speed_target = 0.0f; + f32 speed_step = 3.0f; + + switch (i_this->mMode) { + case MODE_TK_NONE: + anm_init(i_this, ANM_TK_APPEAR, 3.0f, 0x0, 1.0f); + i_this->mMode = MODE_TK_APPEAR; + break; + + case MODE_TK_APPEAR: + if (i_this->mpMorf->isStop()) { + anm_init(i_this, ANM_TK_WAIT01, 3.0f, 0x2, 1.0f); + i_this->mMode = MODE_TK_ATTACK; + i_this->mActionTimer[0] = cM_rndF(10.0f) + 10.0f; + } + break; + + case MODE_TK_ATTACK: + if (i_this->mActionTimer[0] == 0) { + i_this->mAction = ACT_TK_ATTACK; + i_this->mMode = MODE_TK_NONE; + } else { + if (pl_check(i_this, l_HIO.mPlayerRange1, 0x4000)) { + i_this->mMode = MODE_TK_KYORO2; + } + } + break; + + case MODE_TK_DAMAGE: + anm_init(i_this, ANM_TK_HIDE, 3.0f, 0x0, 1.0f); + i_this->mMode = MODE_TK_HIDE; + break; + + case MODE_TK_HIDE: + i_this->mAttentionOFF = true; + if (i_this->mpMorf->isStop()) { + if (i_this->mPathLoaded) { + i_this->mAction = ACT_TK_PATHSWIM; + i_this->mMode = MODE_TK_NONE; + } else { + i_this->mAction = ACT_TK_WAIT; + i_this->mMode = MODE_TK_NONE; + i_this->mActionTimer[0] = 0; + i_this->mActionTimer[1] = cM_rndF(30.0f) + 30.0f; + } + } + break; + + case MODE_TK_KYORO2: + anm_init(i_this, ANM_TK_HIDE, 3.0f, 0x0, 3.0f); + i_this->mMode = MODE_TK_SWIM; + break; + + case MODE_TK_SWIM: + i_this->mPlayerAngleY = i_this->mPlayerAngleY + -0x8000; + i_this->mAttentionOFF = true; + if (i_this->mpMorf->isStop()) { + i_this->mAnimSpeed = 4.0f; + anm_init(i_this, ANM_TK_SWIM, 0.0f, 0x2, i_this->mAnimSpeed); + i_this->mMode = MODE_TK_WAIT01; + } + break; + + case MODE_TK_WAIT01: + i_this->mAttentionOFF = true; + cLib_addCalc2(&i_this->mAnimSpeed, 2.0f, 1.0f, 0.15f); + i_this->mpMorf->setPlaySpeed(i_this->mAnimSpeed); + speed_target = 1.0f; + speed_step = 10.0f; + if (i_this->mActionTimer[0] == 0 && + i_this->mPlayerDistanceLimit > l_HIO.mPlayerRange1 * 1.2f) + { + i_this->mMode = MODE_TK_NONE; + } else { + if (i_this->mActionTimer[1] == 0 && i_this->mAcch.ChkWallHit()) { + i_this->mActionTimer[1] = cM_rndF(10.0f) + 20.0f; + i_this->mSomeAngle = i_this->mPlayerAngleY + (s16)cM_rndFX(8000.0f); + } + } + if (i_this->mActionTimer[1] == 0) { + i_this->mPlayerAngleY = i_this->mPlayerAngleY - 0x8000; + } else { + i_this->mPlayerAngleY = i_this->mSomeAngle; + } + break; + } + + cLib_addCalcAngleS2(&i_this->shape_angle.y, i_this->mPlayerAngleY, 4, 0x800); + cLib_addCalc2(&i_this->speedF, l_HIO.mSpeedModifier2 * speed_target, 1.0f, speed_step); + cMtx_YrotS(*calc_mtx, i_this->shape_angle.y); + + cXyz local_58; + local_58.x = 0.0f; + local_58.y = 0.0f; + local_58.z = i_this->speedF; + MtxPosition(&local_58, &i_this->speed); + i_this->current.pos += i_this->speed; + cLib_addCalcAngleS2(&i_this->shape_angle.x, 0, 4, 0x400); +} + +/* 807B8D78-807B8F68 000C78 01F0+00 1/1 0/0 0/0 .text e_tk_attack__FP10e_tk_class */ +static void e_tk_attack(e_tk_class* i_this) { + switch (i_this->mMode) { + case MODE_TK_NONE: + i_this->mMode = MODE_TK_APPEAR; + anm_init(i_this, ANM_TK_ATTACK, 3.0f, 0x0, 1.0f); + break; + + case MODE_TK_APPEAR: + if (pl_y_check(i_this)) { + if ((int)i_this->mpMorf->getFrame() == 24) { + i_this->mpBallID = + fopAcM_createChild(PROC_E_TK_BALL, fopAcM_GetID(i_this), 0, &i_this->eyePos, + fopAcM_GetRoomNo(i_this), &i_this->shape_angle, 0, -1, 0); + } + if ((int)i_this->mpMorf->getFrame() == 28) { + i_this->mTKBallSpawned = true; + } + } + if (i_this->mpMorf->isStop()) { + anm_init(i_this, ANM_TK_WAIT01, 1.0f, 0x2, 1.0f); + i_this->mActionTimer[0] = cM_rndF(30.0f) + 60.0f; + i_this->mMode = MODE_TK_ATTACK; + } + break; + + case MODE_TK_ATTACK: + if (!pl_y_check(i_this) || i_this->mActionTimer[0] == 0) { + i_this->mAction = ACT_TK_FIND; + i_this->mMode = MODE_TK_DAMAGE; + } + if (pl_check(i_this, l_HIO.mPlayerRange1, 0x4000)) { + i_this->mAction = ACT_TK_FIND; + i_this->mMode = MODE_TK_KYORO2; + } + break; + } + + cLib_addCalcAngleS2(&i_this->shape_angle.y, i_this->mPlayerAngleY, 4, 0x800); +} + +/* 807B8F68-807B92C4 000E68 035C+00 1/1 0/0 0/0 .text e_tk_pathswim__FP10e_tk_class */ +static void e_tk_pathswim(e_tk_class* i_this) { + cXyz local_50; + + f32 speed_target = 1.0f; + f32 speed_step = 1.0f; + + switch (i_this->mMode) { + case MODE_TK_NONE: + anm_init(i_this, ANM_TK_SWIM, 5.0f, 0x2, 1.0f); + i_this->mMode = MODE_TK_APPEAR; + /* [[fallthrough]] */; + + case MODE_TK_APPEAR: { + i_this->mPathID += i_this->mPathDirection; + if (i_this->mPathID >= (u8)i_this->mpPath->m_num) { + if (dPath_ChkClose(i_this->mpPath)) { + i_this->mPathID = 0x0; + } else { + i_this->mPathDirection = -1; + i_this->mPathID = i_this->mpPath->m_num - 0x2; + } + } else if (i_this->mPathID < 0x0) { + i_this->mPathDirection = 1; + i_this->mPathID = 0x1; + } + + dPnt* point = i_this->mpPath->m_points; + point += i_this->mPathID; + i_this->mPos.x = point->m_position.x + cM_rndFX(100.0f); + i_this->mPos.z = point->m_position.z + cM_rndFX(100.0f); + i_this->mMode = MODE_TK_ATTACK; + break; + } + + case MODE_TK_ATTACK: + local_50 = i_this->mPos - i_this->current.pos; + if (JMAFastSqrt(local_50.x * local_50.x + local_50.z * local_50.z) < 100.0f) { + dPnt* point = &i_this->mpPath->m_points[i_this->mPathID]; + if (point->mArg0 != 0x2) { + anm_init(i_this, ANM_TK_KYORO2, 5.0, 0x2, 1.0); + i_this->mActionTimer[0] = cM_rndF(60.0f) + 50.0f; + i_this->mActionTimer[1] = 20; + i_this->mMode = MODE_TK_DAMAGE; + } else { + i_this->mMode = MODE_TK_APPEAR; + } + } + i_this->mSomeAngle = cM_atan2s(local_50.x, local_50.z); + break; + + case MODE_TK_DAMAGE: + speed_target = 0.0f; + speed_step = 3.0f; + if (i_this->mActionTimer[1] == 0 && pl_y_check(i_this) && + pl_check(i_this, l_HIO.mPlayerRange2, 0x4000)) + { + i_this->mAction = ACT_TK_FIND; + anm_init(i_this, ANM_TK_WAIT01, 5.0f, 0x2, 1.0f); + i_this->mMode = MODE_TK_ATTACK; + i_this->mActionTimer[0] = cM_rndF(20.0f) + 20.0f; + } + if (i_this->mActionTimer[0] == 0) { + i_this->mMode = MODE_TK_NONE; + } + break; + } + + cLib_addCalcAngleS2(&i_this->shape_angle.y, i_this->mSomeAngle, 8, 0x400); + cLib_addCalc2(&i_this->speedF, l_HIO.mSpeedModifier1 * speed_target, 1.0f, speed_step); + cMtx_YrotS(*calc_mtx, i_this->shape_angle.y); + + local_50.x = 0.0f; + local_50.y = 0.0f; + local_50.z = i_this->speedF; + MtxPosition(&local_50, &i_this->speed); + i_this->current.pos += i_this->speed; +} + +/* 807B92C4-807B9354 0011C4 0090+00 1/1 0/0 0/0 .text e_tk_s_damage__FP10e_tk_class */ +static void e_tk_s_damage(e_tk_class* i_this) { + switch (i_this->mMode) { + case MODE_TK_NONE: + anm_init(i_this, ANM_TK_DAMAGE, 2.0f, 0x0, 1.0f); + i_this->mMode = MODE_TK_APPEAR; + break; + + case MODE_TK_APPEAR: + if (i_this->mpMorf->getFrame() > 10.0f) { + i_this->mAction = ACT_TK_FIND; + i_this->mMode = MODE_TK_DAMAGE; + } + break; + } +} + +/* 807B9354-807B941C 001254 00C8+00 1/1 0/0 0/0 .text e_tk_damage__FP10e_tk_class */ +static void e_tk_damage(e_tk_class* i_this) { + i_this->mInvincibilityTimer = 6; + i_this->mAttentionOFF = true; + + switch (i_this->mMode) { + case MODE_TK_NONE: + anm_init(i_this, ANM_TK_DAMAGE, 2.0f, 0x0, 1.0f); + i_this->mMode = MODE_TK_APPEAR; + break; + + case MODE_TK_APPEAR: + if (i_this->mpMorf->isStop()) { + fopAcM_createDisappear(i_this, &i_this->eyePos, 10, 0, 0x11); + fopAcM_delete(i_this); + } + break; + } +} + +/* 807B941C-807B9554 00131C 0138+00 2/1 0/0 0/0 .text action__FP10e_tk_class */ +static void action(e_tk_class* i_this) { + i_this->mPlayerAngleY = fopAcM_searchPlayerAngleY(i_this); + i_this->mPlayerDistanceLimit = fopAcM_searchPlayerDistance(i_this); + damage_check(i_this); + + s8 link_search_flag = false; + switch (i_this->mAction) { + case ACT_TK_WAIT: + e_tk_wait_0(i_this); + break; + case ACT_TK_FIND: + e_tk_find(i_this); + link_search_flag = true; + break; + case ACT_TK_ATTACK: + e_tk_attack(i_this); + link_search_flag = true; + break; + case ACT_TK_PATHSWIM: + e_tk_pathswim(i_this); + break; + case ACT_TK_S_DAMAGE: + e_tk_s_damage(i_this); + break; + case ACT_TK_DAMAGE: + e_tk_damage(i_this); + break; + } + + if (link_search_flag) { + i_this->mSound.setLinkSearch(true); + } else { + i_this->mSound.setLinkSearch(false); + } + + if (i_this->speedF < 2.0f) { + cXyz this_pos = i_this->current.pos; + fopAcM_effHamonSet(&i_this->mHamonSet, &this_pos, 2.3f, 0.05f); + } +} + +/* 807B9554-807B9C50 001454 06FC+00 2/1 0/0 0/0 .text daE_TK_Execute__FP10e_tk_class */ +static int daE_TK_Execute(e_tk_class* i_this) { + cXyz cStack_94; + cXyz cStack_a0; + + if (i_this->mExecuteState == 0x00) { + dBgS_ObjGndChk_Spl ground_check; + cStack_94 = i_this->current.pos; + cStack_94.y += 200.0f; + ground_check.SetPos(&cStack_94); + i_this->current.pos.y = dComIfG_Bgsp().GroundCross(&ground_check); + } + i_this->mLifetime++; + i_this->mAttentionOFF = false; + + for (int i = 0; i <= 3; i++) { + if (i_this->mActionTimer[i] != 0) { + i_this->mActionTimer[i]--; + } + } + + if (i_this->mInvincibilityTimer != 0) { + i_this->mInvincibilityTimer--; + } + action(i_this); + i_this->mAcch.CrrPos(dComIfG_Bgsp()); + + mDoMtx_stack_c::transS(i_this->current.pos.x, i_this->current.pos.y, i_this->current.pos.z); + mDoMtx_stack_c::YrotM(i_this->shape_angle.y); + mDoMtx_stack_c::XrotM(i_this->shape_angle.x); + mDoMtx_stack_c::scaleM(l_HIO.mRadiusScale, l_HIO.mRadiusScale, l_HIO.mRadiusScale); + + J3DModel* model = i_this->mpMorf->getModel(); + model->setBaseTRMtx(mDoMtx_stack_c::get()); + + i_this->mpMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(i_this))); + + if (i_this->mpMorf->checkFrame(6.0f) && + (i_this->mAnim == ANM_TK_APPEAR || i_this->mAnim == ANM_TK_HIDE)) + { + fopKyM_createWpillar(&i_this->current.pos, 2.3f, 0); + } + + if (i_this->mAnim == ANM_TK_SWIM) { + if (i_this->mpMorf->checkFrame(0.0f) || i_this->mpMorf->checkFrame(6.0f) || + i_this->mpMorf->checkFrame(12.0f) || i_this->mpMorf->checkFrame(18.0f) || + i_this->mpMorf->checkFrame(24.0f)) + { + i_this->mSound.startCreatureSound(Z2SE_EN_TK_SWIM, 0, -1); + } + } else if (i_this->mAnim == ANM_TK_APPEAR) { + if (i_this->mpMorf->checkFrame(5.0f)) { + i_this->mSound.startCreatureSound(Z2SE_EN_TK_APPEAR, 0, -1); + } else if (i_this->mpMorf->checkFrame(20.0f)) { + i_this->mSound.startCreatureSound(Z2SE_EN_TK_APPEAR2, 0, -1); + } + } else if (i_this->mAnim == ANM_TK_HIDE) { + if (i_this->mpMorf->checkFrame(6.0f)) { + i_this->mSound.startCreatureSound(Z2SE_EN_TK_HIDE, 0, -1); + } + } else if (i_this->mAnim == ANM_TK_ATTACK) { + if (i_this->mpMorf->checkFrame(1.0f)) { + i_this->mSound.startCreatureVoice(Z2SE_EN_TK_V_ATTACK, -1); + } else if (i_this->mpMorf->checkFrame(27.0f)) { + i_this->mSound.startCreatureSound(Z2SE_EN_TK_ATTACK, 0, -1); + } + } else if (i_this->mAnim == ANM_TK_DAMAGE) { + if (i_this->mpMorf->checkFrame(1.0f)) { + i_this->mSound.startCreatureVoice(Z2SE_EN_TK_V_DAMAGE, -1); + } + } else if (i_this->mAnim == ANM_TK_WAIT01) { + if (i_this->mpMorf->checkFrame(1.0f)) { + i_this->mSound.startCreatureVoice(Z2SE_EN_TK_V_WAIT, -1); + } + } else if (i_this->mAnim == ANM_TK_KYORO2) { + if (i_this->mpMorf->checkFrame(1.0f) || i_this->mpMorf->checkFrame(30.0f)) { + i_this->mSound.startCreatureVoice(Z2SE_EN_TK_KYORO, -1); + } + } + i_this->mpMorf->modelCalc(); + + MTXCopy(model->getAnmMtx(3), *calc_mtx); + + cStack_94.set(0.0f, 0.0f, 0.0f); + MtxPosition(&cStack_94, &i_this->eyePos); + + i_this->attention_info.position = i_this->eyePos; + i_this->attention_info.position.y = + i_this->attention_info.position.y + l_HIO.mRadiusScale * 35.0f; + + if (i_this->mTKBallSpawned) { + e_tk_ball_class* ball_actor = + static_cast(fopAcM_SearchByID(i_this->mpBallID)); + if (ball_actor != NULL) { + ball_actor->current.pos = i_this->eyePos; + ball_actor->field_0x5ac[0x31C] = 0x0; + } + + cXyz scale; + scale.setall(2.0f); + dComIfGp_particle_set(0x819B, &i_this->eyePos, &i_this->shape_angle, &scale); + dComIfGp_particle_set(0x819C, &i_this->eyePos, &i_this->shape_angle, &scale); + i_this->mTKBallSpawned = false; + } + + if (i_this->mAttentionOFF) { + fopAcM_OffStatus(i_this, 0); + i_this->attention_info.flags = 0; + } else { + fopAcM_OnStatus(i_this, 0); + i_this->attention_info.flags = 4; + } + + MTXCopy(model->getAnmMtx(2), *calc_mtx); + cStack_94.set(0.0f, 0.0f, 0.0f); + + MtxPosition(&cStack_94, &cStack_a0); + i_this->mSph.SetC(cStack_a0); + i_this->mSph.SetR(50.0f * l_HIO.mRadiusScale); + + dComIfG_Ccsp()->Set(&i_this->mSph); + + return 1; +} + +/* 807B9C50-807B9C58 001B50 0008+00 1/0 0/0 0/0 .text daE_TK_IsDelete__FP10e_tk_class */ +static int daE_TK_IsDelete(e_tk_class* i_this) { + return 1; +} + +/* 807B9C58-807B9CC0 001B58 0068+00 1/0 0/0 0/0 .text daE_TK_Delete__FP10e_tk_class */ +static int daE_TK_Delete(e_tk_class* i_this) { + // fopAcM_GetID(i_this); + dComIfG_resDelete(&i_this->mPhaseReq, "E_tk"); + if (i_this->mInitHIO) { + hioInit = false; + } + if (i_this->heap != NULL) { + i_this->mpMorf->stopZelAnime(); + } + return 1; +} + +/* 807B9CC0-807B9DB8 001BC0 00F8+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ +static int useHeapInit(fopAc_ac_c* a_this) { + e_tk_class* i_this = static_cast(a_this); + + i_this->mpMorf = + new mDoExt_McaMorfSO((J3DModelData*)dComIfG_getObjectRes("E_tk", 0xE), NULL, NULL, + (J3DAnmTransform*)dComIfG_getObjectRes("E_tk", ANM_TK_SWIM), 2, 1.0f, + 0, -1, &i_this->mSound, 0x80000, 0x11000084); + + if (i_this->mpMorf == NULL || i_this->mpMorf->getModel() == NULL) { + return 0; + } + + return 1; +} + /* 807BA358-807BA398 000060 0040+00 1/1 0/0 0/0 .data cc_sph_src$4408 */ static dCcD_SrcSph cc_sph_src = { { - {0x0, {{0x0, 0x0, 0xd}, {0xd8fbfdff, 0x3}, 0x75}}, // mObj - {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt - {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg - {0x0}, // mGObjCo - }, // mObjInf + {0x0, {{0x0, 0x0, 0xd}, {0xd8fbfdff, 0x3}, 0x75}}, // mObj + {dCcD_SE_NONE, 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 + {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph + } // mSphAttr }; +/* 807B9DB8-807BA0C4 001CB8 030C+00 1/0 0/0 0/0 .text daE_TK_Create__FP10fopAc_ac_c */ +static int daE_TK_Create(fopAc_ac_c* i_this) { + fopAcM_SetupActor(i_this, e_tk_class); + e_tk_class* const a_this = static_cast(i_this); + + cPhs__Step phase = (cPhs__Step)dComIfG_resLoad(&a_this->mPhaseReq, "E_tk"); + if (phase == cPhs_COMPLEATE_e) { + a_this->mArg0 = fopAcM_GetParamBit(a_this, 0, 8); + a_this->mArg1 = fopAcM_GetParamBit(a_this, 8, 4); + a_this->mArg2 = fopAcM_GetParamBit(a_this, 12, 4); + a_this->mParamPathIdx = fopAcM_GetParamBit(a_this, 16, 8); + + if (!fopAcM_entrySolidHeap(a_this, useHeapInit, 0x1e20)) { + return cPhs_ERROR_e; + } + + if (a_this->mParamPathIdx != 0xff) { + a_this->mpPath = dPath_GetRoomPath(a_this->mParamPathIdx, fopAcM_GetRoomNo(a_this)); + if (a_this->mpPath == NULL) { + return cPhs_ERROR_e; + } + a_this->mPathLoaded = a_this->mParamPathIdx + 0x1; + a_this->mPathDirection = 0x1; + a_this->mAction = ACT_TK_PATHSWIM; + } + if (hioInit == false) { + a_this->mInitHIO = true; + hioInit = true; + l_HIO.field_0x04 = -1; + } + a_this->attention_info.flags = 4; + + fopAcM_SetMtx(a_this, a_this->mpMorf->getModel()->getBaseTRMtx()); + fopAcM_SetMin(a_this, -100.0f, -100.0f, -100.0f); + fopAcM_SetMax(a_this, 100.0f, 100.0f, 100.0f); + + a_this->attention_info.distances[2] = 0x04; + a_this->health = 10; + a_this->field_0x560 = 10; + + a_this->mStts.Init(100, 0, a_this); + a_this->mSph.Set(cc_sph_src); + a_this->mSph.SetStts(&a_this->mStts); + + a_this->mAcch.Set(&i_this->current.pos, &a_this->old.pos, a_this, 1, &a_this->mAcchCir, + fopAcM_GetSpeed_p(a_this), NULL, NULL); + + a_this->mAcchCir.SetWall(-50.0f, 60.0f); + a_this->mSound.init(&a_this->current.pos, &a_this->eyePos, 0x3, 0x1); + a_this->mSound.setEnemyName("E_tk"); + a_this->mAtInfo.mpSound = &a_this->mSound; + a_this->mExecuteState = 0x14; + daE_TK_Execute(a_this); + } + return phase; +} + /* 807BA398-807BA3B8 -00001 0020+00 1/0 0/0 0/0 .data l_daE_TK_Method */ static actor_method_class l_daE_TK_Method = { - (process_method_func)daE_TK_Create__FP10fopAc_ac_c, - (process_method_func)daE_TK_Delete__FP10e_tk_class, - (process_method_func)daE_TK_Execute__FP10e_tk_class, - (process_method_func)daE_TK_IsDelete__FP10e_tk_class, - (process_method_func)daE_TK_Draw__FP10e_tk_class, + (process_method_func)daE_TK_Create, (process_method_func)daE_TK_Delete, + (process_method_func)daE_TK_Execute, (process_method_func)daE_TK_IsDelete, + (process_method_func)daE_TK_Draw, }; /* 807BA3B8-807BA3E8 -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_TK */ extern actor_process_profile_definition g_profile_E_TK = { - fpcLy_CURRENT_e, // mLayerID - 7, // mListID - fpcPi_CURRENT_e, // mListPrio - PROC_E_TK, // mProcName - &g_fpcLf_Method.base, // sub_method - sizeof(e_tk_class), // mSize - 0, // mSizeOther - 0, // mParameters - &g_fopAc_Method.base, // sub_method - 149, // mPriority - &l_daE_TK_Method, // sub_method - 0x00040100, // mStatus - fopAc_ENEMY_e, // mActorType - fopAc_CULLBOX_CUSTOM_e, // cullType + fpcLy_CURRENT_e, // mLayerID + 7, // mListID + fpcPi_CURRENT_e, // mListPrio + PROC_E_TK, // mProcName + &g_fpcLf_Method.base, // sub_method + sizeof(e_tk_class), // mSize + 0, // mSizeOther + 0, // mParameters + &g_fopAc_Method.base, // sub_method + 149, // mPriority + &l_daE_TK_Method, // sub_method + 0x00040100, // mStatus + fopAc_ENEMY_e, // mActorType + fopAc_CULLBOX_CUSTOM_e, // cullType }; - -/* 807BA3E8-807BA3F4 0000F0 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, -}; - -/* 807BA3F4-807BA400 0000FC 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, -}; - -/* 807BA400-807BA424 000108 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_807BA250, - (void*)NULL, - (void*)NULL, - (void*)func_807BA248, -}; - -/* 807BA424-807BA430 00012C 000C+00 2/2 0/0 0/0 .data __vt__12daE_TK_HIO_c */ -SECTION_DATA extern void* __vt__12daE_TK_HIO_c[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12daE_TK_HIO_cFv, -}; - -/* 807B81EC-807B8234 0000EC 0048+00 1/1 0/0 0/0 .text __ct__12daE_TK_HIO_cFv */ -daE_TK_HIO_c::daE_TK_HIO_c() { - // NONMATCHING -} - -/* ############################################################################################## */ -/* 807BA280-807BA284 000014 0004+00 1/8 0/0 0/0 .rodata @3780 */ -SECTION_RODATA static u8 const lit_3780[4] = { - 0x00, - 0x00, - 0x00, - 0x00, -}; -COMPILER_STRIP_GATE(0x807BA280, &lit_3780); - -/* 807BA284-807BA288 000018 0004+00 1/1 0/0 0/0 .rodata @3781 */ -SECTION_RODATA static f32 const lit_3781 = -1.0f; -COMPILER_STRIP_GATE(0x807BA284, &lit_3781); - -/* 807BA2F0-807BA2F0 000084 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_807BA2F0 = "E_tk"; -#pragma pop - -/* 807B8234-807B82E0 000134 00AC+00 6/6 0/0 0/0 .text anm_init__FP10e_tk_classifUcf */ -static void anm_init(e_tk_class* param_0, int param_1, f32 param_2, u8 param_3, f32 param_4) { - // NONMATCHING -} - -/* 807B82E0-807B8350 0001E0 0070+00 1/0 0/0 0/0 .text daE_TK_Draw__FP10e_tk_class */ -static void daE_TK_Draw(e_tk_class* param_0) { - // NONMATCHING -} - -/* ############################################################################################## */ -/* 807BA288-807BA28C 00001C 0004+00 1/3 0/0 0/0 .rodata @3820 */ -SECTION_RODATA static f32 const lit_3820 = 100.0f; -COMPILER_STRIP_GATE(0x807BA288, &lit_3820); - -/* 807B8350-807B8428 000250 00D8+00 1/1 0/0 0/0 .text other_bg_check__FP10e_tk_classP10fopAc_ac_c - */ -static void other_bg_check(e_tk_class* param_0, fopAc_ac_c* param_1) { - // NONMATCHING -} - -/* ############################################################################################## */ -/* 807BA28C-807BA290 000020 0004+00 1/1 0/0 0/0 .rodata @3830 */ -SECTION_RODATA static f32 const lit_3830 = 130.0f; -COMPILER_STRIP_GATE(0x807BA28C, &lit_3830); - -/* 807B8428-807B8460 000328 0038+00 3/3 0/0 0/0 .text pl_y_check__FP10e_tk_class */ -static void pl_y_check(e_tk_class* param_0) { - // NONMATCHING -} - -/* 807B8460-807B84DC 000360 007C+00 4/4 0/0 0/0 .text pl_check__FP10e_tk_classfs */ -static void pl_check(e_tk_class* param_0, f32 param_1, s16 param_2) { - // NONMATCHING -} - -/* 807B84DC-807B85DC 0003DC 0100+00 1/1 0/0 0/0 .text damage_check__FP10e_tk_class */ -static void damage_check(e_tk_class* param_0) { - // NONMATCHING -} - -/* ############################################################################################## */ -/* 807BA290-807BA294 000024 0004+00 0/3 0/0 0/0 .rodata @3897 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3897 = 50.0f; -COMPILER_STRIP_GATE(0x807BA290, &lit_3897); -#pragma pop - -/* 807BA294-807BA298 000028 0004+00 0/2 0/0 0/0 .rodata @3898 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3898 = -50.0f; -COMPILER_STRIP_GATE(0x807BA294, &lit_3898); -#pragma pop - -/* 807B85DC-807B86EC 0004DC 0110+00 1/1 0/0 0/0 .text way_bg_check__FP10e_tk_classf */ -static void way_bg_check(e_tk_class* param_0, f32 param_1) { - // NONMATCHING -} - -/* ############################################################################################## */ -/* 807BA298-807BA29C 00002C 0004+00 0/3 0/0 0/0 .rodata @3937 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3937 = 5.0f; -COMPILER_STRIP_GATE(0x807BA298, &lit_3937); -#pragma pop - -/* 807BA29C-807BA2A0 000030 0004+00 1/8 0/0 0/0 .rodata @3938 */ -SECTION_RODATA static f32 const lit_3938 = 1.0f; -COMPILER_STRIP_GATE(0x807BA29C, &lit_3938); - -/* 807BA2A0-807BA2A4 000034 0004+00 0/1 0/0 0/0 .rodata @3939 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3939 = 8000.0f; -COMPILER_STRIP_GATE(0x807BA2A0, &lit_3939); -#pragma pop - -/* 807BA2A4-807BA2A8 000038 0004+00 0/3 0/0 0/0 .rodata @3940 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3940 = 30.0f; -COMPILER_STRIP_GATE(0x807BA2A4, &lit_3940); -#pragma pop - -/* 807BA2A8-807BA2AC 00003C 0004+00 0/2 0/0 0/0 .rodata @3941 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3941 = 200.0f; -COMPILER_STRIP_GATE(0x807BA2A8, &lit_3941); -#pragma pop - -/* 807BA2AC-807BA2B0 000040 0004+00 0/1 0/0 0/0 .rodata @3942 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3942 = 2000.0f; -COMPILER_STRIP_GATE(0x807BA2AC, &lit_3942); -#pragma pop - -/* 807BA438-807BA43C 000008 0004+00 2/2 0/0 0/0 .bss None */ -static u8 data_807BA438[4]; - -/* 807BA43C-807BA448 00000C 000C+00 1/1 0/0 0/0 .bss @3757 */ -static u8 lit_3757[12]; - -/* 807BA448-807BA464 000018 001C+00 7/7 0/0 0/0 .bss l_HIO */ -static u8 l_HIO[28]; - -/* 807B86EC-807B8980 0005EC 0294+00 1/1 0/0 0/0 .text e_tk_wait_0__FP10e_tk_class */ -static void e_tk_wait_0(e_tk_class* param_0) { - // NONMATCHING -} - -/* ############################################################################################## */ -/* 807BA2B0-807BA2B4 000044 0004+00 0/3 0/0 0/0 .rodata @4017 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4017 = 3.0f; -COMPILER_STRIP_GATE(0x807BA2B0, &lit_4017); -#pragma pop - -/* 807B8980-807B8D78 000880 03F8+00 2/1 0/0 0/0 .text e_tk_find__FP10e_tk_class */ -static void e_tk_find(e_tk_class* param_0) { - // NONMATCHING -} - -/* ############################################################################################## */ -/* 807BA2B4-807BA2B8 000048 0004+00 0/0 0/0 0/0 .rodata @4018 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4018 = 4.0f; -COMPILER_STRIP_GATE(0x807BA2B4, &lit_4018); -#pragma pop - -/* 807BA2B8-807BA2BC 00004C 0004+00 0/3 0/0 0/0 .rodata @4019 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4019 = 2.0f; -COMPILER_STRIP_GATE(0x807BA2B8, &lit_4019); -#pragma pop - -/* 807BA2BC-807BA2C0 000050 0004+00 0/0 0/0 0/0 .rodata @4020 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4020 = 3.0f / 20.0f; -COMPILER_STRIP_GATE(0x807BA2BC, &lit_4020); -#pragma pop - -/* 807BA2C0-807BA2C4 000054 0004+00 0/0 0/0 0/0 .rodata @4021 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4021 = 6.0f / 5.0f; -COMPILER_STRIP_GATE(0x807BA2C0, &lit_4021); -#pragma pop - -/* 807BA2C4-807BA2C8 000058 0004+00 0/2 0/0 0/0 .rodata @4022 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4022 = 20.0f; -COMPILER_STRIP_GATE(0x807BA2C4, &lit_4022); -#pragma pop - -/* 807BA2C8-807BA2CC 00005C 0004+00 0/3 0/0 0/0 .rodata @4066 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4066 = 60.0f; -COMPILER_STRIP_GATE(0x807BA2C8, &lit_4066); -#pragma pop - -/* 807B8D78-807B8F68 000C78 01F0+00 1/1 0/0 0/0 .text e_tk_attack__FP10e_tk_class */ -static void e_tk_attack(e_tk_class* param_0) { - // NONMATCHING -} - -/* 807B8F68-807B92C4 000E68 035C+00 1/1 0/0 0/0 .text e_tk_pathswim__FP10e_tk_class */ -static void e_tk_pathswim(e_tk_class* param_0) { - // NONMATCHING -} - -/* 807B92C4-807B9354 0011C4 0090+00 1/1 0/0 0/0 .text e_tk_s_damage__FP10e_tk_class */ -static void e_tk_s_damage(e_tk_class* param_0) { - // NONMATCHING -} - -/* 807B9354-807B941C 001254 00C8+00 1/1 0/0 0/0 .text e_tk_damage__FP10e_tk_class */ -static void e_tk_damage(e_tk_class* param_0) { - // NONMATCHING -} - -/* 807B941C-807B9554 00131C 0138+00 2/1 0/0 0/0 .text action__FP10e_tk_class */ -static void action(e_tk_class* param_0) { - // NONMATCHING -} - -/* ############################################################################################## */ -/* 807BA2CC-807BA2D0 000060 0004+00 0/1 0/0 0/0 .rodata @4183 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4183 = 23.0f / 10.0f; -COMPILER_STRIP_GATE(0x807BA2CC, &lit_4183); -#pragma pop - -/* 807BA2D0-807BA2D4 000064 0004+00 0/0 0/0 0/0 .rodata @4184 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4184 = 1.0f / 20.0f; -COMPILER_STRIP_GATE(0x807BA2D0, &lit_4184); -#pragma pop - -/* 807BA2D4-807BA2D8 000068 0004+00 0/1 0/0 0/0 .rodata @4354 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4354 = 6.0f; -COMPILER_STRIP_GATE(0x807BA2D4, &lit_4354); -#pragma pop - -/* 807BA2D8-807BA2DC 00006C 0004+00 0/1 0/0 0/0 .rodata @4355 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4355 = 12.0f; -COMPILER_STRIP_GATE(0x807BA2D8, &lit_4355); -#pragma pop - -/* 807BA2DC-807BA2E0 000070 0004+00 0/1 0/0 0/0 .rodata @4356 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4356 = 18.0f; -COMPILER_STRIP_GATE(0x807BA2DC, &lit_4356); -#pragma pop - -/* 807BA2E0-807BA2E4 000074 0004+00 0/1 0/0 0/0 .rodata @4357 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4357 = 24.0f; -COMPILER_STRIP_GATE(0x807BA2E0, &lit_4357); -#pragma pop - -/* 807BA2E4-807BA2E8 000078 0004+00 0/1 0/0 0/0 .rodata @4358 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4358 = 27.0f; -COMPILER_STRIP_GATE(0x807BA2E4, &lit_4358); -#pragma pop - -/* 807BA2E8-807BA2EC 00007C 0004+00 0/1 0/0 0/0 .rodata @4359 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4359 = 35.0f; -COMPILER_STRIP_GATE(0x807BA2E8, &lit_4359); -#pragma pop - -/* 807B9554-807B9C50 001454 06FC+00 2/1 0/0 0/0 .text daE_TK_Execute__FP10e_tk_class */ -static void daE_TK_Execute(e_tk_class* param_0) { - // NONMATCHING -} - -/* 807B9C50-807B9C58 001B50 0008+00 1/0 0/0 0/0 .text daE_TK_IsDelete__FP10e_tk_class */ -static bool daE_TK_IsDelete(e_tk_class* param_0) { - return true; -} - -/* 807B9C58-807B9CC0 001B58 0068+00 1/0 0/0 0/0 .text daE_TK_Delete__FP10e_tk_class */ -static void daE_TK_Delete(e_tk_class* param_0) { - // NONMATCHING -} - -/* 807B9CC0-807B9DB8 001BC0 00F8+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ -static void useHeapInit(fopAc_ac_c* param_0) { - // NONMATCHING -} - -/* ############################################################################################## */ -/* 807BA2EC-807BA2F0 000080 0004+00 0/1 0/0 0/0 .rodata @4487 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4487 = -100.0f; -COMPILER_STRIP_GATE(0x807BA2EC, &lit_4487); -#pragma pop - -/* 807B9DB8-807BA0C4 001CB8 030C+00 1/0 0/0 0/0 .text daE_TK_Create__FP10fopAc_ac_c */ -static void daE_TK_Create(fopAc_ac_c* param_0) { - // NONMATCHING -} - -/* 807BA0C4-807BA10C 001FC4 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGSphFv */ -// cM3dGSph::~cM3dGSph() { -extern "C" void __dt__8cM3dGSphFv() { - // NONMATCHING -} - -/* 807BA10C-807BA154 00200C 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGAabFv */ -// cM3dGAab::~cM3dGAab() { -extern "C" void __dt__8cM3dGAabFv() { - // NONMATCHING -} - -/* 807BA154-807BA1C4 002054 0070+00 3/2 0/0 0/0 .text __dt__12dBgS_ObjAcchFv */ -// dBgS_ObjAcch::~dBgS_ObjAcch() { -extern "C" void __dt__12dBgS_ObjAcchFv() { - // NONMATCHING -} - -/* 807BA1C4-807BA20C 0020C4 0048+00 2/1 0/0 0/0 .text __dt__12daE_TK_HIO_cFv */ -daE_TK_HIO_c::~daE_TK_HIO_c() { - // NONMATCHING -} - -/* 807BA20C-807BA248 00210C 003C+00 0/0 1/0 0/0 .text __sinit_d_a_e_tk_cpp */ -void __sinit_d_a_e_tk_cpp() { - // NONMATCHING -} - -#pragma push -#pragma force_active on -REGISTER_CTORS(0x807BA20C, __sinit_d_a_e_tk_cpp); -#pragma pop - -/* 807BA248-807BA250 002148 0008+00 1/0 0/0 0/0 .text @36@__dt__12dBgS_ObjAcchFv */ -static void func_807BA248() { - // NONMATCHING -} - -/* 807BA250-807BA258 002150 0008+00 1/0 0/0 0/0 .text @20@__dt__12dBgS_ObjAcchFv */ -static void func_807BA250() { - // NONMATCHING -} - -/* 807BA2F0-807BA2F0 000084 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */