From 20a252e2540cafec87613a33231dd2f0618feeef Mon Sep 17 00:00:00 2001 From: Ammar Askar Date: Tue, 3 Jun 2025 15:43:15 -0400 Subject: [PATCH] 100% match and link d_a_windmill (#783) * 98% matching d_a_windmill * Match CreateInit * Match hane_move * Fully match and link TU --- configure.py | 2 +- include/d/actor/d_a_wind_tag.h | 8 +- include/d/actor/d_a_windmill.h | 12 +- src/d/actor/d_a_windmill.cpp | 307 +++++++++++++++++++++++++++++++-- 4 files changed, 313 insertions(+), 16 deletions(-) diff --git a/configure.py b/configure.py index ad510d99f..b61c54999 100755 --- a/configure.py +++ b/configure.py @@ -1752,7 +1752,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_warpls"), ActorRel(NonMatching, "d_a_warpmj"), ActorRel(NonMatching, "d_a_waterfall"), - ActorRel(NonMatching, "d_a_windmill"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_windmill", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_wz"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_ygcwp", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_yougan"), diff --git a/include/d/actor/d_a_wind_tag.h b/include/d/actor/d_a_wind_tag.h index 441e63593..f924682b3 100644 --- a/include/d/actor/d_a_wind_tag.h +++ b/include/d/actor/d_a_wind_tag.h @@ -15,8 +15,12 @@ namespace daWindTag { class daWindTag_c : public fopAc_ac_c { public: - void getCurLength() const {} - void getMaxLength() const {} + f32 getCurLength() const { + return mOffsY; + } + f32 getMaxLength() const { + return field_0x49c * mData[mType * 2 + 1]; + } bool _delete(); BOOL CreateHeap(); diff --git a/include/d/actor/d_a_windmill.h b/include/d/actor/d_a_windmill.h index 525e35533..bbd4909dc 100644 --- a/include/d/actor/d_a_windmill.h +++ b/include/d/actor/d_a_windmill.h @@ -11,7 +11,9 @@ class daWindMill_c : public fopAc_ac_c { public: void getMaxRotSpeed() const {} void getRotSpeed() const {} - void getType() const {} + u8 getType() const { + return mType; + } bool _delete(); BOOL CreateHeap(); @@ -27,6 +29,10 @@ public: static const s16 m_max_rot_speed[]; static const char* m_arcname[]; + static const s16 m_bmdidx[]; + static const s16 m_dzbidx[]; + static const s16 m_heapsize[]; + static const Vec m_cull_size[][2]; public: /* 0x0290 */ request_of_phase_process_class mPhs; @@ -34,7 +40,7 @@ public: /* 0x029C */ dCcD_Stts mStts; /* 0x02D8 */ dCcD_Sph mSph[9]; /* 0x06D4 */ dCcD_Cps mCps[4]; - /* 0x1244 */ f32 m1244[28]; + /* 0x1244 */ cM3dGCpsS m1244[4]; /* 0x12B4 */ dBgW* mpBgW; /* 0x12B8 */ Mtx mMtx; /* 0x12E8 */ dCcD_Cyl mCyl; @@ -43,4 +49,6 @@ public: /* 0x1420 */ u32 mWindTagId; }; +STATIC_ASSERT(sizeof(daWindMill_c) == 0x1424); + #endif /* D_A_WINDMILL_H */ diff --git a/src/d/actor/d_a_windmill.cpp b/src/d/actor/d_a_windmill.cpp index fcb22e76f..1740755d1 100644 --- a/src/d/actor/d_a_windmill.cpp +++ b/src/d/actor/d_a_windmill.cpp @@ -4,11 +4,20 @@ // #include "d/actor/d_a_windmill.h" +#include "d/actor/d_a_wind_tag.h" +#include "d/res/res_hpu1.h" +#include "d/res/res_hpu2.h" #include "m_Do/m_Do_ext.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 "d/d_bg_s_movebg_actor.h" + +#include "weak_data_1811.h" // IWYU pragma: keep + + +const char* daWindMill_c::m_arcname[] = { "Hpu1", "Hpu2" }; static dCcD_SrcSph l_sph_src = { // dCcD_SrcGObjInf @@ -101,8 +110,13 @@ static dCcD_SrcCyl l_cyl_src = { }, }; - -const char* daWindMill_c::m_arcname[] = { "Hpu1", "Hpu2" }; +const s16 daWindMill_c::m_bmdidx[] = {HPU1_BDL_HPU1, HPU2_BDL_HPU2}; +const s16 daWindMill_c::m_dzbidx[] = {HPU1_DZB_HPU1, -1}; +const s16 daWindMill_c::m_heapsize[] = { 0x3A40, 0xA00 }; +const Vec daWindMill_c::m_cull_size[][2] = { + {{-1400.0f, 0.0f, -1400.0f}, {1400.0f, 500.0f, 1400.0f}}, + {{-500.0f, -500.0f, -50.0f}, {500.0f, 500.0f, 150.0f}}, +}; /* 00000078-000000E8 .text _delete__12daWindMill_cFv */ bool daWindMill_c::_delete() { @@ -119,17 +133,130 @@ static BOOL CheckCreateHeap(fopAc_ac_c* i_ac) { /* 00000108-000002A0 .text CreateHeap__12daWindMill_cFv */ BOOL daWindMill_c::CreateHeap() { - /* Nonmatching */ + J3DModelData* modelData = (J3DModelData*) dComIfG_getObjectRes( +m_arcname[mType], m_bmdidx[mType]); + JUT_ASSERT(405, modelData != NULL); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000,0x11000222); + if (mpModel == NULL) { + return FALSE; + } + + + if (m_dzbidx[mType] != -1) { + mpBgW = new dBgW(); + if (mpBgW != NULL) { + cBgD_t* res = (cBgD_t*) dComIfG_getObjectRes( + m_arcname[mType], m_dzbidx[mType]); + if (mpBgW->Set(res, cBgW::MOVE_BG_e, &mMtx) == TRUE) { + return FALSE; + } + mpBgW->SetCrrFunc(&dBgS_MoveBGProc_TypicalRotY); + } else { + return FALSE; + } + } + + return TRUE; } +static BOOL nodeCallBack(J3DNode*, int); + /* 000002A0-0000050C .text CreateInit__12daWindMill_cFv */ void daWindMill_c::CreateInit() { /* Nonmatching */ + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + + cXyz cullMin = m_cull_size[mType][0]; + cXyz cullMax = m_cull_size[mType][1]; + fopAcM_setCullSizeBox( + this, + cullMin.x, + cullMin.y, + cullMin.z, + cullMax.x, + cullMax.y, + cullMax.z); + + fopAcM_setCullSizeFar(this, 3.0f); + mStts.Init(0xFF, 0xFF, this); + + int i; + switch (mType) { + case 1: + for (i = 0; i < 4; i++) { + mCps[i].Set(l_cps_src); + mCps[i].SetStts(&mStts); + } + for (i = 0; i < 9; i++) { + mSph[i].Set(l_sph_src); + mSph[i].SetStts(&mStts); + if (i < 4) { + mSph[i].SetR(60.0f); + } + } + break; + case 0: + for (i = 0; i < 4; i++) { + mCps[i].Set(l_cps_src); + mCps[i].SetStts(&mStts); + } + mCyl.Set(l_cyl_src); + mCyl.SetStts(&mStts); + break; + } + + mpModel->setUserArea((u32) this); + set_mtx(); + + for (u16 i = 0; i < mpModel->getModelData()->getJointNum(); i++) { + if (i == 2) { + mpModel->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack); + break; + } + } + + mpModel->calc(); + search_wind(); + + if (mpBgW != NULL) { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + cMtx_copy(mDoMtx_stack_c::get(), mMtx); + + dComIfG_Bgsp()->Regist(mpBgW, this); + mpBgW->Move(); + } } /* 0000050C-00000608 .text nodeCallBack__FP7J3DNodei */ -static BOOL nodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack(J3DNode* node, int calcTiming) { + if (calcTiming == J3DNodeCBCalcTiming_In) { + J3DJoint* joint = (J3DJoint*)node; + s32 jntNo = joint->getJntNo(); + J3DModel* model = j3dSys.getModel(); + daWindMill_c* i_this = (daWindMill_c*) model->getUserArea(); + + if (i_this) { + i_this->mAngle[0] += i_this->mAngle[1]; + + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + switch (i_this->getType()) { + case 0: + mDoMtx_stack_c::YrotM(i_this->mAngle[0]); + break; + case 1: + mDoMtx_stack_c::ZrotM(i_this->mAngle[0]); + break; + } + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + cMtx_copy(mDoMtx_stack_c::get(), i_this->mMtx); + + i_this->shape_angle.y = i_this->mAngle[0]; + } + } + return TRUE; } /* 00000608-00000670 .text search_wind__12daWindMill_cFv */ @@ -143,37 +270,195 @@ void daWindMill_c::search_wind() { /* 00000670-00000804 .text _create__12daWindMill_cFv */ cPhs_State daWindMill_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daWindMill_c); + + mType = fopAcM_GetParam(this) & 0xF; + cPhs_State res = dComIfG_resLoad(&mPhs, m_arcname[mType]); + if (res == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, m_heapsize[mType])) { + return cPhs_ERROR_e; + } + CreateInit(); + } + return res; } /* 00000DC4-00000E4C .text set_mtx__12daWindMill_cFv */ void daWindMill_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(current.angle); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000E4C-00000ECC .text _execute__12daWindMill_cFv */ bool daWindMill_c::_execute() { - /* Nonmatching */ + hane_move(); + set_at(); + set_co(); + set_mtx(); + if (mType == 0) { + mpModel->calc(); + } + if (mpBgW != NULL) { + mpBgW->Move(); + } + mAngle[2] = mAngle[1]; + return true; } /* 00000ECC-00001048 .text hane_move__12daWindMill_cFv */ void daWindMill_c::hane_move() { /* Nonmatching */ + f32 wind_float = 0.0f; + search_wind(); + + if (mWindTagId != fpcM_ERROR_PROCESS_ID_e) { + daWindTag::daWindTag_c* wind_tag = (daWindTag::daWindTag_c*) fopAcM_SearchByID(mWindTagId); + if (wind_tag != NULL) { + wind_float = wind_tag->getCurLength() / wind_tag->getMaxLength(); + } + } + + f32 temp = 2500.0f; + cLib_addCalcAngleS(&mAngle[1], wind_float * temp, 0xF, 100, 10); + if (mAngle[2] <= mAngle[1] && mAngle[1] != 0) { + if (mType == 0) { + fopAcM_seStart(this, JA_SE_OBJ_WDUN_WMILL_L_RND, 0); + } else if (mType == 1) { + fopAcM_seStart(this, JA_SE_OBJ_WDUN_WMILL_S_RND, 0); + } + } } /* 00001048-000014AC .text set_at__12daWindMill_cFv */ void daWindMill_c::set_at() { - /* Nonmatching */ + cXyz vec1(0.0f, 0.0f, 70.0f); + cXyz vec_array_0[4] = { + cXyz(450.0f, 0.0f, 70.0f), + cXyz(-450.0f, 0.0f, 70.0f), + cXyz(0.0f, 450.0f, 70.0f), + cXyz(0.0f, -450.0f, 70.0f), + }; + cXyz vec_array_1[4] = { + cXyz(-1400.0f, 290.0f, 130.0f), + cXyz(-1400.0f, 290.0f, -130.0f), + cXyz(130.0f, 290.0f, -1400.0f), + cXyz(-130.0f, 290.0f, -1400.0f), + }; + cXyz vec_array_2[4] = { + cXyz(1400.0f, 290.0f, 130.0f), + cXyz(1400.0f, 290.0f, -130.0f), + cXyz(130.0f, 290.0f,1400.0f), + cXyz(-130.0f, 290.0f, 1400.0f), + }; + + int i; + switch (mType) { + case 1: + if (mAngle[1] > 1000) { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(current.angle.x, current.angle.y, mAngle[0] + mAngle[1]); + mDoMtx_stack_c::multVec(&vec1, &vec1); + + + for (i = 0; i < 4; i++) { + mDoMtx_stack_c::multVec(&vec_array_0[i], &vec_array_0[i]); + + m1244[i].mStart = vec1; + m1244[i].mEnd = vec_array_0[i]; + m1244[i].mRadius = 70.0f; + + mCps[i].set(m1244[i].mStart, m1244[i].mEnd); + mCps[i].SetR(m1244[i].mRadius); + } + + for (i = 0; i < 4; i++) { + dComIfG_Ccsp()->Set(&mCps[i]); + } + } + break; + case 0: + if (mAngle[1] > 1000) { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(current.angle.x, mAngle[0] + mAngle[1], current.angle.z); + + for (i = 0; i < 4; i++) { + mDoMtx_stack_c::multVec(&vec_array_1[i], &vec_array_1[i]); + mDoMtx_stack_c::multVec(&vec_array_2[i], &vec_array_2[i]); + + m1244[i].mStart = vec_array_1[i]; + m1244[i].mEnd = vec_array_2[i]; + m1244[i].mRadius = 170.0f; + + mCps[i].set(m1244[i].mStart, m1244[i].mEnd); + mCps[i].SetR(m1244[i].mRadius); + mCps[i].SetAtSpl(dCcG_At_Spl_UNKA); + } + + for (i = 0; i < 4; i++) { + dComIfG_Ccsp()->Set(&mCps[i]); + } + } + break; + } } /* 000014AC-000016DC .text set_co__12daWindMill_cFv */ void daWindMill_c::set_co() { - /* Nonmatching */ + cXyz vec_array[9] = { + cXyz(150.0f, 0.0f, 70.0f), + cXyz(-150.0f, 0.0f, 70.0f), + cXyz(0.0f, 150.0f, 70.0f), + cXyz(0.0f, -150.0f, 70.0f), + cXyz(0.0f, 0.0f, 70.0f), + cXyz(350.0f, 0.0f, 70.0f), + cXyz(-350.0f, 0.0f, 70.0f), + cXyz(0.0f, 350.0f, 70.0f), + cXyz(0.0f, -350.0f, 70.0f), + }; + + switch (mType) { + case 1: + if (mAngle[1] <= 1000) { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(current.angle.x, current.angle.y, mAngle[0] + mAngle[1]); + + int i; + for (i = 0; i < 9; i++) { + mDoMtx_stack_c::multVec(&vec_array[i], &vec_array[i]); + } + + for (i = 0; i < 9; i++) { + mSph[i].SetC(vec_array[i]); + dComIfG_Ccsp()->Set(&mSph[i]); + } + } + break; + case 0: + mCyl.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCyl); + break; + } } /* 000016DC-000017A4 .text _draw__12daWindMill_cFv */ bool daWindMill_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + + switch (mType) { + case 0: + dComIfGd_setListBG(); + mDoExt_modelEntryDL(mpModel); + dComIfGd_setList(); + break; + case 1: + mDoExt_modelUpdateDL(mpModel); + break; + } + + return true; } /* 000017A4-000017C4 .text daWindMill_Create__FPv */