Screen Shake Intensity Slider in Accessibility Settings (#24749)
* Reduced motion toggle disables screen shake * Actually, screen shake is its own slider instead * Cache screen shake intensity cvar
This commit is contained in:
@@ -1,14 +1,34 @@
|
|||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Content.Shared.Camera;
|
using Content.Shared.Camera;
|
||||||
|
using Content.Shared.CCVar;
|
||||||
|
using Robust.Shared.Configuration;
|
||||||
|
|
||||||
namespace Content.Client.Camera;
|
namespace Content.Client.Camera;
|
||||||
|
|
||||||
public sealed class CameraRecoilSystem : SharedCameraRecoilSystem
|
public sealed class CameraRecoilSystem : SharedCameraRecoilSystem
|
||||||
{
|
{
|
||||||
|
[Dependency] private readonly IConfigurationManager _configManager = default!;
|
||||||
|
|
||||||
|
protected float Intensity;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
SubscribeNetworkEvent<CameraKickEvent>(OnCameraKick);
|
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)
|
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)
|
public override void KickCamera(EntityUid uid, Vector2 recoil, CameraRecoilComponent? component = null)
|
||||||
{
|
{
|
||||||
|
if (Intensity == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!Resolve(uid, ref component, false))
|
if (!Resolve(uid, ref component, false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
recoil *= Intensity;
|
||||||
|
|
||||||
// Use really bad math to "dampen" kicks when we're already kicked.
|
// Use really bad math to "dampen" kicks when we're already kicked.
|
||||||
var existing = component.CurrentKick.Length();
|
var existing = component.CurrentKick.Length();
|
||||||
var dampen = existing / KickMagnitudeMax;
|
var dampen = existing / KickMagnitudeMax;
|
||||||
|
|||||||
@@ -22,6 +22,15 @@
|
|||||||
FontColorOverride="{xNamespace:Static s:StyleNano.NanoGold}"
|
FontColorOverride="{xNamespace:Static s:StyleNano.NanoGold}"
|
||||||
StyleClasses="LabelKeyText"/>
|
StyleClasses="LabelKeyText"/>
|
||||||
<CheckBox Name="ReducedMotionCheckBox" Text="{Loc 'ui-options-reduced-motion'}" />
|
<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'}"
|
<Label Text="{Loc 'ui-options-general-discord'}"
|
||||||
FontColorOverride="{xNamespace:Static s:StyleNano.NanoGold}"
|
FontColorOverride="{xNamespace:Static s:StyleNano.NanoGold}"
|
||||||
StyleClasses="LabelKeyText"/>
|
StyleClasses="LabelKeyText"/>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using Robust.Client.UserInterface.XAML;
|
|||||||
using Robust.Shared;
|
using Robust.Shared;
|
||||||
using Robust.Shared.Configuration;
|
using Robust.Shared.Configuration;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
using Range = Robust.Client.UserInterface.Controls.Range;
|
||||||
|
|
||||||
namespace Content.Client.Options.UI.Tabs
|
namespace Content.Client.Options.UI.Tabs
|
||||||
{
|
{
|
||||||
@@ -63,6 +64,7 @@ namespace Content.Client.Options.UI.Tabs
|
|||||||
FancySpeechBubblesCheckBox.OnToggled += OnCheckBoxToggled;
|
FancySpeechBubblesCheckBox.OnToggled += OnCheckBoxToggled;
|
||||||
FancyNameBackgroundsCheckBox.OnToggled += OnCheckBoxToggled;
|
FancyNameBackgroundsCheckBox.OnToggled += OnCheckBoxToggled;
|
||||||
ReducedMotionCheckBox.OnToggled += OnCheckBoxToggled;
|
ReducedMotionCheckBox.OnToggled += OnCheckBoxToggled;
|
||||||
|
ScreenShakeIntensitySlider.OnValueChanged += OnScreenShakeIntensitySliderChanged;
|
||||||
// ToggleWalk.OnToggled += OnCheckBoxToggled;
|
// ToggleWalk.OnToggled += OnCheckBoxToggled;
|
||||||
StaticStorageUI.OnToggled += OnCheckBoxToggled;
|
StaticStorageUI.OnToggled += OnCheckBoxToggled;
|
||||||
|
|
||||||
@@ -74,6 +76,8 @@ namespace Content.Client.Options.UI.Tabs
|
|||||||
OpaqueStorageWindowCheckBox.Pressed = _cfg.GetCVar(CCVars.OpaqueStorageWindow);
|
OpaqueStorageWindowCheckBox.Pressed = _cfg.GetCVar(CCVars.OpaqueStorageWindow);
|
||||||
FancySpeechBubblesCheckBox.Pressed = _cfg.GetCVar(CCVars.ChatEnableFancyBubbles);
|
FancySpeechBubblesCheckBox.Pressed = _cfg.GetCVar(CCVars.ChatEnableFancyBubbles);
|
||||||
FancyNameBackgroundsCheckBox.Pressed = _cfg.GetCVar(CCVars.ChatFancyNameBackground);
|
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);
|
// ToggleWalk.Pressed = _cfg.GetCVar(CCVars.ToggleWalk);
|
||||||
StaticStorageUI.Pressed = _cfg.GetCVar(CCVars.StaticStorageUI);
|
StaticStorageUI.Pressed = _cfg.GetCVar(CCVars.StaticStorageUI);
|
||||||
|
|
||||||
@@ -93,6 +97,12 @@ namespace Content.Client.Options.UI.Tabs
|
|||||||
UpdateApplyButton();
|
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)
|
private void OnApplyButtonPressed(BaseButton.ButtonEventArgs args)
|
||||||
{
|
{
|
||||||
foreach (var theme in _prototypeManager.EnumeratePrototypes<HudThemePrototype>())
|
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.ChatEnableFancyBubbles, FancySpeechBubblesCheckBox.Pressed);
|
||||||
_cfg.SetCVar(CCVars.ChatFancyNameBackground, FancyNameBackgroundsCheckBox.Pressed);
|
_cfg.SetCVar(CCVars.ChatFancyNameBackground, FancyNameBackgroundsCheckBox.Pressed);
|
||||||
_cfg.SetCVar(CCVars.ReducedMotion, ReducedMotionCheckBox.Pressed);
|
_cfg.SetCVar(CCVars.ReducedMotion, ReducedMotionCheckBox.Pressed);
|
||||||
|
_cfg.SetCVar(CCVars.ScreenShakeIntensity, ScreenShakeIntensitySlider.Value / 100f);
|
||||||
// _cfg.SetCVar(CCVars.ToggleWalk, ToggleWalk.Pressed);
|
// _cfg.SetCVar(CCVars.ToggleWalk, ToggleWalk.Pressed);
|
||||||
_cfg.SetCVar(CCVars.StaticStorageUI, StaticStorageUI.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 isFancyChatSame = FancySpeechBubblesCheckBox.Pressed == _cfg.GetCVar(CCVars.ChatEnableFancyBubbles);
|
||||||
var isFancyBackgroundSame = FancyNameBackgroundsCheckBox.Pressed == _cfg.GetCVar(CCVars.ChatFancyNameBackground);
|
var isFancyBackgroundSame = FancyNameBackgroundsCheckBox.Pressed == _cfg.GetCVar(CCVars.ChatFancyNameBackground);
|
||||||
var isReducedMotionSame = ReducedMotionCheckBox.Pressed == _cfg.GetCVar(CCVars.ReducedMotion);
|
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 isToggleWalkSame = ToggleWalk.Pressed == _cfg.GetCVar(CCVars.ToggleWalk);
|
||||||
var isStaticStorageUISame = StaticStorageUI.Pressed == _cfg.GetCVar(CCVars.StaticStorageUI);
|
var isStaticStorageUISame = StaticStorageUI.Pressed == _cfg.GetCVar(CCVars.StaticStorageUI);
|
||||||
|
|
||||||
@@ -148,6 +160,7 @@ namespace Content.Client.Options.UI.Tabs
|
|||||||
isFancyChatSame &&
|
isFancyChatSame &&
|
||||||
isFancyBackgroundSame &&
|
isFancyBackgroundSame &&
|
||||||
isReducedMotionSame &&
|
isReducedMotionSame &&
|
||||||
|
isScreenShakeIntensitySame &&
|
||||||
// isToggleWalkSame &&
|
// isToggleWalkSame &&
|
||||||
isStaticStorageUISame;
|
isStaticStorageUISame;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1564,6 +1564,13 @@ namespace Content.Shared.CCVar
|
|||||||
public static readonly CVarDef<bool> ReducedMotion =
|
public static readonly CVarDef<bool> ReducedMotion =
|
||||||
CVarDef.Create("accessibility.reduced_motion", false, CVar.CLIENTONLY | CVar.ARCHIVE);
|
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
|
* CHAT
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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-speech = Show names in speech bubbles
|
||||||
ui-options-fancy-name-background = Add background to speech bubble names
|
ui-options-fancy-name-background = Add background to speech bubble names
|
||||||
ui-options-reduced-motion = Reduce motion of visual effects
|
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-vsync = VSync
|
||||||
ui-options-fullscreen = Fullscreen
|
ui-options-fullscreen = Fullscreen
|
||||||
ui-options-lighting-label = Lighting Quality:
|
ui-options-lighting-label = Lighting Quality:
|
||||||
|
|||||||
Reference in New Issue
Block a user