diff --git a/configure.py b/configure.py index 95b95156c..a4cb5e1b6 100755 --- a/configure.py +++ b/configure.py @@ -1661,7 +1661,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_hcbh"), ActorRel(Equivalent, "d_a_obj_hha"), # weak func order ActorRel(NonMatching, "d_a_obj_hlift"), - ActorRel(NonMatching, "d_a_obj_homen"), + ActorRel(Matching, "d_a_obj_homen", extra_cflags=["-sym off"]), ActorRel(Matching, "d_a_obj_homensmoke", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_hsehi1"), ActorRel(NonMatching, "d_a_obj_htetu1"), diff --git a/include/d/actor/d_a_obj_homen.h b/include/d/actor/d_a_obj_homen.h index a1ca0907b..1723f2bb0 100644 --- a/include/d/actor/d_a_obj_homen.h +++ b/include/d/actor/d_a_obj_homen.h @@ -1,21 +1,51 @@ #ifndef D_A_OBJ_HOMEN_H #define D_A_OBJ_HOMEN_H +#include "d/d_a_obj.h" #include "f_op/f_op_actor.h" +#include "d/d_bg_s_gnd_chk.h" +#include "d/d_cc_d.h" + +class dBgW; namespace daObjHomen { - class Act_c : public fopAc_ac_c { + // Note: The fopEn_enemy_c base class isn't used in this actor and doesn't appear in this actor's debug map. + // However, it seems necessary for the destructor to match. + class Act_c : public fopEn_enemy_c { public: - void is_switch() const {} - void on_switch() const {} - void param_get_arg0() const {} - void param_get_enemy() const {} - void param_get_item() const {} - void param_get_itembit() const {} - void param_get_sw() const {} + typedef BOOL (Act_c::*ProcInitFunc)(); + typedef void (Act_c::*ProcMainFunc)(); + + enum Param_e { + PRM_ARG0_W = 0x04, + PRM_ARG0_S = 0x08, + + PRM_ITEM_W = 0x06, + PRM_ITEM_S = 0x0C, + + PRM_ITEMBIT_W = 0x07, + PRM_ITEMBIT_S = 0x00, + + PRM_ENEMY_W = 0x04, + PRM_ENEMY_S = 0x12, + + PRM_SWITCH_W = 0x08, + PRM_SWITCH_S = 0x18, + }; + + virtual ~Act_c() {} + + int param_get_arg0() const { return daObj::PrmAbstract(this, PRM_ARG0_W, PRM_ARG0_S); } + int param_get_item() const { return daObj::PrmAbstract(this, PRM_ITEM_W, PRM_ITEM_S); } + int param_get_itembit() const { return daObj::PrmAbstract(this, PRM_ITEMBIT_W, PRM_ITEMBIT_S); } + int param_get_enemy() const { return daObj::PrmAbstract(this, PRM_ENEMY_W, PRM_ENEMY_S); } + int param_get_sw() const { return daObj::PrmAbstract(this, PRM_SWITCH_W, PRM_SWITCH_S); } + + bool is_switch() const { return fopAcM_isSwitch(const_cast(this), param_get_sw()); } + void on_switch() const { fopAcM_onSwitch(const_cast(this), param_get_sw()); } - void solidHeapCB(fopAc_ac_c*); - void create_heap(); + static BOOL solidHeapCB(fopAc_ac_c*); + bool create_heap(); s32 _create(); bool _delete(); void set_mtx(); @@ -27,27 +57,61 @@ namespace daObjHomen { void manage_enemy_timer(); void get_norse_offset(cXyz*, int); void get_norse_point(cXyz*, int); - void process_free_init(); + BOOL process_free_init(); void process_free_main(); - void process_wait_falldown_init(); + BOOL process_wait_falldown_init(); void process_wait_falldown_main(); - void process_falldown_init(); + BOOL process_falldown_init(); void process_falldown_main(); - void process_wait_init(); + BOOL process_wait_init(); void process_wait_main(); - void process_none_init(); + BOOL process_none_init(); void process_none_main(); - void process_init(short); + BOOL process_init(s16); void process_main(); void set_co_collision(); void set_at_collision(); void adjust_hookshot(); bool _execute(); bool _draw(); - + + static const char M_arcname[]; + static const dCcD_SrcSph M_sph_srcL; + static const dCcD_SrcSph M_sph_srcS; + static const dCcD_SrcCps M_cps_srcL; + static const dCcD_SrcCps M_cps_srcS; + public: - /* Place member variables here */ - }; + /* 0x2B0 */ dCcD_Stts mSphStts; + /* 0x2EC */ dCcD_Sph mSph; + /* 0x418 */ dCcD_Stts mCpsStts[2]; + /* 0x490 */ dCcD_Cps mCps[2]; + /* 0x700 */ cM3dGCpsS mCpsS[2]; + /* 0x738 */ request_of_phase_process_class mPhase; + /* 0x740 */ J3DModel* mpModel; + /* 0x744 */ Mtx mMtx; + /* 0x774 */ dBgW* mpBgW; + /* 0x778 */ dBgS_ObjGndChk mGndChk; + /* 0x7CC */ f32 mGroundY; + /* 0x7D0 */ int mType; + /* 0x7D4 */ s16 field_0x7D4; + /* 0x7D6 */ s16 field_0x7D6; + /* 0x7D8 */ s16 field_0x7D8; + /* 0x7DA */ s16 field_0x7DA; + /* 0x7DC */ s16 field_0x7DC; + /* 0x7DE */ s16 field_0x7DE; + /* 0x7E0 */ fpc_ProcID mHookshotID; + /* 0x7E4 */ fpc_ProcID mEnemyID; + /* 0x7E8 */ fpc_ProcID mSmokeID; + /* 0x7EC */ s16 field_0x7EC; + /* 0x7EE */ s16 mItemTimer; + /* 0x7F0 */ s16 mEnemyTimer; + /* 0x7F2 */ s16 mEventIdx; + /* 0x7F4 */ s16 field_0x7F4; + /* 0x7F6 */ s16 field_0x7F6; + /* 0x7F8 */ s16 mState; + /* 0x7FC */ cXyz field_0x7FC; + }; // Size: 0x808 }; #endif /* D_A_OBJ_HOMEN_H */ diff --git a/src/d/actor/d_a_fganon.cpp b/src/d/actor/d_a_fganon.cpp index 8cc8c2834..0e4e9dd41 100644 --- a/src/d/actor/d_a_fganon.cpp +++ b/src/d/actor/d_a_fganon.cpp @@ -1156,7 +1156,7 @@ void start(fganon_class* i_this) { case 5: { if (i_this->m3A4[0] == (s16)(REG0_S(0) + 0x4B)) { i_this->m408 = 1; - mDoAud_subBgmStart(0x80000041); + mDoAud_subBgmStart(JA_BGM_P_GANON_1); } if (i_this->m3A4[0] <= (s16)(REG0_S(0) + 0x4B)) { fopAcM_seStart(i_this, JA_SE_CM_PG_EBALL_MAKING_S, 0); diff --git a/src/d/actor/d_a_obj_homen.cpp b/src/d/actor/d_a_obj_homen.cpp index 9fd114d24..def7d3f01 100644 --- a/src/d/actor/d_a_obj_homen.cpp +++ b/src/d/actor/d_a_obj_homen.cpp @@ -4,183 +4,843 @@ // #include "d/actor/d_a_obj_homen.h" +#include "d/actor/d_a_player.h" +#include "d/d_com_inf_game.h" #include "d/d_procname.h" +#include "d/res/res_homen.h" +#include "f_op/f_op_actor_mng.h" + +#include "weak_bss_936_to_1036.h" // IWYU pragma: keep +#include "weak_data_1811.h" // IWYU pragma: keep + +namespace daObjHomen { + +// This unnamed namespace holds the HIO class and its attributes which are unused in retail. +namespace { + +struct Attr_c { + /* 0x00 */ f32 field_0x00; + /* 0x04 */ f32 field_0x04; + /* 0x08 */ s16 field_0x08; + /* 0x0A */ s16 field_0x0A; + /* 0x0C */ s16 field_0x0C; + /* 0x0E */ u8 field_0x0E[0x10 - 0x0E]; + /* 0x10 */ f32 field_0x10; + /* 0x14 */ f32 field_0x14; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ s16 field_0x1C; + /* 0x1E */ s16 field_0x1E; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ s16 field_0x24; + /* 0x26 */ u8 field_0x26[0x28 - 0x26]; + /* 0x28 */ f32 field_0x28; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ f32 field_0x30; + /* 0x34 */ f32 field_0x34; + /* 0x38 */ f32 field_0x38; + /* 0x3C */ u8 field_0x3C[0x50 - 0x3C]; + /* 0x50 */ f32 field_0x50; +}; // Size: 0x54 + +const Attr_c L_attr = { + -2.0f, + -36.f, + 120, + 2000, + 3, + {}, + 0.6f, + 0.0f, + 0.0f, + 20, + 6, + 215.0f, + 1, + {}, + 57.0f, + 37.5f, + 105.0f, + 92.0f, + 200.0f, + {}, + 25.0f, +}; + +#ifdef DEBUG +class Hio_c { + +}; + +Hio_c L_hio; + +static inline Hio_c& attr() { + return L_hio; +} +#endif + +}; // namespace + +const char Act_c::M_arcname[] = "Homen"; + +const dCcD_SrcSph Act_c::M_sph_srcS = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_HOOKSHOT, + /* 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 */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 35.0f, + }, +}; + +const dCcD_SrcSph Act_c::M_sph_srcL = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_HOOKSHOT, + /* 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 */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 50.0f, + }, +}; + +const dCcD_SrcCps Act_c::M_cps_srcL = { + // 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_UNK1, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGCpsS + { + /* Start */ 0.0f, 0.0f, 0.0f, + /* End */ 0.0f, 0.0f, 0.0f, + /* Radius */ 135.0f, + }, +}; + +const dCcD_SrcCps Act_c::M_cps_srcS = { + // 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_UNK1, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGCpsS + { + /* Start */ 0.0f, 0.0f, 0.0f, + /* End */ 0.0f, 0.0f, 0.0f, + /* Radius */ 45.0f, + }, +}; /* 000000EC-00000110 .text solidHeapCB__Q210daObjHomen5Act_cFP10fopAc_ac_c */ -void daObjHomen::Act_c::solidHeapCB(fopAc_ac_c*) { - /* Nonmatching */ +BOOL Act_c::solidHeapCB(fopAc_ac_c* i_this) { + return ((Act_c*)i_this)->create_heap(); } /* 00000110-000002B4 .text create_heap__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::create_heap() { - /* Nonmatching */ +bool Act_c::create_heap() { + static int bdl_idx[] = { + HOMEN_BDL_HOMEN1, + HOMEN_BDL_HOMEN2, + }; + static int dzb_idx[] = { + HOMEN_DZB_HOMEN1, + HOMEN_DZB_HOMEN2, + }; + + J3DModelData* mdl_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname, bdl_idx[mType]); + JUT_ASSERT(615, mdl_data != NULL); + if (mdl_data != NULL) { + mpModel = mDoExt_J3DModel__create(mdl_data, 0, 0x11000002); + } + + init_mtx(); + + cBgD_t* bgw_data = (cBgD_t*)dComIfG_getObjectRes(M_arcname, dzb_idx[mType]); + JUT_ASSERT(628, bgw_data != NULL); + if (bgw_data != NULL) { + mpBgW = new dBgW(); + if (mpBgW != NULL && mpBgW->Set(bgw_data, cBgW::MOVE_BG_e, &mMtx) == true) { + return false; + } + } + + return mdl_data != NULL && mpModel != NULL && mpBgW != NULL; } /* 000002B4-000005B0 .text _create__Q210daObjHomen5Act_cFv */ -s32 daObjHomen::Act_c::_create() { - /* Nonmatching */ +s32 Act_c::_create() { + fopAcM_SetupActor(this, Act_c); + + if (param_get_sw() != 0xFF && is_switch() == true) { + return cPhs_ERROR_e; + } + + s32 phase_state = dComIfG_resLoad(&mPhase, M_arcname); + + mType = param_get_arg0() & 1; + + if (phase_state == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, &Act_c::solidHeapCB, 0)) { + fopAcM_SetMtx(this, this->mpModel->getBaseTRMtx()); + dComIfG_Bgsp()->Regist(mpBgW, this); + mpBgW->SetCrrFunc(NULL); + + struct daObjHomen__cullbox { + /* 0x0 */ Vec mMin; + /* 0xC */ Vec mMax; + }; + static daObjHomen__cullbox culling_dat[] = { + {-300.0f, -30.0f, -100.0f, 300.0f, 600.0f, 300.0f}, + {-100.0f, -30.0f, -100.0f, 100.0f, 250.0f, 120.0f}, + }; + fopAcM_setCullSizeBox(this, + culling_dat[mType].mMin.x, culling_dat[mType].mMin.y, culling_dat[mType].mMin.z, + culling_dat[mType].mMax.x, culling_dat[mType].mMax.y, culling_dat[mType].mMax.z + ); + + mSphStts.Init(0, 0xFF, this); + if (mType == 0) { + mSph.Set(M_sph_srcL); + } else { + mSph.Set(M_sph_srcS); + } + + mSph.SetStts(&mSphStts); + mSph.SetTgVec((cXyz&)cXyz::Zero); + mSph.OnTgNoHitMark(); + + for (int i = 0; i < 2; i++) { + mCpsStts[i].Init(100, 0xFF, this); + if (mType == 0) { + mCps[i].Set(M_cps_srcL); + } else { + mCps[i].Set(M_cps_srcS); + } + mCps[i].SetStts(&mCpsStts[i]); + + static f32 at_col_radius[] = { + 135.0f, + 45.0f, + }; + mCpsS[i].mStart = current.pos; + mCpsS[i].mEnd = current.pos; + mCpsS[i].mRadius = at_col_radius[mType & 1]; + } + + process_init(0); + if (param_get_enemy() != 0xF) { + fopAcM_SetGroup(this, fopAc_ENEMY_e); + } + + mEventIdx = dComIfGp_evmng_getEventIdx("homen_down"); + mHookshotID = fpcM_ERROR_PROCESS_ID_e; + } else { + phase_state = cPhs_ERROR_e; + } + } + + return phase_state; } /* 000011A4-00001230 .text _delete__Q210daObjHomen5Act_cFv */ -bool daObjHomen::Act_c::_delete() { - /* Nonmatching */ +bool Act_c::_delete() { + dComIfG_resDelete(&mPhase, M_arcname); + if (heap != NULL && mpBgW != NULL && mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); + } + return true; } /* 00001230-00001374 .text set_mtx__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::set_mtx() { - /* Nonmatching */ +void Act_c::set_mtx() { + if (mType == 0 && field_0x7EC == 1) { + cXyz sp14(0.0f, 0.0f, -200.0f); + cXyz sp08(0.0f, 0.0f, 200.0f); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::transM(sp08); + mDoMtx_stack_c::ZrotM(shape_angle.z); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::XrotM(shape_angle.x); + mDoMtx_stack_c::transM(sp14); + } else { + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZrotM(shape_angle.z); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::XrotM(shape_angle.x); + } + + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + MTXCopy(mDoMtx_stack_c::get(), mMtx); } /* 00001374-000013D0 .text init_mtx__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::init_mtx() { - /* Nonmatching */ +void Act_c::init_mtx() { + mpModel->setBaseScale(scale); + set_mtx(); + mpModel->calc(); } /* 000013D0-00001498 .text exe_event__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::exe_event() { - /* Nonmatching */ +void Act_c::exe_event() { + switch (field_0x7F6) { + case 1: + if (eventInfo.mCommand == dEvtCmd_INDEMO_e) { + field_0x7F6 = 2; + } else { + fopAcM_orderOtherEventId(this, field_0x7F4); + eventInfo.onCondition(dEvtCnd_UNK2_e); + } + break; + case 2: + if (dComIfGp_evmng_endCheck(field_0x7F4)) { + dComIfGp_event_reset(); + field_0x7F4 = -1; + field_0x7F6 = 0; + } + break; + } } /* 00001498-0000159C .text make_enemy__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::make_enemy() { - /* Nonmatching */ +void Act_c::make_enemy() { + struct enemy_dat_s { + /* 0x00 */ s16 proc_name; + /* 0x04 */ u32 param; + }; // Size: 0x08 + static const enemy_dat_s make_enemy_dat[] = { + /* 0x0 */ { PROC_BK, 0xFFFF0000 }, + /* 0x1 */ { PROC_BK, 0xFFFF0020 }, + /* 0x2 */ { PROC_BK, 0xFFFF0040 }, + /* 0x3 */ { PROC_BK, 0xFFFF0060 }, + /* 0x4 */ { PROC_BK, 0xFFFF0080 }, + /* 0x5 */ { PROC_BK, 0xFFFF00A0 }, + /* 0x6 */ { PROC_CC, 0xFF000000 }, + /* 0x7 */ { PROC_CC, 0xFF000100 }, + /* 0x8 */ { PROC_CC, 0xFF000200 }, + /* 0x9 */ { PROC_CC, 0xFF000300 }, + /* 0xA */ { PROC_CC, 0xFF000400 }, + }; + + int enemy_idx = param_get_enemy(); + if (enemy_idx != 0xF && enemy_idx < ARRAY_SIZE(make_enemy_dat)) { + cXyz offset; + cXyz type_offsets[2] = { + cXyz(0.0f, 300.0f, 350.0f), + cXyz(0.0f, 0.0f, 25.0f), + }; + cMtx_multVec(mMtx, &type_offsets[mType & 1], &offset); + + fpc_ProcID enemy_id = fopAcM_create( + make_enemy_dat[enemy_idx].proc_name, + make_enemy_dat[enemy_idx].param, + &offset, fopAcM_GetRoomNo(this) + ); + mEnemyID = enemy_id; + if (enemy_id == fpcM_ERROR_PROCESS_ID_e) { + fopAcM_SetGroup(this, fopAc_ACTOR_e); + } + } } /* 0000159C-00001658 .text make_item__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::make_item() { - /* Nonmatching */ +void Act_c::make_item() { + csXyz sp08(0, 0, 0); + cXyz sp10(1.0f, 1.0f, 1.0f); + if (param_get_item() != 0x3F) { + fopAcM_createItemFromTable( + ¤t.pos, + param_get_item(), param_get_itembit(), + fopAcM_GetRoomNo(this), daItemType_0_e, + &sp08, daItemAct_1_e, &sp10 + ); + } } /* 00001658-00001698 .text manage_item_timer__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::manage_item_timer() { - /* Nonmatching */ +void Act_c::manage_item_timer() { + if (mItemTimer <= 0) return; + mItemTimer--; + if (mItemTimer == 0) { + make_item(); + } } /* 00001698-000016D8 .text manage_enemy_timer__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::manage_enemy_timer() { - /* Nonmatching */ +void Act_c::manage_enemy_timer() { + if (mEnemyTimer <= 0) return; + mEnemyTimer--; + if (mEnemyTimer == 0) { + make_enemy(); + } } /* 000016D8-00001864 .text get_norse_offset__Q210daObjHomen5Act_cFP4cXyzi */ -void daObjHomen::Act_c::get_norse_offset(cXyz*, int) { - /* Nonmatching */ +void Act_c::get_norse_offset(cXyz* param_1, int param_2) { + static cXyz offset_data0[] = { + cXyz(0.0f, 453.0f, 140.0f), + cXyz(0.0f, 181.5f, 48.0f), + }; + static cXyz offset_data1[] = { + cXyz(0.0f, 453.0f, 190.0f), + cXyz(0.0f, 181.5f, 68.0f), + }; + static cXyz* offset_table[] = { + offset_data0, + offset_data1, + }; + *param_1 = offset_table[param_2 & 1][mType]; } /* 00001864-000018C8 .text get_norse_point__Q210daObjHomen5Act_cFP4cXyzi */ -void daObjHomen::Act_c::get_norse_point(cXyz*, int) { - /* Nonmatching */ +void Act_c::get_norse_point(cXyz* param_1, int param_2) { + cXyz sp14; + cXyz sp08; + get_norse_offset(&sp14, param_2); + cMtx_multVec(mMtx, &sp14, &sp08); + *param_1 = sp08; } /* 000018C8-000018D8 .text process_free_init__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::process_free_init() { - /* Nonmatching */ +BOOL Act_c::process_free_init() { + mEnemyID = fpcM_ERROR_PROCESS_ID_e; + return TRUE; } /* 000018D8-0000196C .text process_free_main__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::process_free_main() { - /* Nonmatching */ +void Act_c::process_free_main() { + daPy_py_c* player = daPy_getPlayerActorClass(); + if (player->checkEquipHeavyBoots()) { + fopAcM_OnStatus(this, fopAcStts_UNK80000_e); + fopAcM_OffStatus(this, fopAcStts_UNK200000_e); + } else { + fopAcM_OnStatus(this, fopAcStts_UNK200000_e); + fopAcM_OffStatus(this, fopAcStts_UNK80000_e); + } + if (fopAcM_checkHookCarryNow(this)) { + process_init(1); + } + set_co_collision(); } /* 0000196C-00001AFC .text process_wait_falldown_init__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::process_wait_falldown_init() { - /* Nonmatching */ +BOOL Act_c::process_wait_falldown_init() { + fopAcM_cancelHookCarryNow(this); + mEnemyTimer = 6; + mItemTimer = 20; + field_0x7DA = 0; + // attr(); // Debug only + dComIfG_Bgsp()->Release(mpBgW); + mpBgW = NULL; + + static int vibe_level_1st[] = { + 2, 1, + }; + dComIfGp_getVibration().StartShock(vibe_level_1st[mType & 1], -0x11, cXyz(0.0f, 1.0f, 0.0f)); + + if (mType != 0) { + field_0x7FC = current.pos; + if (mHookshotID != fpcM_ERROR_PROCESS_ID_e) { + fopAc_ac_c* hookshot = fopAcM_SearchByID(mHookshotID); + if (hookshot != NULL) { + Mtx sp3C; + cXyz sp30; + cXyz sp24; + get_norse_offset(&sp30, 1); + mDoMtx_stack_c::YrotS(shape_angle.y); + MTXCopy(mDoMtx_stack_c::get(), sp3C); + cMtx_multVec(sp3C, &sp30, &sp24); + field_0x7FC = hookshot->current.pos - sp24; + } + } + } + + if (mType == 0) { + dComIfGs_onEventBit(0x3410); + } + + return TRUE; } /* 00001AFC-00001BA4 .text process_wait_falldown_main__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::process_wait_falldown_main() { - /* Nonmatching */ +void Act_c::process_wait_falldown_main() { + if (field_0x7DA < 3) { + cLib_addCalc2(¤t.pos.x, field_0x7FC.x, 0.5f, 20.0f); + cLib_addCalc2(¤t.pos.y, field_0x7FC.y, 0.5f, 20.0f); + cLib_addCalc2(¤t.pos.z, field_0x7FC.z, 0.5f, 20.0f); + field_0x7DA++; + } else { + process_init(2); + } + + set_co_collision(); } /* 00001BA4-00001C84 .text process_falldown_init__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::process_falldown_init() { - /* Nonmatching */ +BOOL Act_c::process_falldown_init() { + gravity = -2.0f; + maxFallSpeed = -36.0f; + cXyz gndPos(current.pos); + gndPos.y += 100.0f; + mGndChk.SetPos(&gndPos); + mGndChk.SetActorPid(fopAcM_GetID(this)); + mGroundY = dComIfG_Bgsp()->GroundCross(&mGndChk); + if (mType == 0) { + field_0x7D6 = 90; + } else { + field_0x7D6 = 120; + } + field_0x7DC = cM_rndFX(3072.0f); + return TRUE; } /* 00001C84-00001EC8 .text process_falldown_main__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::process_falldown_main() { - /* Nonmatching */ +void Act_c::process_falldown_main() { + set_at_collision(); + cXyz sp34; + get_norse_point(&sp34, 0); + + if (mType == 0 && field_0x7EC == 0) { + cXyz sp28(0.0f, 0.0f, 0.0f); + cXyz sp1C; + cMtx_multVec(mMtx, &sp28, &sp1C); + if (sp1C.y - 1.0f <= mGroundY) { + field_0x7EC = 1; + gravity = 0.0f; + speed.setall(0.0f); + speedF = 0.0f; + } + } else if (current.pos.y < mGroundY) { + gravity = 0.0f; + speed.setall(0.0f); + speedF = 0.0f; + } + + if (sp34.y < mGroundY) { + fpc_ProcID smoke_id = fopAcM_createChild( + PROC_Obj_Homensmk, + fopAcM_GetID(this), + field_0x7EC << 1 | mType, + ¤t.pos, + fopAcM_GetRoomNo(this), + &shape_angle + ); + mSmokeID = smoke_id; + if (smoke_id != fpcM_ERROR_PROCESS_ID_e) { + static int vibe_level_2nd[] = { + 6, 4, + }; + dComIfGp_getVibration().StartShock(vibe_level_2nd[mType & 1], -0x11, cXyz(0.0f, 1.0f, 0.0f)); + gravity = 0.0f; + speed.setall(0.0f); + speedF = 0.0f; + field_0x7D6 = 0; + field_0x7D4 = 0; + process_init(3); + } + } else { + if (field_0x7EC == 0) { + cLib_addCalcAngleS2(&shape_angle.z, field_0x7DC, 20, 0x1000); + cLib_addCalcAngleS2(&shape_angle.y, field_0x7D8 + 0x8000, 10, 0x1000); + } + } + + if (gravity != 0.0f) { + static f32 speed_table[] = { + 20.0f, 12.0f, + }; + speedF = speed_table[mType & 1]; + } } /* 00001EC8-00001FA8 .text process_wait_init__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::process_wait_init() { - /* Nonmatching */ +BOOL Act_c::process_wait_init() { + on_switch(); + field_0x7DE = 1; + if (mType == 0) { + mDoAud_seStart(JA_SE_OBJ_MASK_S_BREAK, ¤t.pos); + } else { + mDoAud_seStart(JA_SE_OBJ_MASK_L_BREAK, ¤t.pos); + } + return TRUE; } /* 00001FA8-00001FEC .text process_wait_main__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::process_wait_main() { - /* Nonmatching */ +void Act_c::process_wait_main() { + if (field_0x7DE > 0) { + field_0x7DE--; + if (field_0x7DE == 0) { + process_init(4); + } + } } /* 00001FEC-00002054 .text process_none_init__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::process_none_init() { - /* Nonmatching */ +BOOL Act_c::process_none_init() { + if (mType == 0) { + mDoAud_seStart(JA_SE_READ_RIDDLE_1); + } + return TRUE; } /* 00002054-000020AC .text process_none_main__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::process_none_main() { - /* Nonmatching */ +void Act_c::process_none_main() { + if (mEnemyID != fpcM_ERROR_PROCESS_ID_e) { + fopAc_ac_c* enemy; + if (!fopAcM_SearchByID(mEnemyID, &enemy)) { + mEnemyID = fpcM_ERROR_PROCESS_ID_e; + fopAcM_delete(this); + } + } } /* 000020AC-000021C4 .text process_init__Q210daObjHomen5Act_cFs */ -void daObjHomen::Act_c::process_init(short) { - /* Nonmatching */ +BOOL Act_c::process_init(s16 state) { + static ProcInitFunc init_table[] = { + &Act_c::process_free_init, + &Act_c::process_wait_falldown_init, + &Act_c::process_falldown_init, + &Act_c::process_wait_init, + &Act_c::process_none_init, + }; + if (state >= 0 && state < 5) { + if ((this->*init_table[state])()) { + mState = state; + return TRUE; + } + } + return FALSE; } /* 000021C4-000022A8 .text process_main__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::process_main() { - /* Nonmatching */ +void Act_c::process_main() { + static ProcMainFunc main_table[] = { + &Act_c::process_free_main, + &Act_c::process_wait_falldown_main, + &Act_c::process_falldown_main, + &Act_c::process_wait_main, + &Act_c::process_none_main, + }; + if (mState >= 0 && mState < 5) { + (this->*main_table[mState])(); + } } /* 000022A8-000023C8 .text set_co_collision__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::set_co_collision() { - /* Nonmatching */ +void Act_c::set_co_collision() { + if (mSph.ChkTgHit()) { + cCcD_Obj* hitObj = mSph.GetTgHitObj(); + daPy_py_c* player = daPy_getPlayerActorClass(); + if (hitObj && hitObj->ChkAtType(AT_TYPE_HOOKSHOT)) { + field_0x7D8 = player->shape_angle.y; + fopAc_ac_c* hookshot = mSph.GetTgHitAc(); + mHookshotID = fopAcM_GetID(hookshot); + if (mType == 0) { + dComIfGs_onEventBit(0x3880); + } + } + mSph.ClrTgHit(); + } else { + f32 sp08[] = { + 105.0f, 57.0f, + }; + cXyz sp10; + get_norse_point(&sp10, 0); + mSph.SetC(sp10); + mSph.SetR(sp08[mType & 1]); + dComIfG_Ccsp()->Set(&mSph); + } } /* 000023C8-00002728 .text set_at_collision__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::set_at_collision() { - /* Nonmatching */ +void Act_c::set_at_collision() { + static cXyz at_offset[][2][2] = { + { + { + cXyz(-120.0f, 30.0f, 140.0f), + cXyz(-120.0f, 550.0f, 140.0f), + }, + { + cXyz(120.0f, 30.0f, 140.0f), + cXyz(120.0f, 550.0f, 140.0f), + }, + }, + { + { + cXyz(-45.0f, 20.0f, 80.0f), + cXyz(-45.0f, 190.0f, 80.0f), + }, + { + cXyz(45.0f, 20.0f, 80.0f), + cXyz(45.0f, 190.0f, 80.0f), + }, + }, + }; + + for (int i = 0; i < 2; i++) { + cXyz sp74; + cXyz sp68; + + sp74 = at_offset[mType & 1][i][0]; + cMtx_multVec(mMtx, &sp74, &sp68); + mCpsS[i].mStart = sp68; + + sp74 = at_offset[mType & 1][i][1]; + cMtx_multVec(mMtx, &sp74, &sp68); + mCpsS[i].mEnd = sp68; + + mCps[i].cM3dGCps::Set(mCpsS[i]); + dComIfG_Ccsp()->Set(&mCps[i]); + } } /* 00002728-00002810 .text adjust_hookshot__Q210daObjHomen5Act_cFv */ -void daObjHomen::Act_c::adjust_hookshot() { - /* Nonmatching */ +void Act_c::adjust_hookshot() { + daPy_py_c* player = daPy_getPlayerActorClass(); + if (!player->checkEquipHeavyBoots()) { + if (mHookshotID != fpcM_ERROR_PROCESS_ID_e && fopAcM_SearchByID(mHookshotID) != NULL) { + Mtx sp24; + cXyz sp18; + cXyz sp0C; + get_norse_offset(&sp18, 1); + mDoMtx_stack_c::YrotS(shape_angle.y); + MTXCopy(mDoMtx_stack_c::get(), sp24); + cMtx_multVec(sp24, &sp18, &sp0C); + player->setHookshotCarryOffset(fopAcM_GetID(this), &sp0C); + mHookshotID = fpcM_ERROR_PROCESS_ID_e; + } + } } /* 00002810-000028E0 .text _execute__Q210daObjHomen5Act_cFv */ -bool daObjHomen::Act_c::_execute() { - /* Nonmatching */ +bool Act_c::_execute() { + adjust_hookshot(); + exe_event(); + manage_item_timer(); + manage_enemy_timer(); + process_main(); + if (mpBgW != NULL) { + mpBgW->Move(); + } + field_0x7D4 += field_0x7D6; + if (field_0x7D4 > 2000) { + field_0x7D4 = 2000; + } + shape_angle.x += field_0x7D4; + if (shape_angle.x >= 0x5000) { + shape_angle.x = 0x5000; + field_0x7D4 = 0; + field_0x7D6 = 0; + } + fopAcM_calcSpeed(this); + fopAcM_posMove(this, NULL); + set_mtx(); + + return true; } /* 000028E0-00002954 .text _draw__Q210daObjHomen5Act_cFv */ -bool daObjHomen::Act_c::_draw() { - /* Nonmatching */ +bool Act_c::_draw() { + if (mState != 4 && mState != 3) { + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + mDoExt_modelUpdateDL(mpModel); + } + return true; } -namespace daObjHomen { namespace { /* 00002954-00002974 .text Mthd_Create__Q210daObjHomen27@unnamed@d_a_obj_homen_cpp@FPv */ -void Mthd_Create(void*) { - /* Nonmatching */ +s32 Mthd_Create(void* i_this) { + return ((Act_c*)i_this)->_create(); } /* 00002974-00002998 .text Mthd_Delete__Q210daObjHomen27@unnamed@d_a_obj_homen_cpp@FPv */ -void Mthd_Delete(void*) { - /* Nonmatching */ +BOOL Mthd_Delete(void* i_this) { + return ((Act_c*)i_this)->_delete(); } /* 00002998-000029BC .text Mthd_Execute__Q210daObjHomen27@unnamed@d_a_obj_homen_cpp@FPv */ -void Mthd_Execute(void*) { - /* Nonmatching */ +BOOL Mthd_Execute(void* i_this) { + return ((Act_c*)i_this)->_execute(); } /* 000029BC-000029E0 .text Mthd_Draw__Q210daObjHomen27@unnamed@d_a_obj_homen_cpp@FPv */ -void Mthd_Draw(void*) { - /* Nonmatching */ +BOOL Mthd_Draw(void* i_this) { + return ((Act_c*)i_this)->_draw(); } /* 000029E0-000029E8 .text Mthd_IsDelete__Q210daObjHomen27@unnamed@d_a_obj_homen_cpp@FPv */ -void Mthd_IsDelete(void*) { - /* Nonmatching */ +BOOL Mthd_IsDelete(void* i_this) { + return TRUE; } static actor_method_class Mthd_Table = { @@ -191,6 +851,7 @@ static actor_method_class Mthd_Table = { (process_method_func)Mthd_Draw, }; }; // namespace + }; // namespace daObjHomen actor_process_profile_definition g_profile_Obj_Homen = { diff --git a/src/d/actor/d_a_obj_homensmoke.cpp b/src/d/actor/d_a_obj_homensmoke.cpp index ba6c9fada..245cdd30e 100644 --- a/src/d/actor/d_a_obj_homensmoke.cpp +++ b/src/d/actor/d_a_obj_homensmoke.cpp @@ -48,7 +48,7 @@ namespace daObjHomensmoke { /* 0x0 */ Vec mMin; /* 0xC */ Vec mMax; }; - static daObjHomensmoke__cullbox culling_dat[2] = { + static daObjHomensmoke__cullbox culling_dat[] = { {-300.0f, -30.0f, -100.0f, 300.0f, 600.0f, 300.0f}, {-100.0f, -30.0f, -100.0f, 100.0f, 250.0f, 120.0f}, }; diff --git a/src/d/actor/d_a_obj_monument.cpp b/src/d/actor/d_a_obj_monument.cpp index 3aaad19ae..6a8ee2b83 100644 --- a/src/d/actor/d_a_obj_monument.cpp +++ b/src/d/actor/d_a_obj_monument.cpp @@ -7,7 +7,6 @@ #include "d/res/res_esekh.h" #include "f_op/f_op_actor_mng.h" #include "JSystem/JUtility/JUTAssert.h" -#include "d/d_a_obj.h" #include "d/d_bg_w.h" #include "d/d_com_inf_game.h" #include "d/d_procname.h" diff --git a/src/d/actor/d_a_obj_tower.cpp b/src/d/actor/d_a_obj_tower.cpp index d703ba904..80a1fd4e4 100644 --- a/src/d/actor/d_a_obj_tower.cpp +++ b/src/d/actor/d_a_obj_tower.cpp @@ -7,9 +7,7 @@ #include "d/res/res_x_tower.h" #include "d/d_com_inf_game.h" #include "d/d_procname.h" -#include "dolphin/mtx/mtx.h" #include "f_op/f_op_actor_mng.h" -#include "m_Do/m_Do_printf.h" /* 00000078-00000098 .text CheckCreateHeap__FP10fopAc_ac_c */ static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { diff --git a/src/d/d_grass.cpp b/src/d/d_grass.cpp index d80c0eff4..2227be92b 100644 --- a/src/d/d_grass.cpp +++ b/src/d/d_grass.cpp @@ -149,7 +149,7 @@ void dGrass_data_c::WorkAt(fopAc_ac_c* ac, u32 p1, int roomNo, dCcMassS_HitInf* setBatta(&mPos, &tevStr->mColorK0); if (mItemIdx >= 0) - fopAcM_createItemFromTable(&mPos, mItemIdx, 0xFFFFFFFF, roomNo, daItemType_0_e, NULL, daItemAct_1_e, NULL); + fopAcM_createItemFromTable(&mPos, mItemIdx, -1, roomNo, daItemType_0_e, NULL, daItemAct_1_e, NULL); if (!l_CutSoundFlag) { l_CutSoundFlag = true; mDoAud_seStart(JA_SE_LK_CUT_GRASS, &mPos, 0, dComIfGp_getReverb(roomNo));