mirror of
https://github.com/zeldaret/tww.git
synced 2026-06-29 18:52:16 -04:00
88a753265e
* d_minigame_starter attempt * water_mark / wpillar done * review changes
234 lines
8.0 KiB
C++
234 lines
8.0 KiB
C++
#include "d/dolzel.h" // IWYU pragma: keep
|
|
#include "d/d_wpillar.h"
|
|
#include "f_op/f_op_kankyo.h"
|
|
#include "d/actor/d_a_player_main.h"
|
|
#include "cstdint.h"
|
|
|
|
/* 8023E968-8023E9E4 .text jointCallBack__10dWpillar_cFi */
|
|
int dWpillar_c::jointCallBack(int i_jointNo) {
|
|
static const f32 min_y[] = {
|
|
0.1418457f,
|
|
18.307327f,
|
|
16.280472f,
|
|
};
|
|
|
|
MtxP m = mpModel->getAnmMtx(i_jointNo);
|
|
f32 var_f2 = mPos.y + mScale.x * min_y[i_jointNo - 1];
|
|
m[1][3] = var_f2 + mHeight * (m[1][3] - var_f2);
|
|
cMtx_copy(m, J3DSys::mCurrentMtx);
|
|
return 1;
|
|
}
|
|
|
|
/* 8023E9E4-8023EA28 .text dWpillar_jointCallBack__FP7J3DNodei */
|
|
static BOOL dWpillar_jointCallBack(J3DNode* i_node, int param_1) {
|
|
if (param_1 == 0) {
|
|
J3DJoint* joint = (J3DJoint*)i_node;
|
|
int jntNo = joint->getJntNo();
|
|
J3DModel* model = j3dSys.getModel();
|
|
|
|
dWpillar_c* i_this = (dWpillar_c*)model->getUserArea();
|
|
i_this->jointCallBack(jntNo);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 8023EA28-8023ECF8 .text draw__10dWpillar_cFv */
|
|
BOOL dWpillar_c::draw() {
|
|
int matNo;
|
|
|
|
g_env_light.settingTevStruct(TEV_TYPE_BG1, &mPos, &mTevstr);
|
|
g_env_light.setLightTevColorType(mpModel, &mTevstr);
|
|
|
|
mBck.entry(mpModel->getModelData());
|
|
|
|
if ((int)mParam == 1) {
|
|
matNo = mpModel->getModelData()->getMaterialNum() - 1;
|
|
while (matNo >= 0) {
|
|
J3DMaterial* material = mpModel->getModelData()->getMaterialNodePointer(matNo);
|
|
|
|
static const GXColorS10 calc_col = {0x00, 0x00, 0x00, 0x3C};
|
|
material->setTevColor(2, (const J3DGXColorS10*)&calc_col);
|
|
matNo--;
|
|
}
|
|
|
|
daPy_getPlayerLinkActorClass()->getBombWaterPillarBrk()->setFrame(mBck.getFrame());
|
|
daPy_getPlayerLinkActorClass()->getBombWaterPillarBtk()->setFrame(mBck.getFrame());
|
|
} else {
|
|
GXColorS10 color;
|
|
color.r = (u8)(mTevstr.mColorC0.r * 0.23529412f + 195.0f);
|
|
color.g = (u8)(mTevstr.mColorC0.g * 0.23529412f + 195.0f);
|
|
color.b = (u8)(mTevstr.mColorC0.b * 0.23529412f + 195.0f);
|
|
|
|
GXColor kcolor;
|
|
kcolor.r = mTevstr.mColorK0.r * 0.92156863f + 20.0f;
|
|
kcolor.g = mTevstr.mColorK0.g * 0.92156863f + 20.0f;
|
|
kcolor.b = mTevstr.mColorK0.b * 0.92156863f + 20.0f;
|
|
|
|
mBtk.entry(mpModel->getModelData(), mBck.getFrame());
|
|
|
|
matNo = mpModel->getModelData()->getMaterialNum() - 1;
|
|
while (matNo >= 0) {
|
|
J3DMaterial* material = mpModel->getModelData()->getMaterialNodePointer(matNo);
|
|
|
|
material->setTevColor(0, (const J3DGXColorS10*)&color);
|
|
material->setTevKColor(0, (const J3DGXColor*)&kcolor);
|
|
matNo--;
|
|
}
|
|
}
|
|
|
|
mDoExt_modelUpdateDL(mpModel);
|
|
return 1;
|
|
}
|
|
|
|
/* 8023ECF8-8023ED18 .text dWpillar_Draw__FP10dWpillar_c */
|
|
static BOOL dWpillar_Draw(dWpillar_c* i_this) {
|
|
return i_this->draw();
|
|
}
|
|
|
|
/* 8023ED18-8023EDB0 .text execute__10dWpillar_cFv */
|
|
BOOL dWpillar_c::execute() {
|
|
mBck.play();
|
|
|
|
if (mBck.isStop()) {
|
|
fopKyM_Delete(this);
|
|
} else {
|
|
f32 water_y;
|
|
if (fopAcM_getWaterY(&mPos, &water_y)) {
|
|
mpModel->getBaseTRMtx()[1][3] = water_y;
|
|
mPos.y = water_y;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 8023EDB0-8023EDD0 .text dWpillar_Execute__FP10dWpillar_c */
|
|
static BOOL dWpillar_Execute(dWpillar_c* i_this) {
|
|
return i_this->execute();
|
|
}
|
|
|
|
/* 8023EDD0-8023EDD8 .text dWpillar_IsDelete__FP10dWpillar_c */
|
|
static BOOL dWpillar_IsDelete(dWpillar_c*) {
|
|
return TRUE;
|
|
}
|
|
|
|
/* 8023EDD8-8023EE08 .text wp_delete__10dWpillar_cFv */
|
|
BOOL dWpillar_c::wp_delete() {
|
|
if (mpHeap != NULL) {
|
|
mDoExt_destroySolidHeap(mpHeap);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 8023EE08-8023EE28 .text dWpillar_Delete__FP10dWpillar_c */
|
|
static BOOL dWpillar_Delete(dWpillar_c* i_this) {
|
|
return i_this->wp_delete();
|
|
}
|
|
|
|
/* 8023EE28-8023F5B0 .text create__10dWpillar_cFv */
|
|
cPhs_State dWpillar_c::create() {
|
|
new (this) dWpillar_c();
|
|
|
|
J3DModelData* modelData;
|
|
BOOL is_anm_init;
|
|
mpHeap = mDoExt_createSolidHeapFromGameToCurrent(0x3440, 0x20);
|
|
if (mpHeap != NULL) {
|
|
if ((int)mParam == 0) {
|
|
modelData = (J3DModelData*)dComIfG_getObjectRes("Always", dRes_INDEX_ALWAYS_BDL_W_PILLAR_A_e);
|
|
JUT_ASSERT(293, modelData != NULL);
|
|
mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000202);
|
|
|
|
J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes("Always", dRes_INDEX_ALWAYS_BCK_W_PILLAR_A_e);
|
|
is_anm_init = mBck.init(modelData, bck, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false);
|
|
|
|
J3DAnmTextureSRTKey* btk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("Always", dRes_INDEX_ALWAYS_BTK_W_PILLAR_A_e);
|
|
is_anm_init &= mBtk.init(modelData, btk, FALSE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1);
|
|
} else {
|
|
modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes("Link", dRes_INDEX_LINK_BDL_GWP00_e));
|
|
JUT_ASSERT(320, modelData != NULL);
|
|
mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000202);
|
|
|
|
J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes("Link", dRes_INDEX_LINK_BCK_GWP00_e);
|
|
is_anm_init = mBck.init(modelData, bck, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false);
|
|
}
|
|
|
|
mDoExt_restoreCurrentHeap();
|
|
mDoExt_adjustSolidHeap(mpHeap);
|
|
} else {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
if (mpModel == NULL || !is_anm_init) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
mHeight = mScale.y;
|
|
mScale.y = mScale.x;
|
|
mpModel->setBaseScale(mScale);
|
|
mDoMtx_stack_c::transS(mPos.x, mPos.y, mPos.z);
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
|
|
if ((int)mParam == 0) {
|
|
for (u16 i = 1; i < modelData->getJointNum(); i++) {
|
|
modelData->getJointNodePointer(i)->setCallBack(dWpillar_jointCallBack);
|
|
}
|
|
|
|
mpModel->setUserArea((std::uintptr_t)this);
|
|
dComIfGp_particle_setShipTail(dPa_name::ID_IT_JN_WP_HAMON01, &mPos, NULL, &mScale, 0xFF, &dPa_control_c::mSingleRippleEcallBack);
|
|
dComIfGp_particle_setShipTail(dPa_name::ID_IT_JN_WP_HAMON02, &mPos, NULL, &mScale, 0xFF, &dPa_control_c::mSingleRippleEcallBack);
|
|
dComIfGp_particle_setShipTail(dPa_name::ID_IT_JN_WP_HAMON03, &mPos, NULL, &mScale, 0xFF, &dPa_control_c::mSingleRippleEcallBack);
|
|
dComIfGp_particle_set(dPa_name::ID_IT_JN_WP_SHIBUKI, &mPos, NULL, &mScale, 0xFF, NULL);
|
|
} else {
|
|
dComIfGp_particle_setBombSmoke(dPa_name::ID_IT_JT_BMEX_SMOKE02, &mPos);
|
|
dComIfGp_particle_setToonP1(dPa_name::ID_IT_JT_WATERSMOKE00, &mPos);
|
|
dComIfGp_particle_setP1(dPa_name::ID_IT_JN_MIZUSHIBUKI_A, &mPos);
|
|
}
|
|
|
|
dBgS_ObjGndChk gndchk;
|
|
gndchk.SetPos(&mPos);
|
|
|
|
int roomNo;
|
|
u8 polyColor;
|
|
f32 y = dComIfG_Bgsp()->GroundCross(&gndchk);
|
|
if (y != -G_CM3D_F_INF) {
|
|
roomNo = dComIfG_Bgsp()->GetRoomId(gndchk);
|
|
polyColor = dComIfG_Bgsp()->GetPolyColor(gndchk);
|
|
} else {
|
|
roomNo = dComIfGp_roomControl_getStayNo();
|
|
polyColor = 0xFF;
|
|
}
|
|
|
|
dKy_tevstr_init(&mTevstr, roomNo, polyColor);
|
|
return cPhs_COMPLEATE_e;
|
|
}
|
|
|
|
/* 8023F5B0-8023F5D0 .text dWpillar_Create__FP12kankyo_class */
|
|
static cPhs_State dWpillar_Create(kankyo_class* i_this) {
|
|
dWpillar_c* a_this = (dWpillar_c*)i_this;
|
|
return a_this->create();
|
|
}
|
|
|
|
static kankyo_method_class l_dWpillar_Method = {
|
|
(process_method_func)dWpillar_Create,
|
|
(process_method_func)dWpillar_Delete,
|
|
(process_method_func)dWpillar_Execute,
|
|
(process_method_func)dWpillar_IsDelete,
|
|
(process_method_func)dWpillar_Draw,
|
|
};
|
|
|
|
kankyo_process_profile_definition g_profile_WPILLAR = {
|
|
/* Layer ID */ fpcLy_CURRENT_e,
|
|
/* List ID */ 8,
|
|
/* List Prio */ fpcPi_CURRENT_e,
|
|
/* Proc Name */ fpcNm_WPILLAR_e,
|
|
/* Proc SubMtd */ &g_fpcLf_Method.base,
|
|
/* Size */ sizeof(dWpillar_c),
|
|
/* Size Other */ 0,
|
|
/* Parameters */ 0,
|
|
/* Leaf SubMtd */ &g_fopKy_Method,
|
|
/* Draw Prio */ fpcDwPi_WPILLAR_e,
|
|
/* Kankyo SubMtd */ &l_dWpillar_Method,
|
|
};
|