From ea840c9a23814670ac7ab7475a376f4ce97faec1 Mon Sep 17 00:00:00 2001 From: mattias-blum <142374929+mattias-blum@users.noreply.github.com> Date: Tue, 25 Feb 2025 19:46:12 -0500 Subject: [PATCH] d_a_leaflift 100% (#693) * d_a_leaflift 100% * d_a_leaflift_static 100% Additional formatting changes plus variable re-naming's due to added context from `d_a_leaflift_static` * PR changes made, renamed other variables The m43C-m43E flags seem to be flags relating to Link's gliding state but couldn't figure out the order of them. m43F seems to be some timer. * additional PR changes --- configure.py | 4 +- include/d/actor/d_a_leaflift.h | 47 ++++- src/d/actor/d_a_leaflift.cpp | 313 +++++++++++++++++++++++++++++---- src/d/d_a_leaflift_static.cpp | 34 +++- 4 files changed, 354 insertions(+), 44 deletions(-) diff --git a/configure.py b/configure.py index c6d4bc774..cc2f3e892 100755 --- a/configure.py +++ b/configure.py @@ -461,7 +461,7 @@ config.libs = [ Object(Matching, "d/d_a_item_static.cpp"), Object(Matching, "d/d_a_shop_item_static.cpp"), Object(Matching, "d/d_a_race_item_static.cpp"), - Object(NonMatching, "d/d_a_leaflift_static.cpp"), + Object(Matching, "d/d_a_leaflift_static.cpp"), Object(NonMatching, "d/d_demo.cpp"), Object(Equivalent, "d/d_door.cpp", extra_cflags=['-pragma "nosyminline on"']), # weak func order Object(Matching, "d/d_resorce.cpp", extra_cflags=['-pragma "nosyminline on"']), @@ -1554,7 +1554,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_kmon"), ActorRel(Matching, "d_a_komore", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_lbridge", extra_cflags=['-pragma "nosyminline on"']), - ActorRel(NonMatching, "d_a_leaflift"), + ActorRel(Matching, "d_a_leaflift", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_lstair"), ActorRel(NonMatching, "d_a_machine"), ActorRel(NonMatching, "d_a_mant"), diff --git a/include/d/actor/d_a_leaflift.h b/include/d/actor/d_a_leaflift.h index 0c36f280f..6b1fd26fe 100644 --- a/include/d/actor/d_a_leaflift.h +++ b/include/d/actor/d_a_leaflift.h @@ -2,29 +2,66 @@ #define D_A_LEAFLIFT_H #include "f_op/f_op_actor.h" +#include "f_op/f_op_actor_mng.h" +#include "d/d_cc_d.h" +#include "d/d_bg_w.h" +#include "d/d_particle.h" + +class dBgW; class daLlift_c : public fopAc_ac_c { public: bool _delete(); - void CreateHeap(); + BOOL CreateHeap(); void CreateInit(); s32 _create(); void set_mtx(); void setMoveBGMtx(); bool _execute(); void emitterCtrl(); - void MoveDownLift(); + BOOL MoveDownLift(); bool _draw(); - void checkEndDownLift(); - void MoveUpLift(); + BOOL checkEndDownLift(); + BOOL MoveUpLift(); static const f32 m_height; static const f32 m_max_speed; static const f32 m_min_speed; + static const char m_arcname[6]; + public: - /* Place member variables here */ + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ dCcD_Stts mStts; + /* 0x2D8 */ dCcD_Cyl mCyl; + /* 0x408 */ dBgW* mpBgW; + /* 0x40C */ Mtx mMtx; + /* 0x43C */ bool m43C; + /* 0x43D */ bool m43D; + /* 0x43E */ bool m43E; + /* 0x43F */ u8 m43F; + /* 0x440 */ s16 mTiltAngle; + /* 0x442 */ u8 m442[0x444-0x442]; + /* 0x444 */ s16 mActorLifetimeFrameCount; + /* 0x446 */ u8 m446[0x448-0x446]; + /* 0x448 */ Quaternion mCurrentRotation; + /* 0x458 */ Quaternion mTargetRotation; + /* 0x468 */ bool mbIsDescending; + /* 0x469 */ bool mbIsAscending; + /* 0x46A */ u8 m46A[0x46C-0x46A]; + /* 0x46C */ Mtx mBGMtx; + /* 0x49C */ s32 mEmitterTimer; + /* 0x4A0 */ JPABaseEmitter* mEmitter1; + /* 0x4A4 */ JPABaseEmitter* mEmitter2; + /* 0x4A8 */ JPABaseEmitter* mEmitter3; + /* 0x4AC */ JPABaseEmitter* mEmitter4; + /* 0x4B0 */ f32 mWaterY; }; +namespace daLlift_prm { + inline u8 getPos(daLlift_c* item) { return fopAcM_GetParam(item) & 0x0F; } +} + #endif /* D_A_LEAFLIFT_H */ diff --git a/src/d/actor/d_a_leaflift.cpp b/src/d/actor/d_a_leaflift.cpp index 5634942a1..12504c440 100644 --- a/src/d/actor/d_a_leaflift.cpp +++ b/src/d/actor/d_a_leaflift.cpp @@ -4,98 +4,347 @@ // #include "d/actor/d_a_leaflift.h" -#include "m_Do/m_Do_ext.h" -#include "d/d_bg_w.h" +#include "d/d_bg_s_func.h" +#include "d/d_bg_s_movebg_actor.h" +#include "d/d_com_inf_game.h" +#include "d/d_lib.h" #include "d/d_procname.h" +#include "d/res/res_olift.h" +#include "m_Do/m_Do_ext.h" + +static dCcD_SrcCyl l_cyl_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ 0, + /* SrcObjTg SPrm */ 0, + /* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e | cCcD_CoSPrm_VsEnemy_e | cCcD_CoSPrm_VsPlayer_e | cCcD_CoSPrm_VsOther_e, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ cCcD_TgSPrm_IsPlayer_e, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 280.0f, + /* Height */ 510.0f, + }, +}; + +static cXyz up_vec(0.0f, 1.0f, 0.0f); + +const char daLlift_c::m_arcname[6] = "Olift"; /* 000000EC-000001C0 .text _delete__9daLlift_cFv */ bool daLlift_c::_delete() { - /* Nonmatching */ + if (mEmitter1) { + mEmitter1->becomeInvalidEmitter(); + mEmitter1 = NULL; + } + if (mEmitter2) { + mEmitter2->becomeInvalidEmitter(); + mEmitter2 = NULL; + } + if (mEmitter3) { + mEmitter3->becomeInvalidEmitter(); + mEmitter3 = NULL; + } + if (heap) + dComIfG_Bgsp()->Release(mpBgW); + dComIfG_resDelete(&mPhs, m_arcname); + return TRUE; } /* 000001C0-000001E0 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daLlift_c*)i_this)->CreateHeap(); } +static void rideCallBack(dBgW* param1, fopAc_ac_c* i_this, fopAc_ac_c* i_other); + /* 000001E0-00000338 .text CreateHeap__9daLlift_cFv */ -void daLlift_c::CreateHeap() { - /* Nonmatching */ -} +BOOL daLlift_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData *)dComIfG_getObjectRes(m_arcname, OLIFT_BDL_OLIFT); + JUT_ASSERT(0x14e, modelData != 0); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022); + if (!mpModel) { + return FALSE; + } + + mpModel->setUserArea((u32)this); + mpBgW = new dBgW(); + if (mpBgW) { + cBgD_t* pData = (cBgD_t *)dComIfG_getObjectRes(m_arcname, OLIFT_DZB_OLIFT); + if (mpBgW->Set(pData, cBgW::MOVE_BG_e, &mMtx) == 1) { + return FALSE; + } + mpBgW->SetCrrFunc(dBgS_MoveBGProc_TypicalRotY); + mpBgW->SetRideCallback(rideCallBack); + } + else { + return FALSE; + } + return TRUE; +} + +static BOOL nodeCallBack(J3DNode* node, int idx); /* 00000338-000005F8 .text CreateInit__9daLlift_cFv */ void daLlift_c::CreateInit() { - /* Nonmatching */ + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -300.0f, -600.0f, -300.0f, 300.0f, 100.0f, 300.0f); + fopAcM_setCullSizeFar(this, 1.0f); + mStts.Init(0xFF,0xFF,this); + mCyl.Set(l_cyl_src); + mCyl.SetStts(&mStts); + cXyz waterCheckPos = current.pos; + waterCheckPos.y += 200.0f; + mWaterY = dBgS_ObjGndChk_Wtr_Func(waterCheckPos); + if (mWaterY != -1e9f) { + cXyz particlePos = current.pos; + particlePos.y = mWaterY + 1.0f; + mEmitter3 = dComIfGp_particle_set(0x82AA, &particlePos, ¤t.angle); + if (mEmitter3) { + mEmitter3->stopCreateParticle(); + } + } + home.pos.y += 15.0f; + current.pos.y = home.pos.y; + JUTNameTab* jointName = mpModel->getModelData()->getJointName(); + for (u16 i = 0; i < mpModel->getModelData()->getJointNum(); i++) { + if (strcmp("j_happa", jointName->getName(i)) == 0) { + mpModel->getModelData()->getJointNodePointer(i)->setCallBack(&nodeCallBack); + break; + } + } + mTargetRotation = ZeroQuat; + mCurrentRotation = mTargetRotation; + if ((s32)daLlift_prm::getPos(this) == 1) { + current.pos.y = home.pos.y + m_height; + } + else { + if (mEmitter3) { + mEmitter3->playCreateParticle(); + } + } + m43F = 0x1e; + mpModel->calc(); + setMoveBGMtx(); + dComIfG_Bgsp()->Regist(mpBgW, this); + set_mtx(); + mpBgW->Move(); } /* 00000634-00000760 .text _create__9daLlift_cFv */ s32 daLlift_c::_create() { - /* Nonmatching */ + int res; + fopAcM_SetupActor(this, daLlift_c); + res = dComIfG_resLoad(&mPhs, m_arcname); + if (res == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0xf40)) { + return cPhs_ERROR_e; + } + else { + CreateInit(); + } + } + return res; } /* 00000918-000009C4 .text nodeCallBack__FP7J3DNodei */ -static BOOL nodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack(J3DNode* node, int idx) { + if (!idx) { + J3DJoint* joint = (J3DJoint*)node; + s32 jntNo = joint->getJntNo(); + J3DModel* model = j3dSys.getModel(); + daLlift_c* i_this = (daLlift_c*)model->getUserArea(); + if (i_this) { + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + mDoMtx_stack_c::quatM(&i_this->mCurrentRotation); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), i_this->mBGMtx); + } + } + return TRUE; } /* 000009C4-00000CAC .text rideCallBack__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c */ -void rideCallBack(dBgW*, fopAc_ac_c*, fopAc_ac_c*) { - /* Nonmatching */ +static void rideCallBack(dBgW* param1, fopAc_ac_c* i_act, fopAc_ac_c* i_other) { + daLlift_c* i_this = (daLlift_c*)i_act; + f32 tiltFactor; + f32 offsetMagnitude; + + cXyz posOffset = i_other->current.pos - i_this->current.pos; + tiltFactor = 2.0f; + if (fopAcM_GetName(i_other) == PROC_PLAYER) { + i_this->m43C = TRUE; + i_this->m43E = TRUE; + posOffset = posOffset.outprod(up_vec); + mDoMtx_stack_c::YrotS(-i_this->current.angle.y); + mDoMtx_stack_c::multVec(&posOffset, &posOffset); + if (i_this->m43D) { + posOffset = i_other->current.pos; + posOffset.x += 200.0f; + posOffset = posOffset.outprod(up_vec); + mDoMtx_stack_c::YrotS(-i_this->current.angle.y); + mDoMtx_stack_c::multVec(&posOffset, &posOffset); + s16 angle = (i_this->mActorLifetimeFrameCount & 0x1F) << 11; + tiltFactor = cM_ssin(angle) * 2.0f * 0.25f * (cM_rndFX(0.2f) + 1.0f); + } + offsetMagnitude = posOffset.abs(); + if (!posOffset.normalizeRS() ) { + return; + } + cLib_addCalcAngleS2(&i_this->mTiltAngle, -offsetMagnitude * tiltFactor, 8, 0x200); + tiltFactor = cM_ssin(i_this->mTiltAngle); + i_this->mTargetRotation.x = posOffset.x * tiltFactor; + i_this->mTargetRotation.y = posOffset.y * tiltFactor; + i_this->mTargetRotation.z = posOffset.z * tiltFactor; + i_this->mTargetRotation.w = cM_scos(i_this->mTiltAngle); + } + i_this->m43D = FALSE; + return; } /* 00000CAC-00000D34 .text set_mtx__9daLlift_cFv */ void daLlift_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::ZXYrotM(current.angle); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + return; } /* 00000D34-00000D9C .text setMoveBGMtx__9daLlift_cFv */ void daLlift_c::setMoveBGMtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::quatM(&mCurrentRotation); + MTXCopy(mDoMtx_stack_c::get(), mMtx); + return; } /* 00000D9C-00000F24 .text _execute__9daLlift_cFv */ bool daLlift_c::_execute() { - /* Nonmatching */ + Quaternion interpolatedRotation; + cXyz adjustedPosition; + float distXZ = fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)); + mActorLifetimeFrameCount++; + if ((m43F) && (m43F--, !m43F)) { + m43E = TRUE; + } + if ((!m43C) && (m43E)) { + mTargetRotation = ZeroQuat; + if (distXZ > 270.0f) { + mbIsDescending = TRUE; + } + } + MoveDownLift(); + set_mtx(); + setMoveBGMtx(); + m43C = FALSE; + mpModel->calc(); + mDoMtx_quatSlerp(&mCurrentRotation, &mTargetRotation, &interpolatedRotation, 0.25f); + mCurrentRotation = interpolatedRotation; + mpBgW->Move(); + adjustedPosition = current.pos; + adjustedPosition.y -= m_height; + mCyl.SetC(adjustedPosition); + dComIfG_Ccsp()->Set(&mCyl); + emitterCtrl(); + return TRUE; } /* 00000F24-00000FE0 .text emitterCtrl__9daLlift_cFv */ -void daLlift_c::emitterCtrl() { - /* Nonmatching */ +void daLlift_c::emitterCtrl() { + if (mEmitterTimer == 200) { + if (mEmitter1) { + mEmitter1->becomeInvalidEmitter(); + mEmitter1 = NULL; + } + if (mEmitter2) { + mEmitter2->becomeInvalidEmitter(); + mEmitter2 = NULL; + } + } + if (mEmitter1) { + mEmitter1->setGlobalRTMatrix(mBGMtx); + } + if (mEmitter2) { + mEmitter2 ->setGlobalRTMatrix(mBGMtx); + } + return; } /* 00000FE0-000010E0 .text MoveDownLift__9daLlift_cFv */ -void daLlift_c::MoveDownLift() { - /* Nonmatching */ +BOOL daLlift_c::MoveDownLift() { + float maxSpeed = m_max_speed; + float minSpeed = m_min_speed; + if (!mbIsDescending) { + return TRUE; + } + float downVel = cLib_addCalc(¤t.pos.y, home.pos.y, 0.1f, maxSpeed, minSpeed); + if (downVel == 0.0f) { + mbIsAscending = FALSE; + mbIsDescending = FALSE; + if (mEmitter3) { + mEmitter3->playCreateParticle(); + } + return TRUE; + } + if (downVel != 0.0f && !mbIsAscending) { + fopAcM_seStart(this, JA_SE_OBJ_LOTUS_LIFT_DOWN, 0); + mbIsAscending = TRUE; + } + return FALSE; } /* 000010E0-00001180 .text _draw__9daLlift_cFv */ bool daLlift_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + dComIfGd_setListBG(); + mDoExt_modelEntryDL(mpModel); + dComIfGd_setList(); + return TRUE; } /* 00001180-000011A0 .text daLlift_Create__FPv */ -static s32 daLlift_Create(void*) { - /* Nonmatching */ +static s32 daLlift_Create(void* i_this) { + return ((daLlift_c*)i_this)->_create(); } /* 000011A0-000011C4 .text daLlift_Delete__FPv */ -static BOOL daLlift_Delete(void*) { - /* Nonmatching */ +static BOOL daLlift_Delete(void* i_this) { + return ((daLlift_c*)i_this)->_delete(); } /* 000011C4-000011E8 .text daLlift_Draw__FPv */ -static BOOL daLlift_Draw(void*) { - /* Nonmatching */ +static BOOL daLlift_Draw(void* i_this) { + return ((daLlift_c*)i_this)->_draw(); } /* 000011E8-0000120C .text daLlift_Execute__FPv */ -static BOOL daLlift_Execute(void*) { - /* Nonmatching */ +static BOOL daLlift_Execute(void* i_this) { + return ((daLlift_c*)i_this)->_execute(); } /* 0000120C-00001214 .text daLlift_IsDelete__FPv */ -static BOOL daLlift_IsDelete(void*) { - /* Nonmatching */ +static BOOL daLlift_IsDelete(void* i_this) { + return TRUE; } static actor_method_class daLliftMethodTable = { diff --git a/src/d/d_a_leaflift_static.cpp b/src/d/d_a_leaflift_static.cpp index 0dc8c996b..538c74bc9 100644 --- a/src/d/d_a_leaflift_static.cpp +++ b/src/d/d_a_leaflift_static.cpp @@ -4,6 +4,7 @@ // #include "d/actor/d_a_leaflift.h" +#include "d/d_com_inf_game.h" #include "dolphin/types.h" const f32 daLlift_c::m_height = 560.0f; @@ -11,12 +12,35 @@ const f32 daLlift_c::m_max_speed = 10.0f; const f32 daLlift_c::m_min_speed = 5.0f; /* 800690E4-80069100 .text checkEndDownLift__9daLlift_cFv */ -void daLlift_c::checkEndDownLift() { - /* Nonmatching */ +BOOL daLlift_c::checkEndDownLift() { + return (current.pos.y <= home.pos.y); } /* 80069100-800692C4 .text MoveUpLift__9daLlift_cFv */ -void daLlift_c::MoveUpLift() { - /* Nonmatching */ +BOOL daLlift_c::MoveUpLift() { + cXyz upLiftPos; + bool res = FALSE; + mEmitterTimer++; + if (current.pos.y != home.pos.y + m_height) { + m43D = TRUE; + } + float upVel = cLib_addCalc(¤t.pos.y, home.pos.y + m_height, 0.1f, m_max_speed, m_min_speed); + if (upVel == 0.0f) { + mbIsAscending = FALSE; + res = TRUE; + } + else if ((upVel != 0.0f) && (mbIsAscending == FALSE)) { + fopAcM_seStart(this, JA_SE_OBJ_LOTUS_LIFT_UP, 0); + mbIsAscending = TRUE; + mEmitter1 = dComIfGp_particle_set(0x82AC, ¤t.pos, ¤t.angle); + mEmitter2 = NULL; + upLiftPos = current.pos; + upLiftPos.y = mWaterY; + mEmitter4 = dComIfGp_particle_set(0x82AB, &upLiftPos, ¤t.angle); + mEmitterTimer = 0; + if (mEmitter3) { + mEmitter3->stopCreateParticle(); + } + } + return res; } -