mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-05-26 23:26:45 -04:00
366 lines
11 KiB
C++
366 lines
11 KiB
C++
/**
|
|
* @file d_a_obj_nagaisu.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_obj_nagaisu.h"
|
|
|
|
/* 80C9F3B8-80C9F3D8 000078 0020+00 1/1 0/0 0/0 .text daObjNagaisu_c_createHeap__FP10fopAc_ac_c */
|
|
static int daObjNagaisu_c_createHeap(fopAc_ac_c* i_this) {
|
|
return ((daObjNagaisu_c*)i_this)->createHeap();
|
|
}
|
|
|
|
/* 80CA0408-80CA040C -00001 0004+00 4/4 0/0 0/0 .data l_arcName */
|
|
static char* l_arcName = "Nagaisu";
|
|
|
|
/* 80C9F3D8-80C9F45C 000098 0084+00 2/2 0/0 0/0 .text __ct__14daObjNagaisu_cFv */
|
|
daObjNagaisu_c::daObjNagaisu_c() {}
|
|
|
|
/* 80C9F4B8-80C9F5A8 000178 00F0+00 1/0 0/0 0/0 .text __dt__14daObjNagaisu_cFv */
|
|
daObjNagaisu_c::~daObjNagaisu_c() {
|
|
dComIfG_resDelete(this, l_arcName);
|
|
}
|
|
|
|
/* 80C9F5A8-80C9F668 000268 00C0+00 1/1 0/0 0/0 .text createHeap__14daObjNagaisu_cFv */
|
|
int daObjNagaisu_c::createHeap() {
|
|
J3DModelData* a_model_data_p = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 4);
|
|
JUT_ASSERT(156, a_model_data_p != NULL);
|
|
|
|
mpModel = mDoExt_J3DModel__create(a_model_data_p, J3DMdlFlag_DifferedDLBuffer, BMD_DEFAULT_DIFF_FLAGS);
|
|
if (mpModel == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
daObjIsuChild_c* a_child_p = mChild;
|
|
for (int i = 0; i < 60; i++) {
|
|
if (!a_child_p->getDeadFlg() && !a_child_p->createHeap()) {
|
|
return 0;
|
|
}
|
|
|
|
a_child_p++;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80CA035C-80CA0378 000000 001C+00 3/3 0/0 0/0 .rodata REMOVE_ISU_IDX__14daObjNagaisu_c */
|
|
const int daObjNagaisu_c::REMOVE_ISU_IDX[] = {
|
|
6,
|
|
7,
|
|
11,
|
|
14,
|
|
18,
|
|
21,
|
|
29,
|
|
};
|
|
|
|
/* 80CA0378-80CA03BC 00001C 0044+00 0/1 0/0 0/0 .rodata s_CcDCyl__15daObjIsuChild_c */
|
|
const dCcD_SrcCyl daObjIsuChild_c::s_CcDCyl = {
|
|
{
|
|
{0, {{0, 0, 0}, {0x400020, 0x11}, 0}},
|
|
{dCcD_SE_NONE, 0, 0, 0, 0},
|
|
{dCcD_SE_NONE, 0, 0, 0, 0},
|
|
{0},
|
|
},
|
|
{
|
|
{0.0f, 0.0f, 0.0f},
|
|
0.0f,
|
|
0.0f,
|
|
},
|
|
};
|
|
|
|
/* 80C9F668-80C9F7A8 000328 0140+00 1/1 0/0 0/0 .text create__14daObjNagaisu_cFv */
|
|
int daObjNagaisu_c::create() {
|
|
fopAcM_SetupActor(this, daObjNagaisu_c);
|
|
|
|
int phase_state = dComIfG_resLoad(this, l_arcName);
|
|
if (phase_state == cPhs_COMPLEATE_e) {
|
|
current.pos.z -= 3300.0f;
|
|
setIsu();
|
|
|
|
if (!fopAcM_entrySolidHeap(this, daObjNagaisu_c_createHeap, 0x12000)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
init();
|
|
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
|
|
fopAcM_setCullSizeBox2(this, mpModel->getModelData());
|
|
|
|
daObjIsuChild_c* a_child_p = mChild;
|
|
for (int i = 0; i < 60; i++) {
|
|
a_child_p->create(this, &mCcStts);
|
|
a_child_p++;
|
|
}
|
|
}
|
|
|
|
return phase_state;
|
|
}
|
|
|
|
/* 80C9F7A8-80C9F81C 000468 0074+00 1/1 0/0 0/0 .text Delete__14daObjNagaisu_cFv */
|
|
int daObjNagaisu_c::Delete() {
|
|
daObjIsuChild_c* a_child_p = mChild;
|
|
for (int i = 0; i < 60; i++) {
|
|
a_child_p->Delete();
|
|
a_child_p->setDeadFlg(true);
|
|
a_child_p++;
|
|
}
|
|
|
|
this->~daObjNagaisu_c();
|
|
return 1;
|
|
}
|
|
|
|
/* 80C9F81C-80C9F8C4 0004DC 00A8+00 1/1 0/0 0/0 .text draw__14daObjNagaisu_cFv */
|
|
int daObjNagaisu_c::draw() {
|
|
g_env_light.settingTevStruct(8, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
|
|
|
|
dMdl_c* a_mdl_p = dMdl_mng_c::entry(mpModel->getModelData(), 0, current.roomNo);
|
|
if (a_mdl_p != NULL) {
|
|
daObjIsuChild_c* a_child_p = mChild;
|
|
for (int i = 0; i < 60; i++) {
|
|
a_child_p->draw(a_mdl_p);
|
|
a_child_p++;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80C9F8C4-80C9F914 000584 0050+00 1/1 0/0 0/0 .text execute__14daObjNagaisu_cFv */
|
|
int daObjNagaisu_c::execute() {
|
|
daObjIsuChild_c* a_child_p = mChild;
|
|
for (int i = 0; i < 60; i++) {
|
|
a_child_p->execute();
|
|
a_child_p++;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80C9F914-80C9F944 0005D4 0030+00 1/1 0/0 0/0 .text init__14daObjNagaisu_cFv */
|
|
void daObjNagaisu_c::init() {
|
|
mCcStts.Init(0xFF, 0, this);
|
|
}
|
|
|
|
/* 80C9F944-80C9FA90 000604 014C+00 1/1 0/0 0/0 .text setIsu__14daObjNagaisu_cFv */
|
|
void daObjNagaisu_c::setIsu() {
|
|
daObjIsuChild_c* a_child_p = mChild;
|
|
f32 start_x_pos = current.pos.x;
|
|
cXyz prev_pos(current.pos.x, current.pos.y, current.pos.z);
|
|
cXyz pos(prev_pos);
|
|
|
|
int row_start_idx = 0;
|
|
int section_start_idx = 3;
|
|
u8 is_remove_isu = false;
|
|
|
|
for (int i = 0; i < 60; i++) {
|
|
if (i == row_start_idx) {
|
|
row_start_idx += 6;
|
|
pos.x = start_x_pos;
|
|
|
|
// after seven rows, move farther back to leave room for the entrance way
|
|
if (i == (6 * 7)) {
|
|
pos.z = 600.0f + prev_pos.z;
|
|
} else {
|
|
pos.z = 300.0f + prev_pos.z;
|
|
}
|
|
} else if (i == section_start_idx) {
|
|
section_start_idx += 6;
|
|
pos.x = 790.0f + prev_pos.x;
|
|
pos.z = prev_pos.z;
|
|
} else {
|
|
pos.x = 280.0f + prev_pos.x;
|
|
pos.z = prev_pos.z;
|
|
}
|
|
|
|
prev_pos.x = pos.x;
|
|
prev_pos.z = pos.z;
|
|
|
|
is_remove_isu = false;
|
|
for (int j = 0; j < 7; j++) {
|
|
if (i == REMOVE_ISU_IDX[j]) {
|
|
is_remove_isu = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (is_remove_isu) {
|
|
a_child_p->setDeadFlg(true);
|
|
} else {
|
|
a_child_p->setDeadFlg(false);
|
|
a_child_p->setPos(pos);
|
|
}
|
|
|
|
a_child_p++;
|
|
}
|
|
}
|
|
|
|
/* 80C9FA90-80C9FAFC 000750 006C+00 1/1 0/0 0/0 .text __ct__15daObjIsuChild_cFv */
|
|
daObjIsuChild_c::daObjIsuChild_c() {
|
|
mIsDead = false;
|
|
mpBgW = NULL;
|
|
}
|
|
|
|
/* 80C9FCDC-80C9FD4C 00099C 0070+00 3/2 0/0 0/0 .text __dt__15daObjIsuChild_cFv */
|
|
daObjIsuChild_c::~daObjIsuChild_c() {}
|
|
|
|
/* 80C9FD4C-80C9FE28 000A0C 00DC+00 1/1 0/0 0/0 .text createHeap__15daObjIsuChild_cFv */
|
|
int daObjIsuChild_c::createHeap() {
|
|
mpBgW = new dBgW();
|
|
if (mpBgW == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
mDoMtx_stack_c::transS(mPos.x, mPos.y, mPos.z);
|
|
mDoMtx_stack_c::YrotM(-0x8000);
|
|
MTXCopy(mDoMtx_stack_c::get(), mBgMtx);
|
|
|
|
if (mpBgW->Set((cBgD_t*)dComIfG_getObjectRes(l_arcName, 7), 1, &mBgMtx) == true) {
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80C9FE28-80C9FF54 000AE8 012C+00 1/1 0/0 0/0 .text
|
|
* create__15daObjIsuChild_cFP14daObjNagaisu_cP9dCcD_Stts */
|
|
void daObjIsuChild_c::create(daObjNagaisu_c* i_parent, dCcD_Stts* i_ccStts) {
|
|
static const int COL_OFFSET_X[] = {
|
|
60,
|
|
-60,
|
|
};
|
|
|
|
if (!mIsDead) {
|
|
for (int i = 0; i < 2; i++) {
|
|
mCcCyl[i].Set(s_CcDCyl);
|
|
mCcCyl[i].SetStts(i_ccStts);
|
|
|
|
cXyz center(mPos.x + COL_OFFSET_X[i], mPos.y, mPos.z + -50.0f);
|
|
mCcCyl[i].SetC(center);
|
|
mCcCyl[i].SetH(180.0f);
|
|
mCcCyl[i].SetR(65.0f);
|
|
}
|
|
|
|
if (dComIfG_Bgsp().Regist(mpBgW, i_parent)) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80C9FF54-80CA0034 000C14 00E0+00 1/1 0/0 0/0 .text execute__15daObjIsuChild_cFv */
|
|
int daObjIsuChild_c::execute() {
|
|
if (!mIsDead) {
|
|
if (chkHit()) {
|
|
callEmt();
|
|
mDoAud_seStart(Z2SE_OBJ_BREAK_WOOD_FURNITURE, &mPos, 0, 0);
|
|
Delete();
|
|
mIsDead = true;
|
|
} else {
|
|
for (int i = 0; i < 2; i++) {
|
|
dComIfG_Ccsp()->Set(&mCcCyl[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80CA0034-80CA00B8 000CF4 0084+00 1/1 0/0 0/0 .text draw__15daObjIsuChild_cFP6dMdl_c */
|
|
int daObjIsuChild_c::draw(dMdl_c* i_mdl) {
|
|
if (!mIsDead) {
|
|
mDoMtx_stack_c::transS(mPos.x, mPos.y, mPos.z);
|
|
mDoMtx_stack_c::YrotM(-0x8000);
|
|
mMdlObj.setMtx(mDoMtx_stack_c::get());
|
|
i_mdl->entryObj(&mMdlObj);
|
|
}
|
|
}
|
|
|
|
/* 80CA00B8-80CA0118 000D78 0060+00 2/2 0/0 0/0 .text Delete__15daObjIsuChild_cFv */
|
|
void daObjIsuChild_c::Delete() {
|
|
if (!mIsDead) {
|
|
if (mpBgW != NULL && mpBgW->ChkUsed()) {
|
|
dComIfG_Bgsp().Release(mpBgW);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80CA0118-80CA0180 000DD8 0068+00 1/1 0/0 0/0 .text chkHit__15daObjIsuChild_cFv */
|
|
bool daObjIsuChild_c::chkHit() {
|
|
for (int i = 0; i < 2; i++) {
|
|
if (mCcCyl[i].ChkTgHit()) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 80CA0180-80CA0258 000E40 00D8+00 1/1 0/0 0/0 .text callEmt__15daObjIsuChild_cFv */
|
|
void daObjIsuChild_c::callEmt() {
|
|
cXyz pos(mPos.x, mPos.y, mPos.z);
|
|
csXyz rot(0, -0x8000, 0);
|
|
cXyz size(1.25f, 1.25f, 1.25f);
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
static const u16 PARTICLE_NAME[] = {
|
|
dPa_RM(ID_ZI_S_LV5KAGU_BREAK_A),
|
|
dPa_RM(ID_ZI_S_LV5KAGU_BREAK_B),
|
|
dPa_RM(ID_ZI_S_LV5KAGU_BREAK_C),
|
|
dPa_RM(ID_ZI_S_LV5KAGU_BREAK_D),
|
|
};
|
|
|
|
dComIfGp_particle_set(PARTICLE_NAME[i], &pos, &rot, &size);
|
|
}
|
|
}
|
|
|
|
/* 80CA0258-80CA02AC 000F18 0054+00 1/0 0/0 0/0 .text daObjNagaisu_create__FP14daObjNagaisu_c */
|
|
static int daObjNagaisu_create(daObjNagaisu_c* i_this) {
|
|
fopAcM_SetupActor(i_this, daObjNagaisu_c);
|
|
return i_this->create();
|
|
}
|
|
|
|
/* 80CA02AC-80CA02CC 000F6C 0020+00 1/0 0/0 0/0 .text daObjNagaisu_Delete__FP14daObjNagaisu_c */
|
|
static int daObjNagaisu_Delete(daObjNagaisu_c* i_this) {
|
|
return i_this->Delete();
|
|
}
|
|
|
|
/* 80CA02CC-80CA02EC 000F8C 0020+00 1/0 0/0 0/0 .text daObjNagaisu_execute__FP14daObjNagaisu_c */
|
|
static int daObjNagaisu_execute(daObjNagaisu_c* i_this) {
|
|
return i_this->execute();
|
|
}
|
|
|
|
/* 80CA02EC-80CA030C 000FAC 0020+00 1/0 0/0 0/0 .text daObjNagaisu_draw__FP14daObjNagaisu_c */
|
|
static int daObjNagaisu_draw(daObjNagaisu_c* i_this) {
|
|
return i_this->draw();
|
|
}
|
|
|
|
/* 80CA040C-80CA042C -00001 0020+00 1/0 0/0 0/0 .data daObjNagaisu_METHODS */
|
|
static actor_method_class daObjNagaisu_METHODS = {
|
|
(process_method_func)daObjNagaisu_create,
|
|
(process_method_func)daObjNagaisu_Delete,
|
|
(process_method_func)daObjNagaisu_execute,
|
|
0,
|
|
(process_method_func)daObjNagaisu_draw,
|
|
};
|
|
|
|
/* 80CA042C-80CA045C -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_Nagaisu */
|
|
extern actor_process_profile_definition g_profile_Obj_Nagaisu = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
7, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_Nagaisu, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daObjNagaisu_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
739, // mPriority
|
|
&daObjNagaisu_METHODS, // sub_method
|
|
0x00040000, // mStatus
|
|
fopAc_ENV_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|