| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- using Content.Shared.APC;
- using JetBrains.Annotations;
- using Robust.Client.GameObjects;
- namespace Content.Client.Power.APC;
- public sealed class ApcVisualizerSystem : VisualizerSystem<ApcVisualsComponent>
- {
- [Dependency] private readonly SharedPointLightSystem _lights = default!;
- protected override void OnAppearanceChange(EntityUid uid, ApcVisualsComponent comp, ref AppearanceChangeEvent args)
- {
- if (args.Sprite == null)
- return;
- // get the mapped layer index of the first lock layer and the first channel layer
- var lockIndicatorOverlayStart = args.Sprite.LayerMapGet(ApcVisualLayers.InterfaceLock);
- var channelIndicatorOverlayStart = args.Sprite.LayerMapGet(ApcVisualLayers.Equipment);
- // Handle APC screen overlay:
- if(!AppearanceSystem.TryGetData<ApcChargeState>(uid, ApcVisuals.ChargeState, out var chargeState, args.Component))
- chargeState = ApcChargeState.Lack;
- if (chargeState >= 0 && chargeState < ApcChargeState.NumStates)
- {
- args.Sprite.LayerSetState(ApcVisualLayers.ChargeState, $"{comp.ScreenPrefix}-{comp.ScreenSuffixes[(sbyte)chargeState]}");
- // LockState does nothing currently. The backend doesn't exist.
- if (AppearanceSystem.TryGetData<byte>(uid, ApcVisuals.LockState, out var lockStates, args.Component))
- {
- for(var i = 0; i < comp.LockIndicators; ++i)
- {
- var layer = ((byte)lockIndicatorOverlayStart + i);
- sbyte lockState = (sbyte)((lockStates >> (i << (sbyte)ApcLockState.LogWidth)) & (sbyte)ApcLockState.All);
- args.Sprite.LayerSetState(layer, $"{comp.LockPrefix}{i}-{comp.LockSuffixes[lockState]}");
- args.Sprite.LayerSetVisible(layer, true);
- }
- }
- // ChannelState does nothing currently. The backend doesn't exist.
- if (AppearanceSystem.TryGetData<byte>(uid, ApcVisuals.ChannelState, out var channelStates, args.Component))
- {
- for(var i = 0; i < comp.ChannelIndicators; ++i)
- {
- var layer = ((byte)channelIndicatorOverlayStart + i);
- sbyte channelState = (sbyte)((channelStates >> (i << (sbyte)ApcChannelState.LogWidth)) & (sbyte)ApcChannelState.All);
- args.Sprite.LayerSetState(layer, $"{comp.ChannelPrefix}{i}-{comp.ChannelSuffixes[channelState]}");
- args.Sprite.LayerSetVisible(layer, true);
- }
- }
- if (TryComp<PointLightComponent>(uid, out var light))
- {
- _lights.SetColor(uid, comp.ScreenColors[(sbyte)chargeState], light);
- }
- }
- else
- {
- /// Overrides all of the lock and channel indicators.
- args.Sprite.LayerSetState(ApcVisualLayers.ChargeState, comp.EmaggedScreenState);
- for(var i = 0; i < comp.LockIndicators; ++i)
- {
- var layer = ((byte)lockIndicatorOverlayStart + i);
- args.Sprite.LayerSetVisible(layer, false);
- }
- for(var i = 0; i < comp.ChannelIndicators; ++i)
- {
- var layer = ((byte)channelIndicatorOverlayStart + i);
- args.Sprite.LayerSetVisible(layer, false);
- }
- if (TryComp<PointLightComponent>(uid, out var light))
- {
- _lights.SetColor(uid, comp.EmaggedScreenColor, light);
- }
- }
- }
- }
- enum ApcVisualLayers : byte
- {
- /// <summary>
- /// The sprite layer used for the interface lock indicator light overlay.
- /// </summary>
- InterfaceLock,
- /// <summary>
- /// The sprite layer used for the panel lock indicator light overlay.
- /// </summary>
- PanelLock,
- /// <summary>
- /// The sprite layer used for the equipment channel indicator light overlay.
- /// </summary>
- Equipment,
- /// <summary>
- /// The sprite layer used for the lighting channel indicator light overlay.
- /// </summary>
- Lighting,
- /// <summary>
- /// The sprite layer used for the environment channel indicator light overlay.
- /// </summary>
- Environment,
- /// <summary>
- /// The sprite layer used for the APC screen overlay.
- /// </summary>
- ChargeState,
- }
|