diff --git a/configure.py b/configure.py index 808a00213..af4be0dd0 100755 --- a/configure.py +++ b/configure.py @@ -1375,7 +1375,7 @@ config.libs = [ ActorRel(Matching, "d_a_obj_AjavW", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_obj_Ygush00", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_obj_akabe"), - ActorRel(NonMatching, "d_a_obj_barrel"), + ActorRel(Matching, "d_a_obj_barrel", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_barrel2"), ActorRel(Matching, "d_a_obj_bscurtain", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_obj_cafelmp"), diff --git a/include/d/actor/d_a_obj_barrel.h b/include/d/actor/d_a_obj_barrel.h index 4e41e4834..25ec90017 100644 --- a/include/d/actor/d_a_obj_barrel.h +++ b/include/d/actor/d_a_obj_barrel.h @@ -2,14 +2,61 @@ #define D_A_OBJ_BARREL_H #include "f_op/f_op_actor.h" +#include "c/c_damagereaction.h" +#include "d/d_a_obj.h" namespace daObjBarrel { class Act_c : public fopAc_ac_c { public: - void attr() const {} + enum Prm_e { + PRM_CULL_W = 0x03, + PRM_CULL_S = 0x1c, + }; + + enum Mode { + MODE_WAIT = 0x0, + MODE_CARRY = 0x1, + MODE_VIB0 = 0x2, + MODE_VIB1 = 0x3, + MODE_VIB2 = 0x4, + MODE_JUMP = 0x5, + MODE_WALK = 0x6, + }; + + struct Attr_c { + /* 0x00 */ u16 mBdlIdx; + /* 0x02 */ u8 m02; + /* 0x03 */ bool mEnableCutoff; + /* 0x04 */ float mAttnH; + /* 0x08 */ float mNormalGravity; + /* 0x0C */ u8 mWeight; + /* 0x10 */ float mSinkDownDepth; + /* 0x14 */ float m14; // unused + /* 0x18 */ float mVib0SpeedY; + /* 0x1C */ float mVib0Gravity; + /* 0x20 */ float mVib1Gravity; + /* 0x24 */ float mVib2Gravity; + /* 0x28 */ short m28; + /* 0x2A */ short m2A; + /* 0x2C */ short m2C; + /* 0x2E */ u8 mVib0Duration; + /* 0x2F */ u8 mVib1Duration; + /* 0x30 */ u8 mVib2Duration; + /* 0x31 */ u8 m31; + /* 0x34 */ float mFallDmgH; + /* 0x38 */ u8 m38; // unused + /* 0x39 */ u8 mSeBreakP1; + /* 0x3A */ u8 mSeBreakP2; + /* 0x3B */ u8 mSeHitP1; + /* 0x3C */ u8 mSeHitP2; + /* 0x40 */ float mWPillarScaleXZ; + /* 0x44 */ float mWPillarScaleY; + }; + + const Attr_c& attr() const { return M_attr; } void get_slant_angle() {} bool pos_init() { - if (m60C == 0) { + if (mMode == MODE_WAIT) { current.pos = home.pos; current.angle = home.angle; shape_angle = home.angle; @@ -18,11 +65,11 @@ namespace daObjBarrel { return false; } } - void prm_get_cull() const {} + int prm_get_cull() const { return daObj::PrmAbstract(this, PRM_CULL_W, PRM_CULL_S); } void set_slant_angle(s16) {} - void solidHeapCB(fopAc_ac_c*); - void create_heap(); + static BOOL solidHeapCB(fopAc_ac_c*); + bool create_heap(); s32 _create(); bool _delete(); void mode_wait_init(); @@ -40,7 +87,7 @@ namespace daObjBarrel { void mode_walk_init(); void mode_walk(); void vib_pos_ang(); - void mode_proc_call(); + bool mode_proc_call(); void set_mtx(); void init_mtx(); void set_walk_rot(); @@ -48,24 +95,58 @@ namespace daObjBarrel { void damaged(bool); void cull_set_draw(); void cull_set_move(); - void get_se_map_hit() const; + u32 get_se_map_hit() const; void set_senv(int, int) const; void se_fall_water(); void eff_hit_water_splash(); - void chk_sink_water(); - void chk_sinkdown_water(); + bool chk_sink_water(); + bool chk_sinkdown_water(); void eff_land_smoke(); - void damage_cc_proc(); - void damage_bg_proc(); - void damage_bg_proc_directly(); + bool damage_cc_proc(); + bool damage_bg_proc(); + bool damage_bg_proc_directly(); bool _execute(); bool _draw(); + + static const char M_arcname[9]; + static const float l_s_radius; + static const float l_l_radius; + static const float l_gnd_fric; + static const short l_gnd_deg; + static const float l_viscous_resist; + static const float l_inert_resist; + static const float l_max_move; + static const short l_max_vib_angl; + static const float l_min_move_dir; + static const float l_wind_max; + static const float l_shape_vec; + static const float l_tgr_ratio; + static const dCcD_SrcCyl M_cyl_src; + static const Attr_c M_attr; public: - /* Place member variables here */ - /* 0x290 */ u8 m290[0x60C - 0x290]; - /* 0x60C */ int m60C; - }; + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ dBgS_ObjAcch mAcch; + /* 0x460 */ dBgS_AcchCir mAcchCir; + /* 0x4A0 */ dCcD_Stts mStts; + /* 0x4DC */ dCcD_Cyl mCyl; + /* 0x60C */ int mMode; + /* 0x610 */ short m610; + /* 0x612 */ short m612; + /* 0x614 */ int mTimer; + /* 0x618 */ float mLastGroundY; + /* 0x61C */ short m61C; + /* 0x61E */ u8 m61E[0x620 - 0x61E]; + /* 0x620 */ bool mOnGround; + /* 0x621 */ s8 mInitTimer; + /* 0x622 */ bool mForceExec; + /* 0x623 */ bool mSunk; + /* 0x624 */ cXyz mMove; + /* 0x630 */ short m630; + }; // Size: 0x634 + + STATIC_ASSERT(sizeof(Act_c) == 0x634); namespace Method { s32 Create(void*); diff --git a/include/d/actor/d_a_obj_eff.h b/include/d/actor/d_a_obj_eff.h index 7a88d221c..9a5e90571 100644 --- a/include/d/actor/d_a_obj_eff.h +++ b/include/d/actor/d_a_obj_eff.h @@ -2,12 +2,14 @@ #define D_A_OBJ_EFF_H #include "f_op/f_op_actor.h" +#include "f_op/f_op_actor_mng.h" #include "d/d_particle.h" +#include "d/d_procname.h" namespace daObjEff { class Act_c : public fopAc_ac_c { public: - void make_barrel_smoke(cXyz*) {} + static void make_barrel_smoke(cXyz* pos) { fopAcM_create(PROC_Obj_Eff, NULL, pos); } void make_land_smoke(cXyz*, float) {} void make_pinecone_smoke(cXyz*) {} void make_skull_smoke(cXyz*) {} diff --git a/include/d/d_cc_d.h b/include/d/d_cc_d.h index 8702048e0..ecb78e414 100644 --- a/include/d/d_cc_d.h +++ b/include/d/d_cc_d.h @@ -12,6 +12,7 @@ enum dCcD_ObjAtType { /* 0x00000002 */ AT_TYPE_SWORD = (1 << 1), + /* 0x00000008 */ AT_TYPE_UNK8 = (1 << 3), /* 0x00000020 */ AT_TYPE_BOMB = (1 << 5), /* 0x00000040 */ AT_TYPE_BOOMERANG = (1 << 6), /* 0x00000080 */ AT_TYPE_BOKO_STICK = (1 << 7), diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 9f4588138..d604b820b 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -1036,7 +1036,7 @@ inline s8 dStage_stagInfo_GetTimeH(stage_stag_info_class* p_info) { return (p_info->field_0x0c >> 8) & 0xFF; } -inline u8 dStage_stagInfo_GetCullPoint(stage_stag_info_class* p_info) { +inline u16 dStage_stagInfo_GetCullPoint(stage_stag_info_class* p_info) { return p_info->field_0x10 & 0xFFFF; } diff --git a/src/d/actor/d_a_obj_barrel.cpp b/src/d/actor/d_a_obj_barrel.cpp index 1bf4cbf61..beaac509d 100644 --- a/src/d/actor/d_a_obj_barrel.cpp +++ b/src/d/actor/d_a_obj_barrel.cpp @@ -4,226 +4,758 @@ // #include "d/actor/d_a_obj_barrel.h" +#include "d/actor/d_a_obj_eff.h" +#include "d/res/res_ktaru_01.h" +#include "f_op/f_op_actor_mng.h" +#include "f_op/f_op_kankyo_mng.h" #include "d/d_procname.h" +#include "d/d_com_inf_game.h" + +#include "weak_data_1811.h" // IWYU pragma: keep + +const char daObjBarrel::Act_c::M_arcname[] = "Ktaru_01"; +const float daObjBarrel::Act_c::l_s_radius = 45.0f; +const float daObjBarrel::Act_c::l_l_radius = 50.0f; +const float daObjBarrel::Act_c::l_gnd_fric = 0.1f; +const short daObjBarrel::Act_c::l_gnd_deg = 0xf; +const float daObjBarrel::Act_c::l_viscous_resist = 0.006f; +const float daObjBarrel::Act_c::l_inert_resist = 0.001f; +const float daObjBarrel::Act_c::l_max_move = 30.0f; +const short daObjBarrel::Act_c::l_max_vib_angl = 2048; +const float daObjBarrel::Act_c::l_min_move_dir = 5.0f; +const float daObjBarrel::Act_c::l_wind_max = 178.0f; +const float daObjBarrel::Act_c::l_shape_vec = 25.0f; +const float daObjBarrel::Act_c::l_tgr_ratio = 0.5f; + +const dCcD_SrcCyl daObjBarrel::Act_c::M_cyl_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_UNK400000 | AT_TYPE_LIGHT), + /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_GrpAll_e, + /* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e | cCcD_CoSPrm_VsGrpAll_e, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ dCcG_TgSPrm_Shield_e, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ l_l_radius, + /* Height */ 100.0f, + }, +}; + +const daObjBarrel::Act_c::Attr_c daObjBarrel::Act_c::M_attr = { + /* mBdlIdx */ KTARU_01_BDL_KTARU_01, + /* m02 */ 60, + /* mEnableCutoff */ false, + /* mAttnH */ 50.0f, + /* mNormalGravity */ -6.0f, + /* mWeight */ 200, + /* mSinkDownDepth */ 100.0f, + /* m14 */ 0.01f, // unused + /* mVib0SpeedY */ 80.0f, + /* mVib0Gravity */ -14.0f, + /* mVib1Gravity */ -1.0f, + /* mVib2Gravity */ -12.0f, + /* m28 */ 16000, + /* m2A */ 3500, + /* m2C */ 150, + /* mVib0Duration */ 5, + /* mVib1Duration */ 12, + /* mVib2Duration */ 20, + /* m31 */ 50, + /* mFallDmgH */ 200.0f, + /* m38 */ 0xff, // unused + /* mSeBreakP1 */ 0x96, + /* mSeBreakP2 */ 0x5, + /* mSeHitP1 */ 0x64, + /* mSeHitP2 */ 0x4, + /* mWPillarScaleXZ */ 1.0f, + /* mWPillarScaleY */ 0.75f, +}; /* 00000078-0000009C .text solidHeapCB__Q211daObjBarrel5Act_cFP10fopAc_ac_c */ -void daObjBarrel::Act_c::solidHeapCB(fopAc_ac_c*) { - /* Nonmatching */ +BOOL daObjBarrel::Act_c::solidHeapCB(fopAc_ac_c* i_this) { + return static_cast(i_this)->create_heap(); } /* 0000009C-00000160 .text create_heap__Q211daObjBarrel5Act_cFv */ -void daObjBarrel::Act_c::create_heap() { - /* Nonmatching */ +bool daObjBarrel::Act_c::create_heap() { + J3DModelData* mdl_data; + bool ret = false; + + mdl_data = (J3DModelData *)dComIfG_getObjectRes(M_arcname, attr().mBdlIdx); + JUT_ASSERT(0x17A, mdl_data != NULL); + + mpModel = mDoExt_J3DModel__create(mdl_data, 0x80000, 0x11000022); + if (mpModel) + ret = true; + return ret; } /* 00000160-00000474 .text _create__Q211daObjBarrel5Act_cFv */ s32 daObjBarrel::Act_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, Act_c); + s32 rt = dComIfG_resLoad(&mPhs, M_arcname); + if (rt == cPhs_COMPLEATE_e) { + if(fopAcM_entrySolidHeap(this, solidHeapCB, 0x820) != 0) { + mAcchCir.SetWall(30.0f, l_l_radius); + mAcch.Set(¤t.pos, &old.pos, this, 1, &mAcchCir, &speed, ¤t.angle, &shape_angle); + mAcch.ClrWaterNone(); + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + cull_set_draw(); + if (strcmp(dComIfGp_getStartStageName(), "sea") == 0) { + float far = dStage_stagInfo_GetCullPoint(dComIfGp_getStageStagInfo()); + if (far > 1.0f) { + fopAcM_setCullSizeFar(this, 8000.0f / far); + } + } + mStts.Init(attr().mWeight, 0xFF, this); + mCyl.Set(M_cyl_src); + mCyl.SetStts(&mStts); + fopAcM_SetGravity(this, attr().mNormalGravity); + attention_info.position.x = current.pos.x; + attention_info.position.y = current.pos.y + attr().mAttnH; + attention_info.position.z = current.pos.z; + cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + attention_info.distances[fopAc_Attn_TYPE_CARRY_e] = 9; + mForceExec = true; + fopAcM_posMoveF(this, NULL); + mAcch.CrrPos(*dComIfG_Bgsp()); + mAcch.ClrGroundLanding(); + mOnGround = true; + mInitTimer = 20; + mLastGroundY = current.pos.y; + mSunk = false; + init_mtx(); + mMove = cXyz::Zero; + mode_wait_init(); + } else { + rt = cPhs_ERROR_e; + } + } + return rt; } /* 00000780-000007B0 .text _delete__Q211daObjBarrel5Act_cFv */ bool daObjBarrel::Act_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs, M_arcname); + return true; } /* 000007B0-00000834 .text mode_wait_init__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_wait_init() { - /* Nonmatching */ + mCyl.OffAtSPrmBit(cCcD_AtSPrm_Set_e); + mCyl.OnTgSPrmBit(cCcD_TgSPrm_Set_e); + mCyl.OnCoSPrmBit(cCcD_CoSPrm_Set_e); + fopAcM_SetSpeedF(this, 0.0f); + fopAcM_SetGravity(this, attr().mNormalGravity); + mStts.Init(attr().mWeight, 0xFF, this); + mMode = MODE_WAIT; } /* 00000834-00000944 .text mode_wait__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_wait() { - /* Nonmatching */ + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + if (shape_angle.z > 0x1000) { + cLib_chaseAngleS(&shape_angle.z, 0x4000, 0xc00); + } else { + cLib_chaseAngleS(&shape_angle.z, 0, 0xc00); + } + set_walk_rot(); + if (mAcch.ChkGroundHit()) { + cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + if (shape_angle.z == 0x4000) { + cM3dGPla* gndPlane = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd); + if (gndPlane != NULL && (std::fabsf(gndPlane->mNormal.x) > 0.001f || std::fabsf(gndPlane->mNormal.z) > 0.001f)) { + mode_walk_init(); + } + mStts.SetWeight(140); + } else { + mStts.SetWeight(attr().mWeight); + } + } else { + cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + } } /* 00000944-00000A0C .text mode_carry_init__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_carry_init() { - /* Nonmatching */ + mCyl.OffAtSPrmBit(cCcD_AtSPrm_Set_e); + mCyl.OnTgSPrmBit(cCcD_TgSPrm_Set_e); + mCyl.OffCoSPrmBit(cCcD_CoSPrm_Set_e); + cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + mMode = MODE_CARRY; + if (strcmp(dComIfGp_getStartStageName(), "majroom") == 0 || strcmp(dComIfGp_getStartStageName(), "MajyuE") == 0) { + dComIfGs_onEventBit(0x401); + } + mTimer = 15; } /* 00000A0C-00000A94 .text mode_carry__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_carry() { - /* Nonmatching */ + if (mTimer > 0) { + mTimer--; + } + cLib_chaseAngleS(&shape_angle.z, m61C, 0x1000); + if (!fopAcM_checkCarryNow(this) && !fopAcM_checkHookCarryNow(this)) { + mLastGroundY = current.pos.y; + daObj::SetCurrentRoomNo(this, &mAcch.m_gnd); + m610 = 0; + m612 = 0; + mode_wait_init(); + } } /* 00000A94-00000B0C .text mode_vib0_init__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_vib0_init() { - /* Nonmatching */ + mCyl.OffAtSPrmBit(cCcD_AtSPrm_Set_e); + mCyl.OnTgSPrmBit(cCcD_TgSPrm_Set_e); + mCyl.OnCoSPrmBit(cCcD_CoSPrm_Set_e); + cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + fopAcM_SetGravity(this, attr().mVib0Gravity); + speed.y = attr().mVib0SpeedY; + shape_angle.y = 0; + shape_angle.z = 0; + m610 = attr().m2A; + m612 = 0; + m630 = 0; + mTimer = attr().mVib0Duration; + mMode = MODE_VIB0; } /* 00000B0C-00000B50 .text mode_vib0__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_vib0() { - /* Nonmatching */ + vib_pos_ang(); + if (--mTimer <= 0) { + mode_vib1_init(); + } } /* 00000B50-00000B74 .text mode_vib1_init__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_vib1_init() { - /* Nonmatching */ + fopAcM_SetGravity(this, attr().mVib1Gravity); + mTimer = attr().mVib1Duration; + mMode = MODE_VIB1; } /* 00000B74-00000BB8 .text mode_vib1__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_vib1() { - /* Nonmatching */ + vib_pos_ang(); + if (--mTimer <= 0) { + mode_vib2_init(); + } } /* 00000BB8-00000BDC .text mode_vib2_init__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_vib2_init() { - /* Nonmatching */ + fopAcM_SetGravity(this, attr().mVib2Gravity); + mTimer = attr().mVib2Duration; + mMode = MODE_VIB2; } /* 00000BDC-00000C4C .text mode_vib2__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_vib2() { - /* Nonmatching */ + cLib_chaseAngleS(&m610, 0, attr().m2C); + vib_pos_ang(); + if (--mTimer <= 0) { + shape_angle.x = 0; + m610 = 0; + m612 = 0; + mode_wait_init(); + } } /* 00000C4C-00000CBC .text mode_jump_init__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_jump_init() { - /* Nonmatching */ + mCyl.OffAtSPrmBit(cCcD_AtSPrm_Set_e); + mCyl.OnTgSPrmBit(cCcD_TgSPrm_Set_e); + mCyl.OnCoSPrmBit(cCcD_CoSPrm_Set_e); + cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + shape_angle.y = 0; + shape_angle.z = 0; + m610 = 0; + m612 = 0; + m630 = 0; + fopAcM_SetGravity(this, attr().mNormalGravity); + speed.y = 30.0f; + mMode = MODE_JUMP; + } /* 00000CBC-00000D3C .text mode_jump__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_jump() { - /* Nonmatching */ + daObj::SetCurrentRoomNo(this, &mAcch.m_gnd); + if (mAcch.ChkGroundLanding()) { + mode_walk_init(); + } else { + daObj::posMoveF_stream(this, mStts.GetCCMoveP(), &mMove, l_viscous_resist, l_inert_resist); + cLib_chaseAngleS(&shape_angle.z, 0x4000, 0xc00); + set_walk_rot(); + } } /* 00000D3C-00000D88 .text mode_walk_init__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_walk_init() { - /* Nonmatching */ + mCyl.OffAtSPrmBit(cCcD_AtSPrm_Set_e); + mCyl.OnTgSPrmBit(cCcD_TgSPrm_Set_e); + mCyl.OnCoSPrmBit(cCcD_CoSPrm_Set_e); + cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + fopAcM_SetGravity(this, attr().mNormalGravity); + mMode = MODE_WALK; } /* 00000D88-00000F40 .text mode_walk__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::mode_walk() { - /* Nonmatching */ + daObj::SetCurrentRoomNo(this, &mAcch.m_gnd); + if (mAcch.ChkGroundHit()) { + cM3dGPla* gndPlane = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd); + cXyz* norm; + cXyz addAccel = cXyz::Zero; + float cos, friction; + if (gndPlane) { + norm = gndPlane->GetNP(); + friction = l_gnd_fric; + cos = cM_scos(0xA4F); + addAccel.set(norm->x, 0.0f, norm->z); + } else { + norm = NULL; + friction = 0.0f; + cos = 0.0f; + } + daObj::posMoveF_grade(this, mStts.GetCCMoveP(), &mMove, l_viscous_resist, l_inert_resist, norm, friction, cos, &addAccel); + cLib_chaseAngleS(&shape_angle.z, 0x4000, 0xc00); + set_walk_rot(); + cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + + float mag = speed.abs2XZ(); + if (mag < l_gnd_fric) { + if (std::fabsf(norm->x) >= 0.001f && std::fabsf(norm->z) >= 0.001f) { + mode_wait_init(); + } + } + } else { + daObj::posMoveF_stream(this, mStts.GetCCMoveP(), &mMove, l_viscous_resist, l_inert_resist); + cLib_chaseAngleS(&shape_angle.z, 0x4000, 0xc00); + set_walk_rot(); + } } /* 00000F40-00001074 .text vib_pos_ang__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::vib_pos_ang() { - /* Nonmatching */ + float gndFactor = mAcch.ChkGroundHit() ? 0.8f : 1.0f; + float tmp1 = (m610 * 8.544922e-05f + 0.3f) * attr().m28 * 0.1f * gndFactor; + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + shape_angle.y += (short)tmp1; + m612 += (short)(attr().m28 * 0.9f * gndFactor); } /* 00001074-000012A0 .text mode_proc_call__Q211daObjBarrel5Act_cFv */ -void daObjBarrel::Act_c::mode_proc_call() { - /* Nonmatching */ +bool daObjBarrel::Act_c::mode_proc_call() { + typedef void (daObjBarrel::Act_c::*procFunc)(); + static procFunc mode_proc[] = { + &daObjBarrel::Act_c::mode_wait, + &daObjBarrel::Act_c::mode_carry, + &daObjBarrel::Act_c::mode_vib0, + &daObjBarrel::Act_c::mode_vib1, + &daObjBarrel::Act_c::mode_vib2, + &daObjBarrel::Act_c::mode_jump, + &daObjBarrel::Act_c::mode_walk, + }; + + if (fopAcM_checkCarryNow(this) || fopAcM_checkHookCarryNow(this)) { + if (mMode != MODE_CARRY) { + mode_carry_init(); + } + } + (this->*mode_proc[mMode])(); + cXyz curPos = current.pos; + mAcch.CrrPos(*dComIfG_Bgsp()); + if (dComIfG_Bgsp()->ChkMoveBG(mAcch.m_gnd)) { + mForceExec = true; + } + if (mMode == MODE_CARRY) { + current.pos = curPos; + } + + if (!damage_bg_proc_directly()) { + if (mMode != MODE_CARRY) { + tevStr.mRoomNo = current.roomNo; + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd); + } + mMove *= 0.95f; + if (mMove.abs2() < 0.1f) { + mMove.setall(0.0f); + } + return true; + } + return false; } /* 000012A0-00001490 .text set_mtx__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::set_mtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos); + switch (mMode) { + case MODE_VIB0: + case MODE_VIB1: + case MODE_VIB2: + mDoMtx_stack_c::transM(0.0f, attr().m31, 0.0f); + mDoMtx_stack_c::ZXYrotM(0, shape_angle.y, shape_angle.z); + mDoMtx_stack_c::YrotM(m612); + mDoMtx_stack_c::XrotM(m610); + mDoMtx_stack_c::YrotM(-m612); + mDoMtx_stack_c::transM(0.0f, -attr().m31, 0.0f); + break; + case MODE_WAIT: + case MODE_CARRY: + case MODE_JUMP: + case MODE_WALK: + mDoMtx_stack_c::transM(0.0f, cM_scos(shape_angle.z) * 5.0f + l_s_radius, 0.0f); + mDoMtx_stack_c::ZXYrotM(0, shape_angle.y, shape_angle.z); + mDoMtx_stack_c::YrotM(m612); + mDoMtx_stack_c::XrotM(m610); + mDoMtx_stack_c::YrotM(-m612); + mDoMtx_stack_c::YrotM(m630); + mDoMtx_stack_c::transM(0.0f, -l_l_radius, 0.0f); + break; + } + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00001490-000014CC .text init_mtx__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::init_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + set_mtx(); } /* 000014CC-00001710 .text set_walk_rot__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::set_walk_rot() { - /* Nonmatching */ + cXyz delta = current.pos - old.pos; + float mag = delta.absXZ(); + + bool negAngle = false; + current.angle.y = cM_atan2s(delta.x, delta.z); + short targetAngle = current.angle.y; + if (targetAngle < 0) { + targetAngle += 0x8000; + negAngle = true; + } + if (mag > l_min_move_dir || mMode == MODE_WAIT && mag > l_min_move_dir / 2) { + cLib_chaseAngleS(&shape_angle.y, targetAngle, 0x600); + } + float fVar2 = mag / ((cM_scos(shape_angle.z) * 5.0f + l_s_radius) * 6.28f) * 65535.0f; + if (!negAngle) { + m612 -= (short)(fVar2 * 3.0f); + m630 -= (short)fVar2; + } else { + m612 += (short)(fVar2 * 3.0f); + m630 += (short)fVar2; + } + float vibFactor = mag / l_max_move; + if (vibFactor > 1.0f) { + vibFactor = 1.0f; + } + m610 = vibFactor * l_max_vib_angl; } /* 00001710-00001824 .text eff_break__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::eff_break() { - /* Nonmatching */ + cXyz pos(current.pos.x, current.pos.y + 50.0f, current.pos.z); + JPABaseEmitter* emitter = dComIfGp_particle_set(dPa_name::ID_COMMON_03E5, &pos, NULL, NULL, 0xFF, NULL, -1, &tevStr.mColorK0, &tevStr.mColorK0); + if (emitter) { + static const JGeometry::TVec3 em_scl(1.0f, 0.8f, 1.0f); + emitter->setEmitterScale(em_scl); + } + daObjEff::Act_c::make_barrel_smoke(&pos); } /* 00001824-000018C8 .text damaged__Q211daObjBarrel5Act_cFb */ -void daObjBarrel::Act_c::damaged(bool) { - /* Nonmatching */ +void daObjBarrel::Act_c::damaged(bool animate) { + fopAcM_cancelCarryNow(this); + if (animate) { + eff_break(); + fopAcM_seStart(this, JA_SE_OBJ_COL_SWC_WODCRL, 0); + set_senv(attr().mSeBreakP1, attr().mSeBreakP2); + } } /* 000018C8-00001900 .text cull_set_draw__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::cull_set_draw() { - /* Nonmatching */ + fopAcM_setCullSizeSphere(this, 0.0f, 50.0f, 0.0f, 75.0f); } /* 00001900-00001938 .text cull_set_move__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::cull_set_move() { - /* Nonmatching */ + fopAcM_setCullSizeSphere(this, 0.0f, 50.0f, 0.0f, 300.0f); } /* 00001938-00001940 .text get_se_map_hit__Q211daObjBarrel5Act_cCFv */ -void daObjBarrel::Act_c::get_se_map_hit() const { - /* Nonmatching */ +u32 daObjBarrel::Act_c::get_se_map_hit() const { + return 0x0B; } /* 00001940-00001994 .text set_senv__Q211daObjBarrel5Act_cCFii */ -void daObjBarrel::Act_c::set_senv(int, int) const { - /* Nonmatching */ +void daObjBarrel::Act_c::set_senv(int p1, int p2) const { + dKy_Sound_set(current.pos, p1, fopAcM_GetID((void*)this), p2); } /* 00001994-00001A88 .text se_fall_water__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::se_fall_water() { - /* Nonmatching */ + cBgS_PolyInfo* temp[2] = { + &mAcch.m_wtr, + &mAcch.m_gnd, + }; + + u32 mtrlSndId = 0x13; + for (int i = 0; i < ARRAY_SIZE(temp); i++) { + int bg_index = temp[i]->GetBgIndex(); + if (bg_index >= 0 && bg_index < 0x100) { + mtrlSndId = dComIfG_Bgsp()->GetMtrlSndId(*temp[i]); + break; + } + } + + fopAcM_seStart(this, JA_SE_OBJ_FALL_WATER_M, mtrlSndId); + set_senv(0x7D, 5); } /* 00001A88-00001AD8 .text eff_hit_water_splash__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::eff_hit_water_splash() { - /* Nonmatching */ + cXyz pos(current.pos.x, mAcch.m_wtr.GetHeight(), current.pos.z); + fopKyM_createWpillar(&pos, attr().mWPillarScaleXZ, attr().mWPillarScaleY, 0); } /* 00001AD8-00001B10 .text chk_sink_water__Q211daObjBarrel5Act_cFv */ -void daObjBarrel::Act_c::chk_sink_water() { - /* Nonmatching */ +bool daObjBarrel::Act_c::chk_sink_water() { + return mAcch.ChkWaterHit() && mAcch.m_wtr.GetHeight() > current.pos.y + 50.0f; } /* 00001B10-00001B58 .text chk_sinkdown_water__Q211daObjBarrel5Act_cFv */ -void daObjBarrel::Act_c::chk_sinkdown_water() { - /* Nonmatching */ +bool daObjBarrel::Act_c::chk_sinkdown_water() { + return mAcch.ChkWaterHit() && mAcch.m_wtr.GetHeight() > current.pos.y + attr().mSinkDownDepth + 50.0f; } /* 00001B58-00001B84 .text eff_land_smoke__Q211daObjBarrel5Act_cFv */ void daObjBarrel::Act_c::eff_land_smoke() { - /* Nonmatching */ + daObj::make_land_effect(this, &mAcch.m_gnd, 1.0f); } /* 00001B84-00001F28 .text damage_cc_proc__Q211daObjBarrel5Act_cFv */ -void daObjBarrel::Act_c::damage_cc_proc() { - /* Nonmatching */ +bool daObjBarrel::Act_c::damage_cc_proc() { + bool broken = false; + if (mCyl.ChkAtHit()) { + damaged(true); + broken = true; + mCyl.ClrAtHit(); + } else if (mCyl.ChkTgHit()) { + cCcD_Obj *hitObj = mCyl.GetTgHitObj(); + u32 se = get_se_map_hit(); + if (hitObj != NULL) { + if (hitObj->ChkAtType(AT_TYPE_BOMB) || + hitObj->ChkAtType(AT_TYPE_UNK8) || + hitObj->ChkAtType(AT_TYPE_SKULL_HAMMER) || + (hitObj->MskAtSPrm(cCcD_AtSPrm_VsPlayer_e) && + cLib_checkBit(mStts.GetAtSpl(), dCcG_At_Spl_UNK3)) + ) { + damaged(true); + broken = true; + } else if ((mMode == MODE_WAIT || mMode == MODE_WALK) && hitObj->ChkAtType(AT_TYPE_WIND)) { + cXyz windVec = *mCyl.GetTgRVecP(); + float windMag2 = windVec.abs2(); + if (windMag2 > l_wind_max*l_wind_max) { + windVec *= l_wind_max / std::sqrtf(windMag2); + } + cCcD_ShapeAttr* hitShapeAttr = hitObj->GetShapeAttr(); + cXyz hitNormal = cXyz::Zero; + float f1 = 1.0f; + if (hitShapeAttr->GetNVec(current.pos, &hitNormal)) { + hitNormal *= l_shape_vec; + mMove.abs2(); + fopAc_ac_c* hitActor = mCyl.GetTgHitAc(); + if (hitActor != NULL && fopAcM_GetProfName(hitActor) == PROC_PLAYER) { + s16 hitObjAngleY = cM_atan2s(hitNormal.x, hitNormal.z); + f32 f2 = cM_scos(hitActor->shape_angle.y - hitObjAngleY); + if (f2 > 0.0f) { + f1 = 1.0f + 2.0f * f2; + } + } + } + float ratio = windMag2 > 0.01f ? l_tgr_ratio : 0.0f; + mMove = windVec * ratio + hitNormal * (1.0f - ratio) * f1; + if (mMode == MODE_WAIT) { + if (shape_angle.z == 0) { + mode_jump_init(); + } else { + mode_walk_init(); + } + } + } + } + if (!broken) { + daObj::HitSeStart(&eyePos, current.roomNo, &mCyl, se); + set_senv(attr().mSeHitP1, attr().mSeHitP2); + daObj::HitEff_kikuzu(this, &mCyl); + } + mCyl.ClrTgHit(); + } + + return broken; } /* 00001F28-00001FCC .text damage_bg_proc__Q211daObjBarrel5Act_cFv */ -void daObjBarrel::Act_c::damage_bg_proc() { - /* Nonmatching */ +bool daObjBarrel::Act_c::damage_bg_proc() { + bool sunk = chk_sink_water(); + bool broken = false; + if ((mMode == MODE_WAIT || mMode == MODE_JUMP || mMode == MODE_WALK) && sunk) { + if (!mSunk) { + se_fall_water(); + eff_hit_water_splash(); + mSunk = true; + } + if (chk_sinkdown_water()) { + damaged(false); + broken = true; + } + } + return broken; } /* 00001FCC-00002154 .text damage_bg_proc_directly__Q211daObjBarrel5Act_cFv */ -void daObjBarrel::Act_c::damage_bg_proc_directly() { - /* Nonmatching */ +bool daObjBarrel::Act_c::damage_bg_proc_directly() { + u32 groundHit = mAcch.ChkGroundHit() ? TRUE : FALSE; + u32 groundLanding = mAcch.ChkGroundLanding() ? TRUE : FALSE; + bool broken = false; + + if (mMode == MODE_WAIT || mMode == MODE_JUMP || mMode == MODE_WALK) { + if (groundLanding && (mLastGroundY - current.pos.y > attr().mFallDmgH)) { + damaged(true); + broken = true; + } + if (groundHit) { + mLastGroundY = current.pos.y; + } + } + + if (mInitTimer > 0) { + mInitTimer--; + } else { + if (mAcch.ChkGroundHit()) { + if (!mOnGround && mMode != MODE_CARRY) { + fopAcM_seStart(this, JA_SE_LK_BARREL_TAKE_OFF, dComIfG_Bgsp()->GetMtrlSndId(mAcch.m_gnd)); + mOnGround = true; + } + } else { + mOnGround = false; + } + if (groundLanding) { + if (mMode == MODE_CARRY) { + if (mTimer <= 0) { + eff_land_smoke(); + } + } else { + eff_land_smoke(); + } + } + } + return broken; } /* 00002154-000022F4 .text _execute__Q211daObjBarrel5Act_cFv */ bool daObjBarrel::Act_c::_execute() { - /* Nonmatching */ + cull_set_move(); + + if (mForceExec || mMode != MODE_WAIT || !mAcch.ChkGroundHit() || mAcch.ChkGroundLanding() || prm_get_cull() == 0 || !fopAcM_cullingCheck(this)) { + mForceExec = false; + BOOL broken = TRUE; + if (!damage_cc_proc() && !damage_bg_proc()) { + if (mMode != MODE_VIB0 && + mMode != MODE_VIB1 && + mMode != MODE_VIB2 && + mMode != MODE_JUMP && + mMode != MODE_WALK && + !fopAcM_checkCarryNow(this) + ) { + if (shape_angle.x != 0) { + mode_vib0_init(); + } + } + if (mode_proc_call()) { + broken = FALSE; + set_mtx(); + mStts.SetRoomId(current.roomNo); + mCyl.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCyl); + attention_info.position.x = current.pos.x; + attention_info.position.y = current.pos.y + attr().mAttnH; + attention_info.position.z = current.pos.z; + eyePos = attention_info.position; + } + } + if (broken) { + fopAcM_delete(this); + } + } + cull_set_draw(); + return true; } /* 000022F4-0000241C .text _draw__Q211daObjBarrel5Act_cFv */ bool daObjBarrel::Act_c::_draw() { - /* Nonmatching */ + bool draw = true; + if (attr().mEnableCutoff && fopAcM_viewCutoffCheck(this, 1000.0f)) { + draw = false; + } + + if (draw) { + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + mDoExt_modelUpdateDL(mpModel); + float gndH = mAcch.GetGroundH(); + cM3dGPla* gndPlane = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd); + cXyz *norm = gndPlane->GetNP(); + if (gndPlane && gndH != C_BG_MIN_HEIGHT) { + dComIfGd_setSimpleShadow(¤t.pos, gndH, attr().m02, norm); + } + } + return true; } /* 0000241C-0000243C .text Create__Q211daObjBarrel6MethodFPv */ -s32 daObjBarrel::Method::Create(void*) { - /* Nonmatching */ +s32 daObjBarrel::Method::Create(void* i_this) { + return static_cast(i_this)->_create(); } /* 0000243C-00002460 .text Delete__Q211daObjBarrel6MethodFPv */ -BOOL daObjBarrel::Method::Delete(void*) { - /* Nonmatching */ +BOOL daObjBarrel::Method::Delete(void* i_this) { + return static_cast(i_this)->_delete(); } /* 00002460-00002484 .text Execute__Q211daObjBarrel6MethodFPv */ -BOOL daObjBarrel::Method::Execute(void*) { - /* Nonmatching */ +BOOL daObjBarrel::Method::Execute(void* i_this) { + return static_cast(i_this)->_execute(); } /* 00002484-000024A8 .text Draw__Q211daObjBarrel6MethodFPv */ -BOOL daObjBarrel::Method::Draw(void*) { - /* Nonmatching */ +BOOL daObjBarrel::Method::Draw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 000024A8-000024B0 .text IsDelete__Q211daObjBarrel6MethodFPv */ -BOOL daObjBarrel::Method::IsDelete(void*) { - /* Nonmatching */ +BOOL daObjBarrel::Method::IsDelete(void* i_this) { + return TRUE; } actor_method_class daObjBarrel::Method::Table = {