diff --git a/include/d/actor/d_a_boko.h b/include/d/actor/d_a_boko.h index 4f5015348..e28ea5eab 100644 --- a/include/d/actor/d_a_boko.h +++ b/include/d/actor/d_a_boko.h @@ -9,12 +9,18 @@ #include "m_Do/m_Do_ext.h" #include "SSystem/SComponent/c_phase.h" +class dBgS_ObjLinChk; + struct ke_c_s { }; class daBoko_c : public fopAc_ac_c { public: + typedef BOOL (daBoko_c::*ProcFunc_t)(); + + daBoko_c(); + static Vec m_top_offset[6]; static Vec m_blur_root_offset[6]; static Vec m_root_offset[6]; @@ -25,50 +31,54 @@ public: static f32 m_blur_rate[6]; static u8 m_se_type[6]; + static dBgS_ObjGndChk m_ground_check; + static dBgS_ObjLinChk m_line_check; + + f32 getCpsR() { return m_cps_r[fopAcM_GetParam(this)]; } s32 getAtPoint() { return m_at_point[fopAcM_GetParam(this)]; } u32 getAtType() { return m_at_type[fopAcM_GetParam(this)]; } - void getBlurRate() {} - f32 getCpsR() { return m_cps_r[fopAcM_GetParam(this)]; } - void getFlameTimer() {} - void getJumpBlurRate() {} - void getNowMode() {} + f32 getJumpBlurRate() { return m_jump_blur_rate[fopAcM_GetParam(this)]; } + f32 getBlurRate() { return m_blur_rate[fopAcM_GetParam(this)]; } u8 getSeType() { return m_se_type[fopAcM_GetParam(this)]; } + + void getFlameTimer() {} + void getNowMode() {} + void setNowMode(int) {} void moveStateInit(f32 speedForward, f32 speedY, s16 angleY) { speed.y = speedY; speedF = speedForward; current.angle.y = angleY; } - void onFloorFlg() {} + void onFloorFlg() {} // maybe: m2BC = 1; void setMatrix(Mtx mtx) { if (mpModel) { mpModel->setBaseTRMtx(mtx); } } - void setNowMode(int) {} void setRotAngleSpeed(s16 speed) { m2C2 = speed; } - void setThrow(s16) {} + void setThrow(s16) {} // maybe m2BA - void getTopPos(cXyz *); - void getBlurRootPos(cXyz *); + void getTopPos(cXyz*); + void getBlurRootPos(cXyz*); void keDraw(); void keCalc1(ke_c_s*, int); void keCalc(); BOOL draw(); void setTopRootPos(int); void setBaseMatrix(); - void checkNoDraw(); + BOOL checkNoDraw(); void setFlameEffect(); void setRoomInfo(); - void setThrowReverse(short); - void procWait_init(); - void procWait(); - void procMove_init(); - void procMove(); - void procThrow(); - void procCarry(); + void setThrowReverse(s16); + BOOL procWait_init(); + BOOL procWait(); + BOOL procMove_init(); + BOOL procMove(); + BOOL procThrow(); + BOOL procCarry(); BOOL execute(); void bokoDelete(); - void createHeap(); + BOOL createHeap(); s32 create(); public: @@ -77,7 +87,7 @@ public: /* 0x29C */ mDoExt_brkAnm mBrkAnm; /* 0x2B4 */ u8 m2B4[0x2B8 - 0x2B4]; /* 0x2B8 */ u8 mCurrentAction; - /* 0x2B9 */ u8 m2B9[0x2BA - 0x2B9]; + /* 0x2B9 */ u8 m2B9; /* 0x2BA */ u8 m2BA; /* 0x2BB */ u8 m2BB; /* 0x2BC */ u8 m2BC; @@ -87,14 +97,15 @@ public: /* 0x2C4 */ s16 m2C4; /* 0x2C6 */ u8 m2C6[0x2C8 - 0x2C6]; /* 0x2C8 */ s16 m2C8; - /* 0x2CA */ u8 m2CA[0x2D0 - 0x2CA]; + /* 0x2CA */ s16 m2CA; + /* 0x2CC */ u8 m2CC[0x2D0 - 0x2CC]; /* 0x2D0 */ cXyz m2D0; /* 0x2DC */ u8 m2DC[0x2F4 - 0x2DC]; /* 0x2F4 */ cXyz m2F4; /* 0x300 */ LIGHT_INFLUENCE mLight; /* 0x320 */ cXyz m320; /* 0x32C */ dPa_followEcallBack mParticleCallBack; - /* 0x340 */ dBgS_Acch mAcch; + /* 0x340 */ dBgS_ObjAcch mAcch; /* 0x504 */ dBgS_AcchCir mAcchCir; /* 0x544 */ dCcD_Stts mStts; /* 0x580 */ dCcD_Sph mSph; @@ -103,7 +114,13 @@ public: /* 0x7E8 */ Mtx mAlphaModelMtx[2]; /* 0x848 */ u8 m848[0x8A8 - 0x848]; /* 0x8A8 */ mDoExt_3DlineMat0_c* mpLineMat; - /* 0x8AC */ int (daBoko_c::*mCurrentProc)(); + /* 0x8AC */ ProcFunc_t mCurrentProc; +}; + +class daBoko_HIO_c0 { +public: + static const s16 throw_timer; + static const f32 throw_speed; }; #endif /* D_A_BOKO_H */ diff --git a/include/d/actor/d_a_player_main.h b/include/d/actor/d_a_player_main.h index 22caed380..edef6758e 100644 --- a/include/d/actor/d_a_player_main.h +++ b/include/d/actor/d_a_player_main.h @@ -1052,7 +1052,7 @@ public: void resetCurse(); void checkLightHit(); void setSwordAtCollision(); - void getBlurTopRate(); + f32 getBlurTopRate(); void setCollision(); void setAttentionPos(); int setRoomInfo(); diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 02c73f0e7..0b1e6f6ba 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -38,6 +38,7 @@ class J2DOrthoGraph; enum daPy__PlayerStatus0 { daPyStts0_UNK1_e = 0x00000001, daPyStts0_UNK10_e = 0x00000010, + daPyStts0_UNK80_e = 0x00000080, daPyStts0_UNK100_e = 0x00000100, daPyStts0_BOW_AIM_e = 0x00001000, daPyStts0_SWORD_SWING_e = 0x00008000, diff --git a/src/d/actor/d_a_boko.cpp b/src/d/actor/d_a_boko.cpp index 117423d84..4aa4b0d22 100644 --- a/src/d/actor/d_a_boko.cpp +++ b/src/d/actor/d_a_boko.cpp @@ -4,12 +4,24 @@ // #include "d/actor/d_a_boko.h" -#include "dolphin/types.h" #include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "d/d_bg_s_lin_chk.h" + +static u8 dummy_bss[0x4C]; + +static cXyz l_break_particle_offset(0.0f, 0.0f, 30.0f); +dBgS_ObjGndChk daBoko_c::m_ground_check; +dBgS_ObjLinChk daBoko_c::m_line_check; + +const s16 daBoko_HIO_c0::throw_timer = 2; +const f32 daBoko_HIO_c0::throw_speed = 70.0f; + +static u8 l_HIO; /* 000000EC-0000017C .text keDraw__8daBoko_cFv */ void daBoko_c::keDraw() { - /* Nonmatching */ + mpLineMat->update(0xA, 1.25f, (GXColor){0xFF, 0x64, 0x00, 0xFF}, 2, &tevStr); dComIfGd_set3DlineMat(mpLineMat); } @@ -29,8 +41,8 @@ BOOL daBoko_c::draw() { } /* 00000DC4-00000DE4 .text daBoko_Draw__FP8daBoko_c */ -static BOOL daBoko_Draw(daBoko_c*) { - /* Nonmatching */ +static BOOL daBoko_Draw(daBoko_c* i_this) { + return i_this->draw(); } /* 00000DE4-00000EB0 .text setTopRootPos__8daBoko_cFi */ @@ -44,8 +56,8 @@ void daBoko_c::setBaseMatrix() { } /* 00000F60-00000FA4 .text checkNoDraw__8daBoko_cFv */ -void daBoko_c::checkNoDraw() { - /* Nonmatching */ +BOOL daBoko_c::checkNoDraw() { + return m2B9 || mCurrentAction == 4 || (mCurrentAction == 3 && dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK80_e)); } /* 00000FA4-00001340 .text setFlameEffect__8daBoko_cFv */ @@ -55,42 +67,150 @@ void daBoko_c::setFlameEffect() { /* 00001340-000013CC .text setRoomInfo__8daBoko_cFv */ void daBoko_c::setRoomInfo() { - /* Nonmatching */ + int roomNo; + if (mAcch.GetGroundH() != -1e9f) { + roomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd); + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd); + } else { + roomNo = dComIfGp_roomControl_getStayNo(); + } + current.roomNo = tevStr.mRoomNo = roomNo; + mStts.SetRoomId(roomNo); } /* 000013CC-0000155C .text setThrowReverse__8daBoko_cFs */ -void daBoko_c::setThrowReverse(short) { +void daBoko_c::setThrowReverse(s16) { /* Nonmatching */ } /* 0000155C-000015E0 .text procWait_init__8daBoko_cFv */ -void daBoko_c::procWait_init() { - /* Nonmatching */ +BOOL daBoko_c::procWait_init() { + speedF = 0.0f; + m2C0 = 0; + m2C2 = 0; + mCurrentProc = &daBoko_c::procWait; + cLib_onBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + mCurrentAction = 0; + fopAcM_cancelCarryNow(this); + gravity = -3.0f; + return TRUE; } /* 000015E0-000016E4 .text procWait__8daBoko_cFv */ -void daBoko_c::procWait() { - /* Nonmatching */ +BOOL daBoko_c::procWait() { + if (fopAcM_checkCarryNow(this)) { + gravity = 0.0f; + mCurrentProc = &daBoko_c::procCarry; + speedF = 0.0f; + speed = cXyz::Zero; + if (mCurrentAction != 3) { + mCurrentAction = 2; + } + cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + m2BC = 0; + procCarry(); + } else if (m2BC == 0) { + fopAcM_posMoveF(this, NULL); + mAcch.CrrPos(*dComIfG_Bgsp()); + if (!mAcch.ChkGroundHit()) { + procMove_init(); + } + setRoomInfo(); + setBaseMatrix(); + } + return TRUE; } /* 000016E4-0000175C .text procMove_init__8daBoko_cFv */ -void daBoko_c::procMove_init() { - /* Nonmatching */ +BOOL daBoko_c::procMove_init() { + mCurrentProc = &daBoko_c::procMove; + mCurrentAction = 1; + fopAcM_setCarryNow(this, FALSE); + cLib_offBit(attention_info.flags, fopAc_Attn_ACTION_CARRY_e); + m2BB = 0x14; + m2BC = 0; + return TRUE; } /* 0000175C-00001E94 .text procMove__8daBoko_cFv */ -void daBoko_c::procMove() { +BOOL daBoko_c::procMove() { /* Nonmatching */ } /* 00001E94-000021B8 .text procThrow__8daBoko_cFv */ -void daBoko_c::procThrow() { +BOOL daBoko_c::procThrow() { /* Nonmatching */ } /* 000021B8-00002624 .text procCarry__8daBoko_cFv */ -void daBoko_c::procCarry() { - /* Nonmatching */ +BOOL daBoko_c::procCarry() { + if (fopAcM_checkCarryNow(this) || m2BA == 0) { + mDoMtx_multVecZero(mpModel->getBaseTRMtx(), ¤t.pos); + mDoMtx_MtxToRot(mpModel->getBaseTRMtx(), &shape_angle); + } + fopAc_ac_c* link = dComIfGp_getLinkPlayer(); + cXyz linkFootPos(link->current.pos.x, link->current.pos.y + 5.0f, link->current.pos.z); + if (!fopAcM_checkCarryNow(this)) { + fopAcM_setCarryNow(this, FALSE); + setTopRootPos(1); + if (m2BA != 0) { + mCurrentProc = &daBoko_c::procThrow; + mCurrentAction = 6; + gravity = 0.0f; + shape_angle.x = m2CA; + shape_angle.y = link->shape_angle.y; + current.angle.y = shape_angle.y; + speedF = 70.0f * cM_scos(shape_angle.x); + speed.y = -70.0f * cM_ssin(shape_angle.x); + m2C8 = 2; + m2BA = 0; + mCps.ResetAtHit(); + m_line_check.Set(&linkFootPos, ¤t.pos, this); + if (dComIfG_Bgsp()->LineCross(&m_line_check)) { + current.pos = m_line_check.GetCross(); + cM3dGPla* triPla = dComIfG_Bgsp()->GetTriPla(m_line_check); + current.pos += *triPla->GetNP() * 10.0f; + setThrowReverse(cM_atan2s(triPla->GetNP()->x, triPla->GetNP()->z)); + } else { + procThrow(); + } + } else if (m2BC != 0) { + if (shape_angle.z >= 0x4000) { + shape_angle.z = 0; + shape_angle.x += 0x8000; + shape_angle.y += 0x8000; + } + procWait_init(); + } else { + current.angle.y = shape_angle.y + 0x8000; + if (mCurrentAction == 3) { + m_line_check.Set(&linkFootPos, ¤t.pos, this); + if (dComIfG_Bgsp()->LineCross(&m_line_check)) { + current.pos = m_line_check.GetCross(); + } + } + procMove_init(); + int i; + for (i = 0; i < 3; i++) { + m_ground_check.SetPos(¤t.pos); + if (dComIfG_Bgsp()->GroundCross(&m_ground_check) != -1e9f) { + break; + } + current.pos.x -= 50.0f * cM_ssin(shape_angle.y); + current.pos.z -= 50.0f * cM_scos(shape_angle.y); + } + if (i == 3) { + current.pos = linkFootPos; + current.pos.y = 50.0f; + } + old.pos = current.pos; + current.pos.y -= 5.0f; + m2C0 = 0; + gravity = -3.0f; + procMove(); + } + } + return TRUE; } /* 00002624-00002A04 .text execute__8daBoko_cFv */ @@ -99,13 +219,13 @@ BOOL daBoko_c::execute() { } /* 00002A04-00002A24 .text daBoko_Execute__FP8daBoko_c */ -static BOOL daBoko_Execute(daBoko_c*) { - /* Nonmatching */ +static BOOL daBoko_Execute(daBoko_c* i_this) { + return i_this->execute(); } /* 00002A24-00002A2C .text daBoko_IsDelete__FP8daBoko_c */ -static BOOL daBoko_IsDelete(daBoko_c*) { - /* Nonmatching */ +static BOOL daBoko_IsDelete(daBoko_c* i_this) { + return TRUE; } /* 00002A2C-00002AA4 .text bokoDelete__8daBoko_cFv */ @@ -114,26 +234,57 @@ void daBoko_c::bokoDelete() { } /* 00002AA4-00002AC8 .text daBoko_Delete__FP8daBoko_c */ -static BOOL daBoko_Delete(daBoko_c*) { - /* Nonmatching */ +static BOOL daBoko_Delete(daBoko_c* i_this) { + i_this->bokoDelete(); + return TRUE; } /* 00002AC8-00002AE8 .text daBoko_createHeap__FP10fopAc_ac_c */ -static BOOL daBoko_createHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL daBoko_createHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->createHeap(); } /* 00002AE8-00002CFC .text createHeap__8daBoko_cFv */ -void daBoko_c::createHeap() { +BOOL daBoko_c::createHeap() { /* Nonmatching */ } /* 00002DE4-00003154 .text create__8daBoko_cFv */ s32 daBoko_c::create() { /* Nonmatching */ + fopAcM_SetupActor(this, daBoko_c); +} + +/* 00003154-000032F0 .text __ct__8daBoko_cFv */ +daBoko_c::daBoko_c() { } /* 00003824-00003844 .text daBoko_Create__FP10fopAc_ac_c */ -static s32 daBoko_Create(fopAc_ac_c*) { - /* Nonmatching */ +static s32 daBoko_Create(fopAc_ac_c* i_this) { + return static_cast(i_this)->create(); } + +static actor_method_class l_daBoko_Method = { + (process_method_func)daBoko_Create, + (process_method_func)daBoko_Delete, + (process_method_func)daBoko_Execute, + (process_method_func)daBoko_IsDelete, + (process_method_func)daBoko_Draw, +}; + +actor_process_profile_definition g_profile_BOKO = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 9, + /* ListPrio */ fpcLy_CURRENT_e, + /* ProcName */ PROC_BOKO, + /* Proc SubMtd */ &g_fpcLf_Method.base, + /* Size */ sizeof(daBoko_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x01A0, + /* Actor SubMtd */ &l_daBoko_Method, + /* Status */ fopAcStts_CULL_e | fopAcStts_UNK4000_e | fopAcStts_UNK40000_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_CUSTOM_e, +}; diff --git a/src/d/actor/d_a_player_main.cpp b/src/d/actor/d_a_player_main.cpp index 7781e4bb8..eac248536 100644 --- a/src/d/actor/d_a_player_main.cpp +++ b/src/d/actor/d_a_player_main.cpp @@ -2844,8 +2844,33 @@ void daPy_lk_c::setSwordAtCollision() { } /* 8011D6C4-8011D788 .text getBlurTopRate__9daPy_lk_cFv */ -void daPy_lk_c::getBlurTopRate() { - /* Nonmatching */ +f32 daPy_lk_c::getBlurTopRate() { + if (mCurProc == daPyProc_DEMO_LAST_COMBO_e) { + return 0.0f; + } + + if (mHeldItemType == 0x103) { + if (checkNormalSwordEquip()) { + return 0.5f; + } else { + return 1.0f; + } + } + + if (mHeldItemType == 0x101) { + if (mActorKeepEquip.getActor() == NULL) { + return 0.0f; + } else { + daBoko_c* boko = (daBoko_c*)mActorKeepEquip.getActor(); + if (mCurProc == daPyProc_JUMP_CUT_e || mCurProc == daPyProc_JUMP_CUT_LAND_e) { + return boko->getJumpBlurRate(); + } else { + return boko->getBlurRate(); + } + } + } + + return 0.0f; } /* 8011D788-8011EC0C .text setCollision__9daPy_lk_cFv */