Files
tww/src/d/actor/d_a_syan.cpp
T
123456789758 c1f54653fd Document several more TU names (#770)
Co-authored-by: ‎ ‎ ‎ <‎ ‎ ‎>
2025-05-29 00:11:39 -04:00

259 lines
11 KiB
C++

/**
* d_a_syan.cpp
* Object - Unused - Chandelier (Spaceworld 2001 trailer)
*/
#include "d/actor/d_a_syan.h"
#include "m_Do/m_Do_ext.h"
#include "d/d_procname.h"
#include "d/d_priority.h"
#include "d/d_com_inf_game.h"
#include "d/d_s_play.h"
#include "d/res/res_syan.h"
#include "weak_bss_936_to_1036.h" // IWYU pragma: keep
#include "weak_data_1811.h" // IWYU pragma: keep
static f32 b_pos_x[6] = { 870.0f, 420.0f, -420.0f, -880.0f, -400.0f, 440.0f };
static f32 b_pos_y[6] = { -560.0f, -760.0f, -630.0f, -710.0f, -670.0f, -690.0f };
static f32 b_pos_z[6] = { 0.0f, 750.0f, 750.0f, 0.0f, -720.0f, -750.0f };
/* 000000EC-000002D4 .text nodeCallBack__FP7J3DNodei */
static BOOL nodeCallBack(J3DNode* node, int calcTiming) {
J3DJoint* joint = (J3DJoint*)node;
if (calcTiming == J3DNodeCBCalcTiming_In) {
s32 jntNo = joint->getJntNo();
J3DModel* model = j3dSys.getModel();
syan_class* i_this = (syan_class*)model->getUserArea();
if (i_this != NULL) {
mDoMtx_copy(model->getAnmMtx(jntNo), *calc_mtx);
if (jntNo == 2) {
cMtx_YrotM(*calc_mtx, i_this->field_0x2a4[0].y);
cMtx_XrotM(*calc_mtx, -i_this->field_0x2a4[0].x);
cMtx_ZrotM(*calc_mtx, i_this->field_0x2a4[0].z);
model->setAnmMtx(jntNo, *calc_mtx);
cMtx_copy(*calc_mtx, J3DSys::mCurrentMtx);
} else if (jntNo == 5) {
cMtx_YrotM(*calc_mtx, i_this->field_0x2b0.y);
cMtx_XrotM(*calc_mtx, -(i_this->field_0x2a4[1].x + i_this->field_0x2b0.x));
cMtx_ZrotM(*calc_mtx, i_this->field_0x2b0.z);
model->setAnmMtx(jntNo, *calc_mtx);
cMtx_copy(*calc_mtx, J3DSys::mCurrentMtx);
for (s32 i = 0; i < (s32)ARRAY_SIZE(b_pos_x); i++) {
cXyz b_pos(b_pos_x[i], b_pos_y[i], b_pos_z[i]);
i_this->partPosOld[i] = i_this->partPos[i];
MtxPosition(&b_pos, &i_this->partPos[i]);
}
}
}
}
return TRUE;
}
/* 00000310-00000440 .text syan_draw__FP10syan_class */
void syan_draw(syan_class* i_this) {
GXColor color;
color.r = REG0_S(4) + 0xEB;
color.g = REG0_S(5) + 0x7D;
color.b = REG0_S(6);
color.a = REG0_S(7);
for (s32 i = 0; i < (s32)ARRAY_SIZE(i_this->partPos); i++) {
MtxTrans(i_this->partPos[i].x, i_this->partPos[i].y, i_this->partPos[i].z, false);
f32 scale = i_this->partScale1[i] * i_this->partScale2[i];
MtxScale(scale, scale, scale, true);
cMtx_YrotM(*calc_mtx, i_this->partRotY[i]);
cMtx_copy(*calc_mtx, i_this->partMtx[i]);
dComIfGd_setAlphaModelColor(color);
dComIfGd_setAlphaModel(dDlst_alphaModel_c::TYPE_TWO_SPHERES, i_this->partMtx[i], i_this->partAlpha[i]);
}
}
/* 00000440-000004AC .text daSyan_Draw__FP10syan_class */
static BOOL daSyan_Draw(syan_class* i_this) {
g_env_light.settingTevStruct(TEV_TYPE_BG0, &i_this->current.pos, &i_this->tevStr);
g_env_light.setLightTevColorType(i_this->morf->getModel(), &i_this->tevStr);
i_this->morf->entryDL();
syan_draw(i_this);
return TRUE;
}
/* 000004AC-00000CA0 .text daSyan_Execute__FP10syan_class */
static BOOL daSyan_Execute(syan_class* i_this) {
for (s32 i = 0; i < (s32)ARRAY_SIZE(i_this->timer); i++)
if (i_this->timer[i] != 0)
i_this->timer[i]--;
i_this->morf->calc();
i_this->frameCount++;
i_this->field_0x2c4 += i_this->field_0x2cc;
i_this->field_0x2c8 += i_this->field_0x2d0;
i_this->field_0x2a4[0].x = i_this->field_0x2bc * cM_ssin(i_this->field_0x2c4);
i_this->field_0x2a4[1].x = i_this->field_0x2c0 * cM_ssin(i_this->field_0x2c8);
i_this->field_0x2b0.y = i_this->field_0x2b8 * cM_ssin((s16)i_this->frameCount * (REG0_S(8) + 800));
i_this->field_0x2b0.z = i_this->field_0x2b8 * cM_ssin((s16)i_this->frameCount * (REG0_S(9) + 700));
switch (i_this->state) {
case 0:
break;
case 1:
cLib_addCalcAngleS2(&i_this->field_0x2b0.x, REG0_S(1) + 2500, 2, REG0_S(2) + 250);
cLib_addCalc2(&i_this->field_0x2bc, REG0_F(1) * 100.0f + 1500.0f, 0.5f, REG0_F(12) * 100.0f + 150.0f);
cLib_addCalc2(&i_this->field_0x2c0, 2500.0f, 0.5f, 250.0f);
cLib_addCalc2(&i_this->field_0x2b8, 2000.0f, 0.5f, 200.0f);
if (i_this->timer[0] == 0)
i_this->state++;
break;
case 2:
cLib_addCalc2(&i_this->field_0x2cc, REG0_F(4) * 100.0f + 500.0f, 0.1f, REG0_F(5) * 100.0f + 50.0f);
cLib_addCalc2(&i_this->field_0x2d0, REG0_F(6) * 100.0f + 1000.0f, 0.1f, REG0_F(7) * 100.0f + 20.0f);
cLib_addCalc2(&i_this->field_0x2bc, i_this->field_0x2dc * (REG0_F(8) * 100.0f + 300.0f), 0.1f, REG0_F(9) * 100.0f + 10.0f);
cLib_addCalc2(&i_this->field_0x2c0, i_this->field_0x2dc * (REG0_F(10) * 100.0f + 300.0f), 0.1f, REG0_F(11) * 100.0f + 10.0f);
cLib_addCalcAngleS2(&i_this->field_0x2b0.x, REG0_S(1) + 2500, 2, REG0_S(2) + 2000);
cLib_addCalc2(&i_this->field_0x2b8, i_this->field_0x2dc * 500.0f, 0.2f, REG0_F(13) + 5.0f);
break;
}
J3DModel* model = i_this->morf->getModel();
i_this->scale.set(0.25f, 0.25f, 0.25f);
model->setBaseScale(i_this->scale);
mDoMtx_stack_c::transS(i_this->current.pos);
mDoMtx_stack_c::lYrotM(i_this->current.angle.y);
model->setBaseTRMtx(mDoMtx_stack_c::get());
for (s32 i = 0; i < syan_class::kEmtrNum; i++) {
if (i_this->field_0x58c[i] == 0) {
i_this->field_0x58c[i] = cM_rndF(REG0_F(2) + 10.0f) + 5.0f + REG0_F(3);
i_this->field_0x52c[i] = cM_rndF(REG0_F(6) + 4.0f) + 4.0f + REG0_F(7);
}
if (i_this->field_0x598[i] == 0) {
i_this->field_0x598[i] = cM_rndF(6.0f) + 3.0f;
i_this->field_0x55c[i] = cM_rndF(0.075f) + 0.75f;
}
cLib_addCalc2(&i_this->partAlpha[i], i_this->field_0x52c[i], 1.0f, REG0_F(4) + 0.1f);
cLib_addCalc2(&i_this->partScale1[i], i_this->field_0x55c[i], 0.4f, 0.04f);
i_this->partRotY[i] += 0x100;
if (i_this->field_0x5a4[i] == 0) {
cLib_addCalc2(&i_this->partScale2[i], REG0_F(9) + 0.75f, 0.5f, 0.05f);
if (!i_this->emtrEnabled[i]) {
i_this->emtrEnabled[i] = true;
static cXyz fire_scale(0.7f, 0.7f, 0.7f);
dComIfGp_particle_set(dPa_name::ID_COMMON_01EA, &i_this->partPos[i], NULL, &fire_scale, 0xFF, &i_this->emtrCallBack[i]);
} else {
JPABaseEmitter* emtr = i_this->emtrCallBack[i].getEmitter();
if (emtr != NULL) {
JGeometry::TVec3<f32> dir;
dir.x = (REG0_F(3) + -0.03f) * (i_this->partPos[i].x - i_this->partPosOld[i].x);
if (dir.x > 1.0f) dir.x = 1.0f;
else if (dir.x < -1.0f) dir.x = -1.0f;
dir.z = (REG0_F(3) + -0.03f) * (i_this->partPos[i].z - i_this->partPosOld[i].z);
if (dir.z > 1.0f) dir.z = 1.0f;
else if (dir.z < -1.0f) dir.z = -1.0f;
dir.y = 0.1f;
emtr->setDirection(dir);
f32 dirMag = std::sqrtf(dir.x*dir.x + dir.z*dir.z);
f32 scaleY = (REG0_F(12) + 2.0f) * dirMag + 1.0f;
if (scaleY > REG0_F(13) + 4.0f)
scaleY = REG0_F(13) + 4.0f;
JGeometry::TVec3<f32> scale(1.0f, scaleY, 1.0f);
i_this->emtrCallBack[i].getEmitter()->setGlobalParticleScale(scale);
cXyz pos(i_this->partPos[i].x, i_this->partPos[i].y + REG0_F(7) + 20.0f, i_this->partPos[i].z);
dComIfGp_particle_setSimple(dPa_name::ID_COMMON_4004, &pos);
}
}
}
if (i_this->field_0x58c[i] != 0)
i_this->field_0x58c[i]--;
if (i_this->field_0x598[i] != 0)
i_this->field_0x598[i]--;
if (i_this->field_0x5a4[i] != 0)
i_this->field_0x5a4[i]--;
}
return TRUE;
}
/* 00000CA0-00000CA8 .text daSyan_IsDelete__FP10syan_class */
static BOOL daSyan_IsDelete(syan_class* i_this) {
return TRUE;
}
/* 00000CA8-00000D1C .text daSyan_Delete__FP10syan_class */
static BOOL daSyan_Delete(syan_class* i_this) {
dComIfG_resDelete(&i_this->mPhs, "Syan");
for (s32 i = 0; i < (s32)ARRAY_SIZE(i_this->emtrCallBack); i++)
i_this->emtrCallBack[i].end();
return TRUE;
}
/* 00000D1C-00000E10 .text daSyan_solidHeapCB__FP10fopAc_ac_c */
static BOOL daSyan_solidHeapCB(fopAc_ac_c* i_ac) {
syan_class* i_this = (syan_class*)i_ac;
i_this->morf = new mDoExt_McaMorf(
(J3DModelData*)dComIfG_getObjectRes("Syan", SYAN_BDL_SYAN),
NULL, NULL,
(J3DAnmTransform*)dComIfG_getObjectRes("Syan", SYAN_BCK_SYAN),
J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1, NULL, 0x80000, 0x11000002
);
return i_this->morf != NULL;
}
/* 00000E10-00000FE0 .text daSyan_Create__FP10fopAc_ac_c */
static cPhs_State daSyan_Create(fopAc_ac_c* i_ac) {
fopAcM_SetupActor(i_ac, syan_class);
syan_class* i_this = (syan_class*)i_ac;
cPhs_State rt = dComIfG_resLoad(&i_this->mPhs, "Syan");
if (rt == cPhs_COMPLEATE_e) {
if (fopAcM_entrySolidHeap(i_this, daSyan_solidHeapCB, 0x3e40) != 0) {
J3DModel* model = i_this->morf->getModel();
for (u16 i = 0; i < model->getModelData()->getJointNum(); i++) {
model->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack);
}
fopAcM_SetMin(i_this, -1000.0f, -5000.0f, -1000.0f);
fopAcM_SetMax(i_this, 1000.0f, 5000.0f, 1000.0f);
fopAcM_SetMtx(i_this, i_this->morf->getModel()->getBaseTRMtx());
model->setUserArea((u32)i_this);
i_this->field_0x2b8 = 200.0f;
static s16 fire_time[] = { 0, 5, 10, 15, 20, 25 };
for (s32 i = 0; i < ARRAY_SIZE(i_this->field_0x5a4); i++)
i_this->field_0x5a4[i] = fire_time[i];
} else {
rt = cPhs_ERROR_e;
}
}
return rt;
}
static actor_method_class l_daSyan_Method = {
(process_method_func)daSyan_Create,
(process_method_func)daSyan_Delete,
(process_method_func)daSyan_Execute,
(process_method_func)daSyan_IsDelete,
(process_method_func)daSyan_Draw,
};
actor_process_profile_definition g_profile_SYAN = {
/* LayerID */ fpcLy_CURRENT_e,
/* ListID */ 0x0007,
/* ListPrio */ fpcPi_CURRENT_e,
/* ProcName */ PROC_SYAN,
/* Proc SubMtd */ &g_fpcLf_Method.base,
/* Size */ sizeof(syan_class),
/* SizeOther */ 0,
/* Parameters */ 0,
/* Leaf SubMtd */ &g_fopAc_Method.base,
/* Priority */ PRIO_SYAN,
/* Actor SubMtd */ &l_daSyan_Method,
/* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e,
/* Group */ fopAc_ACTOR_e,
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
};