From cae7597086ba65ac5b0411ae0903abf6b5e45974 Mon Sep 17 00:00:00 2001 From: Maide <34639600+Kelebek1@users.noreply.github.com> Date: Sat, 23 Aug 2025 04:11:14 +0100 Subject: [PATCH] d_a_beam (#863) * d_a_beam * PR --- configure.py | 2 +- include/JSystem/JGeometry.h | 7 + include/d/actor/d_a_beam.h | 91 ++++- include/d/actor/d_a_hot_floor.h | 6 +- include/d/d_cc_d.h | 2 + include/d/res/res_ylesr00.h | 17 + src/d/actor/d_a_beam.cpp | 555 ++++++++++++++++++++++++++-- src/d/actor/d_a_hot_floor.cpp | 2 +- src/d/actor/d_a_obj_demo_barrel.cpp | 2 +- 9 files changed, 628 insertions(+), 56 deletions(-) diff --git a/configure.py b/configure.py index cdf5dc90d..54dbb077a 100755 --- a/configure.py +++ b/configure.py @@ -1483,7 +1483,7 @@ config.libs = [ ActorRel(Matching, "d_a_amiprop"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_arrow_iceeff"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_arrow_lighteff"), - ActorRel(NonMatching, "d_a_beam"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_beam"), ActorRel(NonMatching, "d_a_boko"), ActorRel(NonMatching, "d_a_canon"), ActorRel(NonMatching, "d_a_cc"), diff --git a/include/JSystem/JGeometry.h b/include/JSystem/JGeometry.h index 4860af4f9..9daa05236 100644 --- a/include/JSystem/JGeometry.h +++ b/include/JSystem/JGeometry.h @@ -42,8 +42,10 @@ struct TVec3 { TVec3() {} + template TVec3(const T x, const T y, const T z) { set(x, y, z); } + template void set(T x_, T y_, T z_) { x = x_; y = y_; @@ -82,12 +84,16 @@ struct TVec3 : public SVec { template <> struct TVec3 : public Vec { TVec3() {} + + template TVec3(const f32 x, const f32 y, const f32 z) { set(x, y, z); } + TVec3(const Vec& b) { set(b); } operator Vec*() { return (Vec*)&x; } operator const Vec*() const { return (Vec*)&x; } + template void set(const TVec3& other) { x = other.x; y = other.y; @@ -100,6 +106,7 @@ struct TVec3 : public Vec { z = vec.z; } + template void set(f32 x_, f32 y_, f32 z_) { x = x_; y = y_; diff --git a/include/d/actor/d_a_beam.h b/include/d/actor/d_a_beam.h index 1e7e0ad14..0e06f7664 100644 --- a/include/d/actor/d_a_beam.h +++ b/include/d/actor/d_a_beam.h @@ -2,46 +2,97 @@ #define D_A_BEAM_H #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_ext.h" +#include "d/d_cc_d.h" +#include "d/d_bg_s_lin_chk.h" +#include "m_Do/m_Do_hostIO.h" +#include "d/d_com_inf_game.h" + +class JPABaseEmitter; +class daHot_Floor_c; class daBeam_c : public fopAc_ac_c { + typedef void (daBeam_c::*Func)(); + public: inline cPhs_State _create(); inline bool _delete(); inline bool _draw(); - void beamCheck() {} - void beamOff() {} - void beamOn() {} - void checkHFloorParticle() {} - void checkSmokeParticle() {} - void offHFloorParticle() {} - void offSmokeParticle() {} - void onHFloorParticle() {} - void onSmokeParticle() {} - void setDefaultProc(void (daBeam_c::*)()) {} + bool beamCheck() { return m690 != NULL; } + void beamOff() { + m690->becomeInvalidEmitter(); + m690 = NULL; + } + void beamOn() { + m690 = dComIfGp_particle_set(dPa_name::ID_SCENE_8121, ¤t.pos); + } + bool checkHFloorParticle() { return !(s32)m5F8; } + bool checkSmokeParticle() { return !(s32)m5F9; } + void offHFloorParticle() { m5F8 = false; } + void offSmokeParticle() { m5F9 = false; } + void onHFloorParticle() { m5F8 = true; } + void onSmokeParticle() { m5F9 = true; } + void setDefaultProc(Func func) { m55C = func; } void setEmitterOffset(float) {} void setPosAngle(cXyz&, csXyz&) {} - void setSearchProc(void (daBeam_c::*)()) {} + void setSearchProc(Func func) { m550 = func; } void set_mtx(); - void CreateHeap(); - void CreateInit(); + BOOL CreateHeap(); + cPhs_State CreateInit(); bool _execute(); - void checkRange(csXyz*); + BOOL checkRange(csXyz*); void move_search(); void fix_search(); void timer_change(); void wait_proc(); -public: - /* Place member variables here */ -}; + static const char M_arcname[]; -class daBeam_HIO_c { +public: + /* 0x290 */ dCcD_Stts mStts; + /* 0x2CC */ dCcD_Cps mCps1; + /* 0x404 */ dCcD_Cps mCps2; + /* 0x53C */ u8 m53C; + /* 0x540 */ cXyz m540; + /* 0x54C */ u8 m54C; + /* 0x550 */ Func m550; + /* 0x55C */ Func m55C; + /* 0x568 */ request_of_phase_process_class mPhase; + /* 0x570 */ J3DModel* M_mdl; + /* 0x574 */ J3DAnmTransform* M_bck; + /* 0x578 */ mDoExt_bckAnm mBckAnm; + /* 0x5A8 */ f32 m588; + /* 0x58C */ J3DAnmTevRegKey* M_brk; + /* 0x590 */ mDoExt_brkAnm mBrkAnm; + /* 0x5A8 */ f32 m5A8; + /* 0x5AC */ J3DAnmTextureSRTKey* M_btk; + /* 0x5B0 */ mDoExt_btkAnm mBtkAnm; + /* 0x5C4 */ Mtx m5C4; + /* 0x5F4 */ s16 m5F4; + /* 0x5F6 */ s16 m5F6; + /* 0x5F8 */ bool m5F8; + /* 0x5F9 */ bool m5F9; + /* 0x5FC */ dBgS_ObjLinChk mLinChk; + /* 0x668 */ cXyz m668; + /* 0x674 */ Quaternion m674; + /* 0x684 */ fpc_ProcID m684; + /* 0x688 */ f32 m688; + /* 0x68C */ daHot_Floor_c* m68C; + /* 0x690 */ JPABaseEmitter* m690; + /* 0x694 */ f32 m694; + /* 0x698 */ s32 m698; +}; // size = 0x69C + +class daBeam_HIO_c : public JORReflexible { public: daBeam_HIO_c(); + virtual ~daBeam_HIO_c() {} public: - /* Place member variables here */ -}; + /* 0x04 */ s8 mNo; + /* 0x08 */ f32 m08; + /* 0x0C */ s16 m0C; +}; // size = 0x10 #endif /* D_A_BEAM_H */ diff --git a/include/d/actor/d_a_hot_floor.h b/include/d/actor/d_a_hot_floor.h index 8b6758a07..7da746d8b 100644 --- a/include/d/actor/d_a_hot_floor.h +++ b/include/d/actor/d_a_hot_floor.h @@ -17,6 +17,10 @@ public: inline bool _draw(); inline bool _delete(); inline bool create_heap(); + void setAimMtx(MtxP i_mtx) { + mtx_p = i_mtx; + mbSpawnParticle = true; + } static const char M_arcname[]; @@ -32,7 +36,7 @@ public: /* 0x2D8 */ JPABaseEmitter * mEmitter2; /* 0x2DC */ bool mbSpawnParticle; /* 0x2E0 */ Mtx mtx[5]; - /* 0x3D0 */ Mtx * mtx_p; + /* 0x3D0 */ MtxP mtx_p; /* 0x3D4 */ u32 field_0x3d4; }; diff --git a/include/d/d_cc_d.h b/include/d/d_cc_d.h index 332090e26..7d4b40635 100644 --- a/include/d/d_cc_d.h +++ b/include/d/d_cc_d.h @@ -441,6 +441,8 @@ public: bool ChkTgShieldFrontRange() { return mGObjTg.ChkSPrm(dCcG_TgSPrm_ShieldFrontRange_e); } void OnTgShieldFrontRange() { mGObjTg.OnSPrm(dCcG_TgSPrm_ShieldFrontRange_e); } void OffTgShieldFrontRange() { mGObjTg.OffSPrm(dCcG_TgSPrm_ShieldFrontRange_e); } + void OnAtStopNoConHit() { mGObjAt.OnSPrm(dCcG_AtSPrm_StopNoConHit_e); } + void OffAtStopNoConHit() { mGObjAt.OffSPrm(dCcG_AtSPrm_StopNoConHit_e); } s16* GetTgShieldFrontRangeYAngle() { return mGObjTg.GetShieldFrontRangeYAngle(); } bool ChkCoAtLasso() { return mGObjCo.ChkSPrm(dCcG_CoSPrm_AtLasso_e); } bool ChkCoTgLasso() { return mGObjCo.ChkSPrm(dCcG_CoSPrm_TgLasso_e); } diff --git a/include/d/res/res_ylesr00.h b/include/d/res/res_ylesr00.h index 0373ffe32..555cc05a4 100644 --- a/include/d/res/res_ylesr00.h +++ b/include/d/res/res_ylesr00.h @@ -54,6 +54,23 @@ enum YLESR00_RES_FILE_ID { // IDs and indexes are synced YLESR00_BTK_YHTFR00=0x11, YLESR00_BTK_YLESR00=0x12, }; + +enum YLESR00_RES_FILE_INDEX { + /* BCK */ + YLESR00_INDEX_BCK_YLESR00=0x6, + + /* BMDM */ + YLESR00_INDEX_BMD_YHTFR00=0x9, + YLESR00_INDEX_BMD_YLESR00=0xA, + + /* BRK */ + YLESR00_INDEX_BRK_YHTFR00=0xD, + YLESR00_INDEX_BRK_YLESR00=0xE, + + /* BTK */ + YLESR00_INDEX_BTK_YHTFR00=0x11, + YLESR00_INDEX_BTK_YLESR00=0x12, +}; #endif #endif /* RES_YLESR00_H */ diff --git a/src/d/actor/d_a_beam.cpp b/src/d/actor/d_a_beam.cpp index 151791771..cedc34bd8 100644 --- a/src/d/actor/d_a_beam.cpp +++ b/src/d/actor/d_a_beam.cpp @@ -5,9 +5,19 @@ #include "d/dolzel.h" // IWYU pragma: keep #include "d/actor/d_a_beam.h" +#include "d/actor/d_a_player.h" +#include "d/actor/d_a_hot_floor.h" +#include "d/res/res_ylesr00.h" #include "d/d_cc_d.h" +#include "d/d_lib.h" +#include "d/d_particle.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/d_a_obj.h" +#include "d/d_s_play.h" +#include "f_op/f_op_actor_mng.h" + +static daBeam_HIO_c l_HIO; static dCcD_SrcCps cps_src = { // dCcD_SrcGObjInf @@ -33,13 +43,16 @@ static dCcD_SrcCps cps_src = { }, // cM3dGCpsS { - /* Start */ 0.0f, 0.0f, 0.0f, - /* End */ 0.0f, 0.0f, 0.0f, + /* Start */ 0.0f, + 0.0f, + 0.0f, + /* End */ 0.0f, + 0.0f, + 0.0f, /* Radius */ 50.0f, }, }; - static dCcD_SrcCps cps2_src = { // dCcD_SrcGObjInf { @@ -64,81 +77,522 @@ static dCcD_SrcCps cps2_src = { }, // cM3dGCpsS { - /* Start */ 0.0f, 0.0f, 0.0f, - /* End */ 0.0f, 0.0f, 0.0f, + /* Start */ 0.0f, + 0.0f, + 0.0f, + /* End */ 0.0f, + 0.0f, + 0.0f, /* Radius */ 50.0f, }, }; - /* 000000EC-00000118 .text __ct__12daBeam_HIO_cFv */ daBeam_HIO_c::daBeam_HIO_c() { - /* Nonmatching */ + mNo = -1; + m08 = 0.0f; + m0C = 0; } +const char daBeam_c::M_arcname[] = "Ylesr00"; + /* 00000118-000003B0 .text set_mtx__8daBeam_cFv */ void daBeam_c::set_mtx() { - /* Nonmatching */ + f32 fVar1 = scale.z * 100.0f; + cXyz sp18 = m668 - current.pos; + f32 abs = sp18.abs() / fVar1; + f32 fVar2 = (m588 * (5.0f - m5A8)) / 50.0f + 0.5f; + + M_mdl->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::ZXYrotM(current.angle.x, current.angle.y, current.angle.z); + mDoMtx_stack_c::scaleM(fVar2, fVar2, abs); + M_mdl->setBaseTRMtx(mDoMtx_stack_c::get()); + + if (m690 != NULL) { + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::ZXYrotM(current.angle.x, current.angle.y, current.angle.z); + mDoMtx_stack_c::transM(0.0f, 0.0f, m694); + m690->setGlobalRTMatrix(mDoMtx_stack_c::get()); + JGeometry::TVec3 s(scale.x, scale.x, scale.x); + m690->setGlobalScale(s); + } + + if (m68C != NULL) { + mDoMtx_stack_c::transS(m668.x, m668.y, m668.z); + mDoMtx_stack_c::quatM(&m674); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::scaleM(1.0f, 1.0f, m688); + MTXCopy(mDoMtx_stack_c::get(), m5C4); + + m68C->setAimMtx(m5C4); + } } /* 000003B0-000003D0 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* a_this) { + return ((daBeam_c*)a_this)->CreateHeap(); } /* 000003D0-00000688 .text CreateHeap__8daBeam_cFv */ -void daBeam_c::CreateHeap() { - /* Nonmatching */ +BOOL daBeam_c::CreateHeap() { + J3DModelData* modelData = static_cast(dComIfG_getObjectRes(M_arcname, YLESR00_INDEX_BMD_YLESR00)); + JUT_ASSERT(304, modelData != NULL); + + M_mdl = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + JUT_ASSERT(306, M_mdl != NULL); + + M_bck = static_cast(dComIfG_getObjectRes(M_arcname, YLESR00_INDEX_BCK_YLESR00)); + JUT_ASSERT(310, M_bck != NULL); + + M_brk = static_cast(dComIfG_getObjectRes(M_arcname, YLESR00_INDEX_BRK_YLESR00)); + JUT_ASSERT(314, M_brk != NULL); + + M_btk = static_cast(dComIfG_getObjectRes(M_arcname, YLESR00_INDEX_BTK_YLESR00)); + JUT_ASSERT(318, M_brk != NULL); + + BOOL tmp1 = mBckAnm.init(modelData, M_bck, false, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false); + BOOL tmp2 = mBrkAnm.init(modelData, M_brk, false, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, FALSE); + BOOL tmp3 = mBtkAnm.init(modelData, M_btk, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, FALSE); + + if (M_mdl == NULL || !tmp1 || !tmp2 || !tmp3) { + return false; + } + return true; } /* 00000688-00000864 .text daBeam_AtHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -void daBeam_AtHitCallback(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { - /* Nonmatching */ +void daBeam_AtHitCallback(fopAc_ac_c* arg0, dCcD_GObjInf* arg1, fopAc_ac_c* arg2, dCcD_GObjInf* arg3) { + daBeam_c* i_this = (daBeam_c*)arg0; + + if (fopAcM_IsActor(arg2)) { + if (fopAcM_GetName(arg2) == PROC_PLAYER) { + fopAcM_seStartCurrent(arg2, JA_SE_LK_BEAM_HIT, 0); + + if (i_this->m54C != 0) { + cXyz sp20(-cM_scos(i_this->current.angle.y), 0.0f, cM_ssin(i_this->current.angle.y)); + + cXyz sp14 = arg2->current.pos - i_this->current.pos; + if (sp20.inprod(sp14) < 0.0f) { + sp20.x = -sp20.x; + sp20.z = -sp20.z; + } + + arg1->SetAtVec(sp20); + arg3->SetTgRVec(sp20); + } + } else if (fopAcM_GetName(arg2) == PROC_AM2) { + arg3->ClrTgHit(); + } + + if (i_this->parentActorID != fopAcM_GetID(arg2)) { + i_this->m540 = *i_this->mCps1.GetAtHitPosP(); + i_this->m53C = true; + } + } } /* 00000864-00000A00 .text daBeam_AtHitDummyCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -void daBeam_AtHitDummyCallback(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { - /* Nonmatching */ +void daBeam_AtHitDummyCallback(fopAc_ac_c* arg0, dCcD_GObjInf* arg1, fopAc_ac_c* arg2, dCcD_GObjInf* arg3) { + daBeam_c* i_this = (daBeam_c*)arg0; + + if (fopAcM_IsActor(arg2)) { + if (fopAcM_GetName(arg2) == PROC_PLAYER) { + fopAcM_seStartCurrent(arg2, JA_SE_LK_BEAM_HIT, 0); + + if (i_this->m54C != 0) { + cXyz sp20(-cM_scos(i_this->current.angle.y), 0.0f, cM_ssin(i_this->current.angle.y)); + + cXyz sp14 = arg2->current.pos - i_this->current.pos; + if (sp20.inprod(sp14) < 0.0f) { + sp20.x = -sp20.x; + sp20.z = -sp20.z; + } + arg1->SetAtVec(sp20); + arg3->SetTgRVec(sp20); + } + } else if (fopAcM_GetName(arg2) == PROC_AM2) { + arg3->ClrTgHit(); + } + } } /* 00000A00-00000AA0 .text daBeam_checkHitCallback__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -void daBeam_checkHitCallback(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { - /* Nonmatching */ +void daBeam_checkHitCallback(fopAc_ac_c* arg0, dCcD_GObjInf* arg1, fopAc_ac_c* arg2, dCcD_GObjInf* arg3) { + if (fopAcM_IsActor(arg2) && arg0->parentActorID != fopAcM_GetID(arg2)) { + if (fopAcM_GetName(arg2) != PROC_PLAYER || arg1->ChkAtShieldHit()) { + daBeam_c* i_this = (daBeam_c*)arg0; + i_this->m540 = *i_this->mCps2.GetAtHitPosP(); + i_this->m53C = true; + } + } } /* 00000AA0-00000F24 .text CreateInit__8daBeam_cFv */ -void daBeam_c::CreateInit() { - /* Nonmatching */ +cPhs_State daBeam_c::CreateInit() { + mStts.Init(0xff, 0xff, this); + u8 uVar11 = fopAcM_GetParam(this) >> 0x1e; + mCps1.Set(cps_src); + mCps1.SetStts(&mStts); + + cXyz fVar2 = current.pos; + fVar2.x += (scale.z * 100.0f) * cM_scos(current.angle.x) * cM_ssin(current.angle.y); + fVar2.y -= (scale.z * 100.0f) * cM_ssin(current.angle.x); + fVar2.z += (scale.z * 100.0f) * cM_scos(current.angle.x) * cM_scos(current.angle.y); + + mCps1.SetStartEnd(current.pos, fVar2); + mCps1.SetR(25.0f); + + if (uVar11 == 0) { + mCps1.SetAtHitCallback(daBeam_AtHitCallback); + } else { + mCps1.SetAtHitCallback(daBeam_AtHitDummyCallback); + } + + mCps1.OnAtStopNoConHit(); + mCps1.OnAtNoHitMark(); + + mCps2.Set(cps2_src); + mCps2.SetStts(&mStts); + mCps2.SetStartEnd(current.pos, fVar2); + mCps2.SetR(25.0f); + + mCps2.OnAtNoTgHitInfSet(); + if (uVar11 == 0) { + mCps2.SetAtHitCallback(daBeam_checkHitCallback); + } + + m674 = ZeroQuat; + m684 = fpcM_ERROR_PROCESS_ID_e; + m68C = NULL; + + set_mtx(); + + fopAcM_SetMtx(this, M_mdl->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -50.0f, -50.0f, 0.0f, 50.0f, 50.0f, 2000.0f); + + if (parentActorID == -1) { + u8 params1 = fopAcM_GetParam(this) & 0xFF; + s8 params2 = (fopAcM_GetParam(this) >> 8) & 0xFF; + params1 = cLib_maxLimit(params1, 2); + params2 = cLib_minMaxLimit(params2, -30, 60); + + switch (params1) { + case 0: + setSearchProc(&daBeam_c::fix_search); + setDefaultProc(&daBeam_c::fix_search); + break; + + case 1: + setSearchProc(&daBeam_c::move_search); + setDefaultProc(&daBeam_c::move_search); + break; + + case 2: + actor_status = 0; + m5F6 = params2; + setSearchProc(&daBeam_c::timer_change); + setDefaultProc(&daBeam_c::timer_change); + break; + + default: + setSearchProc(&daBeam_c::move_search); + break; + } + + scale.set(2.5f, 2.5f, 20.0f); + m694 = REG10_F(10) * 0.001f; + m690 = NULL; + m698 = fopAcM_GetParam(this) >> 0x10 & 0xff; + if (m698 != 0xff && fopAcM_isSwitch(this, m698)) { + setSearchProc(&daBeam_c::wait_proc); + } + m54C = 0; + } else { + m694 = 0.0f; + m690 = NULL; + m54C = fopAcM_GetParam(this) >> 0x18 & 0xf; + + u8 smoke = ((fopAcM_GetParam(this) >> 0x1C) & 3); + bool floor = ((fopAcM_GetParam(this) >> 0x1C) & 1); + + if (floor) { + offHFloorParticle(); + } else { + onHFloorParticle(); + } + + if (smoke & 2) { + offSmokeParticle(); + } else { + onSmokeParticle(); + } + } + + return cPhs_COMPLEATE_e; } /* 00000F24-000015A4 .text _execute__8daBeam_cFv */ bool daBeam_c::_execute() { - /* Nonmatching */ + if (m550) { + (this->*m550)(); + if (m698 != 0xff) { + if (fopAcM_isSwitch(this, m698)) { + setSearchProc(&daBeam_c::wait_proc); + } else { + setSearchProc(m55C); + } + } + } + + mBtkAnm.play(); + + f32 tmp = scale.z * 100.0f; + cXyz sp64 = current.pos; + sp64.x += tmp * cM_scos(current.angle.x) * cM_ssin(current.angle.y); + sp64.y -= tmp * cM_ssin(current.angle.x); + sp64.z += tmp * cM_scos(current.angle.x) * cM_scos(current.angle.y); + + mCps2.SetStartEnd(current.pos, sp64); + mCps2.SetR(25.0f); + dComIfG_Ccsp()->Set(&mCps2); + + if (m5F4 == 1) { + f32 fVar15 = scale.z * 100.0f; + if (m53C == 1) { + cXyz sp58 = m540 - current.pos; + fVar15 = sp58.abs(); + } + + cXyz sp4C = current.pos; + sp4C.x += fVar15 * cM_scos(current.angle.x) * cM_ssin(current.angle.y); + sp4C.y -= fVar15 * cM_ssin(current.angle.x); + sp4C.z += fVar15 * cM_scos(current.angle.x) * cM_scos(current.angle.y); + + cXyz sp40 = sp4C - current.pos; + if (!sp40.normalizeRS()) { + sp40 = cXyz::Zero; + } + + mCps1.SetStartEnd(current.pos, sp4C); + mCps1.SetR(25.0f); + mCps1.SetAtVec(sp40); + dComIfG_Ccsp()->Set(&mCps1); + } + + if (m588 > 0.0f) { + cXyz sp34 = current.pos; + f32 tmp = m588 * 20.0f * scale.z; + sp34.x += tmp * cM_scos(current.angle.x) * cM_ssin(current.angle.y); + sp34.y -= tmp * cM_ssin(current.angle.x); + sp34.z += tmp * cM_scos(current.angle.x) * cM_scos(current.angle.y); + + mLinChk.OffBackFlag(); + mLinChk.Set(¤t.pos, &sp34, this); + + if (m53C == 1) { + m668 = m540; + m688 = 1.0f; + m684 = fpcM_ERROR_PROCESS_ID_e; + m68C = NULL; + } else if (dComIfG_Bgsp()->LineCross(&mLinChk)) { + cM3dGPla* pcVar9 = dComIfG_Bgsp()->GetTriPla(mLinChk); + m668 = mLinChk.GetCross(); + cXyz sp28(pcVar9->mNormal.x, pcVar9->mNormal.y, pcVar9->mNormal.z); + daObj::quat_rotBaseY2(&m674, sp28); + + if (m684 == fpcM_ERROR_PROCESS_ID_e) { + u32 parameters = 0; + if (checkHFloorParticle()) { + parameters |= 1; + } + + if (checkSmokeParticle()) { + parameters |= 2; + } + + m684 = fopAcM_create(PROC_Hot_Floor, parameters, &m668); + } + m688 = 1.0f; + } else { + m668 = sp34; + m688 = 1.0f; + m684 = fpcM_ERROR_PROCESS_ID_e; + m68C = NULL; + } + + if (m684 != fpcM_ERROR_PROCESS_ID_e && m68C == NULL) { + m68C = (daHot_Floor_c*)fopAcM_SearchByID(m684); + } + + mDoAud_seStart(JA_SE_OBJ_STATUE_BEAM, &m668, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } else { + m684 = fpcM_ERROR_PROCESS_ID_e; + m68C = NULL; + } + + m53C = 0; + return false; } /* 000015A4-000017EC .text checkRange__8daBeam_cFP5csXyz */ -void daBeam_c::checkRange(csXyz*) { - /* Nonmatching */ +BOOL daBeam_c::checkRange(csXyz* o_arg1) { + cXyz sp54(cM_ssin(home.angle.y), 0.0f, cM_scos(home.angle.y)); + cXyz sp48(cM_scos(home.angle.y), 0.0f, -cM_ssin(home.angle.y)); + daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); + cXyz sp3C = player->current.pos; + sp3C.y = player->getGroundY(); + cXyz sp30 = sp3C - current.pos; + cXyz sp24(sp48.inprod(sp30), -sp30.y, sp54.inprod(sp30)); + + if (sp24.z < 500.0f && sp24.z > 0.0f && std::fabsf(sp24.x) < 150.0f && fabs(sp24.y) < 250.0f) { + if (o_arg1 != NULL) { + o_arg1->x = cM_atan2s(sp24.y, sp24.absXZ()); + o_arg1->y = cM_atan2s(sp30.x, sp30.z); + } + return TRUE; + } + + return FALSE; } /* 000017EC-00001A10 .text move_search__8daBeam_cFv */ void daBeam_c::move_search() { - /* Nonmatching */ + csXyz sp18; + + if (checkRange(&sp18)) { + s16 sVar3 = cLib_addCalcAngleS(¤t.angle.x, sp18.x, 2, 0x400, 0); + cLib_addCalcAngleS2(¤t.angle.y, sp18.y, 4, 0x400); + + if (abs(sVar3) < 0x400 && m5F4 == 0) { + if (!beamCheck()) { + beamOn(); + } + + if (m5F4 == 0) { + m5A8 = 0.0f; + if (m588 < 5.0f) { + m588 += 1.0f; + } else { + m5A8 = 0.0f; + m588 = 5.0f; + m5F4 = 1; + } + } else { + m5A8 = 0.0f; + m588 = 5.0f; + } + } + } else { + if (m5F4 == 0 || m588 <= 0.4f) { + cLib_addCalcAngleS2(¤t.angle.y, home.angle.y, 4, 0x400); + cLib_addCalcAngleS2(¤t.angle.x, home.angle.x, 4, 0x400); + } + + if (beamCheck()) { + beamOff(); + } + + if (m5F4 == 1) { + if (m588 < 5.0f) { + m588 += 1.0f; + } + + if (m5A8 < 4.0f) { + m5A8 += 1.0f; + } else { + m5A8 = 0.0f; + m588 = 0.0f; + m5F4 = 0; + } + } else { + m588 = 0.0f; + m5A8 = 0.0f; + } + } } /* 00001A10-00001A14 .text fix_search__8daBeam_cFv */ void daBeam_c::fix_search() { - /* Nonmatching */ } /* 00001A14-00001BC0 .text timer_change__8daBeam_cFv */ void daBeam_c::timer_change() { - /* Nonmatching */ + m5F6--; + if (m5F6 > 0) { + if (m690 == NULL) { + m690 = dComIfGp_particle_set(dPa_name::ID_SCENE_8121, ¤t.pos); + } + + if (m5F4 == 0) { + m5A8 = 0.0f; + if (m588 < 5.0f) { + m588 += 1.0f; + } else { + m5A8 = 0.0f; + m588 = 5.0f; + m5F4 = 1; + } + } else { + m5A8 = 0.0f; + m588 = 5.0f; + } + } else { + if (m690 != NULL) { + m690->becomeInvalidEmitter(); + m690 = NULL; + } + + if (m5F4 == 1) { + if (m588 < 5.0f) { + m588 += 1.0f; + } + + if (m5A8 < 4.0f) { + m5A8 += 1.0f; + } else { + m5A8 = 0.0f; + m588 = 0.0f; + m5F4 = 0; + } + } else { + m588 = 0.0f; + m5A8 = 0.0f; + } + + if (m5F6 < -30) { + m5F6 = 60; + } + } } /* 00001BC0-00001C84 .text wait_proc__8daBeam_cFv */ void daBeam_c::wait_proc() { - /* Nonmatching */ + if (m690 != NULL) { + m690->becomeInvalidEmitter(); + m690 = NULL; + } + + if (m5F4 == 1) { + if (m588 < 5.0f) { + m588 += 1.0f; + } + + if (m5A8 < 4.0f) { + m5A8 += 1.0f; + } else { + m5A8 = 0.0f; + m588 = 0.0f; + m5F4 = 0; + } + } else { + m588 = 0.0f; + m5A8 = 0.0f; + } + + if (m5F4 == 0) { + current.angle = home.angle; + } } /* 00001C84-00001CA4 .text daBeamCreate__FPv */ @@ -148,12 +602,35 @@ static cPhs_State daBeamCreate(void* i_this) { /* 00001CA4-00001D34 .text _create__8daBeam_cFv */ cPhs_State daBeam_c::_create() { - /* Nonmatching */ +#if VERSION == VERSION_DEMO + cPhs_State PVar1 = dComIfG_resLoad(&mPhase, M_arcname); + if (PVar1 == cPhs_COMPLEATE_e) { + fopAcM_SetupActor(this, daBeam_c); +#else + fopAcM_SetupActor(this, daBeam_c); + cPhs_State PVar1 = dComIfG_resLoad(&mPhase, M_arcname); + if (PVar1 == cPhs_COMPLEATE_e) { +#endif + if (fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x22A0)) { + return CreateInit(); + } + return cPhs_ERROR_e; + } + return PVar1; +} + +bool daBeam_c::_delete() { + mDoAud_seDeleteObject(&m668); + dComIfG_resDeleteDemo(&mPhase, M_arcname); + if (m690 != NULL) { + m690->becomeInvalidEmitter(); + } + return true; } /* 0000291C-0000298C .text daBeamDelete__FPv */ -static BOOL daBeamDelete(void*) { - /* Nonmatching */ +static BOOL daBeamDelete(void* i_this) { + return ((daBeam_c*)i_this)->_delete(); } /* 0000298C-000029B0 .text daBeamExecute__FPv */ @@ -161,9 +638,23 @@ static BOOL daBeamExecute(void* i_this) { return ((daBeam_c*)i_this)->_execute(); } +bool daBeam_c::_draw() { + if (m5F4 == 0) { + return true; + } + + set_mtx(); + + mBtkAnm.entry(M_mdl->getModelData()); + mBrkAnm.entry(M_mdl->getModelData(), (s16)m5A8); + mBckAnm.entry(M_mdl->getModelData(), (s16)m588); + mDoExt_modelUpdateDL(M_mdl); + return true; +} + /* 000029B0-00002AA0 .text daBeamDraw__FPv */ -static BOOL daBeamDraw(void*) { - /* Nonmatching */ +static BOOL daBeamDraw(void* i_this) { + return ((daBeam_c*)i_this)->_draw(); } /* 00002AA0-00002AA8 .text daBeamIsDelete__FPv */ diff --git a/src/d/actor/d_a_hot_floor.cpp b/src/d/actor/d_a_hot_floor.cpp index abb6cb28f..443cd592f 100644 --- a/src/d/actor/d_a_hot_floor.cpp +++ b/src/d/actor/d_a_hot_floor.cpp @@ -31,7 +31,7 @@ void daHot_Floor_c::set_mtx() { mDoMtx_copy(mtx[i - 1], mtx[i]); if (mtx_p != NULL) { cXyz pos = cXyz::Zero; - mDoMtx_stack_c::copy(*mtx_p); + mDoMtx_stack_c::copy(mtx_p); mDoMtx_stack_c::transM(0.0f, 5.0f, -5.0f); mDoMtx_copy(mDoMtx_stack_c::get(), mtx[0]); mDoMtx_stack_c::multVec(&pos, ¤t.pos); diff --git a/src/d/actor/d_a_obj_demo_barrel.cpp b/src/d/actor/d_a_obj_demo_barrel.cpp index a7844fda4..1ee538557 100644 --- a/src/d/actor/d_a_obj_demo_barrel.cpp +++ b/src/d/actor/d_a_obj_demo_barrel.cpp @@ -20,7 +20,7 @@ void daObj_Demo_Barrel_c::setParticleHahen() { dComIfGp_particle_set(dPa_name::ID_COMMON_03E5, ¤t.pos, NULL, NULL, 0xFF, NULL, -1, &tevStr.mColorK0, &tevStr.mColorK0, NULL); if (emitter != NULL) { - static JGeometry::TVec3 em_scl(1.0f, 0.8, 1.0f); + static JGeometry::TVec3 em_scl(1.0f, 0.8f, 1.0f); emitter->setEmitterScale(em_scl); } }