mirror of
https://github.com/zeldaret/tww.git
synced 2026-06-09 04:29:46 -04:00
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:
+1
-1
@@ -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"),
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user