summaryrefslogtreecommitdiff
path: root/src/d/actor/d_a_windmill.cpp
diff options
context:
space:
mode:
authorAmmar Askar <ammar@ammaraskar.com>2025-06-03 15:43:15 -0400
committerGitHub <noreply@github.com>2025-06-03 15:43:15 -0400
commit20a252e2540cafec87613a33231dd2f0618feeef (patch)
tree1d81c89cb2f70d05c3cbd46c81b3808dca60d186 /src/d/actor/d_a_windmill.cpp
parent4bf91cbfea65258b917cfc5dd60f909b2c9b715d (diff)
100% match and link d_a_windmill (#783)
* 98% matching d_a_windmill * Match CreateInit * Match hane_move * Fully match and link TU
Diffstat (limited to 'src/d/actor/d_a_windmill.cpp')
-rw-r--r--src/d/actor/d_a_windmill.cpp307
1 files changed, 296 insertions, 11 deletions
diff --git a/src/d/actor/d_a_windmill.cpp b/src/d/actor/d_a_windmill.cpp
index fcb22e76..1740755d 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, &current.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 */