Files
tww/src/d/d_wpillar.cpp
T
TakaRikka 88a753265e water_mark / wpillar done, minigame_starter wip (#1069)
* d_minigame_starter attempt

* water_mark / wpillar done

* review changes
2026-06-28 18:40:28 -04:00

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,
};