From ad5c82fec9f4b65ede7b03c565c28d0187503dcd Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Tue, 17 Jul 2018 11:39:55 +0200 Subject: [PATCH] APC & SMES appearances. (#78) * CEV-Eris SMES sprite as RSI. Has been modified so that the light overlay states use alpha blending. * Add tiny glow to SMES display sprite. * Appearances work v2 * More WiP * RoundToLevels works correctly on even level counts now. * SMES -> Smes because MS guidelines. * CEV-Eris APC sprite. * APC visuals. * Reduce SMES scale again to normal levels. * Update submodule --- Content.Client/Content.Client.csproj | 4 +- .../Components/Power/ApcVisualizer2D.cs | 67 ++++ .../Components/Power/PowerDebugTool.cs | 15 +- .../Components/Power/SMESVisualizer2D.cs | 77 ++++ Content.Server/Content.Server.csproj | 4 +- Content.Server/EntryPoint.cs | 2 + .../Components/Power/ApcComponent.cs | 50 +++ .../Components/Power/PowerDebugTool.cs | 5 +- .../Components/Power/PowerStorageComponent.cs | 34 +- .../GameObjects/Components/Power/Powernet.cs | 8 + .../Components/Power/SMESComponent.cs | 53 +++ Content.Shared/Content.Shared.csproj | 6 +- .../Components/Power/PowerShared.cs | 17 + .../Components/Power/SharedApcComponent.cs | 30 ++ .../Components/Power/SharedSMESComponent.cs | 16 + Content.Shared/Utility/ContentHelpers.cs | 60 +++ Content.Tests/Content.Tests.csproj | 126 +++++++ Content.Tests/Properties/AssemblyInfo.cs | 33 ++ .../Shared/Utility/ContentHelpers_Test.cs | 60 +++ Content.Tests/packages.config | 7 + Resources/Maps/stationstation.yml | 40 +- Resources/Prototypes/Entities/Power.yml | 32 +- .../Textures/Buildings/apc.rsi/apc-b.png | Bin 0 -> 704 bytes .../Textures/Buildings/apc.rsi/apc-spark.png | Bin 0 -> 966 bytes Resources/Textures/Buildings/apc.rsi/apc0.png | Bin 0 -> 408 bytes .../Buildings/apc.rsi/apc1-b-nocover.png | Bin 0 -> 296 bytes .../Buildings/apc.rsi/apc1-nocover.png | Bin 0 -> 299 bytes Resources/Textures/Buildings/apc.rsi/apc1.png | Bin 0 -> 536 bytes .../Buildings/apc.rsi/apc2-b-nocover.png | Bin 0 -> 329 bytes .../Buildings/apc.rsi/apc2-nocover.png | Bin 0 -> 335 bytes Resources/Textures/Buildings/apc.rsi/apc2.png | Bin 0 -> 575 bytes .../Textures/Buildings/apc.rsi/apcemag.png | Bin 0 -> 523 bytes .../Textures/Buildings/apc.rsi/apcewires.png | Bin 0 -> 470 bytes .../Textures/Buildings/apc.rsi/apcmaint.png | Bin 0 -> 483 bytes .../Textures/Buildings/apc.rsi/apco0-0.png | Bin 0 -> 101 bytes .../Textures/Buildings/apc.rsi/apco0-1.png | Bin 0 -> 103 bytes .../Textures/Buildings/apc.rsi/apco0-2.png | Bin 0 -> 103 bytes .../Textures/Buildings/apc.rsi/apco0-3.png | Bin 0 -> 103 bytes .../Textures/Buildings/apc.rsi/apco1-0.png | Bin 0 -> 101 bytes .../Textures/Buildings/apc.rsi/apco1-1.png | Bin 0 -> 103 bytes .../Textures/Buildings/apc.rsi/apco1-2.png | Bin 0 -> 103 bytes .../Textures/Buildings/apc.rsi/apco1-3.png | Bin 0 -> 103 bytes .../Textures/Buildings/apc.rsi/apco2-0.png | Bin 0 -> 101 bytes .../Textures/Buildings/apc.rsi/apco2-1.png | Bin 0 -> 103 bytes .../Textures/Buildings/apc.rsi/apco2-2.png | Bin 0 -> 103 bytes .../Textures/Buildings/apc.rsi/apco2-3.png | Bin 0 -> 102 bytes .../Textures/Buildings/apc.rsi/apco3-0.png | Bin 0 -> 257 bytes .../Textures/Buildings/apc.rsi/apco3-1.png | Bin 0 -> 358 bytes .../Textures/Buildings/apc.rsi/apco3-2.png | Bin 0 -> 280 bytes .../Textures/Buildings/apc.rsi/apcox-0.png | Bin 0 -> 107 bytes .../Textures/Buildings/apc.rsi/apcox-1.png | Bin 0 -> 106 bytes .../Textures/Buildings/apc.rsi/meta.json | 344 ++++++++++++++++++ .../Textures/Buildings/smes.rsi/meta.json | 170 +++++++++ .../Textures/Buildings/smes.rsi/smes-crit.png | Bin 0 -> 721 bytes .../Buildings/smes.rsi/smes-display.png | Bin 0 -> 514 bytes .../Textures/Buildings/smes.rsi/smes-oc0.png | Bin 0 -> 162 bytes .../Textures/Buildings/smes.rsi/smes-oc1.png | Bin 0 -> 171 bytes .../Textures/Buildings/smes.rsi/smes-oc2.png | Bin 0 -> 171 bytes .../Textures/Buildings/smes.rsi/smes-og1.png | Bin 0 -> 146 bytes .../Textures/Buildings/smes.rsi/smes-og2.png | Bin 0 -> 181 bytes .../Textures/Buildings/smes.rsi/smes-og3.png | Bin 0 -> 198 bytes .../Textures/Buildings/smes.rsi/smes-og4.png | Bin 0 -> 230 bytes .../Textures/Buildings/smes.rsi/smes-og5.png | Bin 0 -> 255 bytes .../Textures/Buildings/smes.rsi/smes-op0.png | Bin 0 -> 146 bytes .../Textures/Buildings/smes.rsi/smes-op1.png | Bin 0 -> 192 bytes .../Textures/Buildings/smes.rsi/smes-op2.png | Bin 0 -> 146 bytes .../Textures/Buildings/smes.rsi/smes.png | Bin 0 -> 1281 bytes SpaceStation14Content.sln | 20 + engine | 2 +- 69 files changed, 1253 insertions(+), 29 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Power/ApcVisualizer2D.cs create mode 100644 Content.Client/GameObjects/Components/Power/SMESVisualizer2D.cs create mode 100644 Content.Server/GameObjects/Components/Power/ApcComponent.cs create mode 100644 Content.Server/GameObjects/Components/Power/SMESComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Power/PowerShared.cs create mode 100644 Content.Shared/GameObjects/Components/Power/SharedApcComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Power/SharedSMESComponent.cs create mode 100644 Content.Shared/Utility/ContentHelpers.cs create mode 100644 Content.Tests/Content.Tests.csproj create mode 100644 Content.Tests/Properties/AssemblyInfo.cs create mode 100644 Content.Tests/Shared/Utility/ContentHelpers_Test.cs create mode 100644 Content.Tests/packages.config create mode 100644 Resources/Textures/Buildings/apc.rsi/apc-b.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apc-spark.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apc0.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apc1-b-nocover.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apc1-nocover.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apc1.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apc2-b-nocover.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apc2-nocover.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apc2.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apcemag.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apcewires.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apcmaint.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco0-0.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco0-1.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco0-2.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco0-3.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco1-0.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco1-1.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco1-2.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco1-3.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco2-0.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco2-1.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco2-2.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco2-3.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco3-0.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco3-1.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apco3-2.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apcox-0.png create mode 100644 Resources/Textures/Buildings/apc.rsi/apcox-1.png create mode 100644 Resources/Textures/Buildings/apc.rsi/meta.json create mode 100644 Resources/Textures/Buildings/smes.rsi/meta.json create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-crit.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-display.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-oc0.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-oc1.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-oc2.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-og1.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-og2.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-og3.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-og4.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-og5.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-op0.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-op1.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes-op2.png create mode 100644 Resources/Textures/Buildings/smes.rsi/smes.png diff --git a/Content.Client/Content.Client.csproj b/Content.Client/Content.Client.csproj index 2a68133adb..812596a735 100644 --- a/Content.Client/Content.Client.csproj +++ b/Content.Client/Content.Client.csproj @@ -108,5 +108,7 @@ + + - + \ No newline at end of file diff --git a/Content.Client/GameObjects/Components/Power/ApcVisualizer2D.cs b/Content.Client/GameObjects/Components/Power/ApcVisualizer2D.cs new file mode 100644 index 0000000000..ee46cc84cb --- /dev/null +++ b/Content.Client/GameObjects/Components/Power/ApcVisualizer2D.cs @@ -0,0 +1,67 @@ +using Content.Shared.GameObjects.Components.Power; +using SS14.Client.GameObjects; +using SS14.Client.Interfaces.GameObjects.Components; +using SS14.Shared.Interfaces.GameObjects; + +namespace Content.Client.GameObjects.Components.Power +{ + public class ApcVisualizer2D : AppearanceVisualizer + { + public override void InitializeEntity(IEntity entity) + { + base.InitializeEntity(entity); + + var sprite = entity.GetComponent(); + + sprite.LayerMapSet(Layers.ChargeState, sprite.AddLayerState("apco3-0")); + sprite.LayerSetShader(Layers.ChargeState, "unshaded"); + + sprite.LayerMapSet(Layers.Lock, sprite.AddLayerState("apcox-0")); + sprite.LayerSetShader(Layers.Lock, "unshaded"); + + sprite.LayerMapSet(Layers.Equipment, sprite.AddLayerState("apco0-3")); + sprite.LayerSetShader(Layers.Equipment, "unshaded"); + + sprite.LayerMapSet(Layers.Lighting, sprite.AddLayerState("apco1-3")); + sprite.LayerSetShader(Layers.Lighting, "unshaded"); + + sprite.LayerMapSet(Layers.Environment, sprite.AddLayerState("apco2-3")); + sprite.LayerSetShader(Layers.Environment, "unshaded"); + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + var sprite = component.Owner.GetComponent(); + if (component.TryGetData(ApcVisuals.ChargeState, out var state)) + { + switch (state) + { + case ApcChargeState.Lack: + sprite.LayerSetState(Layers.ChargeState, "apco3-0"); + break; + case ApcChargeState.Charging: + sprite.LayerSetState(Layers.ChargeState, "apco3-1"); + break; + case ApcChargeState.Full: + sprite.LayerSetState(Layers.ChargeState, "apco3-2"); + break; + } + } + else + { + sprite.LayerSetState(Layers.ChargeState, "apco3-0"); + } + } + + enum Layers + { + ChargeState, + Lock, + Equipment, + Lighting, + Environment, + } + } +} diff --git a/Content.Client/GameObjects/Components/Power/PowerDebugTool.cs b/Content.Client/GameObjects/Components/Power/PowerDebugTool.cs index 3f57dee966..6ecbb050e5 100644 --- a/Content.Client/GameObjects/Components/Power/PowerDebugTool.cs +++ b/Content.Client/GameObjects/Components/Power/PowerDebugTool.cs @@ -10,6 +10,7 @@ namespace Content.Client.GameObjects.Components.Power { public class PowerDebugTool : SharedPowerDebugTool { + SS14Window LastWindow; public override void HandleMessage(ComponentMessage message, INetChannel netChannel = null, IComponent component = null) { base.HandleMessage(message, netChannel, component); @@ -17,13 +18,17 @@ namespace Content.Client.GameObjects.Components.Power switch (message) { case OpenDataWindowMsg msg: - var window = new SS14Window + if (LastWindow != null && !LastWindow.Disposed) { - Title = "Power Debug Tool" + LastWindow.Dispose(); + } + LastWindow = new SS14Window + { + Title = "Power Debug Tool", }; - window.Contents.AddChild(new Label() { Text = msg.Data }); - window.AddToScreen(); - window.Open(); + LastWindow.Contents.AddChild(new Label() { Text = msg.Data }); + LastWindow.AddToScreen(); + LastWindow.Open(); break; } } diff --git a/Content.Client/GameObjects/Components/Power/SMESVisualizer2D.cs b/Content.Client/GameObjects/Components/Power/SMESVisualizer2D.cs new file mode 100644 index 0000000000..5631f3f0ec --- /dev/null +++ b/Content.Client/GameObjects/Components/Power/SMESVisualizer2D.cs @@ -0,0 +1,77 @@ +using Content.Shared.GameObjects.Components.Power; +using SS14.Client.GameObjects; +using SS14.Client.Interfaces.GameObjects.Components; +using SS14.Shared.Interfaces.GameObjects; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Content.Client.GameObjects.Components.Power +{ + public class SmesVisualizer2D : AppearanceVisualizer + { + public override void InitializeEntity(IEntity entity) + { + base.InitializeEntity(entity); + + var sprite = entity.GetComponent(); + + sprite.LayerMapSet(Layers.Input, sprite.AddLayerState("smes-oc0")); + sprite.LayerSetShader(Layers.Input, "unshaded"); + sprite.LayerMapSet(Layers.Charge, sprite.AddLayerState("smes-og1")); + sprite.LayerSetShader(Layers.Charge, "unshaded"); + sprite.LayerSetVisible(Layers.Charge, false); + sprite.LayerMapSet(Layers.Output, sprite.AddLayerState("smes-op0")); + sprite.LayerSetShader(Layers.Output, "unshaded"); + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + var sprite = component.Owner.GetComponent(); + if (!component.TryGetData(SmesVisuals.LastChargeLevel, out var level) || level == 0) + { + sprite.LayerSetVisible(Layers.Charge, false); + } + else + { + sprite.LayerSetVisible(Layers.Charge, true); + sprite.LayerSetState(Layers.Charge, $"smes-og{level}"); + } + + if (component.TryGetData(SmesVisuals.LastChargeState, out var state)) + { + switch (state) + { + case ChargeState.Still: + sprite.LayerSetState(Layers.Input, "smes-oc0"); + sprite.LayerSetState(Layers.Output, "smes-op1"); + break; + case ChargeState.Charging: + sprite.LayerSetState(Layers.Input, "smes-oc1"); + sprite.LayerSetState(Layers.Output, "smes-op1"); + break; + case ChargeState.Discharging: + sprite.LayerSetState(Layers.Input, "smes-oc0"); + sprite.LayerSetState(Layers.Output, "smes-op2"); + break; + } + } + else + { + sprite.LayerSetState(Layers.Input, "smes-oc0"); + sprite.LayerSetState(Layers.Output, "smes-op1"); + } + } + + enum Layers + { + Input, + Charge, + Output, + } + } +} diff --git a/Content.Server/Content.Server.csproj b/Content.Server/Content.Server.csproj index b229998a91..36c090ce24 100644 --- a/Content.Server/Content.Server.csproj +++ b/Content.Server/Content.Server.csproj @@ -140,5 +140,7 @@ + + - + \ No newline at end of file diff --git a/Content.Server/EntryPoint.cs b/Content.Server/EntryPoint.cs index 5d519681ac..84ac78490a 100644 --- a/Content.Server/EntryPoint.cs +++ b/Content.Server/EntryPoint.cs @@ -91,6 +91,8 @@ namespace Content.Server factory.Register(); factory.Register(); + factory.Register(); + factory.Register(); } /// diff --git a/Content.Server/GameObjects/Components/Power/ApcComponent.cs b/Content.Server/GameObjects/Components/Power/ApcComponent.cs new file mode 100644 index 0000000000..605e7abd78 --- /dev/null +++ b/Content.Server/GameObjects/Components/Power/ApcComponent.cs @@ -0,0 +1,50 @@ +using Content.Shared.GameObjects.Components.Power; +using SS14.Server.GameObjects; +using SS14.Shared.GameObjects; + +namespace Content.Server.GameObjects.Components.Power +{ + public class ApcComponent : Component + { + public override string Name => "Apc"; + + PowerStorageComponent Storage; + AppearanceComponent Appearance; + + ApcChargeState LastChargeState; + + public override void Initialize() + { + base.Initialize(); + Storage = Owner.GetComponent(); + Appearance = Owner.GetComponent(); + } + + public override void Update(float frameTime) + { + var newState = CalcChargeState(); + if (newState != LastChargeState) + { + LastChargeState = newState; + Appearance.SetData(ApcVisuals.ChargeState, newState); + } + } + + ApcChargeState CalcChargeState() + { + var storageCharge = Storage.GetChargeState(); + if (storageCharge == ChargeState.Discharging) + { + return ApcChargeState.Lack; + } + + if (storageCharge == ChargeState.Charging) + { + return ApcChargeState.Charging; + } + + // Still. + return Storage.Full ? ApcChargeState.Full : ApcChargeState.Lack; + } + } +} diff --git a/Content.Server/GameObjects/Components/Power/PowerDebugTool.cs b/Content.Server/GameObjects/Components/Power/PowerDebugTool.cs index 56ad6ae66c..ce951a6cbe 100644 --- a/Content.Server/GameObjects/Components/Power/PowerDebugTool.cs +++ b/Content.Server/GameObjects/Components/Power/PowerDebugTool.cs @@ -1,3 +1,4 @@ +using System; using System.Text; using Content.Server.GameObjects.EntitySystems; using Content.Shared.GameObjects.Components.Power; @@ -61,9 +62,11 @@ namespace Content.Server.GameObjects.Components.Power if (attacked.TryGetComponent(out var storage)) { + var stateSeconds = (DateTime.Now - storage.LastChargeStateChange).TotalSeconds; builder.AppendFormat(@"Power Storage: Capacity: {0}, Charge: {1}, ChargeRate: {2}, DistributionRate: {3}, ChargePowernet: {4} -", storage.Capacity, storage.Charge, storage.ChargeRate, storage.DistributionRate, storage.ChargePowernet); + LastChargeState: {5} ({6}), LastChargeStateChange: {7:0.00} seconds ago. +", storage.Capacity, storage.Charge, storage.ChargeRate, storage.DistributionRate, storage.ChargePowernet, storage.LastChargeState, storage.GetChargeState(), stateSeconds); } if (attacked.TryGetComponent(out var transfer)) diff --git a/Content.Server/GameObjects/Components/Power/PowerStorageComponent.cs b/Content.Server/GameObjects/Components/Power/PowerStorageComponent.cs index 413f7066ba..993924d492 100644 --- a/Content.Server/GameObjects/Components/Power/PowerStorageComponent.cs +++ b/Content.Server/GameObjects/Components/Power/PowerStorageComponent.cs @@ -1,4 +1,5 @@ -using SS14.Shared.GameObjects; +using Content.Shared.GameObjects.Components.Power; +using SS14.Shared.GameObjects; using SS14.Shared.Interfaces.GameObjects; using SS14.Shared.IoC; using SS14.Shared.Utility; @@ -14,6 +15,9 @@ namespace Content.Server.GameObjects.Components.Power { public override string Name => "PowerStorage"; + public ChargeState LastChargeState { get; private set; } = ChargeState.Still; + public DateTime LastChargeStateChange { get; private set; } + /// /// Maximum amount of energy the internal battery can store. /// In Joules. @@ -38,6 +42,8 @@ namespace Content.Server.GameObjects.Components.Power /// public float DistributionRate { get; private set; } = 1000; + public bool Full => Charge >= Capacity; + private bool _chargepowernet = false; /// @@ -129,15 +135,19 @@ namespace Content.Server.GameObjects.Components.Power public void DeductCharge(float todeduct) { Charge = Math.Max(0, Charge - todeduct); + LastChargeState = ChargeState.Discharging; + LastChargeStateChange = DateTime.Now; } public void AddCharge(float charge) { Charge = Math.Min(Capacity, Charge + charge); + LastChargeState = ChargeState.Charging; + LastChargeStateChange = DateTime.Now; } /// - /// Returns the charge available from the energy storage + /// Returns the amount of energy that can be taken in by this storage in the specified amount of time. /// public float RequestCharge(float frameTime) { @@ -145,15 +155,33 @@ namespace Content.Server.GameObjects.Components.Power } /// - /// Returns the charge available from the energy storage + /// Returns the amount of energy available for discharge in the specified amount of time. /// public float AvailableCharge(float frameTime) { return Math.Min(DistributionRate * frameTime, Charge); } + public ChargeState GetChargeState() + { + return GetChargeState(TimeSpan.FromSeconds(1)); + } + + public ChargeState GetChargeState(TimeSpan timeout) + { + if (LastChargeStateChange + timeout > DateTime.Now) + { + return LastChargeState; + } + return ChargeState.Still; + } + public void ChargePowerTick(float frameTime) { + if (Full) + { + return; + } AddCharge(RequestCharge(frameTime)); } diff --git a/Content.Server/GameObjects/Components/Power/Powernet.cs b/Content.Server/GameObjects/Components/Power/Powernet.cs index 7f3bf5d312..2750d4d751 100644 --- a/Content.Server/GameObjects/Components/Power/Powernet.cs +++ b/Content.Server/GameObjects/Components/Power/Powernet.cs @@ -145,6 +145,10 @@ namespace Content.Server.GameObjects.Components.Power break; } var demand = consumer.RequestCharge(frameTime); + if (demand == 0) + { + continue; + } var taken = Math.Min(demand, totalRemaining); totalRemaining -= taken; consumer.AddCharge(taken); @@ -155,6 +159,10 @@ namespace Content.Server.GameObjects.Components.Power foreach (var supplier in PowerStorageSupplierList) { var load = supplier.AvailableCharge(frameTime); + if (load == 0) + { + continue; + } var added = Math.Min(load, supplierUsed); supplierUsed -= added; supplier.DeductCharge(added); diff --git a/Content.Server/GameObjects/Components/Power/SMESComponent.cs b/Content.Server/GameObjects/Components/Power/SMESComponent.cs new file mode 100644 index 0000000000..fdfb23701d --- /dev/null +++ b/Content.Server/GameObjects/Components/Power/SMESComponent.cs @@ -0,0 +1,53 @@ +using System; +using Content.Shared.GameObjects.Components.Power; +using Content.Shared.Utility; +using SS14.Server.GameObjects; +using SS14.Shared.GameObjects; + +namespace Content.Server.GameObjects.Components.Power +{ + /// + /// Handles the "user-facing" side of the actual SMES object. + /// This is operations that are specific to the SMES, like UI and visuals. + /// Code interfacing with the powernet is handled in . + /// + public class SmesComponent : Component + { + public override string Name => "Smes"; + + PowerStorageComponent Storage; + AppearanceComponent Appearance; + + int LastChargeLevel = 0; + ChargeState LastChargeState; + + public override void Initialize() + { + base.Initialize(); + Storage = Owner.GetComponent(); + Appearance = Owner.GetComponent(); + } + + public override void Update(float frameTime) + { + var newLevel = CalcChargeLevel(); + if (newLevel != LastChargeLevel) + { + LastChargeLevel = newLevel; + Appearance.SetData(SmesVisuals.LastChargeLevel, newLevel); + } + + var newState = Storage.GetChargeState(); + if (newState != LastChargeState) + { + LastChargeState = newState; + Appearance.SetData(SmesVisuals.LastChargeState, newState); + } + } + + int CalcChargeLevel() + { + return ContentHelpers.RoundToLevels(Storage.Charge, Storage.Capacity, 6); + } + } +} diff --git a/Content.Shared/Content.Shared.csproj b/Content.Shared/Content.Shared.csproj index 70e509dc1e..db0b641216 100644 --- a/Content.Shared/Content.Shared.csproj +++ b/Content.Shared/Content.Shared.csproj @@ -67,6 +67,7 @@ + @@ -100,6 +101,9 @@ + + + - + \ No newline at end of file diff --git a/Content.Shared/GameObjects/Components/Power/PowerShared.cs b/Content.Shared/GameObjects/Components/Power/PowerShared.cs new file mode 100644 index 0000000000..abe8f3e8f1 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Power/PowerShared.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SS14.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Power +{ + [Serializable, NetSerializable] + public enum ChargeState + { + Still, + Charging, + Discharging, + } +} diff --git a/Content.Shared/GameObjects/Components/Power/SharedApcComponent.cs b/Content.Shared/GameObjects/Components/Power/SharedApcComponent.cs new file mode 100644 index 0000000000..5ff2c23114 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Power/SharedApcComponent.cs @@ -0,0 +1,30 @@ +using System; +using SS14.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Power +{ + [Serializable, NetSerializable] + public enum ApcVisuals + { + ChargeState + } + + [Serializable, NetSerializable] + public enum ApcChargeState + { + /// + /// APC does not have enough power to charge cell (if necessary) and keep powering the area. + /// + Lack, + + /// + /// APC is not full but has enough power. + /// + Charging, + + /// + /// APC battery is full and has enough power. + /// + Full, + } +} diff --git a/Content.Shared/GameObjects/Components/Power/SharedSMESComponent.cs b/Content.Shared/GameObjects/Components/Power/SharedSMESComponent.cs new file mode 100644 index 0000000000..90ae68d11f --- /dev/null +++ b/Content.Shared/GameObjects/Components/Power/SharedSMESComponent.cs @@ -0,0 +1,16 @@ +using SS14.Shared.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Content.Shared.GameObjects.Components.Power +{ + [Serializable, NetSerializable] + public enum SmesVisuals + { + LastChargeState, + LastChargeLevel, + } +} diff --git a/Content.Shared/Utility/ContentHelpers.cs b/Content.Shared/Utility/ContentHelpers.cs new file mode 100644 index 0000000000..7b1682e0ee --- /dev/null +++ b/Content.Shared/Utility/ContentHelpers.cs @@ -0,0 +1,60 @@ +using System; + +namespace Content.Shared.Utility +{ + public static class ContentHelpers + { + /// + /// Assigns the value going from 0 to + /// such that it is divided into a set of (amount ) "levels". + /// Rounding is performed to the "middle" so that the highest and lowest levels are only assigned + /// if is exactly or 0. + /// + /// + /// Say you have a progress bar going from 0 -> 100 inclusive and you want to map this to 6 sprite states (0, 4 intermediates and full). + /// This method allows you to easily map this progress bar to the sprite states. + /// + /// The amount of levels to subdivide into. + /// An integer from 0 to -1. + /// + /// Thrown if levels is less than 1. + /// + public static int RoundToLevels(double actual, double max, int levels) + { + if (levels <= 0) + { + throw new ArgumentException("Levels must be greater than 0.", nameof(levels)); + } + if (actual >= max) + { + return levels - 1; + } + if (actual <= 0) + { + return 0; + } + var toOne = actual / max; + double threshold; + if (levels % 2 == 0) + { + // Basically, if we have an even count of levels, there's no exact "mid point". + // Thus, I nominate the first one below the 50% mark. + threshold = ((levels / 2f) - 1) / (levels - 1); + } + else + { + threshold = 0.5f; + } + + var preround = toOne * (levels - 1); + if (toOne <= threshold) + { + return (int)Math.Ceiling(preround); + } + else + { + return (int)Math.Floor(preround); + } + } + } +} diff --git a/Content.Tests/Content.Tests.csproj b/Content.Tests/Content.Tests.csproj new file mode 100644 index 0000000000..de55f6ca39 --- /dev/null +++ b/Content.Tests/Content.Tests.csproj @@ -0,0 +1,126 @@ + + + + + + + Debug + AnyCPU + {8EDF4429-251A-416D-BB68-93F227191BCF} + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Properties + Content.Tests + Content.Tests + v4.5.1 + 512 + UnitTest + ..\bin\Content.Tests\ + + + true + full + false + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + TRACE + prompt + 4 + + + true + DEBUG;TRACE + full + x64 + prompt + + + TRACE + true + pdbonly + x64 + prompt + + + true + DEBUG;TRACE + full + x86 + prompt + + + TRACE + true + pdbonly + x86 + prompt + + + + $(SolutionDir)packages\NUnit.3.10.1\lib\net45\nunit.framework.dll + + + $(SolutionDir)packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll + + + + + + + + + + + + + + {a2e5f175-78af-4ddd-8f97-e2d2552372ed} + Content.Client + + + {b38dbbd0-04c2-4d1a-84e2-b3446f6adf2a} + Content.Server + + + {26aeebb3-dde7-443a-9f43-7bc7f4acf6b5} + Content.Shared + + + {59250baf-0000-0000-0000-000000000000} + Lidgren.Network + + + {8af31169-49b1-4a12-b8f4-2a0674a9e7cb} + SS14.Client.Godot + + + {83429bd6-6358-4b18-be51-401df8ea2673} + SS14.Client + + + {b04aae71-0000-0000-0000-000000000000} + SS14.Server + + + {0529f740-0000-0000-0000-000000000000} + SS14.Shared + + + {f0ada779-40b8-4f7e-ba6c-cdb19f3065d9} + SS14.UnitTesting + + + + + diff --git a/Content.Tests/Properties/AssemblyInfo.cs b/Content.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..9b98942957 --- /dev/null +++ b/Content.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Content.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("nunit.tests")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Content.Tests/Shared/Utility/ContentHelpers_Test.cs b/Content.Tests/Shared/Utility/ContentHelpers_Test.cs new file mode 100644 index 0000000000..961accd5b6 --- /dev/null +++ b/Content.Tests/Shared/Utility/ContentHelpers_Test.cs @@ -0,0 +1,60 @@ +using Content.Shared.Utility; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Content.Tests.Shared.Utility +{ + [Parallelizable] + [TestFixture] + [TestOf(typeof(ContentHelpers))] + public class ContentHelpers_Test + { + + public static readonly IEnumerable<(double val, double max, int levels, int expected)> TestData = new(double, double, int, int)[] + { + // Testing odd level counts. These are easy. + (-1, 10, 5, 0), + ( 0, 10, 5, 0), + ( 0.01f, 10, 5, 1), + ( 1, 10, 5, 1), + ( 2, 10, 5, 1), + ( 2.5f, 10, 5, 1), + ( 2.51f, 10, 5, 2), + ( 3, 10, 5, 2), + ( 4, 10, 5, 2), + ( 5, 10, 5, 2), + ( 6, 10, 5, 2), + ( 7, 10, 5, 2), + ( 7.49f, 10, 5, 2), + ( 7.5f, 10, 5, 3), + ( 8, 10, 5, 3), + ( 9, 10, 5, 3), + (10, 10, 5, 4), + (11, 10, 5, 4), + + // Even level counts though.. + ( 1, 10, 6, 1), + ( 2, 10, 6, 1), + ( 3, 10, 6, 2), + ( 4, 10, 6, 2), + ( 5, 10, 6, 2), + ( 6, 10, 6, 3), + ( 7, 10, 6, 3), + ( 8, 10, 6, 4), + ( 9, 10, 6, 4), + (10, 10, 6, 5), + }; + + [Parallelizable] + [Test] + public void Test([ValueSource(nameof(TestData))] (double val, double max, int levels, int expected) data) + { + (double val, double max, int levels, int expected) = data; + Assert.That(ContentHelpers.RoundToLevels(val, max, levels), Is.EqualTo(expected)); + } + } +} diff --git a/Content.Tests/packages.config b/Content.Tests/packages.config new file mode 100644 index 0000000000..268222d562 --- /dev/null +++ b/Content.Tests/packages.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Resources/Maps/stationstation.yml b/Resources/Maps/stationstation.yml index f4278807dd..5703ba3869 100644 --- a/Resources/Maps/stationstation.yml +++ b/Resources/Maps/stationstation.yml @@ -1745,6 +1745,8 @@ - &1206253354 type: &1921049841 PowerStorage - type: PowerNode + - type: Smes + - type: Appearance - type: entity id: SMES name: SMES @@ -1760,6 +1762,8 @@ - type: Sprite - type: PowerStorage - type: PowerNode + - type: Smes + - type: Appearance - type: entity id: &400177229 BlueWire name: BlueWire @@ -2236,8 +2240,8 @@ - type: PowerDevice - type: PoweredLight - type: entity - id: &692485458 WPP - name: WPP + id: &692485458 APC + name: APC components: - type: PowerStorage - type: PowerNode @@ -2251,9 +2255,11 @@ - type: Sprite - &1938028994 type: &323998104 PowerProvider + - type: Apc + - type: Appearance - type: entity - id: WPP - name: WPP + id: APC + name: APC components: - type: PowerStorage - type: PowerNode @@ -2266,6 +2272,8 @@ - type: BoundingBox - type: Sprite - type: PowerProvider + - type: Apc + - type: Appearance - type: entity id: Wire name: Wire @@ -2369,8 +2377,8 @@ - type: PowerDevice - type: PoweredLight - type: entity - id: WPP - name: WPP + id: APC + name: APC components: - type: PowerStorage - type: PowerNode @@ -2382,6 +2390,8 @@ - type: BoundingBox - type: Sprite - type: PowerProvider + - type: Apc + - type: Appearance - type: entity id: Wire name: Wire @@ -2396,8 +2406,8 @@ color: '#FF0000FF' - type: PowerTransfer - type: entity - id: WPP - name: WPP + id: APC + name: APC components: - type: PowerStorage - type: PowerNode @@ -2409,6 +2419,8 @@ - type: BoundingBox - type: Sprite - type: PowerProvider + - type: Apc + - type: Appearance - type: entity id: Wire name: Wire @@ -2649,8 +2661,8 @@ color: '#FF0000FF' - type: PowerTransfer - type: entity - id: WPP - name: WPP + id: APC + name: APC components: - type: PowerStorage - type: PowerNode @@ -2663,9 +2675,11 @@ - type: BoundingBox - type: Sprite - type: PowerProvider + - type: Apc + - type: Appearance - type: entity - id: WPP - name: WPP + id: APC + name: APC components: - type: PowerStorage - type: PowerNode @@ -2678,6 +2692,8 @@ - type: BoundingBox - type: Sprite - type: PowerProvider + - type: Apc + - type: Appearance - type: entity id: Wire name: Wire diff --git a/Resources/Prototypes/Entities/Power.yml b/Resources/Prototypes/Entities/Power.yml index f300647612..8cd150abe5 100644 --- a/Resources/Prototypes/Entities/Power.yml +++ b/Resources/Prototypes/Entities/Power.yml @@ -70,25 +70,49 @@ chargerate: 200 chargepowernet: false +- type: entity + parent: WPP + id: APC + name: APC + components: + - type: Apc + - type: Sprite + netsync: false + texture: "" + sprite: "Buildings/apc.rsi" + state: apc0 + - type: Appearance + visuals: + - type: ApcVisualizer2D - type: entity id: SMES - name: SMES - description: Stores power in its supermagnetic cells + name: Smes + description: Stores power in its super-magnetic cells components: - type: Transform - type: Clickable - type: BoundingBox - type: Sprite - texture: Objects/storage.png + netsync: false + sprite: Buildings/smes.rsi + state: smes + layers: + - state: smes-display + shader: unshaded - type: Icon - texture: Objects/storage.png + sprite: Buildings/smes.rsi + state: smes - type: PowerStorage capacity: 3000 charge: 1000 chargerate: 200 distributionrate: 400 chargepowernet: true + - type: Smes + - type: Appearance + visuals: + - type: SmesVisualizer2D - type: entity id: WiredMachine diff --git a/Resources/Textures/Buildings/apc.rsi/apc-b.png b/Resources/Textures/Buildings/apc.rsi/apc-b.png new file mode 100644 index 0000000000000000000000000000000000000000..925f8c5ffcc089ea05b452332fbfee1ee9ee18a6 GIT binary patch literal 704 zcmV;x0zdtUP)n@=wvb&Na)a|ThK)aLC}ck zhauRI?hj-nlTq6g-t`AN3nIvNs2$kSnb|Z5+7Apn^Uimk=R40c@54f!I(7bc8oUI3 z*M`c+P4eme)RB2k`w8&q!6@_d>6#Pw_V#e+?x?HAmw`&Kzk#QLQbF=?>?yCNo_hwn zHFTS3SYtK62|zTgQ7TB+XHNNXxsta4&~=^W=4R)pTnrBR31}=tUe96pWnkI%}IP0cqvbVQar2~kxMToRTP!$!R?A8X)N!Zz~mlH{y zoBg_{(bw+`qG65p_K34K_V@`)i^lN`cxLv%&4A||SXwk10xg0>Qs-cQhr#VNcElBS zx7OL+TIXPYhvA`NBCTiXzuN2kCXzaV7U7!Qmw^gW{+MV3XH?Yl11O5(?1F|00!`{4B0?z%Y~JpMuiAUk`*t7ib>$&K_ogvd)i~C&<;_T@E|50OzPMn5z0D9 zw~ZB|zyu?-ZAGLG>R2oavqhk>m#~9q{%M^zJG0Hcx8Luw9^TG3>&%<|!+bn|h=_=Y zh>Fc2s{!>*;SHxDAK%3-bBZvbaCLTO`g4gjEmK(bqz6MKp=oXODA+Kh*&&k zH=?NWZ6AQ0!P&Td2FjQ}K3I<0tIsU+54#->Y@Pv)EuHA-h}hk{GWn6dQp}AtTaL9o z1NKh0f7v<%$5vJlJLm2tKs0}RupFqaKrHTRyv_U&lB0kxG@W&<&;h8?s<1FSg-j-6 zIS%-H4eai|C$jmx zW`)U=|9IjeTCJ}>00e%DICHka@mKLL^V2#16rg&((2mtNg*R%nD(G4;>zHJ65_NTr z+mFksRV=0qN58`qL%#4O$TScBMrRlX{DITkk5=RDQZ--b>=2oTKfiy&u@fh^AGbJ} z{>&#LA|fIpA|fIpA|fKk*bneHpZx%j^VtvZIG_ChkMr3N@HpS~en5ZpDF|;jH~$rzuKS=2lJXAzj7Smmp`)SuLJ?O^d8{!{(PtJ z1BKWR_yC}HM^rBPuJ;3yqvug~eRnIQknhj;I-mUjkMr3N@Hn6S015JmtS$A29KTuq zPgBuqsrHvtA=^wLBBH{?PcjnXK_em}A|j%K?+2((ihh8~r0EB!s^I$ps*|E0pfc&! z4^WMi>j$Vry7dE8lh^eFZnqyr3>7);Sh2|K`T@`V*7wI3J89MrP*uUNAD}uZ`T;7F orXQdxDf$6KL_|bHL`1In0}8yUWpVnfj{pDw07*qoM6N<$f-9HN+W-In literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apc0.png b/Resources/Textures/Buildings/apc.rsi/apc0.png new file mode 100644 index 0000000000000000000000000000000000000000..7079bad29adc197464a32b9d27dc1c7bc0e0a954 GIT binary patch literal 408 zcmV;J0cZY+P)B5h4gd3YQiVEnJDqpdZn`oeLpo6VwlA-5(HKM2m7MnGjJM zxe^1yH3$^k)nah4Xy(o^3PJP0aPH#eoR{|w=R!$uefPkYnvUE4zYwu&+Y?Y36s%4MKb`< zwIu+FM8Z=u9*^nT5=)pUrFeO2@|aArw33Q$V47?;>z<`_j17mwZyLieFp3o{VN!3@ zXKP@3uoqzxSe*56a1tmKE0oJeT5aeAe#ZS9GfyBR(tz`$d41Emxg=1looO|R0jRRzC77etm9v&e0kG=RL@XG?p+uHJwhAT(02Op53QwOW$_@LR^7T{u@n7 zNy^x8t4=>5Py#`&;p6>{)wOlEPVkFACMG84Pw)i;@{A8CuANQ*0000ecSjeAxHi zJJA4w_a5&(09ls(=?UZWF|Kx0RYj5{B%{%O0*LWukX=0qVT=Lbc{<%+05K}hUYLDP z0Jdsjun7oHiwk56o3$|51oAxJI)B%)g25(`rYT+51$)9^6R_3>dri}(J6!?XT%Yr@{OHuiH1BR6^*KxhI6nH~(q7?f&!il8YPV_L z+-v8ZWB?(AKnMYVJkS61gwg2;Uwf*m!We@Y40aPhjMsx~>q!V}EdY+qZWFbfbg(9L$7rDE4NG?XJ^n?diY>cR9zoQA6oH9V+i2v$-ayXgUg@6kJvw(ZzVN?e!9=*T@$l!gO2P`=S$0;q z+qqe|@r&MDqR`iJi~<0J5NvI4A(qZ+dGhd>TdUp7xtRzk3MnPuzNb{rEE>6`2oORb z5CH#}1M=`V7jNbcNGUUyD-VCB4n(2Pg{1}F?0wSmR&QL%a8l&-0?wWO!F9JyFbG)d zw6xrDocG?l=>#YwNkWn&0NA$uS52XLsYx&h==b|rmW8#bA48!_Xxny1$hevk;kqsW z&v$laCqOmoF27h2(apGxb99y4Rc7r;_JzrRLCTuXB{9Y-UJ_ zm?(}pN>lDXc*J=jGO^WOr&4pY&2tG*kaF~_Zq}+)?ak2zvqm<5-jDHpKNA(-1mg$* zuDM;~7``R}b-Q^I6+U>o+8((Cz-T$WdU0iJ?c=_$T|9Ltwh!dAwG;vAfz0)LonwwU aisBdjxYe?ktF?|!hw)mvfLkVsEb$9 z+U8oZQ}0UUO#KIi!vXhr-k?IxCDaTFOK9f zy3m{_acy>9=6&>5`;Jqulp+j6!bYQZ?)I_*0PXhmluT91 z_N+vn=VV#toVoM{0OD8>?Co=Vb4BOweo}4EvbGIal+s+bE+%!BwQays{aS#B!Q<5P zDjWEdfD6$SNGSmr^!xuO(Cc*xerlE3GhJxPvLtP#&Y8|1(OHs=SCO2@^Kj_A$K&yM bJe$imq=sTWff~&@00000NkvXXu0mjf>xi6I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apc2-nocover.png b/Resources/Textures/Buildings/apc.rsi/apc2-nocover.png new file mode 100644 index 0000000000000000000000000000000000000000..0dc5cda21152f7a93e256fc00d501a0aac17958e GIT binary patch literal 335 zcmV-V0kHmwP)41Z+<*6%qFhL{YS~XUUdCmzts|5JDiDP3Lnr>lOg$^)Bbi%$Bly zwnUa?q-pAXX6*?8#IdBYyT{G-1-JJP)79=-Yny;o6q@tXv+25MZ4w5qI002ovPDHLkV1l{tmv{gG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apc2.png b/Resources/Textures/Buildings/apc.rsi/apc2.png new file mode 100644 index 0000000000000000000000000000000000000000..d273c1926f98ae90a07f4e70ebd5a2a85f9477a6 GIT binary patch literal 575 zcmV-F0>J%=P)Di0N!H$BbZ7PlER45u7 z*HqqRh|6Jmn1}L~Wk2#Jw7qCQmxu6t-#p(u@0;X-|DB9ZaBbn`V801!g3yt0g#I325#+q+E9%th7>#6Vi4l>GV~k~=l7 z)egmg5CVY!_{TaRw|5ii2HpWFW#n)r(GRo(e%s~jM22@CzQ*ciE?D!{atd?O#A|spn@tSEz!;C;hHO#;082{` zBWCuSQaNR!UawQD)wK6a^%hhrCS#(^lgAHu`us&Ns+?kI9Z)oz9=C7Y?8So&tpkev zPYdvJeKm5OrUOIy5}K1HmSq93zP1*t)y@O6w!JrHRdE{5q0@hmAPBH$ZM>Gpvw{J@ zqwhWq$2qo6A_F>&jyMC_L)dVfOg3MlQk`cf3|aW$(=Ob??{x4x9d^QyJ9qDMMuch8Bj>s{j4tLbL5JP-2-NH+x%^_gX_AHsPsCtTL5s$n$vE>&%mQlG<#9; zdE<3#jYI~ZJDgrTUp_MTWz&rvJmW|=41c}-1aT4^>Ml45($z)W92G?u2loygBSoZxI*PGS zigqX|B^Y|Xz;1#L5~XOp%S%P?w_G0IeZO$|2QGj>AP@)yg8xbrt6)4j{p?n9ev)B& ze#+m<(_m|T4Vsp-Egl;SV|iuG_Pp=(b1i_?>?iTd&s>1o4aLUxK8}l{%x1BnJQO0M zY?uH5g~+JgP*)G=x1TEkB|}H2oP;a|8rGQf5hX)~LS#@%5z~&a80>@E+;|QzPW+eo zQ(OcBXld{MvN!i9V6l|A`*3Y1)l+vaNfHWE^VlRZkWuX_Jn>7Dvrvc(mEpI&0O@S- zldDg4XI>}3iQkt5SgW7T1~C_}*4{(Z%<)#(Z$H} zUZZT7%zC@<`mK@I&-HeAV)$@dL0518+i2k?{=da95C{YUfk5ylc>!62{6Y~1dPD#K N002ovPDHLkV1kgX?|lFO literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apcewires.png b/Resources/Textures/Buildings/apc.rsi/apcewires.png new file mode 100644 index 0000000000000000000000000000000000000000..9370aaf7d48dd912280fccfd7b30603467ac6617 GIT binary patch literal 470 zcmV;{0V)28P)I~PLGCa53Kx<4Seh!)jS`hbw! z$e0WWqbVpzAhj4qR2uJyx@sO6?krx;d3n#}TySu3`0uzxf{pF?&#+CNAJdk7rtB2B zI#2NO@-}eeaCn{5vqWEwEdyq;aUe9%DC=Ba-*A_{6&BlzALCbi6tofme#J+ltPf`Z zAg`$axZQ3`O|#h~uc`PIAG)sd@&3fCBr!QXKfHlX0)asLUsVlb^?JQaBg-;!>b7=$P-vmmI33US$&$}Q9 z{D7rJPuCd?MVMKT`!=^_z(m)LjTW7oW!4)-k|ZQa0-&IkP*t_-H1#5cBLI72s8x!1 zyi4uVM3jIn17JMM<}L3fuc>{X+z>% M07*qoM6N<$f-3IK(EtDd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apcmaint.png b/Resources/Textures/Buildings/apc.rsi/apcmaint.png new file mode 100644 index 0000000000000000000000000000000000000000..41ef7add2a8e32215a5bf9960c87862dbdc7fb76 GIT binary patch literal 483 zcmV<90UZ8`P)JYQJ z;_mF??xp-)W?-J-eR$qs_XYkt5s~2V^z3WgBDa@$$2wD@%e@xGQX+*Tb=P;{8|@y= zhVH5n8UO%72y*!xNPN~+N85eur8BmBff(=$r4;WUJ>KIuG&$Wr}E=? z1~`l{Fvf(sbmPR1o&tHrPL}oOto%8*LB3m zhP86N2u}%YDj8uL-k5;}Iccq&=W@}th9?8SZyQG8C2A-9%>y1|4aGpOMLqpqCrp^& Zmv7O9zWWkIz~KM@002ovPDHLkV1jh&)*Ao- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco0-0.png b/Resources/Textures/Buildings/apc.rsi/apco0-0.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4581febb6f1a991fef9cdbb5525a58f993d1d9 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz9Zwg>kcv5P&l&PEDDW_Buv9pB z#3e~g-I?k7rsbg*I2baDzO9-ad6}PqVV~SNM&^^1Zv>ct`WQT2{an^LB{Ts5&-WZr literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco0-1.png b/Resources/Textures/Buildings/apc.rsi/apco0-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4519f536539ce672926372a58a401feaae10e974 GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzJx>?Mkcv5P&p8SLB^V5(ZX7ZQ zGva#b(tf(oCv>IvG4&{an^LB{Ts5^1K{f literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco0-2.png b/Resources/Textures/Buildings/apc.rsi/apco0-2.png new file mode 100644 index 0000000000000000000000000000000000000000..355a76f926a5dd2b5de85b69eeb32049e9a61990 GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzJx>?Mkcv5P&l&PEDDW_B&~#ws zubW`JokLP+$BB7ij>-%VCQn`bZRXX#3=9umG9_`a@NSG0X#(nG@O1TaS?83{1OWcR B9V7q% literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco0-3.png b/Resources/Textures/Buildings/apc.rsi/apco0-3.png new file mode 100644 index 0000000000000000000000000000000000000000..27c2a87efd31c4088ff07e48cf75060ea5e4991b GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzJx>?Mkcv5P&l&PEDDW_BkaS?t zt1K|rKOrHs=`x B9>f3u literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco1-0.png b/Resources/Textures/Buildings/apc.rsi/apco1-0.png new file mode 100644 index 0000000000000000000000000000000000000000..c66bfa90d952ecb1d1af624744dc4834379c0dd5 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz9Zwg>kcv5P&l&PEDDW_Buv9pB z#3e~g-I?k7rsbg*I2ab3ytz6r&DWlRVV~STQ|6QE8FP;V^)Yz5`njxgN@xNA-ZdRA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco1-1.png b/Resources/Textures/Buildings/apc.rsi/apco1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..365fef1fe68a4e0c10803b00d05643f2c70eb9e6 GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzJx>?Mkcv5P&p8SLB^V5(ZX7ZQ zGva#b(+EKg#sFT6d)z4*}Q$iB}2udBB literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco1-2.png b/Resources/Textures/Buildings/apc.rsi/apco1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..dd28cce5450dc68dde3a6ce58c57d00ee84cc49f GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzJx>?Mkcv5P&l&PEDDW_B&~#ws zubW`JokLP+$BB7ij>-%T{$YK$(!;(pGdy_7O|Dr>mdKI;Vst0NLgo ATL1t6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco1-3.png b/Resources/Textures/Buildings/apc.rsi/apco1-3.png new file mode 100644 index 0000000000000000000000000000000000000000..a696818ec17da4eb1ee67fc533c725b72bd33d5c GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzJx>?Mkcv5P&l&PEDDW_BkaS?t zt1K|rKOrHszopr0PH~> AT>t<8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco2-0.png b/Resources/Textures/Buildings/apc.rsi/apco2-0.png new file mode 100644 index 0000000000000000000000000000000000000000..7359d44fb0d6d9d6ec05998f25e992c8b05370d5 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz9Zwg>kcv5P&l&PEDDW_Buv9pB z#3e~g-I?k7rsbg*I2an#(%0{rY5JFeVV|5{1@lSen-|sr^)Yz5`njxgN@xNA)BGJA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco2-1.png b/Resources/Textures/Buildings/apc.rsi/apco2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf7139dfb9a418d20615c607df452d51408c46b GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzJx>?Mkcv5P&p8SLB^V5(ZX7ZQ zGva#b(SXYA^>bP0l+XkK@Jbx9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco2-2.png b/Resources/Textures/Buildings/apc.rsi/apco2-2.png new file mode 100644 index 0000000000000000000000000000000000000000..1623be35217edf14c2e6c3b1ef5001c0ace714ee GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzJx>?Mkcv5P&l&PEDDW_B&~#ws zubW`JokLP+$BB7ij>-%Sc9E7@^CR!_Gdy_7WSPLiEA?xlIZ!8qr>mdKI;Vst0IS;? Ap#T5? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco2-3.png b/Resources/Textures/Buildings/apc.rsi/apco2-3.png new file mode 100644 index 0000000000000000000000000000000000000000..0b5501318ce586b3af4198663259bfc9f997f85b GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzT~8Oskcv5P&l&PEDDW_BkbH1V zi~rCvRzqhd@tc>mGFTW6s3)(VrM~(%BZEyWqb$oB?jZT;K#dHZu6{1-oD!MZevb9USA-Q4b@^R+ji&r%!UCNXS3007v2&<$hJ z4d|P8o#nVb1p;sIQW!Z>6K-_9o@A|fIpqF?d^S=l%D<~XPq00000NkvXX Hu0mjf$Ix&d literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco3-1.png b/Resources/Textures/Buildings/apc.rsi/apco3-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5a09344a3e3b1256d4341af2413c761026e4a45a GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^2|(a_DiH3*$ zUxmvzbb4(P;_dYgxU@@Z>uO8grQR1NoUjbkIAYo{bwQL&+01;y$!or^yfL>zUG4JO z4xnK`5HZ!>wd6(X>$79@9o7E zOV{6Hy!}Do^ObY*6KvRb|NU(l5z%n9NN08GpWXXiU+vqt!v5bSJBUM| xPTaPi|G%E^-LLgQ_xXQZ`~0*27u3XtbiWAY15@IbC}e{~JYD@<);T3K0RV^gqZI%E literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/apco3-2.png b/Resources/Textures/Buildings/apc.rsi/apco3-2.png new file mode 100644 index 0000000000000000000000000000000000000000..89c3087474e23f1e9f309b6f5685cbfa0af9458f GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQujSw978JRyuEOii!o5**vIs~ z{#ia|IT}GH(t?s7%iWo@HM)p@v!Urt4%M)%oGTGCjyO%3P<&3J>-qNC#`(|fKQp<2 zK>f)HvN_+YkB1xoOVFsDziP>^%$o<(mN({Teg5+IpTNQJwb~x5^!G9_MEFb-Xk%cQ z!OC5>wC`h9pTUhqcQi7eTvfRk9_4Vo@ZGsLUb1-)GLMGZzG^>cc5SW~cY!VcAprw! zv4+p*>o0AtTQ}qSzTiy8tzloERqnkVbN+j~$8Y6FU-Z*=)xKo)aW`IjV0X=Kf3Txm b_CH~XdE$5_I^&25(5nodu6{1-oD!M7(RH;t-XI%Yd>3*)j)9!9Yk*QawUe+x1&1f+bcyO*|gRpZ9%;S8JfdMr3Cs}`6Y18QdQboFyt=akR{ E0J7>JUH||9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/apc.rsi/meta.json b/Resources/Textures/Buildings/apc.rsi/meta.json new file mode 100644 index 0000000000..9ecb0668ac --- /dev/null +++ b/Resources/Textures/Buildings/apc.rsi/meta.json @@ -0,0 +1,344 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/discordia-space/CEV-Eris/blob/d1e0161af146835f4fb79d21a6200caa9cc842d0/icons/obj/power.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "apc-b", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apc-spark", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "apc0", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apc1", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apc1-b-nocover", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apc1-nocover", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apc2", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apc2-b-nocover", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apc2-nocover", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apcemag", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 0.5, + 0.5 + ] + ] + }, + { + "name": "apcewires", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apcmaint", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco0-0", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco0-1", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco0-2", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco0-3", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco1-0", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco1-1", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco1-2", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco1-3", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco2-0", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco2-1", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco2-2", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco2-3", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apco3-0", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0, + 2.0 + ] + ] + }, + { + "name": "apco3-1", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.2 + ] + ] + }, + { + "name": "apco3-2", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0, + 1.0 + ] + ] + }, + { + "name": "apcox-0", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "apcox-1", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + } + ] +} diff --git a/Resources/Textures/Buildings/smes.rsi/meta.json b/Resources/Textures/Buildings/smes.rsi/meta.json new file mode 100644 index 0000000000..d196ff85b0 --- /dev/null +++ b/Resources/Textures/Buildings/smes.rsi/meta.json @@ -0,0 +1,170 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/discordia-space/CEV-Eris/blob/d1e0161af146835f4fb79d21a6200caa9cc842d0/icons/obj/power.dmi and modified.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "smes", + "select": [], + "flags": {}, + "directions": 1 + }, + { + "name": "smes-display", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "smes-crit", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "smes-oc0", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "smes-oc1", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 0.5, + 0.5 + ] + ] + }, + { + "name": "smes-oc2", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 0.5, + 0.5 + ] + ] + }, + { + "name": "smes-og1", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "smes-og2", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "smes-og3", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "smes-og4", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "smes-og5", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "smes-op0", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "smes-op1", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0, + 1.0 + ] + ] + }, + { + "name": "smes-op2", + "select": [], + "flags": {}, + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + } + ] +} diff --git a/Resources/Textures/Buildings/smes.rsi/smes-crit.png b/Resources/Textures/Buildings/smes.rsi/smes-crit.png new file mode 100644 index 0000000000000000000000000000000000000000..644ab351f1fda134d575a74c3571045dde165e54 GIT binary patch literal 721 zcmV;?0xtcDP)0tJNwg+f3#2@b{3;W8LX zHz|S;utVh>91X&O6iPsmkU^?*FJ8qrRV%r2Ux5TI6{i5kQ{jQNGX!UjKD*GX1{O_j{hF%pb~t zx%nmGfk%f2S~5Vl|H9c1_I8(p_oZ?hUq0Uh09?*mvfV;_|J8*BEEXEr+g(Pf+*amG zeGQPZV7*?apM&>7JUew0mSq`_AKfMZc=qD0(v6GsS1Kod$5C569mgheK|~;OL5^cn zYkPyfH!sq$3uh>M&InBWdb@n^cY`*3F{19fMBY2w$`7C!j#U?5}J`2L=W zX2%9Pe`AJW7=~dOhG7_nVVEdV-x~})5gOH=*1_ETQqUnTmD@pgSe0M+NX&1E`z#h3 zO5{-tx5HJo#({_p(EWqYqVooXHb7UZM{#s`5FW-*cumsg1B{RFf|!c8QZ^r8+vEa7 z0J#7;cG~6x1f7{2^v(x_<`Z<^u%1NvoQs`2ax;ihJ()m=8$2 zJDl`00009a7bBm001r{ z001r{0eGc9b^rhYv`IukRCwC$+dWFeKor37F^!FDw}N0T9>7WvJc5V^*vd1km969m zR@N4ldH})719*T1LCXkY74w#zB|^;CGnr)O|AT1O_;zOU@iH@;HKrF2^J&`T^$?A* z&K!fmHlwWS+U@4~-dvScK)c-o>U~^=eeAj9c5h40kjvBUw2SRg=Pe*j!2NYlW%$7_007$BkRNjUKR(!8|1n#i zOlFJEx^Ln#K3WBs!|M<8^!jb`Z&a7WNUU9N8!vTe8oz9S1i#Fuzbev1zTuj9sY9E1 zFFJGSSmW*V?ul|AxQ+(^0O5`YG$L(({6FH=4bb+->CcaSJfJ>>=+6TH003=2i=?W8+Qtv1{GxhvRetTS4#YiPmPJzvL>9LQFfcJN)VDL9KJZNq zC>Y}D;usQfI5|P$+k^cxZ~lMy-n*^-;lnJR#R&?*H#0aBx4v`pqkhem(48n|Axz7UrGnr5OyiO8@vP V>zh3D?jE2;44$rjF6*2UngGCqJiPz_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/smes.rsi/smes-oc2.png b/Resources/Textures/Buildings/smes.rsi/smes-oc2.png new file mode 100644 index 0000000000000000000000000000000000000000..2b39f4a827fae7d4b1f85291d1433e719fcb93ae GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!N$PAcy*Sa5Rk)J;1OBew19z$fuX*gF;6Fw z8z>m->EalYaqsPogS-t2JggVmxS1`toGxJwH|SeX^fkdo>cQTY7H#_rQ`|1>tX(@@ zWLJ5bPEf)lt!JDJAF}1IU0b|VFNu+%;oyFT^_y21{d(BHHtqJaEzCRDOEVa3mHzQp W);D?P-912y7(8A5T-G@yGywn)Bt2jN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/smes.rsi/smes-og1.png b/Resources/Textures/Buildings/smes.rsi/smes-og1.png new file mode 100644 index 0000000000000000000000000000000000000000..741ed221382a6a32895bc4dc207daa9684d7d896 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE#=yYHQtOojvL>4zaU|?cksBdR<-#Ggj zP|(HG#W5t}aB_kK>*53vp1=?D8y$H&{x`q4cmX8h(QJHRO%2XU#)78&qol`;+03b3h8~^|S literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/smes.rsi/smes-og2.png b/Resources/Textures/Buildings/smes.rsi/smes-og2.png new file mode 100644 index 0000000000000000000000000000000000000000..0db9f1a6efa93849272781f825b41b8553c8a971 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE#=yYHQtOojvL>AY5U|?cksBdTVJ~7J~ zD46c);usQfI5|Ng;zPaK;rg~fhsz3n$pOp{FHVqXD?H866Rp6y$lWc61TX?ur5vj3I{eY8wBlcW-zZ1JFJ`ZWkbMKYjH`D2^HI4$TNAIO?Ok0 bHQ-_}^ORKeIS`Quw35No)z4*}Q$iB}xs5kP literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/smes.rsi/smes-og3.png b/Resources/Textures/Buildings/smes.rsi/smes-og3.png new file mode 100644 index 0000000000000000000000000000000000000000..30ea3f0722405732cf8a06f99e210b9eddd15201 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE#=yYHQtOojvL>4zaU|?cksBdR<-#Ggj zP_V+&#W5t}aB_k~#D{vd!}V=}4wn`Dk^`6@UYsCN6ZlzP!t{URmHIO;5*1Ie9J}Zs z!@9V^YUf8D1NC_abP0l+XkKnmj}e literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/smes.rsi/smes-og4.png b/Resources/Textures/Buildings/smes.rsi/smes-og4.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea122e0f47c45a8a5d55e7f82c1794363435439 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE#=yYHQtOojvL>4z)U|?cksBdRHRC8iB zP;iE)i(^Q{;p7B~h!6E@hwG)J>R$w3u5WwDJ4?TNWuw761;69~=ESx@gBu6_|39$e zC;yUv$!`4IfocYQY>zY~ST8hvu;-XOU-~>l@gvDMUj++y7K*jTSumHe9R7dtgbeHA z1d$%5Tjo_0ZlBw_Yki*J;`Y{Ad>cf5E^9clbU*VP{aVFH{!rNi0pvL>4zaU|?cksBdR<-#Ggj zP;jHCi(^Q{;p7B~h!6E@hwG)J>R$w3u5WwDJ4?TNWuw761;69~=ESx@hp$(-d9MCX z=n&kcbL6EvgIf{LfeWTwZU+Te(;IF+rT!Tlys78% zYT+v8Ir_DVk^G^u2Lj9wbP7Z~T%{;klWo#3%*=2~U6<*}=2gK!$1`}k`njxgN@xNA D)a_s# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/smes.rsi/smes-op0.png b/Resources/Textures/Buildings/smes.rsi/smes-op0.png new file mode 100644 index 0000000000000000000000000000000000000000..7a6e915b535e57260aa6e1b980104f9f5947ebe1 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE#=yYHQtOojvL>4z)U|?cksBdRHRC8iB zP|(HG#W5t}@Y`#Od<+Ua&KK`xmOn7M6F+@JLZGnnLwjS>n_Gf5ivdh literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/smes.rsi/smes-op1.png b/Resources/Textures/Buildings/smes.rsi/smes-op1.png new file mode 100644 index 0000000000000000000000000000000000000000..b98f33d5c69b1be40fe3c5fcac4c141e3882d9dc GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!N$PAcy*Sa5Rk)J;1OBe^nrnifuX*g(VA=3 zS)gE%r;B4q#=W;U4stda2)JB4IIT%HqV-0@-X)tNE=wF`V|mQ>NxmgUy_$3LrTs7X%i%p8qb;qz*KZ;X!EY%d+WaTkC4}cJWP} r*M4E!zPH`&_g2`+PAfICDrMrksI>Xh89|`S7#KWV{an^LB{Ts5;g>}% literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/smes.rsi/smes-op2.png b/Resources/Textures/Buildings/smes.rsi/smes-op2.png new file mode 100644 index 0000000000000000000000000000000000000000..55ce2f53f5c097dd291b53201124c0653b1cfcd0 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE#=yYHQtOojvL>9LQFfcJN)VDL9KJZNq zDCpwp;usQf`0dq=oD2pWtQY;mCasy=dDiC`Pl9OESz7^bZOfOvtv(ELYiArZXT1AP t{25Ck3&R(c6*?z=)Y?qXK7CR`i(TV|P|)e_aABZ%44$rjF6*2UngHY?Egk>> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Buildings/smes.rsi/smes.png b/Resources/Textures/Buildings/smes.rsi/smes.png new file mode 100644 index 0000000000000000000000000000000000000000..0689af240117517b0f5cf9305338405ccc7b0af4 GIT binary patch literal 1281 zcmV+c1^)VpP)L0o4LK+yG!)JAClSGnfd4czy1Di=7>C|q*5unr>BRyy1MA`w<8ql?(UwL zpP#2tC`4-aS!%+x@$qp!eQj-xs!TBq!^T6T_yL7Z%#y-<*z%Gl(OK7ZXNlKGE|;_A zzM4oR?3I-jl6P-wYvb+q_BN><9UblRp&|afu&_XN zt-=FvipS$_AKR%SahL#b&qhea%dxRB-i=11%*)q% z4*TGN4lofPJut_utt~!5U@Z*bWV2bCoSgJ^fT%Fe*@S!qLA-Y3(reTiyF&VHos0p4 zLZ9gL_-%uhjMv%d5hsP|na}v-=bwAQT{ty0RpIDNxg9-5WXLIilF2tmeNiqJi`3s+ z=Gjg5Z-D3(>{a%F@rG<>Mz!18TWz_e|H^6->HX7(>{s=y?-)S*=*yj8CW^%y8ymdN zWE1aDdo`H|3RjeyWZ(uIsi3N#3E`{7LX@XcC=>!CsI^$6qJrz`bh=_dCK34Htre3= ziKtLD$U9Je@X}j+qBjz}gX5OpuK7Cm7FsRi~sujkBUDk zM}Q5^JS6@HJE=GVjxi1*!0=O6@F2l4U=c_~mugM95uCcbqi{v?GrUiidg%hgKqm5X zCPVRDj;>@;=ik&WCX{YGcAA8Y%g&?G8+88sgSx6tSFg5IX#v`X%DGXicQnX`v!r1? zsi!r9>4F;dOi&IV9z;HM`A?}bda7lV*Q5-&dCl~d~coscMY8A;c%Fe$s}JV^8kI! z@wPHz;`zIsBc$LWs%aX@SGgdAPGb{Xgz*jKPuIw&5P{+|LNGx@^&rrh)-H9nUt?Tw zGDIM?E?8cr1|m2M%=?e_0zg!Ab8~eaa2?cIDgAvf-D77Wo)HK?BQ49F2UO*EqK~Xi zbC*g_MQL2S>s-zNe=L5S->rm_i)U~9xp|YOnS=iJ0=u+*%+O#PY+8H+uVliG|6tPL zqeQ=x#)GkFkhFwG_i`85+DGK-05-ri90B<<>JP7X{46 zI;@8ubwBXCa%%Y_;5&CY