22#include " Explosion.h"
33#include " TimeManager.h"
44#include " SpriteManager.h"
5+ #include " DebugRenderer.h"
6+ #include " PhysicsManager.h"
7+ #include " Pedestrian.h"
8+ #include " Vehicle.h"
59
610Explosion::Explosion (GameObjectID id)
711 : GameObject(eGameObjectClass_Explosion, id)
@@ -25,6 +29,11 @@ void Explosion::UpdateFrame()
2529 mDrawSprite .SetOriginToCenter ();
2630 }
2731
32+ if (!IsDamageDone ())
33+ {
34+ ProcessDamage ();
35+ }
36+
2837 if (!mAnimationState .IsAnimationActive ())
2938 {
3039 MarkForDeletion ();
@@ -33,6 +42,11 @@ void Explosion::UpdateFrame()
3342
3443void Explosion::DrawDebug (DebugRenderer& debugRender)
3544{
45+ float damageRadiusA = gGameParams .mExplosionPrimaryDamageDistance ;
46+ float damageRadiusB = gGameParams .mExplosionSecondaryDamageDistance ;
47+
48+ debugRender.DrawSphere (mExplosionEpicentre , damageRadiusA, Color32_Red, false );
49+ debugRender.DrawSphere (mExplosionEpicentre , damageRadiusB, Color32_Yellow, false );
3650}
3751
3852void Explosion::Spawn (const glm::vec3& startPosition)
@@ -53,4 +67,54 @@ void Explosion::Spawn(const glm::vec3& startPosition)
5367 debug_assert (false );
5468 }
5569 mDrawSprite .SetOriginToCenter ();
56- }
70+
71+ mExplosionEpicentre = startPosition;
72+ }
73+
74+ bool Explosion::IsDamageDone () const
75+ {
76+ return mDamageDone ;
77+ }
78+
79+ void Explosion::ProcessDamage ()
80+ {
81+ float maxImpactRadius = gGameParams .mExplosionPrimaryDamageDistance ;
82+ float minImpactRadius = gGameParams .mExplosionSecondaryDamageDistance ;
83+
84+ float impactRadius = std::max (maxImpactRadius, minImpactRadius);
85+
86+ glm::vec2 centerPoint (mExplosionEpicentre .x , mExplosionEpicentre .z );
87+ glm::vec2 extents (
88+ impactRadius,
89+ impactRadius
90+ );
91+
92+ // single shot
93+ mDamageDone = true ;
94+
95+ // todo: fix distance to target
96+ PhysicsQueryResult queryResult;
97+ gPhysics .QueryObjectsWithinBox (centerPoint, extents, queryResult);
98+
99+ if (queryResult.IsNull ())
100+ return ;
101+
102+ for (int icurr = 0 ; icurr < queryResult.mElementsCount ; ++icurr)
103+ {
104+ PhysicsQueryElement& currElement = queryResult.mElements [icurr];
105+
106+ if (CarPhysicsBody* carPhysics = currElement.mCarComponent )
107+ {
108+ // todo: temporary implementation
109+ carPhysics->mReferenceCar ->ReceiveDamage (gGameParams .mExplosionPrimaryDamage );
110+ continue ;
111+ }
112+
113+ if (PedPhysicsBody* pedPhysics = currElement.mPedComponent )
114+ {
115+ // todo: temporary implementation
116+ pedPhysics->mReferencePed ->ReceiveDamageFromExplosion (this );
117+ continue ;
118+ }
119+ }
120+ }
0 commit comments