17class SCR_AIThreatSystem
19 private static const float THREAT_SHOT_DROP_RATE = 0.11 * 0.001;
20 private static const float THREAT_SUPPRESSION_DROP_RATE = 0.1 * 0.001;
21 private static const float THREAT_ENDANGERED_DROP_RATE = 0.2 * 0.001;
23 private static const float BLEEDING_FIXED_INCREMENT = 0.3;
24 private static const float SUPPRESSION_BULLET_INCREMENT = 0.10;
25 private static const float ZERO_DISTANCE_SHOT_INCREMENT = 0.008;
26 private static const float DISTANT_SHOT_INCREMENT = 0.002;
28 private static const float EXPLOSION_MAX_INCREMENT = 0.2;
30 private static const float EXPLOSION_CLOSE_DISTANCE = 12;
33 static const float EXPLOSION_MAX_DISTANCE = 100;
35 private static const float ENDANGERED_INCREMENT = 0.2;
37 static const float VIGILANT_THRESHOLD = 0.05;
46 private float m_fThreatTotal;
47 private float m_fThreatSuppression;
48 private float m_fThreatShotsFired;
49 private float m_fThreatIsEndangered;
50 private float m_fThreatInjury;
52 private SCR_AIUtilityComponent m_Utility;
53 private SCR_AIConfigComponent m_Config;
54 private SCR_AICombatComponent m_Combat;
55 private SCR_ExtendedDamageManagerComponent m_DamageManager;
59 private EAIThreatState m_State;
66 void SCR_AIThreatSystem(SCR_AIUtilityComponent utility)
69 m_Config = utility.m_ConfigComponent;
70 m_Combat = utility.m_CombatComponent;
71 m_DamageManager = SCR_ExtendedDamageManagerComponent.Cast(utility.m_OwnerEntity.FindComponent(SCR_ExtendedDamageManagerComponent));
84 m_State = EAIThreatState.SAFE;
91 return m_OnThreatStateChanged;
103 float GetThreatMeasureWithoutInjuryFactor()
105 return m_fThreatTotal - m_fThreatInjury;
110 float GetSuppressionMeasure()
112 return m_fThreatSuppression;
117 float GetThreatMeasure()
119 return m_fThreatTotal;
133 case EAIThreatState.SAFE:
135 color = Color.FromInt(Color.GREEN);
138 case EAIThreatState.VIGILANT:
140 color = Color.FromInt(Color.DARK_GREEN);
143 case EAIThreatState.ALERTED:
145 color = Color.FromInt(Color.DARK_YELLOW);
148 case EAIThreatState.THREATENED:
150 color = Color.FromInt(Color.DARK_RED);
155 SCR_AIDebugVisualization.VisualizeMessage(m_Utility.m_OwnerEntity,
typename.EnumToString(EAIThreatState, m_State),
EAIDebugCategory.THREAT, 1.4, color);
160 private void StateTransition(EAIThreatState newState)
162 if (newState == m_State)
165 m_OnThreatStateChanged.Invoke(m_State, newState);
171 private void UpdateState()
173 EAIThreatState newState = EAIThreatState.SAFE;
176 newState = EAIThreatState.THREATENED;
178 newState = EAIThreatState.ALERTED;
179 else if (m_fThreatTotal > VIGILANT_THRESHOLD)
180 newState = EAIThreatState.VIGILANT;
182 StateTransition(newState);
190 void Update(SCR_AIUtilityComponent utility,
float timeSlice)
193 m_fThreatSuppression -= m_fThreatSuppression * THREAT_SUPPRESSION_DROP_RATE * timeSlice;
194 m_fThreatShotsFired -= m_fThreatShotsFired * THREAT_SHOT_DROP_RATE * timeSlice;
198 if (m_Combat.GetCurrentTarget())
199 m_fThreatIsEndangered = ENDANGERED_INCREMENT;
201 m_fThreatIsEndangered -= m_fThreatIsEndangered * THREAT_ENDANGERED_DROP_RATE * timeSlice;
205 if (m_Agent && m_Config.m_EnableDangerEvents)
208 AIDangerEvent dangerEvent;
211 if (m_Agent.GetDangerEventsCount() != 0)
212 AddDebugMessage(
string.Format(
"Processing danger events: %1 in the queue", m_Agent.GetDangerEventsCount()));
215 for (
int max = m_Agent.GetDangerEventsCount(); i < max; i++)
217 int eventAggregationCount;
218 dangerEvent = m_Agent.GetDangerEvent(i, eventAggregationCount);
222 AddDebugMessage(
string.Format(
"PerformDangerReaction: %1x %2", eventAggregationCount, dangerEvent));
227 if (m_Config.PerformDangerReaction(m_Utility, dangerEvent, eventAggregationCount))
237 m_Agent.ClearDangerEvents(i + 1);
241 float threatFromBehavior;
242 if (utility.m_CurrentBehavior)
243 threatFromBehavior = utility.m_CurrentBehavior.m_fThreat;
245 m_fThreatTotal = Math.Clamp(threatFromBehavior + m_fThreatSuppression + m_fThreatInjury + m_fThreatShotsFired + m_fThreatIsEndangered, 0, 1);
259 m_fThreatInjury = BLEEDING_FIXED_INCREMENT;
278 AddDebugMessage(
string.Format(
"ThreatBulletImpact: %1", count));
281 m_fThreatSuppression =
Math.Clamp(m_fThreatSuppression + count*SUPPRESSION_BULLET_INCREMENT, 0, 1);
290 AddDebugMessage(
string.Format(
"ThreatExplosion: %1",
distance));
294 float increment = EXPLOSION_MAX_INCREMENT;
297 if (
distance > EXPLOSION_CLOSE_DISTANCE)
298 increment =
Math.Map(
distance, EXPLOSION_CLOSE_DISTANCE, EXPLOSION_MAX_DISTANCE, EXPLOSION_MAX_INCREMENT, 0);
304 m_fThreatSuppression += increment;
314 AddDebugMessage(
string.Format(
"ThreatShotFired: %1, %2",
distance, count));
318 m_fThreatShotsFired =
Math.Clamp(m_fThreatShotsFired + count*(DISTANT_SHOT_INCREMENT + ZERO_DISTANCE_SHOT_INCREMENT/(
distance + 1)), 0,
THREATENED_THRESHOLD);
327 AddDebugMessage(
string.Format(
"ThreatProjectileFlyby"));
330 m_fThreatSuppression =
Math.Clamp(m_fThreatSuppression + count * SUPPRESSION_BULLET_INCREMENT, 0, 1);
335 void GetThreatValues(out
float suppression, out
float shotsFired, out
float injury, out
float endangered)
337 suppression = m_fThreatSuppression;
338 shotsFired = m_fThreatShotsFired;
339 injury = m_fThreatInjury;
340 endangered = m_fThreatIsEndangered;
345 void SetThreatValues(
float suppression,
float shotsFired,
float injury,
float endangered)
347 m_fThreatSuppression = suppression;
348 m_fThreatShotsFired = shotsFired;
349 m_fThreatInjury = injury;
350 m_fThreatIsEndangered = endangered;
359 typename.EnumToString(EAIThreatState, m_State) +
"\n "
360 + m_fThreatTotal.ToString(1,4) +
"\n "
361 + m_fThreatSuppression.ToString(1,4) +
"\n "
362 + m_fThreatShotsFired.ToString(1,4) +
"\n "
363 + m_fThreatInjury.ToString(1,4) +
"\n "
364 + m_fThreatIsEndangered.ToString(1,4));
370 protected void AddDebugMessage(
string str)
proto external EParticleEffectState GetState()