mirror of https://github.com/AxioDL/metaforce.git
More CWaveBuster imps
This commit is contained in:
parent
7db00e8ea9
commit
527a9a9514
|
@ -124,8 +124,8 @@ void CWaveBuster::AddToRenderer(const zeus::CFrustum& frustum, CStateManager& mg
|
||||||
EnsureRendered(mgr, x2e8_originalXf.origin, GetSortingBounds(mgr));
|
EnsureRendered(mgr, x2e8_originalXf.origin, GetSortingBounds(mgr));
|
||||||
}
|
}
|
||||||
void CWaveBuster::Render(CStateManager& mgr) {
|
void CWaveBuster::Render(CStateManager& mgr) {
|
||||||
sub_801be350();
|
RenderParticles();
|
||||||
sub_801be5c0();
|
RenderBeam();
|
||||||
CWeapon::Render(mgr);
|
CWeapon::Render(mgr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,6 +161,7 @@ void CWaveBuster::UpdateFx(const zeus::CTransform& xf, float dt, CStateManager&
|
||||||
if (!GetActive())
|
if (!GetActive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
x2e8_originalXf = xf;
|
||||||
x398_ -= std::max(0.f, x398_ - (60.f * dt));
|
x398_ -= std::max(0.f, x398_ - (60.f * dt));
|
||||||
x170_projectile.SetVelocity(zeus::CVector3f{0.f, x3d0_25_ ? 1.6f : 0.f, 0.f});
|
x170_projectile.SetVelocity(zeus::CVector3f{0.f, x3d0_25_ ? 1.6f : 0.f, 0.f});
|
||||||
}
|
}
|
||||||
|
@ -187,7 +188,8 @@ void CWaveBuster::SetNewTarget(TUniqueId id, CStateManager& mgr) {
|
||||||
mgr.GetRumbleManager().Rumble(mgr, ERumbleFxId::PlayerBump, 0.5f, ERumblePriority::Three);
|
mgr.GetRumbleManager().Rumble(mgr, ERumbleFxId::PlayerBump, 0.5f, ERumblePriority::Three);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void CWaveBuster::sub_801be350() {
|
|
||||||
|
void CWaveBuster::RenderParticles() {
|
||||||
static constexpr std::array<zeus::CColor, 4> skCols = {{
|
static constexpr std::array<zeus::CColor, 4> skCols = {{
|
||||||
zeus::skWhite,
|
zeus::skWhite,
|
||||||
{1.f, 0.f, 1.f, 1.f},
|
{1.f, 0.f, 1.f, 1.f},
|
||||||
|
@ -228,7 +230,8 @@ void CWaveBuster::sub_801be350() {
|
||||||
x388_busterSwoosh2Gen->Render(GetActorLights());
|
x388_busterSwoosh2Gen->Render(GetActorLights());
|
||||||
x38c_busterSparksGen->Render(GetActorLights());
|
x38c_busterSparksGen->Render(GetActorLights());
|
||||||
}
|
}
|
||||||
void CWaveBuster::sub_801be5c0() {
|
|
||||||
|
void CWaveBuster::RenderBeam() {
|
||||||
zeus::CVector3f local_19c = x2e8_originalXf.inverse() * x2e8_originalXf.origin;
|
zeus::CVector3f local_19c = x2e8_originalXf.inverse() * x2e8_originalXf.origin;
|
||||||
zeus::CVector3f local_1a8 = x2e8_originalXf.inverse() * x318_;
|
zeus::CVector3f local_1a8 = x2e8_originalXf.inverse() * x318_;
|
||||||
zeus::CVector3f local_1b4 = x2e8_originalXf.inverse() * x324_;
|
zeus::CVector3f local_1b4 = x2e8_originalXf.inverse() * x324_;
|
||||||
|
@ -271,28 +274,46 @@ void CWaveBuster::sub_801be5c0() {
|
||||||
g_Renderer->SetModelMatrix(x2e8_originalXf);
|
g_Renderer->SetModelMatrix(x2e8_originalXf);
|
||||||
m_lineRenderer1.Reset();
|
m_lineRenderer1.Reset();
|
||||||
for (const zeus::CVector3f& vec : linePoints) {
|
for (const zeus::CVector3f& vec : linePoints) {
|
||||||
m_lineRenderer1.AddVertex(vec, zeus::skWhite, 12.f/6.f);
|
m_lineRenderer1.AddVertex(vec, zeus::skWhite, 12.f / 6.f);
|
||||||
}
|
}
|
||||||
m_lineRenderer1.Render();
|
m_lineRenderer1.Render();
|
||||||
|
|
||||||
m_lineRenderer2.Reset();
|
m_lineRenderer2.Reset();
|
||||||
for (const zeus::CVector3f& vec : linePoints) {
|
for (const zeus::CVector3f& vec : linePoints) {
|
||||||
m_lineRenderer2.AddVertex(vec, zeus::CColor{1.f, 0.f, 1.f, 0.5f}, 48.f/6);
|
m_lineRenderer2.AddVertex(vec, zeus::CColor{1.f, 0.f, 1.f, 0.5f}, 48.f / 6);
|
||||||
}
|
}
|
||||||
m_lineRenderer2.Render();
|
m_lineRenderer2.Render();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CRayCastResult CWaveBuster::sub_801be010(TUniqueId uid, const zeus::CVector3f& p1, const zeus::CVector3f& p2,
|
CRayCastResult CWaveBuster::sub_801be010(TUniqueId uid, const zeus::CVector3f& pos, const zeus::CVector3f& dir,
|
||||||
CStateManager& mgr) {
|
CStateManager& mgr) {
|
||||||
return CRayCastResult();
|
CRayCastResult res = mgr.RayStaticIntersection(pos, dir, 25.f, xf8_filter);
|
||||||
|
TUniqueId uid1 = kInvalidUniqueId;
|
||||||
|
TUniqueId uid2 = kInvalidUniqueId;
|
||||||
|
sub_801bda14(mgr, uid1, uid2, pos, dir, 25.f);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
void CWaveBuster::UpdateTargetSeek(float dt, CStateManager& mgr) {
|
||||||
|
TUniqueId uid = kInvalidUniqueId;
|
||||||
|
SeekTarget(dt, uid, mgr);
|
||||||
|
if (x2c0_homingTargetId == kInvalidUniqueId && !x3d0_26_ &&
|
||||||
|
(GetTranslation() - x2e8_originalXf.origin).magSquared() > 625.f) {
|
||||||
|
x3d0_25_ = false;
|
||||||
|
} else if (const TCastToConstPtr<CActor> act = mgr.GetObjectById(x2c0_homingTargetId)) {
|
||||||
|
zeus::CVector3f vec = zeus::skForward;
|
||||||
|
if (GetViewAngleToTarget(vec, *act) <= zeus::degToRad(90.f) && x3d0_26_) {
|
||||||
|
x3d0_25_ = false;
|
||||||
|
} else {
|
||||||
|
x2c0_homingTargetId = kInvalidUniqueId;
|
||||||
|
x3d0_26_ = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void CWaveBuster::UpdateTargetSeek(float dt, CStateManager& mgr) {}
|
|
||||||
|
|
||||||
void CWaveBuster::UpdateTargetDamage(float dt, CStateManager& mgr) {
|
void CWaveBuster::UpdateTargetDamage(float dt, CStateManager& mgr) {
|
||||||
if (const TCastToConstPtr<CActor> act = mgr.GetObjectById(x2c0_homingTargetId)) {
|
if (const TCastToConstPtr<CActor> act = mgr.GetObjectById(x2c0_homingTargetId)) {
|
||||||
const CHealthInfo* hInfo = act->GetHealthInfo(mgr);
|
const CHealthInfo* hInfo = act->GetHealthInfo(mgr);
|
||||||
if (hInfo && hInfo->GetHP() > 0.f) {
|
if (hInfo != nullptr && hInfo->GetHP() > 0.f) {
|
||||||
x33c_ = act->GetAimPosition(mgr, 0.f);
|
x33c_ = act->GetAimPosition(mgr, 0.f);
|
||||||
SetTranslation(x33c_);
|
SetTranslation(x33c_);
|
||||||
mgr.ApplyDamage(GetUniqueId(), x2c0_homingTargetId, GetOwnerId(), CDamageInfo(x12c_curDamageInfo, dt), xf8_filter,
|
mgr.ApplyDamage(GetUniqueId(), x2c0_homingTargetId, GetOwnerId(), CDamageInfo(x12c_curDamageInfo, dt), xf8_filter,
|
||||||
|
@ -312,8 +333,7 @@ bool CWaveBuster::UpdateBeamFrame(CStateManager& mgr, float dt) {
|
||||||
float viewAngle = 0.f;
|
float viewAngle = 0.f;
|
||||||
if (const TCastToConstPtr<CActor> act = mgr.GetObjectById(x2c0_homingTargetId)) {
|
if (const TCastToConstPtr<CActor> act = mgr.GetObjectById(x2c0_homingTargetId)) {
|
||||||
const CHealthInfo* hInfo = act->GetHealthInfo(mgr);
|
const CHealthInfo* hInfo = act->GetHealthInfo(mgr);
|
||||||
if (hInfo && hInfo->GetHP() > 0.f) {
|
if (hInfo != nullptr && hInfo->GetHP() > 0.f && (act->GetTranslation() - x2e8_originalXf.origin).magSquared() > 10000.f) {
|
||||||
if ((act->GetTranslation() - x2e8_originalXf.origin).magnitude() > 10000.f)
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
viewAngle = GetViewAngleToTarget(local_ac, *act);
|
viewAngle = GetViewAngleToTarget(local_ac, *act);
|
||||||
|
@ -358,5 +378,29 @@ float CWaveBuster::GetViewAngleToTarget(zeus::CVector3f& p1, const CActor& act)
|
||||||
|
|
||||||
return zeus::CVector2f::getAngleDiff(x2e8_originalXf.basis[1].toVec2f(), p1.toVec2f());
|
return zeus::CVector2f::getAngleDiff(x2e8_originalXf.basis[1].toVec2f(), p1.toVec2f());
|
||||||
}
|
}
|
||||||
|
void CWaveBuster::sub_801bda14(CStateManager& mgr, TUniqueId& uid1, TUniqueId& uid2, const zeus::CVector3f& pos,
|
||||||
|
const zeus::CVector3f& dir, float length) {}
|
||||||
|
CRayCastResult CWaveBuster::SeekTarget(float dt, TUniqueId& uid, CStateManager& mgr) {
|
||||||
|
rstl::reserved_vector<TUniqueId, 1024> nearList;
|
||||||
|
mgr.BuildNearList(nearList, GetProjectileBounds(),
|
||||||
|
CMaterialFilter::MakeIncludeExclude(
|
||||||
|
{EMaterialTypes::Solid}, {EMaterialTypes::ProjectilePassthrough, EMaterialTypes::Player}),
|
||||||
|
this);
|
||||||
|
CRayCastResult res = RayCollisionCheckWithWorld(uid, x298_previousPos, GetTranslation(),
|
||||||
|
(GetTranslation() - x298_previousPos).magnitude(), nearList, mgr);
|
||||||
|
if (res.IsInvalid()) {
|
||||||
|
UpdateProjectileMovement(dt, mgr);
|
||||||
|
} else {
|
||||||
|
x3d0_25_ = false;
|
||||||
|
if (uid == kInvalidUniqueId || uid != x2c0_homingTargetId) {
|
||||||
|
x2c0_homingTargetId = kInvalidUniqueId;
|
||||||
|
} else {
|
||||||
|
x3d0_26_ = true;
|
||||||
|
CSfxManager::AddEmitter(SFXsfx06FF, res.GetPoint(), zeus::skZero3f, true, false, 255, kInvalidAreaId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace metaforce
|
} // namespace metaforce
|
|
@ -27,7 +27,7 @@ class CWaveBuster : public CGameProjectile {
|
||||||
std::unique_ptr<CElementGen> x38c_busterSparksGen;
|
std::unique_ptr<CElementGen> x38c_busterSparksGen;
|
||||||
std::unique_ptr<CElementGen> x390_busterLightGen;
|
std::unique_ptr<CElementGen> x390_busterLightGen;
|
||||||
CRandom16 x394_rand{99};
|
CRandom16 x394_rand{99};
|
||||||
float x398_ = 2.f*M_PIF;
|
float x398_ = 2.f * M_PIF;
|
||||||
float x39c_ = 0.5f;
|
float x39c_ = 0.5f;
|
||||||
float x3a0_ = 0.5f;
|
float x3a0_ = 0.5f;
|
||||||
float x3a4_ = 0.f;
|
float x3a4_ = 0.f;
|
||||||
|
@ -49,13 +49,18 @@ class CWaveBuster : public CGameProjectile {
|
||||||
CLineRenderer m_lineRenderer1;
|
CLineRenderer m_lineRenderer1;
|
||||||
CLineRenderer m_lineRenderer2;
|
CLineRenderer m_lineRenderer2;
|
||||||
|
|
||||||
void sub_801be350();
|
void RenderParticles();
|
||||||
void sub_801be5c0();
|
void RenderBeam();
|
||||||
CRayCastResult sub_801be010(TUniqueId uid, const zeus::CVector3f& p1, const zeus::CVector3f& p2, CStateManager& mgr);
|
CRayCastResult sub_801be010(TUniqueId uid, const zeus::CVector3f& pos, const zeus::CVector3f& dir,
|
||||||
|
CStateManager& mgr);
|
||||||
void UpdateTargetSeek(float dt, CStateManager& mgr);
|
void UpdateTargetSeek(float dt, CStateManager& mgr);
|
||||||
void UpdateTargetDamage(float dt, CStateManager& mgr);
|
void UpdateTargetDamage(float dt, CStateManager& mgr);
|
||||||
bool UpdateBeamFrame(CStateManager& mgr, float dt);
|
bool UpdateBeamFrame(CStateManager& mgr, float dt);
|
||||||
float GetViewAngleToTarget(zeus::CVector3f& p1, const CActor& act);
|
float GetViewAngleToTarget(zeus::CVector3f& p1, const CActor& act);
|
||||||
|
void sub_801bda14(CStateManager& mgr, TUniqueId& uid1, TUniqueId& uid2, const zeus::CVector3f& pos, const zeus::CVector3f& dir,
|
||||||
|
float length);
|
||||||
|
CRayCastResult SeekTarget(float dt, TUniqueId& uid, CStateManager& mgr);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DEFINE_ENTITY
|
DEFINE_ENTITY
|
||||||
CWaveBuster(const TToken<CWeaponDescription>& desc, EWeaponType type, const zeus::CTransform& xf,
|
CWaveBuster(const TToken<CWeaponDescription>& desc, EWeaponType type, const zeus::CTransform& xf,
|
||||||
|
|
Loading…
Reference in New Issue