From 0568d6fe35631d50d7e809e3bd9c02201097862c Mon Sep 17 00:00:00 2001 From: marian-m12l <50991156+marian-m12l@users.noreply.github.com> Date: Tue, 19 May 2026 23:13:38 +0200 Subject: [PATCH] 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 --- include/d/actor/d_a_obj_jump.h | 81 +++++++- src/d/actor/d_a_obj_jump.cpp | 353 ++++++++++++++++++++++++++++++--- 2 files changed, 400 insertions(+), 34 deletions(-) diff --git a/include/d/actor/d_a_obj_jump.h b/include/d/actor/d_a_obj_jump.h index 55debba0d..2277858b7 100644 --- a/include/d/actor/d_a_obj_jump.h +++ b/include/d/actor/d_a_obj_jump.h @@ -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(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 */ diff --git a/src/d/actor/d_a_obj_jump.cpp b/src/d/actor/d_a_obj_jump.cpp index 27ee2de7e..8a9eb1c63 100644 --- a/src/d/actor/d_a_obj_jump.cpp +++ b/src/d/actor/d_a_obj_jump.cpp @@ -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, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mModel, &tevStr); + dComIfGd_setList(); + mDoExt_modelUpdateDL(mModel); + dComIfGd_setListInvisisble(); + if (attr().field_0x014 != 0) { + dComIfGd_setSimpleShadow2( + ¤t.pos, + field_0x32C, + 70.0f, + field_0x2D8, + shape_angle.y, + 1.0f, + NULL + ); + } + return TRUE; } namespace daObjJump {