mirror of
https://github.com/zeldaret/tww.git
synced 2026-06-26 01:34:39 -04:00
e24cbed367
* Demo work * Fix PAL * Fix d_door weak func order and link it * Fix d_door for demo * JKernel OK on demo + misc * tag_attention 100% on demo * More demo work and fix some retail fakematches
917 lines
26 KiB
C++
917 lines
26 KiB
C++
/**
|
|
* d_a_obj_homen.cpp
|
|
* Object - Wind Temple - Face stone Hookshot target
|
|
*/
|
|
|
|
#pragma sym off
|
|
#include "d/actor/d_a_obj_homen.h"
|
|
#pragma sym on
|
|
#include "d/actor/d_a_player.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_procname.h"
|
|
#include "d/d_priority.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;
|
|
#if VERSION > VERSION_DEMO
|
|
/* 0x3C */ u8 field_0x3C[0x50 - 0x3C];
|
|
/* 0x50 */ f32 field_0x50;
|
|
#endif
|
|
}; // 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,
|
|
#if VERSION > VERSION_DEMO
|
|
{},
|
|
25.0f,
|
|
#endif
|
|
};
|
|
|
|
#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 */
|
|
BOOL Act_c::solidHeapCB(fopAc_ac_c* i_this) {
|
|
return ((Act_c*)i_this)->create_heap();
|
|
}
|
|
|
|
/* 00000110-000002B4 .text create_heap__Q210daObjHomen5Act_cFv */
|
|
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(VERSION_SELECT(578, 615, 615, 615), mdl_data != NULL);
|
|
#if VERSION > VERSION_DEMO
|
|
if (mdl_data != NULL)
|
|
#endif
|
|
{
|
|
mpModel = mDoExt_J3DModel__create(mdl_data, 0, 0x11000002);
|
|
}
|
|
|
|
init_mtx();
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
int r28 = 0;
|
|
#endif
|
|
|
|
cBgD_t* bgw_data = (cBgD_t*)dComIfG_getObjectRes(M_arcname, dzb_idx[mType]);
|
|
JUT_ASSERT(VERSION_SELECT(590, 628, 628, 628), bgw_data != NULL);
|
|
#if VERSION > VERSION_DEMO
|
|
if (bgw_data != NULL)
|
|
#endif
|
|
{
|
|
mpBgW = new dBgW();
|
|
#if VERSION == VERSION_DEMO
|
|
if (mpBgW != NULL && mpBgW->Set(bgw_data, cBgW::MOVE_BG_e, &mMtx)) {
|
|
r28 |= 1;
|
|
}
|
|
#else
|
|
if (mpBgW != NULL && mpBgW->Set(bgw_data, cBgW::MOVE_BG_e, &mMtx) == true) {
|
|
return false;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
bool ret = false;
|
|
if (mdl_data != NULL && r28 == 0) {
|
|
ret = true;
|
|
};
|
|
return ret;
|
|
#else
|
|
return mdl_data != NULL && mpModel != NULL && mpBgW != NULL;
|
|
#endif
|
|
}
|
|
|
|
/* 000002B4-000005B0 .text _create__Q210daObjHomen5Act_cFv */
|
|
cPhs_State Act_c::_create() {
|
|
fopAcM_SetupActor(this, Act_c);
|
|
|
|
if (param_get_sw() != 0xFF && is_switch() == true) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
cPhs_State 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 Act_c::_delete() {
|
|
dComIfG_resDelete(&mPhase, M_arcname);
|
|
if (
|
|
#if VERSION > VERSION_DEMO
|
|
heap != NULL &&
|
|
#endif
|
|
mpBgW != NULL &&
|
|
mpBgW->ChkUsed()
|
|
) {
|
|
dComIfG_Bgsp()->Release(mpBgW);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 00001230-00001374 .text set_mtx__Q210daObjHomen5Act_cFv */
|
|
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 Act_c::init_mtx() {
|
|
mpModel->setBaseScale(scale);
|
|
set_mtx();
|
|
mpModel->calc();
|
|
}
|
|
|
|
/* 000013D0-00001498 .text exe_event__Q210daObjHomen5Act_cFv */
|
|
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 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)) {
|
|
#if VERSION == VERSION_DEMO
|
|
static cXyz y_offset[2] = {
|
|
cXyz(0.0f, 300.0f, 350.0f),
|
|
cXyz(0.0f, 0.0f, 0.0f),
|
|
};
|
|
#else
|
|
cXyz y_offset[2] = {
|
|
cXyz(0.0f, 300.0f, 350.0f),
|
|
cXyz(0.0f, 0.0f, 25.0f),
|
|
};
|
|
#endif
|
|
cXyz offset;
|
|
cMtx_multVec(mMtx, &y_offset[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 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 Act_c::manage_item_timer() {
|
|
if (mItemTimer <= 0) return;
|
|
mItemTimer--;
|
|
if (mItemTimer == 0) {
|
|
make_item();
|
|
}
|
|
}
|
|
|
|
/* 00001698-000016D8 .text manage_enemy_timer__Q210daObjHomen5Act_cFv */
|
|
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 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 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 */
|
|
BOOL Act_c::process_free_init() {
|
|
mEnemyID = fpcM_ERROR_PROCESS_ID_e;
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000018D8-0000196C .text process_free_main__Q210daObjHomen5Act_cFv */
|
|
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 */
|
|
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 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 */
|
|
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 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 */
|
|
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 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 */
|
|
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 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 */
|
|
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 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 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 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 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 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 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 {
|
|
/* 00002954-00002974 .text Mthd_Create__Q210daObjHomen27@unnamed@d_a_obj_homen_cpp@FPv */
|
|
cPhs_State Mthd_Create(void* i_this) {
|
|
return ((Act_c*)i_this)->_create();
|
|
}
|
|
|
|
/* 00002974-00002998 .text Mthd_Delete__Q210daObjHomen27@unnamed@d_a_obj_homen_cpp@FPv */
|
|
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 */
|
|
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 */
|
|
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 */
|
|
BOOL Mthd_IsDelete(void* i_this) {
|
|
return TRUE;
|
|
}
|
|
|
|
static actor_method_class Mthd_Table = {
|
|
(process_method_func)Mthd_Create,
|
|
(process_method_func)Mthd_Delete,
|
|
(process_method_func)Mthd_Execute,
|
|
(process_method_func)Mthd_IsDelete,
|
|
(process_method_func)Mthd_Draw,
|
|
};
|
|
}; // namespace
|
|
|
|
}; // namespace daObjHomen
|
|
|
|
actor_process_profile_definition g_profile_Obj_Homen = {
|
|
/* LayerID */ fpcLy_CURRENT_e,
|
|
/* ListID */ 0x0003,
|
|
/* ListPrio */ fpcPi_CURRENT_e,
|
|
/* ProcName */ PROC_Obj_Homen,
|
|
/* Proc SubMtd */ &g_fpcLf_Method.base,
|
|
/* Size */ sizeof(daObjHomen::Act_c),
|
|
/* SizeOther */ 0,
|
|
/* Parameters */ 0,
|
|
/* Leaf SubMtd */ &g_fopAc_Method.base,
|
|
/* Priority */ PRIO_Obj_Homen,
|
|
/* Actor SubMtd */ &daObjHomen::Mthd_Table,
|
|
/* Status */ fopAcStts_NOCULLEXEC_e | fopAcStts_CULL_e | fopAcStts_UNK40000_e,
|
|
/* Group */ fopAc_ACTOR_e,
|
|
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
|
|
};
|