Match d_a_fallrock to 99% (#792)

* Match d_a_fallrock to 99%

* Match execute function
This commit is contained in:
Ammar Askar
2025-06-20 10:50:07 -07:00
committed by GitHub
parent 4aadd65d72
commit 5f99677cb7
2 changed files with 223 additions and 14 deletions
+19 -3
View File
@@ -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 */
+204 -11
View File
@@ -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, &current.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, &current.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 = {