From e806b15578cbcdb3340d191ab7ec6ce0274df833 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sun, 17 Sep 2023 14:58:28 -0400 Subject: [PATCH] d_a_nh 75% done (#49) * d_a_nh 75% done * More nh actions --- .../JSystem/J3DGraphAnimator/J3DJointTree.h | 3 + include/JSystem/J3DGraphAnimator/J3DModel.h | 3 +- .../JSystem/J3DGraphAnimator/J3DModelData.h | 1 + include/SSystem/SComponent/c_bg_s_poly_info.h | 4 +- include/SSystem/SComponent/c_lib.h | 4 +- include/SSystem/SComponent/c_m3d_g_cir.h | 2 +- include/d/d_com_inf_game.h | 4 + include/d/d_drawlist.h | 11 +- include/f_op/f_op_actor.h | 6 +- include/f_pc/f_pc_base.h | 2 +- include/m_Do/m_Do_ext.h | 16 +- include/m_Do/m_Do_hostIO.h | 9 + src/d/actor/d_a_branch.cpp | 2 +- src/d/actor/d_a_kaji.cpp | 13 +- src/d/actor/d_a_mozo.cpp | 2 +- src/d/actor/d_a_nh.cpp | 488 ++++++++++++++++-- src/d/actor/d_a_obj_Ygush00.cpp | 2 +- src/d/actor/d_a_obj_movebox.cpp | 2 +- src/d/actor/d_a_obj_paper.cpp | 2 +- src/d/d_npc.cpp | 2 +- src/m_Do/m_Do_ext.cpp | 16 +- 21 files changed, 497 insertions(+), 97 deletions(-) diff --git a/include/JSystem/J3DGraphAnimator/J3DJointTree.h b/include/JSystem/J3DGraphAnimator/J3DJointTree.h index 9d5d3c3d3..af85bbd5c 100644 --- a/include/JSystem/J3DGraphAnimator/J3DJointTree.h +++ b/include/JSystem/J3DGraphAnimator/J3DJointTree.h @@ -3,6 +3,7 @@ #include "JSystem/J3DGraphAnimator/J3DJoint.h" #include "dolphin/types.h" +#include "global.h" class JUTNameTab; @@ -70,4 +71,6 @@ private: /* 0x44 */ JUTNameTab* mJointName; }; // Size: 0x48 +STATIC_ASSERT(sizeof(J3DJointTree) == 0x48); + #endif /* J3DJOINTTREE_H */ diff --git a/include/JSystem/J3DGraphAnimator/J3DModel.h b/include/JSystem/J3DGraphAnimator/J3DModel.h index 3c31c7511..761048ed5 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModel.h +++ b/include/JSystem/J3DGraphAnimator/J3DModel.h @@ -43,7 +43,6 @@ public: entryModelData(param_0, param_1, param_2); } - void setBaseTRMtx(f32 (*)[4]); void initialize(); s32 entryModelData(J3DModelData*, u32, u32); s32 createShapePacket(J3DModelData*); @@ -79,7 +78,7 @@ public: bool isCpuSkinningOn() const { return (mFlags & J3DMdlFlag_SkinPosCpu) && (mFlags & J3DMdlFlag_SkinNrmCpu); } Mtx& getBaseTRMtx() { return mBaseTransformMtx; } - void i_setBaseTRMtx(Mtx m) { MTXCopy(m, mBaseTransformMtx); } + void setBaseTRMtx(Mtx m) { MTXCopy(m, mBaseTransformMtx); } u32 getMtxCalcMode() const { return mFlags & 0x03; } J3DVertexBuffer* getVertexBuffer() const { return (J3DVertexBuffer*)&mVertexBuffer; } J3DMatPacket* getMatPacket(u16 idx) const { return &mpMatPacket[idx]; } diff --git a/include/JSystem/J3DGraphAnimator/J3DModelData.h b/include/JSystem/J3DGraphAnimator/J3DModelData.h index 3b113258f..ce8018b1b 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModelData.h +++ b/include/JSystem/J3DGraphAnimator/J3DModelData.h @@ -6,6 +6,7 @@ #include "JSystem/J3DGraphAnimator/J3DShapeTable.h" #include "JSystem/J3DGraphBase/J3DSys.h" #include "JSystem/J3DGraphBase/J3DVertex.h" +#include "JSystem/J3DGraphBase/J3DMaterial.h" typedef struct _GXColor GXColor; class JUTNameTab; diff --git a/include/SSystem/SComponent/c_bg_s_poly_info.h b/include/SSystem/SComponent/c_bg_s_poly_info.h index 16e8c2852..d5a10a646 100644 --- a/include/SSystem/SComponent/c_bg_s_poly_info.h +++ b/include/SSystem/SComponent/c_bg_s_poly_info.h @@ -13,7 +13,9 @@ private: /* 0x08 */ unsigned int mActorId; public: - cBgS_PolyInfo() {} + cBgS_PolyInfo() { + ClearPi(); + } void ClearPi() { mPolyIndex = -1; mBgIndex = 0x100; diff --git a/include/SSystem/SComponent/c_lib.h b/include/SSystem/SComponent/c_lib.h index 883d092bc..093db9c12 100644 --- a/include/SSystem/SComponent/c_lib.h +++ b/include/SSystem/SComponent/c_lib.h @@ -2,6 +2,7 @@ #define C_LIB_H_ #include "SSystem/SComponent/c_xyz.h" +#include "SSystem/SComponent/c_math.h" #include "dolphin/mtx/mtx.h" inline bool cLib_IsZero(f32 value) { @@ -29,8 +30,7 @@ int cLib_chasePosXZ(cXyz* o_value, cXyz const& target, f32 step); int cLib_chaseAngleS(s16* o_value, s16 target, s16 step); s16 cLib_targetAngleY(cXyz* lhs, cXyz* rhs); -s16 cLib_targetAngleY(const cXyz& lhs, const cXyz& rhs); -s16 cLib_targetAngleX(const cXyz*, const cXyz*); +s16 cLib_targetAngleX(cXyz*, cXyz*); void cLib_offsetPos(cXyz* pDest, cXyz* pSrc, s16 angle, cXyz* vec); s32 cLib_distanceAngleS(s16 x, s16 y); diff --git a/include/SSystem/SComponent/c_m3d_g_cir.h b/include/SSystem/SComponent/c_m3d_g_cir.h index 222de788f..242163819 100644 --- a/include/SSystem/SComponent/c_m3d_g_cir.h +++ b/include/SSystem/SComponent/c_m3d_g_cir.h @@ -22,7 +22,7 @@ class cM3dGCir : public cM2dGCir { public: cM3dGCir(void); - virtual ~cM3dGCir(void); + virtual ~cM3dGCir(void) {} void Set(f32, f32, f32, f32); }; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index a161f2190..4af46709e 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -835,6 +835,10 @@ inline int dComIfGd_setRealShadow2(u32 id, s8 param_2, J3DModel* pModel, cXyz* p int dComIfGd_setSimpleShadow2(cXyz* i_pos, f32 param_1, f32 param_2, cBgS_PolyInfo& i_floorPoly, s16 i_angle, f32 param_5, GXTexObj* i_tex); +inline void dComIfGd_setAlphaModel(unsigned char param_0, float(*param_1)[4], unsigned char param_2) { + g_dComIfG_gameInfo.drawlist.setAlphaModel(param_0, param_1, param_2); +} + /** * === RESOURCE === */ diff --git a/include/d/d_drawlist.h b/include/d/d_drawlist.h index 3cc5aaa85..822f660bb 100644 --- a/include/d/d_drawlist.h +++ b/include/d/d_drawlist.h @@ -165,7 +165,13 @@ public: struct view_port_class; struct view_class; struct camera_class; -struct dDlst_alphaModel_c; +struct dDlst_alphaModel_c { +public: + dDlst_alphaModel_c(); + void create(int); + void set(unsigned char, float(*)[4], unsigned char); + void draw(float(*)[4]); +}; class dDlst_list_c { public: @@ -191,6 +197,9 @@ public: dKy_tevstr_c* pTevStr) { return mShadowControl.setReal2(id, param_2, pModel, pPos, param_5, param_6, pTevStr); } + void setAlphaModel(unsigned char param_0, float(*param_1)[4], unsigned char param_2) { + mpAlphaModel0->set(param_0, param_1, param_2); + } static void offWipe() { mWipe = false; } diff --git a/include/f_op/f_op_actor.h b/include/f_op/f_op_actor.h index 2325626a1..92b134fd4 100644 --- a/include/f_op/f_op_actor.h +++ b/include/f_op/f_op_actor.h @@ -164,9 +164,9 @@ struct actor_attention_types { void setFlag(u32 flags) { mFlags |= flags; } /* 0x00 */ u8 mDistances[8]; - /* 0x0C */ cXyz mPosition; - /* 0x18 */ u32 mFlags; -}; // Size = 0x1C + /* 0x08 */ cXyz mPosition; + /* 0x14 */ u32 mFlags; +}; // Size = 0x18 class dJntCol_c; diff --git a/include/f_pc/f_pc_base.h b/include/f_pc/f_pc_base.h index 8a8ec19d6..856c99a54 100644 --- a/include/f_pc/f_pc_base.h +++ b/include/f_pc/f_pc_base.h @@ -6,10 +6,10 @@ #include "f_pc/f_pc_layer_tag.h" #include "f_pc/f_pc_line_tag.h" #include "f_pc/f_pc_priority.h" +#include "f_pc/f_pc_profile.h" typedef struct create_request create_request; typedef struct process_method_class process_method_class; -typedef struct process_profile_definition process_profile_definition; typedef struct profile_method_class profile_method_class; typedef struct base_process_class { diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 48e67c59a..3aec03ece 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -18,7 +18,7 @@ public: mDoExt_baseAnm() { mpFrameCtrl = NULL; } virtual ~mDoExt_baseAnm() {} - int initPlay(s16 i_frameMax, int i_attribute, f32 i_rate, s16 i_startF, s16 i_endF); + int initPlay(s16 i_frameMax, int i_attribute, f32 i_rate, s16 i_startF, s16 i_endF, bool); int play(); J3DFrameCtrl* getFrameCtrl() { return mpFrameCtrl; } @@ -71,21 +71,19 @@ class J3DTevColorAnm; class J3DTevKColorAnm; class mDoExt_brkAnm : public mDoExt_baseAnm { public: - mDoExt_brkAnm() { mpAnm = NULL; } + mDoExt_brkAnm() { + mpCRegAnm = NULL; + mpKRegAnm = NULL; + } /* 8000D70C */ int init(J3DMaterialTable* i_matTable, J3DAnmTevRegKey* i_brk, int i_anmPlay, int i_attribute, f32 i_rate, s16 i_start, s16 i_end, bool i_modify, int i_entry); /* 8000D7A8 */ void entry(J3DMaterialTable* i_matTable, f32 i_frame); void entry(J3DModelData* i_modelData) { entry(i_modelData, getFrame()); } - void entry(J3DModelData* i_modelData, f32 i_frame) { - entry(&i_modelData->getMaterialTable(), i_frame); - } + void entry(J3DModelData* i_modelData, f32 i_frame); int init(J3DModelData* i_modelData, J3DAnmTevRegKey* i_brk, int i_anmPlay, int i_attribute, - f32 i_rate, s16 i_start, s16 i_end, bool i_modify, int i_entry) { - return init(&i_modelData->getMaterialTable(), i_brk, i_anmPlay, i_attribute, i_rate, - i_start, i_end, i_modify, i_entry); - } + f32 i_rate, s16 i_start, s16 i_end, bool i_modify, int i_entry); int remove(J3DModelData* i_modelData) { return i_modelData->removeTevRegAnimator(mpAnm); } void entryFrame() { entryFrame(getFrame()); } diff --git a/include/m_Do/m_Do_hostIO.h b/include/m_Do/m_Do_hostIO.h index ecabcf759..bec68c711 100644 --- a/include/m_Do/m_Do_hostIO.h +++ b/include/m_Do/m_Do_hostIO.h @@ -11,7 +11,9 @@ public: class JORReflexible : public JOREventListener { public: +#ifdef DEBUG virtual ~JORReflexible() {} +#endif }; class mDoHIO_child_c { @@ -44,6 +46,13 @@ public: virtual ~mDoHIO_root_c() {} void update(); + + s8 mDoHIO_createChild(const char* name, JORReflexible* hio) { + return m_subroot.createChild(name, hio); + } + void mDoHIO_deleteChild(s8 childID) { + m_subroot.deleteChild(childID); + } /* 0x0 */ mDoHIO_subRoot_c m_subroot; }; diff --git a/src/d/actor/d_a_branch.cpp b/src/d/actor/d_a_branch.cpp index f89c130e0..0a1387a5f 100644 --- a/src/d/actor/d_a_branch.cpp +++ b/src/d/actor/d_a_branch.cpp @@ -64,7 +64,7 @@ void daBranch_c::set_mtx() { mDoMtx_stack_c::transS(getPosition()); mDoMtx_stack_c::XYZrotM(getAngle().x, getAngle().y, getAngle().z); - pMdl->i_setBaseTRMtx(mDoMtx_stack_c::get()); + pMdl->setBaseTRMtx(mDoMtx_stack_c::get()); } } } diff --git a/src/d/actor/d_a_kaji.cpp b/src/d/actor/d_a_kaji.cpp index c420f407e..7def45908 100644 --- a/src/d/actor/d_a_kaji.cpp +++ b/src/d/actor/d_a_kaji.cpp @@ -52,7 +52,7 @@ BOOL daKaji_c::CreateHeap() { (J3DAnmTransformKey*)dComIfG_getObjectRes("Kaji", 0xE), // kj_wait.bck 2, 0.0f, 0, -1, 1, dComIfG_getObjectRes("Kaji", 0x8), // kj_wait.bas - 0x00080000, + 0x00080000, 0x11000002 ); @@ -94,7 +94,7 @@ BOOL daKaji_c::_execute() { cXyz* offset = &cXyz(0.0f, 740.0f, -858.0f); offset->y += g_regHIO.mChild[10].mFloatRegs[10]; offset->z += g_regHIO.mChild[10].mFloatRegs[11]; - cMtx_multVec( l_p_ship->mpModel->getBaseTRMtx(), offset, ¤t.pos); + cMtx_multVec(l_p_ship->mpModel->getBaseTRMtx(), offset, ¤t.pos); daObjPirateship::Act_c* ship = l_p_ship; shape_angle = ship->shape_angle; @@ -103,10 +103,9 @@ BOOL daKaji_c::_execute() { mpMorf->play(NULL, 0, 0); mpMorf->getModel()->setBaseScale(mScale); - PSMTXTrans(mDoMtx_stack_c::get(), current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z); - - mpMorf->getModel()->i_setBaseTRMtx(mDoMtx_stack_c::get()); + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); MTXCopy(mDoMtx_stack_c::get(), mMtx); return FALSE; @@ -143,12 +142,12 @@ static BOOL daKajiDraw(void* i_this) { } /* 00000568-00000570 .text daKajiIsDelete__FPv */ -static BOOL daKajiIsDelete(void* actor) { +static BOOL daKajiIsDelete(void* i_this) { return TRUE; } static actor_method_class daKajiMethodTable = { - (process_method_func)daKajiCreate, + (process_method_func)daKajiCreate, (process_method_func)daKajiDelete, (process_method_func)daKajiExecute, (process_method_func)daKajiIsDelete, diff --git a/src/d/actor/d_a_mozo.cpp b/src/d/actor/d_a_mozo.cpp index 4651ca59b..fd256d8e7 100644 --- a/src/d/actor/d_a_mozo.cpp +++ b/src/d/actor/d_a_mozo.cpp @@ -163,7 +163,7 @@ void daMozo_c::set_mtx() { mDoMtx_stack_c::transS(getPosition()); mDoMtx_stack_c::YrotM(getAngle().y); - mdl->i_setBaseTRMtx(mDoMtx_stack_c::get()); + mdl->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000AAC-00000C38 .text anime_proc__8daMozo_cFv */ diff --git a/src/d/actor/d_a_nh.cpp b/src/d/actor/d_a_nh.cpp index 141af2275..39380e97e 100644 --- a/src/d/actor/d_a_nh.cpp +++ b/src/d/actor/d_a_nh.cpp @@ -3,42 +3,266 @@ // Translation Unit: d_a_nh.cpp // -#include "d_a_nh.h" -#include "dolphin/types.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "f_op/f_op_actor_mng.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "d/d_cc_d.h" +#include "d/d_bg_s_acch.h" +#include "d/d_bg_s_gnd_chk.h" +#include "m_Do/m_Do_hostIO.h" +#include "m_Do/m_Do_mtx.h" +#include "JSystem/JUtility/JUTAssert.h" + +struct daNh_HIO_c__Registers { + /* 0x08 */ f32 field_0x08; + /* 0x0C */ f32 field_0x0c; + /* 0x10 */ f32 field_0x10; + /* 0x14 */ f32 field_0x14; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ f32 field_0x1c; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ f32 field_0x24; + /* 0x28 */ f32 field_0x28; + /* 0x2C */ f32 mGravity; + /* 0x30 */ f32 field_0x30; + /* 0x34 */ f32 field_0x34; + /* 0x38 */ f32 mModelScale; + /* 0x3C */ s16 field_0x3c; + /* 0x3E */ s16 field_0x3e; + /* 0x40 */ s16 field_0x40; +}; // Size: 0x3C + +class daNh_HIO_c : public JORReflexible { +public: + daNh_HIO_c(); + virtual ~daNh_HIO_c(); + +public: + /* 0x04 */ s8 mChildID; + /* 0x08 */ daNh_HIO_c__Registers reg; + /* 0x44 */ fopAc_ac_c* unk44; +}; // Size: 0x44 + +static daNh_HIO_c l_HIO; + +static dCcD_SrcCyl l_cyl_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ 0xFFFFFFFF, + /* SrcObjTg SPrm */ 0x03, + /* SrcObjCo SPrm */ 0x19, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt GFlag */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg GFlag */ 0x04, + /* SrcGObjCo GFlag */ 0, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 10.0f, + /* Height */ 20.0f, + }, +}; + +class daNh_c : fopAc_ac_c { +public: + typedef BOOL (daNh_c::*daNh_c_ActionFunc)(void*); + + enum ActionStatus { + ACTION_ENDING = -1, + ACTION_STARTING = 0, + ACTION_ONGOING = 1, + }; + + ~daNh_c(); + void setBaseMtx(); + BOOL createHeap(); + s32 create(); + BOOL init(); + void action(void*); + BOOL setAction(daNh_c_ActionFunc, void*); + BOOL checkBinCatch(); + void searchPlayer(); + void moveProc(float, float, short); + f32 getHomeDistance(); + BOOL checkTimer(); + void BGCheck(); + void airMove(); + BOOL waitAction(void*); + BOOL checkEscapeEnd(); + BOOL escapeAction(void*); + BOOL returnAction(void*); + BOOL execute(); + BOOL initBrkAnm(bool); + void playBrkAnm(); + BOOL draw(); + +public: + /* 0x290 */ u8 temp1[0x298 - 0x290]; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ dBgS_ObjAcch mAcch; + /* 0x460 */ dBgS_AcchCir mAcchCir; + /* 0x4A0 */ dCcD_Stts mStts; + /* 0x4DC */ dCcD_Cyl mCyl; + /* 0x60C */ mDoExt_brkAnm mBrkAnm; + /* 0x624 */ u8 temp2[0x630 - 0x624]; + /* 0x630 */ cBgS_PolyInfo mPolyInfo; + /* 0x640 */ daNh_c_ActionFunc mCurrActionFunc; + /* 0x64C */ Mtx mMtx; + /* 0x67C */ f32 mPlayerDist; + /* 0x680 */ f32 mGroundY; + /* 0x684 */ int mTimer; + /* 0x688 */ s32 unk688; + /* 0x68C */ u8 unk68C; + /* 0x68D */ s8 mActionStatus; + /* 0x68E */ u8 unk68E; + /* 0x68F */ u8 unk68F; + /* 0x690 */ u8 unk690; + /* 0x691 */ u8 unk691; + /* 0x692 */ u8 temp5[0x694 - 0x692]; + /* 0x694 */ s16 unk694; + /* 0x696 */ s16 unk696; + /* 0x698 */ s16 unk698; + /* 0x69A */ s16 unk69A; + /* 0x69C */ u8 temp6[0x6A0 - 0x69C]; + /* 0x6A0 */ f32 unk6A0; + /* 0x6A4 */ u8 temp7[0x6A8 - 0x6A4]; +}; /* 800F95B8-800F9654 .text __ct__10daNh_HIO_cFv */ daNh_HIO_c::daNh_HIO_c() { /* Nonmatching */ + mChildID = -1; + static const daNh_HIO_c__Registers init_data = { + 200.0f, + 100.0f, + -50.0f, + 140.0f, + 0.95f, + 5.0f, + 50.0f, + 1.0f, + -1.0f, + /* mGravity */ 0.25f, + 250.0f, + 600.0f, + /* mModelScale */ 2.5f, + 0x2000, + 0x20, + 0x12C, + }; + reg = init_data; } +/* 800FAEAC-800FAEF4 .text __dt__10daNh_HIO_cFv */ +daNh_HIO_c::~daNh_HIO_c() {} + /* 800F9654-800F9874 .text __dt__6daNh_cFv */ daNh_c::~daNh_c() { - /* Nonmatching */ + if (l_HIO.mChildID >= 0) { + mDoHIO_root.mDoHIO_deleteChild(l_HIO.mChildID); + l_HIO.mChildID = -1; + } } /* 800F9874-800F9980 .text setBaseMtx__6daNh_cFv */ void daNh_c::setBaseMtx() { - /* Nonmatching */ + J3DModel* model = mpModel; + mScale.setAll(l_HIO.reg.mModelScale); + model->setBaseScale(mScale); + mDoMtx_stack_c::transS(getPosition()); + mDoMtx_stack_c::YrotM(shape_angle.y); + MTXCopy(mDoMtx_stack_c::get(), model->getBaseTRMtx()); + + cXyz offset; + offset.z = 0.0f; + offset.x = 0.0f; + offset.y = l_HIO.reg.field_0x14; + cXyz temp; + cMtx_multVec(mDoMtx_stack_c::get(), &offset, &temp); + PSMTXTrans(mDoMtx_stack_c::get(), temp.x, temp.y, temp.z); + mDoMtx_stack_c::scaleM(l_HIO.reg.field_0x18, l_HIO.reg.field_0x18, l_HIO.reg.field_0x18); + MTXCopy(mDoMtx_stack_c::get(), mMtx); } /* 800F9980-800F9A54 .text createHeap__6daNh_cFv */ -void daNh_c::createHeap() { - /* Nonmatching */ +BOOL daNh_c::createHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Always", 0x34); // nh.bdl + JUT_ASSERT(359, modelData != 0); + + mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + if (!mpModel) { + return FALSE; + } + if (!initBrkAnm(false)) { + return FALSE; + } + return TRUE; } /* 800F9A54-800F9A74 .text checkCreateHeap__FP10fopAc_ac_c */ -void checkCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL checkCreateHeap(fopAc_ac_c* i_this) { + return ((daNh_c*)i_this)->createHeap(); } /* 800F9A74-800F9C8C .text create__6daNh_cFv */ -void daNh_c::create() { - /* Nonmatching */ +s32 daNh_c::create() { + static u32 a_heap_size_tbl; + static s8 init; + if (!init) { + a_heap_size_tbl = 0x4000; + init = 1; + } + + s32 phase_state = cPhs_COMPLEATE_e; + + fopAcM_SetupActor(this, daNh_c); + + if (!fopAcM_entrySolidHeap(this, (heapCallbackFunc)&checkCreateHeap, a_heap_size_tbl)) { + return cPhs_ERROR_e; + } + + mCullMtx = mpModel->getBaseTRMtx(); + + if (l_HIO.mChildID < 0) { + l_HIO.mChildID = mDoHIO_root.mDoHIO_createChild("森のほたる", &l_HIO); + l_HIO.unk44 = this; + } + if (!this->init()) { + phase_state = cPhs_ERROR_e; + } + + return phase_state; } /* 800F9C8C-800F9D64 .text init__6daNh_cFv */ -void daNh_c::init() { +BOOL daNh_c::init() { /* Nonmatching */ + mGravity = l_HIO.reg.mGravity; + + BGCheck(); + + mStts.Init(0xFF, 0xFF, this); + mCyl.Set(l_cyl_src); + mCyl.SetStts(&mStts); + + setBaseMtx(); + + mEyePos = mAttentionInfo.mPosition = current.pos; + + return TRUE; } /* 800F9D64-800F9DF4 .text action__6daNh_cFPv */ @@ -47,12 +271,27 @@ void daNh_c::action(void*) { } /* 800F9DF4-800F9EB8 .text setAction__6daNh_cFM6daNh_cFPCvPvPv_iPv */ -void daNh_c::setAction(int (daNh_c::*)(void*), void*) { +BOOL daNh_c::setAction(daNh_c_ActionFunc actionFunc, void* arg) { /* Nonmatching */ + if (mCurrActionFunc != actionFunc) { + if (mCurrActionFunc != NULL) { + mActionStatus = ACTION_ENDING; + (this->*mCurrActionFunc)(arg); + } + mCurrActionFunc = actionFunc; + mActionStatus = ACTION_STARTING; + unk694 = 0; + unk696 = 0; + unk698 = 0; + unk69A = 0; + unk6A0 = 0.0f; + (this->*mCurrActionFunc)(arg); + } + return TRUE; } /* 800F9EB8-800F9F3C .text checkBinCatch__6daNh_cFv */ -void daNh_c::checkBinCatch() { +BOOL daNh_c::checkBinCatch() { /* Nonmatching */ } @@ -67,102 +306,237 @@ void daNh_c::moveProc(float, float, short) { } /* 800FA19C-800FA260 .text getHomeDistance__6daNh_cFv */ -void daNh_c::getHomeDistance() { - /* Nonmatching */ +f32 daNh_c::getHomeDistance() { + cXyz delta = orig.pos - current.pos; + return cXyz(delta.x, 0.0f, delta.z).abs(); } /* 800FA260-800FA2E4 .text checkTimer__6daNh_cFv */ -void daNh_c::checkTimer() { - /* Nonmatching */ +BOOL daNh_c::checkTimer() { + if (unk691 == 1 && !cLib_calcTimer(&mTimer)) { + unk688 -= 4; + if (unk688 < 0) { + unk688 = 0; + } + if (unk688 == 0) { + fopAcM_delete(this); + return TRUE; + } + } + return FALSE; } /* 800FA2E4-800FA568 .text BGCheck__6daNh_cFv */ void daNh_c::BGCheck() { - /* Nonmatching */ + dBgS_ObjGndChk_All gndChk; + gndChk.SetPos(¤t.pos); + f32 groundY = dComIfG_Bgsp()->GroundCross(&gndChk); + if (groundY != -1000000000.0f) { + mGroundY = groundY; + mTevStr.mRoomNo = current.roomNo = dComIfG_Bgsp()->GetRoomId(gndChk); + mTevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(gndChk); + } } /* 800FA568-800FA5B4 .text airMove__6daNh_cFv */ void daNh_c::airMove() { - /* Nonmatching */ + f32 idealY = mGroundY + l_HIO.reg.field_0x20; + if (current.pos.y < idealY - 10.0f) { + mMaxFallSpeed = l_HIO.reg.field_0x24; + } else if (current.pos.y > idealY + 10.0f) { + mMaxFallSpeed = l_HIO.reg.field_0x28; + } } /* 800FA5B4-800FA674 .text waitAction__6daNh_cFPv */ -void daNh_c::waitAction(void*) { - /* Nonmatching */ +BOOL daNh_c::waitAction(void*) { + if (mActionStatus == ACTION_STARTING) { + mActionStatus += 1; // ACTION_ONGOING + mPlayerDist = fopAcM_searchPlayerDistance(this); + } else if (mActionStatus != ACTION_ENDING) { + cLib_addCalc(&speedF, 0.0f, 0.1f, 10.0f, 1.0f); + if (getHomeDistance() > 50.0f) { + setAction(&returnAction, NULL); + } + } + return TRUE; } /* 800FA674-800FA78C .text checkEscapeEnd__6daNh_cFv */ -void daNh_c::checkEscapeEnd() { - /* Nonmatching */ +BOOL daNh_c::checkEscapeEnd() { + cXyz deltaPos = orig.pos - current.pos; + if (unk691 != 1) { + if (!cLib_calcTimer(&unk694)) { + setAction(&waitAction, NULL); + return TRUE; + } + if (deltaPos.abs2XZ() > l_HIO.reg.field_0x30*l_HIO.reg.field_0x30) { + setAction(&returnAction, NULL); + return TRUE; + } + } + return FALSE; } /* 800FA78C-800FA880 .text escapeAction__6daNh_cFPv */ -void daNh_c::escapeAction(void*) { - /* Nonmatching */ +BOOL daNh_c::escapeAction(void*) { + if (mActionStatus == ACTION_STARTING) { + mActionStatus += 1; // ACTION_ONGOING + unk68F = 0; + unk690 = 0; + unk694 = 150; + } else if (mActionStatus != ACTION_ENDING) { + if (!checkEscapeEnd()) { + s16 angle = fopAcM_searchPlayerAngleY(this) + 0x8000; + if (!cLib_calcTimer(&unk690)) { + unk68F ^= 1; + unk690 = cLib_getRndValue(15, 20); + } + angle += unk68F ? -0x2000 : 0x2000; + moveProc(5.0f, 0.5f, angle); + } + } + return TRUE; } /* 800FA880-800FAA34 .text returnAction__6daNh_cFPv */ -void daNh_c::returnAction(void*) { - /* Nonmatching */ +BOOL daNh_c::returnAction(void*) { + if (mActionStatus == ACTION_STARTING) { + mActionStatus += 1; // ACTION_ONGOING + unk68F = 0; + unk690 = 0; + unk694 = 150; + } else if (mActionStatus != ACTION_ENDING) { + if (getHomeDistance() < 50.0f) { + setAction(&waitAction, NULL); + } else { + s16 targetAngle = cLib_targetAngleY(¤t.pos, &orig.pos); + cXyz delta = orig.pos - current.pos; + f32 distXZ = cXyz(delta.x, 0.0f, delta.z).abs2(); + if (distXZ < l_HIO.reg.field_0x30*l_HIO.reg.field_0x30) { + s16 temp2 = targetAngle - fopAcM_searchPlayerAngleY(this); + if (abs(temp2) < 0x1000) { + if (temp2 < 0) { + targetAngle -= 0x4000; + } else { + targetAngle += 0x4000; + } + } + } + if (!cLib_calcTimer(&unk690)) { + unk68F ^= 1; + unk690 = cLib_getRndValue(15, 20); + } + targetAngle += (unk68F ? -0x2000 : 0x2000); + moveProc(5.0f, 0.5f, targetAngle); + } + } + return TRUE; } /* 800FAA34-800FABE0 .text execute__6daNh_cFv */ -void daNh_c::execute() { +BOOL daNh_c::execute() { /* Nonmatching */ } /* 800FABE0-800FACC4 .text initBrkAnm__6daNh_cFb */ -void daNh_c::initBrkAnm(bool) { - /* Nonmatching */ +BOOL daNh_c::initBrkAnm(bool i_modify) { + J3DModelData* modelData = mpModel->getModelData(); + bool success = false; + + J3DAnmTevRegKey* a_brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes("Always", 0x4E); // tnh.brk + JUT_ASSERT(883, a_brk != 0); + + if (mBrkAnm.init(modelData, a_brk, true, 2, 1.0f, 0, -1, i_modify, false)) { + success = true; + } + return success; } /* 800FACC4-800FACE8 .text playBrkAnm__6daNh_cFv */ void daNh_c::playBrkAnm() { - /* Nonmatching */ + mBrkAnm.play(); } /* 800FACE8-800FAE1C .text draw__6daNh_cFv */ -void daNh_c::draw() { - /* Nonmatching */ +BOOL daNh_c::draw() { + g_env_light.settingTevStruct(0, ¤t.pos, &mTevStr); + g_env_light.setLightTevColorType(mpModel, &mTevStr); + + J3DModelData* modelData = mpModel->getModelData(); + + mBrkAnm.entry(modelData); + mDoExt_modelUpdateDL(mpModel); + modelData->getMaterialTable().removeTevRegAnimator(mBrkAnm.getBrkAnm()); + + J3DMaterial* mat = modelData->getMaterialNodePointer(0); + if (mat) { + J3DTevBlock* tevBlock = mat->getTevBlock(); + if (tevBlock) { + GXColorS10* color = tevBlock->getTevColor(1); + if (color) { + unk68E = ((color->r + color->g + color->b) / 3) >> 2; + } + + GXColor* kColor = tevBlock->getTevKColor(3); + if (kColor) { + kColor->a = unk688; + } + } + } + + dComIfGd_setAlphaModel(0, mMtx, unk68E); + + return TRUE; } /* 800FAE1C-800FAE3C .text daNh_Draw__FP6daNh_c */ -void daNh_Draw(daNh_c*) { - /* Nonmatching */ +BOOL daNh_Draw(daNh_c* i_this) { + return i_this->draw(); } /* 800FAE3C-800FAE5C .text daNh_Execute__FP6daNh_c */ -void daNh_Execute(daNh_c*) { - /* Nonmatching */ +BOOL daNh_Execute(daNh_c* i_this) { + return i_this->execute(); } /* 800FAE5C-800FAE64 .text daNh_IsDelete__FP6daNh_c */ -void daNh_IsDelete(daNh_c*) { - /* Nonmatching */ +BOOL daNh_IsDelete(daNh_c* i_this) { + return TRUE; } /* 800FAE64-800FAE8C .text daNh_Delete__FP6daNh_c */ -void daNh_Delete(daNh_c*) { - /* Nonmatching */ +BOOL daNh_Delete(daNh_c* i_this) { + i_this->~daNh_c(); + return TRUE; } /* 800FAE8C-800FAEAC .text daNh_Create__FP10fopAc_ac_c */ -void daNh_Create(fopAc_ac_c*) { - /* Nonmatching */ +s32 daNh_Create(fopAc_ac_c* i_this) { + return ((daNh_c*)i_this)->create(); } -/* 800FAEAC-800FAEF4 .text __dt__10daNh_HIO_cFv */ -daNh_HIO_c::~daNh_HIO_c() { - /* Nonmatching */ -} - -/* 800FAEF4-800FAF10 .text cLib_calcTimer__FPi */ -void cLib_calcTimer(int*) { - /* Nonmatching */ -} - -/* 800FAF10-800FAF84 .text cLib_getRndValue__Fii */ -void cLib_getRndValue(int, int) { - /* Nonmatching */ -} +static actor_method_class l_daNh_Method = { + (process_method_func)daNh_Create, + (process_method_func)daNh_Delete, + (process_method_func)daNh_Execute, + (process_method_func)daNh_IsDelete, + (process_method_func)daNh_Draw, +}; +extern actor_process_profile_definition g_profile_NH = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 7, + /* ListPrio */ fpcLy_CURRENT_e, + /* ProcName */ PROC_NH, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daNh_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x013C, + /* Actor SubMtd */ &l_daNh_Method, + /* Status */ 0x00040100, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_0_e, +}; diff --git a/src/d/actor/d_a_obj_Ygush00.cpp b/src/d/actor/d_a_obj_Ygush00.cpp index f7359fe7f..13ff1a2cd 100644 --- a/src/d/actor/d_a_obj_Ygush00.cpp +++ b/src/d/actor/d_a_obj_Ygush00.cpp @@ -95,7 +95,7 @@ s32 daObjYgush00_c::_create() { if (fopAcM_entrySolidHeap(this, (heapCallbackFunc)solidHeapCB, 0x740) == 1) { mpModel->setBaseScale(mScale); mDoMtx_stack_c::transS(getPosition()); - mpModel->i_setBaseTRMtx(mDoMtx_stack_c::get()); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); fopAcM_setCullSizeBox(this, diff --git a/src/d/actor/d_a_obj_movebox.cpp b/src/d/actor/d_a_obj_movebox.cpp index 4f64281d4..675152079 100644 --- a/src/d/actor/d_a_obj_movebox.cpp +++ b/src/d/actor/d_a_obj_movebox.cpp @@ -474,7 +474,7 @@ namespace daObjMovebox { } if (mpModel) { - mpModel->i_setBaseTRMtx(mDoMtx_stack_c::get()); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } MTXCopy(mDoMtx_stack_c::get(), mMtx); diff --git a/src/d/actor/d_a_obj_paper.cpp b/src/d/actor/d_a_obj_paper.cpp index 8c39962ba..0211638e0 100644 --- a/src/d/actor/d_a_obj_paper.cpp +++ b/src/d/actor/d_a_obj_paper.cpp @@ -293,7 +293,7 @@ namespace daObjPaper { mDoMtx_stack_c::transS(getPosition()); mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z); - mpModel->i_setBaseTRMtx(mDoMtx_stack_c::get()); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000948-00000984 .text init_mtx__Q210daObjPaper5Act_cFv */ diff --git a/src/d/d_npc.cpp b/src/d/d_npc.cpp index 9883608d9..9681373a3 100644 --- a/src/d/d_npc.cpp +++ b/src/d/d_npc.cpp @@ -1186,7 +1186,7 @@ void dNpc_EventCut_c::cutMoveToPosStart() { } void dNpc_EventCut_c::cutMoveToPosProc() { - s16 angle = cLib_targetAngleY(mpActor->current.pos, mPos); + s16 angle = cLib_targetAngleY(&mpActor->current.pos, &mPos); cXyz temp(pDelDistance * JMASinShort(angle), mPos.y, pDelDistance * JMASCosShort(angle)); diff --git a/src/m_Do/m_Do_ext.cpp b/src/m_Do/m_Do_ext.cpp index 88e8f72a7..df949da9a 100644 --- a/src/m_Do/m_Do_ext.cpp +++ b/src/m_Do/m_Do_ext.cpp @@ -22,12 +22,12 @@ void isCurrentSolidHeap() { } /* 8000DD4C-8000DF24 .text initPlay__14mDoExt_baseAnmFsifssb */ -void mDoExt_baseAnm::initPlay(short, int, float, short, short, bool) { +int mDoExt_baseAnm::initPlay(short, int, float, short, short, bool) { /* Nonmatching */ } /* 8000DF24-8000DFC4 .text play__14mDoExt_baseAnmFv */ -void mDoExt_baseAnm::play() { +int mDoExt_baseAnm::play() { /* Nonmatching */ } @@ -127,17 +127,19 @@ void mDoExt_btkAnm::entry(J3DMaterialTable*, float) { } /* 8000EB74-8000EBA0 .text init__13mDoExt_brkAnmFP12J3DModelDataP15J3DAnmTevRegKeyiifssbi */ -void mDoExt_brkAnm::init(J3DModelData*, J3DAnmTevRegKey*, int, int, float, short, short, bool, int) { - /* Nonmatching */ +int mDoExt_brkAnm::init(J3DModelData* i_modelData, J3DAnmTevRegKey* i_brk, int i_anmPlay, + int i_attribute, f32 i_rate, s16 i_start, s16 i_end, bool i_modify, int i_entry) { + return init(&i_modelData->getMaterialTable(), i_brk, i_anmPlay, i_attribute, i_rate, + i_start, i_end, i_modify, i_entry); } /* 8000EBA0-8000EBC4 .text entry__13mDoExt_brkAnmFP12J3DModelDataf */ -void mDoExt_brkAnm::entry(J3DModelData*, float) { - /* Nonmatching */ +void mDoExt_brkAnm::entry(J3DModelData* i_modelData, float i_frame) { + entry(&i_modelData->getMaterialTable(), i_frame); } /* 8000EBC4-8000EEE8 .text init__13mDoExt_brkAnmFP16J3DMaterialTableP15J3DAnmTevRegKeyiifssbi */ -void mDoExt_brkAnm::init(J3DMaterialTable*, J3DAnmTevRegKey*, int, int, float, short, short, bool, int) { +int mDoExt_brkAnm::init(J3DMaterialTable*, J3DAnmTevRegKey*, int, int, float, short, short, bool, int) { /* Nonmatching */ }