mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-23 06:54:16 -04:00
656 lines
20 KiB
C++
656 lines
20 KiB
C++
/**
|
|
* d_a_obj_barrier.cpp
|
|
* Object - Hyrule barrier
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
#include "d/actor/d_a_obj_barrier.h"
|
|
#include "d/res/res_ycage.h"
|
|
#include "JSystem/JUtility/JUTAssert.h"
|
|
#include "d/actor/d_a_player.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_item_data.h"
|
|
#include "d/d_procname.h"
|
|
#include "d/d_priority.h"
|
|
#include "f_op/f_op_actor_mng.h"
|
|
#include "m_Do/m_Do_graphic.h"
|
|
#include "m_Do/m_Do_mtx.h"
|
|
|
|
namespace {
|
|
static const char l_arcname[] = "Ycage";
|
|
|
|
static const dCcD_SrcCyl l_cyl_at_src = {
|
|
// dCcD_SrcGObjInf
|
|
{
|
|
/* Flags */ 0,
|
|
/* SrcObjAt Type */ AT_TYPE_UNK800,
|
|
/* SrcObjAt Atp */ 1,
|
|
/* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsPlayer_e,
|
|
/* SrcObjTg Type */ 0,
|
|
/* SrcObjTg SPrm */ 0,
|
|
/* SrcObjCo SPrm */ 0,
|
|
/* SrcGObjAt Se */ 0,
|
|
/* SrcGObjAt HitMark */ 0,
|
|
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK9,
|
|
/* SrcGObjAt Mtrl */ 0,
|
|
/* SrcGObjAt SPrm */ dCcG_AtSPrm_NoConHit_e | dCcG_AtSPrm_NoHitMark_e,
|
|
/* SrcGObjTg Se */ 0,
|
|
/* SrcGObjTg HitMark */ 0,
|
|
/* SrcGObjTg Spl */ 0,
|
|
/* SrcGObjTg Mtrl */ 0,
|
|
/* SrcGObjTg SPrm */ 0,
|
|
/* SrcGObjCo SPrm */ 0,
|
|
},
|
|
// cM3dGCylS
|
|
{{
|
|
/* Center */ {0.0f, 0.0f, 0.0f},
|
|
/* Radius */ 1000.0f,
|
|
/* Height */ 10000.0f,
|
|
}},
|
|
};
|
|
|
|
static const dCcD_SrcCyl l_cyl_tg_src = {
|
|
// dCcD_SrcGObjInf
|
|
{
|
|
/* Flags */ 0,
|
|
/* SrcObjAt Type */ 0,
|
|
/* SrcObjAt Atp */ 0,
|
|
/* SrcObjAt SPrm */ 0,
|
|
/* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_UNK400000 | AT_TYPE_LIGHT),
|
|
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsOther_e,
|
|
/* 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 */ dCcG_TgSPrm_NoConHit_e | dCcG_TgSPrm_NoHitMark_e,
|
|
/* SrcGObjCo SPrm */ 0,
|
|
},
|
|
// cM3dGCylS
|
|
{{
|
|
/* Center */ {0.0f, 0.0f, 0.0f},
|
|
/* Radius */ 1000.0f,
|
|
/* Height */ 10000.0f,
|
|
}},
|
|
};
|
|
|
|
static cXyz l_ef_scale(1.0f, 1.0f, 1.0f);
|
|
} // namespace
|
|
|
|
/* 000000EC-0000018C .text init_mtx__14daObjBarrier_cFv */
|
|
void daObjBarrier_c::init_mtx() {
|
|
mAnm.getMdlP()->setBaseScale(scale);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mAnm.getMdlP()->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
|
|
mDoMtx_stack_c::scaleM(scale);
|
|
cMtx_copy(mDoMtx_stack_c::get(), mBgMtx);
|
|
}
|
|
|
|
/* 0000018C-000001B0 .text solidHeapCB__14daObjBarrier_cFP10fopAc_ac_c */
|
|
int daObjBarrier_c::solidHeapCB(fopAc_ac_c* i_this) {
|
|
return static_cast<daObjBarrier_c*>(i_this)->create_heap();
|
|
}
|
|
|
|
/* 000001B0-00000340 .text init__18daObjBarrier_anm_cFv */
|
|
bool daObjBarrier_anm_c::init() {
|
|
bool rt = true;
|
|
J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(l_arcname, YCAGE_BDL_YCAGE00));
|
|
J3DAnmTextureSRTKey* pbtk = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(l_arcname, YCAGE_BTK_YCAGE00));
|
|
J3DAnmTevRegKey* pbrk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(l_arcname, YCAGE_BRK_YCAGE00));
|
|
|
|
if (modelData == NULL || pbtk == NULL || pbrk == NULL) {
|
|
JUT_ASSERT(VERSION_SELECT(406, 406, 407, 407), FALSE);
|
|
rt = false;
|
|
} else {
|
|
mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x1000200);
|
|
BOOL btk_init =
|
|
mBtk.init(modelData, pbtk, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, 0);
|
|
BOOL brk_init =
|
|
mBrk.init(modelData, pbrk, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, 0);
|
|
|
|
if (mpModel == NULL || !btk_init || !brk_init) {
|
|
rt = false;
|
|
}
|
|
}
|
|
|
|
return rt;
|
|
}
|
|
|
|
/* 00000340-000003E8 .text create_heap__14daObjBarrier_cFv */
|
|
bool daObjBarrier_c::create_heap() {
|
|
bool rt = true;
|
|
bool anm_init = mAnm.init();
|
|
bool eff_init = mEffect.init();
|
|
|
|
if (!anm_init || !eff_init) {
|
|
rt = false;
|
|
} else {
|
|
cBgD_t* dzb = (cBgD_t*)dComIfG_getObjectRes(l_arcname, YCAGE_DZB_KEKKAI);
|
|
mpBgW = dBgW_NewSet(dzb, cBgW::MOVE_BG_e, &mBgMtx);
|
|
if (mpBgW == NULL) {
|
|
rt = false;
|
|
}
|
|
}
|
|
|
|
return rt;
|
|
}
|
|
|
|
/* 000003E8-00000508 .text checkCollision_Tg__14daObjBarrier_cFv */
|
|
bool daObjBarrier_c::checkCollision_Tg() {
|
|
if (mTgCyl.ChkTgHit()) {
|
|
fopAc_ac_c* hit_actor = mTgCyl.GetTgHitAc();
|
|
if (hit_actor != NULL) {
|
|
cXyz hit_pos = hit_actor->current.pos;
|
|
int no_set_effect = true;
|
|
|
|
if (hit_actor == dComIfGp_getPlayer(0)) {
|
|
no_set_effect = false;
|
|
if (mTgCyl.GetTgHitObj() != NULL) {
|
|
hit_pos = *mTgCyl.GetTgHitPosP();
|
|
}
|
|
}
|
|
|
|
mEffect.birth(hit_actor, scale.x * 1000.0f, mTgCyl.GetC(), hit_pos, no_set_effect);
|
|
}
|
|
|
|
mTgCyl.ClrTgHit();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 00000544-00000608 .text checkCollision_At__14daObjBarrier_cFv */
|
|
void daObjBarrier_c::checkCollision_At() {
|
|
if (mAtCyl.ChkAtHit()) {
|
|
fopAc_ac_c* hit_actor = mAtCyl.GetAtHitAc();
|
|
fopAc_ac_c* player_p = dComIfGp_getPlayer(0);
|
|
|
|
if (hit_actor != NULL && hit_actor == player_p) {
|
|
mEffect.birth(hit_actor, scale.x * 1000.0f, mAtCyl.GetC(), hit_actor->current.pos, 1);
|
|
}
|
|
|
|
mAtCyl.ClrAtHit();
|
|
}
|
|
}
|
|
|
|
/* 00000608-00000754 .text registCollisionTable__14daObjBarrier_cFv */
|
|
void daObjBarrier_c::registCollisionTable() {
|
|
cXyz pos = current.pos;
|
|
pos.y -= 300.0f;
|
|
|
|
f32 base_radius = scale.x * 1000.0f;
|
|
f32 height = scale.y * 10000.0f + 300.0f;
|
|
|
|
mAtCyl.SetC(pos);
|
|
mAtCyl.SetR(base_radius - 60.0f);
|
|
mAtCyl.SetH(height);
|
|
|
|
mTgCyl.SetC(pos);
|
|
mTgCyl.SetR(base_radius - 20.0f);
|
|
mTgCyl.SetH(height);
|
|
|
|
cXyz at_vec = current.pos - dComIfGp_getPlayer(0)->current.pos;
|
|
mAtCyl.SetAtVec(at_vec);
|
|
|
|
dComIfG_Ccsp()->Set(&mAtCyl);
|
|
dComIfG_Ccsp()->Set(&mTgCyl);
|
|
}
|
|
|
|
/* 00000754-00000884 .text brkAnmPlay__14daObjBarrier_cFv */
|
|
void daObjBarrier_c::brkAnmPlay() {
|
|
f32 dist_to_playerXZ = (dComIfGp_getPlayer(0)->current.pos - current.pos).absXZ();
|
|
f32 radius = scale.x * 1000.0f - 150.0f;
|
|
|
|
f32 var_r3;
|
|
if (dist_to_playerXZ > radius) {
|
|
var_r3 = 0.0f;
|
|
} else {
|
|
var_r3 = radius - dist_to_playerXZ;
|
|
}
|
|
|
|
f32 brk_frame;
|
|
if (var_r3 > 700.0f) {
|
|
brk_frame = 1.0f;
|
|
} else {
|
|
brk_frame = (1.0f - var_r3 / 700.0f) * 59.0f + 1.0f;
|
|
}
|
|
|
|
mAnm.setBrkFrame(brk_frame);
|
|
}
|
|
|
|
#if VERSION > VERSION_JPN
|
|
/* 00000884-000009F0 .text break_start_wait_proc__14daObjBarrier_cFv */
|
|
void daObjBarrier_c::break_start_wait_proc() {
|
|
// 0x3980: Saw Hyrule 3 Electric Barrier Demo
|
|
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_3980) == true) {
|
|
daPy_py_c* player_p = (daPy_py_c*)daPy_getPlayerActorClass();
|
|
|
|
if ((player_p->current.pos - current.pos).absXZ() >= 8800.0f &&
|
|
dComIfGs_getSelectEquip(0) == dItem_MASTER_SWORD_3_e)
|
|
{
|
|
switch (player_p->getCutType()) {
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
case 9:
|
|
case 10:
|
|
dComIfGs_onEventBit(dSv_event_flag_c::BARRIER_BREAK);
|
|
mEventID = dComIfGp_evmng_getEventIdx("seal");
|
|
mBarrierProc = PROC_BREAK_ORDER;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 000009F0-00000A58 .text break_order_proc__14daObjBarrier_cFv */
|
|
void daObjBarrier_c::break_order_proc() {
|
|
if (eventInfo.checkCommandDemoAccrpt()) {
|
|
mBarrierProc = PROC_BREAK_END_WAIT;
|
|
} else {
|
|
fopAcM_orderOtherEventId(this, mEventID);
|
|
eventInfo.onCondition(dEvtCnd_UNK2_e);
|
|
}
|
|
}
|
|
|
|
/* 00000A58-00000AB8 .text break_end_wait_proc__14daObjBarrier_cFv */
|
|
void daObjBarrier_c::break_end_wait_proc() {
|
|
if (dComIfGp_evmng_endCheck(mEventID)) {
|
|
dComIfGp_event_reset();
|
|
fopAcM_delete(this);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
/* 00000AB8-00000B34 .text break_check__14daObjBarrier_cFv */
|
|
bool daObjBarrier_c::break_check() {
|
|
bool chk = false;
|
|
|
|
#if VERSION <= VERSION_JPN
|
|
if (mMoya == 0) {
|
|
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_3980) == true) {
|
|
daPy_py_c* player_p = (daPy_py_c*)daPy_getPlayerActorClass();
|
|
|
|
if ((player_p->current.pos - current.pos).absXZ() >= 8800.0f) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::BARRIER_BREAK);
|
|
dComIfGp_setNextStage("Hyrule", 0xE9, 0, 9);
|
|
chk = true;
|
|
}
|
|
}
|
|
}
|
|
#else
|
|
if (mMoya == 0) {
|
|
switch (mBarrierProc) {
|
|
case PROC_BREAK_START_WAIT:
|
|
break_start_wait_proc();
|
|
break;
|
|
case PROC_BREAK_ORDER:
|
|
break_order_proc();
|
|
chk = true;
|
|
break;
|
|
case PROC_BREAK_END_WAIT:
|
|
break_end_wait_proc();
|
|
chk = true;
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return chk;
|
|
}
|
|
|
|
/* 00000B34-00000D24 .text setDummyTexture__17daObjBarrier_ef_cFi */
|
|
void daObjBarrier_ef_c::setDummyTexture(int i_idx) {
|
|
J3DModelData* modelData = mpModel[i_idx]->getModelData();
|
|
J3DTexture* texture = modelData->getTexture();
|
|
JUTNameTab* textureName = modelData->getTextureName();
|
|
|
|
JUT_ASSERT(VERSION_SELECT(710, 710, 808, 808), texture != NULL);
|
|
JUT_ASSERT(VERSION_SELECT(711, 711, 809, 809), textureName != NULL);
|
|
|
|
for (u16 i = 0; i < texture->getNum(); i++) {
|
|
if (strcmp(textureName->getName(i), "__dummy") == 0) {
|
|
texture->setResTIMG(i, *mDoGph_gInf_c::getFrameBufferTimg());
|
|
}
|
|
}
|
|
|
|
mDoExt_modelTexturePatch(modelData);
|
|
}
|
|
|
|
/* 00000D24-00000D5C .text checkHitActor__17daObjBarrier_ef_cFP10fopAc_ac_c */
|
|
bool daObjBarrier_ef_c::checkHitActor(fopAc_ac_c* i_checkActor) {
|
|
bool chk = false;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (mHitActor[i] == i_checkActor) {
|
|
chk = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return chk;
|
|
}
|
|
|
|
/* 00000D5C-000011B8 .text birth__17daObjBarrier_ef_cFP10fopAc_ac_cf4cXyz4cXyzi */
|
|
void daObjBarrier_ef_c::birth(fopAc_ac_c* i_hitActor, f32 i_radius, cXyz i_center, cXyz i_hitPos,
|
|
int i_isNoEff) {
|
|
if (!i_isNoEff || !checkHitActor(i_hitActor)) {
|
|
int effect_idx = -1;
|
|
csXyz angle(0, 0, 0);
|
|
angle.y = cM_atan2s(i_center.x - i_hitPos.x, i_center.z - i_hitPos.z);
|
|
|
|
cXyz pos;
|
|
pos.x = i_center.x + i_radius * -cM_ssin(angle.y);
|
|
pos.z = i_center.z + i_radius * -cM_scos(angle.y);
|
|
pos.y = i_hitPos.y;
|
|
|
|
int i;
|
|
int active_flags = mActiveEffFlags;
|
|
for (i = 0; i < 4; i++) {
|
|
if (!((active_flags >> i) & 1)) {
|
|
effect_idx = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (effect_idx == -1) {
|
|
f32 var_f1 = -1.0f;
|
|
for (i = 0; i < 4; i++) {
|
|
if (mBtk[i].getFrame() > var_f1) {
|
|
var_f1 = mBtk[i].getFrame();
|
|
effect_idx = i;
|
|
}
|
|
}
|
|
}
|
|
|
|
active_flags = mActiveEffFlags;
|
|
for (i = 0; i < 4; i++) {
|
|
if ((int)((active_flags >> i) & 1) == true) {
|
|
if (i != effect_idx) {
|
|
mBtk[i].setPlaySpeed((mBtk[i].getEndFrame() - mBtk[i].getFrame()) / 3.0f);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
mActiveEffFlags |= 1 << effect_idx;
|
|
mPos[effect_idx] = pos;
|
|
mAngle[effect_idx] = angle.y;
|
|
mHitActor[effect_idx] = i_hitActor;
|
|
|
|
J3DModelData* modelData = mpModel[effect_idx]->getModelData();
|
|
|
|
J3DAnmTextureSRTKey* btk_anm_p = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(l_arcname, YCAGE_BTK_YHRBR00));
|
|
JUT_ASSERT(VERSION_SELECT(839, 839, 937, 937), btk_anm_p != NULL);
|
|
|
|
J3DAnmTransform* bck_anm_p = static_cast<J3DAnmTransform*>(dComIfG_getObjectRes(l_arcname, YCAGE_BCK_YHRBR00));
|
|
JUT_ASSERT(VERSION_SELECT(844, 844, 942, 942), bck_anm_p != NULL);
|
|
|
|
J3DAnmTevRegKey* brk_anm_p = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(l_arcname, YCAGE_BRK_YHRBR00));
|
|
JUT_ASSERT(VERSION_SELECT(849, 849, 947, 947), brk_anm_p != NULL);
|
|
|
|
mBtk[effect_idx].init(modelData, btk_anm_p, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1,
|
|
true, 0);
|
|
mBck[effect_idx].init(modelData, bck_anm_p, TRUE, J3DFrameCtrl::EMode_NONE, 0.0f, 0, -1,
|
|
true);
|
|
mBrk[effect_idx].init(modelData, brk_anm_p, TRUE, J3DFrameCtrl::EMode_NONE, 0.0f, 0, -1,
|
|
true, 0);
|
|
|
|
mDoMtx_stack_c::transS(pos.x, pos.y, pos.z);
|
|
mDoMtx_stack_c::ZXYrotM(0, angle.y, 0);
|
|
mpModel[effect_idx]->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
|
|
dComIfGp_particle_set(dPa_name::ID_AK_SN_HIRALBARRIER00, &pos, &angle);
|
|
}
|
|
}
|
|
|
|
/* 000011B8-000013E0 .text init__17daObjBarrier_ef_cFv */
|
|
bool daObjBarrier_ef_c::init() {
|
|
bool rt = true;
|
|
J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(l_arcname, YCAGE_BDL_YHRBR00));
|
|
J3DAnmTextureSRTKey* pbtk = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(l_arcname, YCAGE_BTK_YHRBR00));
|
|
J3DAnmTransform* pbck = static_cast<J3DAnmTransform*>(dComIfG_getObjectRes(l_arcname, YCAGE_BCK_YHRBR00));
|
|
J3DAnmTevRegKey* pbrk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(l_arcname, YCAGE_BRK_YHRBR00));
|
|
|
|
if (modelData == NULL || pbtk == NULL || pbck == NULL || pbrk == NULL) {
|
|
JUT_ASSERT(VERSION_SELECT(918, 918, 1016, 1016), FALSE);
|
|
rt = false;
|
|
} else {
|
|
for (int i = 0; i < 4; i++) {
|
|
mpModel[i] = mDoExt_J3DModel__create(modelData, 0x80000, 0x5020200);
|
|
setDummyTexture(i);
|
|
|
|
BOOL btk_init = mBtk[i].init(modelData, pbtk, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0,
|
|
-1, false, 0);
|
|
BOOL bck_init =
|
|
mBck[i].init(modelData, pbck, TRUE, J3DFrameCtrl::EMode_NONE, 0.0f, 0, -1, false);
|
|
BOOL brk_init = mBrk[i].init(modelData, pbrk, TRUE, J3DFrameCtrl::EMode_NONE, 0.0f, 0,
|
|
-1, false, 0);
|
|
|
|
if (mpModel[i] == NULL || !btk_init || !bck_init || !brk_init) {
|
|
rt = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return rt;
|
|
}
|
|
|
|
/* 000013E0-00001420 .text create__17daObjBarrier_ef_cFv */
|
|
void daObjBarrier_ef_c::create() {
|
|
for (int i = 0; i < 4; i++) {
|
|
mpModel[i]->setBaseScale(l_ef_scale);
|
|
}
|
|
}
|
|
|
|
/* 00001420-000014E0 .text execute__17daObjBarrier_ef_cFv */
|
|
void daObjBarrier_ef_c::execute() {
|
|
int active_flags = mActiveEffFlags;
|
|
for (int i = 0; i < 4; i++) {
|
|
if (((active_flags >> i) & 1)) {
|
|
mBtk[i].play();
|
|
|
|
if (mBtk[i].isStop() == true) {
|
|
active_flags ^= 1 << i;
|
|
mHitActor[i] = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
mActiveEffFlags = active_flags;
|
|
}
|
|
|
|
/* 000014E0-00001638 .text draw__17daObjBarrier_ef_cFv */
|
|
void daObjBarrier_ef_c::draw() {
|
|
J3DModel* model_p;
|
|
|
|
int active_flags = mActiveEffFlags;
|
|
for (int i = 0; i < 4; i++) {
|
|
if (((active_flags >> i) & 1)) {
|
|
model_p = mpModel[i];
|
|
|
|
J3DModelData* modelData = model_p->getModelData();
|
|
mBtk[i].entry(modelData, getBtkFrame(i));
|
|
mBck[i].entry(model_p->getModelData(), (s16)getBtkFrame(i));
|
|
mBrk[i].entry(model_p->getModelData(), (s16)getBtkFrame(i));
|
|
|
|
dComIfGd_setListInvisisble();
|
|
mDoExt_modelUpdateDL(model_p);
|
|
dComIfGd_setList();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00001638-0000182C .text _create__14daObjBarrier_cFv */
|
|
cPhs_State daObjBarrier_c::_create() {
|
|
cPhs_State phase = cPhs_ERROR_e;
|
|
fopAcM_SetupActor(this, daObjBarrier_c);
|
|
|
|
if (fopAcM_IsFirstCreating(this)) {
|
|
mMoya = param_get_moya();
|
|
if (mMoya != 0) {
|
|
mBarrierActive = true;
|
|
} else if (dComIfGs_isEventBit(dSv_event_flag_c::BARRIER_BREAK) == true) {
|
|
mBarrierActive = false;
|
|
} else {
|
|
mBarrierActive = true;
|
|
}
|
|
}
|
|
|
|
if (mBarrierActive == true) {
|
|
phase = dComIfG_resLoad(&mPhase, l_arcname);
|
|
}
|
|
|
|
if (phase == cPhs_COMPLEATE_e) {
|
|
if (fopAcM_entrySolidHeap(this, solidHeapCB, 0x30E0)) {
|
|
if (dComIfG_Bgsp()->Regist(mpBgW, this)) {
|
|
phase = cPhs_ERROR_e;
|
|
} else {
|
|
mpBgW->SetCrrFunc(NULL);
|
|
scale.z = scale.x;
|
|
fopAcM_SetMtx(this, mAnm.getMdlP()->getBaseTRMtx());
|
|
init_mtx();
|
|
|
|
mAtStts.Init(0xFF, 0xFF, this);
|
|
mAtCyl.Set(l_cyl_at_src);
|
|
mAtCyl.SetStts(&mAtStts);
|
|
mAtCyl.OnBsRevHit();
|
|
|
|
mTgStts.Init(0xFF, 0xFF, this);
|
|
mTgCyl.Set(l_cyl_tg_src);
|
|
mTgCyl.SetStts(&mTgStts);
|
|
mTgCyl.OnBsRevHit();
|
|
|
|
if (param_get_damage()) {
|
|
mAtCyl.SetAtAtp(0);
|
|
}
|
|
|
|
mEffect.create();
|
|
}
|
|
} else {
|
|
phase = cPhs_ERROR_e;
|
|
}
|
|
}
|
|
|
|
return phase;
|
|
}
|
|
|
|
/* 00001A38-00001AD8 .text _delete__14daObjBarrier_cFv */
|
|
bool daObjBarrier_c::_delete() {
|
|
if (mBarrierActive == true) {
|
|
dComIfG_resDelete(&mPhase, l_arcname);
|
|
|
|
if (heap != NULL && mpBgW != NULL) {
|
|
if (mpBgW->ChkUsed()) {
|
|
dComIfG_Bgsp()->Release(mpBgW);
|
|
}
|
|
|
|
mpBgW = NULL;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00001AD8-00001B64 .text _execute__14daObjBarrier_cFv */
|
|
bool daObjBarrier_c::_execute() {
|
|
mAnm.mBtk.play();
|
|
brkAnmPlay();
|
|
|
|
mpBgW->Move();
|
|
mAtStts.Move();
|
|
mTgStts.Move();
|
|
|
|
checkCollision_At();
|
|
if (!checkCollision_Tg()) {
|
|
registCollisionTable();
|
|
}
|
|
|
|
if (!break_check()) {
|
|
mEffect.execute();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00001B64-00001C1C .text _draw__14daObjBarrier_cFv */
|
|
bool daObjBarrier_c::_draw() {
|
|
#if VERSION > VERSION_JPN
|
|
if (mBarrierProc) {
|
|
return true;
|
|
}
|
|
#endif
|
|
|
|
if (mMoya == 0) {
|
|
mAnm.getBtkAnmP()->entry(mAnm.getMdlP()->getModelData());
|
|
mAnm.getBrkAnmP()->entry(mAnm.getMdlP()->getModelData(), (s16)mAnm.getBrkFrame());
|
|
mDoExt_modelUpdateDL(mAnm.getMdlP());
|
|
}
|
|
|
|
mEffect.draw();
|
|
return true;
|
|
}
|
|
|
|
/* 00001C1C-00001C3C .text daObjBarrier_Create__FP10fopAc_ac_c */
|
|
static cPhs_State daObjBarrier_Create(fopAc_ac_c* i_this) {
|
|
return static_cast<daObjBarrier_c*>(i_this)->_create();
|
|
}
|
|
|
|
/* 00001C3C-00001C60 .text daObjBarrier_Delete__FP14daObjBarrier_c */
|
|
static BOOL daObjBarrier_Delete(daObjBarrier_c* i_this) {
|
|
return static_cast<daObjBarrier_c*>(i_this)->_delete();
|
|
}
|
|
|
|
/* 00001C60-00001C84 .text daObjBarrier_Execute__FP14daObjBarrier_c */
|
|
static BOOL daObjBarrier_Execute(daObjBarrier_c* i_this) {
|
|
return static_cast<daObjBarrier_c*>(i_this)->_execute();
|
|
}
|
|
|
|
/* 00001C84-00001CA8 .text daObjBarrier_Draw__FP14daObjBarrier_c */
|
|
static BOOL daObjBarrier_Draw(daObjBarrier_c* i_this) {
|
|
return static_cast<daObjBarrier_c*>(i_this)->_draw();
|
|
}
|
|
|
|
/* 00001CA8-00001CB0 .text daObjBarrier_IsDelete__FP14daObjBarrier_c */
|
|
static BOOL daObjBarrier_IsDelete(daObjBarrier_c* i_this) {
|
|
return TRUE;
|
|
}
|
|
|
|
static actor_method_class l_daObjBarrier_Method = {
|
|
(process_method_func)daObjBarrier_Create,
|
|
(process_method_func)daObjBarrier_Delete,
|
|
(process_method_func)daObjBarrier_Execute,
|
|
(process_method_func)daObjBarrier_IsDelete,
|
|
(process_method_func)daObjBarrier_Draw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_Obj_Barrier = {
|
|
/* LayerID */ fpcLy_CURRENT_e,
|
|
/* ListID */ 0x0007,
|
|
/* ListPrio */ fpcPi_CURRENT_e,
|
|
/* ProcName */ PROC_Obj_Barrier,
|
|
/* Proc SubMtd */ &g_fpcLf_Method.base,
|
|
/* Size */ sizeof(daObjBarrier_c),
|
|
/* SizeOther */ 0,
|
|
/* Parameters */ 0,
|
|
/* Leaf SubMtd */ &g_fopAc_Method.base,
|
|
/* Priority */ PRIO_Obj_Barrier,
|
|
/* Actor SubMtd */ &l_daObjBarrier_Method,
|
|
/* Status */ fopAcStts_UNK40000_e,
|
|
/* Group */ fopAc_ACTOR_e,
|
|
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
|
|
};
|