Fix APC turning invisible after emagging (#20245)

This commit is contained in:
daerSeebaer
2023-09-23 21:27:51 +02:00
committed by GitHub
parent e512f532d0
commit f5ddbcf123
2 changed files with 15 additions and 19 deletions

View File

@@ -97,7 +97,7 @@ public sealed partial class ApcVisualsComponent : Component
public string EmaggedScreenState = "emag-unlit"; public string EmaggedScreenState = "emag-unlit";
/// <summary> /// <summary>
/// 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.
/// </summary> /// </summary>
[DataField("emaggedScreenColor")] [DataField("emaggedScreenColor")]
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]

View File

@@ -13,6 +13,10 @@ public sealed class ApcVisualizerSystem : VisualizerSystem<ApcVisualsComponent>
if (args.Sprite == null) if (args.Sprite == null)
return; 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: // Handle APC screen overlay:
if(!AppearanceSystem.TryGetData<ApcChargeState>(uid, ApcVisuals.ChargeState, out var chargeState, args.Component)) if(!AppearanceSystem.TryGetData<ApcChargeState>(uid, ApcVisuals.ChargeState, out var chargeState, args.Component))
chargeState = ApcChargeState.Lack; chargeState = ApcChargeState.Lack;
@@ -26,7 +30,7 @@ public sealed class ApcVisualizerSystem : VisualizerSystem<ApcVisualsComponent>
{ {
for(var i = 0; i < comp.LockIndicators; ++i) 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); sbyte lockState = (sbyte)((lockStates >> (i << (sbyte)ApcLockState.LogWidth)) & (sbyte)ApcLockState.All);
args.Sprite.LayerSetState(layer, $"{comp.LockPrefix}{i}-{comp.LockSuffixes[lockState]}"); args.Sprite.LayerSetState(layer, $"{comp.LockPrefix}{i}-{comp.LockSuffixes[lockState]}");
args.Sprite.LayerSetVisible(layer, true); args.Sprite.LayerSetVisible(layer, true);
@@ -38,7 +42,7 @@ public sealed class ApcVisualizerSystem : VisualizerSystem<ApcVisualsComponent>
{ {
for(var i = 0; i < comp.ChannelIndicators; ++i) 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); sbyte channelState = (sbyte)((channelStates >> (i << (sbyte)ApcChannelState.LogWidth)) & (sbyte)ApcChannelState.All);
args.Sprite.LayerSetState(layer, $"{comp.ChannelPrefix}{i}-{comp.ChannelSuffixes[channelState]}"); args.Sprite.LayerSetState(layer, $"{comp.ChannelPrefix}{i}-{comp.ChannelSuffixes[channelState]}");
args.Sprite.LayerSetVisible(layer, true); args.Sprite.LayerSetVisible(layer, true);
@@ -56,12 +60,12 @@ public sealed class ApcVisualizerSystem : VisualizerSystem<ApcVisualsComponent>
args.Sprite.LayerSetState(ApcVisualLayers.ChargeState, comp.EmaggedScreenState); args.Sprite.LayerSetState(ApcVisualLayers.ChargeState, comp.EmaggedScreenState);
for(var i = 0; i < comp.LockIndicators; ++i) for(var i = 0; i < comp.LockIndicators; ++i)
{ {
var layer = ((byte)ApcVisualLayers.LockIndicatorOverlayStart + i); var layer = ((byte)lockIndicatorOverlayStart + i);
args.Sprite.LayerSetVisible(layer, false); args.Sprite.LayerSetVisible(layer, false);
} }
for(var i = 0; i < comp.ChannelIndicators; ++i) for(var i = 0; i < comp.ChannelIndicators; ++i)
{ {
var layer = ((byte)ApcVisualLayers.ChannelIndicatorOverlayStart + i); var layer = ((byte)channelIndicatorOverlayStart + i);
args.Sprite.LayerSetVisible(layer, false); args.Sprite.LayerSetVisible(layer, false);
} }
@@ -78,35 +82,27 @@ enum ApcVisualLayers : byte
/// <summary> /// <summary>
/// The sprite layer used for the interface lock indicator light overlay. /// The sprite layer used for the interface lock indicator light overlay.
/// </summary> /// </summary>
InterfaceLock = 0, InterfaceLock,
/// <summary> /// <summary>
/// The sprite layer used for the panel lock indicator light overlay. /// The sprite layer used for the panel lock indicator light overlay.
/// </summary> /// </summary>
PanelLock = 1, PanelLock,
/// <summary>
/// The first of the lock indicator light layers.
/// </summary>
LockIndicatorOverlayStart = InterfaceLock,
/// <summary> /// <summary>
/// The sprite layer used for the equipment channel indicator light overlay. /// The sprite layer used for the equipment channel indicator light overlay.
/// </summary> /// </summary>
Equipment = 2, Equipment,
/// <summary> /// <summary>
/// The sprite layer used for the lighting channel indicator light overlay. /// The sprite layer used for the lighting channel indicator light overlay.
/// </summary> /// </summary>
Lighting = 3, Lighting,
/// <summary> /// <summary>
/// The sprite layer used for the environment channel indicator light overlay. /// The sprite layer used for the environment channel indicator light overlay.
/// </summary> /// </summary>
Environment = 4, Environment,
/// <summary>
/// The first of the channel status indicator light layers.
/// </summary>
ChannelIndicatorOverlayStart = Equipment,
/// <summary> /// <summary>
/// The sprite layer used for the APC screen overlay. /// The sprite layer used for the APC screen overlay.
/// </summary> /// </summary>
ChargeState = 5, ChargeState,
} }