From 1038ef6ba3feef0331ef191b54eac5b199a79a87 Mon Sep 17 00:00:00 2001 From: Franklyn Tackitt Date: Tue, 20 Feb 2024 16:18:56 -0700 Subject: [PATCH 1/5] (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, +}; From 93ee2acd21ac87d1eee97d6ab0f516055fd9ff33 Mon Sep 17 00:00:00 2001 From: Franklyn Tackitt Date: Wed, 21 Feb 2024 14:35:12 -0700 Subject: [PATCH 2/5] Remove comments and cleanup for the PR --- include/d/actor/d_a_ikari.h | 2 +- src/d/actor/d_a_ikari.cpp | 32 ++++++++++++++------------------ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/include/d/actor/d_a_ikari.h b/include/d/actor/d_a_ikari.h index a9025f165..ab1cba39a 100644 --- a/include/d/actor/d_a_ikari.h +++ b/include/d/actor/d_a_ikari.h @@ -10,7 +10,7 @@ public: daObjIkariHIO_c() { unk[0] = 0; unk[1] = 0; - mWindPowerScale = 0.1; + mWindPowerScale = 0.1f; } virtual ~daObjIkariHIO_c(){}; diff --git a/src/d/actor/d_a_ikari.cpp b/src/d/actor/d_a_ikari.cpp index 2a628f6d5..553258261 100644 --- a/src/d/actor/d_a_ikari.cpp +++ b/src/d/actor/d_a_ikari.cpp @@ -35,8 +35,8 @@ void daIkari_c::setMtx() { 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])); + J3DModelData* modelData = + static_cast(dComIfG_getObjectRes(M_arcname, ikari_bdl[mModelType])); JUT_ASSERT(0x7e, modelData != 0); mpModel = mDoExt_J3DModel__create(modelData, 0x00080000, 0x11000022); @@ -58,14 +58,13 @@ void daIkari_c::getArg() { } if (mEnvType == 0xff) { - mScale.x = 1.0; - mScale.y = 1.0; - mScale.z = 1.0; - return; + mScale.x = 1.0f; + mScale.y = 1.0f; + mScale.z = 1.0f; } else if (mEnvType == 0x01) { - mScale.x = 1.27; - mScale.y = 1.27; - mScale.z = 1.27; + mScale.x = 1.27f; + mScale.y = 1.27f; + mScale.z = 1.27f; } } @@ -110,7 +109,7 @@ bool daIkari_c::_draw() { /* 00000494-000005B0 .text _create__9daIkari_cFv */ int daIkari_c::_create() { - int phase = dComIfG_resLoad(&mPhs, daIkari_c::M_arcname); + int phase = dComIfG_resLoad(&mPhs, M_arcname); fopAcM_SetupActor(this, daIkari_c); @@ -133,9 +132,9 @@ int daIkari_c::_create() { /* maxX */ 160.0f * mScaleX, /* maxY */ 100.0f * mScaleX, /* maxZ */ 600.0f * mScaleX); - fopAcM_setCullSizeFar(this, 10.0); + fopAcM_setCullSizeFar(this, 10.0f); - mTimer = (short)(int)cM_rndF(32768.0); + mTimer = (short)(int)cM_rndF(32768.0f); } } @@ -151,24 +150,21 @@ bool daIkari_c::_delete() { /* 000005E0-00000600 .text daIkariCreate__FPv */ static s32 daIkariCreate(void* i_this) { return ((daIkari_c*)i_this)->_create(); - /* Nonmatching */ } /* 00000600-00000624 .text daIkariDelete__FPv */ static BOOL daIkariDelete(void* i_this) { - return ((daIkari_c*)i_this)->_delete() & 0xff; - /* Nonmatching */ + return ((daIkari_c*)i_this)->_delete(); } /* 00000624-00000648 .text daIkariExecute__FPv */ static BOOL daIkariExecute(void* i_this) { - return ((daIkari_c*)i_this)->_execute() & 0xff; - /* Nonmatching */ + return ((daIkari_c*)i_this)->_execute(); } /* 00000648-0000066C .text daIkariDraw__FPv */ static BOOL daIkariDraw(void* i_this) { - return ((daIkari_c*)i_this)->_draw() & 0xff; + return ((daIkari_c*)i_this)->_draw(); } /* 0000066C-00000674 .text daIkariIsDelete__FPv */ From 87fd22d3150288e1e50d9b93a9c7571c134be5a5 Mon Sep 17 00:00:00 2001 From: Franklyn Tackitt Date: Wed, 21 Feb 2024 17:11:11 -0700 Subject: [PATCH 3/5] I know its a BOOL return, but... return TRUE/FALSE/_createHeap() generates non-matching code but just return; works with no warnings not great, but it works --- src/d/actor/d_a_ikari.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/d/actor/d_a_ikari.cpp b/src/d/actor/d_a_ikari.cpp index 553258261..aadef8cea 100644 --- a/src/d/actor/d_a_ikari.cpp +++ b/src/d/actor/d_a_ikari.cpp @@ -16,6 +16,7 @@ const char daIkari_c::M_arcname[6] = "Ikari"; /* 000000EC-0000010C .text createHeap_CB__FP10fopAc_ac_c */ static BOOL createHeap_CB(fopAc_ac_c* i_this) { ((daIkari_c*)i_this)->_createHeap(); + return; } /* 0000010C-000001C4 .text setMtx__9daIkari_cFv */ From bb203d5fe619c83deb20db8e338c654e21697237 Mon Sep 17 00:00:00 2001 From: Franklyn Tackitt Date: Wed, 21 Feb 2024 18:38:32 -0700 Subject: [PATCH 4/5] retype _createHeap and createHeap_CB Fixes the return on createHeap_CB Matching! --- include/d/actor/d_a_ikari.h | 2 +- src/d/actor/d_a_ikari.cpp | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/include/d/actor/d_a_ikari.h b/include/d/actor/d_a_ikari.h index ab1cba39a..924cce45d 100644 --- a/include/d/actor/d_a_ikari.h +++ b/include/d/actor/d_a_ikari.h @@ -22,7 +22,7 @@ public: class daIkari_c : public fopAc_ac_c { public: void setMtx(); - bool _createHeap(); + BOOL _createHeap(); void getArg(); bool _execute(); bool _draw(); diff --git a/src/d/actor/d_a_ikari.cpp b/src/d/actor/d_a_ikari.cpp index aadef8cea..aa110df62 100644 --- a/src/d/actor/d_a_ikari.cpp +++ b/src/d/actor/d_a_ikari.cpp @@ -14,9 +14,8 @@ 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* i_this) { - ((daIkari_c*)i_this)->_createHeap(); - return; +static int createHeap_CB(fopAc_ac_c* i_this) { + return ((daIkari_c*)i_this)->_createHeap(); } /* 0000010C-000001C4 .text setMtx__9daIkari_cFv */ @@ -33,7 +32,7 @@ void daIkari_c::setMtx() { } /* 000001C4-00000290 .text _createHeap__9daIkari_cFv */ -bool daIkari_c::_createHeap() { +BOOL daIkari_c::_createHeap() { static int ikari_bdl[5] = {0x03, 0x03, 0x03, 0x04, 0x05}; J3DModelData* modelData = From 48b3d4f31cff03b3de49410f0c9c7ecebe369bae Mon Sep 17 00:00:00 2001 From: Franklyn Tackitt Date: Wed, 21 Feb 2024 18:39:31 -0700 Subject: [PATCH 5/5] We don't actually need nosyminline for ikari --- configure.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.py b/configure.py index c5e2e267c..89384ad31 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(Matching, "d_a_ikari", extra_cflags=['-pragma "nosyminline on"']), + ActorRel(Matching, "d_a_ikari"), ActorRel(NonMatching, "d_a_jbo"), ActorRel(Matching, "d_a_kaji"), ActorRel(NonMatching, "d_a_kanban"),