100% match and link d_a_windmill (#783)

* 98% matching d_a_windmill

* Match CreateInit

* Match hane_move

* Fully match and link TU
This commit is contained in:
Ammar Askar
2025-06-03 15:43:15 -04:00
committed by GitHub
parent 4bf91cbfea
commit 20a252e254
4 changed files with 313 additions and 16 deletions
+1 -1
View File
@@ -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"),
+6 -2
View File
@@ -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();
+10 -2
View File
@@ -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 */
+296 -11
View File
@@ -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 */