work on d_a_wall (#599)

* work on d_a_wall

* fix suggestions and formatting
This commit is contained in:
Andrew Glaze
2024-02-16 13:50:50 -05:00
committed by GitHub
parent e713c46d12
commit 3cf49ac324
2 changed files with 329 additions and 32 deletions
+30 -5
View File
@@ -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 */
+299 -27
View File
@@ -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], &current.pos, &current.angle, NULL,
0xFF, NULL, fopAcM_GetRoomNo(this), &mTevStr.mColorK0,
&mTevStr.mColorK0);
dComIfGp_particle_setProjection(projection_id[mType], &current.pos, &local_28, NULL, 0xFF,
NULL, fopAcM_GetRoomNo(this), &mTevStr.mColorK0,
&mTevStr.mColorK0);
mpEmitter = dComIfGp_particle_set(particle_id[mType], &current.pos, &current.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, &current.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,
};