From f5ddbcf1237205516924950d78527bc0a884a531 Mon Sep 17 00:00:00 2001
From: daerSeebaer <61566539+daerSeebaer@users.noreply.github.com>
Date: Sat, 23 Sep 2023 21:27:51 +0200
Subject: [PATCH] Fix APC turning invisible after emagging (#20245)
---
.../Power/APC/ApcVisualizerComponent.cs | 2 +-
.../Power/APC/ApcVisualizerSystem.cs | 32 ++++++++-----------
2 files changed, 15 insertions(+), 19 deletions(-)
diff --git a/Content.Client/Power/APC/ApcVisualizerComponent.cs b/Content.Client/Power/APC/ApcVisualizerComponent.cs
index 1f66a7791a..87cb70019f 100644
--- a/Content.Client/Power/APC/ApcVisualizerComponent.cs
+++ b/Content.Client/Power/APC/ApcVisualizerComponent.cs
@@ -97,7 +97,7 @@ public sealed partial class ApcVisualsComponent : Component
public string EmaggedScreenState = "emag-unlit";
///
- /// The sprite state of the unlit overlay used for the APC screen when the APC has been emagged.
+ /// The color of the light emitted when the APC has been emagged.
///
[DataField("emaggedScreenColor")]
[ViewVariables(VVAccess.ReadWrite)]
diff --git a/Content.Client/Power/APC/ApcVisualizerSystem.cs b/Content.Client/Power/APC/ApcVisualizerSystem.cs
index 23b9157ea3..67540e7239 100644
--- a/Content.Client/Power/APC/ApcVisualizerSystem.cs
+++ b/Content.Client/Power/APC/ApcVisualizerSystem.cs
@@ -13,6 +13,10 @@ public sealed class ApcVisualizerSystem : VisualizerSystem
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(uid, ApcVisuals.ChargeState, out var chargeState, args.Component))
chargeState = ApcChargeState.Lack;
@@ -26,7 +30,7 @@ public sealed class ApcVisualizerSystem : VisualizerSystem
{
for(var i = 0; i < comp.LockIndicators; ++i)
{
- var layer = ((byte)ApcVisualLayers.LockIndicatorOverlayStart + 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);
@@ -38,7 +42,7 @@ public sealed class ApcVisualizerSystem : VisualizerSystem
{
for(var i = 0; i < comp.ChannelIndicators; ++i)
{
- var layer = ((byte)ApcVisualLayers.ChannelIndicatorOverlayStart + 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);
@@ -56,12 +60,12 @@ public sealed class ApcVisualizerSystem : VisualizerSystem
args.Sprite.LayerSetState(ApcVisualLayers.ChargeState, comp.EmaggedScreenState);
for(var i = 0; i < comp.LockIndicators; ++i)
{
- var layer = ((byte)ApcVisualLayers.LockIndicatorOverlayStart + i);
+ var layer = ((byte)lockIndicatorOverlayStart + i);
args.Sprite.LayerSetVisible(layer, false);
}
for(var i = 0; i < comp.ChannelIndicators; ++i)
{
- var layer = ((byte)ApcVisualLayers.ChannelIndicatorOverlayStart + i);
+ var layer = ((byte)channelIndicatorOverlayStart + i);
args.Sprite.LayerSetVisible(layer, false);
}
@@ -78,35 +82,27 @@ enum ApcVisualLayers : byte
///
/// The sprite layer used for the interface lock indicator light overlay.
///
- InterfaceLock = 0,
+ InterfaceLock,
///
/// The sprite layer used for the panel lock indicator light overlay.
///
- PanelLock = 1,
- ///
- /// The first of the lock indicator light layers.
- ///
- LockIndicatorOverlayStart = InterfaceLock,
+ PanelLock,
///
/// The sprite layer used for the equipment channel indicator light overlay.
///
- Equipment = 2,
+ Equipment,
///
/// The sprite layer used for the lighting channel indicator light overlay.
///
- Lighting = 3,
+ Lighting,
///
/// The sprite layer used for the environment channel indicator light overlay.
///
- Environment = 4,
- ///
- /// The first of the channel status indicator light layers.
- ///
- ChannelIndicatorOverlayStart = Equipment,
+ Environment,
///
/// The sprite layer used for the APC screen overlay.
///
- ChargeState = 5,
+ ChargeState,
}
--
2.51.2