From 0658acd7cb3105fb160bb0851b324103bed1a541 Mon Sep 17 00:00:00 2001 From: TemporalOroboros Date: Sun, 7 May 2023 19:17:29 -0700 Subject: [PATCH] Resolves ApcVisualizer is Obsolete (#13898) --- Content.Client/Power/APC/ApcVisualizer.cs | 45 ----- .../Power/APC/ApcVisualizerComponent.cs | 107 ++++++++++++ .../Power/APC/ApcVisualizerSystem.cs | 106 ++++++++++++ Content.Shared/APC/SharedApc.cs | 159 ++++++++++++++++-- .../Power/Generation/generators.yml | 3 - .../Entities/Structures/Power/apc.yml | 33 ++-- .../Structures/Power/apc.rsi/apcox-0.png | Bin 159 -> 0 bytes .../Structures/Power/apc.rsi/apcox-1.png | Bin 155 -> 0 bytes .../{apco0-0.png => channel0-auto_off.png} | Bin .../{apco0-2.png => channel0-auto_on.png} | Bin .../{apco0-1.png => channel0-manual_off.png} | Bin .../{apco0-3.png => channel0-manual_on.png} | Bin .../{apco1-0.png => channel1-auto_off.png} | Bin .../{apco1-2.png => channel1-auto_on.png} | Bin .../{apco1-1.png => channel1-manual_off.png} | Bin .../{apco1-3.png => channel1-manual_on.png} | Bin .../{apco2-0.png => channel2-auto_off.png} | Bin .../{apco2-2.png => channel2-auto_on.png} | Bin .../{apco2-1.png => channel2-manual_off.png} | Bin .../{apco2-3.png => channel2-manual_on.png} | Bin .../{powered-2.png => display-charging.png} | Bin .../{powered-3.png => display-full.png} | Bin .../{powered-1.png => display-lack.png} | Bin .../{apco3-3.png => display-remote.png} | Bin .../Power/apc.rsi/{apcframe.png => frame.png} | Bin .../Structures/Power/apc.rsi/lock0-locked.png | Bin 0 -> 155 bytes .../Power/apc.rsi/lock0-unlocked.png | Bin 0 -> 158 bytes .../Structures/Power/apc.rsi/lock1-locked.png | Bin 0 -> 154 bytes .../Power/apc.rsi/lock1-unlocked.png | Bin 0 -> 158 bytes .../Structures/Power/apc.rsi/meta.json | 84 ++++----- 30 files changed, 421 insertions(+), 116 deletions(-) delete mode 100644 Content.Client/Power/APC/ApcVisualizer.cs create mode 100644 Content.Client/Power/APC/ApcVisualizerComponent.cs create mode 100644 Content.Client/Power/APC/ApcVisualizerSystem.cs delete mode 100644 Resources/Textures/Structures/Power/apc.rsi/apcox-0.png delete mode 100644 Resources/Textures/Structures/Power/apc.rsi/apcox-1.png rename Resources/Textures/Structures/Power/apc.rsi/{apco0-0.png => channel0-auto_off.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco0-2.png => channel0-auto_on.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco0-1.png => channel0-manual_off.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco0-3.png => channel0-manual_on.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco1-0.png => channel1-auto_off.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco1-2.png => channel1-auto_on.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco1-1.png => channel1-manual_off.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco1-3.png => channel1-manual_on.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco2-0.png => channel2-auto_off.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco2-2.png => channel2-auto_on.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco2-1.png => channel2-manual_off.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco2-3.png => channel2-manual_on.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{powered-2.png => display-charging.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{powered-3.png => display-full.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{powered-1.png => display-lack.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apco3-3.png => display-remote.png} (100%) rename Resources/Textures/Structures/Power/apc.rsi/{apcframe.png => frame.png} (100%) create mode 100644 Resources/Textures/Structures/Power/apc.rsi/lock0-locked.png create mode 100644 Resources/Textures/Structures/Power/apc.rsi/lock0-unlocked.png create mode 100644 Resources/Textures/Structures/Power/apc.rsi/lock1-locked.png create mode 100644 Resources/Textures/Structures/Power/apc.rsi/lock1-unlocked.png diff --git a/Content.Client/Power/APC/ApcVisualizer.cs b/Content.Client/Power/APC/ApcVisualizer.cs deleted file mode 100644 index 55bfdc5f5f..0000000000 --- a/Content.Client/Power/APC/ApcVisualizer.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Content.Shared.APC; -using Robust.Client.GameObjects; - -namespace Content.Client.Power.APC -{ - public sealed class ApcVisualizer : AppearanceVisualizer - { - public static readonly Color LackColor = Color.FromHex("#d1332e"); - public static readonly Color ChargingColor = Color.FromHex("#2e8ad1"); - public static readonly Color FullColor = Color.FromHex("#3db83b"); - public static readonly Color EmagColor = Color.FromHex("#1f48d6"); - - [Obsolete("Subscribe to AppearanceChangeEvent instead.")] - public override void OnChangeData(AppearanceComponent component) - { - base.OnChangeData(component); - - var ent = IoCManager.Resolve(); - var sprite = ent.GetComponent(component.Owner); - if (component.TryGetData(ApcVisuals.ChargeState, out var chargeState)) - { - if (ent.TryGetComponent(component.Owner, out SharedPointLightComponent? light)) - { - light.Color = chargeState switch - { - ApcChargeState.Lack => LackColor, - ApcChargeState.Charging => ChargingColor, - ApcChargeState.Full => FullColor, - ApcChargeState.Emag => EmagColor, - _ => LackColor - }; - } - } - } - - enum ApcVisualLayers : byte - { - ChargeState, - Lock, - Equipment, - Lighting, - Environment, - } - } -} diff --git a/Content.Client/Power/APC/ApcVisualizerComponent.cs b/Content.Client/Power/APC/ApcVisualizerComponent.cs new file mode 100644 index 0000000000..d3f0b33b05 --- /dev/null +++ b/Content.Client/Power/APC/ApcVisualizerComponent.cs @@ -0,0 +1,107 @@ +using Content.Shared.APC; + +namespace Content.Client.Power.APC; + +[RegisterComponent] +[Access(typeof(ApcVisualizerSystem))] +public sealed class ApcVisualsComponent : Component +{ +#region Indicators + +#region Locks + + /// + /// The number of lock indicators on the APC. + /// + [DataField("numLockIndicators")] + [ViewVariables(VVAccess.ReadWrite)] + public byte LockIndicators = 2; + + /// + /// The prefix used for the sprite state suffix of the lock indicator lights. + /// Valid states are of the form \\\\-\ + /// + [DataField("lockIndicatorPrefix")] + [ViewVariables(VVAccess.ReadWrite)] + public string LockPrefix = "lock"; + + /// + /// The suffixes used for the sprite state suffix of the lock indicator lights. + /// Valid states are of the form \\-\ + /// + [DataField("lockIndicatorSuffixes")] + [ViewVariables(VVAccess.ReadWrite)] + public string[] LockSuffixes = new string[(byte)(2 << (sbyte)ApcLockState.LogWidth)]{"unlocked", "locked"}; + +#endregion Locks + +#region Channels + + /// + /// The number of output channel indicator lights on the APC. + /// + [DataField("numChannelIndicators")] + [ViewVariables(VVAccess.ReadWrite)] + public byte ChannelIndicators = 3; + + /// + /// The prefix used for the sprite state suffix of the channel indicator lights. + /// Valid states are of the form \\\-\ + /// + [DataField("channelIndicatorPrefix")] + [ViewVariables(VVAccess.ReadWrite)] + public string ChannelPrefix = "channel"; + + /// + /// The suffixes used for the sprite state suffix of the channel indicator lights. + /// Valid states are of the form \\-\ + /// + [DataField("channelIndicatorSuffixes")] + [ViewVariables(VVAccess.ReadWrite)] + public string[] ChannelSuffixes = new string[(byte)(2 << (sbyte)ApcChannelState.LogWidth)]{"auto_off", "manual_off", "auto_on", "manual_on"}; + +#endregion Channels + +#endregion Indicators + +#region Screen + + /// + /// The prefix used to construct the sprite state suffix used for the screen overlay. + /// Valid sprite states are of the form \-\. + /// + [DataField("screenStatePrefix")] + [ViewVariables(VVAccess.ReadWrite)] + public string ScreenPrefix = "display"; + + /// + /// The suffix used to construct the sprite state suffix used for the screen overlay. + /// Valid sprite states are of the form \-\. + /// + [DataField("screenStateSuffixes")] + [ViewVariables(VVAccess.ReadWrite)] + public string[] ScreenSuffixes = new string[(byte)ApcChargeState.NumStates]{"lack", "charging", "full", "remote"}; + + /// + /// The colors of the light emitted by the APC given a particular display state. + /// + [DataField("screenColors")] + [ViewVariables(VVAccess.ReadWrite)] + public Color[] ScreenColors = new Color[(byte)ApcChargeState.NumStates]{Color.FromHex("#d1332e"), Color.FromHex("#2e8ad1"), Color.FromHex("#3db83b"), Color.FromHex("#ffac1c")}; + + /// + /// The sprite state of the unlit overlay used for the APC screen when the APC has been emagged. + /// + [DataField("emaggedScreenState")] + [ViewVariables(VVAccess.ReadWrite)] + public string EmaggedScreenState = "emag-unlit"; + + /// + /// The sprite state of the unlit overlay used for the APC screen when the APC has been emagged. + /// + [DataField("emaggedScreenColor")] + [ViewVariables(VVAccess.ReadWrite)] + public Color EmaggedScreenColor = Color.FromHex("#1f48d6"); + +#endregion Screen +} diff --git a/Content.Client/Power/APC/ApcVisualizerSystem.cs b/Content.Client/Power/APC/ApcVisualizerSystem.cs new file mode 100644 index 0000000000..6322117f44 --- /dev/null +++ b/Content.Client/Power/APC/ApcVisualizerSystem.cs @@ -0,0 +1,106 @@ +using Content.Shared.APC; +using JetBrains.Annotations; +using Robust.Client.GameObjects; + +namespace Content.Client.Power.APC; + +public sealed class ApcVisualizerSystem : VisualizerSystem +{ + protected override void OnAppearanceChange(EntityUid uid, ApcVisualsComponent comp, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + + // Handle APC screen overlay: + if(!AppearanceSystem.TryGetData(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(uid, ApcVisuals.LockState, out var lockStates, args.Component)) + { + for(var i = 0; i < comp.LockIndicators; ++i) + { + var layer = ((byte)ApcVisualLayers.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(uid, ApcVisuals.ChannelState, out var channelStates, args.Component)) + { + for(var i = 0; i < comp.ChannelIndicators; ++i) + { + var layer = ((byte)ApcVisualLayers.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(uid, out var light)) + light.Color = comp.ScreenColors[(sbyte)chargeState]; + } + 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)ApcVisualLayers.LockIndicatorOverlayStart + i); + args.Sprite.LayerSetVisible(layer, false); + } + for(var i = 0; i < comp.ChannelIndicators; ++i) + { + var layer = ((byte)ApcVisualLayers.ChannelIndicatorOverlayStart + i); + args.Sprite.LayerSetVisible(layer, false); + } + + if (TryComp(uid, out var light)) + light.Color = comp.EmaggedScreenColor; + } + } +} + +enum ApcVisualLayers : byte +{ + /// + /// The sprite layer used for the interface lock indicator light overlay. + /// + InterfaceLock = 0, + /// + /// The sprite layer used for the panel lock indicator light overlay. + /// + PanelLock = 1, + /// + /// The first of the lock indicator light layers. + /// + LockIndicatorOverlayStart = InterfaceLock, + + /// + /// The sprite layer used for the equipment channel indicator light overlay. + /// + Equipment = 2, + /// + /// The sprite layer used for the lighting channel indicator light overlay. + /// + Lighting = 3, + /// + /// The sprite layer used for the environment channel indicator light overlay. + /// + Environment = 4, + /// + /// The first of the channel status indicator light layers. + /// + ChannelIndicatorOverlayStart = Equipment, + + /// + /// The sprite layer used for the APC screen overlay. + /// + ChargeState = 5, +} diff --git a/Content.Shared/APC/SharedApc.cs b/Content.Shared/APC/SharedApc.cs index 01f07f4eaa..16cd840b3a 100644 --- a/Content.Shared/APC/SharedApc.cs +++ b/Content.Shared/APC/SharedApc.cs @@ -3,36 +3,175 @@ using Robust.Shared.Serialization; namespace Content.Shared.APC { [Serializable, NetSerializable] - public enum ApcVisuals + public enum ApcVisuals : byte { /// - /// APC lights/HUD. + /// APC locks. + /// + LockState, + /// + /// APC channels. + /// + ChannelState, + /// + /// APC lights/HUD. /// ChargeState, } [Serializable, NetSerializable] - public enum ApcChargeState + public enum ApcPanelState : sbyte + { + /// + /// APC is closed. + /// + Closed = 0, + /// + /// APC is opened. + /// + Open = 1, + /// + /// APC is oaisdoj. + /// + Error = -1, + } + + /// + /// The state of the APC interface lock. + /// None of this is implemented. + /// + [Serializable, NetSerializable] + public enum ApcLockState : sbyte + { + /// + /// Empty bitmask. + /// + None = 0, + + /// + /// Bitfield indicating status of APC lock indicator. + /// + Lock = (1<<0), + /// + /// Bit state indicating that the given APC lock is unlocked. + /// + Unlocked = None, + /// + /// Bit state indicating that the given APC lock is locked. + /// + Locked = (1<<0), + + /// + /// Bitmask for the full state for a given APC lock indicator. + /// + All = (Lock), + + /// + /// The log 2 width in bits of the bitfields indicating the status of an APC lock indicator. + /// Used for bit shifting operations (Mask for the state for indicator i is (All << (i << LogWidth))). + /// + LogWidth = 0, + } + + /// + /// APC power channel states. + /// None of this is implemented. + /// + public enum ApcChannelState : sbyte + { + /// + /// Empty bitmask. + /// + None = 0, + + /// + /// Bitfield indicating whether the APC is automatically regulating the given channel. + /// + Control = (1<<0), + /// + /// Bit state indicating that the APC has been set to automatically toggle the given channel depending on available power. + /// + Auto = None, + /// + /// Bit state indicating that the APC has been set to always provide/not provide power on the given channel if possible. + /// + Manual = Control, + + /// + /// Bitfield indicating whether the APC is currently providing power on the given channel. + /// + Power = (1<<1), + /// + /// Bit state indicating that the APC is currently not providing power on the given channel. + /// + Off = None, + /// + /// Bit state indicating that the APC is currently providing power on the given channel. + /// + On = Power, + + /// + /// Bitmask for the full state for a given APC power channel. + /// + All = Power | Control, + + /// + /// State that indicates the given channel has been automatically disabled. + /// + AutoOff = (Off | Auto), + /// + /// State that indicates the given channel has been automatically enabled. + /// + AutoOn = (On | Auto), + /// + /// State that indicates the given channel has been manually disabled. + /// + ManualOff = (Off | Manual), + /// + /// State that indicates the given channel has been manually enabled. + /// + ManualOn = (On | Manual), + + /// + /// The log 2 width in bits of the bitfields indicating the status of an APC power channel. + /// Used for bit shifting operations (Mask for the state for channel i is (All << (i << LogWidth))). + /// + LogWidth = 1, + } + + [Serializable, NetSerializable] + public enum ApcChargeState : sbyte { /// - /// APC does not have enough power to charge cell (if necessary) and keep powering the area. + /// APC does not have enough power to charge cell (if necessary) and keep powering the area. + /// + Lack = 0, + + /// + /// APC is not full but has enough power. + /// + Charging = 1, + + /// + /// APC battery is full and has enough power. /// - Lack, + Full = 2, /// - /// APC is not full but has enough power. + /// APC is being remotely accessed. + /// Currently unimplemented, though the corresponding sprite state exists in the RSI. /// - Charging, + Remote = 3, /// - /// APC battery is full and has enough power. + /// The number of valid states charge states the APC can be in. /// - Full, + NumStates = 4, /// /// APC is emagged (and not displaying other useful power colors at a glance) /// - Emag, + Emag = -1, } [Serializable, NetSerializable] diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml index c22ffc1c4a..754c4787cf 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml @@ -114,9 +114,6 @@ - state: panel - state: on shader: unshaded -# - type: Appearance -# visuals: -# - type: ApcVisualizer - type: NodeContainer examinable: true nodes: diff --git a/Resources/Prototypes/Entities/Structures/Power/apc.yml b/Resources/Prototypes/Entities/Structures/Power/apc.yml index 719b4f6aa0..652a031a5d 100644 --- a/Resources/Prototypes/Entities/Structures/Power/apc.yml +++ b/Resources/Prototypes/Entities/Structures/Power/apc.yml @@ -30,26 +30,29 @@ sprite: Structures/Power/apc.rsi layers: - state: base - - state: powered-1 + - state: panel + map: ["enum.WiresVisualLayers.MaintenancePanel"] + visible: false + - state: display-charging shader: unshaded map: ["enum.ApcVisualLayers.ChargeState"] - - state: apcox-0 + - state: lock0-unlocked + shader: unshaded + map: ["enum.ApcVisualLayers.InterfaceLock"] + - state: lock1-unlocked shader: unshaded - map: ["enum.ApcVisualLayers.Lock"] - - state: apco0-3 + map: ["enum.ApcVisualLayers.PanelLock"] + - state: channel0-auto_on shader: unshaded map: ["enum.ApcVisualLayers.Equipment"] - - state: apco1-3 + - state: channel1-auto_on shader: unshaded map: ["enum.ApcVisualLayers.Lighting"] - - state: apco2-3 + - state: channel2-auto_on shader: unshaded map: ["enum.ApcVisualLayers.Environment"] - - state: panel - map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: Appearance - visuals: - - type: ApcVisualizer + - type: ApcVisuals - type: Battery maxCharge: 50000 startingCharge: 0 @@ -91,14 +94,6 @@ BoardName: "APC" LayoutId: APC - type: WiresVisuals - - type: GenericVisualizer - visuals: - enum.ApcVisuals.ChargeState: - enum.ApcVisualLayers.ChargeState: - Lack: { state: powered-1 } - Charging: { state: powered-2 } - Full: { state: powered-3 } - Emag: { state: emag-unlit } - type: Damageable damageContainer: Inorganic damageModifierSet: StrongMetallic @@ -142,7 +137,7 @@ drawdepth: WallMountedItems netsync: false sprite: Structures/Power/apc.rsi - state: apcframe + state: frame - type: Construction graph: APC node: apcFrame diff --git a/Resources/Textures/Structures/Power/apc.rsi/apcox-0.png b/Resources/Textures/Structures/Power/apc.rsi/apcox-0.png deleted file mode 100644 index a6c347cfd1024d2d3e70cc15dbe231fea11be3a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C>ZGJ z;uumf=k2+TybgjA3=h>eUfevv@k|oWQq~)ei#D@NZ3+A6{bb$FZMmoik?nGInAqStrRC4;?c#?Y1Jy#oALb0p{v}$k o-!){F-H{Ebn*R4)!)=gU0@IWKg3BkF*C&8@p00i_>zopr0K;J|;s5{u diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco0-0.png b/Resources/Textures/Structures/Power/apc.rsi/channel0-auto_off.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco0-0.png rename to Resources/Textures/Structures/Power/apc.rsi/channel0-auto_off.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco0-2.png b/Resources/Textures/Structures/Power/apc.rsi/channel0-auto_on.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco0-2.png rename to Resources/Textures/Structures/Power/apc.rsi/channel0-auto_on.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco0-1.png b/Resources/Textures/Structures/Power/apc.rsi/channel0-manual_off.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco0-1.png rename to Resources/Textures/Structures/Power/apc.rsi/channel0-manual_off.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco0-3.png b/Resources/Textures/Structures/Power/apc.rsi/channel0-manual_on.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco0-3.png rename to Resources/Textures/Structures/Power/apc.rsi/channel0-manual_on.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco1-0.png b/Resources/Textures/Structures/Power/apc.rsi/channel1-auto_off.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco1-0.png rename to Resources/Textures/Structures/Power/apc.rsi/channel1-auto_off.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco1-2.png b/Resources/Textures/Structures/Power/apc.rsi/channel1-auto_on.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco1-2.png rename to Resources/Textures/Structures/Power/apc.rsi/channel1-auto_on.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco1-1.png b/Resources/Textures/Structures/Power/apc.rsi/channel1-manual_off.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco1-1.png rename to Resources/Textures/Structures/Power/apc.rsi/channel1-manual_off.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco1-3.png b/Resources/Textures/Structures/Power/apc.rsi/channel1-manual_on.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco1-3.png rename to Resources/Textures/Structures/Power/apc.rsi/channel1-manual_on.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco2-0.png b/Resources/Textures/Structures/Power/apc.rsi/channel2-auto_off.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco2-0.png rename to Resources/Textures/Structures/Power/apc.rsi/channel2-auto_off.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco2-2.png b/Resources/Textures/Structures/Power/apc.rsi/channel2-auto_on.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco2-2.png rename to Resources/Textures/Structures/Power/apc.rsi/channel2-auto_on.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco2-1.png b/Resources/Textures/Structures/Power/apc.rsi/channel2-manual_off.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco2-1.png rename to Resources/Textures/Structures/Power/apc.rsi/channel2-manual_off.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco2-3.png b/Resources/Textures/Structures/Power/apc.rsi/channel2-manual_on.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco2-3.png rename to Resources/Textures/Structures/Power/apc.rsi/channel2-manual_on.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/powered-2.png b/Resources/Textures/Structures/Power/apc.rsi/display-charging.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/powered-2.png rename to Resources/Textures/Structures/Power/apc.rsi/display-charging.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/powered-3.png b/Resources/Textures/Structures/Power/apc.rsi/display-full.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/powered-3.png rename to Resources/Textures/Structures/Power/apc.rsi/display-full.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/powered-1.png b/Resources/Textures/Structures/Power/apc.rsi/display-lack.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/powered-1.png rename to Resources/Textures/Structures/Power/apc.rsi/display-lack.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apco3-3.png b/Resources/Textures/Structures/Power/apc.rsi/display-remote.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apco3-3.png rename to Resources/Textures/Structures/Power/apc.rsi/display-remote.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/apcframe.png b/Resources/Textures/Structures/Power/apc.rsi/frame.png similarity index 100% rename from Resources/Textures/Structures/Power/apc.rsi/apcframe.png rename to Resources/Textures/Structures/Power/apc.rsi/frame.png diff --git a/Resources/Textures/Structures/Power/apc.rsi/lock0-locked.png b/Resources/Textures/Structures/Power/apc.rsi/lock0-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..45562de8a662c387f05d1685b25ed63dc88b5c01 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!pn<20V@QPi+hYp_85DRJHp<=JXtl2|_CQIa w+=(N9*cll9YmdKI;Vst0Nr^n-2eap literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Power/apc.rsi/lock0-unlocked.png b/Resources/Textures/Structures/Power/apc.rsi/lock0-unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..f6377a36b127b33b6209ce3c8704f33b2c08f5d5 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!ps}ZmV@QPi+hZFA83Y6v4$AAU^q4v;pd~_B z<$irD0oy&cRiBUv8jg_@oLYG?3t^>bP0l+XkK6U{F8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Power/apc.rsi/lock1-locked.png b/Resources/Textures/Structures/Power/apc.rsi/lock1-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..f92c04aac46374de8c4d906075a9c0e424b7c63c GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!puVSzV@QPi+hYp_85DRJHp<=JXtl2|_CQHP v*Qq0a*cljnc31DeH7!)O*yuIGi;f@XeOR8P^-Em>YGv?r^>bP0l+XkKsT40S literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Power/apc.rsi/lock1-unlocked.png b/Resources/Textures/Structures/Power/apc.rsi/lock1-unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..44f9af733faa8274b9eed4cb3bd2add8b2d10d28 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!ps}ZmV@QPi+hc};3<^998|9`2w0QX_G)W3? y2ytLPmhzLIf#Jv6^@YXWQQu}8m&-AT3i2O{WO=+I&R{!GJA