From 63eba6d48af1d30e0583c9ae09c996b96f5d8129 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Wed, 13 Dec 2023 00:52:09 -0500 Subject: [PATCH] d_a_player_main work --- include/JSystem/J3DGraphBase/J3DTransform.h | 2 +- include/JSystem/JAudio/JAIAnimation.h | 20 +-- include/d/actor/d_a_player_main.h | 21 +-- include/d/d_bg_s_chk.h | 4 +- include/d/d_material.h | 20 +++ src/d/actor/d_a_player_main.cpp | 153 ++++++++++++++++---- 6 files changed, 171 insertions(+), 49 deletions(-) diff --git a/include/JSystem/J3DGraphBase/J3DTransform.h b/include/JSystem/J3DGraphBase/J3DTransform.h index 2260bb6e1..2b480e1ef 100644 --- a/include/JSystem/J3DGraphBase/J3DTransform.h +++ b/include/JSystem/J3DGraphBase/J3DTransform.h @@ -15,7 +15,7 @@ struct J3DTextureSRTInfo; // I doubt this is right but it seems like the only way to prevent an empty ctor being added on array construction struct J3DTransformInfo { /* 0x00 */ Vec mScale; - /* 0x0C */ JGeometry::TVec3 mRotation; + /* 0x0C */ SVec mRotation; /* 0x14 */ Vec mTranslate; inline J3DTransformInfo& operator=(const J3DTransformInfo& b) { mScale = b.mScale; diff --git a/include/JSystem/JAudio/JAIAnimation.h b/include/JSystem/JAudio/JAIAnimation.h index 07e091c56..2959b46f1 100644 --- a/include/JSystem/JAudio/JAIAnimation.h +++ b/include/JSystem/JAudio/JAIAnimation.h @@ -18,16 +18,6 @@ struct JAIAnimeSound__Slot { }; class JAIAnimeSound { -public: - JAIAnimeSound(); - void initActorAnimSound(void*, u32, f32); - void setAnimSoundVec(JAIBasic*, Vec*, f32, f32, u32, u8); - void setAnimSoundActor(JAIBasic*, JAInter::Actor*, f32, f32, u8); - void playActorAnimSound(JAIBasic*, JAInter::Actor*, f32, u8); - virtual void startAnimSound(void*, u32, JAISound**, JAInter::Actor*, u8); - virtual void setSpeedModifySound(JAISound*, JAIAnimeFrameSoundData*, f32); - void stop(); - public: /* 0x00 */ JAIAnimeSound__Slot mSlots[8]; /* 0x60 */ u32 m60; @@ -43,6 +33,16 @@ public: /* 0x8C */ u8 m8C[0x90 - 0x8C]; /* 0x90 */ u16* mpData; /* 0x94 */ /* vtable */ + +public: + JAIAnimeSound(); + void initActorAnimSound(void*, u32, f32); + void setAnimSoundVec(JAIBasic*, Vec*, f32, f32, u32, u8); + void setAnimSoundActor(JAIBasic*, JAInter::Actor*, f32, f32, u8); + void playActorAnimSound(JAIBasic*, JAInter::Actor*, f32, u8); + virtual void startAnimSound(void*, u32, JAISound**, JAInter::Actor*, u8); + virtual void setSpeedModifySound(JAISound*, JAIAnimeFrameSoundData*, f32); + void stop(); }; // Size: 0x98 #endif /* JAIANIMATION_H */ diff --git a/include/d/actor/d_a_player_main.h b/include/d/actor/d_a_player_main.h index e322223c9..f7f4c3bdd 100644 --- a/include/d/actor/d_a_player_main.h +++ b/include/d/actor/d_a_player_main.h @@ -1219,10 +1219,13 @@ public: }; enum daPy_UNDER { - + UNDER_UNK0 = 0, + UNDER_UNK1 = 1, }; enum daPy_UPPER { + UPPER_UNK0 = 0, + UPPER_UNK1 = 1, UPPER_UNK2 = 2, }; @@ -1242,14 +1245,14 @@ public: void seStartSwordCut(u32); BOOL itemButton() const; BOOL itemTrigger() const; - void getReadyItem(); + u8 getReadyItem(); BOOL checkGroupItem(int, int); BOOL checkSetItemTrigger(int, int); - void auraJointCB0(int); + BOOL auraJointCB0(int); BOOL jointBeforeCB(int, J3DTransformInfo*, Quaternion*); BOOL jointAfterCB(int, J3DTransformInfo*, Quaternion*); - void jointCB0(int); - void jointCB1(); + BOOL jointCB0(int); + BOOL jointCB1(); JKRHeap* setAnimeHeap(JKRSolidHeap*); JKRHeap* setItemHeap(); void setBlurPosResource(u16); @@ -2101,6 +2104,9 @@ public: request_of_phase_process_class* getPhase() { return &mPhsLoad; } + J3DAnmTransform* getNowAnmPackUnder(daPy_UNDER idx) { return mAnmRatioUnder[idx].getAnmTransform(); } + J3DAnmTransform* getNowAnmPackUpper(daPy_UPPER idx) { return mAnmRatioUpper[idx].getAnmTransform(); } + void allTrigger() const {} void cancelTrigger() const {} void checkAttentionLock() {} @@ -2134,8 +2140,6 @@ public: void getAnmSpeedStickRate(f32, f32) {} void getBombWaterPillarBrk() {} void getBombWaterPillarBtk() {} - void getNowAnmPackUnder(daPy_UNDER) {} - void getNowAnmPackUpper(daPy_UPPER) {} void getStartModeFromParam(u32) {} void getTactLeftHandPos() const {} void itemButtonX() const {} @@ -2242,8 +2246,7 @@ public: /* 0x09A0 */ dDlst_mirrorPacket mMirrorPacket; /* 0x2E7C */ J3DModel* mpYmsls00Model; /* 0x2E80 */ J3DAnmTextureSRTKey* mpYmsls00Btk; - /* 0x2E84 */ J3DModel* mpHbootsModelRightFoot; - /* 0x2E88 */ J3DModel* mpHbootsModelLeftFoot; + /* 0x2E84 */ J3DModel* mpHbootsModels[2]; /* 0x2E8C */ J3DModel* mpPringModel; /* 0x2E90 */ JKRSolidHeap* mpItemHeaps[2]; /* 0x2E98 */ J3DModel* mpHeldItemModel; diff --git a/include/d/d_bg_s_chk.h b/include/d/d_bg_s_chk.h index 3f83ded01..0203d9efa 100644 --- a/include/d/d_bg_s_chk.h +++ b/include/d/d_bg_s_chk.h @@ -7,8 +7,8 @@ class dBgS_Chk : public dBgS_PolyPassChk, public dBgS_GrpPassChk { public: dBgS_Chk() {} - cBgS_PolyPassChk* GetPolyPassChkInfo() { return (cBgS_PolyPassChk*)this; } - cBgS_GrpPassChk* GetGrpPassChkInfo() { return (cBgS_GrpPassChk*)this; } + dBgS_PolyPassChk* GetPolyPassChkInfo() { return (dBgS_PolyPassChk*)this; } + dBgS_GrpPassChk* GetGrpPassChkInfo() { return (dBgS_GrpPassChk*)this; } virtual ~dBgS_Chk() {} }; // Size: 0x14 diff --git a/include/d/d_material.h b/include/d/d_material.h index 6e5687b6a..cdc14e1b5 100644 --- a/include/d/d_material.h +++ b/include/d/d_material.h @@ -7,10 +7,17 @@ class J3DMaterialTable; class J3DAnmTextureSRTKey; class mDoExt_McaMorf; class mDoExt_invisibleModel; +class J3DModel; +class J3DModelData; class dMat_ice_c { public: + void create(J3DMaterialTable*, J3DAnmTextureSRTKey*); void play(); + void copy(J3DModelData*); + void updateDL(J3DModel*, s8, mDoExt_invisibleModel*); + void updateDL(mDoExt_McaMorf*, s8, mDoExt_invisibleModel*); + void entryDL(J3DModel*, s8, mDoExt_invisibleModel*); void entryDL(mDoExt_McaMorf*, s8, mDoExt_invisibleModel*); }; @@ -19,9 +26,22 @@ public: static void icePlay() { mIce->play(); } static void create(J3DMaterialTable*, J3DAnmTextureSRTKey*); + static void iceEntryDL(J3DModel* model, s8 param_2, mDoExt_invisibleModel* invisModel) { + mIce->entryDL(model, param_2, invisModel); + } static void iceEntryDL(mDoExt_McaMorf* morf, s8 param_2, mDoExt_invisibleModel* invisModel) { mIce->entryDL(morf, param_2, invisModel); } + static void iceUpdateDL(J3DModel* model, s8 param_2, mDoExt_invisibleModel* invisModel) { + mIce->updateDL(model, param_2, invisModel); + } + static void iceUpdateDL(mDoExt_McaMorf* morf, s8 param_2, mDoExt_invisibleModel* invisModel) { + mIce->updateDL(morf, param_2, invisModel); + } + + // TODO: + static void pop(J3DModelData*) {} + static void push(J3DModelData*) {} static dMat_ice_c* mIce; }; diff --git a/src/d/actor/d_a_player_main.cpp b/src/d/actor/d_a_player_main.cpp index 9df92be29..283ea1c17 100644 --- a/src/d/actor/d_a_player_main.cpp +++ b/src/d/actor/d_a_player_main.cpp @@ -20,6 +20,8 @@ #include "d/actor/d_a_itembase.h" #include "d/d_item_data.h" #include "d/d_item.h" +#include "m_Do/m_Do_mtx.h" +#include "d/d_material.h" const daPy_lk_c::TexAnmTableEntry daPy_lk_c::mTexAnmIndexTable[] = { {LKANM_BTP_TMABAA, LKANM_BTK_TMABA}, @@ -2427,8 +2429,14 @@ BOOL daPy_lk_c::itemTrigger() const { } /* 80103214-80103258 .text getReadyItem__9daPy_lk_cFv */ -void daPy_lk_c::getReadyItem() { - /* Nonmatching */ +u8 daPy_lk_c::getReadyItem() { + if (mLastUsedItemButtonIdx == 0) { + return dComIfGp_getSelectItem(0); + } else if (mLastUsedItemButtonIdx == 1) { + return dComIfGp_getSelectItem(1); + } else { + return dComIfGp_getSelectItem(2); + } } /* 80103258-801032E4 .text checkGroupItem__9daPy_lk_cFii */ @@ -2468,13 +2476,22 @@ BOOL daPy_lk_c::checkSetItemTrigger(int param_1, int param_2) { } /* 801033E4-80103450 .text auraJointCB0__9daPy_lk_cFi */ -void daPy_lk_c::auraJointCB0(int) { - /* Nonmatching */ +BOOL daPy_lk_c::auraJointCB0(int jntNo) { + mpYmgcs00Model->setAnmMtx(jntNo, mpCLModel->getAnmMtx(jntNo)); + mDoMtx_copy(mpCLModel->getAnmMtx(jntNo), j3dSys.mCurrentMtx); + return TRUE; } /* 80103450-80103494 .text daPy_auraCallback__FP7J3DNodei */ -static BOOL daPy_auraCallback(J3DNode*, int) { - /* Nonmatching */ +static BOOL daPy_auraCallback(J3DNode* node, int param_1) { + if (!param_1) { + J3DJoint* joint = static_cast(node); + s32 jntNo = joint->getJntNo(); + J3DModel* model = j3dSys.getModel(); + daPy_lk_c* i_this = reinterpret_cast(model->getUserArea()); + i_this->auraJointCB0(jntNo); + } + return TRUE; } /* 80103494-80103A88 .text jointBeforeCB__9daPy_lk_cFiP16J3DTransformInfoP10Quaternion */ @@ -2498,23 +2515,35 @@ static BOOL daPy_jointAfterCallback(u32 userArea, u16 param_1, J3DTransformInfo* } /* 80103C40-80103EE4 .text jointCB0__9daPy_lk_cFi */ -void daPy_lk_c::jointCB0(int) { +BOOL daPy_lk_c::jointCB0(int) { /* Nonmatching */ } /* 80103EE4-80103F28 .text daPy_jointCallback0__FP7J3DNodei */ -static BOOL daPy_jointCallback0(J3DNode*, int) { - /* Nonmatching */ +static BOOL daPy_jointCallback0(J3DNode* node, int param_1) { + if (!param_1) { + J3DJoint* joint = static_cast(node); + s32 jntNo = joint->getJntNo(); + J3DModel* model = j3dSys.getModel(); + daPy_lk_c* i_this = reinterpret_cast(model->getUserArea()); + i_this->jointCB0(jntNo); + } + return TRUE; } /* 80103F28-80104178 .text jointCB1__9daPy_lk_cFv */ -void daPy_lk_c::jointCB1() { +BOOL daPy_lk_c::jointCB1() { /* Nonmatching */ } /* 80104178-801041B4 .text daPy_jointCallback1__FP7J3DNodei */ -static BOOL daPy_jointCallback1(J3DNode*, int) { - /* Nonmatching */ +static BOOL daPy_jointCallback1(J3DNode* node, int param_1) { + if (!param_1) { + J3DModel* model = j3dSys.getModel(); + daPy_lk_c* i_this = reinterpret_cast(model->getUserArea()); + i_this->jointCB1(); + } + return TRUE; } /* 801041B4-801041EC .text setAnimeHeap__9daPy_lk_cFP12JKRSolidHeap */ @@ -2636,8 +2665,24 @@ BOOL daPy_lk_c::checkSightLine(f32, cXyz*) { } /* 80105814-80105910 .text setBootsModel__9daPy_lk_cFPP8J3DModel */ -void daPy_lk_c::setBootsModel(J3DModel**) { - /* Nonmatching */ +void daPy_lk_c::setBootsModel(J3DModel** pBootModels) { + u16 temp; + if (checkEquipHeavyBoots()) { + // TODO: add enum for link's joint numbers + pBootModels[0]->setAnmMtx(0x01, mpCLModel->getAnmMtx(0x26)); + pBootModels[1]->setAnmMtx(0x01, mpCLModel->getAnmMtx(0x21)); + temp = 2; + } else { + temp = 1; + } + + J3DModel* bootModel = pBootModels[0]; + bootModel->setAnmMtx(temp, mpCLModel->getAnmMtx(0x28)); + bootModel->setAnmMtx(temp+1, mpCLModel->getAnmMtx(0x27)); + + bootModel = pBootModels[1]; + bootModel->setAnmMtx(temp, mpCLModel->getAnmMtx(0x23)); + bootModel->setAnmMtx(temp+1, mpCLModel->getAnmMtx(0x22)); } /* 80105910-80106660 .text setItemModel__9daPy_lk_cFv */ @@ -2666,13 +2711,23 @@ void daPy_lk_c::setDrawHandModel() { } /* 80106BD0-80106C40 .text entryDLSetLight__9daPy_lk_cFP8J3DModelUl */ -void daPy_lk_c::entryDLSetLight(J3DModel*, u32) { - /* Nonmatching */ +void daPy_lk_c::entryDLSetLight(J3DModel* model, u32 param_2) { + g_env_light.setLightTevColorType(model, &mTevStr); + if (param_2 != 0) { + dMat_control_c::iceEntryDL(model, -1, NULL); + } else { + mDoExt_modelEntryDL(model); + } } /* 80106C40-80106CB0 .text updateDLSetLight__9daPy_lk_cFP8J3DModelUl */ -void daPy_lk_c::updateDLSetLight(J3DModel*, u32) { - /* Nonmatching */ +void daPy_lk_c::updateDLSetLight(J3DModel* model, u32 param_2) { + g_env_light.setLightTevColorType(model, &mTevStr); + if (param_2 != 0) { + dMat_control_c::iceUpdateDL(model, -1, NULL); + } else { + mDoExt_modelUpdateDL(model); + } } /* 80106CB0-80106D8C .text hideHatAndBackle__9daPy_lk_cFP11J3DMaterial */ @@ -3023,12 +3078,21 @@ void daPy_lk_c::makeItemType() { /* 8010CB70-8010CBC8 .text setScopeModel__9daPy_lk_cFv */ void daPy_lk_c::setScopeModel() { - /* Nonmatching */ + JKRHeap* oldHeap = setItemHeap(); + initModel(&mpHeldItemModel, LINK_BDL_TELESCOPE, 0x37221222); + mDoExt_setCurrentHeap(oldHeap); } /* 8010CBC8-8010CC78 .text setPhotoBoxModel__9daPy_lk_cFv */ void daPy_lk_c::setPhotoBoxModel() { - /* Nonmatching */ + JKRHeap* oldHeap = setItemHeap(); + initModel(&mpHeldItemModel, LINK_BDL_CAMERA, 0x37221222); + mDoExt_setCurrentHeap(oldHeap); + if (mHeldItemType == CAMERA) { + mpHeldItemModel->getModelData()->getJointNodePointer(0x02)->getMesh()->getShape()->hide(); + } else { + mpHeldItemModel->getModelData()->getJointNodePointer(0x02)->getMesh()->getShape()->show(); + } } /* 8010CC78-8010CD34 .text changeDragonShield__9daPy_lk_cFi */ @@ -4404,8 +4468,8 @@ BOOL daPy_lk_c::createHeap() { tmp_modelData = initModel(&mpYmsls00Model, LINK_BDL_YMSLS00, 0x13000222); mpYmsls00Btk = entryBtk(tmp_modelData, LINK_BTK_YMSLS00); - tmp_modelData = initModel(&mpHbootsModelRightFoot, LINK_BDL_HBOOTS, 0x37221222); - tmp_modelData = initModel(&mpHbootsModelLeftFoot, LINK_BDL_HBOOTS, 0x37221222); + tmp_modelData = initModel(&mpHbootsModels[0], LINK_BDL_HBOOTS, 0x37221222); + tmp_modelData = initModel(&mpHbootsModels[1], LINK_BDL_HBOOTS, 0x37221222); tmp_modelData = initModel(&mpSuimenMunyaModel, LINK_BDL_SUIMEN_MUNYA, 0x11001222); mpSuimenMunyaBtk = entryBtk(tmp_modelData, LINK_BTK_SUIMEN_MUNYA); @@ -4465,7 +4529,7 @@ BOOL daPy_lk_c::createHeap() { mpGicer00Btk = entryBtk(tmp_modelData, LINK_BTK_GICER00); tmp_modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, LINK_BDL_GICER01); - JUT_ASSERT(21198, tmp_modelData != 0); + JUT_ASSERT(21205, tmp_modelData != 0); mpGicer01Btk = entryBtk(tmp_modelData, LINK_BTK_GICER01); const int numCLJoints = 0x2A; @@ -4824,17 +4888,15 @@ int phase_2(daPy_lk_c* i_this) { /* 80125DB4-80126F00 .text __ct__9daPy_lk_cFv */ daPy_lk_c::daPy_lk_c() { - /* Nonmatching */ } /* 80126F00-8012704C .text __dt__15daPy_footData_cFv */ daPy_footData_c::~daPy_footData_c() { - /* Nonmatching */ } /* 8012704C-80127160 .text __ct__15daPy_footData_cFv */ daPy_footData_c::daPy_footData_c() { - /* Nonmatching */ + /* Nonmatching - regalloc */ } /* 80127160-80127B50 .text makeBgWait__9daPy_lk_cFv */ @@ -4968,7 +5030,44 @@ void daPy_lk_c::resetActAnimeUpper(daPy_lk_c::daPy_UPPER, f32) { /* 801286C0-801287E8 .text animeUpdate__9daPy_lk_cFv */ void daPy_lk_c::animeUpdate() { - /* Nonmatching */ + J3DAnmTransform* underPack0 = getNowAnmPackUnder(UNDER_UNK0); + J3DAnmTransform* underPack1 = getNowAnmPackUnder(UNDER_UNK1); + J3DAnmTransform* upperPack0 = getNowAnmPackUpper(UPPER_UNK0); + J3DAnmTransform* upperPack1 = getNowAnmPackUpper(UPPER_UNK1); + mFrameCtrlUnder[UNDER_UNK0].update(); + underPack0->setFrame(mFrameCtrlUnder[UNDER_UNK0].getFrame()); + if (underPack1) { + mFrameCtrlUnder[UNDER_UNK1].update(); + underPack1->setFrame(mFrameCtrlUnder[UNDER_UNK1].getFrame()); + } + if (upperPack0 && upperPack0 != underPack0) { + mFrameCtrlUpper[UPPER_UNK0].update(); + upperPack0->setFrame(mFrameCtrlUpper[UPPER_UNK0].getFrame()); + } + if (upperPack1 && upperPack1 != underPack1) { + mFrameCtrlUpper[UPPER_UNK1].update(); + upperPack1->setFrame(mFrameCtrlUpper[UPPER_UNK1].getFrame()); + } + + // TODO: not sure if this is a fakematch or a bug, but the under array is length 2 and this accesses at index 2. + // so it's actually accessing index 0 of the next array (upper). + for (int i = 2; i < 2; i++) { + J3DAnmTransform* underPack2 = getNowAnmPackUnder((daPy_UNDER)i); + if (underPack2) { + mFrameCtrlUnder[i].update(); + underPack2->setFrame(mFrameCtrlUnder[i].getFrame()); + } + } + + J3DAnmTransform* upperPack2 = getNowAnmPackUpper(UPPER_UNK2); + if (upperPack2) { + mFrameCtrlUpper[UPPER_UNK2].update(); + upperPack2->setFrame(mFrameCtrlUpper[UPPER_UNK2].getFrame()); + } + + if (m2EAC) { + m2EAC->play(NULL, 0, 0); + } } /* 801287E8-8012887C .text simpleAnmPlay__9daPy_lk_cFP10J3DAnmBase */