From 7e3404b27677de64fad9064167ae9bcc77003ac1 Mon Sep 17 00:00:00 2001 From: Maide <34639600+Kelebek1@users.noreply.github.com> Date: Fri, 8 Aug 2025 05:03:21 +0100 Subject: [PATCH] d_a_obj_warpt (#840) --- configure.py | 6 +- include/d/actor/d_a_obj_warpt.h | 93 ++++- src/d/actor/d_a_obj_warpt.cpp | 694 +++++++++++++++++++++++++++++--- 3 files changed, 709 insertions(+), 84 deletions(-) diff --git a/configure.py b/configure.py index e60b25755..cc694a9c0 100755 --- a/configure.py +++ b/configure.py @@ -1428,12 +1428,12 @@ config.libs = [ ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_shmrgrd", extra_cflags=["-sym off"]), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_swpush", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_obj_table"), - ActorRel(Matching, "d_a_obj_tenmado"), + ActorRel(Matching, "d_a_obj_tenmado"), ActorRel(Matching, "d_a_obj_tide"), ActorRel(Matching, "d_a_obj_timer"), ActorRel(Equivalent, "d_a_obj_toripost", extra_cflags=['-pragma "nosyminline on"']), # weak func order - ActorRel(Matching, "d_a_obj_tousekiki", extra_cflags=['-pragma "nosyminline on"']), - ActorRel(NonMatching, "d_a_obj_warpt"), + ActorRel(Matching, "d_a_obj_tousekiki", extra_cflags=['-pragma "nosyminline on"']), + ActorRel(Equivalent, "d_a_obj_warpt", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_obj_wood", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Equivalent, "d_a_pirate_flag"), # weak func order ActorRel(Equivalent, "d_a_race_item", extra_cflags=['-pragma "nosyminline on"']), # weak func order diff --git a/include/d/actor/d_a_obj_warpt.h b/include/d/actor/d_a_obj_warpt.h index 2cc2f7470..b71a3d9a8 100644 --- a/include/d/actor/d_a_obj_warpt.h +++ b/include/d/actor/d_a_obj_warpt.h @@ -2,28 +2,43 @@ #define D_A_OBJ_WARPT_H #include "f_op/f_op_actor.h" +#include "d/d_particle.h" +#include "d/d_cc_d.h" +#include "d/d_bg_s_acch.h" +#include "d/d_com_inf_game.h" -class dCcD_SrcCyl; +class dBgW; class daObj_Warpt_c : public fopAc_ac_c { public: enum Proc_e { - + PROC_INIT_e, + PROC_RUN_e, }; + inline u8 onEventReg(u8 arg0){ + u8 tmp = dComIfGs_getEventReg(m_event_reg[m2B8]); + return tmp | arg0; + } + + inline u8 isEventReg(u8 arg0){ + u8 tmp = (u8)dComIfGs_getEventReg(m_event_reg[m2B8]); + return tmp & arg0; + } + void modeProcInit(int) {} - void _createHeap(); - void createHutaHeap(); - void createBodyHeap(); + BOOL _createHeap(); + bool createHutaHeap(); + bool createBodyHeap(); void _ride(fopAc_ac_c*); - void isHuta(); - void isSp(); - void isOtherHuta(); - void isRealHuta(); + bool isHuta(); + bool isSp(); + bool isOtherHuta(); + bool isRealHuta(); void warp(int); void onWarpBit(unsigned char); - void isWarpBit(unsigned char); + bool isWarpBit(unsigned char); void setMtx(); void initCollision(); void setCollision(); @@ -38,8 +53,8 @@ public: void modeBreakFire(); void modeEventWarpInit(); void modeEventWarp(); - void normalWarp(); - void spWarp(); + bool normalWarp(); + bool spWarp(); void modeEventOpenInit(); void modeEventOpen(); void modeProc(Proc_e, int); @@ -50,19 +65,53 @@ public: cPhs_State _create(); bool _delete(); + static const char m_arc_name[]; + static const u16 m_event_reg[]; + static const GXColor m_def_smoke_prm_color[]; + static const GXColor m_def_smoke_env_color[]; static const dCcD_SrcCyl m_cyl_body_src; static const dCcD_SrcCyl m_cyl_huta_src; public: - /* Place member variables here */ -}; - -class daObj_Warpt_HIO_c { -public: - daObj_Warpt_HIO_c(); - -public: - /* Place member variables here */ -}; + /* 0x290 */ s32 m290; + /* 0x294 */ u8 m294[0x298 - 0x294]; + /* 0x298 */ s32 m298; + /* 0x29C */ s32 m29C; + /* 0x2A0 */ s32 m2A0; + /* 0x2A4 */ s32 m2A4; + /* 0x2A8 */ s32 m2A8; + /* 0x2AC */ s32 m2AC; + /* 0x2B0 */ s32 m2B0; + /* 0x2B4 */ s32 m2B4; + /* 0x2B8 */ s32 m2B8; + /* 0x2BC */ s32 m2BC; + /* 0x2C0 */ s32 m2C0; + /* 0x2C4 */ u8 m2C4; + /* 0x2C5 */ u8 m2C5; + /* 0x2C6 */ bool m2C6; + /* 0x2C8 */ request_of_phase_process_class mPhase; + /* 0x2D0 */ J3DModel* mpBodyModel; + /* 0x2D4 */ J3DModel* mpLidModel1; + /* 0x2D8 */ dBgW* mpBodyBgW1; + /* 0x2DC */ Mtx m2DC; + /* 0x30C */ dBgW* mpBodyBgW2; + /* 0x310 */ Mtx m310; + /* 0x340 */ dBgW* mpLidBgW; + /* 0x344 */ Mtx m344; + /* 0x374 */ J3DModel* mpLidModel2; + /* 0x378 */ mDoExt_brkAnm mLidBrk; + /* 0x390 */ dCcD_Stts mStts; + /* 0x3CC */ dCcD_Cyl mCyl1; + /* 0x4FC */ dCcD_Cyl mCyl2; + /* 0x62C */ dBgS_ObjAcch mAcch; + /* 0x7F0 */ dBgS_AcchCir mAcchCir; + /* 0x830 */ cXyz m830; + /* 0x83C */ int m83C; + /* 0x840 */ char m840; + /* 0x844 */ dPa_followEcallBack m844; + /* 0x858 */ dPa_followEcallBack m858; + /* 0x86C */ GXColor m86C; + /* 0x870 */ GXColor m870; +}; // size = 0x874 #endif /* D_A_OBJ_WARPT_H */ diff --git a/src/d/actor/d_a_obj_warpt.cpp b/src/d/actor/d_a_obj_warpt.cpp index fded99a89..4a066aafd 100644 --- a/src/d/actor/d_a_obj_warpt.cpp +++ b/src/d/actor/d_a_obj_warpt.cpp @@ -4,10 +4,52 @@ */ #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_lib.h" #include "d/d_procname.h" #include "d/d_priority.h" -#include "d/d_cc_d.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" + +#include "weak_data_1811.h" // IWYU pragma: keep + +class daObj_Warpt_HIO_c : public mDoHIO_entry_c { +public: + daObj_Warpt_HIO_c(); + virtual ~daObj_Warpt_HIO_c() {} + + /* 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[] = {0xA207, 0xA107, 0xA007, 0x9F07, 0xA307, 0xA407}; +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 @@ -39,7 +81,6 @@ const dCcD_SrcCyl daObj_Warpt_c::m_cyl_body_src = { }}, }; - const dCcD_SrcCyl daObj_Warpt_c::m_cyl_huta_src = { // dCcD_SrcGObjInf { @@ -47,7 +88,11 @@ const dCcD_SrcCyl daObj_Warpt_c::m_cyl_huta_src = { /* 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, @@ -70,200 +115,727 @@ const dCcD_SrcCyl daObj_Warpt_c::m_cyl_huta_src = { }}, }; - /* 000000EC-00000190 .text __ct__17daObj_Warpt_HIO_cFv */ daObj_Warpt_HIO_c::daObj_Warpt_HIO_c() { - /* Nonmatching */ + 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*) { - /* Nonmatching */ +static BOOL createHeap_CB(fopAc_ac_c* a_this) { + return ((daObj_Warpt_c*)a_this)->_createHeap(); } /* 000001F8-00000270 .text _createHeap__13daObj_Warpt_cFv */ -void daObj_Warpt_c::_createHeap() { - /* Nonmatching */ +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 */ -void daObj_Warpt_c::createHutaHeap() { - /* Nonmatching */ +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 */ -void daObj_Warpt_c::createBodyHeap() { - /* Nonmatching */ +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*, fopAc_ac_c*) { - /* Nonmatching */ +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*) { - /* Nonmatching */ +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 */ -void daObj_Warpt_c::isHuta() { - /* Nonmatching */ +bool daObj_Warpt_c::isHuta() { + return m2C6; } /* 00000758-00000784 .text isSp__13daObj_Warpt_cFv */ -void daObj_Warpt_c::isSp() { - /* Nonmatching */ +bool daObj_Warpt_c::isSp() { + return m2B4 == 2 || m2B4 == 3 || m2B4 == 4; } /* 00000784-0000080C .text isOtherHuta__13daObj_Warpt_cFv */ -void daObj_Warpt_c::isOtherHuta() { - /* Nonmatching */ +bool daObj_Warpt_c::isOtherHuta() { + return isSp() && m2AC != 0xff && !dComIfGs_isSwitch(m2AC, dComIfGp_roomControl_getStayNo()); } /* 0000080C-00000864 .text isRealHuta__13daObj_Warpt_cFv */ -void daObj_Warpt_c::isRealHuta() { - /* Nonmatching */ +bool daObj_Warpt_c::isRealHuta() { + return isHuta() && !isOtherHuta(); } /* 00000864-000008E8 .text warp__13daObj_Warpt_cFi */ -void daObj_Warpt_c::warp(int) { - /* Nonmatching */ +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(unsigned char) { - /* Nonmatching */ +void daObj_Warpt_c::onWarpBit(unsigned char arg1) { + dComIfGs_setEventReg(m_event_reg[m2B8], onEventReg(arg1)); } /* 00000968-000009D0 .text isWarpBit__13daObj_Warpt_cFUc */ -void daObj_Warpt_c::isWarpBit(unsigned char) { - /* Nonmatching */ +bool daObj_Warpt_c::isWarpBit(unsigned char arg1) { + return isEventReg(arg1); } /* 000009D0-00000BB8 .text setMtx__13daObj_Warpt_cFv */ void daObj_Warpt_c::setMtx() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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) { - /* Nonmatching */ +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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + fopAcM_seStart(this, JA_SE_OBJ_OTOSHIANA_SUS, 0); } /* 000011E8-00001258 .text modeCloseInit__13daObj_Warpt_cFv */ void daObj_Warpt_c::modeCloseInit() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ } /* 000014A0-00001634 .text modeEventWarp__13daObj_Warpt_cFv */ void daObj_Warpt_c::modeEventWarp() { - /* Nonmatching */ + 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 */ -void daObj_Warpt_c::normalWarp() { - /* Nonmatching */ +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 */ -void daObj_Warpt_c::spWarp() { - /* Nonmatching */ +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() { - /* Nonmatching */ } /* 000017DC-00001858 .text modeEventOpen__13daObj_Warpt_cFv */ void daObj_Warpt_c::modeEventOpen() { - /* Nonmatching */ + 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, int) { - /* Nonmatching */ +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_RUN_e) { + (this->*mode_tbl[m290].run)(); + } } /* 000019D8-00001BCC .text _execute__13daObj_Warpt_cFv */ bool daObj_Warpt_c::_execute() { - /* Nonmatching */ + 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_RUN_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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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() { - /* Nonmatching */ + 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 */ @@ -311,7 +883,11 @@ actor_process_profile_definition g_profile_OBJ_WARPT = { /* 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, };