Files
tww/src/d/actor/d_a_windmill.cpp
T
2026-05-07 15:59:23 -04:00

518 lines
16 KiB
C++

//
// Generated by dtk
// Translation Unit: d_a_windmill.cpp
//
#include "d/dolzel_rel.h" // IWYU pragma: keep
#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"
const char* daWindMill_c::m_arcname[] = { "Hpu1", "Hpu2" };
static dCcD_SrcSph l_sph_src = {
// dCcD_SrcGObjInf
{
/* Flags */ 0,
/* SrcObjAt Type */ AT_TYPE_UNK2000,
/* SrcObjAt Atp */ 1,
/* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsOther_e,
/* SrcObjTg Type */ 0,
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsOther_e,
/* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e | cCcD_CoSPrm_VsGrpAll_e,
/* SrcGObjAt Se */ 0,
/* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e,
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK0,
/* SrcGObjAt Mtrl */ 0,
/* SrcGObjAt SPrm */ 0,
/* SrcGObjTg Se */ 0,
/* SrcGObjTg HitMark */ 0,
/* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0,
/* SrcGObjTg Mtrl */ 0,
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e,
/* SrcGObjCo SPrm */ 0,
},
// cM3dGSphS
{{
/* Center */ {0.0f, 0.0f, 0.0f},
/* Radius */ 90.0f,
}},
};
static dCcD_SrcCps l_cps_src = {
// dCcD_SrcGObjInf
{
/* Flags */ 0,
/* SrcObjAt Type */ AT_TYPE_UNK800,
/* SrcObjAt Atp */ 1,
/* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_GrpAll_e,
/* SrcObjTg Type */ 0,
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsOther_e,
/* SrcObjCo SPrm */ 0,
/* SrcGObjAt Se */ 0,
/* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e,
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK1,
/* SrcGObjAt Mtrl */ 0,
/* SrcGObjAt SPrm */ 0,
/* SrcGObjTg Se */ 0,
/* SrcGObjTg HitMark */ 0,
/* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0,
/* SrcGObjTg Mtrl */ 0,
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e,
/* SrcGObjCo SPrm */ 0,
},
// cM3dGCpsS
{{
/* Start */ {0.0f, 0.0f, 0.0f},
/* End */ {0.0f, 0.0f, 0.0f},
/* Radius */ 200.0f,
}},
};
static dCcD_SrcCyl l_cyl_src = {
// dCcD_SrcGObjInf
{
/* Flags */ 0,
/* SrcObjAt Type */ 0,
/* SrcObjAt Atp */ 0,
/* SrcObjAt SPrm */ 0,
/* SrcObjTg Type */ AT_TYPE_ALL,
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsOther_e,
/* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e | cCcD_CoSPrm_VsGrpAll_e,
/* SrcGObjAt Se */ 0,
/* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e,
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK0,
/* SrcGObjAt Mtrl */ 0,
/* SrcGObjAt SPrm */ dCcG_AtSPrm_StopNoConHit_e,
/* SrcGObjTg Se */ 0,
/* SrcGObjTg HitMark */ 0,
/* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0,
/* SrcGObjTg Mtrl */ 0,
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e,
/* SrcGObjCo SPrm */ 0,
},
// cM3dGCylS
{{
/* Center */ {0.0f, 0.0f, 0.0f},
/* Radius */ 250.0f,
/* Height */ 400.0f,
}},
};
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() {
if (
#if VERSION > VERSION_DEMO
heap != NULL &&
#endif
mpBgW != NULL
) {
dComIfG_Bgsp()->Release(mpBgW);
}
dComIfG_resDeleteDemo(&mPhs, m_arcname[mType]);
return TRUE;
}
/* 000000E8-00000108 .text CheckCreateHeap__FP10fopAc_ac_c */
static BOOL CheckCreateHeap(fopAc_ac_c* i_ac) {
return ((daWindMill_c*)i_ac)->CreateHeap();
}
/* 00000108-000002A0 .text CreateHeap__12daWindMill_cFv */
BOOL daWindMill_c::CreateHeap() {
J3DModelData* modelData = (J3DModelData*) dComIfG_getObjectRes(m_arcname[mType], m_bmdidx[mType]);
JUT_ASSERT(DEMO_SELECT(399, 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() {
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* 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 */
void daWindMill_c::search_wind() {
fopAc_ac_c* windTag = fopAcM_SearchByName(PROC_WindTag);
if (windTag != NULL)
mWindTagId = fopAcM_GetID(windTag);
else
mWindTagId = fpcM_ERROR_PROCESS_ID_e;
}
/* 00000670-00000804 .text _create__12daWindMill_cFv */
cPhs_State daWindMill_c::_create() {
fopAcM_ct(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() {
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() {
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() {
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();
}
}
s16 target_angle = 2500;
target_angle = wind_float * target_angle;
cLib_addCalcAngleS(&mAngle[1], target_angle, 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() {
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;
s16 r0;
switch (mType) {
case 1:
r0 = 1000;
if (mAngle[1] > r0) {
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:
r0 = 1000;
if (mAngle[1] > r0) {
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() {
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),
};
s16 r0;
switch (mType) {
case 1:
r0 = 1000;
if (mAngle[1] <= r0) {
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() {
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 */
static cPhs_State daWindMill_Create(void* i_ac) {
return ((daWindMill_c*)i_ac)->_create();
}
/* 000017C4-000017E8 .text daWindMill_Delete__FPv */
static BOOL daWindMill_Delete(void* i_ac) {
return ((daWindMill_c*)i_ac)->_delete();
}
/* 000017E8-0000180C .text daWindMill_Draw__FPv */
static BOOL daWindMill_Draw(void* i_ac) {
return ((daWindMill_c*)i_ac)->_draw();
}
/* 0000180C-00001830 .text daWindMill_Execute__FPv */
static BOOL daWindMill_Execute(void* i_ac) {
return ((daWindMill_c*)i_ac)->_execute();
}
/* 00001830-00001838 .text daWindMill_IsDelete__FPv */
static BOOL daWindMill_IsDelete(void*) {
return TRUE;
}
static actor_method_class daWindMillMethodTable = {
(process_method_func)daWindMill_Create,
(process_method_func)daWindMill_Delete,
(process_method_func)daWindMill_Execute,
(process_method_func)daWindMill_IsDelete,
(process_method_func)daWindMill_Draw,
};
actor_process_profile_definition g_profile_WINDMILL = {
/* LayerID */ fpcLy_CURRENT_e,
/* ListID */ 0x0003,
/* ListPrio */ fpcPi_CURRENT_e,
/* ProcName */ PROC_WINDMILL,
/* Proc SubMtd */ &g_fpcLf_Method.base,
/* Size */ sizeof(daWindMill_c),
/* SizeOther */ 0,
/* Parameters */ 0,
/* Leaf SubMtd */ &g_fopAc_Method.base,
/* Priority */ PRIO_WINDMILL,
/* Actor SubMtd */ &daWindMillMethodTable,
/* Status */ fopAcStts_CULL_e | fopAcStts_UNK4000_e | fopAcStts_UNK40000_e,
/* Group */ fopAc_ACTOR_e,
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
};