mirror of
https://github.com/zeldaret/tww.git
synced 2026-09-07 02:59:59 -04:00
Match d_a_fallrock to 99% (#792)
* Match d_a_fallrock to 99% * Match execute function
This commit is contained in:
@@ -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
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user