From 1a752bbbb9784f60d0dfc794114074dd5f690044 Mon Sep 17 00:00:00 2001 From: Ross Newman Date: Thu, 27 Mar 2025 01:26:27 -0400 Subject: [PATCH] d-a-obj-shmrgrd (#708) * start d-a-obj-shmrgrd * mostly matching * constructor * 100% * d-a-obj-shmrgrd equivalent --- configure.py | 2 +- include/d/actor/d_a_obj_shmrgrd.h | 88 ++++- include/d/d_cc_d.h | 2 +- src/d/actor/d_a_am.cpp | 8 +- src/d/actor/d_a_am2.cpp | 8 +- src/d/actor/d_a_obj_shmrgrd.cpp | 542 +++++++++++++++++++++++++++--- src/d/actor/d_a_obj_swpush.cpp | 1 - 7 files changed, 581 insertions(+), 70 deletions(-) diff --git a/configure.py b/configure.py index 47bb825ef..b38e56995 100755 --- a/configure.py +++ b/configure.py @@ -1402,7 +1402,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_rcloud"), ActorRel(Matching, "d_a_obj_roten", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_obj_shelf"), - ActorRel(NonMatching, "d_a_obj_shmrgrd"), + ActorRel(Equivalent, "d_a_obj_shmrgrd"), # weak func order ActorRel(Matching, "d_a_obj_swpush", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_table"), ActorRel(NonMatching, "d_a_obj_tenmado"), diff --git a/include/d/actor/d_a_obj_shmrgrd.h b/include/d/actor/d_a_obj_shmrgrd.h index b6cce0c3f..bcb88d59e 100644 --- a/include/d/actor/d_a_obj_shmrgrd.h +++ b/include/d/actor/d_a_obj_shmrgrd.h @@ -2,29 +2,54 @@ #define D_A_OBJ_SHMRGRD_H #include "f_op/f_op_actor.h" +#include "d/d_cc_d.h" +#include "d/d_a_obj.h" +#include "d/d_particle.h" +class dBgW; class J3DNode; class daObjShmrgrd_c : public fopAc_ac_c { public: - void get_mode() {} - void is_switch() const {} - void on_switch() const {} - void prm_get_swSave() const {} + enum Mode_e { + MODE_UPPER = 0, + MODE_U_L = 1, + MODE_LOWER = 2 + }; + + enum Prm_e { + PRM_SWSAVE_W = 0x8, + PRM_SWSAVE_S = 0x0, + }; + + Mode_e get_mode() { return mMode; } + bool is_switch() const { + if (prm_get_swSave() == 0xFF) { + return false; + } else { + return fopAcM_isSwitch(const_cast(this), prm_get_swSave()); + } + } + void on_switch() const { + if (prm_get_swSave() != 0xFF) { + fopAcM_onSwitch(const_cast(this), prm_get_swSave()); + } + } + s32 prm_get_swSave() const { return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); } daObjShmrgrd_c(); - void solidHeapCB(fopAc_ac_c*); - void create_heap(); + static BOOL solidHeapCB(fopAc_ac_c*); + BOOL create_heap(); cPhs_State _create(); bool _delete(); - void search_target_next(daObjShmrgrd_c*); + daObjShmrgrd_c* search_target_next(daObjShmrgrd_c*); void register_list(); void leave_list(); - void search_gap(); + daObjShmrgrd_c* search_gap(); void set_gap_co(); void init_mtx(); void set_mtx(); - void check_player_angle(fopAc_ac_c*); + BOOL check_player_angle(fopAc_ac_c*); void set_damage(); void vib_start(short, float); void vib_proc(); @@ -42,8 +67,49 @@ public: bool _execute(); bool _draw(); + virtual ~daObjShmrgrd_c() {} + + static int M_damage; + static short M_damage_dir; + static daObjShmrgrd_c* M_list_p; + + static const dCcD_SrcCyl M_cyl_src_co; + static const dCcD_SrcCyl M_cyl_src_at; + static const dCcD_SrcCyl M_cyl_src_tg; + static const dCcD_SrcCyl M_cyl_src_gap_co; + static const char M_arcname[8]; + public: - /* Place member variables here */ -}; + /* 0x290 */ // vtable + /* 0x294 */ daObjShmrgrd_c* mpNext; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ request_of_phase_process_class mPhs; + /* 0x2A4 */ dCcD_Cyl mCylCo; + /* 0x3D4 */ dCcD_Stts mSttsCo; + /* 0x410 */ dCcD_Cyl mCylTg; + /* 0x540 */ dCcD_Stts mSttsTg; + /* 0x57C */ dCcD_Cyl mCylAt; + /* 0x6AC */ dCcD_Stts mSttsAt; + /* 0x6E8 */ dCcD_Cyl mCylGapCo; + /* 0x818 */ dCcD_Stts mSttsGapCo; + /* 0x854 */ Mode_e mMode; + /* 0x858 */ s16 mCrushTimer; + /* 0x85A */ u8 mCrushState; + /* 0x85C */ f32 m85C; // unused + /* 0x860 */ f32 mScaleY; + /* 0x864 */ f32 mAngleZ; + /* 0x868 */ f32 mAngleX; + /* 0x86C */ f32 mAngleSpeedZ; + /* 0x870 */ f32 mAngleSpeedX; + /* 0x874 */ f32 mTargetHFrac; + /* 0x878 */ f32 mCurHFrac; + /* 0x87C */ f32 mVSpeed; + /* 0x880 */ f32 mTopPos; + /* 0x884 */ dPa_smokeEcallBack mSmokeCb; + /* 0x8A4 */ Mtx mMtx; + /* 0x2D4 */ dBgW* mpBgW; +}; // Size: 0x8D8 + +STATIC_ASSERT(sizeof(daObjShmrgrd_c) == 0x8D8); #endif /* D_A_OBJ_SHMRGRD_H */ diff --git a/include/d/d_cc_d.h b/include/d/d_cc_d.h index f1524b965..19dfe0316 100644 --- a/include/d/d_cc_d.h +++ b/include/d/d_cc_d.h @@ -20,7 +20,7 @@ enum dCcD_ObjAtType { /* 0x00000200 */ AT_TYPE_FIRE = (1 << 9), /* 0x00000400 */ AT_TYPE_MACHETE = (1 << 10), /* 0x00000800 */ AT_TYPE_UNK800 = (1 << 11), - /* 0x00001000 */ AT_TYPE_UNK1000 = (1 << 12), + /* 0x00001000 */ AT_TYPE_SPIKE = (1 << 12), /* 0x00002000 */ AT_TYPE_UNK2000 = (1 << 13), /* 0x00004000 */ AT_TYPE_NORMAL_ARROW = (1 << 14), /* 0x00008000 */ AT_TYPE_HOOKSHOT = (1 << 15), diff --git a/src/d/actor/d_a_am.cpp b/src/d/actor/d_a_am.cpp index b7d279376..9f7fedda9 100644 --- a/src/d/actor/d_a_am.cpp +++ b/src/d/actor/d_a_am.cpp @@ -1195,7 +1195,7 @@ static cPhs_State daAM_Create(fopAc_ac_c* i_actor) { // dCcD_SrcGObjInf { /* Flags */ 0, - /* SrcObjAt Type */ AT_TYPE_UNK1000, + /* SrcObjAt Type */ AT_TYPE_SPIKE, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ AT_TYPE_NORMAL_ARROW | AT_TYPE_FIRE_ARROW | AT_TYPE_ICE_ARROW | AT_TYPE_LIGHT_ARROW | AT_TYPE_GRAPPLING_HOOK, @@ -1226,7 +1226,7 @@ static cPhs_State daAM_Create(fopAc_ac_c* i_actor) { // dCcD_SrcGObjInf { /* Flags */ 0, - /* SrcObjAt Type */ AT_TYPE_UNK1000, + /* SrcObjAt Type */ AT_TYPE_SPIKE, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ 0, @@ -1257,7 +1257,7 @@ static cPhs_State daAM_Create(fopAc_ac_c* i_actor) { // dCcD_SrcGObjInf { /* Flags */ 0, - /* SrcObjAt Type */ AT_TYPE_UNK1000, + /* SrcObjAt Type */ AT_TYPE_SPIKE, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_WIND | AT_TYPE_UNK400000 | AT_TYPE_LIGHT), @@ -1289,7 +1289,7 @@ static cPhs_State daAM_Create(fopAc_ac_c* i_actor) { // dCcD_SrcGObjInf { /* Flags */ 0, - /* SrcObjAt Type */ AT_TYPE_UNK1000, + /* SrcObjAt Type */ AT_TYPE_SPIKE, /* SrcObjAt Atp */ 2, /* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_GrpAll_e, /* SrcObjTg Type */ 0, diff --git a/src/d/actor/d_a_am2.cpp b/src/d/actor/d_a_am2.cpp index 8b5412803..8e3e76e18 100644 --- a/src/d/actor/d_a_am2.cpp +++ b/src/d/actor/d_a_am2.cpp @@ -1315,7 +1315,7 @@ static cPhs_State daAM2_Create(fopAc_ac_c* i_actor) { // dCcD_SrcGObjInf { /* Flags */ 0, - /* SrcObjAt Type */ AT_TYPE_UNK1000, + /* SrcObjAt Type */ AT_TYPE_SPIKE, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ AT_TYPE_NORMAL_ARROW | AT_TYPE_FIRE_ARROW | AT_TYPE_ICE_ARROW | AT_TYPE_LIGHT_ARROW | AT_TYPE_GRAPPLING_HOOK, @@ -1347,7 +1347,7 @@ static cPhs_State daAM2_Create(fopAc_ac_c* i_actor) { // dCcD_SrcGObjInf { /* Flags */ 0, - /* SrcObjAt Type */ AT_TYPE_UNK1000, + /* SrcObjAt Type */ AT_TYPE_SPIKE, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_WIND | AT_TYPE_UNK400000 | AT_TYPE_LIGHT), @@ -1379,7 +1379,7 @@ static cPhs_State daAM2_Create(fopAc_ac_c* i_actor) { // dCcD_SrcGObjInf { /* Flags */ 0, - /* SrcObjAt Type */ AT_TYPE_UNK1000, + /* SrcObjAt Type */ AT_TYPE_SPIKE, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_WIND | AT_TYPE_UNK400000 | AT_TYPE_LIGHT), @@ -1411,7 +1411,7 @@ static cPhs_State daAM2_Create(fopAc_ac_c* i_actor) { // dCcD_SrcGObjInf { /* Flags */ 0, - /* SrcObjAt Type */ AT_TYPE_UNK1000, + /* SrcObjAt Type */ AT_TYPE_SPIKE, /* SrcObjAt Atp */ 1, /* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsPlayer_e, /* SrcObjTg Type */ 0, diff --git a/src/d/actor/d_a_obj_shmrgrd.cpp b/src/d/actor/d_a_obj_shmrgrd.cpp index 491107a84..234ad82dc 100644 --- a/src/d/actor/d_a_obj_shmrgrd.cpp +++ b/src/d/actor/d_a_obj_shmrgrd.cpp @@ -4,182 +4,628 @@ // #include "d/actor/d_a_obj_shmrgrd.h" +#include "d/res/res_shmrgrd.h" #include "d/d_procname.h" +#include "f_op/f_op_actor_mng.h" +#include "d/d_com_inf_game.h" +#include "d/actor/d_a_player.h" + +#include "weak_bss_936_to_1036.h" // IWYU pragma: keep +#include "weak_data_1811.h" // IWYU pragma: keep + +struct Attr_c { + /* 0x00 */ f32 mVSpring; + /* 0x04 */ f32 mIntVSpeedDecay; + /* 0x08 */ f32 mExtVSpeedDecay; + /* 0x0C */ f32 mVibMag0Mult; + /* 0x10 */ f32 mVibSpring; + /* 0x14 */ f32 mAngleSpeedDecay; + /* 0x18 */ s16 mCrushDuration; + /* 0x1C */ f32 m1C; // unused + /* 0x20 */ f32 m20; // unused + /* 0x24 */ f32 m24; // unused +}; + +const Attr_c L_attr = { + /* mVSpring */ 0.8f, + /* mIntVSpeedDecay */ 0.55f, + /* mExtVSpeedDecay */ 0.55f, + /* mVibMag0Mult */ 1.0f, + /* mVibSpring */ 0.99f, + /* mAngleSpeedDecay */ 0.18f, + /* mCrushDuration */ 18, + /* m1C */ 0.0f, + /* m20 */ 0.8f, + /* m24 */ 0.45f +}; + +inline const Attr_c & attr() { return L_attr; } + +int daObjShmrgrd_c::M_damage; +short daObjShmrgrd_c::M_damage_dir; +daObjShmrgrd_c* daObjShmrgrd_c::M_list_p; + +const dCcD_SrcCyl daObjShmrgrd_c::M_cyl_src_co = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ 0, + /* SrcObjTg SPrm */ 0, + /* 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 */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 79.0f, + /* Height */ 112.5f, + }, +}; +const dCcD_SrcCyl daObjShmrgrd_c::M_cyl_src_at = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_SPIKE, + /* SrcObjAt Atp */ 1, + /* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsPlayer_e, + /* SrcObjTg Type */ 0, + /* SrcObjTg SPrm */ 0, + /* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e | cCcD_CoSPrm_VsEnemy_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 */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 80.0f, + /* Height */ 260.0f, + }, +}; +const dCcD_SrcCyl daObjShmrgrd_c::M_cyl_src_tg = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_WIND | AT_TYPE_UNK400000 | AT_TYPE_LIGHT), + /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_GrpAll_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 */ dCcG_TgSPrm_NoConHit_e, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 50.0f, + /* Height */ 112.5f, + }, +}; +const dCcD_SrcCyl daObjShmrgrd_c::M_cyl_src_gap_co = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_SPIKE, + /* SrcObjAt Atp */ 1, + /* SrcObjAt SPrm */ cCcD_AtSPrm_Set_e | cCcD_AtSPrm_VsPlayer_e, + /* SrcObjTg Type */ 0, + /* SrcObjTg SPrm */ 0, + /* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e | cCcD_CoSPrm_VsEnemy_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 */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 70.0f, + /* Height */ 260.0f, + }, +}; + +const char daObjShmrgrd_c::M_arcname[] = "Shmrgrd"; + +const GXColor color = {0xA0, 0xA0, 0x80, 0xFF}; /* 000000EC-00000358 .text __ct__14daObjShmrgrd_cFv */ daObjShmrgrd_c::daObjShmrgrd_c() { - /* Nonmatching */ + mSmokeCb.setColor(color); + mpNext = NULL; } /* 000005A8-000005C8 .text solidHeapCB__14daObjShmrgrd_cFP10fopAc_ac_c */ -void daObjShmrgrd_c::solidHeapCB(fopAc_ac_c*) { - /* Nonmatching */ +BOOL daObjShmrgrd_c::solidHeapCB(fopAc_ac_c* i_this) { + return static_cast(i_this)->create_heap(); } /* 000005C8-000006E0 .text create_heap__14daObjShmrgrd_cFv */ -void daObjShmrgrd_c::create_heap() { - /* Nonmatching */ +BOOL daObjShmrgrd_c::create_heap() { + BOOL rt = FALSE; + J3DModelData* mdl_data = static_cast(dComIfG_getObjectRes(M_arcname, SHMRGRD_BDL_SHMRGRD)); + JUT_ASSERT(0x21A, mdl_data != NULL); + if (mdl_data != NULL) { + mpModel = mDoExt_J3DModel__create(mdl_data, 0, 0x11020203); + if (mpModel) { + mdl_data->getJointNodePointer(2)->setCallBack(jnodeCB); + mpModel->setUserArea((u32) this); + mpBgW = dBgW_NewSet((cBgD_t *)dComIfG_getObjectRes(M_arcname, SHMRGRD_DZB_HGBASE), cBgW::MOVE_BG_e, &mMtx); + if (mpBgW) { + rt = TRUE; + } + } + } + return rt; } /* 000006E0-00000964 .text _create__14daObjShmrgrd_cFv */ cPhs_State daObjShmrgrd_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daObjShmrgrd_c); + cPhs_State phase_state = dComIfG_resLoad(&mPhs, M_arcname); + if (phase_state == cPhs_COMPLEATE_e) { + phase_state = cPhs_ERROR_e; + if (fopAcM_entrySolidHeap(this, solidHeapCB, 0x12A0)) { + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + init_mtx(); + fopAcM_setCullSizeBox(this, -90.0f, 0.0f, -90.0f, 90.0f, 120.0f, 90.0f); + + mSttsCo.Init(0xFF, 0xFF, this); + mCylCo.Set(M_cyl_src_co); + mCylCo.SetStts(&mSttsCo); + mSttsTg.Init(0xFF, 0xFF, this); + mCylTg.Set(M_cyl_src_tg); + mCylTg.SetStts(&mSttsTg); + mCylTg.OnTgNoHitMark(); + mSttsAt.Init(0xFF, 0xFF, this); + mCylAt.Set(M_cyl_src_at); + mCylAt.SetStts(&mSttsAt); + mSttsGapCo.Init(0xFF, 0xFF, this); + mCylGapCo.Set(M_cyl_src_gap_co); + mCylGapCo.SetStts(&mSttsGapCo); + + mCrushTimer = 0; + mCrushState = 0; + m85C = 0.0f; + mScaleY = 1.0f; + mAngleZ = 0.0f; + mAngleX = 0.0f; + mAngleSpeedZ = 0.0f; + mAngleSpeedX = 0.0f; + mVSpeed = 0.0f; + mTargetHFrac = 0.0f; + + cLib_onBit(attention_info.flags, fopAc_Attn_LOCKON_MISC_e); + attention_info.distances[fopAc_Attn_TYPE_MISC_e] = 0x2D; + if (is_switch()) { + mCurHFrac = 0.0f; + mTopPos = -85.0f; + mode_lower_init(); + } else { + mCurHFrac = 1.0f; + mTopPos = 0.0f; + mode_upper_init(); + } + register_list(); + mDoMtx_copy(mpModel->getBaseTRMtx(), mMtx); + dComIfG_Bgsp()->Regist(mpBgW, this); + phase_state = cPhs_COMPLEATE_e; + } + } + return phase_state; } /* 00000964-00000A14 .text _delete__14daObjShmrgrd_cFv */ bool daObjShmrgrd_c::_delete() { - /* Nonmatching */ + if (heap != NULL && mpBgW != NULL) { + if (mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); + mpBgW = NULL; + } + } + leave_list(); + mSmokeCb.remove(); + dComIfG_resDelete(&mPhs, M_arcname); + return true; } /* 00000A14-00000A48 .text search_target_next__14daObjShmrgrd_cFP14daObjShmrgrd_c */ -void daObjShmrgrd_c::search_target_next(daObjShmrgrd_c*) { - /* Nonmatching */ +daObjShmrgrd_c* daObjShmrgrd_c::search_target_next(daObjShmrgrd_c* target) { + daObjShmrgrd_c* cur = M_list_p; + daObjShmrgrd_c* rt = NULL; + while (cur != NULL) { + if (cur->mpNext == target) { + rt = cur; + break; + } + cur = cur->mpNext; + } + return rt; } /* 00000A48-00000AA4 .text register_list__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::register_list() { - /* Nonmatching */ + mpNext = NULL; + if (M_list_p == NULL) { + M_list_p = this; + } else { + daObjShmrgrd_c* last = search_target_next(NULL); + if (last) { + last->mpNext = this; + } + } } /* 00000AA4-00000B18 .text leave_list__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::leave_list() { - /* Nonmatching */ + daObjShmrgrd_c* prev = search_target_next(this); + if (prev == NULL) { + if (mpNext == NULL) { + M_list_p = NULL; + } else if (this == M_list_p) { + M_list_p = mpNext; + } + } else { + prev->mpNext = mpNext; + } } /* 00000B18-00000C8C .text search_gap__14daObjShmrgrd_cFv */ -void daObjShmrgrd_c::search_gap() { - /* Nonmatching */ +daObjShmrgrd_c* daObjShmrgrd_c::search_gap() { + daObjShmrgrd_c* node = M_list_p; + daObjShmrgrd_c* rt = NULL; + while (node != NULL) { + cXyz delta = node->current.pos - current.pos; + if (node->get_mode() == 0) { + f32 mag = delta.absXZ(); + if (mag <= 165.0f) { + mDoMtx_stack_c::YrotS(shape_angle.y); + cXyz calcVec; + mDoMtx_stack_c::multVec(&cXyz::BaseZ, &calcVec); + f32 prod = calcVec.inprodXZ(delta); + if (prod > 0.0f || prod > 0.0f) { + rt = node; + break; + } + } + } + node = node->mpNext; + } + return rt; } /* 00000C8C-00000D2C .text daObjShmrgrd_get_at_v__FP4cXyzP4cXyz */ -void daObjShmrgrd_get_at_v(cXyz*, cXyz*) { - /* Nonmatching */ +void daObjShmrgrd_get_at_v(cXyz* out, cXyz* other) { + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz dir = player->current.pos - *other; + *out = cXyz::Zero; + if (dir.normalizeRS()) { + *out = dir; + } } /* 00000D2C-00000DF0 .text set_gap_co__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::set_gap_co() { - /* Nonmatching */ + daObjShmrgrd_c* gap = search_gap(); + if (gap) { + cXyz pos = gap->current.pos - current.pos; + pos *= 0.5f; + pos += current.pos; + mCylGapCo.SetC(pos); + cXyz at_v; + daObjShmrgrd_get_at_v(&at_v, &pos); + mCylGapCo.SetAtVec(at_v); + dComIfG_Ccsp()->Set(&mCylGapCo); + } } /* 00000DF0-00000E2C .text init_mtx__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::init_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + set_mtx(); } /* 00000E2C-00000E98 .text set_mtx__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::set_mtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000E98-00000EF4 .text check_player_angle__14daObjShmrgrd_cFP10fopAc_ac_c */ -void daObjShmrgrd_c::check_player_angle(fopAc_ac_c*) { - /* Nonmatching */ +BOOL daObjShmrgrd_c::check_player_angle(fopAc_ac_c* ac) { + s16 angle = ac->shape_angle.y - cLib_targetAngleY(&ac->current.pos, ¤t.pos); + BOOL rt = FALSE; + if (angle > -0x2000 && angle < 0x2000) { + rt = TRUE; + } + return rt; } /* 00000EF4-0000102C .text set_damage__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::set_damage() { - /* Nonmatching */ + u8 attackState = daPy_getPlayerActorClass()->getCutType(); + M_damage = 0; + M_damage_dir = 0; + mSttsTg.Move(); + if (mCylTg.ChkTgHit()) { + cCcD_Obj *hitObj = mCylTg.GetTgHitObj(); + fopAc_ac_c* hitActor = mCylTg.GetTgHitAc(); + if (hitObj->ChkAtType(AT_TYPE_SKULL_HAMMER) && fopAcM_GetProfName(hitActor) == PROC_PLAYER) { + if (check_player_angle(hitActor) && (attackState == 0x12 || attackState == 0x13)) { + M_damage = 1; + } else if (attackState == 0x11) { + M_damage_dir = cM_atan2s(mCylTg.GetTgRVecP()->x, mCylTg.GetTgRVecP()->z); + M_damage = 2; + } + } + daObj::HitSeStart(&eyePos, current.roomNo, &mCylTg, 0x11); + daObj::HitEff_hibana(this, &mCylTg); + mCylTg.ClrTgHit(); + } } /* 0000102C-00001090 .text vib_start__14daObjShmrgrd_cFsf */ -void daObjShmrgrd_c::vib_start(short, float) { - /* Nonmatching */ +void daObjShmrgrd_c::vib_start(s16 dir, f32 mag) { + mAngleSpeedZ = mag * attr().mVibMag0Mult * cM_scos(dir); + mAngleSpeedX = mag * attr().mVibMag0Mult * cM_ssin(dir); } /* 00001090-00001108 .text vib_proc__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::vib_proc() { - /* Nonmatching */ + float angleAccelX = -(mAngleX * attr().mVibSpring) - mAngleSpeedX * attr().mAngleSpeedDecay; + float angleAccelZ = -(mAngleZ * attr().mVibSpring) - mAngleSpeedZ * attr().mAngleSpeedDecay; + + mAngleSpeedZ += angleAccelZ; + mAngleSpeedX += angleAccelX; + mAngleZ += mAngleSpeedZ; + mAngleX += mAngleSpeedX; } /* 00001108-00001114 .text crush_start__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::crush_start() { - /* Nonmatching */ + mCrushState = 1; } /* 00001114-00001178 .text crush_proc__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::crush_proc() { - /* Nonmatching */ + if (mCrushState == 1) { + mScaleY = 0.2f; + mCrushState = 2; + mCrushTimer = attr().mCrushDuration; + return; + } else if (mCrushState == 2) { + if (--mCrushTimer > 0) { + return; + } + mScaleY = 1.0f; + mCrushState = 0; + } } /* 00001178-00001340 .text eff_crush__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::eff_crush() { - /* Nonmatching */ + if (mMode == MODE_UPPER) { + dComIfGp_particle_set(dPa_name::ID_SCENE_81B7, ¤t.pos); + dComIfGp_particle_set(dPa_name::ID_SCENE_81B8, ¤t.pos); + } + static const cXyz particle_scale(1.5f, 1.5f, 1.0f); + JPABaseEmitter* emitter = dComIfGp_particle_setToon(dPa_name::ID_COMMON_2027, ¤t.pos, NULL, NULL, 200, &mSmokeCb, -1, NULL, NULL, &particle_scale); + if (emitter) { + emitter->setRate(30.0f); + emitter->setMaxFrame(1); + emitter->setLifeTime(45); + emitter->setAwayFromCenterSpeed(0.0f); + emitter->setAwayFromAxisSpeed(38.0f); + static const JGeometry::TVec3 vec(0.0f, 15.0f, 0.0f); + emitter->setEmitterTranslation(vec); + } } /* 00001340-000013FC .text calc_top_pos__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::calc_top_pos() { - /* Nonmatching */ + float diff = mCurHFrac - mTargetHFrac; + float decay = mCurHFrac > 0.0f && mCurHFrac < 1.0f + ? attr().mIntVSpeedDecay + : attr().mExtVSpeedDecay; + + mVSpeed -= diff * attr().mVSpring; + mVSpeed -= mVSpeed * decay; + mCurHFrac += mVSpeed; + mCurHFrac = cLib_maxLimit(mCurHFrac, 1.0f); + mTopPos = (1.0f - mCurHFrac) * -85.0f; } /* 000013FC-0000151C .text jnodeCB__14daObjShmrgrd_cFP7J3DNodei */ -BOOL daObjShmrgrd_c::jnodeCB(J3DNode*, int) { - /* Nonmatching */ +BOOL daObjShmrgrd_c::jnodeCB(J3DNode* node, int calcTiming) { + if (calcTiming == J3DNodeCBCalcTiming_In) { + J3DModel* model = (J3DModel*) j3dSys.getModel(); + daObjShmrgrd_c* i_this = (daObjShmrgrd_c*) model->getUserArea(); + J3DJoint* joint = (J3DJoint*) node; + s32 jntNo = joint->getJntNo(); + + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + mDoMtx_stack_c::transM(0.0f, (1.0f - i_this->mScaleY) * 20.0f, 0.0f); + mDoMtx_stack_c::scaleM(1.0f, i_this->mScaleY, 1.0f); + mDoMtx_stack_c::transM(0.0f, i_this->mTopPos, 0.0f); + + cXyz tmp(i_this->mAngleX, 1.0f, i_this->mAngleZ); + Quaternion quat; + daObj::quat_rotBaseY2(&quat, tmp); + mDoMtx_stack_c::transM(0.0f, -20.0f, 0.0f); + mDoMtx_stack_c::quatM(&quat); + mDoMtx_stack_c::transM(0.0f, 20.0f, 0.0f); + + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + } + return TRUE; } /* 0000151C-00001578 .text mode_upper_init__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::mode_upper_init() { - /* Nonmatching */ + mCylTg.SetH(112.5f); + mCylCo.SetH(112.5f); + mTargetHFrac = 1.0f; + mMode = MODE_UPPER; } /* 00001578-00001690 .text mode_upper__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::mode_upper() { - /* Nonmatching */ + if (M_damage == 1) { + mode_u_l_init(); + } else if (is_switch()) { + mode_u_l_init(); + } else if (M_damage == 2) { + vib_start(M_damage_dir, 1.0f); + fopAcM_seStart(this, JA_SE_OBJ_HAMMER_SW_SWING, 0); + } } /* 00001690-00001718 .text mode_u_l_init__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::mode_u_l_init() { - /* Nonmatching */ + fopAcM_seStart(this, JA_SE_OBJ_HAMMER_SW_ON, 0); + mTargetHFrac = 0.0f; + mMode = MODE_U_L; } /* 00001718-0000179C .text mode_u_l__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::mode_u_l() { - /* Nonmatching */ + if (mCurHFrac <= 0.0f) { + on_switch(); + mode_lower_init(); + } } /* 0000179C-000017C0 .text mode_lower_init__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::mode_lower_init() { - /* Nonmatching */ + mTargetHFrac = 0.0f; + cLib_offBit(attention_info.flags, fopAc_Attn_LOCKON_MISC_e); + mMode = MODE_LOWER; } /* 000017C0-000017C4 .text mode_lower__14daObjShmrgrd_cFv */ void daObjShmrgrd_c::mode_lower() { - /* Nonmatching */ } /* 000017C4-000019D4 .text _execute__14daObjShmrgrd_cFv */ bool daObjShmrgrd_c::_execute() { - /* Nonmatching */ + typedef void (daObjShmrgrd_c::*procFunc)(); + static procFunc mode_proc[] = { + &daObjShmrgrd_c::mode_upper, + &daObjShmrgrd_c::mode_u_l, + &daObjShmrgrd_c::mode_lower, + }; + + set_damage(); + if (M_damage == 1) { + crush_start(); + eff_crush(); + } + + (this->*mode_proc[mMode])(); + + calc_top_pos(); + vib_proc(); + crush_proc(); + set_mtx(); + mCylTg.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCylTg); + + if (mMode == MODE_UPPER) { + mCylCo.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCylCo); + cXyz at_v; + daObjShmrgrd_get_at_v(&at_v, ¤t.pos); + mCylAt.SetAtVec(at_v); + mCylAt.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCylAt); + set_gap_co(); + } + + attention_info.position.y = current.pos.y + mTopPos + 125.0f; + eyePos.y = current.pos.y + mTopPos + 75.0f; + + if (heap && mpBgW) { + if (mpBgW->ChkUsed()) { + mpBgW->Move(); + } + } + + return true; } /* 000019D4-00001A74 .text _draw__14daObjShmrgrd_cFv */ bool daObjShmrgrd_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + dComIfGd_setListBG(); + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); + return true; } namespace { /* 00001A74-00001A94 .text Mthd_Create__29@unnamed@d_a_obj_shmrgrd_cpp@FPv */ -cPhs_State Mthd_Create(void*) { - /* Nonmatching */ +cPhs_State Mthd_Create(void* i_this) { + return static_cast(i_this)->_create(); } /* 00001A94-00001AB8 .text Mthd_Delete__29@unnamed@d_a_obj_shmrgrd_cpp@FPv */ -BOOL Mthd_Delete(void*) { - /* Nonmatching */ +BOOL Mthd_Delete(void* i_this) { + return static_cast(i_this)->_delete(); } /* 00001AB8-00001ADC .text Mthd_Execute__29@unnamed@d_a_obj_shmrgrd_cpp@FPv */ -BOOL Mthd_Execute(void*) { - /* Nonmatching */ +BOOL Mthd_Execute(void* i_this) { + return static_cast(i_this)->_execute(); } /* 00001ADC-00001B00 .text Mthd_Draw__29@unnamed@d_a_obj_shmrgrd_cpp@FPv */ -BOOL Mthd_Draw(void*) { - /* Nonmatching */ +BOOL Mthd_Draw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 00001B00-00001B08 .text Mthd_IsDelete__29@unnamed@d_a_obj_shmrgrd_cpp@FPv */ -BOOL Mthd_IsDelete(void*) { - /* Nonmatching */ +BOOL Mthd_IsDelete(void* i_this) { + return TRUE; } static actor_method_class Shmrgrd_Mthd_Table = { diff --git a/src/d/actor/d_a_obj_swpush.cpp b/src/d/actor/d_a_obj_swpush.cpp index 32306b7f2..2f9a3017d 100644 --- a/src/d/actor/d_a_obj_swpush.cpp +++ b/src/d/actor/d_a_obj_swpush.cpp @@ -773,7 +773,6 @@ BOOL daObjSwpush::Act_c::Mthd_Draw() { dComIfGd_setListBG(); mDoExt_modelUpdateDL(mpModel); dComIfGd_setList(); - // dComIfG_Bgsp()->DebugDrawPoly(); return TRUE; }