]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Screen Shake Intensity Slider in Accessibility Settings (#24749)
authorPsychpsyo <60073468+Psychpsyo@users.noreply.github.com>
Fri, 2 Feb 2024 12:39:12 +0000 (13:39 +0100)
committerGitHub <noreply@github.com>
Fri, 2 Feb 2024 12:39:12 +0000 (13:39 +0100)
* Reduced motion toggle disables screen shake

* Actually, screen shake is its own slider instead

* Cache screen shake intensity cvar

Content.Client/Camera/CameraRecoilSystem.cs
Content.Client/Options/UI/Tabs/MiscTab.xaml
Content.Client/Options/UI/Tabs/MiscTab.xaml.cs
Content.Shared/CCVar/CCVars.cs
Resources/Locale/en-US/escape-menu/ui/options-menu.ftl

index 65a3fc71c70957278a417eb624d8a8089a712620..bb419b465d3247bc6030988938de972acb1c62c2 100644 (file)
@@ -1,14 +1,34 @@
 using System.Numerics;
 using Content.Shared.Camera;
+using Content.Shared.CCVar;
+using Robust.Shared.Configuration;
 
 namespace Content.Client.Camera;
 
 public sealed class CameraRecoilSystem : SharedCameraRecoilSystem
 {
+    [Dependency] private readonly IConfigurationManager _configManager = default!;
+
+    protected float Intensity;
+
     public override void Initialize()
     {
         base.Initialize();
         SubscribeNetworkEvent<CameraKickEvent>(OnCameraKick);
+
+        _configManager.OnValueChanged(CCVars.ScreenShakeIntensity, OnCvarChanged, true);
+    }
+
+    public override void Shutdown()
+    {
+        base.Shutdown();
+
+        _configManager.UnsubValueChanged(CCVars.ScreenShakeIntensity, OnCvarChanged);
+    }
+
+    private void OnCvarChanged(float value)
+    {
+        Intensity = value;
     }
 
     private void OnCameraKick(CameraKickEvent ev)
@@ -18,9 +38,14 @@ public sealed class CameraRecoilSystem : SharedCameraRecoilSystem
 
     public override void KickCamera(EntityUid uid, Vector2 recoil, CameraRecoilComponent? component = null)
     {
+        if (Intensity == 0)
+            return;
+
         if (!Resolve(uid, ref component, false))
             return;
 
+        recoil *= Intensity;
+
         // Use really bad math to "dampen" kicks when we're already kicked.
         var existing = component.CurrentKick.Length();
         var dampen = existing / KickMagnitudeMax;
index e37333b0e45d1872abd0fa4e4a4d0b7adf5d2ba6..db176db456c794b02acbd91b348d78251f2bec33 100644 (file)
                    FontColorOverride="{xNamespace:Static s:StyleNano.NanoGold}"
                    StyleClasses="LabelKeyText"/>
             <CheckBox Name="ReducedMotionCheckBox" Text="{Loc 'ui-options-reduced-motion'}" />
+            <BoxContainer Orientation="Horizontal">
+                <Label Text="{Loc 'ui-options-screen-shake-intensity'}" Margin="8 0" />
+                <Slider Name="ScreenShakeIntensitySlider"
+                        MinValue="0"
+                        MaxValue="100"
+                        Rounded="True"
+                        MinWidth="200" />
+                <Label Name="ScreenShakeIntensityLabel" Margin="8 0" />
+            </BoxContainer>
             <Label Text="{Loc 'ui-options-general-discord'}"
                    FontColorOverride="{xNamespace:Static s:StyleNano.NanoGold}"
                    StyleClasses="LabelKeyText"/>
index 1d6975722edfa3b3f1c70874db5b373465a919e6..b5dcf6477b73de4cac59867b78111b9711ef8ce3 100644 (file)
@@ -9,6 +9,7 @@ using Robust.Client.UserInterface.XAML;
 using Robust.Shared;
 using Robust.Shared.Configuration;
 using Robust.Shared.Prototypes;
+using Range = Robust.Client.UserInterface.Controls.Range;
 
 namespace Content.Client.Options.UI.Tabs
 {
@@ -63,6 +64,7 @@ namespace Content.Client.Options.UI.Tabs
             FancySpeechBubblesCheckBox.OnToggled += OnCheckBoxToggled;
             FancyNameBackgroundsCheckBox.OnToggled += OnCheckBoxToggled;
             ReducedMotionCheckBox.OnToggled += OnCheckBoxToggled;
+            ScreenShakeIntensitySlider.OnValueChanged += OnScreenShakeIntensitySliderChanged;
             // ToggleWalk.OnToggled += OnCheckBoxToggled;
             StaticStorageUI.OnToggled += OnCheckBoxToggled;
 
@@ -74,6 +76,8 @@ namespace Content.Client.Options.UI.Tabs
             OpaqueStorageWindowCheckBox.Pressed = _cfg.GetCVar(CCVars.OpaqueStorageWindow);
             FancySpeechBubblesCheckBox.Pressed = _cfg.GetCVar(CCVars.ChatEnableFancyBubbles);
             FancyNameBackgroundsCheckBox.Pressed = _cfg.GetCVar(CCVars.ChatFancyNameBackground);
+            ReducedMotionCheckBox.Pressed = _cfg.GetCVar(CCVars.ReducedMotion);
+            ScreenShakeIntensitySlider.Value = _cfg.GetCVar(CCVars.ScreenShakeIntensity) * 100f;
             // ToggleWalk.Pressed = _cfg.GetCVar(CCVars.ToggleWalk);
             StaticStorageUI.Pressed = _cfg.GetCVar(CCVars.StaticStorageUI);
 
@@ -93,6 +97,12 @@ namespace Content.Client.Options.UI.Tabs
             UpdateApplyButton();
         }
 
+        private void OnScreenShakeIntensitySliderChanged(Range obj)
+        {
+            ScreenShakeIntensityLabel.Text = Loc.GetString("ui-options-screen-shake-percent", ("intensity", ScreenShakeIntensitySlider.Value / 100f));
+            UpdateApplyButton();
+        }
+
         private void OnApplyButtonPressed(BaseButton.ButtonEventArgs args)
         {
             foreach (var theme in _prototypeManager.EnumeratePrototypes<HudThemePrototype>())
@@ -111,6 +121,7 @@ namespace Content.Client.Options.UI.Tabs
             _cfg.SetCVar(CCVars.ChatEnableFancyBubbles, FancySpeechBubblesCheckBox.Pressed);
             _cfg.SetCVar(CCVars.ChatFancyNameBackground, FancyNameBackgroundsCheckBox.Pressed);
             _cfg.SetCVar(CCVars.ReducedMotion, ReducedMotionCheckBox.Pressed);
+            _cfg.SetCVar(CCVars.ScreenShakeIntensity, ScreenShakeIntensitySlider.Value / 100f);
             // _cfg.SetCVar(CCVars.ToggleWalk, ToggleWalk.Pressed);
             _cfg.SetCVar(CCVars.StaticStorageUI, StaticStorageUI.Pressed);
 
@@ -135,6 +146,7 @@ namespace Content.Client.Options.UI.Tabs
             var isFancyChatSame = FancySpeechBubblesCheckBox.Pressed == _cfg.GetCVar(CCVars.ChatEnableFancyBubbles);
             var isFancyBackgroundSame = FancyNameBackgroundsCheckBox.Pressed == _cfg.GetCVar(CCVars.ChatFancyNameBackground);
             var isReducedMotionSame = ReducedMotionCheckBox.Pressed == _cfg.GetCVar(CCVars.ReducedMotion);
+            var isScreenShakeIntensitySame = Math.Abs(ScreenShakeIntensitySlider.Value / 100f - _cfg.GetCVar(CCVars.ScreenShakeIntensity)) < 0.01f;
             // var isToggleWalkSame = ToggleWalk.Pressed == _cfg.GetCVar(CCVars.ToggleWalk);
             var isStaticStorageUISame = StaticStorageUI.Pressed == _cfg.GetCVar(CCVars.StaticStorageUI);
 
@@ -148,6 +160,7 @@ namespace Content.Client.Options.UI.Tabs
                                    isFancyChatSame &&
                                    isFancyBackgroundSame &&
                                    isReducedMotionSame &&
+                                   isScreenShakeIntensitySame &&
                                    // isToggleWalkSame &&
                                    isStaticStorageUISame;
         }
index 08c80abdc89fe7a7858c89ee3a450c533e202dbd..a6cb084c9eda46e325bc2f8f65e6c381099c5b08 100644 (file)
@@ -1564,6 +1564,13 @@ namespace Content.Shared.CCVar
         public static readonly CVarDef<bool> ReducedMotion =
             CVarDef.Create("accessibility.reduced_motion", false, CVar.CLIENTONLY | CVar.ARCHIVE);
 
+        /// <summary>
+        /// Screen shake intensity slider, controlling the intensity of the CameraRecoilSystem.
+        /// Goes from 0 (no recoil at all) to 1 (regular amounts of recoil)
+        /// </summary>
+        public static readonly CVarDef<float> ScreenShakeIntensity =
+            CVarDef.Create("accessibility.screen_shake_intensity", 1f, CVar.CLIENTONLY | CVar.ARCHIVE);
+
         /*
          * CHAT
          */
index a0f90845b887be635574ed6b11f1fd4eae51bffa..4dd0ea9eb195eb26a8ee6f01c15f02cbe4013f5b 100644 (file)
@@ -46,6 +46,8 @@ ui-options-show-looc-on-head = Show LOOC chat above characters head
 ui-options-fancy-speech = Show names in speech bubbles
 ui-options-fancy-name-background = Add background to speech bubble names
 ui-options-reduced-motion = Reduce motion of visual effects
+ui-options-screen-shake-intensity = Screen shake intensity
+ui-options-screen-shake-percent = { TOSTRING($intensity, "P0") }
 ui-options-vsync = VSync
 ui-options-fullscreen = Fullscreen
 ui-options-lighting-label = Lighting Quality: