d_a_obj_jump (#997)

* start work on d_a_obj_jump

* rough pass over all functions

* fix CreateHeap

* mode_wait 99%

* mode_lower 99%

* draw 99%

* attr accessor

* fixes for Create

* match rideCB with weirg pointer arithmetic

* Execute 99%

* jnodeCB_lower 96%

* set_mtx 99%

* fix set_push_flag

* Create 96%

* retype field

* cleanup

* tiny fix

* split class fields + call inline functions

* Attr_c struct fields + prm_get_type

* fix class fields + match Mthd_Create + 90+% Create and jnodeCB_lower

* improve redability for rideCB

* Create 100%

* add Prm_e enum

* clean unnecessary return and this->

---------

Co-authored-by: marian <marian.muller@serli.com>
This commit is contained in:
marian-m12l
2026-05-19 23:13:38 +02:00
committed by GitHub
parent d5d5a23a0c
commit 0568d6fe35
2 changed files with 400 additions and 34 deletions
+74 -7
View File
@@ -4,10 +4,43 @@
#include "d/d_bg_s_movebg_actor.h"
#include "f_op/f_op_actor.h"
#include "d/d_bg_w.h"
#include "d/d_bg_s_gnd_chk.h"
class J3DNode;
namespace daObjJump {
struct Attr_c {
/* 0x00 */ u32 resSize;
/* 0x04 */ s16 resIndex;
/* 0x06 */ s16 field_0x006;
/* 0x08 */ SVec cullSizeBoxMin;
/* 0x0e */ SVec cullSizeBoxMax;
/* 0x14 */ u8 field_0x014;
/* 0x15 */ u8 field_0x015;
/* 0x16 */ u16 field_0x016;
/* 0x18 */ float field_0x018;
/* 0x1C */ float field_0x01C;
/* 0x20 */ float field_0x020;
/* 0x24 */ float field_0x024;
/* 0x28 */ float field_0x028;
/* 0x2C */ float field_0x02C;
/* 0x30 */ float field_0x030;
/* 0x34 */ float field_0x034;
/* 0x38 */ float field_0x038;
/* 0x3c */ float field_0x03C;
/* 0x40 */ u8 field_0x040;
/* 0x41 */ u8 field_0x041;
/* 0x42 */ u8 field_0x042;
/* 0x43 */ u8 field_0x043;
/* 0x44 */ u8 field_0x044;
/* 0x45 */ u8 field_0x045;
/* 0x46 */ u8 field_0x046;
/* 0x47 */ u8 field_0x047;
/* 0x48 */ u8 field_0x048;
/* 0x49 */ u8 field_0x049[0x4c - 0x49];
/* 0x4c */ float field_0x04C;
}; // Size: 0x50
class Act_c : public dBgS_MoveBgActor {
public:
static u32 prm_make_b() {
@@ -18,8 +51,13 @@ namespace daObjJump {
current.pos = *pos;
m336 = 1;
}
void attr() const {}
void prm_get_type() const {}
const Attr_c& attr() const { return M_attr[field_0x2D4]; }
enum Prm_e {
PRM_JUMP_W = 0x01,
PRM_JUMP_S = 0x00,
};
int prm_get_type() const { return daObj::PrmAbstract<Prm_e>(this, PRM_JUMP_W, PRM_JUMP_S); }
virtual BOOL CreateHeap();
virtual BOOL Create();
@@ -31,7 +69,7 @@ namespace daObjJump {
void set_push_flag();
void clear_push_flag();
void calc_vib_pos();
void rideCB(dBgW*, fopAc_ac_c*, fopAc_ac_c*);
static void rideCB(dBgW*, fopAc_ac_c*, fopAc_ac_c*);
static BOOL jnodeCB_lower(J3DNode*, int);
void mode_wait_init();
void mode_wait();
@@ -48,11 +86,40 @@ namespace daObjJump {
virtual BOOL Execute(Mtx**);
virtual BOOL Draw();
public:
/* 0x2C8 */ u8 m2C8[0x336 - 0x2C8];
static Mtx M_tmp_mtx;
static const char M_arcname[];
static const Attr_c M_attr[2];
public:
/* 0x2C8 */ request_of_phase_process_class mPhase;
/* 0x2D0 */ J3DModel* mModel;
/* 0x2D4 */ int field_0x2D4;
/* 0x2D8 */ dBgS_ObjGndChk field_0x2D8;
/* 0x32C */ f32 field_0x32C;
/* 0x330 */ int field_0x330;
/* 0x334 */ s16 field_0x334;
/* 0x336 */ u8 m336;
/* 0x337 */ u8 m337[0x358 - 0x337];
};
/* 0x337 */ u8 m337;
/* 0x338 */ f32 field_0x338;
/* 0x33C */ f32 field_0x33C;
/* 0x340 */ f32 field_0x340;
/* 0x344 */ u8 field_0x344;
/* 0x345 */ u8 field_0x345;
/* 0x346 */ u8 field_0x346;
/* 0x347 */ u8 field_0x347;
/* 0x348 */ u8 field_0x348;
/* 0x349 */ u8 field_0x349;
/* 0x34A */ u8 field_0x34a;
/* 0x34B */ u8 field_0x34b;
/* 0x34C */ u8 field_0x34c;
/* 0x34D */ u8 field_0x34d;
/* 0x34E */ u8 field_0x34e;
/* 0x34F */ u8 field_0x34f;
/* 0x350 */ u8 field_0x350;
/* 0x351 */ u8 field_0x351;
/* 0x352 */ s16 field_0x352;
/* 0x354 */ u8 field_0x354;
/* 0x355 */ u8 field_0x355[0x358 - 0x355];
}; // Size: 0x358
};
#endif /* D_A_OBJ_JUMP_H */
+326 -27
View File
@@ -5,137 +5,436 @@
#include "d/dolzel_rel.h" // IWYU pragma: keep
#include "d/actor/d_a_obj_jump.h"
#include "d/actor/d_a_player.h"
#include "d/d_procname.h"
#include "d/d_priority.h"
namespace daObjJump {
Mtx daObjJump::Act_c::M_tmp_mtx;
const char Act_c::M_arcname[] = "Hjump";
const Attr_c Act_c::M_attr[2] = {
{
/* resSize */ 2112,
/* resIndex */ 12,
/* field_0x006 */ 6,
/* cullSizeBoxMin */ { -60, -1, -60 },
/* cullSizeBoxMax */ { 60, 251, 60 },
/* field_0x014 */ 1,
/* field_0x015 */ 0,
/* field_0x016 */ 1,
/* field_0x018 */ 40.0f,
/* field_0x01C */ 125.0f,
/* field_0x020 */ 150.0f,
/* field_0x024 */ 0.0f,
/* field_0x028 */ 0.4f,
/* field_0x02C */ 0.7f,
/* field_0x030 */ -0.15f,
/* field_0x034 */ -0.02f,
/* field_0x038 */ 0.1f,
/* field_0x03C */ 1.2f,
/* field_0x040 */ 0x0f,
/* field_0x041 */ 0x05,
/* field_0x042 */ 0x05,
/* field_0x043 */ 0x04,
/* field_0x044 */ 0x04,
/* field_0x045 */ 0x06,
/* field_0x046 */ 0x04,
/* field_0x047 */ 0x04,
/* field_0x048 */ 0x01,
/* field_0x049 */ { 0, 0, 0 },
/* field_0x04C */ 2.0f
},
{
/* resSize */ 2112,
/* resIndex */ 11,
/* field_0x006 */ 5,
/* cullSizeBoxMin */ { -90, -1, -90 },
/* cullSizeBoxMax */ { 90, 401, 90 },
/* field_0x014 */ 0,
/* field_0x015 */ 0,
/* field_0x016 */ 1,
/* field_0x018 */ 160.0f,
/* field_0x01C */ 270.0f,
/* field_0x020 */ 300.0f,
/* field_0x024 */ 150.0f,
/* field_0x028 */ 0.4f,
/* field_0x02C */ 0.7f,
/* field_0x030 */ -0.15f,
/* field_0x034 */ -0.02f,
/* field_0x038 */ 0.1f,
/* field_0x03C */ 1.2f,
/* field_0x040 */ 0x0f,
/* field_0x041 */ 0x05,
/* field_0x042 */ 0x05,
/* field_0x043 */ 0x04,
/* field_0x044 */ 0x04,
/* field_0x045 */ 0x06,
/* field_0x046 */ 0x04,
/* field_0x047 */ 0x04,
/* field_0x048 */ 0x01,
/* field_0x049 */ { 0, 0, 0 },
/* field_0x04C */ 2.0f
}
};
};
/* 00000078-00000184 .text CreateHeap__Q29daObjJump5Act_cFv */
BOOL daObjJump::Act_c::CreateHeap() {
/* Nonmatching */
J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname, attr().field_0x006);
JUT_ASSERT(282, model_data != NULL);
mModel = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000022);
if (mModel != NULL) {
model_data->getJointTree().getJointNodePointer(attr().field_0x016 & 0xffff)->setCallBack(jnodeCB_lower);
mModel->setUserArea((u32)this);
}
return mModel != NULL;
}
/* 00000184-0000033C .text Create__Q29daObjJump5Act_cFv */
BOOL daObjJump::Act_c::Create() {
/* Nonmatching */
unsigned int uVar2;
field_0x338 = 1.0f;
field_0x33C = 1.0f;
cullMtx = mModel->getBaseTRMtx();
init_mtx();
fopAcM_setCullSizeBox(
this,
attr().cullSizeBoxMin.x,
attr().cullSizeBoxMin.y,
attr().cullSizeBoxMin.z,
attr().cullSizeBoxMax.x,
attr().cullSizeBoxMax.y,
attr().cullSizeBoxMax.z
);
if (attr().field_0x014 != 0) {
cXyz temp(current.pos.x, current.pos.y + 50.0f, current.pos.z);
field_0x2D8.SetPos(&temp);
uVar2 = fopAcM_GetID(this);
field_0x2D8.SetActorPid(uVar2);
field_0x32C = dComIfG_Bgsp()->GroundCross(&field_0x2D8);
}
if (field_0x2D4 == 1) {
actor_status &= 0xffffffc0;
gbaName = 0;
}
mpBgW->SetRideCallback(rideCB);
mode_wait_init();
return TRUE;
}
/* 0000033C-00000544 .text Mthd_Create__Q29daObjJump5Act_cFv */
cPhs_State daObjJump::Act_c::Mthd_Create() {
/* Nonmatching */
fopAcM_ct(this, daObjJump::Act_c);
cPhs_State phase_state = dComIfG_resLoad(&mPhase, M_arcname);
if (phase_state == cPhs_COMPLEATE_e) {
field_0x2D4 = prm_get_type();
phase_state = MoveBGCreate(
M_arcname,
attr().resIndex,
dBgS_MoveBGProc_Typical,
attr().resSize
);
JUT_ASSERT(384, (phase_state == cPhs_COMPLEATE_e) || (phase_state == cPhs_ERROR_e));
}
return phase_state;
}
/* 00000A04-00000A0C .text Delete__Q29daObjJump5Act_cFv */
BOOL daObjJump::Act_c::Delete() {
/* Nonmatching */
return TRUE;
}
/* 00000A0C-00000A58 .text Mthd_Delete__Q29daObjJump5Act_cFv */
BOOL daObjJump::Act_c::Mthd_Delete() {
/* Nonmatching */
u32 result = MoveBGDelete();
dComIfG_resDelete(&mPhase, M_arcname);
return result;
}
/* 00000A58-00000B78 .text set_mtx__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::set_mtx() {
/* Nonmatching */
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mModel->setBaseTRMtx(mDoMtx_stack_c::get());
float fVar1 = attr().field_0x020 - attr().field_0x024;
float fVar2 = attr().field_0x01C - attr().field_0x018;
float fVar3 = (field_0x33C - 1.0f);
float fVar4 = (fVar1 + fVar2 * fVar3) / fVar1;
mDoMtx_stack_c::transM(0.0f, attr().field_0x024, 0.0f);
mDoMtx_stack_c::scaleM(1.0f, fVar4,1.0f);
mDoMtx_stack_c::transM(0.0f, -attr().field_0x024, 0.0f);
cMtx_copy(mDoMtx_stack_c::get(), M_tmp_mtx);
}
/* 00000B78-00000BB4 .text init_mtx__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::init_mtx() {
/* Nonmatching */
mModel->setBaseScale(scale);
set_mtx();
}
/* 00000BB4-00000D9C .text set_push_flag__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::set_push_flag() {
/* Nonmatching */
field_0x345 = 0;
if (field_0x344 != 0) {
if (field_0x347 < 0xff) {
field_0x347 += 1;
}
if (field_0x347 == attr().field_0x043) {
field_0x345 = 1;
}
} else {
field_0x347 = 0;
}
field_0x346 = 0;
if (field_0x344 != 0) {
field_0x348 = 0;
} else {
if (field_0x348 < 0xff) {
field_0x348 += 1;
}
if (field_0x348 == attr().field_0x044) {
field_0x346 = 1;
}
}
field_0x34a = 0;
if (field_0x349 != 0 && dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK100_e)) {
if (field_0x34b < 0xff) {
field_0x34b += 1;
}
if (field_0x34b == attr().field_0x045) {
field_0x34a = 1;
}
} else {
field_0x34b = 0;
}
field_0x34d = 0;
if (field_0x34c != 0) {
if (field_0x34f < 0xff) {
field_0x34f += 1;
}
if (field_0x34f == attr().field_0x046) {
field_0x34d = 1;
}
} else {
field_0x34f = 0;
}
field_0x34e = 0;
if (field_0x34c != 0) {
field_0x350 = 0;
return;
}
if (field_0x350 < 0xff) {
field_0x350 += 1;
}
if (field_0x350 != attr().field_0x047) {
return;
}
field_0x34e = 1;
}
/* 00000D9C-00000DB4 .text clear_push_flag__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::clear_push_flag() {
/* Nonmatching */
field_0x344 = 0;
field_0x34c = 0;
field_0x349 = 0;
field_0x354 = 0;
}
/* 00000DB4-00000E1C .text calc_vib_pos__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::calc_vib_pos() {
/* Nonmatching */
field_0x340 = field_0x340 - (field_0x33C - field_0x338) * attr().field_0x02C;
field_0x340 = field_0x340 - field_0x340 * attr().field_0x028;
field_0x33C = field_0x33C + field_0x340;
}
/* 00000E1C-00000E74 .text rideCB__Q29daObjJump5Act_cFP4dBgWP10fopAc_ac_cP10fopAc_ac_c */
void daObjJump::Act_c::rideCB(dBgW*, fopAc_ac_c*, fopAc_ac_c*) {
/* Nonmatching */
void daObjJump::Act_c::rideCB(dBgW*, fopAc_ac_c* param_2, fopAc_ac_c* param_3) {
Act_c* pvVar4 = (Act_c *) param_2;
daPy_py_c* player = (daPy_py_c *) param_3;
pvVar4->field_0x344 = 1;
if (fopAcM_GetProfName(param_3) != PROC_PLAYER) {
return;
}
pvVar4->field_0x349 = 1;
if (player->checkEquipHeavyBoots()) {
pvVar4->field_0x34c = 1;
}
const Attr_c* a = &M_attr[pvVar4->field_0x2D4];
if (fopAcM_GetSpeedF(player) > a->field_0x04C) {
pvVar4->field_0x354 = 1;
}
}
/* 00000E74-00000F48 .text jnodeCB_lower__Q29daObjJump5Act_cFP7J3DNodei */
BOOL daObjJump::Act_c::jnodeCB_lower(J3DNode*, int) {
BOOL daObjJump::Act_c::jnodeCB_lower(J3DNode* param_1, int param_2) {
/* Nonmatching */
if (param_2 == 0) {
J3DModel* model = j3dSys.getModel();
Act_c* pvVar4 = (Act_c *) model->getUserArea();
J3DJoint* joint = (J3DJoint*) param_1;
s32 jntNo = joint->getJntNo();
PSMTXCopy(model->getAnmMtx(jntNo), mDoMtx_stack_c::get());
mDoMtx_stack_c::scaleM(pvVar4->field_0x33C,1.0f,1.0f);
model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
float fVar1 = M_attr[pvVar4->field_0x2D4].field_0x01C - M_attr[pvVar4->field_0x2D4].field_0x018;
j3dSys.mCurrentMtx[1][3] += fVar1 * (pvVar4->field_0x33C - 1.0f);
}
return TRUE;
}
/* 00000F48-00000F64 .text mode_wait_init__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_wait_init() {
/* Nonmatching */
field_0x330 = 0;
field_0x338 = 1.0f;
field_0x352 = 0;
}
/* 00000F64-0000108C .text mode_wait__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_wait() {
/* Nonmatching */
if (field_0x352 <= 0 && (field_0x345 != 0 || field_0x346 != 0 || field_0x34a != 0 || field_0x34d != 0)) {
field_0x340 += attr().field_0x030;
field_0x352 = attr().field_0x048;
}
else if (field_0x352 > 0) {
field_0x352 -= 1;
}
if (field_0x34f > attr().field_0x040) {
fopAcM_seStart(this, JA_SE_OBJ_JUMP_SPR_CLOSE, 0);
mode_w_l_init();
}
}
/* 0000108C-000010B4 .text mode_w_l_init__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_w_l_init() {
/* Nonmatching */
field_0x330 = 1;
field_0x338 = attr().field_0x038;
}
/* 000010B4-000010E8 .text mode_w_l__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_w_l() {
/* Nonmatching */
if (field_0x33C <= field_0x338) {
mode_lower_init();
}
}
/* 000010E8-000010FC .text mode_lower_init__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_lower_init() {
/* Nonmatching */
field_0x330 = 2;
field_0x352 = 0;
}
/* 000010FC-00001200 .text mode_lower__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_lower() {
/* Nonmatching */
if (field_0x352 <= 0 && field_0x34e != 0) {
field_0x340 += attr().field_0x030;
field_0x352 = attr().field_0x048;
}
else if (field_0x352 > 0) {
field_0x352 -= 1;
}
if (field_0x350 > attr().field_0x041) {
fopAcM_seStart(this, JA_SE_OBJ_JUMP_SPR_OPEN, 0);
mode_l_u_init();
}
}
/* 00001200-00001228 .text mode_l_u_init__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_l_u_init() {
/* Nonmatching */
field_0x330 = 3;
field_0x338 = attr().field_0x03C;
}
/* 00001228-00001290 .text mode_l_u__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_l_u() {
/* Nonmatching */
if (field_0x33C >= field_0x338) {
field_0x33C = field_0x338;
field_0x340 = 0.0f;
if (*(u8*)(&field_0x349) != 0) {
daPy_py_c* player = daPy_getPlayerActorClass();
player->onForceVomitJump();
}
mode_upper_init();
}
}
/* 00001290-000012B8 .text mode_upper_init__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_upper_init() {
/* Nonmatching */
field_0x330 = 4;
field_0x334 = attr().field_0x042;
}
/* 000012B8-000012EC .text mode_upper__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_upper() {
/* Nonmatching */
s16 var = field_0x334;
field_0x334 = var - 1;
if ((s16)(var - 1) <= 0) {
mode_u_w_init();
}
}
/* 000012EC-00001304 .text mode_u_w_init__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_u_w_init() {
/* Nonmatching */
field_0x330 = 5;
field_0x338 = 1.0f;
}
/* 00001304-00001338 .text mode_u_w__Q29daObjJump5Act_cFv */
void daObjJump::Act_c::mode_u_w() {
/* Nonmatching */
if (field_0x33C <= field_0x338) {
mode_wait_init();
}
}
/* 00001338-000014B0 .text Execute__Q29daObjJump5Act_cFPPA3_A4_f */
BOOL daObjJump::Act_c::Execute(Mtx**) {
/* Nonmatching */
BOOL daObjJump::Act_c::Execute(Mtx** param_1) {
/* Nonmatching */
set_push_flag();
typedef void (daObjJump::Act_c::*procFunc)();
static procFunc mode_proc[] = {
&daObjJump::Act_c::mode_wait,
&daObjJump::Act_c::mode_w_l,
&daObjJump::Act_c::mode_lower,
&daObjJump::Act_c::mode_l_u,
&daObjJump::Act_c::mode_upper,
&daObjJump::Act_c::mode_u_w
};
(this->*mode_proc[field_0x330])();
if ((field_0x330 == 0 || field_0x330 == 2) && field_0x354 != 0) {
field_0x340 += attr().field_0x034;
}
calc_vib_pos();
set_mtx();
*param_1 = &M_tmp_mtx;
clear_push_flag();
return TRUE;
}
/* 000014B0-00001594 .text Draw__Q29daObjJump5Act_cFv */
BOOL daObjJump::Act_c::Draw() {
/* Nonmatching */
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &current.pos, &tevStr);
g_env_light.setLightTevColorType(mModel, &tevStr);
dComIfGd_setList();
mDoExt_modelUpdateDL(mModel);
dComIfGd_setListInvisisble();
if (attr().field_0x014 != 0) {
dComIfGd_setSimpleShadow2(
&current.pos,
field_0x32C,
70.0f,
field_0x2D8,
shape_angle.y,
1.0f,
NULL
);
}
return TRUE;
}
namespace daObjJump {