From 5f99677cb7cb58b8078bcc529186c89c67bf6312 Mon Sep 17 00:00:00 2001 From: Ammar Askar Date: Fri, 20 Jun 2025 10:50:07 -0700 Subject: [PATCH] Match d_a_fallrock to 99% (#792) * Match d_a_fallrock to 99% * Match execute function --- include/d/actor/d_a_fallrock.h | 22 +++- src/d/actor/d_a_fallrock.cpp | 215 +++++++++++++++++++++++++++++++-- 2 files changed, 223 insertions(+), 14 deletions(-) diff --git a/include/d/actor/d_a_fallrock.h b/include/d/actor/d_a_fallrock.h index 6efde7d7c..068b65542 100644 --- a/include/d/actor/d_a_fallrock.h +++ b/include/d/actor/d_a_fallrock.h @@ -1,24 +1,40 @@ #ifndef D_A_FALLROCK_H #define D_A_FALLROCK_H +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" #include "f_op/f_op_actor.h" class dCcD_SrcCyl; class daFallRock_c : public fopAc_ac_c { public: + ~daFallRock_c(); + inline cPhs_State create(); inline BOOL draw(); inline BOOL execute(); - void CreateHeap(); + BOOL CreateHeap(); void set_mtx(); void setParticle(int, cXyz*); + static char m_arcname[]; + static f32 m_fallen; + static s16 m_rot_speed; + static const dCcD_SrcCyl m_cyl_src; public: - /* Place member variables here */ -}; + /* 0x290 */ J3DModel* mpModel; + /* 0x294 */ request_of_phase_process_class mPhs; + /* 0x29C */ dBgS_ObjAcch field_0x29C; + /* 0x460 */ dBgS_AcchCir field_0x460; + /* 0x4A0 */ dCcD_Stts mStts; + /* 0x4DC */ dCcD_Cyl mCyl; + /* 0x60C */ GXColor field_0x60C; + /* 0x610 */ f32 field_0x610; + /* 0x614 */ int field_0x614; +}; // Size: 0x618 #endif /* D_A_FALLROCK_H */ diff --git a/src/d/actor/d_a_fallrock.cpp b/src/d/actor/d_a_fallrock.cpp index 6c0d0927f..647159ed2 100644 --- a/src/d/actor/d_a_fallrock.cpp +++ b/src/d/actor/d_a_fallrock.cpp @@ -4,9 +4,18 @@ // #include "d/actor/d_a_fallrock.h" +#include "d/res/res_always.h" +#include "d/d_com_inf_game.h" #include "d/d_procname.h" #include "d/d_priority.h" #include "d/d_cc_d.h" +#include "f_op/f_op_actor_mng.h" +#include "f_op/f_op_kankyo_mng.h" + + +char daFallRock_c::m_arcname[] = "Always"; +f32 daFallRock_c::m_fallen = 7000.0f; +s16 daFallRock_c::m_rot_speed = 0x3E8; const dCcD_SrcCyl daFallRock_c::m_cyl_src = { // dCcD_SrcGObjInf @@ -40,23 +49,48 @@ const dCcD_SrcCyl daFallRock_c::m_cyl_src = { /* 00000078-00000098 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daFallRock_c*) i_this)->CreateHeap(); } /* 00000098-00000140 .text CreateHeap__12daFallRock_cFv */ -void daFallRock_c::CreateHeap() { - /* Nonmatching */ +BOOL daFallRock_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*) dComIfG_getObjectRes(m_arcname, ALWAYS_BDL_KROCK_00); + JUT_ASSERT(161, modelData != NULL); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000,0x11020002); + return TRUE; } /* 00000140-000001F0 .text set_mtx__12daFallRock_cFv */ void daFallRock_c::set_mtx() { - /* Nonmatching */ + J3DModel* model = mpModel; + model->setBaseScale(scale); + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::XYZrotM(shape_angle); + mDoMtx_stack_c::transM(0.0f, -(scale.x * 120.0f), 0.0f); + model->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 000001F0-000002B0 .text daFallRock_Draw__FP12daFallRock_c */ -static BOOL daFallRock_Draw(daFallRock_c*) { - /* Nonmatching */ +static BOOL daFallRock_Draw(daFallRock_c* i_this) { + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &i_this->current.pos, &i_this->tevStr); + g_env_light.setLightTevColorType(i_this->mpModel, &i_this->tevStr); + mDoExt_modelUpdate(i_this->mpModel); + + cXyz shadow_pos(i_this->current.pos); + + shadow_pos.y = i_this->field_0x29C.GetGroundH() + 100.0f; + + dComIfGd_setSimpleShadow2( + &shadow_pos, + i_this->field_0x29C.GetGroundH(), + i_this->scale.x * 90.0f, + i_this->field_0x29C.m_gnd + ); + + return TRUE; } /* 000002B0-000002D0 .text daFallRock_Execute__FP12daFallRock_c */ @@ -67,6 +101,69 @@ static BOOL daFallRock_Execute(daFallRock_c* i_this) { /* 000002D0-00000810 .text execute__12daFallRock_cFv */ BOOL daFallRock_c::execute() { /* Nonmatching */ + BOOL deleted = FALSE; + field_0x614++; + + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + field_0x29C.CrrPos(*dComIfG_Bgsp()); + + field_0x610 = fabs(speed.y) + (f64)field_0x610; + if (field_0x610 > m_fallen) { + if (deleted == FALSE) { + deleted = fopAcM_delete(this); + } + } + + if (field_0x29C.ChkGroundLanding()) { + setParticle(0, ¤t.pos); + fopAcM_seStart(this, JA_SE_OBJ_BREAK_ROCK, 0); + if (deleted == FALSE) { + deleted = fopAcM_delete(this); + } + } + + if (field_0x29C.ChkWaterIn()) { + if (scale.x < 1.3f) { + fopAcM_seStart(this, JA_SE_OBJ_FALL_WATER_M, 0); + } else { + fopAcM_seStart(this, JA_SE_OBJ_FALL_WATER_L, 0); + } + setParticle(2, ¤t.pos); + if (!deleted) { + deleted = fopAcM_delete(this); + } + } + + dBgS_ObjGndChk_Yogan chk; + + cXyz check_pos; + check_pos.set(old.pos.x, old.pos.y + scale.x * 120.0f, old.pos.z); + + chk.SetPos(&check_pos); + + f32 height = dComIfG_Bgsp()->GroundCross(&chk); + if (height != -G_CM3D_F_INF) { + if (height > current.pos.y + scale.x * 120.0f) { + if (scale.x < 1.3f) { + fopAcM_seStart(this, JA_SE_OBJ_FALL_MAGMA_M, 0); + } else { + fopAcM_seStart(this, JA_SE_OBJ_FALL_MAGMA_L, 0); + } + + check_pos.y = height; + setParticle(1, &check_pos); + if (!deleted) { + fopAcM_delete(this); + } + } + } + cLib_chaseAngleS(&shape_angle.x, shape_angle.x + m_rot_speed, m_rot_speed); + + set_mtx(); + mCyl.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCyl); + + return TRUE; } /* 00000E38-00000E40 .text daFallRock_IsDelete__FP12daFallRock_c */ @@ -75,8 +172,13 @@ static BOOL daFallRock_IsDelete(daFallRock_c*) { } /* 00000E40-00000E68 .text daFallRock_Delete__FP12daFallRock_c */ -static BOOL daFallRock_Delete(daFallRock_c*) { - /* Nonmatching */ +static BOOL daFallRock_Delete(daFallRock_c* i_this) { + i_this->~daFallRock_c(); + return TRUE; +} + +daFallRock_c::~daFallRock_c() { + dComIfG_resDelete(&mPhs, m_arcname); } /* 00001030-00001050 .text daFallRock_Create__FP10fopAc_ac_c */ @@ -86,12 +188,103 @@ static cPhs_State daFallRock_Create(fopAc_ac_c* i_this) { /* 00001050-0000127C .text create__12daFallRock_cFv */ cPhs_State daFallRock_c::create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daFallRock_c); + + cPhs_State res = dComIfG_resLoad(&mPhs, m_arcname); + if (res == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0xB80)) { + return cPhs_ERROR_e; + } + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + + mStts.Init(0xFF, 0xFF, this); + mCyl.Set(m_cyl_src); + mCyl.SetStts(&mStts); + + mCyl.SetH(scale.x * 120.0f); + mCyl.SetR(scale.x * 90.0f); + field_0x460.SetWall(30.0f, 30.0f); + field_0x29C.Set( + fopAcM_GetPosition_p(this), + fopAcM_GetOldPosition_p(this), + this, + 1, + &field_0x460, + fopAcM_GetSpeed_p(this) + ); + set_mtx(); + + gravity = -5.0f; + speedF = 0.0f; + fopAcM_SetMaxFallSpeed(this, -70.0f); + field_0x610 = 0.0f; + field_0x29C.ClrWaterNone(); + } + + return res; } /* 00001588-00001794 .text setParticle__12daFallRock_cFiP4cXyz */ -void daFallRock_c::setParticle(int, cXyz*) { +void daFallRock_c::setParticle(int param_1, cXyz* pos) { /* Nonmatching */ + cXyz particle_scale(5.0f, 5.0f, 5.0f); + + field_0x60C.r = tevStr.mColorC0.r; + field_0x60C.g = tevStr.mColorC0.g; + field_0x60C.b = tevStr.mColorC0.b; + field_0x60C.a = tevStr.mColorC0.a; + + particle_scale.setall(particle_scale.x * scale.x); + + cXyz pos_copy = *pos; + + switch (param_1) { + case 0: { + dComIfGp_particle_set( + dPa_name::ID_COMMON_03E3, + &pos_copy, + NULL, + &particle_scale, + 0xFF, + NULL, + -1, + &tevStr.mColorK0, + &tevStr.mColorK0 + ); + + J3DModelData* modelData = (J3DModelData*) + dComIfG_getObjectRes(m_arcname, ALWAYS_BDL_MPI_KOISHI); + J3DAnmTexPattern* anmTexPattern = (J3DAnmTexPattern*) + dComIfG_getObjectRes(m_arcname, ALWAYS_BTP_MPI_KOISHI); + + JPABaseEmitter* emitter = dComIfGp_particle_set( + dPa_name::ID_COMMON_03E2, + &pos_copy, + NULL, + &particle_scale, + 0xFF, + NULL, + -1, + &field_0x60C, + &tevStr.mColorK0 + ); + if (emitter != NULL && modelData != NULL && anmTexPattern != NULL) { + dPa_J3DmodelEmitter_c* modelEmitter = new dPa_J3DmodelEmitter_c( + emitter, modelData, tevStr, anmTexPattern, 0, 0 + ); + if (modelEmitter != NULL) { + dComIfGp_particle_addModelEmitter(modelEmitter); + } + } + break; + } + case 1: + fopKyM_createMpillar(pos, scale.x); + break; + case 2: + fopKyM_createWpillar(pos, scale.x, 1.0f, 0); + break; + } } static actor_method_class l_daFallRock_Method = {