diff --git a/include/d/actor/d_a_itembase.h b/include/d/actor/d_a_itembase.h index dd09eb0be..52234c0a7 100644 --- a/include/d/actor/d_a_itembase.h +++ b/include/d/actor/d_a_itembase.h @@ -81,7 +81,7 @@ public: /* 0x480 */ dBgS_AcchCir mAcchCir; /* 0x4C0 */ dCcD_Stts mStts; /* 0x4FC */ dCcD_Cyl mCyl; - /* 0x62C */ s32 mShadowId; + /* 0x62C */ u32 mShadowId; /* 0x630 */ s32 mPickupFlag; /* 0x634 */ s32 field_0x634; /* 0x638 */ s16 field_0x638; diff --git a/include/d/actor/d_a_kamome.h b/include/d/actor/d_a_kamome.h index 97751f745..778c5fc90 100644 --- a/include/d/actor/d_a_kamome.h +++ b/include/d/actor/d_a_kamome.h @@ -13,7 +13,7 @@ class kamome_class : public fopAc_ac_c { public: /* 0x290 */ request_of_phase_process_class mPhsKamome; /* 0x298 */ mDoExt_McaMorf* mpMorf; - /* 0x29C */ int mShadowIdx; + /* 0x29C */ u32 mShadowId; /* 0x2A0 */ u8 mType; /* 0x2A1 */ u8 mKoMaxCount; /* 0x2A2 */ u8 mPathIdx; diff --git a/include/d/actor/d_a_mozo.h b/include/d/actor/d_a_mozo.h index 8c4ebf386..85dffc895 100644 --- a/include/d/actor/d_a_mozo.h +++ b/include/d/actor/d_a_mozo.h @@ -8,9 +8,9 @@ class daMozo_c : public fopAc_ac_c { public: - typedef void(daMozo_c::*proc_t)(void); + typedef void (daMozo_c::*proc_t)(); - void setProcess(void (daMozo_c::*)()) {} + void setProcess(proc_t proc) { mCurrentProc = proc; } s32 _create(); bool _delete(); @@ -34,18 +34,18 @@ public: void setAnm(int, float); public: - // TODO: add offset comments - 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 - Quaternion mQuatRotation; - dCcD_Stts mColStatus; - dCcD_Cps mCapsuleCol; + /* 0x290 */ proc_t mCurrentProc; + /* 0x29C */ request_of_phase_process_class mPhs; + /* 0x2A4 */ mDoExt_McaMorf* mAnimMorf; + /* 0x2A8 */ mDoExt_brkAnm mBrkAnm; + /* 0x2C0 */ J3DAnmTevRegKey* m_brk; + /* 0x2C4 */ mDoExt_btkAnm mBtkAnm; + /* 0x2D8 */ J3DAnmTextureSRTKey* m_btk; + /* 0x2DC */ u8 m2DC[0x35C - 0x2DC]; + /* 0x35C */ Quaternion mQuatRotation; + /* 0x36C */ u8 m36C[0x380 - 0x36C]; + /* 0x380 */ dCcD_Stts mColStatus; + /* 0x3BC */ dCcD_Cps mCapsuleCol; }; class daMozo_HIO_c { diff --git a/include/d/actor/d_a_npc_md.h b/include/d/actor/d_a_npc_md.h index 7f7bfe9bb..bc482b65f 100644 --- a/include/d/actor/d_a_npc_md.h +++ b/include/d/actor/d_a_npc_md.h @@ -223,6 +223,14 @@ public: void setTypeM_Dai() { m3138 = 5; } void setTypeM_DaiB() { m3138 = 6; } void setTypeShipRide() { m3138 = 7; } + void isTypeAdanmae() {} + void isTypeAtorizk() {} + void isTypeM_Dra09() {} + void isTypeSea() {} + bool isTypeEdaichi() { return m3138 == 4; } + bool isTypeM_Dai() { return m3138 == 5; } + bool isTypeM_DaiB() { return m3138 == 6; } + bool isTypeShipRide() { return m3138 == 7; } s16 getHead_x() { return mJntCtrl.getHead_x(); } s16 getHead_y() { return mJntCtrl.getHead_y(); } @@ -270,14 +278,6 @@ public: void isNoCarryAction() {} void isSeaTalk() {} void isShipRide() {} - void isTypeAdanmae() {} - void isTypeAtorizk() {} - void isTypeEdaichi() {} - void isTypeM_Dai() {} - void isTypeM_DaiB() {} - void isTypeM_Dra09() {} - void isTypeSea() {} - void isTypeShipRide() {} void noCarryAction() {} void offBitCamTagIn() {} void offFlying() {} @@ -482,7 +482,7 @@ public: /* 0x0508 */ JPABaseEmitter* m0508[6]; /* 0x0520 */ mDoExt_btpAnm m0520; /* 0x0534 */ mDoExt_btkAnm mLightBtkAnm; - /* 0x0548 */ u8 m0548[0x054C - 0x0548]; + /* 0x0548 */ u32 mShadowId; /* 0x054C */ dBgS_AcchCir mAcchCir[2]; /* 0x05CC */ dBgS_MirLightLinChk mLinChk; /* 0x0638 */ dCcD_Stts mStts; @@ -539,7 +539,9 @@ public: /* 0x312F */ u8 m312F[0x3131 - 0x312F]; /* 0x3131 */ u8 m3131; /* 0x3132 */ s8 mActionStatus; - /* 0x3133 */ u8 m3133[0x3137 - 0x3133]; + /* 0x3133 */ u8 m3133; + /* 0x3134 */ u8 m3134[0x3136 - 0x3134]; + /* 0x3136 */ u8 m3136; /* 0x3137 */ u8 m3137; /* 0x3138 */ u8 m3138; /* 0x3139 */ u8 mCurEvent; diff --git a/include/d/actor/d_a_rd.h b/include/d/actor/d_a_rd.h index 7bc503f18..c6c807cdb 100644 --- a/include/d/actor/d_a_rd.h +++ b/include/d/actor/d_a_rd.h @@ -190,7 +190,7 @@ public: /* 0x520 */ dCcD_Stts mStts; /* 0x55C */ dCcD_Cyl mCyl; /* 0x68C */ u8 m68C[0x690 - 0x68C]; - /* 0x690 */ s32 mShadowId; + /* 0x690 */ u32 mShadowId; /* 0x694 */ mDoExt_invisibleModel mInvisModel; /* 0x69C */ dNpc_JntCtrl_c mJntCtrl; /* 0x6D0 */ u32 mCorpseID; diff --git a/include/d/actor/d_a_sea.h b/include/d/actor/d_a_sea.h index 2af896fa3..512716e58 100644 --- a/include/d/actor/d_a_sea.h +++ b/include/d/actor/d_a_sea.h @@ -3,6 +3,7 @@ #include "dolphin/types.h" #include "f_op/f_op_actor.h" +#include "JSystem/J3DGraphBase/J3DPacket.h" class daSea_WaterHeightInfo_Mng { public: diff --git a/include/d/actor/d_a_ship.h b/include/d/actor/d_a_ship.h index a1df79b8b..3cfbb0509 100644 --- a/include/d/actor/d_a_ship.h +++ b/include/d/actor/d_a_ship.h @@ -12,19 +12,20 @@ class daShip_c : public fopAc_ac_c { public: enum daSHIP_SFLG { - + daSFLG_HEAD_NO_DRAW_e = 0x00200000, }; + bool checkStateFlg(daSHIP_SFLG flag) const { return m0358 & flag; } + bool checkHeadNoDraw() const { return checkStateFlg(daSFLG_HEAD_NO_DRAW_e); } + void checkCraneMode() const {} void checkCraneUpEnd() const {} void checkForceMove() {} - void checkHeadNoDraw() const {} void checkJumpOkFlg() const {} void checkRopeCntMax() const {} void checkRopeDownStart() const {} void checkSalvageDemo() const {} void checkShootCannon() const {} - void checkStateFlg(daSHIP_SFLG) const {} void checkTornadoFlg() const {} void checkTornadoUp() const {} void getBeltSpeed() const {} @@ -188,7 +189,7 @@ public: /* 0x0354 */ int mEvtStaffId; /* 0x0358 */ u32 m0358; /* 0x035C */ int mNextMessageID; - /* 0x0360 */ int mShadowId; + /* 0x0360 */ u32 mShadowId; /* 0x0364 */ u8 m0364[0x036C - 0x0364]; /* 0x036C */ s16 m036C; /* 0x036E */ u8 m036E[0x0370 - 0x036E]; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 66557d900..15a2681db 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -2329,6 +2329,10 @@ inline int dComIfGd_setRealShadow2(u32 id, s8 param_2, J3DModel* pModel, cXyz* p pTevStr); } +inline bool dComIfGd_addRealShadow(u32 id, J3DModel* pModel) { + return g_dComIfG_gameInfo.drawlist.addRealShadow(id, pModel); +} + inline void dComIfGd_imageDrawShadow(Mtx mtx) { g_dComIfG_gameInfo.drawlist.imageDrawShadow(mtx); } @@ -2350,6 +2354,10 @@ inline GXColor & dComIfGd_getAlphaModelColor() { return g_dComIfG_gameInfo.drawl inline GXColor & dComIfGd_getLightModelColor() { return g_dComIfG_gameInfo.drawlist.getLightModelColor(); } inline GXColor & dComIfGd_getSpotModelColor() { return g_dComIfG_gameInfo.drawlist.getSpotModelColor(); } +inline J3DDrawBuffer* dComIfGd_getXluList() { + return g_dComIfG_gameInfo.drawlist.getXluList(); +} + inline J3DDrawBuffer* dComIfGd_getOpaListP1() { return g_dComIfG_gameInfo.drawlist.getOpaListP1(); } diff --git a/include/d/d_drawlist.h b/include/d/d_drawlist.h index d73ab1a20..e4f23921b 100644 --- a/include/d/d_drawlist.h +++ b/include/d/d_drawlist.h @@ -377,6 +377,7 @@ public: static void wipeIn(f32); static void calcWipe(); + J3DDrawBuffer* getXluList() { return mpXluList; } J3DDrawBuffer* getOpaListP1() { return mpOpaListP1; } J3DDrawBuffer* getOpaListFilter() { return mpOpaListFilter; } J3DDrawBuffer* getOpaList2D() { return mpOpaList2D; } @@ -448,6 +449,10 @@ public: return mShadowControl.setReal2(id, param_2, pModel, pPos, param_5, param_6, pTevStr); } + bool addRealShadow(u32 id, J3DModel* pModel) { + return mShadowControl.addReal(id, pModel); + } + void drawShadow(Mtx mtx) { mShadowControl.draw(mtx); } void imageDrawShadow(Mtx mtx) { mShadowControl.imageDraw(mtx); } diff --git a/src/d/actor/d_a_arrow.cpp b/src/d/actor/d_a_arrow.cpp index 0ad2e61a5..9dbc00d9d 100644 --- a/src/d/actor/d_a_arrow.cpp +++ b/src/d/actor/d_a_arrow.cpp @@ -1037,7 +1037,7 @@ void daArrow_c::checkRestMp() { u8 currMagic = dComIfGs_getMagic(); if (currMagic < use_mp[m_keep_type]) { - m_keep_type = 0; + m_keep_type = TYPE_NORMAL; } } diff --git a/src/d/actor/d_a_npc_md.cpp b/src/d/actor/d_a_npc_md.cpp index ba078be29..e1deb02c4 100644 --- a/src/d/actor/d_a_npc_md.cpp +++ b/src/d/actor/d_a_npc_md.cpp @@ -11,6 +11,8 @@ #include "m_Do/m_Do_controller_pad.h" #include "m_Do/m_Do_mtx.h" #include "d/actor/d_a_player_main.h" +#include "d/d_snap.h" +#include "d/actor/d_a_ship.h" // Needed for the .data section to match. static f32 dummy1[3] = {1.0f, 1.0f, 1.0f}; @@ -855,7 +857,7 @@ bool daNpc_Md_c::mirrorCancelCheck() { /* 00003648-00003674 .text setWingEmitter__10daNpc_Md_cFv */ void daNpc_Md_c::setWingEmitter() { - /* Nonmatching */ + particle_set(m0508, 0x819B); } /* 00003674-000036C0 .text setHane02Emitter__10daNpc_Md_cFv */ @@ -926,8 +928,9 @@ void daNpc_Md_c::checkCollision(int) { } /* 00003FE0-00004040 .text restartPoint__10daNpc_Md_cFs */ -void daNpc_Md_c::restartPoint(s16) { - /* Nonmatching */ +void daNpc_Md_c::restartPoint(s16 i_point) { + setPointRestart(i_point, 2); + setNpcAction(&waitNpcAction, NULL); } /* 00004040-00004174 .text isTagCheckOK__10daNpc_Md_cFv */ @@ -1297,7 +1300,8 @@ bool daNpc_Md_c::actionFlyEvent(int) { /* 0000B870-0000B890 .text initialGlidingEvent__10daNpc_Md_cFi */ void daNpc_Md_c::initialGlidingEvent(int) { - /* Nonmatching */ + mGravity = l_HIO.m0F4; + mMaxFallSpeed = -100.0f; } /* 0000B890-0000B934 .text actionGlidingEvent__10daNpc_Md_cFi */ @@ -1312,7 +1316,12 @@ void daNpc_Md_c::initialLandingEvent(int) { /* 0000B99C-0000B9E0 .text actionLandingEvent__10daNpc_Md_cFi */ bool daNpc_Md_c::actionLandingEvent(int) { - /* Nonmatching */ + if (m312A != 0) { + setAnm(0); + return true; + } + setAttention(true); + return false; } /* 0000B9E0-0000B9F8 .text initialWalkEvent__10daNpc_Md_cFi */ @@ -1363,7 +1372,15 @@ void daNpc_Md_c::initialOnetimeEvent(int) { /* 0000C360-0000C3C4 .text actionOnetimeEvent__10daNpc_Md_cFi */ bool daNpc_Md_c::actionOnetimeEvent(int) { - /* Nonmatching */ + if (m312A != 0) { + if (m3104 == 0x1A) { + setAnm(0); + } else { + return true; + } + } + setAttention(true); + return false; } /* 0000C3C4-0000C48C .text initialQuake__10daNpc_Md_cFi */ @@ -1460,8 +1477,28 @@ void daNpc_Md_c::getAnmType(u8) { } /* 0000CDF4-0000CF18 .text initTexPatternAnm__10daNpc_Md_cFUcb */ -BOOL daNpc_Md_c::initTexPatternAnm(u8, bool) { - /* Nonmatching */ +BOOL daNpc_Md_c::initTexPatternAnm(u8 btpIdx, bool param_2) { + struct btp_anm_tbl { + /* 0x00 */ char m00[0x20]; + /* 0x20 */ u8 m20; + }; + static btp_anm_tbl btpAnmTbl[] = { + {}, // TODO + }; + + J3DModelData* modelData = mpMorf->getModel()->getModelData(); + bool ret = false; + J3DAnmTexPattern* eyeTexPtrn = (J3DAnmTexPattern*)dComIfG_getObjectRes(mModelArcName, btpAnmTbl[btpIdx].m00); + JUT_ASSERT(7502, eyeTexPtrn != 0); + if (m0520.init(modelData, eyeTexPtrn, 1, 1, 1.0f, 0, -1, param_2, 0)) { + m3112 = eyeTexPtrn->getFrameMax(); + m3133 = 0; + m3136 = btpAnmTbl[btpIdx].m20; + m3137 = btpIdx; + ret = true; + } + + return ret; } /* 0000CF18-0000CFCC .text playTexPatternAnm__10daNpc_Md_cFv */ @@ -1702,7 +1739,83 @@ BOOL daNpc_Md_c::init() { /* 0000F4E0-0000F8EC .text draw__10daNpc_Md_cFv */ BOOL daNpc_Md_c::draw() { - /* Nonmatching */ + if (cLib_checkBit(m30F0, 0x1000UL)) { + if (dComIfGp_getShipActor() && dComIfGp_getShipActor()->checkHeadNoDraw()) { + return TRUE; + } + } else { + if (fopAcM_GetHomeRoomNo(this) < 0) { + return TRUE; + } + if (!dComIfGp_roomControl_checkStatusFlag(current.roomNo, 0x10)) { + return TRUE; + } + } + + J3DModel* model = mpMorf->getModel(); + J3DModelData* modelData = model->getModelData(); + + g_env_light.settingTevStruct(0, ¤t.pos, &mTevStr); + drawDamageFog(); + g_env_light.setLightTevColorType(model, &mTevStr); + m0520.entry(modelData); + mpMorf->entryDL(); + m0520.remove(modelData); + + if (!isTypeShipRide()) { + if (cLib_checkBit(m30F0, 0x1UL)) { + model = mpWingMorf->getModel(); + g_env_light.setLightTevColorType(model, &mTevStr); + mpWingMorf->entryDL(); + } else { + model = mpArmMorf->getModel(); + g_env_light.setLightTevColorType(model, &mTevStr); + mpArmMorf->entryDL(); + } + } else { + model = mpArmMorf->getModel(); + g_env_light.setLightTevColorType(model, &mTevStr); + mpArmMorf->entryDL(); + } + + g_env_light.setLightTevColorType(mpHarpModel, &mTevStr); + mDoExt_modelUpdateDL(mpHarpModel); + + if (cLib_checkBit(m30F0, 0x2000UL)) { + mLightBtkAnm.entry(mpHarpLightModel->getModelData()); + mDoExt_modelUpdateDL(mpHarpLightModel); + mLightBtkAnm.remove(mpHarpLightModel->getModelData()); + + mDoMtx_copy(mpHarpModel->getBaseTRMtx(), mDoMtx_stack_c::get()); + mDoMtx_stack_c::transM(l_HIO.m034.m0C, l_HIO.m034.m10, l_HIO.m034.m14); + Mtx mtx; + mDoMtx_copy(mDoMtx_stack_c::get(), mtx); + mDoMtx_stack_c::transS(l_ms_light_local_start); + mDoMtx_stack_c::YrotM(0x8000); + f32 temp = mCps.GetAtVecP()->abs(); + mDoMtx_stack_c::scaleM(0.1f, 0.1f, temp * (1.0f/10000.0f)); + mDoMtx_stack_c::revConcat(mtx); + m0B70.update(mDoMtx_stack_c::get(), 0xFF, 90.0f); + dComIfGd_getXluList()->entryImm(&m0B70, 0x1F); + } + + if (!cLib_checkBit(m30F0, 0x1000UL) && !fopAcM_checkStatus(this, fopAcStts_CARRY_e) && cLib_checkBit(m30F0, 0x20000UL)) { + cXyz shadowPos(current.pos.x, current.pos.y + 150.0f, current.pos.z); + mShadowId = dComIfGd_setShadow( + mShadowId, 0, mpMorf->getModel(), &shadowPos, 800.0f, 20.0f, + current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &mTevStr, + 0, 1.0f, dDlst_shadowControl_c::getSimpleTex() + ); + + if (mShadowId != 0) { + dComIfGd_addRealShadow(mShadowId, model); + dComIfGd_addRealShadow(mShadowId, mpHarpModel); + } + } + + dSnap_RegistFig(0x8A, this, 1.0f, 1.0f, 1.0f); + + return TRUE; } /* 0000F8EC-0000FC18 .text animationPlay__10daNpc_Md_cFv */ @@ -1721,8 +1834,14 @@ BOOL daNpc_Md_c::execute() { } /* 000108B0-00010948 .text particle_set__10daNpc_Md_cFPP14JPABaseEmitterUs */ -void daNpc_Md_c::particle_set(JPABaseEmitter**, u16) { - /* Nonmatching */ +void daNpc_Md_c::particle_set(JPABaseEmitter** pEmitter, u16 particleID) { + if (*pEmitter) { + return; + } + (*pEmitter) = dComIfGp_particle_set(particleID, ¤t.pos, ¤t.angle, NULL, 0xFF, NULL, fopAcM_GetRoomNo(this), &mTevStr.mColorK0, &mTevStr.mColorK0); + if (*pEmitter) { + (*pEmitter)->becomeImmortalEmitter(); + } } /* 00010948-000109A0 .text emitterTrace__10daNpc_Md_cFP14JPABaseEmitterPA4_fP5csXyz */ @@ -1745,8 +1864,13 @@ void daNpc_Md_c::emitterTrace(JPABaseEmitter* emitter, MtxP mtx, csXyz* angle) { } /* 000109A0-000109DC .text emitterDelete__10daNpc_Md_cFPP14JPABaseEmitter */ -void daNpc_Md_c::emitterDelete(JPABaseEmitter**) { - /* Nonmatching */ +void daNpc_Md_c::emitterDelete(JPABaseEmitter** pEmitter) { + if (*pEmitter == NULL) { + return; + } + (*pEmitter)->quitImmortalEmitter(); + (*pEmitter)->becomeInvalidEmitter(); + (*pEmitter) = NULL; } /* 000109DC-000110BC .text __dt__10daNpc_Md_cFv */ diff --git a/src/d/d_com_inf_game.cpp b/src/d/d_com_inf_game.cpp index 3c01ecb98..70a813b1f 100644 --- a/src/d/d_com_inf_game.cpp +++ b/src/d/d_com_inf_game.cpp @@ -168,7 +168,7 @@ void dComIfG_play_c::itemInit() { field_0x4979 = 0; field_0x497a = 0; field_0x4963 = dComIfGs_getOptVibration(); - daArrow_c::setKeepType(0); + daArrow_c::setKeepType(daArrow_c::TYPE_NORMAL); mMesgCameraTagInfo = 0; field_0x4984 = 0; @@ -1250,7 +1250,7 @@ void dComIfGs_copyPlayerRecollectionData() { /* 80054E9C-80055318 .text dComIfGs_setPlayerRecollectionData__Fv */ void dComIfGs_setPlayerRecollectionData() { #if VERSION != VERSION_JPN - daArrow_c::setKeepType(0); + daArrow_c::setKeepType(daArrow_c::TYPE_NORMAL); #endif u32 tbl; diff --git a/src/d/d_jnt_hit.cpp b/src/d/d_jnt_hit.cpp index b0127f23c..52efad121 100644 --- a/src/d/d_jnt_hit.cpp +++ b/src/d/d_jnt_hit.cpp @@ -108,9 +108,3 @@ JntHit_c* JntHit_create(J3DModel* model, __jnt_hit_data_c* jntHitData, s16 hitDa return NULL; } - -/* 8006286C-800628B4 .text __dt__12JntHit_HIO_cFv */ -JntHit_HIO_c::~JntHit_HIO_c() { - /* Nonmatching */ -} -