From 4a83c97a4809b10aeb65e10e29385e48d59ca7c5 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sat, 16 Sep 2023 18:50:07 -0400 Subject: [PATCH 1/2] d_bg_s constructors (#46) --- include/SSystem/SComponent/c_bg_s_chk.h | 2 +- include/SSystem/SComponent/c_bg_s_gnd_chk.h | 6 ++++-- include/SSystem/SComponent/c_bg_s_poly_info.h | 4 ++-- include/d/d_bg_s_acch.h | 2 +- include/d/d_bg_s_chk.h | 8 ++++---- include/d/d_bg_s_gnd_chk.h | 13 ++++++++----- include/d/d_bg_s_grp_pass_chk.h | 8 ++++---- include/d/d_bg_s_poly_pass_chk.h | 14 +++++++++++--- 8 files changed, 35 insertions(+), 22 deletions(-) diff --git a/include/SSystem/SComponent/c_bg_s_chk.h b/include/SSystem/SComponent/c_bg_s_chk.h index f78a86dbd..4b76bad12 100644 --- a/include/SSystem/SComponent/c_bg_s_chk.h +++ b/include/SSystem/SComponent/c_bg_s_chk.h @@ -8,7 +8,7 @@ struct cBgD_Vtx_t : public Vec {}; class cBgS_GrpPassChk { public: - virtual ~cBgS_GrpPassChk(); + virtual ~cBgS_GrpPassChk() {} }; class cBgS_PolyPassChk; diff --git a/include/SSystem/SComponent/c_bg_s_gnd_chk.h b/include/SSystem/SComponent/c_bg_s_gnd_chk.h index c669863d2..192406a2a 100644 --- a/include/SSystem/SComponent/c_bg_s_gnd_chk.h +++ b/include/SSystem/SComponent/c_bg_s_gnd_chk.h @@ -8,11 +8,13 @@ class cBgS_GndChk : public cBgS_Chk, public cBgS_PolyInfo { public: cBgS_GndChk(); - void SetPos(cXyz const*); + void SetPos(cXyz const* pos) { + m_pos = *pos; + } void SetPos(Vec const*); void PreCheck(); - virtual ~cBgS_GndChk(); + virtual ~cBgS_GndChk() {} f32 GetNowY() const { return mNowY; } void SetNowY(f32 y) { mNowY = y; } diff --git a/include/SSystem/SComponent/c_bg_s_poly_info.h b/include/SSystem/SComponent/c_bg_s_poly_info.h index 6844dcd70..16e8c2852 100644 --- a/include/SSystem/SComponent/c_bg_s_poly_info.h +++ b/include/SSystem/SComponent/c_bg_s_poly_info.h @@ -13,7 +13,7 @@ private: /* 0x08 */ unsigned int mActorId; public: - cBgS_PolyInfo(); + cBgS_PolyInfo() {} void ClearPi() { mPolyIndex = -1; mBgIndex = 0x100; @@ -26,7 +26,7 @@ public: void SetPolyIndex(int); bool ChkBgIndex() const; - virtual ~cBgS_PolyInfo(); + virtual ~cBgS_PolyInfo() {} u16 GetPolyIndex() const { return mPolyIndex; } u16 GetBgIndex() const { return mBgIndex; } diff --git a/include/d/d_bg_s_acch.h b/include/d/d_bg_s_acch.h index 645c3f732..801ccba21 100644 --- a/include/d/d_bg_s_acch.h +++ b/include/d/d_bg_s_acch.h @@ -206,6 +206,6 @@ public: } /* 80BB336C */ virtual ~dBgS_ObjAcch() {} -}; +}; // Size: 0x1C4 #endif /* D_BG_D_BG_S_ACCH_H */ \ No newline at end of file diff --git a/include/d/d_bg_s_chk.h b/include/d/d_bg_s_chk.h index bfeb5b42c..3f83ded01 100644 --- a/include/d/d_bg_s_chk.h +++ b/include/d/d_bg_s_chk.h @@ -6,11 +6,11 @@ class dBgS_Chk : public dBgS_PolyPassChk, public dBgS_GrpPassChk { public: - dBgS_Chk(); - cBgS_PolyPassChk* GetPolyPassChkInfo(); - cBgS_GrpPassChk* GetGrpPassChkInfo(); + dBgS_Chk() {} + cBgS_PolyPassChk* GetPolyPassChkInfo() { return (cBgS_PolyPassChk*)this; } + cBgS_GrpPassChk* GetGrpPassChkInfo() { return (cBgS_GrpPassChk*)this; } - virtual ~dBgS_Chk(); + virtual ~dBgS_Chk() {} }; // Size: 0x14 STATIC_ASSERT(sizeof(dBgS_Chk) == 0x14); diff --git a/include/d/d_bg_s_gnd_chk.h b/include/d/d_bg_s_gnd_chk.h index 2123482d9..a669d6c9e 100644 --- a/include/d/d_bg_s_gnd_chk.h +++ b/include/d/d_bg_s_gnd_chk.h @@ -6,8 +6,11 @@ class dBgS_GndChk : public cBgS_GndChk, public dBgS_Chk { public: - /* 8007757C */ dBgS_GndChk(); - /* 800775F0 */ virtual ~dBgS_GndChk(); + /* 8007757C */ dBgS_GndChk() { + this->SetPolyPassChk(this->GetPolyPassChkInfo()); + this->SetGrpPassChk(this->GetGrpPassChkInfo()); + } + /* 800775F0 */ virtual ~dBgS_GndChk() {} }; // Size: 0x54 STATIC_ASSERT(sizeof(dBgS_GndChk) == 0x54); @@ -22,7 +25,7 @@ class dBgS_ObjGndChk : public dBgS_GndChk { public: dBgS_ObjGndChk() { SetObj(); } - /* 8001E020 */ virtual ~dBgS_ObjGndChk(); + /* 8001E020 */ virtual ~dBgS_ObjGndChk() {} }; class dBgS_ObjGndChk_Wtr : public dBgS_ObjGndChk { @@ -41,9 +44,9 @@ public: class dBgS_ObjGndChk_All : public dBgS_ObjGndChk { public: - /* 800778E8 */ virtual ~dBgS_ObjGndChk_All(); + /* 800778E8 */ virtual ~dBgS_ObjGndChk_All() {} - dBgS_ObjGndChk_All() { /* OnAll(); */ } + dBgS_ObjGndChk_All() { OnAll(); } }; class dBgS_CamGndChk : public dBgS_GndChk { diff --git a/include/d/d_bg_s_grp_pass_chk.h b/include/d/d_bg_s_grp_pass_chk.h index e107c08b1..54e695478 100644 --- a/include/d/d_bg_s_grp_pass_chk.h +++ b/include/d/d_bg_s_grp_pass_chk.h @@ -7,13 +7,13 @@ class dBgS_GrpPassChk : public cBgS_GrpPassChk { public: enum { /* 0x1 */ NORMAL_GRP = 1, - /* 0x2 */ WATER_GRP, - /* 0x3 */ FULL_GRP + /* 0x2 */ WATER_GRP = 2, + /* 0x3 */ FULL_GRP = NORMAL_GRP | WATER_GRP | 4 | 8, }; - /* 80077BA0 */ dBgS_GrpPassChk(); + /* 80077BA0 */ dBgS_GrpPassChk() { mGrp = NORMAL_GRP; } - /* 80077BC4 */ virtual ~dBgS_GrpPassChk(); + /* 80077BC4 */ virtual ~dBgS_GrpPassChk() {} void OnWaterGrp() { mGrp |= WATER_GRP; } void OnSpl() { mGrp |= WATER_GRP; } diff --git a/include/d/d_bg_s_poly_pass_chk.h b/include/d/d_bg_s_poly_pass_chk.h index 5bdc743ad..b8135a719 100644 --- a/include/d/d_bg_s_poly_pass_chk.h +++ b/include/d/d_bg_s_poly_pass_chk.h @@ -5,7 +5,7 @@ class cBgS_PolyPassChk { public: - virtual ~cBgS_PolyPassChk(); + virtual ~cBgS_PolyPassChk() {} /* 0x4 */ u8 mbObjThrough; /* 0x5 */ u8 mbCamThrough; @@ -18,8 +18,16 @@ public: class dBgS_PolyPassChk : public cBgS_PolyPassChk { public: - dBgS_PolyPassChk(); - virtual ~dBgS_PolyPassChk(); + dBgS_PolyPassChk() { + mbObjThrough = 0; + mbCamThrough = 0; + mbLinkThrough = 0; + mbArrowsAndLightThrough = 0; + mbBombThrough = 0; + mbBoomerangThrough = 0; + mbHookshotThrough = 0; + } + virtual ~dBgS_PolyPassChk() {} void SetObj() { mbObjThrough = 1; } }; From 246274d24a62c234e687039d50b8c4cf8bc9d88d Mon Sep 17 00:00:00 2001 From: Dylan Ascencio Date: Sat, 16 Sep 2023 19:56:31 -0400 Subject: [PATCH 2/2] Add dEvt and dNpc enums (#45) * Small but important fix for m_DoExt_McaMorf * Better fix for m_DoExt_McaMorf lol * Work on d_a_mozo * Add dEvt_Command_e, dEvt_Condition_e, and dNpc_MessageStatus_e; also implement those 3 in d_a_obj_paper. * 100% match d_a_disappear * Remove nonmatching comments from d_a_disappear * Clean up d_a_mozo slightly --- configure.py | 2 +- include/d/d_com_inf_game.h | 5 + include/d/d_npc.h | 18 ++ include/f_op/f_op_actor.h | 18 ++ include/f_op/f_op_actor_mng.h | 6 +- src/d/actor/d_a_disappear.cpp | 139 +++++++++++-- src/d/actor/d_a_mozo.cpp | 367 ++++++++++++++++++++-------------- src/d/actor/d_a_obj_paper.cpp | 30 +-- 8 files changed, 411 insertions(+), 174 deletions(-) create mode 100644 include/d/d_npc.h diff --git a/configure.py b/configure.py index 46395c26a..775a07def 100644 --- a/configure.py +++ b/configure.py @@ -413,7 +413,7 @@ config.libs = [ Object(NonMatching, "d/actor/d_a_boomerang.cpp"), Object(NonMatching, "d/actor/d_a_dai_item.cpp"), Object(NonMatching, "d/actor/d_a_demo00.cpp"), - Object(NonMatching, "d/actor/d_a_disappear.cpp"), + Object(Matching, "d/actor/d_a_disappear.cpp"), Object(NonMatching, "d/actor/d_a_esa.cpp"), Object(NonMatching, "d/actor/d_a_grid.cpp"), Object(NonMatching, "d/actor/d_a_himo2.cpp"), diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 5cb4580df..fd9d354b1 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -838,6 +838,11 @@ inline JPABaseEmitter* dComIfGp_particle_set(u16 particleID, const cXyz* pos, co return dComIfGp_particle_set(particleID, pos, angle, scale, 0xFF, NULL, -1, NULL, NULL, NULL); } +inline void dComIfGp_particle_setStripes(u16 particleID, cXyz* pos, csXyz* angle, cXyz* scale, u8 param_4, u16 param_5) { + dPa_control_c* pParticle = g_dComIfG_gameInfo.play.getParticle(); + pParticle->setNormalStripes(particleID, pos, angle, scale, param_4, param_5); +} + inline void dComIfGp_particle_calc3D() { g_dComIfG_gameInfo.play.getParticle()->calc3D(); } diff --git a/include/d/d_npc.h b/include/d/d_npc.h new file mode 100644 index 000000000..80a876d4b --- /dev/null +++ b/include/d/d_npc.h @@ -0,0 +1,18 @@ +#ifndef D_NPC_H +#define D_NPC_H + +enum dNpc_MessageStatus_e { + dNpcMsgStts_MSG_PREPARING_e = 0x01, + dNpcMsgStts_BOX_OPENING_e = 0x02, + dNpcMsgStts_MSG_TYPING_e = 0x06, + dNpcMsgStts_MSG_DISPLAYED_e = 0x0E, + + dNpcMsgStts_MSG_CONTINUES_e = 0x0F, + dNpcMsgStts_MSG_ENDS_e = 0x10, + + dNpcMsgStts_BOX_CLOSING_e = 0x11, + dNpcMsgStts_BOX_CLOSED_e = 0x12, + dNpcMsgStts_MSG_DESTROYED_e = 0x13, +}; + +#endif // D_NPC_H diff --git a/include/f_op/f_op_actor.h b/include/f_op/f_op_actor.h index 05a15eb1c..d45434424 100644 --- a/include/f_op/f_op_actor.h +++ b/include/f_op/f_op_actor.h @@ -88,6 +88,24 @@ struct actor_process_profile_definition2 { class JKRSolidHeap; +enum dEvt_Command_e { + dEvtCmd_NONE_e, + dEvtCmd_INTALK_e, + dEvtCmd_INDEMO_e, + dEvtCmd_INDOOR_e, + dEvtCmd_INGETITEM_e, + dEvtCmd_DUMMY = 0xFFFF, +}; + +enum dEvt_Condition_e { + dEvtCnd_NONE_e = 0x0000, + dEvtCnd_CANTALK_e = 0x0001, + dEvtCnd_CANDOOR_e = 0x0004, + dEvtCnd_CANGETITEM_e = 0x0008, + dEvtCnd_CANTALKITEM_e = 0x0020, + dEvtCnd_DUMMY = 0x8000, +}; + class dEvt_info_c { public: dEvt_info_c(); diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 4e6e70547..afe880c70 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -449,6 +449,8 @@ s32 fopAcM_createItemFromTable(cXyz* p_pos, int i_tableNo, int i_itemBitNo, int csXyz* p_angle, int param_5, cXyz * p_scale, f32* speedF, f32* speedY, bool createDirect); +s32 fopAcM_createIball(cXyz*, int, int, csXyz*, int); + s32 fopAcM_createDemoItem(cXyz* p_pos, int itemNo, int itemBitNo, csXyz* p_angle, int roomNo, cXyz* scale, u8 param_7); @@ -466,8 +468,8 @@ void* fopAcM_createItemForSimpleDemo(cXyz* p_pos, int i_itemNo, int i_roomNo, csXyz* p_angle, cXyz* p_scale, f32 speedF, f32 speedY); -s32 fopAcM_createItem(cXyz* p_pos, int itemNo, int param_3, int roomNo, csXyz* p_angle, - cXyz* p_scale, int param_7); +s32 fopAcM_createItem(cXyz* p_pos, int itemNo, int param_3, int roomNo, int param_4, csXyz* p_angle, + int param_7, cXyz* p_scale); void* fopAcM_fastCreateItem2(cXyz* p_pos, int itemNo, int param_3, int roomNo, int param_5, csXyz* p_angle, cXyz* p_scale); diff --git a/src/d/actor/d_a_disappear.cpp b/src/d/actor/d_a_disappear.cpp index ab4249210..0ed011b7a 100644 --- a/src/d/actor/d_a_disappear.cpp +++ b/src/d/actor/d_a_disappear.cpp @@ -3,36 +3,149 @@ // Translation Unit: d_a_disappear.cpp // -#include "d_a_disappear.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "f_op/f_op_actor.h" +#include "f_op/f_op_actor_mng.h" +#include "d/d_procname.h" +#include "d/d_com_inf_game.h" +#include "d/d_s_play.h" +#include "m_Do/m_Do_ext.h" #include "dolphin/types.h" + +extern dScnPly_reg_HIO_c g_regHIO; + +class disappear_class : public fopAc_ac_c { +public: + int m0000; + int m0004; + s32 mSwitchId; + s16 mTimer; +}; + /* 800E79C0-800E79C8 .text daDisappear_Draw__FP15disappear_class */ -void daDisappear_Draw(disappear_class*) { - /* Nonmatching */ +s32 daDisappear_Draw(disappear_class*) { + return TRUE; } /* 800E79C8-800E7AC0 .text daDisappear_Execute__FP15disappear_class */ -void daDisappear_Execute(disappear_class*) { - /* Nonmatching */ +s32 daDisappear_Execute(disappear_class* i_this) { + if (i_this->mTimer != 0) { + i_this->mTimer--; + + if (i_this->mTimer == 0) { + s8 health = i_this->mHealth; + + if (health != 1 && health != 3) { + if (health == 2) { + fopAcM_createItemForBoss(i_this->getPositionP(), 0, i_this->getRoomNo(), &i_this->current.angle, NULL, 0); + } + else if (health >= 0x0A && health <= 0x0D) { + if (health < 0x0D) { + static u32 ki_item_d[] = { + 0, 10, 16 + }; + + fopAcM_createItem(i_this->getPositionP(), ki_item_d[health - 0xA], -1, -1, 0, NULL, 4, NULL); + } + } + else { + fopAcM_createIball(i_this->getPositionP(), i_this->mItemTableIdx, i_this->getRoomNo(), &i_this->current.angle, i_this->mSwitchId); + } + } + } + } + else { + fopAcM_delete(i_this); + } + + return TRUE; } /* 800E7AC0-800E7AC8 .text daDisappear_IsDelete__FP15disappear_class */ -void daDisappear_IsDelete(disappear_class*) { - /* Nonmatching */ +s32 daDisappear_IsDelete(disappear_class*) { + return TRUE; } /* 800E7AC8-800E7AD0 .text daDisappear_Delete__FP15disappear_class */ -void daDisappear_Delete(disappear_class*) { - /* Nonmatching */ +s32 daDisappear_Delete(disappear_class*) { + return TRUE; } /* 800E7AD0-800E7DBC .text set_disappear__FP15disappear_classf */ -void set_disappear(disappear_class*, float) { - /* Nonmatching */ +void set_disappear(disappear_class* i_this, float scale) { + s8 rev = dComIfGp_getReverb(i_this->getRoomNo()); + mDoAud_seStart(0x5801, &i_this->mEyePos, 0, rev); + + cXyz particleScale(scale, scale, scale); + i_this->mTimer = g_regHIO.mChild[8].mShortRegs[0] + 0x3A; + + switch (i_this->mHealth) { + case 0: + case 2: + case 10: + case 0xB: + case 0xC: + case 0xD: + dComIfGp_particle_set(0x14, &i_this->current.pos, 0, &particleScale, 0xFF, 0, -1, 0, 0, 0); + case 3: + dComIfGp_particle_set(0x13, &i_this->current.pos, 0, &particleScale, 0xff, 0, -1, 0, 0, 0); + dComIfGp_particle_setStripes(0x15, &i_this->current.pos, 0, &particleScale, 0xFF, 0x96); + dComIfGp_particle_set(0x16, &i_this->current.pos, 0, &particleScale, 0xff, 0, -1, 0, 0, 0); + break; + case 1: + dComIfGp_particle_set(0x13, &i_this->current.pos, 0, &particleScale, 0xff, 0, -1, 0, 0, 0); + dComIfGp_particle_set(0x16, &i_this->current.pos, 0, &particleScale, 0xff, 0, -1, 0, 0, 0); + break; + case 4: + dComIfGp_particle_set(0x043C, &i_this->current.pos, 0, 0, 0xff, 0, -1, 0, 0, 0); + dComIfGp_particle_set(0x043D, &i_this->current.pos, 0, 0, 0xff, 0, -1, 0, 0, 0); + dComIfGp_particle_set(0x043E, &i_this->current.pos, 0, 0, 0xff, 0, -1, 0, 0, 0); + break; + } } /* 800E7DBC-800E7E60 .text daDisappear_Create__FP10fopAc_ac_c */ -void daDisappear_Create(fopAc_ac_c*) { - /* Nonmatching */ +s32 daDisappear_Create(fopAc_ac_c* i_this) { + disappear_class* dis = static_cast(i_this); + + fopAcM_SetupActor(dis, disappear_class); + + u32 params = dis->mBase.mParameters; + + dis->mHealth = dis->mBase.mParameters & 0xFF; + float scale = ((dis->mBase.mParameters >> 8) & 0xFF) * 0.1f; + + dis->mSwitchId = (dis->mBase.mParameters >> 0x10) & 0xFF; + if (dis->mSwitchId == 0xFF) { + dis->mSwitchId = -1; + } + + set_disappear(dis, scale); + return cPhs_COMPLEATE_e; } +actor_method_class l_daDisappear_Method = { + (process_method_func)daDisappear_Create, + (process_method_func)daDisappear_Delete, + (process_method_func)daDisappear_Execute, + (process_method_func)daDisappear_IsDelete, + (process_method_func)daDisappear_Draw, +}; + +extern actor_process_profile_definition g_profile_DISAPPEAR = { + fpcLy_CURRENT_e, + 7, + fpcLy_CURRENT_e, + PROC_DISAPPEAR, + &g_fpcLf_Method.mBase, + sizeof(disappear_class), + 0, + 0, + &g_fopAc_Method.base, + 0x0188, + &l_daDisappear_Method, + 0x00044000, + fopAc_ACTOR_e, + fopAc_CULLBOX_0_e, +}; diff --git a/src/d/actor/d_a_mozo.cpp b/src/d/actor/d_a_mozo.cpp index 56d94259c..4651ca59b 100644 --- a/src/d/actor/d_a_mozo.cpp +++ b/src/d/actor/d_a_mozo.cpp @@ -3,9 +3,84 @@ // Translation Unit: d_a_mozo.cpp // -#include "d_a_mozo.h" +#include "f_op/f_op_actor_mng.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "d/d_com_inf_game.h" +#include "d/d_kankyo.h" +#include "d/d_procname.h" +#include "d/d_cc_d.h" +#include "m_do/m_Do_mtx.h" +#include "m_Do/m_Do_ext.h" #include "dolphin/types.h" + +/*** HIO ***/ +class daMozo_HIO_c { +public: + daMozo_HIO_c(); + ~daMozo_HIO_c(); +}; + +static daMozo_HIO_c l_HIO; + +class daMozo_childHIO_c { +public: + ~daMozo_childHIO_c(); +}; + +class daMozo_FireChildHIO_c { +public: + ~daMozo_FireChildHIO_c(); +}; + +class daMozo_BeamChildHIO_c { +public: + ~daMozo_BeamChildHIO_c(); +}; + +/*** Actor ***/ +class daMozo_c : public fopAc_ac_c { +public: + s32 _create(); + bool _delete(); + bool _draw(); + bool _execute(); + void anime_proc(); + void checkRange(int); + s32 CreateHeap(); + s32 CreateInit(); + void event_move(); + void getBeamActor(u32); + void search_beam_proc(); + void search_beam_proc_init(); + void search_fire_proc(); + void search_fire_proc_init(); + void set_mtx(); + void setAnm(int, float); + void towait_proc(); + void towait_proc_init(); + void wait_proc(); + void wait_proc_init(); + + typedef void(daMozo_c::*proc_t)(void); + proc_t mCurrentProc; + request_of_phase_process_class mPhs; + + mDoExt_McaMorf* mAnimMorf; + + mDoExt_brkAnm mBrkAnm; + J3DAnmTevRegKey* m_brk; + + mDoExt_btkAnm mBtkAnm; + J3DAnmTextureSRTKey* m_btk; + + // TODO: insert missing members + + dCcD_Stts mColStatus; + dCcD_Cps mCapsuleCol; +}; + /* 000000EC-000001D0 .text __ct__12daMozo_HIO_cFv */ daMozo_HIO_c::daMozo_HIO_c() { /* Nonmatching */ @@ -42,18 +117,53 @@ void daMozo_nodeCallBack(J3DNode*, int) { } /* 0000078C-000007AC .text CheckCreateHeap__FP10fopAc_ac_c */ -void CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +s32 CheckCreateHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->CreateHeap(); } /* 000007AC-00000A24 .text CreateHeap__8daMozo_cFv */ -void daMozo_c::CreateHeap() { +s32 daMozo_c::CreateHeap() { /* Nonmatching */ + J3DModelData* mdlData = (J3DModelData*)dComIfG_getObjectRes("Mozo", 9); + + mDoExt_McaMorf* newMorf = new mDoExt_McaMorf( + mdlData, + 0, + 0, + static_cast(dComIfG_getObjectRes("Mozo", 6)), + 2, + 1.0f, + 0, + -1, + 0, + 0, + 0, + 0x11020203 + ); + + mAnimMorf = newMorf; + + m_brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes("Mozo", 0x0C); + JUT_ASSERT(0x16A, m_brk != 0); + + m_btk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("Mozo", 0x0F); + JUT_ASSERT(0x16D, m_btk != 0); + + int brkInitResult = mBrkAnm.init(mdlData, m_brk, true, 0, 1.0f, 0, -1, false, 0); + int btkInitResult = mBtkAnm.init(mdlData, m_btk, true, 0, 1.0f, 0, -1, false, 0); + + return mdlData != 0 && mAnimMorf != 0 && mAnimMorf->getModel() != 0 && brkInitResult != 0 && btkInitResult != 0; } /* 00000A24-00000AAC .text set_mtx__8daMozo_cFv */ void daMozo_c::set_mtx() { - /* Nonmatching */ + J3DModel* mdl = mAnimMorf->getModel(); + mdl->setBaseScale(mScale); + + mDoMtx_stack_c::transS(getPosition()); + mDoMtx_stack_c::YrotM(getAngle().y); + + mdl->i_setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000AAC-00000C38 .text anime_proc__8daMozo_cFv */ @@ -112,22 +222,73 @@ void daMozo_c::setAnm(int, float) { } /* 00001F70-00002228 .text CreateInit__8daMozo_cFv */ -void daMozo_c::CreateInit() { +s32 daMozo_c::CreateInit() { /* Nonmatching */ + J3DModelData* mdlData = mAnimMorf->getModel()->getModelData(); + + int param = mBase.mParameters * 0xFF; + if (param == 0xFF) { + param = 0; + } + + int a = 2; + if (param < 3) { + a = param; + } + + // TODO: insert missing assignment here + + mAnimMorf->getModel()->setUserArea(this); + for (int i = 0; i < mdlData->getJointNum(); i++) { + if (i == 2) { + mdlData->getJointNodePointer(2)->setCallBack((J3DNodeCallBack)daMozo_nodeCallBack); + } + } + + // TODO: find out where d_lib::ZeroQuat lives + //mQuatRotation = ZeroQuat; + + fopAcM_setCullSizeBox(this, -1000.f, -1000.f, -1000.f, 1000.0f, 1000.0f, 1000.0f); + mCullMtx = mAnimMorf->getModel()->getBaseTRMtx(); + + // TODO: Insert missing code here + + set_mtx(); + mAnimMorf->calc(); + wait_proc_init(); + + return cPhs_COMPLEATE_e; } /* 00002228-000023B0 .text _create__8daMozo_cFv */ -void daMozo_c::_create() { +s32 daMozo_c::_create() { /* Nonmatching */ + fopAcM_SetupActor(this, daMozo_c); + + s32 result = dComIfG_resLoad(&mPhs, "Mozo"); + + if (result == cPhs_COMPLEATE_e) { + s32 solidHeapResult = fopAcM_entrySolidHeap(this, (heapCallbackFunc)CheckCreateHeap, 0x1AA0); + + if (solidHeapResult & 0xFF == 0) { + result = cPhs_ERROR_e; + } + else { + result = CreateInit(); + _execute(); + } + } + + return result; } /* 000023B0-0000242C .text _delete__8daMozo_cFv */ -void daMozo_c::_delete() { +bool daMozo_c::_delete() { /* Nonmatching */ } /* 0000242C-00002498 .text getBeamActor__8daMozo_cFUi */ -void daMozo_c::getBeamActor(unsigned int) { +void daMozo_c::getBeamActor(u32) { /* Nonmatching */ } @@ -137,38 +298,53 @@ void daMozo_c::event_move() { } /* 00002588-000025DC .text _execute__8daMozo_cFv */ -void daMozo_c::_execute() { - /* Nonmatching */ +bool daMozo_c::_execute() { + mAnimMorf->calc(); + + (this->*mCurrentProc)(); + event_move(); + set_mtx(); + + return true; } /* 000025DC-0000267C .text _draw__8daMozo_cFv */ -void daMozo_c::_draw() { +bool daMozo_c::_draw() { /* Nonmatching */ + J3DModelData* mdlData = mAnimMorf->getModel()->getModelData(); + g_env_light.settingTevStruct(TEV_TYPE_BG0, getPositionP(), &mTevStr); + g_env_light.setLightTevColorType(mAnimMorf->getModel(), &mTevStr); + + mBrkAnm.entry(mdlData); + mBtkAnm.entry(mdlData); + mAnimMorf->entryDL(); + + return true; } /* 0000267C-000026A0 .text daMozo_Draw__FP8daMozo_c */ -void daMozo_Draw(daMozo_c*) { - /* Nonmatching */ +s32 daMozo_Draw(daMozo_c* i_this) { + return i_this->_draw(); } /* 000026A0-000026C4 .text daMozo_Execute__FP8daMozo_c */ -void daMozo_Execute(daMozo_c*) { - /* Nonmatching */ +s32 daMozo_Execute(daMozo_c* i_this) { + return i_this->_execute(); } /* 000026C4-000026CC .text daMozo_IsDelete__FP8daMozo_c */ -void daMozo_IsDelete(daMozo_c*) { - /* Nonmatching */ +s32 daMozo_IsDelete(daMozo_c*) { + return TRUE; } /* 000026CC-000026F0 .text daMozo_Delete__FP8daMozo_c */ -void daMozo_Delete(daMozo_c*) { - /* Nonmatching */ +s32 daMozo_Delete(daMozo_c* i_this) { + return i_this->_delete(); } /* 000026F0-00002710 .text daMozo_Create__FP10fopAc_ac_c */ -void daMozo_Create(fopAc_ac_c*) { - /* Nonmatching */ +s32 daMozo_Create(fopAc_ac_c* i_this) { + return static_cast(i_this)->_create(); } /* 00002710-000027AC .text __dt__12daMozo_HIO_cFv */ @@ -176,128 +352,27 @@ daMozo_HIO_c::~daMozo_HIO_c() { /* Nonmatching */ } -/* 000027E8-000027F0 .text @280@__dt__8dCcD_CpsFv */ -void @280@__dt__8dCcD_CpsFv { - /* Nonmatching */ -} - -/* 000027F0-000027F8 .text @248@__dt__8dCcD_CpsFv */ -void @248@__dt__8dCcD_CpsFv { - /* Nonmatching */ -} - -/* 000027F8-00002834 .text __dt__4cXyzFv */ -cXyz::~cXyz() { - /* Nonmatching */ -} - -/* 00002834-00002914 .text __dt__8dCcD_CpsFv */ -dCcD_Cps::~dCcD_Cps() { - /* Nonmatching */ -} - -/* 00002914-00002924 .text GetShapeAttr__8dCcD_CpsFv */ -void dCcD_Cps::GetShapeAttr() { - /* Nonmatching */ -} - -/* 00002924-00002980 .text __dt__14cCcD_ShapeAttrFv */ -cCcD_ShapeAttr::~cCcD_ShapeAttr() { - /* Nonmatching */ -} - -/* 00002980-00002988 .text CrossAtTg__12cCcD_CpsAttrCFRC12cCcD_AabAttrP4cXyz */ -void cCcD_CpsAttr::CrossAtTg(const cCcD_AabAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00002988-00002990 .text CrossAtTg__12cCcD_CpsAttrCFRC12cCcD_PntAttrP4cXyz */ -void cCcD_CpsAttr::CrossAtTg(const cCcD_PntAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00002990-000029C8 .text CrossAtTg__12cCcD_CpsAttrCFRC14cCcD_ShapeAttrP4cXyz */ -void cCcD_CpsAttr::CrossAtTg(const cCcD_ShapeAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 000029C8-000029D0 .text CrossCo__12cCcD_CpsAttrCFRC12cCcD_AabAttrPf */ -void cCcD_CpsAttr::CrossCo(const cCcD_AabAttr&, float*) const { - /* Nonmatching */ -} - -/* 000029D0-000029D8 .text CrossCo__12cCcD_CpsAttrCFRC12cCcD_TriAttrPf */ -void cCcD_CpsAttr::CrossCo(const cCcD_TriAttr&, float*) const { - /* Nonmatching */ -} - -/* 000029D8-000029E0 .text CrossCo__12cCcD_CpsAttrCFRC12cCcD_PntAttrPf */ -void cCcD_CpsAttr::CrossCo(const cCcD_PntAttr&, float*) const { - /* Nonmatching */ -} - -/* 000029E0-00002A18 .text CrossCo__12cCcD_CpsAttrCFRC14cCcD_ShapeAttrPf */ -void cCcD_CpsAttr::CrossCo(const cCcD_ShapeAttr&, float*) const { - /* Nonmatching */ -} - -/* 00002A18-00002A24 .text GetCoCP__14cCcD_ShapeAttrFv */ -void cCcD_ShapeAttr::GetCoCP() { - /* Nonmatching */ -} - -/* 00002A24-00002A30 .text GetCoCP__14cCcD_ShapeAttrCFv */ -void cCcD_ShapeAttr::GetCoCP() const { - /* Nonmatching */ -} - -/* 00002A30-00002A34 .text GetGObjInf__12cCcD_GObjInfCFv */ -void cCcD_GObjInf::GetGObjInf() const { - /* Nonmatching */ -} - -/* 00002A34-00002A3C .text GetShapeAttr__8cCcD_ObjCFv */ -void cCcD_Obj::GetShapeAttr() const { - /* Nonmatching */ -} - -/* 00002A3C-00002A44 .text CrossAtTg__14cCcD_ShapeAttrCFRC14cCcD_ShapeAttrP4cXyz */ -void cCcD_ShapeAttr::CrossAtTg(const cCcD_ShapeAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00002A44-00002A4C .text CrossCo__14cCcD_ShapeAttrCFRC14cCcD_ShapeAttrPf */ -void cCcD_ShapeAttr::CrossCo(const cCcD_ShapeAttr&, float*) const { - /* Nonmatching */ -} - -/* 00002A4C-00002AA8 .text __dt__8cM3dGCpsFv */ -cM3dGCps::~cM3dGCps() { - /* Nonmatching */ -} - -/* 00002AA8-00002AF0 .text __dt__8cM3dGLinFv */ -cM3dGLin::~cM3dGLin() { - /* Nonmatching */ -} - -/* 00002AF0-00002B38 .text __dt__8cM3dGAabFv */ -cM3dGAab::~cM3dGAab() { - /* Nonmatching */ -} - -/* 00002B38-00002B94 .text __dt__13mDoExt_btkAnmFv */ -mDoExt_btkAnm::~mDoExt_btkAnm() { - /* Nonmatching */ -} - -/* 00002B94-00002BF0 .text __dt__13mDoExt_brkAnmFv */ -mDoExt_brkAnm::~mDoExt_brkAnm() { - /* Nonmatching */ -} - -/* 00002BF0-00002C38 .text __dt__14mDoExt_baseAnmFv */ -mDoExt_baseAnm::~mDoExt_baseAnm() { - /* Nonmatching */ -} +static actor_method_class l_daMozo_Method = { + (process_method_func)daMozo_Create, + (process_method_func)daMozo_Delete, + (process_method_func)daMozo_Execute, + (process_method_func)daMozo_IsDelete, + (process_method_func)daMozo_Draw, +}; +extern actor_process_profile_definition g_profile_MOZO = { + fpcLy_CURRENT_e, + 7, + fpcPi_CURRENT_e, + PROC_MOZO, + &g_fpcLf_Method.mBase, + sizeof(daMozo_c), + 0, + 0, + &g_fopAc_Method.base, + 0x00D1, + &l_daMozo_Method, + 0x00040100, + fopAc_ACTOR_e, + fopAc_CULLBOX_CUSTOM_e, +}; diff --git a/src/d/actor/d_a_obj_paper.cpp b/src/d/actor/d_a_obj_paper.cpp index 8d653ce80..8c39962ba 100644 --- a/src/d/actor/d_a_obj_paper.cpp +++ b/src/d/actor/d_a_obj_paper.cpp @@ -14,6 +14,7 @@ #include "d/d_com_inf_game.h" #include "d/d_kankyo.h" #include "d/d_a_obj.h" +#include "d/d_npc.h" #include "m_Do/m_Do_ext.h" #include "m_Do/m_Do_mtx.h" #include "dolphin/types.h" @@ -54,8 +55,6 @@ namespace daObjPaper { inline static int getEntryModelId(int idx) { return L_attr[idx].getModelId(); } } - static cXyz a(1.0f, 1.0f, 1.0f); - static const dCcD_SrcCyl M_cyl_src = { 0, 0, @@ -84,6 +83,13 @@ namespace daObjPaper { 0.0f, // Height }; + enum Act_Mode_e { + ActMode_WAIT_e, + ActMode_TALKBEGIN_e, + ActMode_GETMSG_e, + ActMode_TALKWAIT_e, + }; + class Act_c : public fopAc_ac_c { public: static int solidHeapCB(fopAc_ac_c*); @@ -220,25 +226,25 @@ namespace daObjPaper { /* 00000730-00000748 .text mode_wait_init__Q210daObjPaper5Act_cFv */ void daObjPaper::Act_c::mode_wait_init() { - mStatus |= 0x80; - mMode = 0; + mStatus |= fopAcStts_NOEXEC_e; + mMode = ActMode_WAIT_e; } /* 00000748-00000784 .text mode_wait__Q210daObjPaper5Act_cFv */ void daObjPaper::Act_c::mode_wait() { - if (mEvtInfo.mCommand == 1) { + if (mEvtInfo.mCommand == dEvtCmd_INTALK_e) { mode_talk0_init(); } else { - mEvtInfo.mCondition |= 1; + mEvtInfo.mCondition |= dEvtCnd_CANTALK_e; } } /* 00000784-000007A4 .text mode_talk0_init__Q210daObjPaper5Act_cFv */ void daObjPaper::Act_c::mode_talk0_init() { - mStatus &= ~0x80; + mStatus &= ~fopAcStts_NOEXEC_e; mMsgId = -1; - mMode = 1; + mMode = ActMode_TALKBEGIN_e; } /* 000007A4-00000820 .text mode_talk0__Q210daObjPaper5Act_cFv */ @@ -254,7 +260,7 @@ namespace daObjPaper { /* 00000820-0000082C .text mode_talk1_init__Q210daObjPaper5Act_cFv */ void daObjPaper::Act_c::mode_talk1_init() { - mMode = 2; + mMode = ActMode_GETMSG_e; } /* 0000082C-00000874 .text mode_talk1__Q210daObjPaper5Act_cFv */ @@ -267,13 +273,13 @@ namespace daObjPaper { /* 00000874-00000880 .text mode_talk2_init__Q210daObjPaper5Act_cFv */ void daObjPaper::Act_c::mode_talk2_init() { - mMode = 3; + mMode = ActMode_TALKWAIT_e; } /* 00000880-000008DC .text mode_talk2__Q210daObjPaper5Act_cFv */ void daObjPaper::Act_c::mode_talk2() { - if (mpMsg->mMode == 0x12) { - mpMsg->mMode = 0x13; + if (mpMsg->mMode == dNpcMsgStts_BOX_CLOSED_e) { + mpMsg->mMode = dNpcMsgStts_MSG_DESTROYED_e; mpMsg = 0; mMsgId = -1;