From 3cf49ac324ec894dd21c7b10eef1518f73747579 Mon Sep 17 00:00:00 2001 From: Andrew Glaze Date: Fri, 16 Feb 2024 13:50:50 -0500 Subject: [PATCH] work on d_a_wall (#599) * work on d_a_wall * fix suggestions and formatting --- include/d/actor/d_a_wall.h | 35 +++- src/d/actor/d_a_wall.cpp | 326 ++++++++++++++++++++++++++++++++++--- 2 files changed, 329 insertions(+), 32 deletions(-) diff --git a/include/d/actor/d_a_wall.h b/include/d/actor/d_a_wall.h index 87aa24660..0f9453036 100644 --- a/include/d/actor/d_a_wall.h +++ b/include/d/actor/d_a_wall.h @@ -1,26 +1,51 @@ #ifndef D_A_WALL_H #define D_A_WALL_H +#include "SSystem/SComponent/c_phase.h" +#include "d/d_bg_w.h" +#include "d/d_cc_d.h" +#include "d/d_particle.h" #include "f_op/f_op_actor.h" class daWall_c : public fopAc_ac_c { public: - BOOL _delete(); - void CreateHeap(); + inline daWall_c(); + bool _delete(); + BOOL CreateHeap(); void CreateInit(); s32 _create(); void set_mtx(); void setMoveBGMtx(); - BOOL _execute(); + bool _execute(); void mode_wait(); void mode_break(); void set_tri(); void set_effect(); void set_se(); - BOOL _draw(); + bool _draw(); public: - /* Place member variables here */ + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ dCcD_Stts mStts; + /* 0x2D8 */ dCcD_Tri mTri[2]; + /* 0x578 */ dBgW* mpBgW; + /* 0x57C */ Mtx mMtx; + /* 0x5AC */ u8 mState; + /* 0x5B0 */ dPa_smokeEcallBack mSmokeCb; + /* 0x5D0 */ JPABaseEmitter* mpEmitter; + /* 0x5D4 */ float mDst; + /* 0x5D8 */ u8 mBreakCounter; + /* 0x5DC */ s32 mSwitchIndex; + /* 0x5E0 */ u8 mType; + + static _GXColor m_smoke_color; + static const s16 m_heapsize[3]; + static const char* m_arcname[3]; + static const Vec m_cull_size[6]; + static const Vec m_tri_vtx[3][4]; + static const s16 m_bmdname[3]; + static const s16 m_dzbname[3]; }; #endif /* D_A_WALL_H */ diff --git a/src/d/actor/d_a_wall.cpp b/src/d/actor/d_a_wall.cpp index 27c78c83c..9b817b351 100644 --- a/src/d/actor/d_a_wall.cpp +++ b/src/d/actor/d_a_wall.cpp @@ -4,99 +4,371 @@ // #include "d/actor/d_a_wall.h" +#include "d/d_cc_d.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" #include "dolphin/types.h" +#include "f_op/f_op_actor_mng.h" +#include "m_Do/m_Do_mtx.h" + +const s16 daWall_c::m_heapsize[3] = { + 0x1160, + 0x1DD0, + 0x2000, +}; + +const s16 daWall_c::m_bmdname[3] = {0x04, 0x04, 0x04}; +const s16 daWall_c::m_dzbname[3] = {0x07, 0x07, 0x07}; + +const Vec daWall_c::m_tri_vtx[3][4] = { + {{150.0f, -120.0f, 0.0f}, + {-150.0f, -120.0f, 0.0f}, + {-150.0f, 120.0f, 0.0f}, + {150.0f, 120.0f, 0.0f}}, + {{700.0f, -500.0f, 0.0f}, + {-700.0f, -500.0f, 0.0f}, + {-700.0f, 500.0f, 0.0f}, + {700.0f, 500.0f, 0.0f}}, + {{180.0f, -90.0f, 0.0f}, + {-180.0f, -90.0f, 0.0f}, + {-180.0f, 90.0f, 0.0f}, + {180.0f, 90.0f, 0.0f}}, +}; + +const Vec daWall_c::m_cull_size[6] = { + {-180.0f, -150.0f, -50.0f}, {180.0f, 150.0f, 50.0f}, {-700.0f, -600.0f, -100.0f}, + {700.0f, 600.0f, 100.0f}, {-200.0f, -100.0f, -50.0f}, {200.0f, 100.0f, 50.0f}, +}; + +const char* daWall_c::m_arcname[3] = { + "Hbw1", + "Htw1", + "Hbw2", +}; + +_GXColor daWall_c::m_smoke_color = { + /* r */ 0x86, + /* g */ 0x66, + /* b */ 0x6D, + /* a */ 0xC8, +}; + +static dCcD_SrcTri l_tri_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_BOMB, + /* SrcObjTg SPrm */ G_TG_SPRM_SHIELD | G_TG_SPRM_SHIELD_FRONT_RANGE, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ G_TG_SPRM_NO_HIT_MARK, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGTriS + { + /* a */ 0.0f, + 0.0f, + 0.0f, + /* b */ 0.0f, + 0.0f, + 0.0f, + /* c */ 0.0f, + 0.0f, + 0.0f, + }, +}; + +daWall_c::daWall_c() : mSmokeCb(m_smoke_color, NULL, 0) {} /* 00000078-00000100 .text _delete__8daWall_cFv */ -BOOL daWall_c::_delete() { - /* Nonmatching */ +bool daWall_c::_delete() { + mSmokeCb.end(); + if (heap != NULL && mState == false) + dComIfG_Bgsp()->Release(mpBgW); + + dComIfG_resDelete(&mPhs, m_arcname[mType]); + return TRUE; } /* 00000100-00000120 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daWall_c*)i_this)->CreateHeap(); } /* 00000120-00000288 .text CreateHeap__8daWall_cFv */ -void daWall_c::CreateHeap() { - /* Nonmatching */ +BOOL daWall_c::CreateHeap() { + J3DModelData* modelData = + (J3DModelData*)(dComIfG_getObjectRes(m_arcname[mType], m_bmdname[mType])); + JUT_ASSERT(0x181, modelData != 0); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022); + if (mpModel == NULL) + return FALSE; + + setMoveBGMtx(); + mpBgW = new dBgW(); + + if (mpBgW) { + bool error = mpBgW->Set((cBgD_t*)dComIfG_getObjectRes(m_arcname[mType], m_dzbname[mType]), + cBgW::MOVE_BG_e, &mMtx); + return error != true ? TRUE : FALSE; + } + + return false; } /* 00000288-00000380 .text CreateInit__8daWall_cFv */ void daWall_c::CreateInit() { - /* Nonmatching */ + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + Vec cullMin = m_cull_size[mType * 2]; + Vec cullMax = m_cull_size[mType * 2 + 1]; + fopAcM_setCullSizeBox(this, cullMin.x, cullMin.y, cullMin.z, cullMax.x, cullMax.y, cullMax.z); + fopAcM_setCullSizeFar(this, 1.0f); + mStts.Init(0xFF, 0xFF, this); + set_tri(); + dComIfG_Bgsp()->Regist(mpBgW, this); + set_mtx(); + mpBgW->Move(); + mSwitchIndex = fopAcM_GetParam(this) & 0xFF; + mState = false; } /* 00000380-000004EC .text _create__8daWall_cFv */ s32 daWall_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daWall_c); + mType = fopAcM_GetParam(this) >> 8; + mSwitchIndex = fopAcM_GetParam(this) & 0xFF; + bool isSwitch = dComIfGs_isSwitch(mSwitchIndex, fopAcM_GetHomeRoomNo(this)); + if (isSwitch || mSwitchIndex == 0xff) { + return cPhs_ERROR_e; + } + + s32 phase_state = dComIfG_resLoad(&mPhs, m_arcname[mType]); + + if (phase_state == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, m_heapsize[mType])) { + return cPhs_ERROR_e; + } + CreateInit(); + } + + return phase_state; } /* 00000800-00000880 .text set_mtx__8daWall_cFv */ void daWall_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(mScale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000880-000008F0 .text setMoveBGMtx__8daWall_cFv */ void daWall_c::setMoveBGMtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(fopAcM_GetShapeAngle_p(this)->y); + mDoMtx_stack_c::scaleM(mScale); + mDoMtx_copy(mDoMtx_stack_c::get(), mMtx); } /* 000008F0-00000980 .text _execute__8daWall_cFv */ -BOOL daWall_c::_execute() { +bool daWall_c::_execute() { /* Nonmatching */ + typedef void (daWall_c::*procFunc)(); + static procFunc mode_proc[] = { + &daWall_c::mode_wait, + &daWall_c::mode_break, + }; + + (this->*mode_proc[mState])(); + return 1; } /* 00000980-00000A58 .text mode_wait__8daWall_cFv */ void daWall_c::mode_wait() { - /* Nonmatching */ + for (int i = 0; i < 2; i++) { + if (mTri[i].ChkTgHit()) { + cCcD_Obj* at = mTri[i].GetTgHitObj(); + if (at != NULL && at->ChkAtType(AT_TYPE_BOMB)) { + set_effect(); + set_se(); + break; + } else { + mTri[i].ClrTgHit(); + } + } + } + + for (int i = 0; i < 2; i++) { + dComIfG_Ccsp()->Set(&mTri[i]); + } } /* 00000A58-00000B14 .text mode_break__8daWall_cFv */ void daWall_c::mode_break() { - /* Nonmatching */ + if (mBreakCounter != 0) { + mBreakCounter = mBreakCounter + 1; + switch (mType) { + case 0: + case 1: + case 2: + if ((mBreakCounter > 10) && (cLib_chaseF(&mDst, 0.0f, 2.222222f))) { + fopAcM_delete(this); + } + + JPABaseEmitter* pEmitter = mSmokeCb.mpEmitter; + if (pEmitter != NULL) { + pEmitter->mGlobalPrmColor.a = mDst; + } + break; + default: + fopAcM_delete(this); + break; + } + } + fopDwTg_DrawQTo(&mDwTg); } /* 00000B14-00000D84 .text set_tri__8daWall_cFv */ void daWall_c::set_tri() { - /* Nonmatching */ + for (int i = 0; i < 2; i++) { + mTri[i].Set(l_tri_src); + mTri[i].SetStts(&mStts); + } + + Vec vertex[3]; + vertex[0] = m_tri_vtx[mType][0]; + vertex[1] = m_tri_vtx[mType][1]; + vertex[2] = m_tri_vtx[mType][2]; + mDoMtx_stack_c::transS(fopAcM_GetPosition(this)); + mDoMtx_stack_c::YrotM(fopAcM_GetAngle_p(this)->y); + + for (int i = 0; i < 3; i++) { + mDoMtx_stack_c::multVec(&vertex[i], &vertex[i]); + } + mTri[0].mA = vertex[0]; + mTri[0].mB = vertex[1]; + mTri[0].mC = vertex[2]; + + cM3d_CalcPla(&mTri[0].mA, &mTri[0].mB, &mTri[0].mC, &mTri[0].mNormal, &mTri[0].mD); + + vertex[0] = m_tri_vtx[mType][0]; + vertex[1] = m_tri_vtx[mType][2]; + vertex[2] = m_tri_vtx[mType][3]; + for (int i = 0; i < 3; i++) { + mDoMtx_stack_c::multVec(&vertex[i], &vertex[i]); + } + mTri[1].mA = vertex[0]; + mTri[1].mB = vertex[1]; + mTri[1].mC = vertex[2]; + cM3d_CalcPla(&mTri[1].mA, &mTri[1].mB, &mTri[1].mC, &mTri[1].mNormal, &mTri[1].mD); } /* 00000D84-00000F74 .text set_effect__8daWall_cFv */ void daWall_c::set_effect() { - /* Nonmatching */ + u16 projection_id[3] = {0xa16e, 0xa170, 0xa172}; + u16 particle_id[3] = {0xa16f, 0xa171, 0xa173}; + + csXyz local_28 = current.angle; + local_28.y += 0x8000; + mDst = 200.00f; + + switch (mType) { + case 0: + case 1: + case 2: + dComIfGp_particle_setProjection(projection_id[mType], ¤t.pos, ¤t.angle, NULL, + 0xFF, NULL, fopAcM_GetRoomNo(this), &mTevStr.mColorK0, + &mTevStr.mColorK0); + dComIfGp_particle_setProjection(projection_id[mType], ¤t.pos, &local_28, NULL, 0xFF, + NULL, fopAcM_GetRoomNo(this), &mTevStr.mColorK0, + &mTevStr.mColorK0); + mpEmitter = dComIfGp_particle_set(particle_id[mType], ¤t.pos, ¤t.angle, NULL, + mDst, &mSmokeCb, fopAcM_GetRoomNo(this)); + if (mpEmitter != NULL) { + mpEmitter->becomeImmortalEmitter(); + } + break; + default: + mpEmitter = NULL; + break; + } + mBreakCounter = 1; + mState = 1; + dComIfG_Bgsp()->Release(mpBgW); + if (mSwitchIndex != 0xFF) + dComIfGs_onSwitch(mSwitchIndex, fopAcM_GetHomeRoomNo(this)); } /* 00000F74-00000FE4 .text set_se__8daWall_cFv */ void daWall_c::set_se() { - /* Nonmatching */ + /* Nonmatching - incorrect rodata offsets */ + fopAcM_seStart(this, JA_SE_OBJ_BOMB_WALL_BRK, 0); } /* 00000FE4-00001044 .text _draw__8daWall_cFv */ -BOOL daWall_c::_draw() { - /* Nonmatching */ +bool daWall_c::_draw() { + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &mTevStr); + g_env_light.setLightTevColorType(mpModel, &mTevStr); + mDoExt_modelUpdateDL(mpModel); + return TRUE; } /* 00001044-00001064 .text daWall_Create__FPv */ -static s32 daWall_Create(void*) { - /* Nonmatching */ +static s32 daWall_Create(void* i_this) { + return ((daWall_c*)i_this)->_create(); } /* 00001064-00001088 .text daWall_Delete__FPv */ -static BOOL daWall_Delete(void*) { - /* Nonmatching */ +static BOOL daWall_Delete(void* i_this) { + return ((daWall_c*)i_this)->_delete(); } /* 00001088-000010AC .text daWall_Draw__FPv */ -static BOOL daWall_Draw(void*) { - /* Nonmatching */ +static BOOL daWall_Draw(void* i_this) { + return ((daWall_c*)i_this)->_draw(); } /* 000010AC-000010D0 .text daWall_Execute__FPv */ -static BOOL daWall_Execute(void*) { - /* Nonmatching */ +static BOOL daWall_Execute(void* i_this) { + return ((daWall_c*)i_this)->_execute(); } /* 000010D0-000010D8 .text daWall_IsDelete__FPv */ static BOOL daWall_IsDelete(void*) { - /* Nonmatching */ + return TRUE; } + +static actor_method_class daWallMethodTable = { + (process_method_func)daWall_Create, (process_method_func)daWall_Delete, + (process_method_func)daWall_Execute, (process_method_func)daWall_IsDelete, + (process_method_func)daWall_Draw, +}; + +actor_process_profile_definition g_profile_WALL = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 7, + /* ListPrio */ fpcPi_CURRENT_e, + /* ProcName */ PROC_WALL, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daWall_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x198, + /* Actor SubMtd */ &daWallMethodTable, + /* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_CUSTOM_e, +};