From 1038ef6ba3feef0331ef191b54eac5b199a79a87 Mon Sep 17 00:00:00 2001 From: Franklyn Tackitt Date: Tue, 20 Feb 2024 16:18:56 -0700 Subject: [PATCH] (d_a_ikari) OK --- configure.py | 2 +- include/d/actor/d_a_ikari.h | 29 ++++-- src/d/actor/d_a_ikari.cpp | 171 +++++++++++++++++++++++++++++++----- 3 files changed, 173 insertions(+), 29 deletions(-) diff --git a/configure.py b/configure.py index 1b6110f8f..c5e2e267c 100644 --- a/configure.py +++ b/configure.py @@ -1232,7 +1232,7 @@ config.libs = [ ActorRel(Matching, "d_a_grass"), ActorRel(NonMatching, "d_a_hitobj"), ActorRel(Matching, "d_a_hot_floor", extra_cflags=['-pragma "nosyminline on"']), - ActorRel(NonMatching, "d_a_ikari"), + ActorRel(Matching, "d_a_ikari", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_jbo"), ActorRel(Matching, "d_a_kaji"), ActorRel(NonMatching, "d_a_kanban"), diff --git a/include/d/actor/d_a_ikari.h b/include/d/actor/d_a_ikari.h index 7b020c55c..a9025f165 100644 --- a/include/d/actor/d_a_ikari.h +++ b/include/d/actor/d_a_ikari.h @@ -1,18 +1,33 @@ #ifndef D_A_IKARI_H #define D_A_IKARI_H -#include "f_op/f_op_actor.h" #include "SSystem/SComponent/c_phase.h" +#include "f_op/f_op_actor.h" +#include "m_Do/m_Do_hostIO.h" + +class daObjIkariHIO_c : public mDoHIO_entry_c { +public: + daObjIkariHIO_c() { + unk[0] = 0; + unk[1] = 0; + mWindPowerScale = 0.1; + } + virtual ~daObjIkariHIO_c(){}; + +public: + /* 0x04 */ u8 unk[2]; + /* 0x08 */ f32 mWindPowerScale; +}; class daIkari_c : public fopAc_ac_c { public: void setMtx(); - void _createHeap(); + bool _createHeap(); void getArg(); - BOOL _execute(); - BOOL _draw(); - s32 _create(); - BOOL _delete(); + bool _execute(); + bool _draw(); + int _create(); + bool _delete(); public: /* 0x290 */ request_of_phase_process_class mPhs; @@ -21,6 +36,8 @@ public: /* 0x29D */ u8 mModelType; /* 0x29E */ u8 m29E[0x2A0 - 0x29E]; /* 0x2A0 */ int mTimer; + + static const char M_arcname[6]; }; #endif /* D_A_IKARI_H */ diff --git a/src/d/actor/d_a_ikari.cpp b/src/d/actor/d_a_ikari.cpp index 8d58c30d9..2a628f6d5 100644 --- a/src/d/actor/d_a_ikari.cpp +++ b/src/d/actor/d_a_ikari.cpp @@ -4,70 +4,197 @@ // #include "d/actor/d_a_ikari.h" -#include "dolphin/types.h" +#include "d/d_kankyo_wether.h" +#include "d/d_procname.h" +#include "d/d_s_play.h" +#include "m_Do/m_Do_mtx.h" + +daObjIkariHIO_c l_HIO; + +const char daIkari_c::M_arcname[6] = "Ikari"; /* 000000EC-0000010C .text createHeap_CB__FP10fopAc_ac_c */ -static BOOL createHeap_CB(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL createHeap_CB(fopAc_ac_c* i_this) { + ((daIkari_c*)i_this)->_createHeap(); } /* 0000010C-000001C4 .text setMtx__9daIkari_cFv */ void daIkari_c::setMtx() { - /* Nonmatching */ + mpModel->setBaseScale(mScale); + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::XrotM(current.angle.x); + mDoMtx_stack_c::YrotM(-shape_angle.y); + mDoMtx_stack_c::YrotM(current.angle.y); + + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 000001C4-00000290 .text _createHeap__9daIkari_cFv */ -void daIkari_c::_createHeap() { - /* Nonmatching */ +bool daIkari_c::_createHeap() { + static int ikari_bdl[5] = {0x03, 0x03, 0x03, 0x04, 0x05}; + + J3DModelData* modelData = static_cast( + dComIfG_getObjectRes(daIkari_c::M_arcname, ikari_bdl[mModelType])); + JUT_ASSERT(0x7e, modelData != 0); + mpModel = mDoExt_J3DModel__create(modelData, 0x00080000, 0x11000022); + + if (mpModel == NULL) { + return false; + } + return true; } /* 00000290-000002F8 .text getArg__9daIkari_cFv */ void daIkari_c::getArg() { - /* Nonmatching */ + u32 param = fopAcM_GetParam(this); + + mModelType = fopAcM_GetParamBit(param, 8, 16); + mEnvType = param; + + if (mModelType == 0xff) { + mModelType = 0; + } + + if (mEnvType == 0xff) { + mScale.x = 1.0; + mScale.y = 1.0; + mScale.z = 1.0; + return; + } else if (mEnvType == 0x01) { + mScale.x = 1.27; + mScale.y = 1.27; + mScale.z = 1.27; + } } /* 000002F8-000003CC .text _execute__9daIkari_cFv */ -BOOL daIkari_c::_execute() { - /* Nonmatching */ +bool daIkari_c::_execute() { + mTimer++; + + cXyz* windVec = dKyw_get_wind_vec(); + s16 windAngle = cM_atan2s(windVec->x, windVec->z); + f32* windPow = dKyw_get_wind_power(); + + shape_angle.y = windAngle; + + f32 rotX = *windPow * 10000.0f * l_HIO.mWindPowerScale; + + current.angle.x = + rotX + rotX * JMASSin(mTimer * (g_regHIO.mChild[0].mShortRegs[5] + 500) & 0xffff); + + setMtx(); + + return true; } /* 000003CC-00000494 .text _draw__9daIkari_cFv */ -BOOL daIkari_c::_draw() { - /* Nonmatching */ +bool daIkari_c::_draw() { + if (mEnvType == 1) { + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &mTevStr); + mTevStr.mColorC0.r = g_env_light.mActorC0.r; + mTevStr.mColorC0.g = g_env_light.mActorC0.g; + mTevStr.mColorC0.b = g_env_light.mActorC0.b; + mTevStr.mColorC0.a = g_env_light.mActorC0.a; + mTevStr.mColorK0.r = g_env_light.mActorK0.r; + mTevStr.mColorK0.g = g_env_light.mActorK0.g; + mTevStr.mColorK0.b = g_env_light.mActorK0.b; + } else { + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &mTevStr); + } + g_env_light.setLightTevColorType(mpModel, &mTevStr); + mDoExt_modelUpdateDL(mpModel); + return true; } /* 00000494-000005B0 .text _create__9daIkari_cFv */ -s32 daIkari_c::_create() { - /* Nonmatching */ +int daIkari_c::_create() { + int phase = dComIfG_resLoad(&mPhs, daIkari_c::M_arcname); + + fopAcM_SetupActor(this, daIkari_c); + + if (phase == cPhs_COMPLEATE_e) { + getArg(); + + if (!fopAcM_entrySolidHeap(this, createHeap_CB, 0xC20)) { + return cPhs_ERROR_e; + } else { + /* 00000524 00000618 4B FF FB E9 bl setMtx__9daIkari_cFv */ + setMtx(); + + f32 mScaleX = mScale.x; + + fopAcM_SetMtx(this, &mpModel->mBaseTransformMtx[0]); + fopAcM_setCullSizeBox(this, + /* minX */ -160.0f * mScaleX, + /* minY */ -2500.0f * mScaleX, + /* minZ */ -600.0f * mScaleX, + /* maxX */ 160.0f * mScaleX, + /* maxY */ 100.0f * mScaleX, + /* maxZ */ 600.0f * mScaleX); + fopAcM_setCullSizeFar(this, 10.0); + + mTimer = (short)(int)cM_rndF(32768.0); + } + } + + return phase; } /* 000005B0-000005E0 .text _delete__9daIkari_cFv */ -BOOL daIkari_c::_delete() { - /* Nonmatching */ +bool daIkari_c::_delete() { + dComIfG_resDelete(&mPhs, M_arcname); + return true; } /* 000005E0-00000600 .text daIkariCreate__FPv */ -static s32 daIkariCreate(void*) { +static s32 daIkariCreate(void* i_this) { + return ((daIkari_c*)i_this)->_create(); /* Nonmatching */ } /* 00000600-00000624 .text daIkariDelete__FPv */ -static BOOL daIkariDelete(void*) { +static BOOL daIkariDelete(void* i_this) { + return ((daIkari_c*)i_this)->_delete() & 0xff; /* Nonmatching */ } /* 00000624-00000648 .text daIkariExecute__FPv */ -static BOOL daIkariExecute(void*) { +static BOOL daIkariExecute(void* i_this) { + return ((daIkari_c*)i_this)->_execute() & 0xff; /* Nonmatching */ } /* 00000648-0000066C .text daIkariDraw__FPv */ -static BOOL daIkariDraw(void*) { - /* Nonmatching */ +static BOOL daIkariDraw(void* i_this) { + return ((daIkari_c*)i_this)->_draw() & 0xff; } /* 0000066C-00000674 .text daIkariIsDelete__FPv */ -static BOOL daIkariIsDelete(void*) { - /* Nonmatching */ +static BOOL daIkariIsDelete(void* i_this) { + return TRUE; } +static actor_method_class daIkariMethodTable = { + (process_method_func)daIkariCreate, (process_method_func)daIkariDelete, + (process_method_func)daIkariExecute, (process_method_func)daIkariIsDelete, + (process_method_func)daIkariDraw, +}; + +actor_process_profile_definition g_profile_IKARI = { + fpcLy_CURRENT_e, + 7, + fpcPi_CURRENT_e, + PROC_IKARI, + &g_fpcLf_Method.mBase, + sizeof(daIkari_c), + 0, + 0, + &g_fopAc_Method.base, + 0x019d, + &daIkariMethodTable, + fopAcStts_CULL_e | fopAcStts_NOCULLEXEC_e | fopAcStts_UNK4000_e | fopAcStts_UNK40000_e, + fopAc_ACTOR_e, + fopAc_CULLBOX_CUSTOM_e, +};