From 137fe8b8df6f6b988a12c2d844e811f1908590ce Mon Sep 17 00:00:00 2001 From: TakaRikka <38417346+TakaRikka@users.noreply.github.com> Date: Thu, 27 Mar 2025 02:44:40 -0700 Subject: [PATCH] d_a_e_th_ball done (#2352) --- configure.py | 2 +- include/d/actor/d_a_e_th.h | 91 +- include/d/actor/d_a_e_th_ball.h | 56 +- src/d/actor/d_a_e_th_ball.cpp | 1828 ++++++++++++++++++------------- 4 files changed, 1201 insertions(+), 776 deletions(-) diff --git a/configure.py b/configure.py index 8d3500f3856..8a2413f0143 100755 --- a/configure.py +++ b/configure.py @@ -1674,7 +1674,7 @@ config.libs = [ ActorRel(MatchingFor("GZ2E01"), "d_a_e_st_line"), ActorRel(NonMatching, "d_a_e_sw"), ActorRel(NonMatching, "d_a_e_th"), - ActorRel(NonMatching, "d_a_e_th_ball"), + ActorRel(MatchingFor("GZ2E01"), "d_a_e_th_ball"), ActorRel(NonMatching, "d_a_e_tk"), ActorRel(NonMatching, "d_a_e_tk2"), ActorRel(NonMatching, "d_a_e_tk_ball"), diff --git a/include/d/actor/d_a_e_th.h b/include/d/actor/d_a_e_th.h index b25bd3d8aac..ad83547fef4 100644 --- a/include/d/actor/d_a_e_th.h +++ b/include/d/actor/d_a_e_th.h @@ -1,6 +1,21 @@ #ifndef D_A_E_TH_H #define D_A_E_TH_H + #include "f_op/f_op_actor_mng.h" +#include "d/d_cc_d.h" +#include "d/d_cc_uty.h" +#include "d/d_bg_s_acch.h" + +struct th_ke_s { + /* 807B3B58 */ ~th_ke_s(); + /* 807B3BD4 */ th_ke_s(); + + /* 0x000 */ cXyz field_0x0[15]; + /* 0x0B4 */ cXyz field_0xb4[15]; + /* 0x168 */ s16 field_0x168; + /* 0x16A */ s16 field_0x16a; + /* 0x16C */ u8 field_0x16c[0x17C - 0x16C]; +}; /** * @ingroup actors-enemies @@ -11,8 +26,75 @@ * */ class e_th_class : public fopEn_enemy_c { -private: - /* 0x5ac */ u8 field_0x5ac[0x123c - 0x5ac]; +public: + /* 0x05AC */ request_of_phase_process_class mPhase; + /* 0x05B4 */ s16 mMode; + /* 0x05B6 */ u8 field_0x5b6; + /* 0x05B7 */ u8 field_0x5b7; + /* 0x05B8 */ u8 field_0x5b8; + /* 0x05B9 */ u8 field_0x5b9; + /* 0x05BA */ u8 field_0x5BA[0x05CC - 0x05BA]; + /* 0x05CC */ mDoExt_McaMorfSO* mpModelMorf; + /* 0x05D0 */ int mAnm; + /* 0x05D4 */ u8 field_0x5D4[0x05D8 - 0x05D4]; + /* 0x05D8 */ f32 field_0x5d8; + /* 0x05DC */ s16 field_0x5dc; + /* 0x05DE */ u8 field_0x5DE[0x05E0 - 0x05DE]; + /* 0x05E0 */ Z2CreatureEnemy mSound; + /* 0x0684 */ s16 field_0x684; + /* 0x0686 */ s16 mAction; + /* 0x0688 */ u8 field_0x688[0x068A - 0x0688]; + /* 0x068A */ s8 field_0x68a; + /* 0x068B */ u8 field_0x68B[0x068C - 0x068B]; + /* 0x068C */ f32 mPlayerDist; + /* 0x0690 */ s16 mPlayerAngleY; + /* 0x0692 */ u8 field_0x692[0x0698 - 0x0692]; + /* 0x0698 */ u32 mShadowKey; + /* 0x069C */ s16 field_0x69c[4]; + /* 0x06A4 */ s16 field_0x6a4; + /* 0x06A6 */ s16 field_0x6a6; + /* 0x06A8 */ cXyz field_0x6a8; + /* 0x06B4 */ cXyz field_0x6b4; + /* 0x06C0 */ cXyz field_0x6c0; + /* 0x06CC */ cXyz field_0x6cc; + /* 0x06D8 */ u8 field_0x6D8[0x06E4 - 0x06D8]; + /* 0x06E4 */ u8 field_0x6e4; + /* 0x06E5 */ u8 field_0x6E5[0x06E6 - 0x06E5]; + /* 0x06E6 */ s16 field_0x6e6; + /* 0x06E8 */ s16 field_0x6e8; + /* 0x06EA */ s8 field_0x6ea; + /* 0x06EB */ u8 field_0x6EB[0x06F0 - 0x06EB]; + /* 0x06F0 */ fpc_ProcID mBallID; + /* 0x06F4 */ dBgS_AcchCir mAcchCir; + /* 0x0734 */ dBgS_ObjAcch mAcch; + /* 0x090C */ dCcD_Stts mCcStts; + /* 0x0948 */ dCcD_Sph mCcSph[3]; + /* 0x0CF0 */ dCcU_AtInfo mAtInfo; + /* 0x0D14 */ cXyz field_0xd14; + /* 0x0D20 */ cXyz field_0xd20; + /* 0x0D2C */ s16 mDemoCamMode; + /* 0x0D2E */ s16 mDemoCamTimer; + /* 0x0D30 */ cXyz mDemoCamEye; + /* 0x0D3C */ cXyz mDemoCamCenter; + /* 0x0D48 */ cXyz mDemoCamEyeTarget; + /* 0x0D54 */ cXyz mDemoCamCenterTarget; + /* 0x0D60 */ cXyz mDemoCamEyeSpd; + /* 0x0D6C */ cXyz mDemoCamCenterSpd; + /* 0x0D78 */ f32 field_0xd78; + /* 0x0D7C */ u8 field_0xD7C[0x0D80 - 0x0D7C]; + /* 0x0D80 */ f32 mDemoCamFovy; + /* 0x0D84 */ u8 field_0xD84[0x0D88 - 0x0D84]; + /* 0x0D88 */ f32 field_0xd88; + /* 0x0D8C */ u8 field_0xD8C[0x0D8E - 0x0D8C]; + /* 0x0D8E */ s8 field_0xd8e; + /* 0x0D8F */ s8 field_0xd8f; + /* 0x0D90 */ f32 field_0xd90; + /* 0x0D94 */ u32 field_0xd94; + /* 0x0D98 */ u32 field_0xd98; + /* 0x0D9C */ th_ke_s field_0xd9c[3]; + /* 0x1210 */ mDoExt_3DlineMat0_c field_0x1210; + /* 0x122C */ u8 field_0x122C[0x1238 - 0x122C]; + /* 0x1238 */ u8 mInitHIO; }; STATIC_ASSERT(sizeof(e_th_class) == 0x123c); @@ -22,9 +104,4 @@ class daE_TH_HIO_c { /* 807B3FA4 */ ~daE_TH_HIO_c(); }; -struct th_ke_s { - /* 807B3B58 */ ~th_ke_s(); - /* 807B3BD4 */ th_ke_s(); -}; - #endif /* D_A_E_TH_H */ diff --git a/include/d/actor/d_a_e_th_ball.h b/include/d/actor/d_a_e_th_ball.h index 77b65e0224b..93ee96f07a2 100644 --- a/include/d/actor/d_a_e_th_ball.h +++ b/include/d/actor/d_a_e_th_ball.h @@ -1,6 +1,27 @@ #ifndef D_A_E_TH_BALL_H #define D_A_E_TH_BALL_H + #include "f_op/f_op_actor_mng.h" +#include "d/d_cc_d.h" +#include "d/d_cc_uty.h" +#include "d/d_bg_s_acch.h" + +struct th_chain_s { + /* 0x000 */ J3DModel* mp_model[50]; + /* 0x0C8 */ cXyz m_pos[50]; + /* 0x320 */ cXyz field_0x320[50]; + /* 0x578 */ csXyz m_rot[50]; + /* 0x6A4 */ f32 field_0x6a4[50]; +}; + +struct th_chain_2s { + /* 0x000 */ J3DModel* mp_model[20]; + /* 0x050 */ cXyz m_pos[20]; + /* 0x140 */ cXyz field_0x140[20]; + /* 0x230 */ cXyz field_0x230[20]; + /* 0x320 */ csXyz m_rot[20]; + /* 0x398 */ f32 field_0x398[20]; +}; /** * @ingroup actors-enemies @@ -11,9 +32,38 @@ * */ class e_th_ball_class : public fopEn_enemy_c { - /* 807B7AA8 */ e_th_ball_class(); -private: - /* 0x5ac */ u8 field_0x5ac[0x1a90 - 0x5ac]; +public: + /* 0x05AC */ request_of_phase_process_class mPhase; + /* 0x05B4 */ u8 field_0x5B4[0x05B8 - 0x05B4]; + /* 0x05B8 */ J3DModel* mpBallModel; + /* 0x05BC */ Z2Creature mSound; + /* 0x064C */ s16 mCounter; + /* 0x064E */ s16 mAction; + /* 0x0650 */ s16 mMode; + /* 0x0652 */ s16 mTimers[3]; + /* 0x0658 */ s16 field_0x658; + /* 0x065C */ th_chain_s field_0x65c; + /* 0x0DC8 */ f32 field_0xdc8; + /* 0x0DCC */ f32 field_0xdcc; + /* 0x0DD0 */ s16 field_0xdd0; + /* 0x0DD4 */ f32 field_0xdd4; + /* 0x0DD8 */ cXyz field_0xdd8; + /* 0x0DE4 */ f32 field_0xde4; + /* 0x0DE8 */ int field_0xde8; + /* 0x0DEC */ th_chain_2s field_0xdec; + /* 0x11D4 */ int field_0x11d4; + /* 0x11D8 */ th_chain_2s field_0x11d8; + /* 0x15C0 */ f32 field_0x15c0; + /* 0x15C4 */ s16 field_0x15c4; + /* 0x15C6 */ s8 field_0x15c6; + /* 0x15C8 */ dBgS_AcchCir mAcchCir; + /* 0x1608 */ dBgS_ObjAcch mAcch; + /* 0x17E0 */ dCcD_Stts mCcStts; + /* 0x181C */ dCcD_Sph mCcSph; + /* 0x1954 */ dCcD_Sph mAtSph; + /* 0x1A8C */ s8 field_0x1a8c; + /* 0x1A8D */ s8 mDemoMode; + /* 0x1A8E */ s8 mPlayerGet; }; STATIC_ASSERT(sizeof(e_th_ball_class) == 0x1a90); diff --git a/src/d/actor/d_a_e_th_ball.cpp b/src/d/actor/d_a_e_th_ball.cpp index 5aceed3a9f6..a1a6de7316f 100644 --- a/src/d/actor/d_a_e_th_ball.cpp +++ b/src/d/actor/d_a_e_th_ball.cpp @@ -4,776 +4,1154 @@ */ #include "d/actor/d_a_e_th_ball.h" -#include "d/d_cc_d.h" -#include "dol2asm.h" +#include "d/actor/d_a_e_th.h" +#include "d/d_com_inf_game.h" +#include "d/actor/d_a_player.h" +#include "d/d_s_play.h" - -// -// Forward References: -// - -extern "C" static void chain_draw__FP15e_th_ball_class(); -extern "C" static void daE_TH_BALL_Draw__FP15e_th_ball_class(); -extern "C" static void chain_control_01__FP15e_th_ball_class(); -extern "C" void __dt__4cXyzFv(); -extern "C" static void chain_control_02__FP15e_th_ball_class(); -extern "C" static void chain_control_03__FP15e_th_ball_class(); -extern "C" static void chain_control_11__FP15e_th_ball_class(); -extern "C" static void chain_control_12__FP15e_th_ball_class(); -extern "C" static void chain_control_13__FP15e_th_ball_class(); -extern "C" static void chain_control_21__FP15e_th_ball_class(); -extern "C" static void normal_move__FP15e_th_ball_classSc(); -extern "C" static void e_th_ball_stop__FP15e_th_ball_class(); -extern "C" static void e_th_ball_spin__FP15e_th_ball_class(); -extern "C" static void wall_angle_get__FP15e_th_ball_class(); -extern "C" static void e_th_ball_shot__FP15e_th_ball_class(); -extern "C" static void e_th_ball_return__FP15e_th_ball_class(); -extern "C" static void e_th_ball_end__FP15e_th_ball_class(); -extern "C" static void action__FP15e_th_ball_class(); -extern "C" static void get_demo__FP15e_th_ball_class(); -extern "C" static void daE_TH_BALL_Execute__FP15e_th_ball_class(); -extern "C" static bool daE_TH_BALL_IsDelete__FP15e_th_ball_class(); -extern "C" static void daE_TH_BALL_Delete__FP15e_th_ball_class(); -extern "C" static void useHeapInit__FP10fopAc_ac_c(); -extern "C" static void daE_TH_BALL_Create__FP10fopAc_ac_c(); -extern "C" void __ct__15e_th_ball_classFv(); -extern "C" void __dt__8cM3dGSphFv(); -extern "C" void __dt__8cM3dGAabFv(); -extern "C" void __dt__12dBgS_ObjAcchFv(); -extern "C" void __dt__5csXyzFv(); -extern "C" void __ct__5csXyzFv(); -extern "C" void __ct__4cXyzFv(); -extern "C" static void func_807B7EA0(); -extern "C" static void func_807B7EA8(); -extern "C" extern char const* const d_a_e_th_ball__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 mDoMtx_ZrotM__FPA4_fs(); -extern "C" void transM__14mDoMtx_stack_cFfff(); -extern "C" void mDoExt_modelUpdate__FP8J3DModel(); -extern "C" void mDoExt_modelUpdateDL__FP8J3DModel(); -extern "C" void setAnm__16mDoExt_McaMorfSOFP15J3DAnmTransformiffff(); -extern "C" void mDoExt_J3DModel__create__FP12J3DModelDataUlUl(); -extern "C" void __ct__10fopAc_ac_cFv(); -extern "C" void fopAcIt_Judge__FPFPvPv_PvPv(); -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_searchActorDistance__FPC10fopAc_ac_cPC10fopAc_ac_c(); -extern "C" void fopAcM_orderItemEvent__FP10fopAc_ac_cUsUs(); -extern "C" void fopAcM_createItemForTrBoxDemo__FPC4cXyziiiPC5csXyzPC4cXyz(); -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_setSimpleShadow__FP4cXyzffR13cBgS_PolyInfosfP9_GXTexObj(); -extern "C" void onSwitch__12dSv_memBit_cFi(); -extern "C" void getRes__14dRes_control_cFPCclP11dRes_info_ci(); -extern "C" void setPtI_Id__14dEvt_control_cFUi(); -extern "C" void StartShock__12dVibration_cFii4cXyz(); -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__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 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 def_se_set__FP10Z2CreatureP8cCcD_ObjUlP10fopAc_ac_c(); -extern "C" void setLookPos__9daPy_py_cFP4cXyz(); -extern "C" void settingTevStruct__18dScnKy_env_light_cFiP4cXyzP12dKy_tevstr_c(); -extern "C" void setLightTevColorType_MAJI__18dScnKy_env_light_cFP12J3DModelDataP12dKy_tevstr_c(); -extern "C" void dKy_pol_sound_get__FPC13cBgS_PolyInfo(); -extern "C" void GetAc__8cCcD_ObjFv(); -extern "C" void Set__4cCcSFP8cCcD_Obj(); -extern "C" void __mi__4cXyzCFRC3Vec(); -extern "C" void __ml__4cXyzCFf(); -extern "C" void cM_atan2s__Fff(); -extern "C" void cM_rndFX__Ff(); -extern "C" void SetPos__11cBgS_GndChkFPC3Vec(); -extern "C" void SetC__8cM3dGSphFRC4cXyz(); -extern "C" void SetR__8cM3dGSphFf(); -extern "C" void cLib_addCalc2__FPffff(); -extern "C" void cLib_addCalc0__FPfff(); -extern "C" void cLib_addCalcAngleS2__FPssss(); -extern "C" void MtxTrans__FfffUc(); -extern "C" void MtxScale__FfffUc(); -extern "C" void MtxPosition__FP4cXyzP4cXyz(); -extern "C" void __ct__10Z2CreatureFv(); -extern "C" void init__10Z2CreatureFP3VecP3VecUcUc(); -extern "C" void __dl__FPv(); -extern "C" void __construct_array(); -extern "C" void _savegpr_21(); -extern "C" void _savegpr_22(); -extern "C" void _savegpr_25(); -extern "C" void _savegpr_27(); -extern "C" void _savegpr_28(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_21(); -extern "C" void _restgpr_22(); -extern "C" void _restgpr_25(); -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 m_cpadInfo__8mDoCPd_c[256]; -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 sincosTable___5JMath[65536]; -extern "C" extern void* calc_mtx[1 + 1 /* padding */]; - -// -// Declarations: -// - -/* ############################################################################################## */ -/* 807B7EB8-807B7EBC 000000 0004+00 16/16 0/0 0/0 .rodata @3746 */ -SECTION_RODATA static f32 const lit_3746 = 1.0f; -COMPILER_STRIP_GATE(0x807B7EB8, &lit_3746); - -/* 807B7EBC-807B7EC0 000004 0004+00 2/14 0/0 0/0 .rodata @3747 */ -SECTION_RODATA static u8 const lit_3747[4] = { - 0x00, - 0x00, - 0x00, - 0x00, +enum daE_TH_ACTION { + ACTION_STOP, + ACTION_SPIN, + ACTION_SHOT, + ACTION_RETURN, + ACTION_END = 10, }; -COMPILER_STRIP_GATE(0x807B7EBC, &lit_3747); - -/* 807B7EC0-807B7EC4 000008 0004+00 0/1 0/0 0/0 .rodata @3748 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3748 = 12.0f; -COMPILER_STRIP_GATE(0x807B7EC0, &lit_3748); -#pragma pop /* 807B80E0-807B80E4 000000 0004+00 12/12 0/0 0/0 .bss master */ -static u8 master[4]; +static e_th_class* master; /* 807B4918-807B4C40 000078 0328+00 1/1 0/0 0/0 .text chain_draw__FP15e_th_ball_class */ -static void chain_draw(e_th_ball_class* param_0) { - // NONMATCHING -} +static void chain_draw(e_th_ball_class* i_this) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + f32 size = 1.0f + XREG_F(0); -/* ############################################################################################## */ -/* 807B7EC4-807B7EC8 00000C 0004+00 2/2 0/0 0/0 .rodata @3759 */ -SECTION_RODATA static f32 const lit_3759 = 55.0f; -COMPILER_STRIP_GATE(0x807B7EC4, &lit_3759); + J3DModel* model_p; + s16 rot_z; + int var_r28 = 0; + for (int i = i_this->field_0xdd0; i < 49; i++) { + MtxTrans(i_this->field_0x65c.m_pos[i].x, i_this->field_0x65c.m_pos[i].y, i_this->field_0x65c.m_pos[i].z, 0); + cMtx_YrotM(*calc_mtx, i_this->field_0x65c.m_rot[i].y); + cMtx_XrotM(*calc_mtx, i_this->field_0x65c.m_rot[i].x); + + rot_z = var_r28 * 3000; + if (var_r28 & 1) { + rot_z += (s16)0x4000; + } + cMtx_ZrotM(*calc_mtx, rot_z); + MtxScale(size, size, size, 1); + MtxTrans(0.0f, 0.0f, 12.0f + XREG_F(1), 1); + + model_p = i_this->field_0x65c.mp_model[i]; + model_p->setBaseTRMtx(*calc_mtx); + g_env_light.setLightTevColorType_MAJI(model_p, &a_this->tevStr); + mDoExt_modelUpdate(model_p); + var_r28++; + } + + if (master == NULL || master->field_0xd8e == 0) { + var_r28 = 0; + for (int i = i_this->field_0xde8; i < 19; i++) { + MtxTrans(i_this->field_0xdec.m_pos[i].x, i_this->field_0xdec.m_pos[i].y, i_this->field_0xdec.m_pos[i].z, 0); + cMtx_YrotM(*calc_mtx, i_this->field_0xdec.m_rot[i].y); + cMtx_XrotM(*calc_mtx, i_this->field_0xdec.m_rot[i].x); + + rot_z = var_r28 * 3000; + if (var_r28 & 1) { + rot_z += (s16)0x4000; + } + cMtx_ZrotM(*calc_mtx, rot_z); + MtxScale(size, size, size, 1); + MtxTrans(0.0f, 0.0f, 12.0f + XREG_F(1), 1); + + model_p = i_this->field_0xdec.mp_model[i]; + model_p->setBaseTRMtx(*calc_mtx); + g_env_light.setLightTevColorType_MAJI(model_p, &a_this->tevStr); + mDoExt_modelUpdate(model_p); + var_r28++; + } + + var_r28 = 0; + for (int i = i_this->field_0x11d4; i < 19; i++) { + MtxTrans(i_this->field_0x11d8.m_pos[i].x, i_this->field_0x11d8.m_pos[i].y, i_this->field_0x11d8.m_pos[i].z, 0); + cMtx_YrotM(*calc_mtx, i_this->field_0x11d8.m_rot[i].y); + cMtx_XrotM(*calc_mtx, i_this->field_0x11d8.m_rot[i].x); + + rot_z = var_r28 * 3000; + if (var_r28 & 1) { + rot_z += (s16)0x4000; + } + cMtx_ZrotM(*calc_mtx, rot_z); + MtxScale(size, size, size, 1); + MtxTrans(0.0f, 0.0f, 12.0f + XREG_F(1), 1); + + model_p = i_this->field_0x11d8.mp_model[i]; + model_p->setBaseTRMtx(*calc_mtx); + g_env_light.setLightTevColorType_MAJI(model_p, &a_this->tevStr); + mDoExt_modelUpdate(model_p); + var_r28++; + } + } +} /* 807B4C40-807B4CEC 0003A0 00AC+00 1/0 0/0 0/0 .text daE_TH_BALL_Draw__FP15e_th_ball_class */ -static void daE_TH_BALL_Draw(e_th_ball_class* param_0) { - // NONMATCHING +static int daE_TH_BALL_Draw(e_th_ball_class* i_this) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + if (i_this->mPlayerGet) { + return 1; + } + + g_env_light.settingTevStruct(0, &a_this->current.pos, &a_this->tevStr); + g_env_light.setLightTevColorType_MAJI(i_this->mpBallModel, &a_this->tevStr); + mDoExt_modelUpdateDL(i_this->mpBallModel); + dComIfGd_setSimpleShadow(&a_this->current.pos, i_this->mAcch.GetGroundH(), 55.0f + AREG_F(11), i_this->mAcch.m_gnd, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); + chain_draw(i_this); + return 1; } -/* ############################################################################################## */ -/* 807B7EC8-807B7ECC 000010 0004+00 0/3 0/0 0/0 .rodata @3847 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3847 = 20.0f; -COMPILER_STRIP_GATE(0x807B7EC8, &lit_3847); -#pragma pop - -/* 807B7ECC-807B7ED0 000014 0004+00 0/3 0/0 0/0 .rodata @3848 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3848 = 1000.0f; -COMPILER_STRIP_GATE(0x807B7ECC, &lit_3848); -#pragma pop - -/* 807B7ED0-807B7ED4 000018 0004+00 1/5 0/0 0/0 .rodata @3849 */ -SECTION_RODATA static f32 const lit_3849 = 25.0f; -COMPILER_STRIP_GATE(0x807B7ED0, &lit_3849); - -/* 807B7ED4-807B7ED8 00001C 0004+00 0/5 0/0 0/0 .rodata @3850 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3850 = 200.0f; -COMPILER_STRIP_GATE(0x807B7ED4, &lit_3850); -#pragma pop - -/* 807B7ED8-807B7EDC 000020 0004+00 0/3 0/0 0/0 .rodata @3851 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3851 = 7.0f; -COMPILER_STRIP_GATE(0x807B7ED8, &lit_3851); -#pragma pop - /* 807B4CEC-807B5074 00044C 0388+00 1/1 0/0 0/0 .text chain_control_01__FP15e_th_ball_class */ -static void chain_control_01(e_th_ball_class* param_0) { - // NONMATCHING +static void chain_control_01(e_th_ball_class* i_this) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + cXyz mae; + cXyz ato; + dBgS_GndChk gndchk; + + th_chain_s* chain_s = &i_this->field_0x65c; + if (master != NULL && fopAcM_GetName(master) == PROC_E_TH && master->field_0xd8e == 0) { + chain_s->m_pos[0] = master->field_0x6c0; + } + + cXyz* pos_p = &chain_s->m_pos[1]; + csXyz* rot_p = &chain_s->m_rot[1]; + f32* var_r28 = &chain_s->field_0x6a4[1]; + f32 temp_f27 = i_this->field_0xde4 - (20.0f - (20.0f * i_this->field_0xdd4)); + + Vec sp3C; + cXyz sp30; + mae = a_this->current.pos - chain_s->m_pos[0]; + cMtx_YrotS(*calc_mtx, cM_atan2s(mae.x, mae.z)); + cMtx_XrotM(*calc_mtx, -cM_atan2s(mae.y, JMAFastSqrt((mae.x * mae.x) + (mae.z * mae.z)))); + mae.x = 0.0f; + mae.y = 0.0f; + mae.z = 1000.0f * i_this->field_0xdd4; + MtxPosition(&mae, &sp30); + mae.z = 0.0f; + + for (int i = 1; i < 50; i++, pos_p++, rot_p++, var_r28++) { + f32 temp_f31 = sp30.x + (pos_p[0].x - pos_p[-1].x); + f32 temp_f28; + f32 temp_f30 = sp30.z + (pos_p[0].z - pos_p[-1].z); + + f32 var_f29 = sp30.y + (pos_p[0].y + temp_f27); + if (var_f29 <= *var_r28) { + var_f29 = *var_r28; + } + temp_f28 = var_f29 - pos_p[-1].y; + + s16 rot_x, rot_y; + rot_y = (s16)cM_atan2s(temp_f31, temp_f30); + rot_x = -cM_atan2s(temp_f28, JMAFastSqrt((temp_f31 * temp_f31) + (temp_f30 * temp_f30))); + cMtx_YrotS(*calc_mtx, rot_y); + cMtx_XrotM(*calc_mtx, rot_x); + if (i_this->field_0xdd0 == i - 1) { + mae.z = 25.0f + XREG_F(2); + } + MtxPosition(&mae, &ato); + pos_p[0].x = pos_p[-1].x + ato.x; + pos_p[0].y = pos_p[-1].y + ato.y; + pos_p[0].z = pos_p[-1].z + ato.z; + + if (((i_this->mCounter + i) & 15) == 0) { + sp3C = *pos_p; + sp3C.y += 200.0f; + gndchk.SetPos(&sp3C); + + *var_r28 = 7.0f + dComIfG_Bgsp().GroundCross(&gndchk); + if (*var_r28 - pos_p->y > 200.0f) { + *var_r28 = pos_p->y; + } + } + } + + for (int i = 0; i < 50; i++) { + chain_s->field_0x320[i] = chain_s->m_pos[i]; + } } -/* 807B5074-807B50B0 0007D4 003C+00 1/1 0/0 0/0 .text __dt__4cXyzFv */ -// cXyz::~cXyz() { -extern "C" void __dt__4cXyzFv() { - // NONMATCHING -} - -/* ############################################################################################## */ -/* 807B7EDC-807B7EE0 000024 0004+00 0/1 0/0 0/0 .rodata @3969 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3969 = 90.0f; -COMPILER_STRIP_GATE(0x807B7EDC, &lit_3969); -#pragma pop - -/* 807B7EE0-807B7EE8 000028 0004+04 0/1 0/0 0/0 .rodata @3970 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3970[1 + 1 /* padding */] = { - -100.0f, - /* padding */ - 0.0f, -}; -COMPILER_STRIP_GATE(0x807B7EE0, &lit_3970); -#pragma pop - -/* 807B7EE8-807B7EF0 000030 0008+00 0/4 0/0 0/0 .rodata @3971 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_3971[8] = { - 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x807B7EE8, &lit_3971); -#pragma pop - -/* 807B7EF0-807B7EF8 000038 0008+00 0/4 0/0 0/0 .rodata @3972 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_3972[8] = { - 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x807B7EF0, &lit_3972); -#pragma pop - -/* 807B7EF8-807B7F00 000040 0008+00 0/4 0/0 0/0 .rodata @3973 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_3973[8] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x807B7EF8, &lit_3973); -#pragma pop - -/* 807B7F00-807B7F04 000048 0004+00 0/1 0/0 0/0 .rodata @3974 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3974 = 1024.0f; -COMPILER_STRIP_GATE(0x807B7F00, &lit_3974); -#pragma pop - -/* 807B7F04-807B7F08 00004C 0004+00 0/1 0/0 0/0 .rodata @3975 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3975 = 16384.0f; -COMPILER_STRIP_GATE(0x807B7F04, &lit_3975); -#pragma pop - -/* 807B7F08-807B7F10 000050 0004+04 0/1 0/0 0/0 .rodata @3976 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3976[1 + 1 /* padding */] = { - 2048.0f, - /* padding */ - 0.0f, -}; -COMPILER_STRIP_GATE(0x807B7F08, &lit_3976); -#pragma pop - /* 807B50B0-807B54B4 000810 0404+00 1/1 0/0 0/0 .text chain_control_02__FP15e_th_ball_class */ -static void chain_control_02(e_th_ball_class* param_0) { - // NONMATCHING -} +static void chain_control_02(e_th_ball_class* i_this) { + cXyz sp6C; + cXyz sp60; -/* ############################################################################################## */ -/* 807B7F10-807B7F18 000058 0008+00 1/2 0/0 0/0 .rodata @4027 */ -SECTION_RODATA static u8 const lit_4027[8] = { - 0x43, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x807B7F10, &lit_4027); + int i; + s16 spC, spA; + th_chain_s* chain_s = &i_this->field_0x65c; + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + + chain_s->m_pos[49] = i_this->field_0xdd8; + cXyz* pos_p = &chain_s->m_pos[48]; + csXyz* rot_p = &chain_s->m_rot[48]; + + cXyz sp54; + sp6C.x = 0.0f; + sp6C.y = 0.0f; + sp6C.z = 25.0f + XREG_F(2); + + cXyz sp48(0.0f, 0.0f, 0.0f); + cXyz sp3C; + + s8 sp8 = 0; + if (master != NULL && master->field_0xd8e != 0) { + sp8 = 1; + } + + for (i = 48; i >= 0; i--, pos_p--, rot_p--) { + if (sp8) { + cMtx_YrotS(*calc_mtx, a_this->current.angle.y); + sp3C.x = (90.0f + VREG_F(7)) * cM_ssin(i * (VREG_S(7) - 3600)); + sp3C.y = 0.0f; + sp3C.z = -100.0f + VREG_F(8); + MtxPosition(&sp3C, &sp48); + } + + f32 temp_f30 = sp48.x + (pos_p[0].x - pos_p[1].x); + f32 temp_f28 = pos_p[0].y - pos_p[1].y; + f32 temp_f29 = sp48.z + (pos_p[0].z - pos_p[1].z); + + spA = (s16)cM_atan2s(temp_f30, temp_f29); + spC = -cM_atan2s(temp_f28, JMAFastSqrt((temp_f30 * temp_f30) + (temp_f29 * temp_f29))); + cMtx_YrotS(*calc_mtx, spA); + cMtx_XrotM(*calc_mtx, spC); + if (i_this->field_0xdd0 == i + 1) { + sp6C.z = 0.0f; + } + MtxPosition(&sp6C, &sp60); + + sp54 = *pos_p; + pos_p[0].x = pos_p[1].x + sp60.x; + pos_p[0].y = pos_p[1].y + sp60.y; + pos_p[0].z = pos_p[1].z + sp60.z; + rot_p->x = -spC; + + sp54 = (*pos_p - sp54) * (1.0f + TREG_F(6)); + sp54.y = 0.0f; + + f32 var_f31 = 1024.0f * sp54.abs(); + if (var_f31 > 16384.0f || i_this->mAction != ACTION_STOP) { + rot_p->y = (spA + 0x8000); + } else { + if (var_f31 < 2048.0f) { + var_f31 = 2048.0f; + } + cLib_addCalcAngleS2(&rot_p->y, spA + 0x8000, 2, var_f31); + } + } +} /* 807B54B4-807B56A4 000C14 01F0+00 1/1 0/0 0/0 .text chain_control_03__FP15e_th_ball_class */ -static void chain_control_03(e_th_ball_class* param_0) { - // NONMATCHING +static void chain_control_03(e_th_ball_class* i_this) { + th_chain_s* chain_s = &i_this->field_0x65c; + cXyz sp2C; + cXyz sp20; + sp2C = chain_s->field_0x320[i_this->field_0xdd0] - chain_s->m_pos[i_this->field_0xdd0]; + + i_this->field_0xdcc = sp2C.abs(); + cXyz* pos_p = &chain_s->m_pos[i_this->field_0xdd0]; + + int temp_r26 = 50 - i_this->field_0xdd0; + for (int i = 0; i < temp_r26; i++, pos_p++) { + *pos_p += sp2C * ((f32)(temp_r26 - i) / (f32)temp_r26); + } } -/* ############################################################################################## */ -/* 807B7F18-807B7F1C 000060 0004+00 0/4 0/0 0/0 .rodata @4090 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4090 = 10.0f; -COMPILER_STRIP_GATE(0x807B7F18, &lit_4090); -#pragma pop - -/* 807B7F1C-807B7F20 000064 0004+00 0/3 0/0 0/0 .rodata @4091 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4091 = -20.0f; -COMPILER_STRIP_GATE(0x807B7F1C, &lit_4091); -#pragma pop - /* 807B56A4-807B5980 000E04 02DC+00 1/1 0/0 0/0 .text chain_control_11__FP15e_th_ball_class */ -static void chain_control_11(e_th_ball_class* param_0) { - // NONMATCHING +static void chain_control_11(e_th_ball_class* i_this) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + cXyz sp48; + cXyz sp3C; + Vec sp30; + dBgS_GndChk gndchk; + + th_chain_2s* chain_s = &i_this->field_0xdec; + chain_s->m_pos[0] = master->field_0x6cc; + + cXyz* pos_p = &chain_s->m_pos[1]; + csXyz* rot_p = &chain_s->m_rot[1]; + f32* var_r28 = &chain_s->field_0x398[1]; + f32 temp_f27 = -20.0f; + + cXyz sp24; + cMtx_YrotS(*calc_mtx, master->shape_angle.y); + sp48.x = 0.0f; + sp48.y = 0.0f; + sp48.z = 10.0f + TREG_F(10); + MtxPosition(&sp48, &sp24); + + sp48.x = 0.0f; + sp48.y = 0.0f; + sp48.z = 0.0f; + for (int i = 1; i < 20; i++, pos_p++, rot_p++, var_r28++) { + f32 temp_f31 = sp24.x + (pos_p[0].x - pos_p[-1].x); + f32 temp_f28; + f32 temp_f30 = sp24.z + (pos_p[0].z - pos_p[-1].z); + f32 var_f29 = pos_p[0].y + temp_f27; + if (var_f29 <= *var_r28) { + var_f29 = *var_r28; + } + temp_f28 = var_f29 - pos_p[-1].y; + + s16 spA, sp8; + sp8 = (s16)cM_atan2s(temp_f31, temp_f30); + spA = -cM_atan2s(temp_f28, JMAFastSqrt((temp_f31 * temp_f31) + (temp_f30 * temp_f30))); + cMtx_YrotS(*calc_mtx, sp8); + cMtx_XrotM(*calc_mtx, spA); + + if (i_this->field_0xde8 == i - 1) { + sp48.z = 25.0f + XREG_F(2); + } + MtxPosition(&sp48, &sp3C); + pos_p[0].x = pos_p[-1].x + sp3C.x; + pos_p[0].y = pos_p[-1].y + sp3C.y; + pos_p[0].z = pos_p[-1].z + sp3C.z; + + if (((i_this->mCounter + i) & 15) == 0) { + sp30 = *pos_p; + sp30.y += 200.0f; + gndchk.SetPos(&sp30); + + *var_r28 = 7.0f + dComIfG_Bgsp().GroundCross(&gndchk); + if (*var_r28 - pos_p->y > 200.0f) { + *var_r28 = pos_p->y; + } + } + } + + for (int i = 0; i < 20; i++) { + chain_s->field_0x140[i] = chain_s->m_pos[i]; + } } /* 807B5980-807B5B38 0010E0 01B8+00 1/1 0/0 0/0 .text chain_control_12__FP15e_th_ball_class */ -static void chain_control_12(e_th_ball_class* param_0) { - // NONMATCHING +static void chain_control_12(e_th_ball_class* i_this) { + cXyz sp20; + cXyz sp14; + + int i; + s16 spA, sp8; + th_chain_2s* chain_s = &i_this->field_0xdec; + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + + chain_s->m_pos[19] = master->field_0x6a8; + cXyz* pos_p = &chain_s->m_pos[18]; + csXyz* rot_p = &chain_s->m_rot[18]; + + sp20.x = 0.0f; + sp20.y = 0.0f; + sp20.z = 25.0f + XREG_F(2); + + for (i = 18; i >= 0; i--, pos_p--, rot_p--) { + f32 temp_f31 = pos_p[0].x - pos_p[1].x; + f32 temp_f29 = pos_p[0].y - pos_p[1].y; + f32 temp_f30 = pos_p[0].z - pos_p[1].z; + + sp8 = (s16)cM_atan2s(temp_f31, temp_f30); + spA = -cM_atan2s(temp_f29, JMAFastSqrt((temp_f31 * temp_f31) + (temp_f30 * temp_f30))); + cMtx_YrotS(*calc_mtx, sp8); + cMtx_XrotM(*calc_mtx, spA); + if (i_this->field_0xde8 == i + 1) { + sp20.z = 0.0f; + } + MtxPosition(&sp20, &sp14); + pos_p[0].x = pos_p[1].x + sp14.x; + pos_p[0].y = pos_p[1].y + sp14.y; + pos_p[0].z = pos_p[1].z + sp14.z; + + rot_p->x = -spA; + rot_p->y = sp8 + 0x8000; + } } /* 807B5B38-807B5C34 001298 00FC+00 1/1 0/0 0/0 .text chain_control_13__FP15e_th_ball_class */ -static void chain_control_13(e_th_ball_class* param_0) { - // NONMATCHING -} +static void chain_control_13(e_th_ball_class* i_this) { + th_chain_2s* chain_s = &i_this->field_0xdec; + cXyz sp2C; + cXyz sp20; + sp2C = chain_s->field_0x140[i_this->field_0xde8] - chain_s->m_pos[i_this->field_0xde8]; -/* ############################################################################################## */ -/* 807B7F20-807B7F24 000068 0004+00 0/1 0/0 0/0 .rodata @4203 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4203 = 7.0f / 10.0f; -COMPILER_STRIP_GATE(0x807B7F20, &lit_4203); -#pragma pop + cXyz* pos_p = &chain_s->m_pos[i_this->field_0xde8]; + + int temp_r26 = 20 - i_this->field_0xde8; + for (int i = 0; i < temp_r26; i++, pos_p++) { + *pos_p += sp2C * ((f32)(temp_r26 - i) / (f32)temp_r26); + } +} /* 807B5C34-807B5F2C 001394 02F8+00 1/1 0/0 0/0 .text chain_control_21__FP15e_th_ball_class */ -static void chain_control_21(e_th_ball_class* param_0) { - // NONMATCHING +static void chain_control_21(e_th_ball_class* i_this) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + int i; + cXyz sp44; + cXyz sp38; + Vec sp2C; + dBgS_GndChk gndchk; + + th_chain_2s* chain_s = &i_this->field_0x11d8; + chain_s->m_pos[0] = master->field_0x6b4; + + cXyz* pos_p = &chain_s->m_pos[1]; + cXyz* var_r29 = &chain_s->field_0x230[1]; + csXyz* rot_p = &chain_s->m_rot[1]; + f32* var_r28 = &chain_s->field_0x398[1]; + f32 temp_f26 = -20.0f; + + cXyz sp20; + sp44.x = 0.0f; + sp44.y = 0.0f; + sp44.z = 0.0f; + + f32 temp_f28 = 0.7f + XREG_F(5); + for (i = 1; i < 20; i++, pos_p++, rot_p++, var_r29++, var_r28++) { + f32 temp_f31 = var_r29[0].x + (pos_p[0].x - pos_p[-1].x); + f32 temp_f27; + f32 temp_f30 = var_r29[0].z + (pos_p[0].z - pos_p[-1].z); + f32 var_f29 = var_r29[0].y + (pos_p[0].y + temp_f26); + if (var_f29 <= *var_r28) { + var_f29 = *var_r28; + } + temp_f27 = var_f29 - pos_p[-1].y; + + s16 spA, sp8; + sp8 = (s16)cM_atan2s(temp_f31, temp_f30); + spA = -cM_atan2s(temp_f27, JMAFastSqrt((temp_f31 * temp_f31) + (temp_f30 * temp_f30))); + cMtx_YrotS(*calc_mtx, sp8); + cMtx_XrotM(*calc_mtx, spA); + + if (i_this->field_0x11d4 == i - 1) { + sp44.z = 25.0f + XREG_F(2); + } + MtxPosition(&sp44, &sp38); + *var_r29 = *pos_p; + + pos_p[0].x = pos_p[-1].x + sp38.x; + pos_p[0].y = pos_p[-1].y + sp38.y; + pos_p[0].z = pos_p[-1].z + sp38.z; + + var_r29[0].x = temp_f28 * (pos_p[0].x - var_r29[0].x); + var_r29[0].y = temp_f28 * (pos_p[0].y - var_r29[0].y); + var_r29[0].z = temp_f28 * (pos_p[0].z - var_r29[0].z); + + rot_p[-1].x = spA; + rot_p[-1].y = sp8; + + if (((i_this->mCounter + i) & 15) == 0) { + sp2C = *pos_p; + sp2C.y += 200.0f; + gndchk.SetPos(&sp2C); + + *var_r28 = 7.0f + dComIfG_Bgsp().GroundCross(&gndchk); + if (*var_r28 - pos_p->y > 200.0f) { + *var_r28 = pos_p->y; + } + } + } } -/* ############################################################################################## */ -/* 807B7F24-807B7F28 00006C 0004+00 0/2 0/0 0/0 .rodata @4231 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4231 = 5.0f; -COMPILER_STRIP_GATE(0x807B7F24, &lit_4231); -#pragma pop - -/* 807B7F28-807B7F2C 000070 0004+00 0/1 0/0 0/0 .rodata @4232 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4232 = 47.0f; -COMPILER_STRIP_GATE(0x807B7F28, &lit_4232); -#pragma pop - -/* 807B7F2C-807B7F30 000074 0004+00 0/1 0/0 0/0 .rodata @4233 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4233 = -30.0f; -COMPILER_STRIP_GATE(0x807B7F2C, &lit_4233); -#pragma pop - -/* 807B7F30-807B7F34 000078 0004+00 0/1 0/0 0/0 .rodata @4234 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4234 = 2.0f; -COMPILER_STRIP_GATE(0x807B7F30, &lit_4234); -#pragma pop - /* 807B5F2C-807B60CC 00168C 01A0+00 4/4 0/0 0/0 .text normal_move__FP15e_th_ball_classSc */ -static void normal_move(e_th_ball_class* param_0, s8 param_1) { - // NONMATCHING +static void normal_move(e_th_ball_class* i_this, s8 param_1) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + + cXyz sp30; + cXyz sp24; + cMtx_YrotS(*calc_mtx, a_this->current.angle.y); + sp30.x = 0.0f; + sp30.y = 0.0f; + sp30.z = a_this->speedF; + MtxPosition(&sp30, &sp24); + sp24.y = a_this->speed.y; + a_this->current.pos += sp24; + + a_this->speed.y -= 5.0f; + if (param_1 != 0) { + a_this->current.angle.x += (s16)(200.0f * a_this->speedF); + } + + f32 y_speed = a_this->speed.y; + f32 temp_f31 = 47.0f + AREG_F(1); + a_this->current.pos.y -= temp_f31; + a_this->old.pos.y -= temp_f31; + + i_this->mAcch.CrrPos(dComIfG_Bgsp()); + + a_this->current.pos.y += temp_f31; + a_this->old.pos.y += temp_f31; + + if (i_this->mAcch.ChkGroundHit()) { + if (y_speed < -30.0f + TREG_F(19)) { + a_this->speed.y = 20.0f + TREG_F(18); + i_this->mSound.startCollisionSE(Z2SE_HIT_HAMMER, dKy_pol_sound_get(&i_this->mAcch.m_gnd)); + + cXyz sp18(a_this->current.pos); + sp18.y -= 20.0f; + cXyz spC(2.0f, 2.0f, 2.0f); + } + + cLib_addCalc0(&a_this->speedF, 1.0f, 2.0f + TREG_F(17)); + } } /* 807B60CC-807B615C 00182C 0090+00 1/1 0/0 0/0 .text e_th_ball_stop__FP15e_th_ball_class */ -static void e_th_ball_stop(e_th_ball_class* param_0) { - // NONMATCHING +static void e_th_ball_stop(e_th_ball_class* i_this) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + cXyz sp14; + cXyz sp8; + + switch (i_this->mMode) { + case 0: + if (master->field_0x68a & 1) { + master->field_0x68a &= ~1; + i_this->mAction = ACTION_SPIN; + i_this->mMode = 0; + } + break; + case 1: + break; + } + + cLib_addCalc0(&a_this->speedF, 1.0f, 1.0f + TREG_F(17)); + normal_move(i_this, 1); } -/* ############################################################################################## */ -/* 807B7F34-807B7F38 00007C 0004+00 0/1 0/0 0/0 .rodata @4326 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4326 = 13.0f; -COMPILER_STRIP_GATE(0x807B7F34, &lit_4326); -#pragma pop - -/* 807B7F38-807B7F3C 000080 0004+00 0/1 0/0 0/0 .rodata @4327 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4327 = 29.0f; -COMPILER_STRIP_GATE(0x807B7F38, &lit_4327); -#pragma pop - -/* 807B7F3C-807B7F40 000084 0004+00 0/1 0/0 0/0 .rodata @4328 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4328 = 65536.0f; -COMPILER_STRIP_GATE(0x807B7F3C, &lit_4328); -#pragma pop - -/* 807B7F40-807B7F44 000088 0004+00 0/1 0/0 0/0 .rodata @4329 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4329 = -130.0f; -COMPILER_STRIP_GATE(0x807B7F40, &lit_4329); -#pragma pop - -/* 807B7F44-807B7F48 00008C 0004+00 0/1 0/0 0/0 .rodata @4330 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4330 = 300.0f; -COMPILER_STRIP_GATE(0x807B7F44, &lit_4330); -#pragma pop - -/* 807B7F48-807B7F4C 000090 0004+00 0/2 0/0 0/0 .rodata @4331 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4331 = 0.5f; -COMPILER_STRIP_GATE(0x807B7F48, &lit_4331); -#pragma pop - -/* 807B7F4C-807B7F50 000094 0004+00 0/2 0/0 0/0 .rodata @4332 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4332 = 1.0f / 10.0f; -COMPILER_STRIP_GATE(0x807B7F4C, &lit_4332); -#pragma pop - -/* 807B7F50-807B7F54 000098 0004+00 0/2 0/0 0/0 .rodata @4333 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4333 = 1.0f / 50.0f; -COMPILER_STRIP_GATE(0x807B7F50, &lit_4333); -#pragma pop - -/* 807B7F54-807B7F58 00009C 0004+00 0/2 0/0 0/0 .rodata @4334 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4334 = 80.0f; -COMPILER_STRIP_GATE(0x807B7F54, &lit_4334); -#pragma pop - -/* 807B7F58-807B7F5C 0000A0 0004+00 0/3 0/0 0/0 .rodata @4335 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4335 = 50.0f; -COMPILER_STRIP_GATE(0x807B7F58, &lit_4335); -#pragma pop - -/* 807B7F5C-807B7F60 0000A4 0004+00 0/1 0/0 0/0 .rodata @4336 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4336 = 40.0f; -COMPILER_STRIP_GATE(0x807B7F5C, &lit_4336); -#pragma pop - /* 807B615C-807B6594 0018BC 0438+00 1/1 0/0 0/0 .text e_th_ball_spin__FP15e_th_ball_class */ -static void e_th_ball_spin(e_th_ball_class* param_0) { - // NONMATCHING +static void e_th_ball_spin(e_th_ball_class* i_this) { + cXyz sp34; + cXyz sp28; + + switch (i_this->mMode) { + case 0: + i_this->mMode = 1; + i_this->mTimers[0] = 30; + i_this->field_0x15c0 = 13.0f + YREG_F(16); + i_this->speedF = 0.0f; + case 1: + case 2: + case 3: + sp34 = i_this->current.pos - master->field_0x6c0; + + if (i_this->mTimers[0] != 0) { + cLib_addCalcAngleS2(&i_this->shape_angle.y, cM_atan2s(sp34.x, sp34.z), 1, 0xC00); + cLib_addCalcAngleS2(&i_this->shape_angle.x, -cM_atan2s(sp34.y, JMAFastSqrt((sp34.x * sp34.x) + (sp34.z * sp34.z))), 1, 0xC00); + + if (i_this->mTimers[0] == JREG_S(6) + 15) { + i_this->field_0x15c4 = JREG_S(7) + 2500; + } + } else { + i_this->shape_angle.y = cM_atan2s(sp34.x, sp34.z); + i_this->shape_angle.x = -cM_atan2s(sp34.y, JMAFastSqrt((sp34.x * sp34.x) + (sp34.z * sp34.z))); + i_this->field_0x1a8c = 1; + } + + i_this->shape_angle.z += i_this->field_0x15c4; + + cLib_addCalcAngleS2(&i_this->field_0x15c4, 0, 1, JREG_S(8) + 25); + cLib_addCalcAngleS2(&i_this->current.angle.y, 0, 1, 0x800); + cLib_addCalcAngleS2(&i_this->current.angle.x, 0, 1, 0x800); + + if (master->field_0x68a & 1) { + master->field_0x68a &= ~1; + i_this->mMode++; + } + + if (i_this->mMode == 2) { + i_this->field_0x15c0 = master->mpModelMorf->getFrame(); + } else { + i_this->field_0x15c0 += master->field_0x5d8; + if (i_this->field_0x15c0 >= 29.0f) { + i_this->field_0x15c0 -= 29.0f; + } + } + + s16 spA = 65536.0f * (i_this->field_0x15c0 / (29.0f + AREG_F(9))); + cMtx_YrotS(*calc_mtx, spA + master->shape_angle.y + AREG_S(0) + 15000); + sp34.x = 0.0f; + sp34.y = -130.0f + AREG_F(8); + sp34.z = 300.0f + AREG_F(10); + MtxPosition(&sp34, &sp28); + + cLib_addCalc2(&i_this->speedF, 1000.0f, 1.0f, 1.0f + YREG_F(15)); + cLib_addCalc2(&i_this->current.pos.x, master->field_0x6c0.x + sp28.x, 0.5f, i_this->speedF); + cLib_addCalc2(&i_this->current.pos.y, master->field_0x6c0.y + sp28.y, 0.1f, 0.02f * i_this->speedF * master->field_0x5d8); + cLib_addCalc2(&i_this->current.pos.z, master->field_0x6c0.z + sp28.z, 0.5f, i_this->speedF); + + if (master->field_0x68a & 2) { + master->field_0x68a &= ~2; + + fopAc_ac_c* player = dComIfGp_getPlayer(0); + i_this->speedF = 80.0f + TREG_F(15); + sp34 = player->current.pos - i_this->current.pos; + i_this->current.angle.y = cM_atan2s(sp34.x, sp34.z); + + s16 sp8 = i_this->current.angle.y - master->shape_angle.y; + if (sp8 > 0x3000) { + i_this->current.angle.y = master->shape_angle.y + 0x3000; + } else if (sp8 < -0x3000) { + i_this->current.angle.y = master->shape_angle.y - 0x3000; + } + + if (player->current.pos.y - master->current.pos.y > 50.0f) { + i_this->speed.y = 40.0f + TREG_F(12); + } else { + i_this->speed.y = 10.0f + TREG_F(16); + } + + i_this->mAction = ACTION_SHOT; + i_this->mMode = 0; + } + } } -/* ############################################################################################## */ -/* 807B7F60-807B7F64 0000A8 0004+00 0/1 0/0 0/0 .rodata @4391 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4391 = -50.0f; -COMPILER_STRIP_GATE(0x807B7F60, &lit_4391); -#pragma pop - -/* 807B7F64-807B7F68 0000AC 0004+00 0/2 0/0 0/0 .rodata @4392 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4392 = -1.0f; -COMPILER_STRIP_GATE(0x807B7F64, &lit_4392); -#pragma pop - /* 807B6594-807B6734 001CF4 01A0+00 1/1 0/0 0/0 .text wall_angle_get__FP15e_th_ball_class */ -static void wall_angle_get(e_th_ball_class* param_0) { - // NONMATCHING +static s16 wall_angle_get(e_th_ball_class* i_this) { + fopAc_ac_c* a_this = (fopAc_ac_c*)i_this; + dBgS_LinChk linchk; + cXyz sp28; + cXyz sp1C; + cXyz sp38[2]; + + cMtx_YrotS(*calc_mtx, a_this->current.angle.y); + sp28.x = 0.0f; + sp28.y = 0.0f; + sp28.z = -50.0f; + MtxPosition(&sp28, &sp1C); + sp1C += a_this->current.pos; + sp28.x = 5.0f; + sp28.y = 0.0f; + sp28.z = 200.0f; + + for (int i = 0; i < 2; i++) { + MtxPosition(&sp28, &sp38[i]); + sp28.x *= -1.0f; + sp38[i] += sp1C; + linchk.Set(&sp1C, &sp38[i], a_this); + + if (dComIfG_Bgsp().LineCross(&linchk)) { + sp38[i] = linchk.GetCross(); + } else { + OS_REPORT("E_TH_BALL WALL CHECK NON ??\n"); + return 35; + } + } + + sp28 = sp38[1] - sp38[0]; + return cM_atan2s(sp28.x, sp28.z) + 0x4000; } -/* ############################################################################################## */ -/* 807B7F68-807B7F6C 0000B0 0004+00 0/1 0/0 0/0 .rodata @4430 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4430 = -25.0f; -COMPILER_STRIP_GATE(0x807B7F68, &lit_4430); -#pragma pop - -/* 807B7F6C-807B7F70 0000B4 0004+00 0/1 0/0 0/0 .rodata @4431 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4431 = 15.0f; -COMPILER_STRIP_GATE(0x807B7F6C, &lit_4431); -#pragma pop - -/* 807B7F70-807B7F74 0000B8 0004+00 0/2 0/0 0/0 .rodata @4432 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4432 = 100.0f; -COMPILER_STRIP_GATE(0x807B7F70, &lit_4432); -#pragma pop - -/* 807B7F74-807B7F78 0000BC 0004+00 0/3 0/0 0/0 .rodata @4433 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4433 = 30.0f; -COMPILER_STRIP_GATE(0x807B7F74, &lit_4433); -#pragma pop - -/* 807B7F78-807B7F7C 0000C0 0004+00 0/1 0/0 0/0 .rodata @4434 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4434 = 4000.0f; -COMPILER_STRIP_GATE(0x807B7F78, &lit_4434); -#pragma pop - -/* 807B7F7C-807B7F80 0000C4 0004+00 0/2 0/0 0/0 .rodata @4435 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4435 = 3.0f / 10.0f; -COMPILER_STRIP_GATE(0x807B7F7C, &lit_4435); -#pragma pop - -/* 807B7F80-807B7F84 0000C8 0004+00 0/1 0/0 0/0 .rodata @4436 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4436 = 160.0f; -COMPILER_STRIP_GATE(0x807B7F80, &lit_4436); -#pragma pop - /* 807B6734-807B69A4 001E94 0270+00 1/1 0/0 0/0 .text e_th_ball_shot__FP15e_th_ball_class */ -static void e_th_ball_shot(e_th_ball_class* param_0) { - // NONMATCHING +static void e_th_ball_shot(e_th_ball_class* i_this) { + cXyz sp28; + cXyz sp1C; + s8 sp8 = 1; + f32 temp_f31 = i_this->speedF; + + switch (i_this->mMode) { + case 1: + break; + case 0: + i_this->mMode = 1; + break; + case 2: + sp8 = 0; + cLib_addCalc2(&i_this->speedF, -25.0f, 1.0f, 15.0f + AREG_F(7)); + if (i_this->speedF > 0.0f) { + cLib_addCalc2(&i_this->field_0xde4, 100.0f + JREG_F(0), 1.0f, 30.0f + JREG_F(1)); + + sp28 = i_this->current.pos - master->field_0x6c0; + s16 spE = cM_atan2s(sp28.x, sp28.z); + cLib_addCalcAngleS2(&i_this->shape_angle.y, spE, 1, 0x4000); + cLib_addCalcAngleS2(&i_this->shape_angle.x, 0, 1, 0x4000); + } else if (temp_f31 > 0.0f) { + i_this->current.angle.y += (s16)cM_rndFX(4000.0f); + i_this->speed.y = 20.0f + AREG_F(5); + } + + if (i_this->speedF < -20.0f + AREG_F(6)) { + i_this->mAction = ACTION_RETURN; + i_this->mMode = 0; + } + break; + } + + normal_move(i_this, sp8); + + if (i_this->speedF > 0.0f && i_this->mAcch.ChkWallHit()) { + s16 wall_angle = wall_angle_get(i_this); + i_this->mSound.startCollisionSE(Z2SE_HIT_HAMMER, dKy_pol_sound_get(&i_this->mAcchCir)); + + if (wall_angle != 35) { + s16 spA = i_this->current.angle.y - wall_angle; + i_this->current.angle.y += (s16)(0x8000 - (spA * 2)); + i_this->speedF *= 0.3f + AREG_F(14); + } else { + i_this->current.angle.y -= 0x8000; + i_this->speedF *= 0.3f + AREG_F(14); + } + + i_this->mAction = ACTION_RETURN; + i_this->mMode = 0; + i_this->mTimers[0] = 30; + } + + if (i_this->mMode == 1 && i_this->field_0xdcc > 160.0f + AREG_F(3)) { + i_this->mMode = 2; + } } -/* ############################################################################################## */ -/* 807B7F84-807B7F88 0000CC 0004+00 0/1 0/0 0/0 .rodata @4508 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4508 = -40.0f; -COMPILER_STRIP_GATE(0x807B7F84, &lit_4508); -#pragma pop - -/* 807B7F88-807B7F8C 0000D0 0004+00 0/1 0/0 0/0 .rodata @4509 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4509 = 8.0f; -COMPILER_STRIP_GATE(0x807B7F88, &lit_4509); -#pragma pop - -/* 807B7F8C-807B7F90 0000D4 0004+00 0/1 0/0 0/0 .rodata @4510 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4510 = 3000.0f; -COMPILER_STRIP_GATE(0x807B7F8C, &lit_4510); -#pragma pop - -/* 807B7F90-807B7F94 0000D8 0004+00 0/1 0/0 0/0 .rodata @4511 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4511 = 6000.0f; -COMPILER_STRIP_GATE(0x807B7F90, &lit_4511); -#pragma pop - /* 807B69A4-807B6D00 002104 035C+00 1/1 0/0 0/0 .text e_th_ball_return__FP15e_th_ball_class */ -static void e_th_ball_return(e_th_ball_class* param_0) { - // NONMATCHING +static void e_th_ball_return(e_th_ball_class* i_this) { + cXyz sp18; + cXyz spC; + + MTXCopy(master->mpModelMorf->getModel()->getAnmMtx(0x14), *calc_mtx); + spC.set(0.0f, 0.0f, 0.0f); + MtxPosition(&spC, &sp18); + sp18 -= i_this->current.pos; + s16 temp_r28 = cM_atan2s(-sp18.x, -sp18.z); + s8 sp8 = 1; + + switch (i_this->mMode) { + case 0: + if (master->field_0x68a & 1) { + master->field_0x68a &= ~1; + i_this->mMode = 1; + } + + if (i_this->mTimers[0] == 0) { + i_this->field_0x15c6 = 1; + } + break; + case 1: + cLib_addCalc2(&i_this->speedF, -40.0f, 1.0f, 8.0f); + cLib_addCalcAngleS2(&i_this->shape_angle.y, temp_r28, 1, 0x1000); + cLib_addCalcAngleS2(&i_this->shape_angle.x, 0, 1, 0x1000); + + sp8 = 0; + i_this->current.angle.y = temp_r28; + cLib_addCalcAngleS2(&i_this->current.angle.x, 0, 1, 0x1000); + + if (i_this->speedF <= -40.0f) { + i_this->speedF = -40.0f + BREG_F(15); + i_this->speed.y = 30.0f + BREG_F(16); + i_this->shape_angle.y = cM_rndFX(3000.0f); + i_this->shape_angle.x = cM_rndFX(3000.0f); + i_this->field_0xde4 = 100.0f + JREG_F(2); + i_this->mMode = 2; + } + /* fallthrough */ + case 2: + i_this->current.angle.y = temp_r28; + + if (sp18.abs() < 80.0f + AREG_F(18)) { + i_this->speed.y = 0.0f; + i_this->speedF = 10.0f; + i_this->mMode = 3; + i_this->current.angle.y += (s16)cM_rndFX(6000.0f); + } else if (fabsf(i_this->speedF) < 0.1f) { + i_this->mMode = 3; + } + break; + case 3: + if (fabsf(i_this->speedF) < 0.1f) { + i_this->mAction = ACTION_STOP; + i_this->mMode = 0; + } + break; + } + + normal_move(i_this, sp8); } -/* ############################################################################################## */ -/* 807B7F94-807B7F98 0000DC 0004+00 0/1 0/0 0/0 .rodata @4529 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4529 = 45.0f; -COMPILER_STRIP_GATE(0x807B7F94, &lit_4529); -#pragma pop - -/* 807B7F98-807B7F9C 0000E0 0004+00 0/1 0/0 0/0 .rodata @4530 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4530 = 130.0f; -COMPILER_STRIP_GATE(0x807B7F98, &lit_4530); -#pragma pop - /* 807B6D00-807B6DC8 002460 00C8+00 1/1 0/0 0/0 .text e_th_ball_end__FP15e_th_ball_class */ -static void e_th_ball_end(e_th_ball_class* param_0) { - // NONMATCHING +static void e_th_ball_end(e_th_ball_class* i_this) { + cLib_addCalc0(&i_this->speedF, 1.0f, 1.0f + TREG_F(17)); + normal_move(i_this, 1); + daPy_py_c::setLookPos(&i_this->current.pos); + i_this->mCcSph.SetR(45.0f); + + if (i_this->mDemoMode == 0 && fopAcM_searchPlayerDistance(i_this) < 130.0f) { + dComIfGp_setDoStatusForce(0x35, 0); + if (mDoCPd_c::getTrigA(PAD_1)) { + i_this->mDemoMode = 1; + } + } } -/* ############################################################################################## */ -/* 807B7F9C-807B7FA0 0000E4 0004+00 0/1 0/0 0/0 .rodata @4650 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4650 = 1.0f / 25.0f; -COMPILER_STRIP_GATE(0x807B7F9C, &lit_4650); -#pragma pop - -/* 807B7FA0-807B7FA4 0000E8 0004+00 0/1 0/0 0/0 .rodata @4651 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const lit_4651 = 0x3B03126F; -COMPILER_STRIP_GATE(0x807B7FA0, &lit_4651); -#pragma pop - -/* 807B7FA4-807B7FA8 0000EC 0004+00 0/1 0/0 0/0 .rodata @4652 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4652 = 1.0f / 20.0f; -COMPILER_STRIP_GATE(0x807B7FA4, &lit_4652); -#pragma pop - -/* 807B7FA8-807B7FAC 0000F0 0004+00 0/1 0/0 0/0 .rodata @4653 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4653 = 17.0f / 20.0f; -COMPILER_STRIP_GATE(0x807B7FA8, &lit_4653); -#pragma pop - -/* 807B7FAC-807B7FB0 0000F4 0004+00 0/1 0/0 0/0 .rodata @4654 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4654 = 12000.0f; -COMPILER_STRIP_GATE(0x807B7FAC, &lit_4654); -#pragma pop - -/* 807B7FB0-807B7FB4 0000F8 0004+00 0/1 0/0 0/0 .rodata @4655 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u32 const lit_4655 = 0x3D0F5C29; -COMPILER_STRIP_GATE(0x807B7FB0, &lit_4655); -#pragma pop - -/* 807B7FC0-807B7FC0 000108 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_807B7FC0 = "E_th"; -#pragma pop - /* 807B6DC8-807B7454 002528 068C+00 1/1 0/0 0/0 .text action__FP15e_th_ball_class */ -static void action(e_th_ball_class* param_0) { - // NONMATCHING +static void action(e_th_ball_class* i_this) { + f32 var_f31 = 0.0f; + f32 var_f30 = 1.0f; + f32 var_f28 = 0.02f; + f32 var_f29 = 0.04f; + + if (master->field_0x68a & 4) { + master->field_0x68a &= ~4; + i_this->mAction = ACTION_END; + i_this->mMode = 0; + } + + switch (i_this->mAction) { + case ACTION_STOP: + e_th_ball_stop(i_this); + var_f31 = 0.0f; + i_this->field_0x15c6 = 1; + var_f30 = TREG_F(13); + break; + case ACTION_SPIN: + e_th_ball_spin(i_this); + var_f30 = 1.0f + KREG_F(6); + var_f31 = 0.5f + KREG_F(7); + var_f28 = 0.002f + YREG_F(13); + var_f29 = 0.05f + YREG_F(14); + break; + case ACTION_SHOT: + e_th_ball_shot(i_this); + var_f30 = 0.85f + TREG_F(14); + var_f31 = TREG_F(3); + var_f29 = 0.05f + BREG_F(1); + i_this->field_0x1a8c = 1; + break; + case ACTION_RETURN: + if (i_this->mMode == 1) { + var_f31 = 1.0f + AREG_F(8); + var_f28 = 0.3f + AREG_F(9); + var_f30 = 1.0f + AREG_F(10); + var_f29 = 0.5f + AREG_F(11); + } else if (i_this->mMode == 0) { + var_f30 = 0.85f + TREG_F(14); + var_f31 = TREG_F(3); + var_f29 = 0.05f + BREG_F(1); + } else { + var_f31 = 0.0f; + var_f28 = 0.5f + AREG_F(9); + i_this->field_0x15c6 = 1; + var_f30 = TREG_F(13); + } + e_th_ball_return(i_this); + break; + case ACTION_END: + e_th_ball_end(i_this); + var_f31 = 0.0f; + i_this->field_0x15c6 = 1; + var_f30 = TREG_F(13); + i_this->field_0xdd0 = VREG_S(3) + 25; + break; + } + + i_this->mCcSph.SetC(i_this->current.pos); + + if (master->field_0x6ea != 0) { + i_this->mCcSph.OnTgShield(); + i_this->mCcSph.OffTgNoHitMark(); + } else { + i_this->mCcSph.OffTgShield(); + i_this->mCcSph.OnTgNoHitMark(); + } + + dComIfG_Ccsp()->Set(&i_this->mCcSph); + + cXyz at_sph_center(i_this->current.pos); + if (i_this->field_0x1a8c == 0) { + at_sph_center.x += 12000.0f; + } else { + i_this->field_0x1a8c = 0; + } + + i_this->mAtSph.SetC(at_sph_center); + dComIfG_Ccsp()->Set(&i_this->mAtSph); + + cLib_addCalc2(&i_this->field_0xdc8, var_f30, 1.0f, var_f29); + cLib_addCalc2(&i_this->field_0xdd4, var_f31, 1.0f, var_f28); + cLib_addCalc0(&i_this->field_0xde4, 1.0f, 10.0f + JREG_F(1)); + + if (i_this->field_0x15c6 == 0) { + cXyz sp2C = i_this->current.pos - master->field_0x6c0; + + s16 var_r27 = i_this->field_0xdc8 * (50.0f - ((0.035f + XREG_F(3)) * sp2C.abs())); + if (var_r27 < 0) { + var_r27 = 0; + } else if (var_r27 > 45) { + var_r27 = 45; + } + + s16 sp8; + if (fabsf(i_this->speedF) > 10.0f) { + sp8 = 10; + } else { + sp8 = 2; + } + cLib_addCalcAngleS2(&i_this->field_0xdd0, var_r27, 1, sp8); + } + + i_this->field_0x15c6 = 0; + i_this->field_0xde8 = (s16)((39 - i_this->field_0xdd0) / 4); + if (i_this->field_0xde8 < 0) { + i_this->field_0xde8 = 0; + } + + i_this->field_0x11d4 = (s16)((39 - i_this->field_0xdd0) / 2); + if (i_this->field_0x11d4 < 0) { + i_this->field_0x11d4 = 0; + } + + if (i_this->field_0x658 == 0) { + if (i_this->mCcSph.ChkTgHit()) { + i_this->field_0x658 = 10; + def_se_set(&i_this->mSound, i_this->mCcSph.GetTgHitObj(), 0x28, NULL); + } + + if (i_this->mAtSph.ChkAtHit()) { + cCcD_Obj* at_hit_obj = i_this->mAtSph.GetAtHitObj(); + fopAc_ac_c* at_hit_actor = dCc_GetAc(at_hit_obj->GetAc()); + + if (i_this->mAction == ACTION_SPIN) { + if (fopAcM_GetName(at_hit_actor) == PROC_Obj_THASHI) { + i_this->speedF = 30.0f + TREG_F(18); + + cXyz sp20 = i_this->current.pos - master->current.pos; + i_this->current.angle.y = cM_atan2s(sp20.x, sp20.z); + i_this->speed.y = TREG_F(16); + i_this->mAction = ACTION_SHOT; + i_this->mMode = 0; + + master->mAction = ACTION_RETURN; + master->mMode = 2; + master->field_0x69c[0] = JREG_S(4) + 30; + master->mpModelMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("E_th", 0x1B), 2, 10.0f, 1.0f, 0.0f, -1.0f); + master->mAnm = 0x1B; + } + } else if (i_this->mAction == ACTION_SHOT && i_this->speedF > 0.0f && fopAcM_GetName(at_hit_actor) == PROC_E_MD) { + i_this->current.angle.y -= 0x8000; + i_this->speedF *= 0.3f + AREG_F(14); + i_this->mAction = ACTION_RETURN; + i_this->mMode = 0; + dComIfGp_getVibration().StartShock(VIBMODE_S_POWER6, 0x4F, cXyz(0.0f, 1.0f, 0.0f)); + } + } + } } -/* ############################################################################################## */ /* 807B80E4-807B80E8 000004 0004+00 1/1 0/0 0/0 .bss demo_id */ -static u8 demo_id[4]; +static fpc_ProcID demo_id; /* 807B7454-807B753C 002BB4 00E8+00 1/1 0/0 0/0 .text get_demo__FP15e_th_ball_class */ -static void get_demo(e_th_ball_class* param_0) { - // NONMATCHING +static void get_demo(e_th_ball_class* i_this) { + cXyz sp14; + cXyz sp8; + + switch (i_this->mDemoMode) { + case 0: + break; + case 1: + demo_id = fopAcM_createItemForTrBoxDemo(&i_this->current.pos, fpcNm_ITEM_IRONBALL, -1, fopAcM_GetRoomNo(i_this), NULL, NULL); + JUT_ASSERT(1670, demo_id != fpcM_ERROR_PROCESS_ID_e); + i_this->mDemoMode = 2; + break; + case 2: + if (i_this->eventInfo.checkCommandItem()) { + if (demo_id != fpcM_ERROR_PROCESS_ID_e) { + dComIfGp_event_setItemPartnerId(demo_id); + } + + i_this->mPlayerGet = TRUE; + dComIfGs_onSaveSwitch(95); + } else { + fopAcM_orderItemEvent(i_this, 0, 0); + i_this->eventInfo.onCondition(8); + } + } } /* 807B753C-807B7744 002C9C 0208+00 2/1 0/0 0/0 .text daE_TH_BALL_Execute__FP15e_th_ball_class */ -static void daE_TH_BALL_Execute(e_th_ball_class* param_0) { - // NONMATCHING +static int daE_TH_BALL_Execute(e_th_ball_class* i_this) { + cXyz sp14; + cXyz sp8; + + if (i_this->mPlayerGet) { + return 1; + } + + master = (e_th_class*)fopAcM_SearchByID(i_this->parentActorID); + if (master == NULL) { + return 1; + } + + i_this->mCounter++; + + for (int i = 0; i < 3; i++) { + if (i_this->mTimers[i] != 0) { + i_this->mTimers[i]--; + } + } + + if (i_this->field_0x658 != 0) { + i_this->field_0x658--; + } + + action(i_this); + + 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->current.angle.y); + mDoMtx_stack_c::XrotM(i_this->current.angle.x); + mDoMtx_stack_c::YrotM(i_this->shape_angle.y); + mDoMtx_stack_c::XrotM(i_this->shape_angle.x - 0x4000); + mDoMtx_stack_c::YrotM(-i_this->current.angle.y + i_this->shape_angle.z); + mDoMtx_stack_c::transM(0.0f, 55.0f + XREG_F(4), 0.0f); + i_this->mpBallModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + mDoMtx_stack_c::transM(0.0f, 0.0f, 0.0f); + mDoMtx_stack_c::multVecZero(&i_this->field_0xdd8); + + chain_control_01(i_this); + chain_control_02(i_this); + chain_control_03(i_this); + chain_control_11(i_this); + chain_control_12(i_this); + chain_control_13(i_this); + chain_control_21(i_this); + get_demo(i_this); + + i_this->mSound.framework(0, dComIfGp_getReverb(fopAcM_GetRoomNo(i_this))); + return 1; } /* 807B7744-807B774C 002EA4 0008+00 1/0 0/0 0/0 .text daE_TH_BALL_IsDelete__FP15e_th_ball_class */ -static bool daE_TH_BALL_IsDelete(e_th_ball_class* param_0) { - return true; +static int daE_TH_BALL_IsDelete(e_th_ball_class* i_this) { + return 1; } -/* ############################################################################################## */ -/* 807B7FC0-807B7FC0 000108 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_807B7FC5 = "E_th_ball"; -#pragma pop - /* 807B774C-807B77AC 002EAC 0060+00 1/0 0/0 0/0 .text daE_TH_BALL_Delete__FP15e_th_ball_class */ -static void daE_TH_BALL_Delete(e_th_ball_class* param_0) { - // NONMATCHING +static int daE_TH_BALL_Delete(e_th_ball_class* i_this) { + fopAcM_GetID(i_this); + dComIfG_resDelete(&i_this->mPhase, "E_th_ball"); + + if (i_this->heap != NULL) { + i_this->mSound.deleteObject(); + } + + return 1; } /* 807B77AC-807B792C 002F0C 0180+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* a_this) { + e_th_ball_class* i_this = (e_th_ball_class*)a_this; + + void* modelData = dComIfG_getObjectRes("E_th_ball", 4); + JUT_ASSERT(1839, modelData != 0); + i_this->mpBallModel = mDoExt_J3DModel__create((J3DModelData*)modelData, 0, 0x11000084); + if (i_this->mpBallModel == NULL) { + return 0; + } + + modelData = dComIfG_getObjectRes("E_th_ball", 7); + JUT_ASSERT(1851, modelData != 0); + for (int i = 0; i < 50; i++) { + i_this->field_0x65c.mp_model[i] = mDoExt_J3DModel__create((J3DModelData*)modelData, 0x80000, 0x11000084); + if (i_this->field_0x65c.mp_model[i] == NULL) { + return 0; + } + } + + for (int i = 0; i < 20; i++) { + i_this->field_0xdec.mp_model[i] = mDoExt_J3DModel__create((J3DModelData*)modelData, 0x80000, 0x11000084); + if (i_this->field_0xdec.mp_model[i] == NULL) { + return 0; + } + } + + for (int i = 0; i < 20; i++) { + i_this->field_0x11d8.mp_model[i] = mDoExt_J3DModel__create((J3DModelData*)modelData, 0x80000, 0x11000084); + if (i_this->field_0x11d8.mp_model[i] == NULL) { + return 0; + } + } + + return 1; } -/* ############################################################################################## */ -/* 807B7FB4-807B7FB8 0000FC 0004+00 0/1 0/0 0/0 .rodata @4827 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4827 = -2000.0f; -COMPILER_STRIP_GATE(0x807B7FB4, &lit_4827); -#pragma pop - -/* 807B7FB8-807B7FBC 000100 0004+00 0/1 0/0 0/0 .rodata @4828 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4828 = -1000.0f; -COMPILER_STRIP_GATE(0x807B7FB8, &lit_4828); -#pragma pop - -/* 807B7FBC-807B7FC0 000104 0004+00 0/1 0/0 0/0 .rodata @4829 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4829 = 2000.0f; -COMPILER_STRIP_GATE(0x807B7FBC, &lit_4829); -#pragma pop - -/* 807B7FD0-807B8010 000000 0040+00 1/1 0/0 0/0 .data cc_sph_src$4795 */ -static dCcD_SrcSph cc_sph_src = { - { - {0x0, {{0x0, 0x0, 0x0}, {0xd8ebfdff, 0x3}, 0x75}}, // mObj - {dCcD_SE_NONE, 0x1, 0x2, 0x0, 0x0}, // mGObjAt - {dCcD_SE_METAL, 0x2, 0x0, 0x0, 0x3}, // mGObjTg - {0x0}, // mGObjCo - }, // mObjInf - { - {{0.0f, 0.0f, 0.0f}, 55.0f} // mSph - } // mSphAttr -}; - -/* 807B8010-807B8050 000040 0040+00 1/1 0/0 0/0 .data at_sph_src$4796 */ -static dCcD_SrcSph at_sph_src = { - { - {0x0, {{AT_TYPE_CSTATUE_BOSS_SWING, 0x4, 0x1d}, {0x0, 0x0}, 0x0}}, // mObj - {dCcD_SE_NONE, 0x1, 0xe, 0x0, 0x0}, // mGObjAt - {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg - {0x0}, // mGObjCo - }, // mObjInf - { - {{0.0f, 0.0f, 0.0f}, 55.0f} // mSph - } // mSphAttr -}; - /* 807B792C-807B7AA8 00308C 017C+00 1/0 0/0 0/0 .text daE_TH_BALL_Create__FP10fopAc_ac_c */ -static void daE_TH_BALL_Create(fopAc_ac_c* param_0) { - // NONMATCHING +static int daE_TH_BALL_Create(fopAc_ac_c* a_this) { + e_th_ball_class* i_this = (e_th_ball_class*)a_this; + fopAcM_SetupActor(i_this, e_th_ball_class); + + int phase_state = dComIfG_resLoad(&i_this->mPhase, "E_th_ball"); + if (phase_state == cPhs_COMPLEATE_e) { + OS_REPORT("E_TH_BALL PARAM %x\n", fopAcM_GetParam(a_this)); + OS_REPORT("E_TH_BALL//////////////E_TH_BALL SET 1 !!\n"); + + if (!fopAcM_entrySolidHeap(a_this, useHeapInit, 0x4B000)) { + OS_REPORT("//////////////E_TH_BALL SET NON !!\n"); + return cPhs_ERROR_e; + } + + OS_REPORT("//////////////E_TH_BALL SET 2 !!\n"); + + fopAcM_SetMtx(i_this, i_this->mpBallModel->getBaseTRMtx()); + fopAcM_SetMin(i_this, -2000.0f, -1000.0f, -2000.0f); + fopAcM_SetMax(i_this, 2000.0f, 1000.0f, 2000.0f); + + i_this->mCcStts.Init(0xF0, 0, i_this); + + static dCcD_SrcSph cc_sph_src = { + { + {0x0, {{0x0, 0x0, 0x0}, {0xd8ebfdff, 0x3}, 0x75}}, // mObj + {dCcD_SE_NONE, 0x1, 0x2, 0x0, 0x0}, // mGObjAt + {dCcD_SE_METAL, 0x2, 0x0, 0x0, 0x3}, // mGObjTg + {0x0}, // mGObjCo + }, // mObjInf + { + {{0.0f, 0.0f, 0.0f}, 55.0f} // mSph + } // mSphAttr + }; + + static dCcD_SrcSph at_sph_src = { + { + {0x0, {{AT_TYPE_CSTATUE_BOSS_SWING, 0x4, 0x1d}, {0x0, 0x0}, 0x0}}, // mObj + {dCcD_SE_NONE, 0x1, 0xe, 0x0, 0x0}, // mGObjAt + {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg + {0x0}, // mGObjCo + }, // mObjInf + { + {{0.0f, 0.0f, 0.0f}, 55.0f} // mSph + } // mSphAttr + }; + + i_this->mCcSph.Set(cc_sph_src); + i_this->mCcSph.SetStts(&i_this->mCcStts); + i_this->mAtSph.Set(at_sph_src); + i_this->mAtSph.SetStts(&i_this->mCcStts); + + i_this->mSound.init(&i_this->current.pos, NULL, 3, 1); + + i_this->mAcch.Set(fopAcM_GetPosition_p(a_this), fopAcM_GetOldPosition_p(a_this), a_this, 1, &i_this->mAcchCir, fopAcM_GetSpeed_p(a_this), NULL, NULL); + i_this->mAcchCir.SetWall(50.0f, 50.0f); + + daE_TH_BALL_Execute(i_this); + } + + return phase_state; } -/* ############################################################################################## */ /* 807B8050-807B8070 -00001 0020+00 1/0 0/0 0/0 .data l_daE_TH_BALL_Method */ static actor_method_class l_daE_TH_BALL_Method = { - (process_method_func)daE_TH_BALL_Create__FP10fopAc_ac_c, - (process_method_func)daE_TH_BALL_Delete__FP15e_th_ball_class, - (process_method_func)daE_TH_BALL_Execute__FP15e_th_ball_class, - (process_method_func)daE_TH_BALL_IsDelete__FP15e_th_ball_class, - (process_method_func)daE_TH_BALL_Draw__FP15e_th_ball_class, + (process_method_func)daE_TH_BALL_Create, + (process_method_func)daE_TH_BALL_Delete, + (process_method_func)daE_TH_BALL_Execute, + (process_method_func)daE_TH_BALL_IsDelete, + (process_method_func)daE_TH_BALL_Draw, }; /* 807B8070-807B80A0 -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_TH_BALL */ @@ -793,83 +1171,3 @@ extern actor_process_profile_definition g_profile_E_TH_BALL = { fopAc_ENEMY_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType }; - -/* 807B80A0-807B80AC 0000D0 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, -}; - -/* 807B80AC-807B80B8 0000DC 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, -}; - -/* 807B80B8-807B80DC 0000E8 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_807B7EA8, - (void*)NULL, - (void*)NULL, - (void*)func_807B7EA0, -}; - -/* 807B7AA8-807B7D5C 003208 02B4+00 1/1 0/0 0/0 .text __ct__15e_th_ball_classFv */ -e_th_ball_class::e_th_ball_class() { - // NONMATCHING -} - -/* 807B7D5C-807B7DA4 0034BC 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGSphFv */ -// cM3dGSph::~cM3dGSph() { -extern "C" void __dt__8cM3dGSphFv() { - // NONMATCHING -} - -/* 807B7DA4-807B7DEC 003504 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGAabFv */ -// cM3dGAab::~cM3dGAab() { -extern "C" void __dt__8cM3dGAabFv() { - // NONMATCHING -} - -/* 807B7DEC-807B7E5C 00354C 0070+00 3/2 0/0 0/0 .text __dt__12dBgS_ObjAcchFv */ -// dBgS_ObjAcch::~dBgS_ObjAcch() { -extern "C" void __dt__12dBgS_ObjAcchFv() { - // NONMATCHING -} - -/* 807B7E5C-807B7E98 0035BC 003C+00 1/1 0/0 0/0 .text __dt__5csXyzFv */ -// csXyz::~csXyz() { -extern "C" void __dt__5csXyzFv() { - // NONMATCHING -} - -/* 807B7E98-807B7E9C 0035F8 0004+00 1/1 0/0 0/0 .text __ct__5csXyzFv */ -// csXyz::csXyz() { -extern "C" void __ct__5csXyzFv() { - /* empty function */ -} - -/* 807B7E9C-807B7EA0 0035FC 0004+00 1/1 0/0 0/0 .text __ct__4cXyzFv */ -// cXyz::cXyz() { -extern "C" void __ct__4cXyzFv() { - /* empty function */ -} - -/* 807B7EA0-807B7EA8 003600 0008+00 1/0 0/0 0/0 .text @36@__dt__12dBgS_ObjAcchFv */ -static void func_807B7EA0() { - // NONMATCHING -} - -/* 807B7EA8-807B7EB0 003608 0008+00 1/0 0/0 0/0 .text @20@__dt__12dBgS_ObjAcchFv */ -static void func_807B7EA8() { - // NONMATCHING -} - -/* 807B7FC0-807B7FC0 000108 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */