1
0

ApcVisualizerSystem.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using Content.Shared.APC;
  2. using JetBrains.Annotations;
  3. using Robust.Client.GameObjects;
  4. namespace Content.Client.Power.APC;
  5. public sealed class ApcVisualizerSystem : VisualizerSystem<ApcVisualsComponent>
  6. {
  7. [Dependency] private readonly SharedPointLightSystem _lights = default!;
  8. protected override void OnAppearanceChange(EntityUid uid, ApcVisualsComponent comp, ref AppearanceChangeEvent args)
  9. {
  10. if (args.Sprite == null)
  11. return;
  12. // get the mapped layer index of the first lock layer and the first channel layer
  13. var lockIndicatorOverlayStart = args.Sprite.LayerMapGet(ApcVisualLayers.InterfaceLock);
  14. var channelIndicatorOverlayStart = args.Sprite.LayerMapGet(ApcVisualLayers.Equipment);
  15. // Handle APC screen overlay:
  16. if(!AppearanceSystem.TryGetData<ApcChargeState>(uid, ApcVisuals.ChargeState, out var chargeState, args.Component))
  17. chargeState = ApcChargeState.Lack;
  18. if (chargeState >= 0 && chargeState < ApcChargeState.NumStates)
  19. {
  20. args.Sprite.LayerSetState(ApcVisualLayers.ChargeState, $"{comp.ScreenPrefix}-{comp.ScreenSuffixes[(sbyte)chargeState]}");
  21. // LockState does nothing currently. The backend doesn't exist.
  22. if (AppearanceSystem.TryGetData<byte>(uid, ApcVisuals.LockState, out var lockStates, args.Component))
  23. {
  24. for(var i = 0; i < comp.LockIndicators; ++i)
  25. {
  26. var layer = ((byte)lockIndicatorOverlayStart + i);
  27. sbyte lockState = (sbyte)((lockStates >> (i << (sbyte)ApcLockState.LogWidth)) & (sbyte)ApcLockState.All);
  28. args.Sprite.LayerSetState(layer, $"{comp.LockPrefix}{i}-{comp.LockSuffixes[lockState]}");
  29. args.Sprite.LayerSetVisible(layer, true);
  30. }
  31. }
  32. // ChannelState does nothing currently. The backend doesn't exist.
  33. if (AppearanceSystem.TryGetData<byte>(uid, ApcVisuals.ChannelState, out var channelStates, args.Component))
  34. {
  35. for(var i = 0; i < comp.ChannelIndicators; ++i)
  36. {
  37. var layer = ((byte)channelIndicatorOverlayStart + i);
  38. sbyte channelState = (sbyte)((channelStates >> (i << (sbyte)ApcChannelState.LogWidth)) & (sbyte)ApcChannelState.All);
  39. args.Sprite.LayerSetState(layer, $"{comp.ChannelPrefix}{i}-{comp.ChannelSuffixes[channelState]}");
  40. args.Sprite.LayerSetVisible(layer, true);
  41. }
  42. }
  43. if (TryComp<PointLightComponent>(uid, out var light))
  44. {
  45. _lights.SetColor(uid, comp.ScreenColors[(sbyte)chargeState], light);
  46. }
  47. }
  48. else
  49. {
  50. /// Overrides all of the lock and channel indicators.
  51. args.Sprite.LayerSetState(ApcVisualLayers.ChargeState, comp.EmaggedScreenState);
  52. for(var i = 0; i < comp.LockIndicators; ++i)
  53. {
  54. var layer = ((byte)lockIndicatorOverlayStart + i);
  55. args.Sprite.LayerSetVisible(layer, false);
  56. }
  57. for(var i = 0; i < comp.ChannelIndicators; ++i)
  58. {
  59. var layer = ((byte)channelIndicatorOverlayStart + i);
  60. args.Sprite.LayerSetVisible(layer, false);
  61. }
  62. if (TryComp<PointLightComponent>(uid, out var light))
  63. {
  64. _lights.SetColor(uid, comp.EmaggedScreenColor, light);
  65. }
  66. }
  67. }
  68. }
  69. enum ApcVisualLayers : byte
  70. {
  71. /// <summary>
  72. /// The sprite layer used for the interface lock indicator light overlay.
  73. /// </summary>
  74. InterfaceLock,
  75. /// <summary>
  76. /// The sprite layer used for the panel lock indicator light overlay.
  77. /// </summary>
  78. PanelLock,
  79. /// <summary>
  80. /// The sprite layer used for the equipment channel indicator light overlay.
  81. /// </summary>
  82. Equipment,
  83. /// <summary>
  84. /// The sprite layer used for the lighting channel indicator light overlay.
  85. /// </summary>
  86. Lighting,
  87. /// <summary>
  88. /// The sprite layer used for the environment channel indicator light overlay.
  89. /// </summary>
  90. Environment,
  91. /// <summary>
  92. /// The sprite layer used for the APC screen overlay.
  93. /// </summary>
  94. ChargeState,
  95. }