mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-06-04 02:16:03 -04:00
a290c2d52c
* d_a_npc_ks debug code 100% * d_a_npc_rafrel debug code 100% * d_a_npc_inko minor improvements * d_a_npc_gro debug code 100% * d_a_npc_pachi_taro debug code 100% * d_a_npc_passer debug code 100% * d_a_npc_pachi_maro debug code 100% * d_a_npc_post debug code 100% * d_a_obj_bemos debug improvements * d_a_obj_scannon_ten debug code 100% * d_a_b_mgn debug code 100% * d_a_e_fb debug code 100% * d_a_e_gb debug code 100% * d_a_e_hz debug code 100% * d_a_e_cr_egg debug code 100% * d_a_e_md debug code 100% * d_a_e_wb debug code 100% * d_a_obj_mirror_6pole debug code 100% * d_a_obj_spinLift debug data fixes * d_a_obj_pdwall debug data fixes * d_a_obj_ss_drink debug code almost matching * d_a_obj_poFire debug code 100% * d_a_obj_picture debug code 100% * d_a_obj_dust debug code 100% * d_a_obj_fallobj debug code 100% * d_a_obj_itamato debug code almost matching * d_a_obj_syRock debug code 100% * d_a_obj_katatsumuri debug code 100% * d_a_obj_wood_statue debug code 100% * d_a_obj_lv6egate debug code 100% * d_a_tag_qs minor debug symbol fixes * d_a_obj_twGate debug code 100% * d_a_obj_lv6SwGate debug code 100% * d_a_obj_lv6swturn debug code 100% * d_a_obj_lv6Tenbin debug code 100% * d_a_obj_kwheel01 debug code 100% * Fix RTTI order regression (cM3dGCyl vs cBgS_*)
219 lines
5.9 KiB
C++
219 lines
5.9 KiB
C++
/**
|
|
* @file d_a_obj_pdwall.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_obj_pdwall.h"
|
|
|
|
// these are arrays to force them to not be inlined, not sure if this is fake
|
|
static const int l_dzbidx = 7;
|
|
static const int l_bmdidx = 4;
|
|
|
|
static const cull_box l_cull_box = {
|
|
{-100.0f, -800.0f, -300.0f},
|
|
{750.0f, 500.0f, 300.0f},
|
|
};
|
|
|
|
static char* l_arcName = "P_Dwall";
|
|
|
|
int daObjPDwall_c::create1st() {
|
|
int phase_state = dComIfG_resLoad(this, l_arcName);
|
|
if (phase_state == cPhs_COMPLEATE_e) {
|
|
setMtx();
|
|
|
|
phase_state = MoveBGCreate(l_arcName, l_dzbidx, dBgS_MoveBGProc_TypicalRotY, 0xB1C0, &field_0x5a8);
|
|
if (phase_state == cPhs_ERROR_e) {
|
|
return phase_state;
|
|
}
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
if (dComIfG_Bgsp().Regist(mpBgw[i], this)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
}
|
|
|
|
return phase_state;
|
|
}
|
|
|
|
void daObjPDwall_c::setMtx() {
|
|
for (int i = 0; i < 10; i++) {
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + field_0x808[i], current.pos.z);
|
|
mDoMtx_stack_c::YrotM(current.angle.y - 0x3FFF);
|
|
mDoMtx_stack_c::transM(50.0f * i, 0.0f, 0.0f);
|
|
MTXCopy(mDoMtx_stack_c::get(), field_0x600[i]);
|
|
}
|
|
|
|
mDoMtx_stack_c::copy(field_0x600[0]);
|
|
MTXCopy(mDoMtx_stack_c::get(), field_0x5a8);
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
mDoMtx_stack_c::copy(field_0x600[i + 1]);
|
|
MTXCopy(mDoMtx_stack_c::get(), mMtx[i]);
|
|
}
|
|
}
|
|
|
|
int daObjPDwall_c::CreateHeap() {
|
|
J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(l_arcName, l_bmdidx);
|
|
JUT_ASSERT(175, model_data != NULL);
|
|
|
|
for (int i = 0; i < 10; i++) {
|
|
mpModels[i] = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000084);
|
|
if (mpModels[i] == NULL) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
mpBgw[i] = new dBgW();
|
|
if (mpBgw[i] == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
if (!mpBgw[i]->Set((cBgD_t*)dComIfG_getObjectRes(l_arcName, l_dzbidx), 1, &mMtx[i])) {
|
|
mpBgw[i]->SetCrrFunc(dBgS_MoveBGProc_TypicalRotY);
|
|
} else {
|
|
mpBgw[i] = NULL;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
int daObjPDwall_c::Create() {
|
|
field_0xa14 = 0;
|
|
|
|
if (fopAcM_isSwitch(this, getSwNo())) {
|
|
field_0xa10 = 1;
|
|
} else {
|
|
field_0xa10 = 0;
|
|
}
|
|
|
|
for (int i = 0; i < 10; i++) {
|
|
mpModels[i]->setBaseTRMtx(field_0x600[i]);
|
|
field_0x7e0[i] = 0.0f;
|
|
|
|
if (field_0xa10) {
|
|
field_0x808[i] = (i + 1) * -30.0f;
|
|
} else {
|
|
field_0x808[i] = 0.0f;
|
|
}
|
|
}
|
|
|
|
fopAcM_SetMtx(this, field_0x600[0]);
|
|
fopAcM_setCullSizeBox(this, l_cull_box.min.x, l_cull_box.min.y, l_cull_box.min.z,
|
|
l_cull_box.max.x, l_cull_box.max.y, l_cull_box.max.z);
|
|
return 1;
|
|
}
|
|
|
|
int daObjPDwall_c::Execute(Mtx** param_0) {
|
|
if (field_0xa10 == 0 && fopAcM_isSwitch(this, getSwNo())) {
|
|
field_0xa14++;
|
|
|
|
for (int i = 0; i < 10; i++) {
|
|
if (field_0xa14 >= (9 - i) * 15) {
|
|
field_0x7e0[i] -= 5.0f;
|
|
field_0x808[i] += field_0x7e0[i];
|
|
|
|
if (field_0x808[i] <= -30.0f * (i + 1)) {
|
|
field_0x808[i] = -30.0f * (i + 1);
|
|
field_0x7e0[i] *= -0.2f;
|
|
|
|
if (field_0x830[i] == 0) {
|
|
field_0x830[i] = 1;
|
|
dComIfGp_getVibration().StartShock(8, 0x1F, cXyz(0.0f, 1.0f, 0.0f));
|
|
|
|
Vec sp20;
|
|
sp20.x = (field_0x600[i])[0][3];
|
|
sp20.y = (field_0x600[i])[1][3];
|
|
sp20.z = (field_0x600[i])[2][3];
|
|
Z2GetAudioMgr()->seStart(Z2SE_OBJ_FALL_STAIR, &sp20, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
setMtx();
|
|
|
|
for (int i = 0; i < 10; i++) {
|
|
mpModels[i]->setBaseTRMtx(field_0x600[i]);
|
|
}
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
mpBgw[i]->Move();
|
|
}
|
|
|
|
*param_0 = &field_0x5a8;
|
|
return 1;
|
|
}
|
|
|
|
int daObjPDwall_c::Draw() {
|
|
dComIfGd_setListBG();
|
|
|
|
for (int i = 0; i < 10; i++) {
|
|
g_env_light.settingTevStruct(16, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(mpModels[i], &tevStr);
|
|
mDoExt_modelUpdateDL(mpModels[i]);
|
|
}
|
|
|
|
dComIfGd_setList();
|
|
return 1;
|
|
}
|
|
|
|
int daObjPDwall_c::Delete() {
|
|
for (int i = 0; i < 9; i++) {
|
|
if (mpBgw[i] != NULL && mpBgw[i]->ChkUsed()) {
|
|
dComIfG_Bgsp().Release(mpBgw[i]);
|
|
}
|
|
}
|
|
|
|
dComIfG_resDelete(this, l_arcName);
|
|
return 1;
|
|
}
|
|
|
|
static int daObjPDwall_create1st(daObjPDwall_c* i_this) {
|
|
fopAcM_ct(i_this, daObjPDwall_c);
|
|
return i_this->create1st();
|
|
}
|
|
|
|
static int daObjPDwall_MoveBGDelete(daObjPDwall_c* i_this) {
|
|
return i_this->MoveBGDelete();
|
|
}
|
|
|
|
static int daObjPDwall_MoveBGExecute(daObjPDwall_c* i_this) {
|
|
return i_this->MoveBGExecute();
|
|
}
|
|
|
|
static int daObjPDwall_MoveBGDraw(daObjPDwall_c* i_this) {
|
|
return i_this->MoveBGDraw();
|
|
}
|
|
|
|
static actor_method_class daObjPDwall_METHODS = {
|
|
(process_method_func)daObjPDwall_create1st,
|
|
(process_method_func)daObjPDwall_MoveBGDelete,
|
|
(process_method_func)daObjPDwall_MoveBGExecute,
|
|
0,
|
|
(process_method_func)daObjPDwall_MoveBGDraw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_Obj_PDwall = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
3, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_PDwall, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daObjPDwall_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
671, // mPriority
|
|
&daObjPDwall_METHODS, // sub_method
|
|
0x00044100, // mStatus
|
|
fopAc_ACTOR_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|