More CWaveBuster imps

This commit is contained in:
Phillip Stephens 2020-04-15 00:56:10 -07:00 committed by Luke Street
parent 7db00e8ea9
commit 527a9a9514
2 changed files with 66 additions and 17 deletions

View File

@ -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

View File

@ -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,