mirror of
https://github.com/zeldaret/tww.git
synced 2026-06-03 18:36:06 -04:00
905 lines
26 KiB
C++
905 lines
26 KiB
C++
/**
|
|
* d_a_obj_warpt.cpp
|
|
* Object - Warp pot
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
#include "d/actor/d_a_obj_warpt.h"
|
|
#include "d/actor/d_a_player.h"
|
|
#include "d/res/res_ltubw.h"
|
|
#include "d/d_bg_w.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_lib.h"
|
|
#include "d/d_procname.h"
|
|
#include "d/d_priority.h"
|
|
#include "d/d_a_obj.h"
|
|
#include "d/d_bg_s_movebg_actor.h"
|
|
#include "f_op/f_op_actor_mng.h"
|
|
#include "m_Do/m_Do_hostIO.h"
|
|
|
|
class daObj_Warpt_HIO_c : public mDoHIO_entry_c {
|
|
public:
|
|
daObj_Warpt_HIO_c();
|
|
virtual ~daObj_Warpt_HIO_c() {}
|
|
void genMessage(JORMContext*) {}
|
|
|
|
/* 0x04 */ u8 m04;
|
|
/* 0x05 */ u8 m05;
|
|
/* 0x06 */ u8 m06;
|
|
/* 0x08 */ f32 m08;
|
|
/* 0x0C */ f32 m0C;
|
|
/* 0x10 */ f32 m10;
|
|
/* 0x14 */ GXColor m14;
|
|
/* 0x18 */ GXColor m18;
|
|
}; // size = 0x1C
|
|
|
|
static daObj_Warpt_HIO_c l_HIO;
|
|
|
|
const char daObj_Warpt_c::m_arc_name[] = "ltubw";
|
|
const u16 daObj_Warpt_c::m_event_reg[] = {
|
|
dSv_event_flag_c::UNK_A207,
|
|
dSv_event_flag_c::UNK_A107,
|
|
dSv_event_flag_c::UNK_A007,
|
|
dSv_event_flag_c::UNK_9F07,
|
|
dSv_event_flag_c::UNK_A307,
|
|
dSv_event_flag_c::UNK_A407,
|
|
};
|
|
const GXColor daObj_Warpt_c::m_def_smoke_prm_color[] = {
|
|
{0x9F, 0x7F, 0x9C, 0x80},
|
|
{0x9F, 0x7F, 0x9C, 0x80},
|
|
{0x99, 0xEC, 0x5F, 0x80},
|
|
{0x5C, 0x85, 0xFF, 0x80},
|
|
{0xFF, 0xFF, 0x57, 0x80},
|
|
};
|
|
const GXColor daObj_Warpt_c::m_def_smoke_env_color[] = {
|
|
{0x2F, 0x87, 0xDE, 0x80},
|
|
{0x2F, 0x87, 0xDE, 0x80},
|
|
{0x3D, 0x50, 0xD1, 0x80},
|
|
{0xFF, 0xF0, 0xAF, 0x80},
|
|
{0xFF, 0x00, 0x4B, 0x80},
|
|
};
|
|
|
|
const dCcD_SrcCyl daObj_Warpt_c::m_cyl_body_src = {
|
|
// dCcD_SrcGObjInf
|
|
{
|
|
/* Flags */ 0,
|
|
/* SrcObjAt Type */ 0,
|
|
/* SrcObjAt Atp */ 0,
|
|
/* SrcObjAt SPrm */ 0,
|
|
/* SrcObjTg Type */ AT_TYPE_ALL & ~AT_TYPE_BOOMERANG,
|
|
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_GrpAll_e,
|
|
/* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e | cCcD_CoSPrm_VsPlayer_e | cCcD_CoSPrm_VsOther_e,
|
|
/* SrcGObjAt Se */ 0,
|
|
/* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e,
|
|
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK0,
|
|
/* SrcGObjAt Mtrl */ 0,
|
|
/* SrcGObjAt SPrm */ 0,
|
|
/* SrcGObjTg Se */ 0,
|
|
/* SrcGObjTg HitMark */ 0,
|
|
/* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0,
|
|
/* SrcGObjTg Mtrl */ 0,
|
|
/* SrcGObjTg SPrm */ dCcG_TgSPrm_Shield_e,
|
|
/* SrcGObjCo SPrm */ 0,
|
|
},
|
|
// cM3dGCylS
|
|
{{
|
|
/* Center */ {0.0f, 0.0f, 0.0f},
|
|
/* Radius */ 85.0f,
|
|
/* Height */ 150.0f,
|
|
}},
|
|
};
|
|
|
|
const dCcD_SrcCyl daObj_Warpt_c::m_cyl_huta_src = {
|
|
// dCcD_SrcGObjInf
|
|
{
|
|
/* Flags */ 0,
|
|
/* SrcObjAt Type */ 0,
|
|
/* SrcObjAt Atp */ 0,
|
|
/* SrcObjAt SPrm */ 0,
|
|
#if VERSION <= VERSION_JPN
|
|
/* SrcObjTg Type */ AT_TYPE_ALL,
|
|
#else
|
|
/* SrcObjTg Type */ AT_TYPE_ALL & ~AT_TYPE_BOOMERANG,
|
|
#endif
|
|
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsOther_e,
|
|
/* SrcObjCo SPrm */ 0,
|
|
/* SrcGObjAt Se */ 0,
|
|
/* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e,
|
|
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK0,
|
|
/* SrcGObjAt Mtrl */ 0,
|
|
/* SrcGObjAt SPrm */ 0,
|
|
/* SrcGObjTg Se */ 0,
|
|
/* SrcGObjTg HitMark */ 0,
|
|
/* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0,
|
|
/* SrcGObjTg Mtrl */ 0,
|
|
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e,
|
|
/* SrcGObjCo SPrm */ 0,
|
|
},
|
|
// cM3dGCylS
|
|
{{
|
|
/* Center */ {0.0f, 0.0f, 0.0f},
|
|
/* Radius */ 70.0f,
|
|
/* Height */ 20.0f,
|
|
}},
|
|
};
|
|
|
|
/* 000000EC-00000190 .text __ct__17daObj_Warpt_HIO_cFv */
|
|
daObj_Warpt_HIO_c::daObj_Warpt_HIO_c() {
|
|
m04 = 0;
|
|
m05 = 0;
|
|
m06 = 0;
|
|
m08 = 150.0f;
|
|
m0C = 30.0f;
|
|
m10 = -2.5f;
|
|
m14 = (GXColor){0, 0, 0, 128};
|
|
m18 = (GXColor){0, 0, 0, 128};
|
|
}
|
|
|
|
/* 000001D8-000001F8 .text createHeap_CB__FP10fopAc_ac_c */
|
|
static BOOL createHeap_CB(fopAc_ac_c* a_this) {
|
|
return ((daObj_Warpt_c*)a_this)->_createHeap();
|
|
}
|
|
|
|
/* 000001F8-00000270 .text _createHeap__13daObj_Warpt_cFv */
|
|
BOOL daObj_Warpt_c::_createHeap() {
|
|
if (isRealHuta()) {
|
|
if (!createHutaHeap()) {
|
|
return false;
|
|
}
|
|
} else {
|
|
mpLidBgW = NULL;
|
|
mpLidModel1 = NULL;
|
|
mpLidModel2 = NULL;
|
|
}
|
|
|
|
if (!createBodyHeap()) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 00000270-00000488 .text createHutaHeap__13daObj_Warpt_cFv */
|
|
bool daObj_Warpt_c::createHutaHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(m_arc_name, LTUBW_BDL_ITUHU);
|
|
JUT_ASSERT(264, modelData);
|
|
|
|
mpLidModel1 = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022);
|
|
if (mpLidModel1 == NULL) {
|
|
return false;
|
|
}
|
|
|
|
mpLidBgW = new dBgW();
|
|
if (mpLidBgW == NULL) {
|
|
return false;
|
|
}
|
|
|
|
if (mpLidBgW->Set((cBgD_t*)dComIfG_getObjectRes(m_arc_name, LTUBW_DZB_ITUHT), cBgW::MOVE_BG_e, &m344) == TRUE) {
|
|
return false;
|
|
}
|
|
|
|
J3DModelData* modelData2 = (J3DModelData*)dComIfG_getObjectRes(m_arc_name, LTUBW_BDL_YWPFM00);
|
|
modelData = modelData2;
|
|
if (modelData == NULL) {
|
|
return false;
|
|
}
|
|
|
|
mpLidModel2 = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022);
|
|
if (mpLidModel2 == NULL) {
|
|
return false;
|
|
}
|
|
|
|
J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes(m_arc_name, LTUBW_BRK_YWPFM00);
|
|
JUT_ASSERT(291, brk);
|
|
|
|
if (!mLidBrk.init(modelData, brk, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, FALSE)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 00000488-00000620 .text createBodyHeap__13daObj_Warpt_cFv */
|
|
bool daObj_Warpt_c::createBodyHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(m_arc_name, LTUBW_BDL_ITUBW);
|
|
JUT_ASSERT(305, modelData);
|
|
|
|
mpBodyModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022);
|
|
if (mpBodyModel == NULL) {
|
|
return false;
|
|
}
|
|
|
|
mpBodyBgW2 = new dBgW();
|
|
if (mpBodyBgW2 == NULL) {
|
|
return false;
|
|
}
|
|
|
|
if (mpBodyBgW2->Set((cBgD_t*)dComIfG_getObjectRes(m_arc_name, LTUBW_DZB_ITUBW), cBgW::MOVE_BG_e, &m310) == TRUE) {
|
|
return false;
|
|
}
|
|
|
|
mpBodyBgW1 = new dBgW();
|
|
if (mpBodyBgW1 == NULL) {
|
|
return false;
|
|
}
|
|
|
|
if (mpBodyBgW1->Set((cBgD_t*)dComIfG_getObjectRes(m_arc_name, LTUBW_DZB_ITUSO), cBgW::MOVE_BG_e, &m2DC) == TRUE) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 00000620-00000648 .text ride_CB__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c */
|
|
void ride_CB(dBgW*, fopAc_ac_c* a_this, fopAc_ac_c* arg2) {
|
|
((daObj_Warpt_c*)a_this)->_ride(arg2);
|
|
}
|
|
|
|
/* 00000648-00000750 .text _ride__13daObj_Warpt_cFP10fopAc_ac_c */
|
|
void daObj_Warpt_c::_ride(fopAc_ac_c* arg1) {
|
|
if (fpcM_GetName(arg1) == PROC_PLAYER) {
|
|
daPy_py_c* player = (daPy_py_c*)arg1;
|
|
|
|
fopAcM_searchActorAngleY(this, dComIfGp_getPlayer(0));
|
|
dLib_checkPlayerInCircle(m830, 1.0f, 20.0f);
|
|
|
|
if (l_HIO.m06 == 0) {
|
|
#if VERSION > VERSION_DEMO
|
|
if (!player->checkPlayerFly())
|
|
#endif
|
|
{
|
|
if (m290 != 3) {
|
|
if (dLib_checkPlayerInCircle(m830, l_HIO.m0C, 20.0f)) {
|
|
modeProc(PROC_INIT_e, 3);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00000750-00000758 .text isHuta__13daObj_Warpt_cFv */
|
|
bool daObj_Warpt_c::isHuta() {
|
|
return m2C6;
|
|
}
|
|
|
|
/* 00000758-00000784 .text isSp__13daObj_Warpt_cFv */
|
|
bool daObj_Warpt_c::isSp() {
|
|
return m2B4 == 2 || m2B4 == 3 || m2B4 == 4;
|
|
}
|
|
|
|
/* 00000784-0000080C .text isOtherHuta__13daObj_Warpt_cFv */
|
|
bool daObj_Warpt_c::isOtherHuta() {
|
|
return isSp() && m2AC != 0xff && !dComIfGs_isSwitch(m2AC, dComIfGp_roomControl_getStayNo());
|
|
}
|
|
|
|
/* 0000080C-00000864 .text isRealHuta__13daObj_Warpt_cFv */
|
|
bool daObj_Warpt_c::isRealHuta() {
|
|
return isHuta() && !isOtherHuta();
|
|
}
|
|
|
|
/* 00000864-000008E8 .text warp__13daObj_Warpt_cFi */
|
|
void daObj_Warpt_c::warp(int sclsnum) {
|
|
mDoAud_seStart(JA_SE_OBJ_OTOSHIANA_OPEN);
|
|
if (sclsnum != 0xff) {
|
|
dLib_setNextStageBySclsNum(sclsnum, current.roomNo);
|
|
}
|
|
}
|
|
|
|
/* 000008E8-00000968 .text onWarpBit__13daObj_Warpt_cFUc */
|
|
void daObj_Warpt_c::onWarpBit(u8 bit) {
|
|
u8 tmp = dComIfGs_getEventReg(m_event_reg[m2B8]);
|
|
cLib_onBit<u8>(tmp, bit);
|
|
dComIfGs_setEventReg(m_event_reg[m2B8], tmp);
|
|
}
|
|
|
|
/* 00000968-000009D0 .text isWarpBit__13daObj_Warpt_cFUc */
|
|
bool daObj_Warpt_c::isWarpBit(u8 bit) {
|
|
u8 tmp = (u8)dComIfGs_getEventReg(m_event_reg[m2B8]);
|
|
return cLib_checkBit(tmp, bit);
|
|
}
|
|
|
|
/* 000009D0-00000BB8 .text setMtx__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::setMtx() {
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::scaleM(scale.x, scale.y, scale.z);
|
|
mpBodyModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
|
|
cMtx_copy(mDoMtx_stack_c::get(), m310);
|
|
cMtx_copy(mDoMtx_stack_c::get(), m2DC);
|
|
|
|
mpBodyBgW1->Move();
|
|
m830 = current.pos;
|
|
m830.y += l_HIO.m08;
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
if (m840 == 1) {
|
|
dComIfG_Bgsp()->Regist(mpBodyBgW2, this);
|
|
mpBodyBgW2->Move();
|
|
}
|
|
#else
|
|
if (m840 == 1) {
|
|
if (mpBodyBgW2 != NULL && !mpBodyBgW2->ChkUsed()) {
|
|
dComIfG_Bgsp()->Regist(mpBodyBgW2, this);
|
|
}
|
|
}
|
|
|
|
if (mpBodyBgW2 != NULL && mpBodyBgW2->ChkUsed()) {
|
|
mpBodyBgW2->Move();
|
|
}
|
|
#endif
|
|
|
|
if (mpLidBgW != NULL && mpLidModel1 != NULL) {
|
|
mDoMtx_stack_c::transS(m830.x, m830.y, m830.z);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::scaleM(scale.x, scale.y, scale.z);
|
|
|
|
mpLidModel1->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpLidModel2->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
|
|
cMtx_copy(mDoMtx_stack_c::get(), m344);
|
|
mpLidBgW->Move();
|
|
}
|
|
}
|
|
|
|
/* 00000BB8-00000C3C .text initCollision__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::initCollision() {
|
|
mStts.Init(0xff, 0xff, this);
|
|
mCyl1.Set(m_cyl_body_src);
|
|
mCyl1.SetStts(&mStts);
|
|
if (mpLidBgW != NULL && mpLidModel1 != NULL) {
|
|
mCyl2.Set(m_cyl_huta_src);
|
|
mCyl2.SetStts(&mStts);
|
|
}
|
|
}
|
|
|
|
/* 00000C3C-00000CCC .text setCollision__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::setCollision() {
|
|
mCyl1.SetC(current.pos);
|
|
dComIfG_Ccsp()->Set(&mCyl1);
|
|
if (mpLidBgW != NULL && mpLidModel1 != NULL) {
|
|
mCyl2.OffCoSetBit();
|
|
mCyl2.SetC(m830);
|
|
dComIfG_Ccsp()->Set(&mCyl2);
|
|
}
|
|
}
|
|
|
|
/* 00000CCC-00000E90 .text breakHuta__13daObj_Warpt_cFi */
|
|
void daObj_Warpt_c::breakHuta(int arg1) {
|
|
if (mpLidBgW == NULL || mpLidModel1 == NULL) {
|
|
return;
|
|
}
|
|
|
|
switch (arg1) {
|
|
case 0:
|
|
dComIfGp_particle_set(dPa_name::ID_SCENE_8165, &m830);
|
|
dComIfGp_particle_set(dPa_name::ID_SCENE_8166, &m830);
|
|
break;
|
|
|
|
case 1:
|
|
fopAcM_seStart(this, JA_SE_OBJ_COL_BRK_WRAILING, 0);
|
|
dComIfGp_particle_set(dPa_name::ID_COMMON_03E5, &m830, NULL, NULL, 0xff, NULL, -1, &tevStr.mColorK0, &tevStr.mColorK0);
|
|
#if VERSION > VERSION_DEMO
|
|
if (mpLidBgW != NULL && mpLidBgW->ChkUsed())
|
|
#endif
|
|
{
|
|
dComIfG_Bgsp()->Release(mpLidBgW);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 00000E90-00000F40 .text openHuta__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::openHuta() {
|
|
if (isSp()) {
|
|
if (m2BC == 0xff) {
|
|
mDoAud_seStart(JA_SE_READ_RIDDLE_1);
|
|
}
|
|
onWarpBit(m2C4);
|
|
} else {
|
|
dComIfGs_onSwitch(m2AC, dComIfGp_roomControl_getStayNo());
|
|
}
|
|
m2C6 = false;
|
|
}
|
|
|
|
/* 00000F40-000010E0 .text checkHitSE__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::checkHitSE() {
|
|
cCcD_Obj* pcVar1 = mCyl1.GetTgHitObj();
|
|
mStts.Move();
|
|
if (pcVar1 == NULL) {
|
|
return;
|
|
}
|
|
|
|
switch (pcVar1->GetAtType()) {
|
|
case AT_TYPE_FIRE_ARROW:
|
|
case AT_TYPE_UNK800:
|
|
case AT_TYPE_UNK8:
|
|
case AT_TYPE_SWORD:
|
|
case AT_TYPE_MACHETE:
|
|
case AT_TYPE_HOOKSHOT:
|
|
case AT_TYPE_NORMAL_ARROW:
|
|
case AT_TYPE_SKULL_HAMMER:
|
|
case AT_TYPE_DARKNUT_SWORD:
|
|
case AT_TYPE_LIGHT_ARROW:
|
|
case AT_TYPE_ICE_ARROW:
|
|
case AT_TYPE_STALFOS_MACE:
|
|
case AT_TYPE_MOBLIN_SPEAR:
|
|
case AT_TYPE_GRAPPLING_HOOK:
|
|
case AT_TYPE_PGANON_SWORD:
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
s32 cutType = player->getCutType();
|
|
if (cutType != 8 && cutType != 9) {
|
|
fopAcM_seStart(this, JA_SE_OBJ_COL_SWM_NSTPOT, 0);
|
|
daObj::HitEff_hibana(this, &mCyl1);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 000010E0-00001178 .text modeOpenInit__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::modeOpenInit() {
|
|
if (m844.getEmitter() == NULL) {
|
|
dComIfGp_particle_set(dPa_name::ID_SCENE_8161, ¤t.pos, NULL, NULL, 0xff, &m844, -1, &m86C, &m870);
|
|
}
|
|
m858.remove();
|
|
}
|
|
|
|
/* 00001178-000011E8 .text modeOpen__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::modeOpen() {
|
|
fopAcM_seStart(this, JA_SE_OBJ_OTOSHIANA_SUS, 0);
|
|
}
|
|
|
|
/* 000011E8-00001258 .text modeCloseInit__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::modeCloseInit() {
|
|
dComIfGp_particle_set(dPa_name::ID_SCENE_8162, ¤t.pos, NULL, NULL, 0xff, &m858, -1, &m86C, &m870);
|
|
}
|
|
|
|
/* 00001258-00001388 .text modeClose__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::modeClose() {
|
|
if (mpLidBgW != NULL && mpLidModel1 != NULL) {
|
|
cCcD_Obj* pcVar1 = mCyl2.GetTgHitObj();
|
|
if (pcVar1 != NULL) {
|
|
if (pcVar1->ChkAtType(AT_TYPE_BOMB)) {
|
|
breakHuta(1);
|
|
openHuta();
|
|
modeProc(PROC_INIT_e, 0);
|
|
} else if (pcVar1->ChkAtType(AT_TYPE_UNK20000) || pcVar1->ChkAtType(AT_TYPE_FIRE_ARROW) || pcVar1->ChkAtType(AT_TYPE_FIRE)) {
|
|
breakHuta(0);
|
|
modeProc(PROC_INIT_e, 2);
|
|
} else if (pcVar1->ChkAtType(AT_TYPE_SKULL_HAMMER) || pcVar1->ChkAtType(AT_TYPE_STALFOS_MACE)) {
|
|
breakHuta(1);
|
|
openHuta();
|
|
modeProc(PROC_INIT_e, 0);
|
|
}
|
|
}
|
|
} else if (dComIfGs_isSwitch(m2AC, dComIfGp_roomControl_getStayNo())) {
|
|
openHuta();
|
|
modeProc(PROC_INIT_e, 0);
|
|
}
|
|
}
|
|
|
|
/* 00001388-00001400 .text modeBreakFireInit__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::modeBreakFireInit() {
|
|
fopAcM_seStart(this, JA_SE_OBJ_WARP_POT_CV_BURN, 0);
|
|
m83C = 60;
|
|
}
|
|
|
|
/* 00001400-0000149C .text modeBreakFire__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::modeBreakFire() {
|
|
mLidBrk.play();
|
|
if (!cLib_calcTimer(&m83C)) {
|
|
#if VERSION > VERSION_DEMO
|
|
if (mpLidBgW != NULL && mpLidBgW->ChkUsed())
|
|
#endif
|
|
{
|
|
dComIfG_Bgsp()->Release(mpLidBgW);
|
|
}
|
|
openHuta();
|
|
modeProc(PROC_INIT_e, 0);
|
|
}
|
|
}
|
|
|
|
/* 0000149C-000014A0 .text modeEventWarpInit__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::modeEventWarpInit() {
|
|
}
|
|
|
|
/* 000014A0-00001634 .text modeEventWarp__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::modeEventWarp() {
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
|
|
if (eventInfo.checkCommandDemoAccrpt()) {
|
|
#if VERSION > VERSION_DEMO
|
|
if (mpBodyBgW2 != NULL && mpBodyBgW2->ChkUsed())
|
|
#endif
|
|
{
|
|
dComIfG_Bgsp()->Release(mpBodyBgW2);
|
|
}
|
|
player->onNoResetFlg0(daPy_py_c::daPyFlg0_NO_FALL_VOICE);
|
|
int staffIdx = dComIfGp_evmng_getMyStaffId("Warpt");
|
|
char* cutName = dComIfGp_getPEvtManager()->getMyNowCutName(staffIdx);
|
|
|
|
bool cVar3 = true;
|
|
if (strcmp(cutName, "WARP") == 0) {
|
|
if (isSp()) {
|
|
cVar3 = spWarp();
|
|
} else {
|
|
cVar3 = normalWarp();
|
|
}
|
|
dComIfGp_evmng_cutEnd(staffIdx);
|
|
}
|
|
|
|
if (dComIfGp_evmng_endCheck("DEFAULT_WARP") && !cVar3) {
|
|
m840 = 30;
|
|
dComIfGp_event_reset();
|
|
player->onNoResetFlg1(daPy_py_c::daPyFlg1_FORCE_VOMIT_JUMP_SHORT);
|
|
modeProc(PROC_INIT_e, 0);
|
|
}
|
|
} else {
|
|
#if VERSION == VERSION_DEMO
|
|
fopAcM_orderOtherEvent(this, "DEFAULT_WARP");
|
|
#else
|
|
fopAcM_orderOtherEvent2(this, "DEFAULT_WARP", dEvtFlag_TALK_e, -1);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
/* 00001634-000016A4 .text normalWarp__13daObj_Warpt_cFv */
|
|
bool daObj_Warpt_c::normalWarp() {
|
|
bool ret = true;
|
|
if (dComIfGs_isSwitch(m2B0, dComIfGp_roomControl_getStayNo())) {
|
|
warp(m29C);
|
|
} else {
|
|
ret = false;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/* 000016A4-000017D8 .text spWarp__13daObj_Warpt_cFv */
|
|
bool daObj_Warpt_c::spWarp() {
|
|
bool uVar3 = 1;
|
|
if (m2B4 == 2) {
|
|
if (isWarpBit(2)) {
|
|
warp(m2A4);
|
|
} else if (isWarpBit(4)) {
|
|
warp(m2A8);
|
|
} else {
|
|
uVar3 = 0;
|
|
}
|
|
} else if (m2B4 == 3) {
|
|
if (isWarpBit(4)) {
|
|
warp(m2A8);
|
|
} else if (isWarpBit(1)) {
|
|
warp(m2A0);
|
|
} else {
|
|
uVar3 = 0;
|
|
}
|
|
} else if (m2B4 == 4) {
|
|
if (isWarpBit(1)) {
|
|
warp(m2A0);
|
|
} else if (isWarpBit(2)) {
|
|
warp(m2A4);
|
|
} else {
|
|
uVar3 = 0;
|
|
}
|
|
}
|
|
return uVar3;
|
|
}
|
|
|
|
/* 000017D8-000017DC .text modeEventOpenInit__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::modeEventOpenInit() {
|
|
}
|
|
|
|
/* 000017DC-00001858 .text modeEventOpen__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::modeEventOpen() {
|
|
if (eventInfo.checkCommandDemoAccrpt() && dComIfGp_evmng_endCheck("WARPT_OPEN")) {
|
|
dComIfGp_event_reset();
|
|
modeProc(PROC_INIT_e, 0);
|
|
}
|
|
}
|
|
|
|
/* 00001858-000019D8 .text modeProc__13daObj_Warpt_cFQ213daObj_Warpt_c6Proc_ei */
|
|
void daObj_Warpt_c::modeProc(daObj_Warpt_c::Proc_e proc, int index) {
|
|
typedef void (daObj_Warpt_c::*ModeProcFunc)();
|
|
struct mode_entry_t {
|
|
/* 0x00 */ ModeProcFunc init;
|
|
/* 0x04 */ ModeProcFunc run;
|
|
/* 0x08 */ char* name;
|
|
}; // size = 0x8
|
|
|
|
static mode_entry_t mode_tbl[] = {
|
|
{
|
|
&daObj_Warpt_c::modeOpenInit,
|
|
&daObj_Warpt_c::modeOpen,
|
|
"OEPN",
|
|
},
|
|
{
|
|
&daObj_Warpt_c::modeCloseInit,
|
|
&daObj_Warpt_c::modeClose,
|
|
"CLOSE",
|
|
},
|
|
{
|
|
&daObj_Warpt_c::modeBreakFireInit,
|
|
&daObj_Warpt_c::modeBreakFire,
|
|
"BREAK_FIRE",
|
|
},
|
|
{
|
|
&daObj_Warpt_c::modeEventWarpInit,
|
|
&daObj_Warpt_c::modeEventWarp,
|
|
"EVENT_WARP",
|
|
},
|
|
{
|
|
&daObj_Warpt_c::modeEventOpenInit,
|
|
&daObj_Warpt_c::modeEventOpen,
|
|
"EVENT_OPEN",
|
|
},
|
|
};
|
|
|
|
if (proc == PROC_INIT_e) {
|
|
m290 = index;
|
|
(this->*mode_tbl[m290].init)();
|
|
} else if (proc == PROC_EXEC_e) {
|
|
(this->*mode_tbl[m290].run)();
|
|
}
|
|
}
|
|
|
|
/* 000019D8-00001BCC .text _execute__13daObj_Warpt_cFv */
|
|
bool daObj_Warpt_c::_execute() {
|
|
if (m844.getEmitter() != NULL) {
|
|
if (l_HIO.m14.r != 0 || l_HIO.m14.g != 0 || l_HIO.m14.b != 0) {
|
|
m844.getEmitter()->setGlobalPrmColor(l_HIO.m14.r, l_HIO.m14.g, l_HIO.m14.b);
|
|
}
|
|
|
|
if (l_HIO.m18.r != 0 || l_HIO.m18.g != 0 || l_HIO.m18.b != 0) {
|
|
m844.getEmitter()->setGlobalEnvColor(l_HIO.m18.r, l_HIO.m18.g, l_HIO.m18.b);
|
|
}
|
|
}
|
|
|
|
if (m858.getEmitter() != NULL) {
|
|
if (l_HIO.m14.r != 0 || l_HIO.m14.g != 0 || l_HIO.m14.b != 0) {
|
|
m858.getEmitter()->setGlobalPrmColor(l_HIO.m14.r, l_HIO.m14.g, l_HIO.m14.b);
|
|
}
|
|
|
|
if (l_HIO.m18.r != 0 || l_HIO.m18.g != 0 || l_HIO.m18.b != 0) {
|
|
m858.getEmitter()->setGlobalEnvColor(l_HIO.m18.r, l_HIO.m18.g, l_HIO.m18.b);
|
|
}
|
|
}
|
|
|
|
if (l_HIO.m04 != 0) {
|
|
l_HIO.m04 = 0;
|
|
breakHuta(0);
|
|
modeProc(PROC_INIT_e, 2);
|
|
}
|
|
modeProc(PROC_EXEC_e, 5);
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
mAcch.CrrPos(*dComIfG_Bgsp());
|
|
setMtx();
|
|
setCollision();
|
|
checkHitSE();
|
|
cLib_calcTimer(&m840);
|
|
return true;
|
|
}
|
|
|
|
/* 00001BCC-00001D7C .text _draw__13daObj_Warpt_cFv */
|
|
bool daObj_Warpt_c::_draw() {
|
|
dComIfGd_setListBG();
|
|
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType(mpBodyModel, &tevStr);
|
|
mDoExt_modelUpdateDL(mpBodyModel);
|
|
dComIfGd_setList();
|
|
|
|
if (isHuta()) {
|
|
if (m290 == 2 && mpLidModel2 != NULL) {
|
|
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &m830, &tevStr);
|
|
g_env_light.setLightTevColorType(mpLidModel2, &tevStr);
|
|
mLidBrk.entry(mpLidModel2->getModelData());
|
|
mDoExt_modelUpdateDL(mpLidModel2);
|
|
} else if (mpLidBgW != NULL && mpLidModel1 != NULL) {
|
|
dComIfGd_setListBG();
|
|
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &m830, &tevStr);
|
|
g_env_light.setLightTevColorType(mpLidModel1, &tevStr);
|
|
mDoExt_modelUpdateDL(mpLidModel1);
|
|
dComIfGd_setList();
|
|
}
|
|
}
|
|
dComIfGd_setSimpleShadow2(¤t.pos, mAcch.GetGroundH(), 80.0f, mAcch.m_gnd);
|
|
return true;
|
|
}
|
|
|
|
/* 00001D7C-00001F30 .text getArg__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::getArg() {
|
|
u32 uVar4 = fopAcM_GetParam(this);
|
|
u32 uVar6 = home.angle.x;
|
|
u32 uVar5 = home.angle.z;
|
|
m2B4 = uVar4 & 0xF;
|
|
|
|
if (!isSp()) {
|
|
m298 = (uVar4 >> 4) & 0xff;
|
|
m29C = (uVar4 >> 12) & 0xff;
|
|
m2AC = (uVar6 >> 0) & 0xff;
|
|
m2B0 = (uVar6 >> 8) & 0xff;
|
|
|
|
if (m2B4 == 1) {
|
|
dComIfGs_onSwitch(m2AC, dComIfGp_roomControl_getStayNo());
|
|
}
|
|
|
|
if (dComIfGs_isSwitch(m2AC, dComIfGp_roomControl_getStayNo())) {
|
|
m2C6 = false;
|
|
} else {
|
|
m2C6 = true;
|
|
}
|
|
} else {
|
|
m2B8 = (uVar4 >> 4) & 0xf;
|
|
m2A0 = (uVar4 >> 8) & 0xff;
|
|
m2A4 = (uVar4 >> 16) & 0xff;
|
|
m2A8 = (uVar4 >> 24) & 0xff;
|
|
|
|
switch (m2B4) {
|
|
case 2:
|
|
m2C4 = 1;
|
|
m2C5 = 0;
|
|
break;
|
|
|
|
case 3:
|
|
m2C4 = 2;
|
|
m2C5 = 1;
|
|
break;
|
|
|
|
case 4:
|
|
m2C4 = 4;
|
|
m2C5 = 2;
|
|
break;
|
|
}
|
|
|
|
m2AC = (uVar6 >> 0) & 0xff;
|
|
m2B0 = (uVar6 >> 8) & 0xff;
|
|
m2BC = (uVar5 >> 0) & 0xff;
|
|
m2C0 = (uVar5 >> 8) & 0xff;
|
|
|
|
if (m2C0 != 0xff) {
|
|
onWarpBit(m2C4);
|
|
}
|
|
|
|
if (isWarpBit(m2C4)) {
|
|
m2C6 = false;
|
|
} else {
|
|
m2C6 = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00001F30-0000215C .text createInit__13daObj_Warpt_cFv */
|
|
void daObj_Warpt_c::createInit() {
|
|
m86C = m_def_smoke_prm_color[m2B4];
|
|
m870 = m_def_smoke_env_color[m2B4];
|
|
|
|
fopAcM_SetMtx(this, mpBodyModel->getBaseTRMtx());
|
|
fopAcM_setCullSizeBox(this, -80.0f, -0.0f, -80.0f, 80.0f, 160.0f, 80.0f);
|
|
|
|
if (mpLidBgW != NULL) {
|
|
mpLidBgW->SetCrrFunc(dBgS_MoveBGProc_Typical);
|
|
dComIfG_Bgsp()->Regist(mpLidBgW, this);
|
|
}
|
|
|
|
mpBodyBgW1->SetCrrFunc(dBgS_MoveBGProc_Typical);
|
|
dComIfG_Bgsp()->Regist(mpBodyBgW1, this);
|
|
|
|
if (isHuta()) {
|
|
modeProc(PROC_INIT_e, 1);
|
|
} else {
|
|
modeProc(PROC_INIT_e, 0);
|
|
}
|
|
|
|
mpBodyBgW2->SetRideCallback(ride_CB);
|
|
initCollision();
|
|
setCollision();
|
|
|
|
mAcchCir.SetWall(30.0f, 50.0f);
|
|
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), NULL, NULL);
|
|
mAcch.SetWallNone();
|
|
mAcch.SetWaterNone();
|
|
mAcch.SetRoofNone();
|
|
|
|
fopAcM_SetGravity(this, -6.5f);
|
|
fopAcM_posMoveF(this, NULL);
|
|
|
|
if (dLib_checkPlayerInCircle(current.pos, 50.0f, 100.0f)) {
|
|
m840 = 30;
|
|
} else {
|
|
m840 = 5;
|
|
}
|
|
setMtx();
|
|
}
|
|
|
|
/* 0000215C-00002378 .text _create__13daObj_Warpt_cFv */
|
|
cPhs_State daObj_Warpt_c::_create() {
|
|
fopAcM_SetupActor(this, daObj_Warpt_c);
|
|
cPhs_State PVar1 = dComIfG_resLoad(&mPhase, m_arc_name);
|
|
if (PVar1 == cPhs_COMPLEATE_e) {
|
|
getArg();
|
|
u32 maxHeapSize;
|
|
if (isRealHuta()) {
|
|
maxHeapSize = 0x1f00;
|
|
} else {
|
|
maxHeapSize = 0xe20;
|
|
}
|
|
|
|
if (!fopAcM_entrySolidHeap(this, createHeap_CB, maxHeapSize)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
createInit();
|
|
}
|
|
return PVar1;
|
|
}
|
|
|
|
/* 00002728-00002858 .text _delete__13daObj_Warpt_cFv */
|
|
bool daObj_Warpt_c::_delete() {
|
|
dComIfG_resDelete(&mPhase, m_arc_name);
|
|
if (mpLidBgW != NULL && mpLidBgW->ChkUsed()) {
|
|
dComIfG_Bgsp()->Release(mpLidBgW);
|
|
}
|
|
|
|
if (mpBodyBgW2 != NULL && mpBodyBgW2->ChkUsed()) {
|
|
dComIfG_Bgsp()->Release(mpBodyBgW2);
|
|
}
|
|
|
|
if (mpBodyBgW1 != NULL && mpBodyBgW1->ChkUsed()) {
|
|
dComIfG_Bgsp()->Release(mpBodyBgW1);
|
|
}
|
|
|
|
m844.remove();
|
|
m858.remove();
|
|
return true;
|
|
}
|
|
|
|
/* 00002858-00002878 .text daObj_WarptCreate__FPv */
|
|
static cPhs_State daObj_WarptCreate(void* i_this) {
|
|
return ((daObj_Warpt_c*)i_this)->_create();
|
|
}
|
|
|
|
/* 00002878-0000289C .text daObj_WarptDelete__FPv */
|
|
static BOOL daObj_WarptDelete(void* i_this) {
|
|
return ((daObj_Warpt_c*)i_this)->_delete();
|
|
}
|
|
|
|
/* 0000289C-000028C0 .text daObj_WarptExecute__FPv */
|
|
static BOOL daObj_WarptExecute(void* i_this) {
|
|
return ((daObj_Warpt_c*)i_this)->_execute();
|
|
}
|
|
|
|
/* 000028C0-000028E4 .text daObj_WarptDraw__FPv */
|
|
static BOOL daObj_WarptDraw(void* i_this) {
|
|
return ((daObj_Warpt_c*)i_this)->_draw();
|
|
}
|
|
|
|
/* 000028E4-000028EC .text daObj_WarptIsDelete__FPv */
|
|
static BOOL daObj_WarptIsDelete(void*) {
|
|
return TRUE;
|
|
}
|
|
|
|
static actor_method_class daObj_WarptMethodTable = {
|
|
(process_method_func)daObj_WarptCreate,
|
|
(process_method_func)daObj_WarptDelete,
|
|
(process_method_func)daObj_WarptExecute,
|
|
(process_method_func)daObj_WarptIsDelete,
|
|
(process_method_func)daObj_WarptDraw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_OBJ_WARPT = {
|
|
/* LayerID */ fpcLy_CURRENT_e,
|
|
/* ListID */ 0x0003,
|
|
/* ListPrio */ fpcPi_CURRENT_e,
|
|
/* ProcName */ PROC_OBJ_WARPT,
|
|
/* Proc SubMtd */ &g_fpcLf_Method.base,
|
|
/* Size */ sizeof(daObj_Warpt_c),
|
|
/* SizeOther */ 0,
|
|
/* Parameters */ 0,
|
|
/* Leaf SubMtd */ &g_fopAc_Method.base,
|
|
/* Priority */ PRIO_OBJ_WARPT,
|
|
/* Actor SubMtd */ &daObj_WarptMethodTable,
|
|
#if VERSION == VERSION_DEMO
|
|
/* Status */ 0x17 | fopAcStts_SHOWMAP_e | fopAcStts_NOCULLEXEC_e | fopAcStts_CULL_e | fopAcStts_UNK40000_e,
|
|
#else
|
|
/* Status */ 0x17 | fopAcStts_SHOWMAP_e | fopAcStts_CULL_e | fopAcStts_UNK40000_e,
|
|
#endif
|
|
/* Group */ fopAc_ACTOR_e,
|
|
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
|
|
};
|