Damage overlay fixes (#9831)

- Fix death overlay showing when returning to body.
- Made the diff non-linear.
This commit is contained in:
metalgearsloth
2022-07-19 17:09:26 +10:00
committed by GitHub
parent 209212d87d
commit 91adb3edb3
2 changed files with 22 additions and 15 deletions

View File

@@ -55,6 +55,7 @@ public sealed partial class MobStateSystem : SharedMobStateSystem
{ {
if (TryComp<MobStateComponent>(ev.Entity, out var mobState) && TryComp<DamageableComponent>(ev.Entity, out var damageable)) if (TryComp<MobStateComponent>(ev.Entity, out var mobState) && TryComp<DamageableComponent>(ev.Entity, out var damageable))
{ {
_overlay.DeadLevel = 0f;
SetLevel(mobState, damageable.TotalDamage); SetLevel(mobState, damageable.TotalDamage);
} }
else else

View File

@@ -40,7 +40,7 @@ public sealed class DamageOverlay : Overlay
private float _oldCritLevel = 0f; private float _oldCritLevel = 0f;
private float _deadLevel = 1f; public float DeadLevel = 1f;
public DamageOverlay() public DamageOverlay()
{ {
@@ -64,7 +64,6 @@ public sealed class DamageOverlay : Overlay
var viewport = args.ViewportBounds; var viewport = args.ViewportBounds;
var handle = args.ScreenHandle; var handle = args.ScreenHandle;
var distance = args.ViewportBounds.Width; var distance = args.ViewportBounds.Width;
var lerpRate = 0.2f;
var time = (float) _timing.RealTime.TotalSeconds; var time = (float) _timing.RealTime.TotalSeconds;
var lastFrameTime = (float) _timing.FrameTime.TotalSeconds; var lastFrameTime = (float) _timing.FrameTime.TotalSeconds;
@@ -72,30 +71,30 @@ public sealed class DamageOverlay : Overlay
// If they just died then lerp out the white overlay. // If they just died then lerp out the white overlay.
if (State != DamageState.Dead) if (State != DamageState.Dead)
{ {
_deadLevel = 1f; DeadLevel = 1f;
} }
else if (!_deadLevel.Equals(0f)) else if (!DeadLevel.Equals(0f))
{ {
var diff = -_deadLevel; var diff = -DeadLevel;
_deadLevel += GetDiff(diff, lerpRate, lastFrameTime); DeadLevel += GetDiff(diff, lastFrameTime);
} }
if (!_oldBruteLevel.Equals(BruteLevel)) if (!MathHelper.CloseTo(_oldBruteLevel, BruteLevel, 0.001f))
{ {
var diff = BruteLevel - _oldBruteLevel; var diff = BruteLevel - _oldBruteLevel;
_oldBruteLevel += GetDiff(diff, lerpRate, lastFrameTime); _oldBruteLevel += GetDiff(diff, lastFrameTime);
} }
if (!_oldOxygenLevel.Equals(OxygenLevel)) if (!MathHelper.CloseTo(_oldOxygenLevel, OxygenLevel, 0.001f))
{ {
var diff = OxygenLevel - _oldOxygenLevel; var diff = OxygenLevel - _oldOxygenLevel;
_oldOxygenLevel += GetDiff(diff, lerpRate, lastFrameTime); _oldOxygenLevel += GetDiff(diff, lastFrameTime);
} }
if (!_oldCritLevel.Equals(CritLevel)) if (!MathHelper.CloseTo(_oldCritLevel, CritLevel, 0.001f))
{ {
var diff = CritLevel - _oldCritLevel; var diff = CritLevel - _oldCritLevel;
_oldCritLevel += GetDiff(diff, lerpRate, lastFrameTime); _oldCritLevel += GetDiff(diff, lastFrameTime);
} }
/* /*
@@ -190,7 +189,7 @@ public sealed class DamageOverlay : Overlay
handle.DrawRect(viewport, Color.White); handle.DrawRect(viewport, Color.White);
} }
level = State != DamageState.Dead ? _oldCritLevel : _deadLevel; level = State != DamageState.Dead ? _oldCritLevel : DeadLevel;
if (level > 0f) if (level > 0f)
{ {
@@ -217,8 +216,15 @@ public sealed class DamageOverlay : Overlay
} }
} }
private float GetDiff(float value, float lerpRate, float lastFrameTime) private float GetDiff(float value, float lastFrameTime)
{ {
return Math.Clamp(value, -1 * lerpRate * lastFrameTime, lerpRate * lastFrameTime); var adjustment = value * 5f * lastFrameTime;
if (value < 0f)
adjustment = Math.Clamp(adjustment, value, -value);
else
adjustment = Math.Clamp(adjustment, -value, value);
return adjustment;
} }
} }