From 29421e697580a9bb1092bc9242083d633adffcd5 Mon Sep 17 00:00:00 2001 From: inkoalawetrust <56005600+inkoalawetrust@users.noreply.github.com> Date: Sun, 25 Sep 2022 09:13:23 +0300 Subject: [PATCH] Added QF_SHAKEONLY The QF_SHAKEONLY flag changes the behavior of earthquakes with a damage radius, so that they only shake actors around, without also harming them. --- src/playsim/a_sharedglobal.h | 3 ++- src/playsim/mapthinkers/a_quake.cpp | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/playsim/a_sharedglobal.h b/src/playsim/a_sharedglobal.h index 8a359d80c..13dce584d 100644 --- a/src/playsim/a_sharedglobal.h +++ b/src/playsim/a_sharedglobal.h @@ -115,6 +115,7 @@ enum QF_3D = 1 << 6, QF_GROUNDONLY = 1 << 7, QF_AFFECTACTORS = 1 << 8, + QF_SHAKEONLY = 1 << 9, }; struct FQuakeJiggers @@ -153,7 +154,7 @@ public: double GetModIntensity(double intensity, bool fake = false) const; double GetModWave(double ticFrac, double waveMultiplier) const; double GetFalloff(double dist) const; - void DoQuakeDamage(AActor *m_Spot, AActor *victim) const; + void DoQuakeDamage(DEarthquake *quake, AActor *victim) const; static int StaticGetQuakeIntensities(double ticFrac, AActor *viewer, FQuakeJiggers &jiggers); }; diff --git a/src/playsim/mapthinkers/a_quake.cpp b/src/playsim/mapthinkers/a_quake.cpp index 32e8a5e85..9a6af6499 100644 --- a/src/playsim/mapthinkers/a_quake.cpp +++ b/src/playsim/mapthinkers/a_quake.cpp @@ -132,7 +132,7 @@ void DEarthquake::Tick () continue; - DoQuakeDamage(m_Spot, mo); + DoQuakeDamage(this, mo); } } else @@ -142,7 +142,7 @@ void DEarthquake::Tick () if (Level->PlayerInGame(i) && !(Level->Players[i]->cheats & CF_NOCLIP)) { AActor* victim = Level->Players[i]->mo; - DoQuakeDamage(m_Spot, victim); + DoQuakeDamage(this, victim); } } } @@ -168,15 +168,17 @@ void DEarthquake::Tick () // //========================================================================== -void DEarthquake::DoQuakeDamage(AActor *m_Spot, AActor *victim) const +void DEarthquake::DoQuakeDamage(DEarthquake *quake, AActor *victim) const { double dist; - dist = m_Spot->Distance2D(victim, true); + if (!quake || !victim) return; + + dist = quake->m_Spot->Distance2D(victim, true); // Check if in damage radius if (dist < m_DamageRadius && victim->Z() <= victim->floorz) { - if (pr_quake() < 50) + if (!(quake->m_Flags & QF_SHAKEONLY) && pr_quake() < 50) { P_DamageMobj(victim, NULL, NULL, pr_quake.HitDice(1), NAME_Quake); }