/** * d_a_obj_jump.cpp * Object - Wind Temple - Iron Boots springboard */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_jump.h" #include "d/actor/d_a_player.h" #include "res/Object/Hjump.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] = { { // Type_SPRING_e /* heapSize */ DEMO_SELECT(0x8000, 0x840), /* dzbResIndex */ dRes_INDEX_HJUMP_DZB_HJUMP2_e, /* bdlResIndex */ dRes_INDEX_HJUMP_BDL_HJUMP2_e, /* cullSizeBoxMin */ { -60, -1, -60 }, /* cullSizeBoxMax */ { 60, VERSION_SELECT(151, 151, 251, 251), 60 }, /* hasShadow */ true, /* springJntNum */ 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_0x04C */ 2.0f }, { // Type_SPRING_ON_BOX_e /* heapSize */ DEMO_SELECT(0x8000, 0x840), /* dzbResIndex */ dRes_INDEX_HJUMP_DZB_HJUMP1B_e, /* bdlResIndex */ dRes_INDEX_HJUMP_BDL_HJUMP1_e, /* cullSizeBoxMin */ { -90, -1, -90 }, /* cullSizeBoxMax */ { 90, VERSION_SELECT(301, 301, 401, 401), 90 }, /* hasShadow */ false, /* springJntNum */ 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_0x04C */ 2.0f } }; }; /* 00000078-00000184 .text CreateHeap__Q29daObjJump5Act_cFv */ BOOL daObjJump::Act_c::CreateHeap() { J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname, attr().bdlResIndex); JUT_ASSERT(DEMO_SELECT(277, 282), model_data != NULL); mModel = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000022); if (mModel != NULL) { model_data->getJointTree().getJointNodePointer(attr().springJntNum)->setCallBack(jnodeCB_lower); mModel->setUserArea((u32)this); } return mModel != NULL; } /* 00000184-0000033C .text Create__Q29daObjJump5Act_cFv */ BOOL daObjJump::Act_c::Create() { field_0x338 = 1.0f; field_0x33C = 1.0f; fopAcM_SetMtx(this, 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().hasShadow) { cXyz pos(current.pos.x, current.pos.y + 50.0f, current.pos.z); mGndChk.SetPos(&pos); mGndChk.SetActorPid(fopAcM_GetID(this)); mGroundY = dComIfG_Bgsp()->GroundCross(&mGndChk); } #if VERSION > VERSION_DEMO if (mType == Type_SPRING_ON_BOX_e) { actor_status &= ~0x3F; gbaName = 0; } #endif mpBgW->SetRideCallback(rideCB); mode_wait_init(); return TRUE; } /* 0000033C-00000544 .text Mthd_Create__Q29daObjJump5Act_cFv */ cPhs_State daObjJump::Act_c::Mthd_Create() { fopAcM_ct(this, daObjJump::Act_c); cPhs_State phase_state = dComIfG_resLoad(&mPhase, M_arcname); if (phase_state == cPhs_COMPLEATE_e) { mType = prm_get_type(); phase_state = MoveBGCreate( M_arcname, attr().dzbResIndex, dBgS_MoveBGProc_Typical, attr().heapSize ); JUT_ASSERT(DEMO_SELECT(373, 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() { return TRUE; } /* 00000A0C-00000A58 .text Mthd_Delete__Q29daObjJump5Act_cFv */ BOOL daObjJump::Act_c::Mthd_Delete() { u32 result = MoveBGDelete(); dComIfG_resDeleteDemo(&mPhase, M_arcname); return result; } /* 00000A58-00000B78 .text set_mtx__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::set_mtx() { mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::ZXYrotM(shape_angle); mModel->setBaseTRMtx(mDoMtx_stack_c::get()); f32 fVar1 = attr().field_0x020 - attr().field_0x024; f32 fVar2 = attr().field_0x01C - attr().field_0x018; f32 fVar3 = (field_0x33C - 1.0f); f32 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() { mModel->setBaseScale(scale); set_mtx(); } /* 00000BB4-00000D9C .text set_push_flag__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::set_push_flag() { field_0x345 = 0; if (mIsRide) { if (field_0x347 < 0xff) { field_0x347 += 1; } if (field_0x347 == attr().field_0x043) { field_0x345 = 1; } } else { field_0x347 = 0; } field_0x346 = 0; if (mIsRide) { field_0x348 = 0; } else { if (field_0x348 < 0xff) { field_0x348 += 1; } if (field_0x348 == attr().field_0x044) { field_0x346 = 1; } } field_0x34a = 0; if (mIsPlayerRide && dComIfGp_checkPlayerStatus0(0, daPyStts0_HANG_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 (mIsHeavyRide) { if (field_0x34f < 0xff) { field_0x34f += 1; } if (field_0x34f == attr().field_0x046) { field_0x34d = 1; } } else { field_0x34f = 0; } field_0x34e = 0; if (mIsHeavyRide) { 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() { mIsRide = false; mIsHeavyRide = false; mIsPlayerRide = false; field_0x354 = 0; } /* 00000DB4-00000E1C .text calc_vib_pos__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::calc_vib_pos() { f32 f2 = field_0x33C - field_0x338; field_0x340 -= f2 * attr().field_0x02C; field_0x340 -= field_0x340 * attr().field_0x028; field_0x33C += field_0x340; } /* 00000E1C-00000E74 .text rideCB__Q29daObjJump5Act_cFP4dBgWP10fopAc_ac_cP10fopAc_ac_c */ void daObjJump::Act_c::rideCB(dBgW*, fopAc_ac_c* param_2, fopAc_ac_c* param_3) { Act_c* i_this = (Act_c *) param_2; daPy_py_c* player = (daPy_py_c *) param_3; i_this->mIsRide = true; if (fopAcM_GetProfName(param_3) == fpcNm_PLAYER_e) { i_this->mIsPlayerRide = true; if (player->checkEquipHeavyBoots()) { i_this->mIsHeavyRide = true; } if (fopAcM_GetSpeedF(player) > i_this->attr().field_0x04C) { i_this->field_0x354 = true; } } } /* 00000E74-00000F48 .text jnodeCB_lower__Q29daObjJump5Act_cFP7J3DNodei */ BOOL daObjJump::Act_c::jnodeCB_lower(J3DNode* node, int calcTiming) { if (calcTiming == J3DNodeCBCalcTiming_In) { J3DModel* model = (J3DModel*)j3dSys.getModel(); Act_c* i_this = (Act_c *) model->getUserArea(); J3DJoint* joint = (J3DJoint*) node; u16 jntNo = joint->getJntNo(); MTXCopy(model->getAnmMtx(jntNo), mDoMtx_stack_c::get()); mDoMtx_stack_c::scaleM(i_this->field_0x33C,1.0f,1.0f); model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); f32 f2 = i_this->attr().field_0x01C - i_this->attr().field_0x018; f32 f1 = f2 * (i_this->field_0x33C - 1.0f); j3dSys.mCurrentMtx[1][3] += f1; } return TRUE; } /* 00000F48-00000F64 .text mode_wait_init__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::mode_wait_init() { mMode = Mode_WAIT_e; field_0x338 = 1.0f; field_0x352 = 0; } /* 00000F64-0000108C .text mode_wait__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::mode_wait() { 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() { mMode = Mode_WAIT_LOWER_e; field_0x338 = attr().field_0x038; } /* 000010B4-000010E8 .text mode_w_l__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::mode_w_l() { if (field_0x33C <= field_0x338) { mode_lower_init(); } } /* 000010E8-000010FC .text mode_lower_init__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::mode_lower_init() { mMode = Mode_LOWER_e; field_0x352 = 0; } /* 000010FC-00001200 .text mode_lower__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::mode_lower() { 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() { mMode = Mode_LOWER_UPPER_e; field_0x338 = attr().field_0x03C; } /* 00001228-00001290 .text mode_l_u__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::mode_l_u() { if (field_0x33C >= field_0x338) { field_0x33C = field_0x338; field_0x340 = 0.0f; if (mIsPlayerRide) { 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() { mMode = Mode_UPPER_e; mTimer = attr().field_0x042; } /* 000012B8-000012EC .text mode_upper__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::mode_upper() { if (--mTimer <= 0) { mode_u_w_init(); } } /* 000012EC-00001304 .text mode_u_w_init__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::mode_u_w_init() { mMode = Mode_UPPER_WAIT_e; field_0x338 = 1.0f; } /* 00001304-00001338 .text mode_u_w__Q29daObjJump5Act_cFv */ void daObjJump::Act_c::mode_u_w() { if (field_0x33C <= field_0x338) { mode_wait_init(); } } /* 00001338-000014B0 .text Execute__Q29daObjJump5Act_cFPPA3_A4_f */ 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[mMode])(); if ((mMode == Mode_WAIT_e || mMode == Mode_LOWER_e) && field_0x354) { 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() { g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); g_env_light.setLightTevColorType(mModel, &tevStr); dComIfGd_setListBG(); mDoExt_modelUpdateDL(mModel); dComIfGd_setList(); if (attr().hasShadow != 0) { dComIfGd_setSimpleShadow2( ¤t.pos, mGroundY, 70.0f, mGndChk, shape_angle.y, 1.0f, NULL ); } return TRUE; } namespace daObjJump { namespace { /* 00001594-000015B4 .text Mthd_Create__Q29daObjJump26@unnamed@d_a_obj_jump_cpp@FPv */ cPhs_State Mthd_Create(void* i_this) { return ((daObjJump::Act_c*)i_this)->Mthd_Create(); } /* 000015B4-000015D4 .text Mthd_Delete__Q29daObjJump26@unnamed@d_a_obj_jump_cpp@FPv */ BOOL Mthd_Delete(void* i_this) { return ((daObjJump::Act_c*)i_this)->Mthd_Delete(); } /* 000015D4-000015F4 .text Mthd_Execute__Q29daObjJump26@unnamed@d_a_obj_jump_cpp@FPv */ BOOL Mthd_Execute(void* i_this) { return ((daObjJump::Act_c*)i_this)->MoveBGExecute(); } /* 000015F4-00001620 .text Mthd_Draw__Q29daObjJump26@unnamed@d_a_obj_jump_cpp@FPv */ BOOL Mthd_Draw(void* i_this) { return ((daObjJump::Act_c*)i_this)->MoveBGDraw(); } /* 00001620-0000164C .text Mthd_IsDelete__Q29daObjJump26@unnamed@d_a_obj_jump_cpp@FPv */ BOOL Mthd_IsDelete(void* i_this) { return ((daObjJump::Act_c*)i_this)->IsDelete(); } static actor_method_class Mthd_Table = { (process_method_func)Mthd_Create, (process_method_func)Mthd_Delete, (process_method_func)Mthd_Execute, (process_method_func)Mthd_IsDelete, (process_method_func)Mthd_Draw, }; }; // namespace }; // namespace daObjJump actor_process_profile_definition g_profile_Obj_Jump = { /* Layer ID */ fpcLy_CURRENT_e, /* List ID */ 0x0004, /* List Prio */ fpcPi_CURRENT_e, /* Proc Name */ fpcNm_Obj_Jump_e, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(daObjJump::Act_c), /* Size Other */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Draw Prio */ fpcDwPi_Obj_Jump_e, /* Actor SubMtd */ &daObjJump::Mthd_Table, /* Status */ 0x04 | fopAcStts_SHOWMAP_e | fopAcStts_NOCULLEXEC_e | fopAcStts_CULL_e | fopAcStts_UNK40000_e, /* Group */ fopAc_ACTOR_e, /* Cull Type */ fopAc_CULLBOX_CUSTOM_e, };