mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-26 15:44:53 -04:00
d_wind_arrow work
This commit is contained in:
@@ -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 */
|
||||
|
||||
+144
-12
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user