mirror of
https://github.com/zeldaret/tww.git
synced 2026-07-10 22:31:52 -04:00
work on d_a_wall (#599)
* work on d_a_wall * fix suggestions and formatting
This commit is contained in:
@@ -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
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user