* updated BruteLevel to be PainLevel with burn damage checks in DamageOverlayUiController.cs
* dehardcoded pain level by adding damage groups to paindamagegroups to affect
* re-added the name for painDamageGroups
* fixed overlay default and added minimum limit to component check first
* renamed to PainDamageGroups and removed obsolete tag
{
_overlay.DeadLevel = 0f;
_overlay.CritLevel = 0f;
- _overlay.BruteLevel = 0f;
+ _overlay.PainLevel = 0f;
_overlay.OxygenLevel = 0f;
}
{
case MobState.Alive:
{
- if (EntityManager.HasComponent<PainNumbnessComponent>(entity))
- {
- _overlay.BruteLevel = 0;
- }
- else if (damageable.DamagePerGroup.TryGetValue("Brute", out var bruteDamage))
+ FixedPoint2 painLevel = 0;
+ _overlay.PainLevel = 0;
+
+ if (!EntityManager.HasComponent<PainNumbnessComponent>(entity))
{
- _overlay.BruteLevel = FixedPoint2.Min(1f, bruteDamage / critThreshold).Float();
+ foreach (var painDamageType in damageable.PainDamageGroups)
+ {
+ damageable.DamagePerGroup.TryGetValue(painDamageType, out var painDamage);
+ painLevel += painDamage;
+ }
+ _overlay.PainLevel = FixedPoint2.Min(1f, painLevel / critThreshold).Float();
+
+ if (_overlay.PainLevel < 0.05f) // Don't show damage overlay if they're near enough to max.
+ {
+ _overlay.PainLevel = 0;
+ }
}
if (damageable.DamagePerGroup.TryGetValue("Airloss", out var oxyDamage))
_overlay.OxygenLevel = FixedPoint2.Min(1f, oxyDamage / critThreshold).Float();
}
- if (_overlay.BruteLevel < 0.05f) // Don't show damage overlay if they're near enough to max.
- {
- _overlay.BruteLevel = 0;
- }
-
_overlay.CritLevel = 0;
_overlay.DeadLevel = 0;
break;
return;
_overlay.CritLevel = critLevel.Value.Float();
- _overlay.BruteLevel = 0;
+ _overlay.PainLevel = 0;
_overlay.DeadLevel = 0;
break;
}
case MobState.Dead:
{
- _overlay.BruteLevel = 0;
+ _overlay.PainLevel = 0;
_overlay.CritLevel = 0;
break;
}
/// <summary>
/// Handles the red pulsing overlay
/// </summary>
- public float BruteLevel = 0f;
+ public float PainLevel = 0f;
- private float _oldBruteLevel = 0f;
+ private float _oldPainLevel = 0f;
/// <summary>
/// Handles the darkening overlay.
DeadLevel = 0f;
}
- if (!MathHelper.CloseTo(_oldBruteLevel, BruteLevel, 0.001f))
+ if (!MathHelper.CloseTo(_oldPainLevel, PainLevel, 0.001f))
{
- var diff = BruteLevel - _oldBruteLevel;
- _oldBruteLevel += GetDiff(diff, lastFrameTime);
+ var diff = PainLevel - _oldPainLevel;
+ _oldPainLevel += GetDiff(diff, lastFrameTime);
}
else
{
- _oldBruteLevel = BruteLevel;
+ _oldPainLevel = PainLevel;
}
if (!MathHelper.CloseTo(_oldOxygenLevel, OxygenLevel, 0.001f))
// Makes debugging easier don't @ me
float level = 0f;
- level = _oldBruteLevel;
+ level = _oldPainLevel;
// TODO: Lerping
if (level > 0f && _oldCritLevel <= 0f)
}
else
{
- _oldBruteLevel = BruteLevel;
+ _oldPainLevel = PainLevel;
}
level = State != MobState.Critical ? _oldOxygenLevel : 1f;
[DataField("radiationDamageTypes")]
public List<ProtoId<DamageTypePrototype>> RadiationDamageTypeIDs = new() { "Radiation" };
+ /// <summary>
+ /// Group types that affect the pain overlay.
+ /// </summary>
+ /// TODO: Add support for adding damage types specifically rather than whole damage groups
+ [DataField]
+ public List<ProtoId<DamageGroupPrototype>> PainDamageGroups = new() { "Brute", "Burn" };
+
[DataField]
public Dictionary<MobState, ProtoId<HealthIconPrototype>> HealthIcons = new()
{