From 6d078a7eebbc88bbb926012c413fbe4ee442f317 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Mon, 1 Jul 2024 21:49:56 -0700 Subject: [PATCH] d_wind_arrow work --- include/d/d_wind_arrow.h | 21 +++++- src/d/d_wind_arrow.cpp | 156 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 163 insertions(+), 14 deletions(-) diff --git a/include/d/d_wind_arrow.h b/include/d/d_wind_arrow.h index f71882896..0ed605e74 100644 --- a/include/d/d_wind_arrow.h +++ b/include/d/d_wind_arrow.h @@ -2,14 +2,31 @@ #define D_WIND_ARROW_H #include "dolphin/types.h" +#include "f_op/f_op_kankyo.h" +#include "m_Do/m_Do_ext.h" -class dWindArrow_c { +class JKRSolidHeap; +class J3DModel; + +class dWindArrow_modelInfo_c { public: + /* 0x0FC */ J3DModel* mpModel; + /* 0x100 */ mDoExt_invisibleModel mInvisibleModel; + /* 0x108 */ mDoExt_btkAnm mBtkAnm; +}; + +class dWindArrow_c : public kankyo_class { +public: + inline ~dWindArrow_c(); inline s32 create(); inline BOOL execute(); BOOL createHeap(); void adjustHeap(); - BOOL draw(); + inline BOOL draw(); + +public: + /* 0x0F8 */ JKRSolidHeap* heap; + /* 0x0FC */ dWindArrow_modelInfo_c mModelInfo; }; #endif /* D_WIND_ARROW_H */ diff --git a/src/d/d_wind_arrow.cpp b/src/d/d_wind_arrow.cpp index ffe8a1bf1..302872f0a 100644 --- a/src/d/d_wind_arrow.cpp +++ b/src/d/d_wind_arrow.cpp @@ -4,44 +4,176 @@ // #include "d/d_wind_arrow.h" -#include "f_op/f_op_kankyo.h" +#include "d/d_kankyo_wether.h" +#include "d/d_procname.h" +#include "d/res/res_always.h" +#include "m_Do/m_Do_graphic.h" +#include "f_op/f_op_kankyo_mng.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "dolphin/os/OSCache.h" + +dWindArrow_c::~dWindArrow_c() { + mDoExt_destroySolidHeap(heap); +} /* 8023E3C4-8023E420 .text createHeap__12dWindArrow_cFv */ BOOL dWindArrow_c::createHeap() { - /* Nonmatching */ + if (heap == NULL) { + heap = mDoExt_createSolidHeapFromGameToCurrent(0, 0); + if (heap == NULL) + return FALSE; + } + + return TRUE; } /* 8023E420-8023E46C .text adjustHeap__12dWindArrow_cFv */ void dWindArrow_c::adjustHeap() { - /* Nonmatching */ + mDoExt_restoreCurrentHeap(); + if (mDoExt_adjustSolidHeap(heap) >= 0) + DCStoreRangeNoSync(heap->getStartAddr(), heap->getSize()); } /* 8023E46C-8023E48C .text dWindArrow_Draw__FP12dWindArrow_c */ -static void dWindArrow_Draw(dWindArrow_c*) { - /* Nonmatching */ +static BOOL dWindArrow_Draw(dWindArrow_c* i_this) { + return i_this->draw(); } /* 8023E48C-8023E6F4 .text draw__12dWindArrow_cFv */ BOOL dWindArrow_c::draw() { /* Nonmatching */ + if (mModelInfo.mBtkAnm.getPlaySpeed() == 0.0f) + return; + + if (!dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) + return; + + if (!dComIfGp_event_runCheck()) + return; + + if (!dComIfGp_checkPlayerStatus1(0, daPyStts1_WIND_WAKER_CONDUCT_e)) + return; + + static cXyz l_offsetPos(0.0f, 40.0f, -250.0f); + static cXyz l_scale(0.85f, 0.85f, 0.85f); + + Mtx mtx; + fopAc_ac_c* ac = (fopAc_ac_c*)mParam; + mDoMtx_stack_c::transS(ac->current.pos); + mDoMtx_stack_c::YrotM(ac->shape_angle.y); + mDoMtx_copy(mDoMtx_stack_c::get(), mtx); + cXyz* windVec = dKyw_get_wind_vec(); + s16 windAngle = cM_atan2s(windVec->x, windVec->z); + + Mtx rotMtx; + mDoMtx_stack_c::YrotS(windAngle); + mDoMtx_copy(mDoMtx_stack_c::get(), rotMtx); + + mModelInfo.mpModel->setBaseScale(l_scale); + cXyz offs; + mDoMtx_multVec(mtx, &l_offsetPos, &offs); + rotMtx[0][3] = offs.x; + rotMtx[1][3] = offs.y; + rotMtx[2][3] = offs.z; + mModelInfo.mpModel->setBaseTRMtx(rotMtx); + + mModelInfo.mBtkAnm.entry(mModelInfo.mpModel->getModelData()); + if (mDoGph_gInf_c::isMonotone()) { + dComIfGd_setListP1(); + } else { + dComIfGd_setListMaskOff(); + } + + mDoExt_modelUpdateDL(mModelInfo.mpModel); + dComIfGd_setList(); + mModelInfo.mInvisibleModel.entryMaskOff(); + mModelInfo.mBtkAnm.remove(mModelInfo.mpModel->getModelData()); + + return TRUE; +} + +BOOL dWindArrow_c::execute() { + mModelInfo.mBtkAnm.setPlaySpeed(*dKyw_get_wind_power()); + mModelInfo.mBtkAnm.play(); + return TRUE; } /* 8023E6F4-8023E738 .text dWindArrow_Execute__FP12dWindArrow_c */ -static void dWindArrow_Execute(dWindArrow_c*) { - /* Nonmatching */ +static BOOL dWindArrow_Execute(dWindArrow_c* i_this) { + return i_this->execute(); } /* 8023E738-8023E740 .text dWindArrow_IsDelete__FP12dWindArrow_c */ -static void dWindArrow_IsDelete(dWindArrow_c*) { - /* Nonmatching */ +static BOOL dWindArrow_IsDelete(dWindArrow_c* i_this) { + return TRUE; } /* 8023E740-8023E7A8 .text dWindArrow_Delete__FP12dWindArrow_c */ -static void dWindArrow_Delete(dWindArrow_c*) { +static BOOL dWindArrow_Delete(dWindArrow_c* i_this) { + i_this->~dWindArrow_c(); + return TRUE; +} + +s32 dWindArrow_c::create() { /* Nonmatching */ + if (!createHeap()) + return cPhs_ERROR_e; + + new(this) dWindArrow_c(); + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Always", ALWAYS_BDL_YA); + JUT_ASSERT(0x56, modelData != NULL); + + s32 ret; + + mModelInfo.mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x200); + if (mModelInfo.mpModel == NULL) { + ret = cPhs_ERROR_e; + goto out; + } + + if (!mModelInfo.mInvisibleModel.create(mModelInfo.mpModel)) { + ret = cPhs_ERROR_e; + goto out; + } + + J3DAnmTextureSRTKey* anm = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes("Always", ALWAYS_BTK_YA); + JUT_ASSERT(0x65, anm != NULL); + + if (!mModelInfo.mBtkAnm.init(modelData, anm, TRUE, J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, false, 0)) { + ret = cPhs_ERROR_e; + goto out; + } + + ret = cPhs_COMPLEATE_e; + +out: + adjustHeap(); + return ret; } /* 8023E7A8-8023E968 .text dWindArrow_Create__FP12kankyo_class */ -static void dWindArrow_Create(kankyo_class*) { - /* Nonmatching */ +static s32 dWindArrow_Create(kankyo_class* i_k) { + return ((dWindArrow_c*)i_k)->create(); } + +kankyo_method_class l_dWindArrow_Method = { + (process_method_func)dWindArrow_Create, + (process_method_func)dWindArrow_Delete, + (process_method_func)dWindArrow_Execute, + (process_method_func)dWindArrow_IsDelete, + (process_method_func)dWindArrow_Draw, +}; + +kankyo_process_profile_definition g_profile_WIND_ARROW = { + fpcLy_CURRENT_e, + 2, + fpcPi_CURRENT_e, + PROC_WIND_ARROW, + &g_fpcLf_Method.base, + sizeof(dWindArrow_c), + 0, + 0, + &g_fopKy_Method, + 0x01CC, + &l_dWindArrow_Method, +};