OptionsVisualizerSystem.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using Content.Shared.CCVar;
  2. using Robust.Client.GameObjects;
  3. using Robust.Shared.Configuration;
  4. using Robust.Shared.Reflection;
  5. namespace Content.Client.Options;
  6. /// <summary>
  7. /// Implements <see cref="OptionsVisualizerComponent"/>.
  8. /// </summary>
  9. public sealed class OptionsVisualizerSystem : EntitySystem
  10. {
  11. private static readonly (OptionVisualizerOptions, CVarDef<bool>)[] OptionVars =
  12. {
  13. (OptionVisualizerOptions.Test, CCVars.DebugOptionVisualizerTest),
  14. (OptionVisualizerOptions.ReducedMotion, CCVars.ReducedMotion),
  15. };
  16. [Dependency] private readonly IConfigurationManager _cfg = default!;
  17. [Dependency] private readonly IReflectionManager _reflection = default!;
  18. private OptionVisualizerOptions _currentOptions;
  19. public override void Initialize()
  20. {
  21. base.Initialize();
  22. foreach (var (_, cvar) in OptionVars)
  23. {
  24. Subs.CVar(_cfg, cvar, _ => CVarChanged());
  25. }
  26. UpdateActiveOptions();
  27. SubscribeLocalEvent<OptionsVisualizerComponent, ComponentStartup>(OnComponentStartup);
  28. }
  29. private void CVarChanged()
  30. {
  31. UpdateActiveOptions();
  32. UpdateAllComponents();
  33. }
  34. private void UpdateActiveOptions()
  35. {
  36. _currentOptions = OptionVisualizerOptions.Default;
  37. foreach (var (value, cVar) in OptionVars)
  38. {
  39. if (_cfg.GetCVar(cVar))
  40. _currentOptions |= value;
  41. }
  42. }
  43. private void UpdateAllComponents()
  44. {
  45. var query = EntityQueryEnumerator<OptionsVisualizerComponent, SpriteComponent>();
  46. while (query.MoveNext(out _, out var component, out var sprite))
  47. {
  48. UpdateComponent(component, sprite);
  49. }
  50. }
  51. private void OnComponentStartup(EntityUid uid, OptionsVisualizerComponent component, ComponentStartup args)
  52. {
  53. if (!TryComp(uid, out SpriteComponent? sprite))
  54. return;
  55. UpdateComponent(component, sprite);
  56. }
  57. private void UpdateComponent(OptionsVisualizerComponent component, SpriteComponent sprite)
  58. {
  59. foreach (var (layerKeyRaw, layerData) in component.Visuals)
  60. {
  61. object layerKey = _reflection.TryParseEnumReference(layerKeyRaw, out var @enum)
  62. ? @enum
  63. : layerKeyRaw;
  64. OptionsVisualizerComponent.LayerDatum? matchedDatum = null;
  65. foreach (var datum in layerData)
  66. {
  67. if ((datum.Options & _currentOptions) != datum.Options)
  68. continue;
  69. matchedDatum = datum;
  70. }
  71. if (matchedDatum == null)
  72. continue;
  73. var layerIndex = sprite.LayerMapReserveBlank(layerKey);
  74. sprite.LayerSetData(layerIndex, matchedDatum.Data);
  75. }
  76. }
  77. }