diff --git a/include/d/actor/d_a_obj_hat.h b/include/d/actor/d_a_obj_hat.h index 2c71ab0a9..04412e9d0 100644 --- a/include/d/actor/d_a_obj_hat.h +++ b/include/d/actor/d_a_obj_hat.h @@ -1,25 +1,49 @@ #ifndef D_A_OBJ_HAT_H #define D_A_OBJ_HAT_H +#include "SSystem/SComponent/c_phase.h" +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_ext.h" class daObjHat_c : public fopAc_ac_c { public: + enum Prm_e { + PRM_HAT_NO_W = 8, + PRM_HAT_NO_S = 0, + }; + daObjHat_c(); s32 _create(); - void createHeap(); - void createInit(); - bool _delete(); - bool _draw(); - bool _execute(); + BOOL createHeap(); + s32 createInit(); + BOOL _delete(); + BOOL _draw(); + BOOL _execute(); void executeNormal(); - void getPrmHatNo(); + u32 getPrmHatNo(); void setMtx(); void setSpeed(cXyz); public: + typedef void(daObjHat_c::*MoveFunc_t)(); + + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel* mpModel; + /* 0x29c */ mDoExt_McaMorf* mpMorf; + /* 0x2a0 */ Mtx mMtx; + + /* 0x2d0 */ dBgS_ObjAcch mAcch; + /* 0x494 */ dBgS_AcchCir mAcchCir; + /* 0x4d4 */ dCcD_Stts mStts; + /* 0x510 */ dCcD_Cyl mCyl; + + /* 0x640 */ cXyz mMoveNorm; + /* 0x64c */ u8 mState; + /* 0x64d */ u8 mHatNo; /* Place member variables here */ -}; +}; /* size: 0x650 */ #endif /* D_A_OBJ_HAT_H */ diff --git a/src/d/actor/d_a_obj_hat.cpp b/src/d/actor/d_a_obj_hat.cpp index ed1b50075..6b306d106 100644 --- a/src/d/actor/d_a_obj_hat.cpp +++ b/src/d/actor/d_a_obj_hat.cpp @@ -4,91 +4,239 @@ // #include "d/actor/d_a_obj_hat.h" +#include "d/actor/d_a_npc_roten.h" +#include "d/d_a_obj.h" +#include "d/d_com_inf_game.h" +#include "d/d_kankyo.h" #include "d/d_procname.h" +#include "d/res/res_ro.h" +#include "JSystem/J3DGraphAnimator/J3DModel.h" + +static const int l_bmd_ix_tbl[] = {RO_BDL_RO_HAT, RO_BDL_RO_HAT2, RO_BDL_RO_HAT3, RO_BDL_RO_HAT}; +static const int l_bck_ix_tbl[] = {RO_BCK_HAT_WID, RO_BCK_HAT2_WIND, RO_BCK_HAT3_WID, + RO_BCK_HAT_WID}; +static dCcD_SrcCyl l_cyl_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_WIND, + /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsEnemy_e, + /* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsOther_e | cCcD_CoSPrm_VsGrpAll_e, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e | dCcG_TgSPrm_NoConHit_e, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGCylS + { + /* Center */ 0.0f, + 0.0f, + 0.0f, + /* Radius */ 70.0f, + /* Height */ 80.0f, + }, +}; + + /* 00000078-00000184 .text __ct__10daObjHat_cFv */ daObjHat_c::daObjHat_c() { - /* Nonmatching */ + u32 hatno = getPrmHatNo(); + mHatNo = hatno; + mState = 0; } /* 000003AC-000003CC .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* actor) { + return ((daObjHat_c*)actor)->createHeap(); } /* 000003CC-0000045C .text _create__10daObjHat_cFv */ s32 daObjHat_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daObjHat_c); + + int phase_state = dComIfG_resLoad(&mPhs, "Ro"); + + if (phase_state == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(this, &CheckCreateHeap, 0uL)) { + phase_state = createInit(); + } else { + phase_state = cPhs_ERROR_e; + } + } + return phase_state; } /* 0000045C-000005D4 .text createHeap__10daObjHat_cFv */ -void daObjHat_c::createHeap() { - /* Nonmatching */ +BOOL daObjHat_c::createHeap() { + J3DModelData* pModelData = (J3DModelData*)dComIfG_getObjectIDRes("Ro", l_bmd_ix_tbl[mHatNo]); + if (pModelData == NULL) { + return FALSE; + } else { + mDoExt_McaMorf* morf = new mDoExt_McaMorf( + pModelData, NULL, NULL, + (J3DAnmTransformKey*)dComIfG_getObjectIDRes("Ro", l_bck_ix_tbl[mHatNo]), + J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, 1, NULL, 0x80000, 0x37441422); + + mpMorf = morf; + if (mpMorf == NULL || mpMorf->getModel() == NULL) { + return FALSE; + } else { + mpModel = mpMorf->getModel(); + mAcchCir.SetWall(30.0f, 30.0f); + mAcch.Set(fopAcM_GetPosition_p(this), + fopAcM_GetOldPosition_p(this), + this, + 1, + &mAcchCir, + fopAcM_GetSpeed_p(this), + fopAcM_GetAngle_p(this), + fopAcM_GetShapeAngle_p(this)); + return TRUE; + } + } + return FALSE; } /* 000005D4-000006AC .text createInit__10daObjHat_cFv */ -void daObjHat_c::createInit() { - /* Nonmatching */ +s32 daObjHat_c::createInit() { + mStts.Init(2, 0xff, this); + mCyl.Set(l_cyl_src); + mCyl.SetStts(&mStts); + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -50.0f, 0.0f, -50.0f, 50.0f, 200.0f, 50.0f); + gravity = -5.0f; + + fopAc_ac_c* parent; + if (fopAcM_SearchByID(fopAcM_GetLinkId(this), &parent) && (parent != NULL)) { + setSpeed(static_cast(parent)->getWindVec()); + } + + setMtx(); + return cPhs_COMPLEATE_e; } /* 000006AC-000006DC .text _delete__10daObjHat_cFv */ -bool daObjHat_c::_delete() { - /* Nonmatching */ +BOOL daObjHat_c::_delete() { + dComIfG_resDelete(&mPhs, "Ro"); + return TRUE; } /* 000006DC-0000073C .text _draw__10daObjHat_cFv */ -bool daObjHat_c::_draw() { - /* Nonmatching */ +BOOL daObjHat_c::_draw() { + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + mpMorf->updateDL(); + return TRUE; } +static daObjHat_c::MoveFunc_t moveProc[] = { + &daObjHat_c::executeNormal, +}; + + /* 0000073C-00000884 .text _execute__10daObjHat_cFv */ -bool daObjHat_c::_execute() { - /* Nonmatching */ +BOOL daObjHat_c::_execute() { + + (this->*moveProc[mState])(); + f32 xspeed = mMoveNorm.x * speedF; + f32 ymove = speed.y + gravity; + f32 zspeed = mMoveNorm.z * speedF; + + // because downwards vector quantity has negative value + if (ymove < fopAcM_GetMaxFallSpeed(this)) { + ymove = fopAcM_GetMaxFallSpeed(this); + } + fopAcM_SetSpeed(this, xspeed, ymove, zspeed); + + fopAcM_posMove(this, mStts.GetCCMoveP()); + mAcch.CrrPos(g_dComIfG_gameInfo.play.mBgS); + if (mAcch.ChkWallHit()) { + fopAcM_SetSpeedF(this, 0.0f); + } + if (mAcch.ChkGroundHit()) { + cLib_addCalc(&speedF, 0.0f, 0.3f, 1000.0f, 1.0f); + } + + mCyl.SetC(this->current.pos); + dComIfG_Ccsp()->Set(&mCyl); + if (mCyl.ChkTgHit()) { + setSpeed(*mCyl.GetTgRVecP()); + } + + setMtx(); + return TRUE; } /* 00000884-00000888 .text executeNormal__10daObjHat_cFv */ -void daObjHat_c::executeNormal() { - /* Nonmatching */ -} +void daObjHat_c::executeNormal() { } /* 00000888-000008B4 .text getPrmHatNo__10daObjHat_cFv */ -void daObjHat_c::getPrmHatNo() { - /* Nonmatching */ +u32 daObjHat_c::getPrmHatNo() { + return daObj::PrmAbstract(this, PRM_HAT_NO_W, PRM_HAT_NO_S) & 3; } /* 000008B4-00000964 .text setMtx__10daObjHat_cFv */ void daObjHat_c::setMtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, + current.pos.z); + + mDoMtx_stack_c::YrotM(current.angle.y + 0x4000); + mDoMtx_stack_c::XrotM(current.angle.x); + mDoMtx_stack_c::ZrotM(current.angle.z + 0x4000); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000964-00000A20 .text setSpeed__10daObjHat_cF4cXyz */ -void daObjHat_c::setSpeed(cXyz) { - /* Nonmatching */ +void daObjHat_c::setSpeed(cXyz speed) { + speed.y = 0; + speed = speed.normZP(); + + mMoveNorm = speed; + + fopAcM_SetSpeedF(this, 20.0f); + + speed.x *= 20.0f; + speed.y = 50.0f; + speed.z *= 20.0f; + + fopAcM_SetSpeed(this, speed.x, speed.y, speed.z); } /* 00000A20-00000A40 .text daSampleCreate__FPv */ -static s32 daSampleCreate(void*) { - /* Nonmatching */ +static s32 daSampleCreate(void* i_this) { + return static_cast(i_this)->_create(); } /* 00000A40-00000A60 .text daSampleDelete__FPv */ -static BOOL daSampleDelete(void*) { - /* Nonmatching */ +static BOOL daSampleDelete(void* i_this) { + return static_cast(i_this)->_delete(); } /* 00000A60-00000A80 .text daSampleExecute__FPv */ -static BOOL daSampleExecute(void*) { - /* Nonmatching */ +static BOOL daSampleExecute(void* i_this) { + return static_cast(i_this)->_execute(); } /* 00000A80-00000AA0 .text daSampleDraw__FPv */ -static BOOL daSampleDraw(void*) { - /* Nonmatching */ +static BOOL daSampleDraw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 00000AA0-00000AA8 .text daSampleIsDelete__FPv */ -static BOOL daSampleIsDelete(void*) { - /* Nonmatching */ +static BOOL daSampleIsDelete(void* i_this) { + return TRUE; } static actor_method_class daSampleMethodTable = {