summaryrefslogtreecommitdiff
path: root/src/d/d_wind_arrow.cpp
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2024-07-01 21:49:56 -0700
committerJasper St. Pierre <jstpierre@mecheye.net>2024-07-01 21:49:56 -0700
commit6d078a7eebbc88bbb926012c413fbe4ee442f317 (patch)
tree8504581d2450b3dba422f9ecf148bdc7e2a37f0b /src/d/d_wind_arrow.cpp
parent1e37c6cd2d868f969e0130dd3083dbf11a9551bd (diff)
d_wind_arrow work
Diffstat (limited to 'src/d/d_wind_arrow.cpp')
-rw-r--r--src/d/d_wind_arrow.cpp156
1 files changed, 144 insertions, 12 deletions
diff --git a/src/d/d_wind_arrow.cpp b/src/d/d_wind_arrow.cpp
index ffe8a1bf..302872f0 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,
+};