From 43afdf878eaeb82ab462ea7bb1325b0183b089d5 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sun, 25 Feb 2024 09:45:37 -0800 Subject: [PATCH] d_a_tama --- configure.py | 2 +- include/d/actor/d_a_tama.h | 16 +++-- include/d/d_npc.h | 4 +- src/d/actor/d_a_tama.cpp | 139 ++++++++++++++++++++++++++++++++----- 4 files changed, 139 insertions(+), 22 deletions(-) diff --git a/configure.py b/configure.py index 98ee18d96..1bc76c583 100644 --- a/configure.py +++ b/configure.py @@ -1322,7 +1322,7 @@ config.libs = [ ActorRel(Matching, "d_a_tag_msg"), ActorRel(NonMatching, "d_a_tag_photo"), ActorRel(Matching, "d_a_tag_waterlevel"), - ActorRel(NonMatching, "d_a_tama"), + ActorRel(Matching, "d_a_tama", extra_cflags=['-pragma "nosyminline on"']), ActorRel(Matching, "d_a_tbox", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_tpota"), ActorRel(NonMatching, "d_a_tsubo"), diff --git a/include/d/actor/d_a_tama.h b/include/d/actor/d_a_tama.h index cbe105565..21dcc770f 100644 --- a/include/d/actor/d_a_tama.h +++ b/include/d/actor/d_a_tama.h @@ -2,14 +2,16 @@ #define D_A_TAMA_H #include "f_op/f_op_actor.h" +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" class daTama_c : public fopAc_ac_c { public: - void setDis(float) {} - void setPartnerID(unsigned int) {} - void setSpd(float) {} + void setDis(f32 dis) { mDis = dis; } + void setPartnerID(unsigned int id) { mPartnerID = id; } + void setSpd(f32 spd) { speedF = spd; } - void createInit(); + BOOL createInit(); BOOL _draw(); BOOL _execute(); BOOL _delete(); @@ -17,6 +19,12 @@ public: public: /* Place member variables here */ + /* 0x290 */ u32 mPartnerID; + /* 0x294 */ dBgS_ObjAcch mAcch; + /* 0x458 */ dBgS_AcchCir mAcchCir; + /* 0x498 */ dCcD_Stts mStts; + /* 0x4D4 */ dCcD_Sph mSph; + /* 0x600 */ f32 mDis; }; #endif /* D_A_TAMA_H */ diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 84548e86a..8a2f800b0 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -254,7 +254,9 @@ public: /* 0x6A8 */ u32 mEndMsgNo; /* 0x6AC */ u32 mCurrMsgBsPcId; /* 0x6B0 */ msg_class* mpCurrMsg; - /* 0x6B4 */ u8 pad_0x6B4[0x6C0 - 0x6B4]; + /* 0x6B4 */ u8 field_0x6b4[6]; + /* 0x6BA */ u16 field_0x6ba; + /* 0x6BC */ u8 field_0x6bc[4]; /* 0x6C0 */ /* vtable */ virtual u16 next_msgStatus(u32* msgId) { return fopMsgStts_MSG_ENDS_e; } diff --git a/src/d/actor/d_a_tama.cpp b/src/d/actor/d_a_tama.cpp index cd96421c4..725322bb6 100644 --- a/src/d/actor/d_a_tama.cpp +++ b/src/d/actor/d_a_tama.cpp @@ -4,54 +4,161 @@ // #include "d/actor/d_a_tama.h" -#include "dolphin/types.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "d/d_npc.h" + +static dCcD_SrcSph l_sph_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_ALL, + /* SrcObjTg SPrm */ TG_SPRM_SET | TG_SPRM_IS_ENEMY, + /* SrcObjCo SPrm */ CO_SPRM_SET | CO_SPRM_VS_UNK2 | CO_SPRM_VS_UNK8 | CO_SPRM_IS_UNK4, + /* 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 */ G_TG_SPRM_NO_HIT_MARK, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 30.0f, + }, +}; /* 00000078-00000114 .text createInit__8daTama_cFv */ -void daTama_c::createInit() { - /* Nonmatching */ +BOOL daTama_c::createInit() { + mAcchCir.SetWall(0.0f, 35.0f); + mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this)); + mStts.Init(0, 0xFF, this); + mSph.SetStts(&mStts); + mSph.Set(l_sph_src); + return TRUE; } /* 00000114-0000011C .text _draw__8daTama_cFv */ BOOL daTama_c::_draw() { - /* Nonmatching */ + return TRUE; } /* 0000011C-000002D4 .text _execute__8daTama_cFv */ BOOL daTama_c::_execute() { /* Nonmatching */ + fopNpc_npc_c* partner = (fopNpc_npc_c*)fopAcM_SearchByID(mPartnerID); + bool del = true; + if (partner != NULL) { + f32 distXZ = fopAcM_searchActorDistanceXZ(this, partner); + f32 distY = fabsf(current.pos.y - partner->current.pos.y); + if (distXZ < mDis && distY < 400.0f) { + del = false; + speed.y = speedF * cM_ssin(current.angle.x); + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + mAcch.CrrPos(*dComIfG_Bgsp()); + if (mAcch.ChkWallHit()) { + del = true; + } else if (mAcch.ChkGroundHit()) { + del = true; + } + + if (!del && mSph.ChkCoHit()) { + cCcD_Obj* hitobj = mSph.GetCoHitObj(); + del = true; + if (hitobj != NULL) { + fopAc_ac_c* hitac = hitobj->GetAc(); + if (hitac != NULL) { + if (hitac != partner) { + if (fopAcM_GetName(hitac) == PROC_PLAYER) { + partner->field_0x6ba = 1; + } + } else { + del = false; + } + } + } + } + + mSph.SetC(current.pos); + mSph.SetR(20.0f); + dComIfG_Ccsp()->Set(&mSph); + } + } + if (del) { + fopAcM_delete(this); + } + return TRUE; } /* 000002D4-000002DC .text _delete__8daTama_cFv */ BOOL daTama_c::_delete() { - /* Nonmatching */ + return TRUE; } /* 000002DC-00000410 .text _create__8daTama_cFv */ s32 daTama_c::_create() { - /* Nonmatching */ + s32 rt = cPhs_COMPLEATE_e; + fopAcM_SetupActor(this, daTama_c); + if (!createInit()) + rt = cPhs_ERROR_e; + return rt; } /* 00000638-00000658 .text daTama_Create__FP10fopAc_ac_c */ -static s32 daTama_Create(fopAc_ac_c*) { - /* Nonmatching */ +static s32 daTama_Create(fopAc_ac_c* i_this) { + return ((daTama_c*)i_this)->_create(); } /* 00000658-00000678 .text daTama_Delete__FP8daTama_c */ -static BOOL daTama_Delete(daTama_c*) { - /* Nonmatching */ +static BOOL daTama_Delete(daTama_c* i_this) { + return i_this->_delete(); } /* 00000678-00000698 .text daTama_Execute__FP8daTama_c */ -static BOOL daTama_Execute(daTama_c*) { - /* Nonmatching */ +static BOOL daTama_Execute(daTama_c* i_this) { + return i_this->_execute(); } /* 00000698-000006B8 .text daTama_Draw__FP8daTama_c */ -static BOOL daTama_Draw(daTama_c*) { - /* Nonmatching */ +static BOOL daTama_Draw(daTama_c* i_this) { + return i_this->_draw(); } /* 000006B8-000006C0 .text daTama_IsDelete__FP8daTama_c */ -static BOOL daTama_IsDelete(daTama_c*) { - /* Nonmatching */ +static BOOL daTama_IsDelete(daTama_c* i_this) { + return TRUE; } + +static actor_method_class l_daTama_Method = { + (process_method_func)daTama_Create, + (process_method_func)daTama_Delete, + (process_method_func)daTama_Execute, + (process_method_func)daTama_IsDelete, + (process_method_func)daTama_Draw, +}; + +actor_process_profile_definition g_profile_TAMA = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 9, + /* ListPrio */ fpcPi_CURRENT_e, + /* ProcName */ PROC_TAMA, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daTama_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x012C, + /* Actor SubMtd */ &l_daTama_Method, + /* Status */ fopAcStts_UNK40000_e | fopAcStts_UNK4000_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_0_e, +};