From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Thu, 10 Jul 2025 09:30:58 +0000 (+0200) Subject: reduced motion flash effect version 3 (#37824) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=415ba2e2749b16102dda9b3c90932e5ca4032766;p=space-station-14.git reduced motion flash effect version 3 (#37824) * V3 * Apply suggestions from code review --- diff --git a/Content.Client/Flash/FlashOverlay.cs b/Content.Client/Flash/FlashOverlay.cs index 824efb78f3..72567530c0 100644 --- a/Content.Client/Flash/FlashOverlay.cs +++ b/Content.Client/Flash/FlashOverlay.cs @@ -1,8 +1,10 @@ +using Content.Shared.CCVar; using Content.Shared.Flash; using Content.Shared.Flash.Components; using Content.Shared.StatusEffect; using Robust.Client.Graphics; using Robust.Client.Player; +using Robust.Shared.Configuration; using Robust.Shared.Enums; using Robust.Shared.Prototypes; using Robust.Shared.Timing; @@ -17,13 +19,15 @@ namespace Content.Client.Flash [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly IConfigurationManager _configManager = default!; private readonly SharedFlashSystem _flash; private readonly StatusEffectsSystem _statusSys; public override OverlaySpace Space => OverlaySpace.WorldSpace; private readonly ShaderInstance _shader; - public float PercentComplete = 0.0f; + private bool _reducedMotion; + public float PercentComplete; public Texture? ScreenshotTexture; public FlashOverlay() @@ -32,6 +36,8 @@ namespace Content.Client.Flash _shader = _prototypeManager.Index(FlashedEffectShader).InstanceUnique(); _flash = _entityManager.System(); _statusSys = _entityManager.System(); + + _configManager.OnValueChanged(CCVars.ReducedMotion, (b) => { _reducedMotion = b; }, invokeImmediately: true); } protected override void FrameUpdate(FrameEventArgs args) @@ -49,8 +55,8 @@ namespace Content.Client.Flash return; var curTime = _timing.CurTime; - var lastsFor = (float) (time.Value.Item2 - time.Value.Item1).TotalSeconds; - var timeDone = (float) (curTime - time.Value.Item1).TotalSeconds; + var lastsFor = (float)(time.Value.Item2 - time.Value.Item1).TotalSeconds; + var timeDone = (float)(curTime - time.Value.Item1).TotalSeconds; PercentComplete = timeDone / lastsFor; } @@ -76,10 +82,22 @@ namespace Content.Client.Flash return; var worldHandle = args.WorldHandle; - _shader.SetParameter("percentComplete", PercentComplete); - worldHandle.UseShader(_shader); - worldHandle.DrawTextureRectRegion(ScreenshotTexture, args.WorldBounds); - worldHandle.UseShader(null); + if (_reducedMotion) + { + // TODO: This is a very simple placeholder. + // Replace it with a proper shader once we come up with something good. + // Turns out making an effect that is supposed to be a bright, sudden, and disorienting flash + // not do any of that while also being equivalent in terms of game balance is hard. + var alpha = 1 - MathF.Pow(PercentComplete, 8f); // similar falloff curve to the flash shader + worldHandle.DrawRect(args.WorldBounds, new Color(0f, 0f, 0f, alpha)); + } + else + { + _shader.SetParameter("percentComplete", PercentComplete); + worldHandle.UseShader(_shader); + worldHandle.DrawTextureRectRegion(ScreenshotTexture, args.WorldBounds); + worldHandle.UseShader(null); + } } protected override void DisposeBehavior()