Resolves ApcVisualizer is Obsolete (#13898)
@@ -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<IEntityManager>();
|
|
||||||
var sprite = ent.GetComponent<SpriteComponent>(component.Owner);
|
|
||||||
if (component.TryGetData<ApcChargeState>(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,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
107
Content.Client/Power/APC/ApcVisualizerComponent.cs
Normal file
@@ -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
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The number of lock indicators on the APC.
|
||||||
|
/// </summary>
|
||||||
|
[DataField("numLockIndicators")]
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public byte LockIndicators = 2;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The prefix used for the sprite state suffix of the lock indicator lights.
|
||||||
|
/// Valid states are of the form \<BASE\>\<PREFIX\>\<IDX>\-\<STATE\>
|
||||||
|
/// </summary>
|
||||||
|
[DataField("lockIndicatorPrefix")]
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public string LockPrefix = "lock";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The suffixes used for the sprite state suffix of the lock indicator lights.
|
||||||
|
/// Valid states are of the form \<PREFIX\>\<IDX\>-\<STATE\>
|
||||||
|
/// </summary>
|
||||||
|
[DataField("lockIndicatorSuffixes")]
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public string[] LockSuffixes = new string[(byte)(2 << (sbyte)ApcLockState.LogWidth)]{"unlocked", "locked"};
|
||||||
|
|
||||||
|
#endregion Locks
|
||||||
|
|
||||||
|
#region Channels
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The number of output channel indicator lights on the APC.
|
||||||
|
/// </summary>
|
||||||
|
[DataField("numChannelIndicators")]
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public byte ChannelIndicators = 3;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The prefix used for the sprite state suffix of the channel indicator lights.
|
||||||
|
/// Valid states are of the form \<BASE\>\<PREFIX\>\<IDX\>-\<STATE\>
|
||||||
|
/// </summary>
|
||||||
|
[DataField("channelIndicatorPrefix")]
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public string ChannelPrefix = "channel";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The suffixes used for the sprite state suffix of the channel indicator lights.
|
||||||
|
/// Valid states are of the form \<PREFIX\>\<IDX\>-\<STATE\>
|
||||||
|
/// </summary>
|
||||||
|
[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
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The prefix used to construct the sprite state suffix used for the screen overlay.
|
||||||
|
/// Valid sprite states are of the form \<PREFIX\>-\<SUFFIX\>.
|
||||||
|
/// </summary>
|
||||||
|
[DataField("screenStatePrefix")]
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public string ScreenPrefix = "display";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The suffix used to construct the sprite state suffix used for the screen overlay.
|
||||||
|
/// Valid sprite states are of the form \<PREFIX\>-\<STATE\>.
|
||||||
|
/// </summary>
|
||||||
|
[DataField("screenStateSuffixes")]
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public string[] ScreenSuffixes = new string[(byte)ApcChargeState.NumStates]{"lack", "charging", "full", "remote"};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The colors of the light emitted by the APC given a particular display state.
|
||||||
|
/// </summary>
|
||||||
|
[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")};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The sprite state of the unlit overlay used for the APC screen when the APC has been emagged.
|
||||||
|
/// </summary>
|
||||||
|
[DataField("emaggedScreenState")]
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public string EmaggedScreenState = "emag-unlit";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The sprite state of the unlit overlay used for the APC screen when the APC has been emagged.
|
||||||
|
/// </summary>
|
||||||
|
[DataField("emaggedScreenColor")]
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public Color EmaggedScreenColor = Color.FromHex("#1f48d6");
|
||||||
|
|
||||||
|
#endregion Screen
|
||||||
|
}
|
||||||
106
Content.Client/Power/APC/ApcVisualizerSystem.cs
Normal file
@@ -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<ApcVisualsComponent>
|
||||||
|
{
|
||||||
|
protected override void OnAppearanceChange(EntityUid uid, ApcVisualsComponent comp, ref AppearanceChangeEvent args)
|
||||||
|
{
|
||||||
|
if (args.Sprite == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// 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)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<byte>(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<SharedPointLightComponent>(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<SharedPointLightComponent>(uid, out var light))
|
||||||
|
light.Color = comp.EmaggedScreenColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ApcVisualLayers : byte
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The sprite layer used for the interface lock indicator light overlay.
|
||||||
|
/// </summary>
|
||||||
|
InterfaceLock = 0,
|
||||||
|
/// <summary>
|
||||||
|
/// The sprite layer used for the panel lock indicator light overlay.
|
||||||
|
/// </summary>
|
||||||
|
PanelLock = 1,
|
||||||
|
/// <summary>
|
||||||
|
/// The first of the lock indicator light layers.
|
||||||
|
/// </summary>
|
||||||
|
LockIndicatorOverlayStart = InterfaceLock,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The sprite layer used for the equipment channel indicator light overlay.
|
||||||
|
/// </summary>
|
||||||
|
Equipment = 2,
|
||||||
|
/// <summary>
|
||||||
|
/// The sprite layer used for the lighting channel indicator light overlay.
|
||||||
|
/// </summary>
|
||||||
|
Lighting = 3,
|
||||||
|
/// <summary>
|
||||||
|
/// The sprite layer used for the environment channel indicator light overlay.
|
||||||
|
/// </summary>
|
||||||
|
Environment = 4,
|
||||||
|
/// <summary>
|
||||||
|
/// The first of the channel status indicator light layers.
|
||||||
|
/// </summary>
|
||||||
|
ChannelIndicatorOverlayStart = Equipment,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The sprite layer used for the APC screen overlay.
|
||||||
|
/// </summary>
|
||||||
|
ChargeState = 5,
|
||||||
|
}
|
||||||
@@ -3,8 +3,16 @@ using Robust.Shared.Serialization;
|
|||||||
namespace Content.Shared.APC
|
namespace Content.Shared.APC
|
||||||
{
|
{
|
||||||
[Serializable, NetSerializable]
|
[Serializable, NetSerializable]
|
||||||
public enum ApcVisuals
|
public enum ApcVisuals : byte
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// APC locks.
|
||||||
|
/// </summary>
|
||||||
|
LockState,
|
||||||
|
/// <summary>
|
||||||
|
/// APC channels.
|
||||||
|
/// </summary>
|
||||||
|
ChannelState,
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// APC lights/HUD.
|
/// APC lights/HUD.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -12,27 +20,158 @@ namespace Content.Shared.APC
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Serializable, NetSerializable]
|
[Serializable, NetSerializable]
|
||||||
public enum ApcChargeState
|
public enum ApcPanelState : sbyte
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// APC is closed.
|
||||||
|
/// </summary>
|
||||||
|
Closed = 0,
|
||||||
|
/// <summary>
|
||||||
|
/// APC is opened.
|
||||||
|
/// </summary>
|
||||||
|
Open = 1,
|
||||||
|
/// <summary>
|
||||||
|
/// APC is oaisdoj.
|
||||||
|
/// </summary>
|
||||||
|
Error = -1,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The state of the APC interface lock.
|
||||||
|
/// None of this is implemented.
|
||||||
|
/// </summary>
|
||||||
|
[Serializable, NetSerializable]
|
||||||
|
public enum ApcLockState : sbyte
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Empty bitmask.
|
||||||
|
/// </summary>
|
||||||
|
None = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Bitfield indicating status of APC lock indicator.
|
||||||
|
/// </summary>
|
||||||
|
Lock = (1<<0),
|
||||||
|
/// <summary>
|
||||||
|
/// Bit state indicating that the given APC lock is unlocked.
|
||||||
|
/// </summary>
|
||||||
|
Unlocked = None,
|
||||||
|
/// <summary>
|
||||||
|
/// Bit state indicating that the given APC lock is locked.
|
||||||
|
/// </summary>
|
||||||
|
Locked = (1<<0),
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Bitmask for the full state for a given APC lock indicator.
|
||||||
|
/// </summary>
|
||||||
|
All = (Lock),
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 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))).
|
||||||
|
/// </summary>
|
||||||
|
LogWidth = 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// APC power channel states.
|
||||||
|
/// None of this is implemented.
|
||||||
|
/// </summary>
|
||||||
|
public enum ApcChannelState : sbyte
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Empty bitmask.
|
||||||
|
/// </summary>
|
||||||
|
None = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Bitfield indicating whether the APC is automatically regulating the given channel.
|
||||||
|
/// </summary>
|
||||||
|
Control = (1<<0),
|
||||||
|
/// <summary>
|
||||||
|
/// Bit state indicating that the APC has been set to automatically toggle the given channel depending on available power.
|
||||||
|
/// </summary>
|
||||||
|
Auto = None,
|
||||||
|
/// <summary>
|
||||||
|
/// Bit state indicating that the APC has been set to always provide/not provide power on the given channel if possible.
|
||||||
|
/// </summary>
|
||||||
|
Manual = Control,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Bitfield indicating whether the APC is currently providing power on the given channel.
|
||||||
|
/// </summary>
|
||||||
|
Power = (1<<1),
|
||||||
|
/// <summary>
|
||||||
|
/// Bit state indicating that the APC is currently not providing power on the given channel.
|
||||||
|
/// </summary>
|
||||||
|
Off = None,
|
||||||
|
/// <summary>
|
||||||
|
/// Bit state indicating that the APC is currently providing power on the given channel.
|
||||||
|
/// </summary>
|
||||||
|
On = Power,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Bitmask for the full state for a given APC power channel.
|
||||||
|
/// </summary>
|
||||||
|
All = Power | Control,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// State that indicates the given channel has been automatically disabled.
|
||||||
|
/// </summary>
|
||||||
|
AutoOff = (Off | Auto),
|
||||||
|
/// <summary>
|
||||||
|
/// State that indicates the given channel has been automatically enabled.
|
||||||
|
/// </summary>
|
||||||
|
AutoOn = (On | Auto),
|
||||||
|
/// <summary>
|
||||||
|
/// State that indicates the given channel has been manually disabled.
|
||||||
|
/// </summary>
|
||||||
|
ManualOff = (Off | Manual),
|
||||||
|
/// <summary>
|
||||||
|
/// State that indicates the given channel has been manually enabled.
|
||||||
|
/// </summary>
|
||||||
|
ManualOn = (On | Manual),
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 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))).
|
||||||
|
/// </summary>
|
||||||
|
LogWidth = 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable, NetSerializable]
|
||||||
|
public enum ApcChargeState : sbyte
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 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.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Lack,
|
Lack = 0,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// APC is not full but has enough power.
|
/// APC is not full but has enough power.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Charging,
|
Charging = 1,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// APC battery is full and has enough power.
|
/// APC battery is full and has enough power.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Full,
|
Full = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// APC is being remotely accessed.
|
||||||
|
/// Currently unimplemented, though the corresponding sprite state exists in the RSI.
|
||||||
|
/// </summary>
|
||||||
|
Remote = 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The number of valid states charge states the APC can be in.
|
||||||
|
/// </summary>
|
||||||
|
NumStates = 4,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// APC is emagged (and not displaying other useful power colors at a glance)
|
/// APC is emagged (and not displaying other useful power colors at a glance)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Emag,
|
Emag = -1,
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable, NetSerializable]
|
[Serializable, NetSerializable]
|
||||||
|
|||||||
@@ -114,9 +114,6 @@
|
|||||||
- state: panel
|
- state: panel
|
||||||
- state: on
|
- state: on
|
||||||
shader: unshaded
|
shader: unshaded
|
||||||
# - type: Appearance
|
|
||||||
# visuals:
|
|
||||||
# - type: ApcVisualizer
|
|
||||||
- type: NodeContainer
|
- type: NodeContainer
|
||||||
examinable: true
|
examinable: true
|
||||||
nodes:
|
nodes:
|
||||||
|
|||||||
@@ -30,26 +30,29 @@
|
|||||||
sprite: Structures/Power/apc.rsi
|
sprite: Structures/Power/apc.rsi
|
||||||
layers:
|
layers:
|
||||||
- state: base
|
- state: base
|
||||||
- state: powered-1
|
|
||||||
shader: unshaded
|
|
||||||
map: ["enum.ApcVisualLayers.ChargeState"]
|
|
||||||
- state: apcox-0
|
|
||||||
shader: unshaded
|
|
||||||
map: ["enum.ApcVisualLayers.Lock"]
|
|
||||||
- state: apco0-3
|
|
||||||
shader: unshaded
|
|
||||||
map: ["enum.ApcVisualLayers.Equipment"]
|
|
||||||
- state: apco1-3
|
|
||||||
shader: unshaded
|
|
||||||
map: ["enum.ApcVisualLayers.Lighting"]
|
|
||||||
- state: apco2-3
|
|
||||||
shader: unshaded
|
|
||||||
map: ["enum.ApcVisualLayers.Environment"]
|
|
||||||
- state: panel
|
- state: panel
|
||||||
map: ["enum.WiresVisualLayers.MaintenancePanel"]
|
map: ["enum.WiresVisualLayers.MaintenancePanel"]
|
||||||
|
visible: false
|
||||||
|
- state: display-charging
|
||||||
|
shader: unshaded
|
||||||
|
map: ["enum.ApcVisualLayers.ChargeState"]
|
||||||
|
- state: lock0-unlocked
|
||||||
|
shader: unshaded
|
||||||
|
map: ["enum.ApcVisualLayers.InterfaceLock"]
|
||||||
|
- state: lock1-unlocked
|
||||||
|
shader: unshaded
|
||||||
|
map: ["enum.ApcVisualLayers.PanelLock"]
|
||||||
|
- state: channel0-auto_on
|
||||||
|
shader: unshaded
|
||||||
|
map: ["enum.ApcVisualLayers.Equipment"]
|
||||||
|
- state: channel1-auto_on
|
||||||
|
shader: unshaded
|
||||||
|
map: ["enum.ApcVisualLayers.Lighting"]
|
||||||
|
- state: channel2-auto_on
|
||||||
|
shader: unshaded
|
||||||
|
map: ["enum.ApcVisualLayers.Environment"]
|
||||||
- type: Appearance
|
- type: Appearance
|
||||||
visuals:
|
- type: ApcVisuals
|
||||||
- type: ApcVisualizer
|
|
||||||
- type: Battery
|
- type: Battery
|
||||||
maxCharge: 50000
|
maxCharge: 50000
|
||||||
startingCharge: 0
|
startingCharge: 0
|
||||||
@@ -91,14 +94,6 @@
|
|||||||
BoardName: "APC"
|
BoardName: "APC"
|
||||||
LayoutId: APC
|
LayoutId: APC
|
||||||
- type: WiresVisuals
|
- 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
|
- type: Damageable
|
||||||
damageContainer: Inorganic
|
damageContainer: Inorganic
|
||||||
damageModifierSet: StrongMetallic
|
damageModifierSet: StrongMetallic
|
||||||
@@ -142,7 +137,7 @@
|
|||||||
drawdepth: WallMountedItems
|
drawdepth: WallMountedItems
|
||||||
netsync: false
|
netsync: false
|
||||||
sprite: Structures/Power/apc.rsi
|
sprite: Structures/Power/apc.rsi
|
||||||
state: apcframe
|
state: frame
|
||||||
- type: Construction
|
- type: Construction
|
||||||
graph: APC
|
graph: APC
|
||||||
node: apcFrame
|
node: apcFrame
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 159 B |
|
Before Width: | Height: | Size: 155 B |
|
Before Width: | Height: | Size: 154 B After Width: | Height: | Size: 154 B |
|
Before Width: | Height: | Size: 156 B After Width: | Height: | Size: 156 B |
|
Before Width: | Height: | Size: 157 B After Width: | Height: | Size: 157 B |
|
Before Width: | Height: | Size: 158 B After Width: | Height: | Size: 158 B |
|
Before Width: | Height: | Size: 154 B After Width: | Height: | Size: 154 B |
|
Before Width: | Height: | Size: 156 B After Width: | Height: | Size: 156 B |
|
Before Width: | Height: | Size: 157 B After Width: | Height: | Size: 157 B |
|
Before Width: | Height: | Size: 158 B After Width: | Height: | Size: 158 B |
|
Before Width: | Height: | Size: 154 B After Width: | Height: | Size: 154 B |
|
Before Width: | Height: | Size: 156 B After Width: | Height: | Size: 156 B |
|
Before Width: | Height: | Size: 157 B After Width: | Height: | Size: 157 B |
|
Before Width: | Height: | Size: 158 B After Width: | Height: | Size: 158 B |
|
Before Width: | Height: | Size: 434 B After Width: | Height: | Size: 434 B |
|
Before Width: | Height: | Size: 275 B After Width: | Height: | Size: 275 B |
|
Before Width: | Height: | Size: 282 B After Width: | Height: | Size: 282 B |
|
Before Width: | Height: | Size: 337 B After Width: | Height: | Size: 337 B |
|
Before Width: | Height: | Size: 436 B After Width: | Height: | Size: 436 B |
BIN
Resources/Textures/Structures/Power/apc.rsi/lock0-locked.png
Normal file
|
After Width: | Height: | Size: 155 B |
BIN
Resources/Textures/Structures/Power/apc.rsi/lock0-unlocked.png
Normal file
|
After Width: | Height: | Size: 158 B |
BIN
Resources/Textures/Structures/Power/apc.rsi/lock1-locked.png
Normal file
|
After Width: | Height: | Size: 154 B |
BIN
Resources/Textures/Structures/Power/apc.rsi/lock1-unlocked.png
Normal file
|
After Width: | Height: | Size: 158 B |
@@ -7,11 +7,117 @@
|
|||||||
"y": 32
|
"y": 32
|
||||||
},
|
},
|
||||||
"states": [
|
"states": [
|
||||||
|
{
|
||||||
|
"name": "base"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "broken"
|
"name": "broken"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "apcframe"
|
"name": "frame"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "panel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lock0-unlocked"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lock0-locked"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lock1-unlocked"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lock1-locked"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel0-auto_off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel0-manual_off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel0-auto_on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel0-manual_on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel1-auto_off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel1-manual_off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel1-auto_on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel1-manual_on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel2-auto_off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel2-manual_off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel2-auto_on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "channel2-manual_on"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "display-lack",
|
||||||
|
"delays": [
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "display-charging",
|
||||||
|
"delays": [
|
||||||
|
[
|
||||||
|
0.1,
|
||||||
|
0.1,
|
||||||
|
0.1,
|
||||||
|
0.1,
|
||||||
|
0.1,
|
||||||
|
0.2
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "display-full",
|
||||||
|
"delays": [
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "display-remote",
|
||||||
|
"delays": [
|
||||||
|
[
|
||||||
|
0.1,
|
||||||
|
0.1,
|
||||||
|
0.1,
|
||||||
|
0.1,
|
||||||
|
0.1
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "emag-unlit",
|
||||||
|
"delays": [
|
||||||
|
[
|
||||||
|
0.5,
|
||||||
|
0.5
|
||||||
|
]
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sparks-unlit",
|
"name": "sparks-unlit",
|
||||||
@@ -25,106 +131,6 @@
|
|||||||
0.1
|
0.1
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "base"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "emag-unlit",
|
|
||||||
"delays": [
|
|
||||||
[
|
|
||||||
0.5,
|
|
||||||
0.5
|
|
||||||
]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "panel"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco0-0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco0-1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco0-2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco0-3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco1-0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco1-1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco1-2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco1-3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco2-0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco2-1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco2-2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco2-3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "powered-1",
|
|
||||||
"delays": [
|
|
||||||
[
|
|
||||||
1,
|
|
||||||
2
|
|
||||||
]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "powered-2",
|
|
||||||
"delays": [
|
|
||||||
[
|
|
||||||
0.1,
|
|
||||||
0.1,
|
|
||||||
0.1,
|
|
||||||
0.1,
|
|
||||||
0.1,
|
|
||||||
0.2
|
|
||||||
]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "powered-3",
|
|
||||||
"delays": [
|
|
||||||
[
|
|
||||||
1,
|
|
||||||
1
|
|
||||||
]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apco3-3",
|
|
||||||
"delays": [
|
|
||||||
[
|
|
||||||
0.1,
|
|
||||||
0.1,
|
|
||||||
0.1,
|
|
||||||
0.1,
|
|
||||||
0.1
|
|
||||||
]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apcox-0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "apcox-1"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||