From 566ed6b770e0ea0aa830be50330f7d5891479527 Mon Sep 17 00:00:00 2001 From: ancientpower Date: Sat, 29 Aug 2020 06:05:44 -0500 Subject: [PATCH] Adds the antimatter engine (#1905) * adds antimatter engine * fixes some nullables * fixes ALL OF THE NULLABLES * adds explosions * adds fancy lighting * requested changes + license info Co-authored-by: ancientpower --- Content.Client/EntryPoint.cs | 2 + .../AME/AMEControllerBoundUserInterface.cs | 62 +++ .../Power/AME/AMEControllerVisualizer.cs | 57 +++ .../Components/Power/AME/AMEVisualizer.cs | 63 +++ .../Components/Power/AME/AMEWindow.cs | 162 ++++++++ Content.Client/IgnoredComponents.cs | 3 + .../NodeContainer/NodeGroups/AMENodeGroup.cs | 152 ++++++++ .../NodeGroups/NodeGroupFactory.cs | 1 + .../Power/AME/AMEControllerComponent.cs | 369 ++++++++++++++++++ .../Power/AME/AMEFuelContainerComponent.cs | 45 +++ .../Components/Power/AME/AMEPartComponent.cs | 51 +++ .../Power/AME/AMEShieldComponent.cs | 73 ++++ .../EntitySystems/AntimatterEngineSystem.cs | 32 ++ .../Power/AME/SharedAMEControllerComponent.cs | 69 ++++ .../Power/AME/SharedAMEShieldComponent.cs | 27 ++ .../Power/AME/ame_controller.yml | 44 +++ .../Constructible/Power/AME/ame_structure.yml | 46 +++ .../Entities/Objects/Power/antimatter_jar.yml | 16 + .../Objects/Power/antimatter_part.yml | 16 + .../Power/ame_controller.rsi/control.png | Bin 0 -> 610 bytes .../ame_controller.rsi/control_critical.png | Bin 0 -> 1217 bytes .../Power/ame_controller.rsi/control_fuck.png | Bin 0 -> 2218 bytes .../Power/ame_controller.rsi/control_on.png | Bin 0 -> 959 bytes .../Power/ame_controller.rsi/meta.json | 120 ++++++ .../Power/ame_shielding.rsi/core.png | Bin 0 -> 1836 bytes .../Power/ame_shielding.rsi/core_strong.png | Bin 0 -> 5472 bytes .../Power/ame_shielding.rsi/core_weak.png | Bin 0 -> 2579 bytes .../Power/ame_shielding.rsi/meta.json | 192 +++++++++ .../Power/ame_shielding.rsi/shield_0.png | Bin 0 -> 425 bytes .../Power/ame_shielding.rsi/shield_1.png | Bin 0 -> 569 bytes .../Power/ame_shielding.rsi/shield_10.png | Bin 0 -> 659 bytes .../Power/ame_shielding.rsi/shield_11.png | Bin 0 -> 779 bytes .../Power/ame_shielding.rsi/shield_12.png | Bin 0 -> 839 bytes .../Power/ame_shielding.rsi/shield_13.png | Bin 0 -> 816 bytes .../Power/ame_shielding.rsi/shield_14.png | Bin 0 -> 864 bytes .../Power/ame_shielding.rsi/shield_15.png | Bin 0 -> 425 bytes .../Power/ame_shielding.rsi/shield_2.png | Bin 0 -> 564 bytes .../Power/ame_shielding.rsi/shield_3.png | Bin 0 -> 831 bytes .../Power/ame_shielding.rsi/shield_4.png | Bin 0 -> 467 bytes .../Power/ame_shielding.rsi/shield_5.png | Bin 0 -> 636 bytes .../Power/ame_shielding.rsi/shield_6.png | Bin 0 -> 637 bytes .../Power/ame_shielding.rsi/shield_7.png | Bin 0 -> 753 bytes .../Power/ame_shielding.rsi/shield_8.png | Bin 0 -> 535 bytes .../Power/ame_shielding.rsi/shield_9.png | Bin 0 -> 646 bytes .../Power/ame_shielding_base.png | Bin 0 -> 425 bytes .../Objects/Power/AME/ame_jar.rsi/jar.png | Bin 0 -> 473 bytes .../Objects/Power/AME/ame_jar.rsi/meta.json | 20 + .../Objects/Power/AME/ame_part.rsi/box.png | Bin 0 -> 384 bytes .../Objects/Power/AME/ame_part.rsi/meta.json | 20 + 49 files changed, 1642 insertions(+) create mode 100644 Content.Client/GameObjects/Components/Power/AME/AMEControllerBoundUserInterface.cs create mode 100644 Content.Client/GameObjects/Components/Power/AME/AMEControllerVisualizer.cs create mode 100644 Content.Client/GameObjects/Components/Power/AME/AMEVisualizer.cs create mode 100644 Content.Client/GameObjects/Components/Power/AME/AMEWindow.cs create mode 100644 Content.Server/GameObjects/Components/NodeContainer/NodeGroups/AMENodeGroup.cs create mode 100644 Content.Server/GameObjects/Components/Power/AME/AMEControllerComponent.cs create mode 100644 Content.Server/GameObjects/Components/Power/AME/AMEFuelContainerComponent.cs create mode 100644 Content.Server/GameObjects/Components/Power/AME/AMEPartComponent.cs create mode 100644 Content.Server/GameObjects/Components/Power/AME/AMEShieldComponent.cs create mode 100644 Content.Server/GameObjects/EntitySystems/AntimatterEngineSystem.cs create mode 100644 Content.Shared/GameObjects/Components/Power/AME/SharedAMEControllerComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Power/AME/SharedAMEShieldComponent.cs create mode 100644 Resources/Prototypes/Entities/Constructible/Power/AME/ame_controller.yml create mode 100644 Resources/Prototypes/Entities/Constructible/Power/AME/ame_structure.yml create mode 100644 Resources/Prototypes/Entities/Objects/Power/antimatter_jar.yml create mode 100644 Resources/Prototypes/Entities/Objects/Power/antimatter_part.yml create mode 100644 Resources/Textures/Constructible/Power/ame_controller.rsi/control.png create mode 100644 Resources/Textures/Constructible/Power/ame_controller.rsi/control_critical.png create mode 100644 Resources/Textures/Constructible/Power/ame_controller.rsi/control_fuck.png create mode 100644 Resources/Textures/Constructible/Power/ame_controller.rsi/control_on.png create mode 100644 Resources/Textures/Constructible/Power/ame_controller.rsi/meta.json create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/core.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/core_strong.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/core_weak.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/meta.json create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_0.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_1.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_10.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_11.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_12.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_13.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_14.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_15.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_2.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_3.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_4.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_5.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_6.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_7.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_8.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_9.png create mode 100644 Resources/Textures/Constructible/Power/ame_shielding_base.png create mode 100644 Resources/Textures/Objects/Power/AME/ame_jar.rsi/jar.png create mode 100644 Resources/Textures/Objects/Power/AME/ame_jar.rsi/meta.json create mode 100644 Resources/Textures/Objects/Power/AME/ame_part.rsi/box.png create mode 100644 Resources/Textures/Objects/Power/AME/ame_part.rsi/meta.json diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs index a4edb0736c..006199f5e7 100644 --- a/Content.Client/EntryPoint.cs +++ b/Content.Client/EntryPoint.cs @@ -18,6 +18,7 @@ using Content.Shared.GameObjects.Components.Chemistry.ChemMaster; using Content.Shared.GameObjects.Components.Chemistry.ReagentDispenser; using Content.Shared.GameObjects.Components.Gravity; using Content.Shared.GameObjects.Components.Markers; +using Content.Shared.GameObjects.Components.Power.AME; using Content.Shared.GameObjects.Components.Research; using Content.Shared.GameObjects.Components.VendingMachines; using Content.Shared.Kitchen; @@ -72,6 +73,7 @@ namespace Content.Client factory.Register(); factory.Register(); factory.Register(); + factory.Register(); prototypes.RegisterIgnore("material"); prototypes.RegisterIgnore("reaction"); //Chemical reactions only needed by server. Reactions checks are server-side. diff --git a/Content.Client/GameObjects/Components/Power/AME/AMEControllerBoundUserInterface.cs b/Content.Client/GameObjects/Components/Power/AME/AMEControllerBoundUserInterface.cs new file mode 100644 index 0000000000..ff0bcff85e --- /dev/null +++ b/Content.Client/GameObjects/Components/Power/AME/AMEControllerBoundUserInterface.cs @@ -0,0 +1,62 @@ +using Robust.Client.GameObjects.Components.UserInterface; +using Robust.Shared.GameObjects.Components.UserInterface; +using static Content.Shared.GameObjects.Components.Power.AME.SharedAMEControllerComponent; + +namespace Content.Client.GameObjects.Components.Power.AME +{ + public class AMEControllerBoundUserInterface : BoundUserInterface + { + private AMEWindow _window; + + public AMEControllerBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) + { + + } + + protected override void Open() + { + base.Open(); + + _window = new AMEWindow(); + _window.OnClose += Close; + _window.OpenCentered(); + + _window.EjectButton.OnPressed += _ => ButtonPressed(UiButton.Eject); + _window.ToggleInjection.OnPressed += _ => ButtonPressed(UiButton.ToggleInjection); + _window.IncreaseFuelButton.OnPressed += _ => ButtonPressed(UiButton.IncreaseFuel); + _window.DecreaseFuelButton.OnPressed += _ => ButtonPressed(UiButton.DecreaseFuel); + _window.RefreshPartsButton.OnPressed += _ => ButtonPressed(UiButton.RefreshParts); + } + + + /// + /// Update the ui each time new state data is sent from the server. + /// + /// + /// Data of the that this ui represents. + /// Sent from the server. + /// + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + var castState = (AMEControllerBoundUserInterfaceState) state; + _window?.UpdateState(castState); //Update window state + } + + private void ButtonPressed(UiButton button, int dispenseIndex = -1) + { + SendMessage(new UiButtonPressedMessage(button)); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (disposing) + { + _window.Dispose(); + } + } + } +} diff --git a/Content.Client/GameObjects/Components/Power/AME/AMEControllerVisualizer.cs b/Content.Client/GameObjects/Components/Power/AME/AMEControllerVisualizer.cs new file mode 100644 index 0000000000..4345b68f5b --- /dev/null +++ b/Content.Client/GameObjects/Components/Power/AME/AMEControllerVisualizer.cs @@ -0,0 +1,57 @@ +using Robust.Client.GameObjects; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; +using System; +using System.Collections.Generic; +using System.Text; +using static Content.Shared.GameObjects.Components.Power.AME.SharedAMEControllerComponent; + +namespace Content.Client.GameObjects.Components.Power.AME +{ + public class AMEControllerVisualizer : AppearanceVisualizer + { + public override void InitializeEntity(IEntity entity) + { + base.InitializeEntity(entity); + var sprite = entity.GetComponent(); + + sprite.LayerMapSet(Layers.Display, sprite.AddLayerState("control_on")); + sprite.LayerSetVisible(Layers.Display, false); + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + var sprite = component.Owner.GetComponent(); + if (component.TryGetData(AMEControllerVisuals.DisplayState, out var state)) + { + switch (state) + { + case "on": + sprite.LayerSetState(Layers.Display, "control_on"); + sprite.LayerSetVisible(Layers.Display, true); + break; + case "critical": + sprite.LayerSetState(Layers.Display, "control_critical"); + sprite.LayerSetVisible(Layers.Display, true); + break; + case "fuck": + sprite.LayerSetState(Layers.Display, "control_fuck"); + sprite.LayerSetVisible(Layers.Display, true); + break; + case "off": + sprite.LayerSetVisible(Layers.Display, false); + break; + default: + sprite.LayerSetVisible(Layers.Display, false); + break; + } + } + } + + enum Layers + { + Display, + } + } +} diff --git a/Content.Client/GameObjects/Components/Power/AME/AMEVisualizer.cs b/Content.Client/GameObjects/Components/Power/AME/AMEVisualizer.cs new file mode 100644 index 0000000000..45104ed27a --- /dev/null +++ b/Content.Client/GameObjects/Components/Power/AME/AMEVisualizer.cs @@ -0,0 +1,63 @@ +using Robust.Client.GameObjects; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; +using System; +using System.Collections.Generic; +using System.Text; +using static Content.Shared.GameObjects.Components.Power.AME.SharedAMEShieldComponent; + +namespace Content.Client.GameObjects.Components.Power.AME +{ + public class AMEVisualizer : AppearanceVisualizer + { + public override void InitializeEntity(IEntity entity) + { + base.InitializeEntity(entity); + var sprite = entity.GetComponent(); + sprite.LayerMapSet(Layers.Core, sprite.AddLayerState("core")); + sprite.LayerSetVisible(Layers.Core, false); + sprite.LayerMapSet(Layers.CoreState, sprite.AddLayerState("core_weak")); + sprite.LayerSetVisible(Layers.CoreState, false); + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + var sprite = component.Owner.GetComponent(); + if (component.TryGetData(AMEShieldVisuals.Core, out var core)) + { + if (core == "isCore") + { + sprite.LayerSetState(Layers.Core, "core"); + sprite.LayerSetVisible(Layers.Core, true); + } + else + { + sprite.LayerSetVisible(Layers.Core, false); + } + } + + if (component.TryGetData(AMEShieldVisuals.CoreState, out var coreState)) + switch (coreState) + { + case "weak": + sprite.LayerSetState(Layers.CoreState, "core_weak"); + sprite.LayerSetVisible(Layers.CoreState, true); + break; + case "strong": + sprite.LayerSetState(Layers.CoreState, "core_strong"); + sprite.LayerSetVisible(Layers.CoreState, true); + break; + case "off": + sprite.LayerSetVisible(Layers.CoreState, false); + break; + } + } + } + + enum Layers + { + Core, + CoreState, + } +} diff --git a/Content.Client/GameObjects/Components/Power/AME/AMEWindow.cs b/Content.Client/GameObjects/Components/Power/AME/AMEWindow.cs new file mode 100644 index 0000000000..8a588035ab --- /dev/null +++ b/Content.Client/GameObjects/Components/Power/AME/AMEWindow.cs @@ -0,0 +1,162 @@ +using Content.Client.UserInterface.Stylesheets; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.GameObjects.Components.UserInterface; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using System; +using System.Collections.Generic; +using System.Text; +using static Content.Shared.GameObjects.Components.Power.AME.SharedAMEControllerComponent; + +namespace Content.Client.GameObjects.Components.Power.AME +{ + public class AMEWindow : SS14Window + { + public Label InjectionStatus { get; set; } + public Button EjectButton { get; set; } + public Button ToggleInjection { get; set; } + public Button IncreaseFuelButton { get; set; } + public Button DecreaseFuelButton { get; set; } + public Button RefreshPartsButton { get; set; } + public ProgressBar FuelMeter { get; set; } + public Label FuelAmount { get; set; } + public Label InjectionAmount { get; set; } + public Label CoreCount { get; set; } + + + public AMEWindow() + { + IoCManager.InjectDependencies(this); + + Title = "Antimatter Control Unit"; + Contents.AddChild(new VBoxContainer + { + Children = + { + new HBoxContainer + { + Children = + { + new Label {Text = Loc.GetString("Engine Status") + ": "}, + (InjectionStatus = new Label {Text = "Not Injecting"}) + } + }, + new HBoxContainer + { + Children = + { + (ToggleInjection = new Button {Text = "Toggle Injection", StyleClasses = {StyleBase.ButtonOpenBoth}, Disabled = true}), + } + }, + new HBoxContainer + { + Children = + { + new Label {Text = Loc.GetString("Fuel Status") + ": "}, + (FuelAmount = new Label {Text = "No fuel inserted"}) + } + }, + new HBoxContainer + { + Children = + { + (EjectButton = new Button {Text = "Eject", StyleClasses = {StyleBase.ButtonOpenBoth}, Disabled = true}), + } + }, + new HBoxContainer + { + Children = + { + new Label {Text = Loc.GetString("Injection amount") + ": "}, + (InjectionAmount = new Label {Text = "0"}) + } + }, + new HBoxContainer + { + Children = + { + (IncreaseFuelButton = new Button {Text = "Increase", StyleClasses = {StyleBase.ButtonOpenRight}}), + (DecreaseFuelButton = new Button {Text = "Decrease", StyleClasses = {StyleBase.ButtonOpenLeft}}), + } + }, + new HBoxContainer + { + Children = + { + (RefreshPartsButton = new Button {Text = "Refresh Parts", StyleClasses = {StyleBase.ButtonOpenBoth }, Disabled = true }), + new Label { Text = Loc.GetString("Core count") + ": "}, + (CoreCount = new Label { Text = "0"}), + } + } + } + }); + + } + + + /// + /// This searches recursively through all the children of "parent" + /// and sets the Disabled value of any buttons found to "val" + /// + /// The control which childrens get searched + /// The value to which disabled gets set + private void SetButtonDisabledRecursive(Control parent, bool val) + { + foreach (var child in parent.Children) + { + if (child is Button but) + { + but.Disabled = val; + continue; + } + + if (child.Children != null) + { + SetButtonDisabledRecursive(child, val); + } + } + } + + /// + /// Update the UI state when new state data is received from the server. + /// + /// State data sent by the server. + public void UpdateState(BoundUserInterfaceState state) + { + var castState = (AMEControllerBoundUserInterfaceState) state; + + // Disable all buttons if not powered + if (Contents.Children != null) + { + SetButtonDisabledRecursive(Contents, !castState.HasPower); + EjectButton.Disabled = false; + } + + if(!castState.HasFuelJar) + { + EjectButton.Disabled = true; + ToggleInjection.Disabled = true; + FuelAmount.Text = Loc.GetString("No fuel inserted"); + } + else + { + EjectButton.Disabled = false; + ToggleInjection.Disabled = false; + FuelAmount.Text = $"{castState.FuelAmount}"; + } + + if(!castState.IsMaster) + { + ToggleInjection.Disabled = true; + } + + RefreshPartsButton.Disabled = castState.Injecting; + + CoreCount.Text = $"{castState.CoreCount}"; + InjectionAmount.Text = $"{castState.InjectionAmount}"; + + } + } +} diff --git a/Content.Client/IgnoredComponents.cs b/Content.Client/IgnoredComponents.cs index 5d3cca4938..9aceb3988d 100644 --- a/Content.Client/IgnoredComponents.cs +++ b/Content.Client/IgnoredComponents.cs @@ -160,6 +160,9 @@ "Metabolism", "AiFactionTag", "PressureProtection", + "AMEPart", + "AMEFuelContainer", + "AMEShield", "DebugPump", "DebugVent", "DebugSiphon", diff --git a/Content.Server/GameObjects/Components/NodeContainer/NodeGroups/AMENodeGroup.cs b/Content.Server/GameObjects/Components/NodeContainer/NodeGroups/AMENodeGroup.cs new file mode 100644 index 0000000000..93fcaae955 --- /dev/null +++ b/Content.Server/GameObjects/Components/NodeContainer/NodeGroups/AMENodeGroup.cs @@ -0,0 +1,152 @@ +using Content.Server.Explosions; +using Content.Server.GameObjects.Components.NodeContainer.Nodes; +using Content.Server.GameObjects.Components.Power.AME; +using Robust.Shared.GameObjects.Components.Transform; +using Robust.Shared.ViewVariables; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Content.Server.GameObjects.Components.NodeContainer.NodeGroups +{ + /// + /// Node group class for handling the Antimatter Engine's console and parts. + /// + [NodeGroup(NodeGroupID.AMEngine)] + public class AMENodeGroup : BaseNodeGroup + { + /// + /// The AME controller which is currently in control of this node group. + /// This could be tracked a few different ways, but this is most convenient, + /// since any part connected to the node group can easily find the master. + /// + [ViewVariables] + private AMEControllerComponent _masterController; + + public AMEControllerComponent MasterController => _masterController; + + private List _cores = new List(); + + public int CoreCount => _cores.Count; + + protected override void OnAddNode(Node node) + { + base.OnAddNode(node); + if (_masterController == null) + { + node.Owner.TryGetComponent(out var controller); + _masterController = controller; + } + } + + protected override void OnRemoveNode(Node node) + { + base.OnRemoveNode(node); + RefreshAMENodes(_masterController); + if (_masterController != null && _masterController?.Owner == node.Owner) { _masterController = null; } + } + + public void RefreshAMENodes(AMEControllerComponent controller) + { + if(_masterController == null && controller != null) + { + _masterController = controller; + } + + if (_cores != null) { + foreach (AMEShieldComponent core in _cores) + { + core.UnsetCore(); + } + _cores.Clear(); + } + + //Check each shield node to see if it meets core criteria + foreach (Node node in Nodes) + { + if (!node.Owner.TryGetComponent(out var shield)) { continue; } + var nodeNeighbors = node.Owner + .GetComponent() + .GetCellsInSquareArea() + .Select(sgc => sgc.Owner) + .Where(entity => entity != node.Owner) + .Select(entity => entity.TryGetComponent(out var adjshield) ? adjshield : null) + .Where(adjshield => adjshield != null); + + if (nodeNeighbors.Count() >= 8) { _cores.Add(shield); } + } + + if (_cores == null) { return; } + + foreach (AMEShieldComponent core in _cores) + { + core.SetCore(); + } + } + + public void UpdateCoreVisuals(int injectionAmount, bool injecting) + { + + var injectionStrength = CoreCount > 0 ? injectionAmount / CoreCount : 0; + + foreach (AMEShieldComponent core in _cores) + { + core.UpdateCoreVisuals(injectionStrength, injecting); + } + } + + public int InjectFuel(int injectionAmount) + { + if(injectionAmount > 0 && CoreCount > 0) + { + var instability = 2 * (injectionAmount / CoreCount); + foreach(AMEShieldComponent core in _cores) + { + core.CoreIntegrity -= instability; + } + return CoreCount * injectionAmount * 15000; //2 core engine injecting 2 fuel per core = 60kW(?) + } + return 0; + } + + public int GetTotalStability() + { + if(CoreCount < 1) { return 100; } + var stability = 0; + + foreach(AMEShieldComponent core in _cores) + { + stability += core.CoreIntegrity; + } + + stability = stability / CoreCount; + + return stability; + } + + public void ExplodeCores() + { + if(_cores.Count < 1 || MasterController == null) { return; } + + var intensity = 0; + + /* + * todo: add an exact to the shielding and make this find the core closest to the controller + * so they chain explode, after helpers have been added to make it not cancer + */ + var epicenter = _cores.First(); + + foreach (AMEShieldComponent core in _cores) + { + intensity += MasterController.InjectionAmount; + } + + intensity = Math.Min(intensity, 8); + + ExplosionHelper.SpawnExplosion(epicenter.Owner.Transform.GridPosition, intensity / 2, intensity, intensity * 2, intensity * 3); + + } + + } +} diff --git a/Content.Server/GameObjects/Components/NodeContainer/NodeGroups/NodeGroupFactory.cs b/Content.Server/GameObjects/Components/NodeContainer/NodeGroups/NodeGroupFactory.cs index 2133f67134..557035524f 100644 --- a/Content.Server/GameObjects/Components/NodeContainer/NodeGroups/NodeGroupFactory.cs +++ b/Content.Server/GameObjects/Components/NodeContainer/NodeGroups/NodeGroupFactory.cs @@ -62,6 +62,7 @@ namespace Content.Server.GameObjects.Components.NodeContainer.NodeGroups HVPower, MVPower, Apc, + AMEngine, Pipe, } } diff --git a/Content.Server/GameObjects/Components/Power/AME/AMEControllerComponent.cs b/Content.Server/GameObjects/Components/Power/AME/AMEControllerComponent.cs new file mode 100644 index 0000000000..92ab6732fd --- /dev/null +++ b/Content.Server/GameObjects/Components/Power/AME/AMEControllerComponent.cs @@ -0,0 +1,369 @@ +#nullable enable +using Content.Server.GameObjects.Components.GUI; +using Content.Server.GameObjects.Components.Items.Storage; +using Content.Server.GameObjects.Components.NodeContainer; +using Content.Server.GameObjects.Components.NodeContainer.NodeGroups; +using Content.Server.GameObjects.Components.NodeContainer.Nodes; +using Content.Server.GameObjects.Components.Power.ApcNetComponents; +using Content.Server.GameObjects.Components.Power.PowerNetComponents; +using Content.Server.Interfaces; +using Content.Server.Interfaces.GameObjects.Components.Items; +using Content.Server.Utility; +using Content.Shared.GameObjects.Components.Power.AME; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.Interfaces.GameObjects.Components; +using Microsoft.EntityFrameworkCore.Internal; +using Robust.Server.GameObjects; +using Robust.Server.GameObjects.Components.Container; +using Robust.Server.GameObjects.Components.UserInterface; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.Audio; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components.Transform; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.GameObjects.Components; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.ViewVariables; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Content.Server.GameObjects.Components.Power.AME +{ + [RegisterComponent] + [ComponentReference(typeof(IActivate))] + [ComponentReference(typeof(IInteractUsing))] + public class AMEControllerComponent : SharedAMEControllerComponent, IActivate, IInteractUsing + { + [Dependency] private readonly IServerNotifyManager _notifyManager = default!; + + [ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(AMEControllerUiKey.Key); + [ViewVariables] private bool _injecting; + [ViewVariables] public int InjectionAmount; + + private AppearanceComponent? _appearance; + private PowerSupplierComponent? _powerSupplier; + + private bool Powered => !Owner.TryGetComponent(out PowerReceiverComponent? receiver) || receiver.Powered; + + [ViewVariables] + private int _stability = 100; + + private ContainerSlot _jarSlot = default!; + [ViewVariables] private bool HasJar => _jarSlot.ContainedEntity != null; + + public override void Initialize() + { + base.Initialize(); + + if (UserInterface != null) + { + UserInterface.OnReceiveMessage += OnUiReceiveMessage; + } + + Owner.TryGetComponent(out _appearance); + + if (Owner.TryGetComponent(out PowerReceiverComponent? receiver)) + { + receiver.OnPowerStateChanged += OnPowerChanged; + } + + Owner.TryGetComponent(out _powerSupplier); + + _injecting = false; + InjectionAmount = 2; + _jarSlot = ContainerManagerComponent.Ensure($"{Name}-fuelJarContainer", Owner); + } + + internal void OnUpdate(float frameTime) + { + if(!_injecting) + { + return; + } + + _jarSlot.ContainedEntity.TryGetComponent(out var fuelJar); + if(fuelJar != null && _powerSupplier != null && fuelJar.FuelAmount > InjectionAmount) + { + _powerSupplier.SupplyRate = GetAMENodeGroup().InjectFuel(InjectionAmount); + fuelJar.FuelAmount -= InjectionAmount; + InjectSound(); + UpdateUserInterface(); + } + + _stability = GetAMENodeGroup().GetTotalStability(); + + UpdateDisplay(_stability); + + if(_stability <= 0) { GetAMENodeGroup().ExplodeCores(); } + + } + + /// + /// Called when you click the owner entity with an empty hand. Opens the UI client-side if possible. + /// + /// Data relevant to the event such as the actor which triggered it. + void IActivate.Activate(ActivateEventArgs args) + { + if (!args.User.TryGetComponent(out IActorComponent? actor)) + { + return; + } + + if (!args.User.TryGetComponent(out IHandsComponent? hands)) + { + _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User, + Loc.GetString("You have no hands.")); + return; + } + + var activeHandEntity = hands.GetActiveHand?.Owner; + if (activeHandEntity == null) + { + UserInterface?.Open(actor.playerSession); + } + } + + private void OnPowerChanged(object? sender, PowerStateEventArgs e) + { + UpdateUserInterface(); + } + + private AMEControllerBoundUserInterfaceState GetUserInterfaceState() + { + var jar = _jarSlot.ContainedEntity; + if (jar == null) + { + return new AMEControllerBoundUserInterfaceState(Powered, IsMasterController(), false, HasJar, 0, InjectionAmount, GetCoreCount()); + } + + var jarcomponent = jar.GetComponent(); + return new AMEControllerBoundUserInterfaceState(Powered, IsMasterController(), _injecting, HasJar, jarcomponent.FuelAmount, InjectionAmount, GetCoreCount()); + } + + /// + /// Checks whether the player entity is able to use the controller. + /// + /// The player entity. + /// Returns true if the entity can use the controller, and false if it cannot. + private bool PlayerCanUseController(IEntity playerEntity, bool needsPower = true) + { + //Need player entity to check if they are still able to use the dispenser + if (playerEntity == null) + return false; + //Check if player can interact in their current state + if (!ActionBlockerSystem.CanInteract(playerEntity) || !ActionBlockerSystem.CanUse(playerEntity)) + return false; + //Check if device is powered + if (needsPower && !Powered) + return false; + + return true; + } + + private void UpdateUserInterface() + { + var state = GetUserInterfaceState(); + UserInterface?.SetState(state); + } + + /// + /// Handles ui messages from the client. For things such as button presses + /// which interact with the world and require server action. + /// + /// A user interface message from the client. + private void OnUiReceiveMessage(ServerBoundUserInterfaceMessage obj) + { + if (obj.Session.AttachedEntity == null) + { + return; + } + + var msg = (UiButtonPressedMessage) obj.Message; + var needsPower = msg.Button switch + { + UiButton.Eject => false, + _ => true, + }; + + if (!PlayerCanUseController(obj.Session.AttachedEntity, needsPower)) + return; + + switch (msg.Button) + { + case UiButton.Eject: + TryEject(obj.Session.AttachedEntity); + break; + case UiButton.ToggleInjection: + ToggleInjection(); + break; + case UiButton.IncreaseFuel: + InjectionAmount += 2; + break; + case UiButton.DecreaseFuel: + InjectionAmount = InjectionAmount > 0 ? InjectionAmount -= 2 : 0; + break; + case UiButton.RefreshParts: + RefreshParts(); + break; + } + + GetAMENodeGroup().UpdateCoreVisuals(InjectionAmount, _injecting); + + UpdateUserInterface(); + ClickSound(); + } + + private void TryEject(IEntity user) + { + if (!HasJar || _injecting) + return; + + var jar = _jarSlot.ContainedEntity; + _jarSlot.Remove(_jarSlot.ContainedEntity); + UpdateUserInterface(); + + if (!user.TryGetComponent(out var hands) || !jar.TryGetComponent(out var item)) + return; + if (hands.CanPutInHand(item)) + hands.PutInHand(item); + } + + private void ToggleInjection() + { + if (!_injecting) + { + _appearance?.SetData(AMEControllerVisuals.DisplayState, "on"); + } + else + { + _appearance?.SetData(AMEControllerVisuals.DisplayState, "off"); + if (_powerSupplier != null) + { + _powerSupplier.SupplyRate = 0; + } + } + _injecting = !_injecting; + UpdateUserInterface(); + } + + + private void UpdateDisplay(int stability) + { + if(_appearance == null) { return; } + + _appearance.TryGetData(AMEControllerVisuals.DisplayState, out var state); + + var newState = "on"; + if (stability < 50) { newState = "critical"; } + if (stability < 10) { newState = "fuck"; } + + if (state != newState) + { + _appearance?.SetData(AMEControllerVisuals.DisplayState, newState); + } + + } + + private void RefreshParts() + { + GetAMENodeGroup().RefreshAMENodes(this); + UpdateUserInterface(); + } + + private AMENodeGroup GetAMENodeGroup() + { + Owner.TryGetComponent(out NodeContainerComponent? nodeContainer); + + var engineNodeGroup = nodeContainer?.Nodes + .Select(node => node.NodeGroup) + .OfType() + .First(); + + return engineNodeGroup ?? default!; + } + + private bool IsMasterController() + { + if(GetAMENodeGroup().MasterController == this) + { + return true; + } + + return false; + } + + private int GetCoreCount() + { + var coreCount = 0; + + if(GetAMENodeGroup() != null) + { + coreCount = GetAMENodeGroup().CoreCount; + } + + return coreCount; + } + + + private void ClickSound() + { + + EntitySystem.Get().PlayFromEntity("/Audio/Machines/machine_switch.ogg", Owner, AudioParams.Default.WithVolume(-2f)); + + } + + private void InjectSound() + { + EntitySystem.Get().PlayFromEntity("/Audio/Effects/bang.ogg", Owner, AudioParams.Default.WithVolume(0f)); + } + + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs args) + { + if (!args.User.TryGetComponent(out IHandsComponent? hands)) + { + _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User, + Loc.GetString("You have no hands.")); + return true; + } + + if (hands.GetActiveHand == null) + { + _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User, + Loc.GetString("You have nothing on your hand.")); + return false; + } + + var activeHandEntity = hands.GetActiveHand.Owner; + if (activeHandEntity.TryGetComponent(out var fuelContainer)) + { + if (HasJar) + { + _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User, + Loc.GetString("The controller already has a jar loaded.")); + } + + else + { + _jarSlot.Insert(activeHandEntity); + _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User, + Loc.GetString("You insert the jar into the fuel slot.")); + UpdateUserInterface(); + } + } + else + { + _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User, + Loc.GetString("You can't put that in the controller...")); + } + + return true; + } + } + +} diff --git a/Content.Server/GameObjects/Components/Power/AME/AMEFuelContainerComponent.cs b/Content.Server/GameObjects/Components/Power/AME/AMEFuelContainerComponent.cs new file mode 100644 index 0000000000..af88584187 --- /dev/null +++ b/Content.Server/GameObjects/Components/Power/AME/AMEFuelContainerComponent.cs @@ -0,0 +1,45 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.ViewVariables; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Content.Server.GameObjects.Components.Power.AME +{ + [RegisterComponent] + public class AMEFuelContainerComponent : Component + { + public override string Name => "AMEFuelContainer"; + + private int _fuelAmount; + private int _maxFuelAmount; + + /// + /// The amount of fuel in the jar. + /// + [ViewVariables(VVAccess.ReadWrite)] + public int FuelAmount + { + get => _fuelAmount; + set => _fuelAmount = value; + } + + /// + /// The maximum fuel capacity of the jar. + /// + [ViewVariables(VVAccess.ReadWrite)] + public int MaxFuelAmount + { + get => _maxFuelAmount; + set => _maxFuelAmount = value; + } + + public override void Initialize() + { + base.Initialize(); + _maxFuelAmount = 1000; + _fuelAmount = 1000; + } + + } +} diff --git a/Content.Server/GameObjects/Components/Power/AME/AMEPartComponent.cs b/Content.Server/GameObjects/Components/Power/AME/AMEPartComponent.cs new file mode 100644 index 0000000000..45d951d203 --- /dev/null +++ b/Content.Server/GameObjects/Components/Power/AME/AMEPartComponent.cs @@ -0,0 +1,51 @@ +using Content.Server.GameObjects.Components.Interactable; +using Content.Server.Interfaces; +using Content.Server.Interfaces.GameObjects.Components.Items; +using Content.Shared.GameObjects.Components.Interactable; +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components.Transform; +using Robust.Shared.Interfaces.Map; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using System.Threading.Tasks; + +namespace Content.Server.GameObjects.Components.Power.AME +{ + [RegisterComponent] + [ComponentReference(typeof(IInteractUsing))] + public class AMEPartComponent : Component, IInteractUsing + { + [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly IServerEntityManager _serverEntityManager = default!; + [Dependency] private readonly IServerNotifyManager _notifyManager = default!; + public override string Name => "AMEPart"; + + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs args) + { + if (!args.User.TryGetComponent(out IHandsComponent hands)) + { + _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User, + Loc.GetString("You have no hands.")); + return true; + } + + var activeHandEntity = hands.GetActiveHand.Owner; + if (activeHandEntity.TryGetComponent(out var multitool) && multitool.Qualities == ToolQuality.Multitool) + { + + var mapGrid = _mapManager.GetGrid(args.ClickLocation.GridID); + var tile = mapGrid.GetTileRef(args.ClickLocation); + var snapPos = mapGrid.SnapGridCellFor(args.ClickLocation, SnapGridOffset.Center); + + var ent = _serverEntityManager.SpawnEntity("AMEShielding", mapGrid.GridTileToLocal(snapPos)); + ent.Transform.LocalRotation = Owner.Transform.LocalRotation; + + Owner.Delete(); + } + + return true; + } + } +} diff --git a/Content.Server/GameObjects/Components/Power/AME/AMEShieldComponent.cs b/Content.Server/GameObjects/Components/Power/AME/AMEShieldComponent.cs new file mode 100644 index 0000000000..7ae88049df --- /dev/null +++ b/Content.Server/GameObjects/Components/Power/AME/AMEShieldComponent.cs @@ -0,0 +1,73 @@ +#nullable enable +using Content.Shared.GameObjects.Components.Power.AME; +using Robust.Server.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.ViewVariables; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Content.Server.GameObjects.Components.Power.AME +{ + [RegisterComponent] + public class AMEShieldComponent : SharedAMEShieldComponent + { + + private bool _isCore = false; + + [ViewVariables] + public int CoreIntegrity = 100; + + private AppearanceComponent? _appearance; + private PointLightComponent? _pointLight; + + public override void Initialize() + { + base.Initialize(); + Owner.TryGetComponent(out _appearance); + Owner.TryGetComponent(out _pointLight); + } + + internal void OnUpdate(float frameTime) + { + throw new NotImplementedException(); + } + + public void SetCore() + { + if(_isCore) { return; } + _isCore = true; + _appearance?.SetData(AMEShieldVisuals.Core, "isCore"); + } + + public void UnsetCore() + { + _isCore = false; + _appearance?.SetData(AMEShieldVisuals.Core, "isNotCore"); + } + + public void UpdateCoreVisuals(int injectionStrength, bool injecting) + { + if (!injecting) + { + _appearance?.SetData(AMEShieldVisuals.CoreState, "off"); + if (_pointLight != null) { _pointLight.Enabled = false; } + return; + } + + if (_pointLight != null) + { + _pointLight.Radius = Math.Clamp(injectionStrength, 1, 12); + _pointLight.Enabled = true; + } + + if (injectionStrength > 2) + { + _appearance?.SetData(AMEShieldVisuals.CoreState, "strong"); + return; + } + + _appearance?.SetData(AMEShieldVisuals.CoreState, "weak"); + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/AntimatterEngineSystem.cs b/Content.Server/GameObjects/EntitySystems/AntimatterEngineSystem.cs new file mode 100644 index 0000000000..0b29c0f3e7 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/AntimatterEngineSystem.cs @@ -0,0 +1,32 @@ +using Content.Server.GameObjects.Components.Power.AME; +using JetBrains.Annotations; +using Robust.Shared.GameObjects.Systems; + +namespace Content.Server.GameObjects.EntitySystems +{ + [UsedImplicitly] + public class AntimatterEngineSystem : EntitySystem + { + private float _accumulatedFrameTime; + + public override void Initialize() + { + base.Initialize(); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + _accumulatedFrameTime += frameTime; + if (_accumulatedFrameTime >= 10) + { + foreach (var comp in ComponentManager.EntityQuery()) + { + comp.OnUpdate(frameTime); + } + _accumulatedFrameTime -= 10; + } + + } + } +} diff --git a/Content.Shared/GameObjects/Components/Power/AME/SharedAMEControllerComponent.cs b/Content.Shared/GameObjects/Components/Power/AME/SharedAMEControllerComponent.cs new file mode 100644 index 0000000000..e89789e363 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Power/AME/SharedAMEControllerComponent.cs @@ -0,0 +1,69 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components.UserInterface; +using Robust.Shared.Serialization; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Content.Shared.GameObjects.Components.Power.AME +{ + public class SharedAMEControllerComponent : Component + { + public override string Name => "AMEController"; + + [Serializable, NetSerializable] + public class AMEControllerBoundUserInterfaceState : BoundUserInterfaceState + { + public readonly bool HasPower; + public readonly bool IsMaster; + public readonly bool Injecting; + public readonly bool HasFuelJar; + public readonly int FuelAmount; + public readonly int InjectionAmount; + public readonly int CoreCount; + + public AMEControllerBoundUserInterfaceState(bool hasPower, bool isMaster, bool injecting, bool hasFuelJar, int fuelAmount, int injectionAmount, int coreCount) + { + HasPower = hasPower; + IsMaster = isMaster; + Injecting = injecting; + HasFuelJar = hasFuelJar; + FuelAmount = fuelAmount; + InjectionAmount = injectionAmount; + CoreCount = coreCount; + } + } + + [Serializable, NetSerializable] + public class UiButtonPressedMessage : BoundUserInterfaceMessage + { + public readonly UiButton Button; + + public UiButtonPressedMessage(UiButton button) + { + Button = button; + } + } + + [Serializable, NetSerializable] + public enum AMEControllerUiKey + { + Key + } + + public enum UiButton + { + Eject, + ToggleInjection, + IncreaseFuel, + DecreaseFuel, + RefreshParts + } + + [Serializable, NetSerializable] + public enum AMEControllerVisuals + { + DisplayState, + } + } +} diff --git a/Content.Shared/GameObjects/Components/Power/AME/SharedAMEShieldComponent.cs b/Content.Shared/GameObjects/Components/Power/AME/SharedAMEShieldComponent.cs new file mode 100644 index 0000000000..f9af4d12ac --- /dev/null +++ b/Content.Shared/GameObjects/Components/Power/AME/SharedAMEShieldComponent.cs @@ -0,0 +1,27 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Content.Shared.GameObjects.Components.Power.AME +{ + public class SharedAMEShieldComponent : Component + { + public override string Name => "AMEShield"; + + [Serializable, NetSerializable] + public enum AMEShieldVisuals + { + Core, + CoreState + } + + public enum AMECoreState + { + Off, + Weak, + Strong + } + } +} diff --git a/Resources/Prototypes/Entities/Constructible/Power/AME/ame_controller.yml b/Resources/Prototypes/Entities/Constructible/Power/AME/ame_controller.yml new file mode 100644 index 0000000000..53c4c42f14 --- /dev/null +++ b/Resources/Prototypes/Entities/Constructible/Power/AME/ame_controller.yml @@ -0,0 +1,44 @@ +- type: entity + id: AMEController + name: AME Controller + placement: + mode: SnapgridCenter + components: + - type: Clickable + - type: Icon + sprite: Constructible/Power/ame_controller.rsi + state: control + - type: Sprite + sprite: Constructible/Power/ame_controller.rsi + state: control + - type: Collidable + shapes: + - !type:PhysShapeAabb + layer: + - Opaque + - Impassable + - MobImpassable + - VaultImpassable + - SmallImpassable + - type: Destructible + maxHP: 500 + - type: SnapGrid + offset: Center + - type: Anchorable + - type: AMEController + - type: UserInterface + interfaces: + - key: enum.AMEControllerUiKey.Key + type: AMEControllerBoundUserInterface + - type: Appearance + visuals: + - type: AMEControllerVisualizer + - type: NodeContainer + nodes: + - !type:AdjacentNode + nodeGroupID: AMEngine + - !type:AdjacentNode + nodeGroupID: HVPower + - type: PowerReceiver + - type: PowerSupplier + supplyRate: 0 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Constructible/Power/AME/ame_structure.yml b/Resources/Prototypes/Entities/Constructible/Power/AME/ame_structure.yml new file mode 100644 index 0000000000..93c9b23a5f --- /dev/null +++ b/Resources/Prototypes/Entities/Constructible/Power/AME/ame_structure.yml @@ -0,0 +1,46 @@ +- type: entity + id: AMEShielding + name: AME shielding + description: Keeps the antimatter in and the matter out. + placement: + mode: SnapgridCenter + components: + - type: Clickable + - type: Sprite + drawdepth: Walls + sprite: Constructible/Power/ame_shielding.rsi + state: shield_0 + - type: Icon + texture: Constructible/Power/ame_shielding_base.png + - type: Collidable + shapes: + - !type:PhysShapeAabb + layer: + - Opaque + - Impassable + - MobImpassable + - VaultImpassable + - SmallImpassable + - type: Destructible + maxHP: 500 + spawnondestroy: AMEPart + - type: SnapGrid + offset: Center + - type: Airtight + - type: IconSmooth + mode: CardinalFlags + base: shield_ + key: ame_shield + - type: AMEShield + - type: NodeContainer + nodes: + - !type:AdjacentNode + nodeGroupID: AMEngine + - type: PointLight + enabled: false + radius: 5 + energy: 0.5 + color: "#00AAFF" + - type: Appearance + visuals: + - type: AMEVisualizer \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Power/antimatter_jar.yml b/Resources/Prototypes/Entities/Objects/Power/antimatter_jar.yml new file mode 100644 index 0000000000..37c7d7f639 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Power/antimatter_jar.yml @@ -0,0 +1,16 @@ +- type: entity + id: AMEJar + name: Antimatter Fuel Jar + parent: BaseItem + description: A hermetically sealed jar containing antimatter for use in an antimatter reactor. + components: + - type: Item + size: 5 + sprite: Objects/Power/AME/ame_jar.rsi + - type: Sprite + sprite: Objects/Power/AME/ame_jar.rsi + state: jar + - type: Icon + sprite: Objects/Power/AME/ame_jar.rsi + state: jar + - type: AMEFuelContainer \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Power/antimatter_part.yml b/Resources/Prototypes/Entities/Objects/Power/antimatter_part.yml new file mode 100644 index 0000000000..2c17c51179 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Power/antimatter_part.yml @@ -0,0 +1,16 @@ +- type: entity + id: AMEPart + name: Antimatter Engine Part + parent: BaseItem + description: "A flatpack used for constructing an antimatter engine reactor.\nUse a multitool to unpack it." + components: + - type: Item + size: 5 + sprite: Objects/Power/AME/ame_part.rsi + - type: Sprite + sprite: Objects/Power/AME/ame_part.rsi + state: box + - type: Icon + sprite: Objects/Power/AME/ame_part.rsi + state: box + - type: AMEPart \ No newline at end of file diff --git a/Resources/Textures/Constructible/Power/ame_controller.rsi/control.png b/Resources/Textures/Constructible/Power/ame_controller.rsi/control.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2255983da67bc5629c11dceac91df899cddf0f GIT binary patch literal 610 zcmV-o0-gPdP)BjE7=3CqWbhypJQTXs8Uh`Qap@*H7_tQ9&0PfgEfMJ!$duo3f-C_+;K+Dr4hVc? zbLk+0OY0#^QHNTprMr_(NGg3`tdrmSzNb%j-<=IeVB2;kyDtOh+|cF9Ac$?-&X&ui zb^t<1CljVDIb#fq#iCXiMG@xnd7;xyST$P=4xjwp>04Y~-zbB)u8TLXPw<#Lfe?b( zY^Iewj$^@uStVJPg{$kEf~+)gepVWfMx$E(ZnpyfOs7)-$Z`{}s>Co18QI zum72WHi>ie{tBv-un9s1s>@3S_xudsf4&IGtCO&`f$07LuIn}m4?AHO2nKv_h0V9; zMxpPm@R&T6?sb}koO6Q^k`XPL8f_v~4@n?eASty9}H9dmk9Q6aM!GYF|OV zg${|*>7>ocrVI8vA<{JcTY)xbK|=m4);4Fysy;U%%mKz2EX$I97-K@PDnGag5PS*{ zoCI3>R-I7R{i^)SFPF+Em+1uqo6T2*w|CfXw-}GdrElN+ECj9N>*&R0cyz1`f}>;c zv1<4_dTAd}1yMmKxk@kX13KGr7yco{3jBJJ(0YO-wqPK-e;6#kEOudFe;$DEtp+pT wd#j=erD+Pzxgq^`JeY$$Ow&Y?BnANd2KL<^9s1S~(f|Me07*qoM6N<$g1ZnDTL1t6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_controller.rsi/control_critical.png b/Resources/Textures/Constructible/Power/ame_controller.rsi/control_critical.png new file mode 100644 index 0000000000000000000000000000000000000000..24de7e92b32e5b1ee62a7cd57206ec82b3949f5d GIT binary patch literal 1217 zcmeAS@N?(olHy`uVBq!ia0vp^3xK$RgAGXbBqvD&DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMpqemG7srr_xVLxqcU^N3Y5UmwNPe3ji}Xjf zHCw;&-Z>=pXvyDxs-Ztnc{%BT z2D8Q#Mv+qt#0jrh#L&0D)Bm5_zZ-&$uX=#t5WZ2_`72+=5vDb@7q4-Dw7(K>bv}IM zzbuAq=JJn^0_BruEL-vO(Dd_iUkuwayJr2em%INO7$_!7Uw`;~@U9)uv%zzke^iS; z&o*pWyMBw%R&fWjU3CktFHHS=li{4`9K9o#80YT)bpsegv(M_*ob253`&+Si@{GJ~ zTmP-)kKYXn>aC?Sia&o&1&Y4gw6rd_{={VK2U!c5r|498m;7~D@BI4LRei;vWnbP! zJZ3Jqmb>8E52gvF(rZljF{IkCKu|8J#R{VvwveHXXnojjEOMSaeywev5||L75Ftx)^);@881 z)*pm+)optfyC>Huw# zR1iT{8Nm>jq>9LzfS}@rsS*e~3TlLqM3$F8!b|31TiZD^wWojl-u>P4``vra``&v$ z=lAVDzw|O%zHT`H07eAwU3+2s0$!~sB>c7bnk0q|B5|*mJHUO49)}%+n4P{m0pJE} z#X{r~*k6|5eIOA4R<|I*zbotKe;~@=zhG$L=Wlg(-^=J zpL~=QKW#Ml%A@L`v-jBM=-A?|Uk8lm5)Cs<_D>plHb{oe*569IU{-ozqd=|0ANv!DDq@c3g}n7HJjsp1QqDd9^=kqGp?=7?rV*c+lD zvV}Rkxs2^DH+(T8P_(gBw5E3?FQ-%HF(-T=Rd4~{DDrvtbJ}i-m_;>jtGs$nT_@zG z!MoyandQO^6ufxBHx?RD2quZBy!gG+7U&Iun}Q7R7kAv`E3C@E8X@!QB&BXa zd*{5me0VU~>GZ=lmd$BheI^@gK27)P*;n)7E%_pyN@|}2;xv$=QXTS*p8LXQ zPMEu9CMJJlGEEQ$r%@Qpt`9P10ebERAC4aB^`3-$+dDku6>gxgGTk3wU=3SJ)6ZRm z-6}Uf55Rp;|Mvm^ldA@i%^ST4_=o93)a$sAIxlOHo=qvt01Bk6-5LTZX)Y5#un2;zpJ`oty zuJ?GDo!Xa3cbR^JY|Fc;ZHT9+sQ9=q&h{7n8yWYgBK8USh&iGDQguN%A4=5Bq&}AU z6)MdoQst=kUv$<-&lG_RHz1} z!ZTwuQ6-mjzK4pY?swHce=F){a7~A}h7{T90JpncXK*~@_Vy}}ukOn4QN0z`&CdJG zM7ye2$8$&w8#?+Q`-^xsl=(dSoifx9Tl7EgT@_P5ie=$#l_8Agp)s?HHPMi%bO^Hi zsVG+zzvpHW=7CHYbeNO=y*9}Qj8jPtx#)Mx{py2Sjxz37ftIf~Gfn`+JBO_1*B^S< z<277?6$i&t66Knq<3K*tH#rj}>t*w*_+s8kB+$WiA$7N$)XpsB+2nVl-~I zh1Hxnb3OU>vS#(_oT?txgmByC5bZgcWp}T3JD8}_-2)Cj&)g)qcQ(fRz(@|QeT@|> z>-uDawoK`wa*XKICfR~L71;)xS!m*P5@O* zk`r?I3-1YhBCmw&`fLas8-{5}AV32#i`YGpm#YqgRu$aVJg2?htUCf^E;&4XsGkZ| zE6=8PmPzaS4p83Hq7^IpugK{fVqqPXw9~o;i+pVv^8_0dgZ46F^S)qOr8yI zcPRW*RHU7Zb(H7H;(6KE&d$e$#<{9zi15T$Q_)O=8bpBQ_?Vg3;#L17WXNIPowuEk zw&N?-rp`(R_Kq~+te={Pw*l^Xh~s@$#LoI;sZZ2NdWo}2f>3b%!dp{n2~Vr!Lblv5 zi?yQQBGcqA4rnDvcKS}wo3V{ZFEK9508ZC0{T(CYH4h2IwdVfUB2 Jxb6|({09Kk1{VMT literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_controller.rsi/control_on.png b/Resources/Textures/Constructible/Power/ame_controller.rsi/control_on.png new file mode 100644 index 0000000000000000000000000000000000000000..3bfda8869c218d46f8a451736b592998bc153b4c GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0vp^3xK$RgAGXbBqvD&DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anM1_tI3PZ!6KinzCT0==FD2(Vswck{p8o%Y$M zBN7x^o~SO2zjyVUj6~bF=UG=xZ=DG^pE*lz!l(DY^E(0@7Ku#IU{&#A?0gk>;Q3?A ztMlJaKYa3k?9b&~KmPofF>n6-jryxX>T2cg>$gkK+&|qoi+}B$d&L$y4?YQ73ftH& zTmP%RR(Mas+|4z$TN=tw=)az`x%$P__^9F=#isR}8;UQ4J-EnJHM4lzr*k}yLSO#5 zbnCFjTFWmRezWAT_Qg4PS?#~G^@sMmInLkfyJpujzWti~K@1}4{ z80x+tgi}dm?h@bNXMETcxzuas7-7xp${%QCB#u~&tv{MM2*WjY5 z5Xj{*g-K{BdCaSO8%k#-+MS=E@Spb`^SY}WXFVxgP*S(@&zHglfyELt>mv@NKA6dR zC2-cf_Clebujf2{y_ogOuV2?K)1QC1{mGo$f<1>-R(C;rNgXIcqPSnIG;J4jd-C3n zF}hpMa6(C)r*2*574tjuc7MLh{>JCu)<5swH$CL~&e-{h1(Zfe40u@50&83Gj&;pt zp3jwSEI)7lS#8E0;a>Tz@6wgy?y~B)PXFZoxwPn=9p98|z*u0fP5Xcx3!nIYrp_!* z<=^|s-SUs14gaHz59PDi?@9fc>-IeV>7N$cJD|{Cc~pNX`+s4v|H9uc%mxPi->-jG o@7mAZrhSK9h4e)9;^PngFZ053Tf@RwfSHcL)78&qol`;+0RI)Iv;Y7A literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_controller.rsi/meta.json b/Resources/Textures/Constructible/Power/ame_controller.rsi/meta.json new file mode 100644 index 0000000000..6bf6b7f12e --- /dev/null +++ b/Resources/Textures/Constructible/Power/ame_controller.rsi/meta.json @@ -0,0 +1,120 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/blob/Bleeding-Edge/icons/obj/machines/new_ame.dmi at 1b7952787c06c21ef1623e494dcfe7cb1f46e041", + "states": [ + { + "name": "control", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "control_critical", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "control_fuck", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "control_on", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/core.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/core.png new file mode 100644 index 0000000000000000000000000000000000000000..36c0349b822af0fa2e9aa742d4c05e1f137eef99 GIT binary patch literal 1836 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 W`TegC?Z=Vg|YRr zy)2KcX&z>xEW@Z62H(7MzQ4Zn&biCE%OCgr?mhS3R3`^30X_*n001ChV~uuZYb=`) zJlt$a(+`ER6)?=%${f%zD*26Vfc%m6NC2Rj2w{11v2ETE>nmXZ0JQ%f1`gb*@n!pJ zY|u!TNYBk{V?+fjQNm(y$L6odo10SpVuCkXRnDR~Ux_yy4 zoO$h-6Y9Zp=5|OT${|5lFI@wg9Uz*dqtfEtwGl~Z7?6(I*!p@{+fjtH)%EKz{%Cy^ zc&j$%_paK#t_Qz=A_VV~wPAlHz`nwq%`FkbgFMzS7*JI~LDtU~RF#ntn}2>1UhxAv zfL4X1T;v^g+@?q^cCGFx2D(U_I5Bea@l@Mm=3<9e8jEXq?+5{}pdONqJ1<0^RLl3w z@m?ZhOR|C=(Mshk3Z6SxeXu8VQXxB)3p4}ZZbyo+H~lI{<;kR!DFYym&UZ| zp70LSG1K;K)|UxilhEpbM5sA!!CDmM3oH6Qc)|NY=VEAdHzW>hw6(-X9kAn|DYQ&b z_!xeJHII{Qxm0RvoP zLYq|O>|mxn0Re{wjYstBR%K#{&bqftdipJfH!p3~ZXT%BSne=n_ zc~cDs^?Oa>3G&Uu;L5^Rc*>pFwO^-P&Ei?1aOL!ic0&;pI{I~)hrbPVhk|Ao7L-`g zH1(vu@5-d5ei`i?5+H)HNSpB7B{m*MeSbo zz9JB9u;GT=-sX56-4!tMD0rk!2e6E!m*Dk{inbyp=SeRWOh4G%@pNkk%s>Qw&vw=9 zkHtIQriMBjYEt8}I#yCm!jw-X@AOpiG-iwtbM`(TdYSOuwFK06d+20bvM$OE99H)O z6DT z+Wsie{+R9-#4xzqRybw{^wrV4D)y3%Mh6Z>?r2q%S(+>L7P(?rb3=; zZ78UTHKQ)dl3?!PV%DDr4A) z*=Pzw;gRrnz^9D1o z9s0Z_(e+GYA%GrZR9$L$Z(SR-{I58ymA%5eov6H(B#U<=% zsBs$LHg~2H^m%UMky_vUyl(RlpO;1PNLJvdx4O$s__rIa$>bT+ur5xu@{YgTy|}O< z#ZIl6gd3=v8YrP~Ho!R^O!rHy{Du@i)&lhrVk=czHJ;vhNny7`Mc#`aC+t zc+D%@XX);K-^e{Ke_}_z9_S)ixeqt=iw8SdRkh&ol-CY{_u`ZCG+F8 zyv&)s&UwXGj$J_LhYu0MT*7&eHm~myI$ihfJCWq_$AkbNhELnUSpPYB9o`!5Ll)1!U21dXK|t?c?E zODW2iEfC(2v{h~7gkwDNy+lmD>kiY1kC1D(R`fz~dAAyQnxY)gQNe0+hR5VLJRPVT zq!%Y|EJwQWuRurLaNWcHedQWHT*gGtxw8HIO6s-e&FQ7zpbH@LTI&dCa-S|vo)6Da~oSp(VffljfXl=uc0Ie~!8*l|WMPu)`f(oC@PpVqHyB2U%IscCQ)WrYwl zmv_Unse8OvFC)cLq)@GAv$>YaBCWFmQ+;*{A0($D?Pk>AUf>P0?+(<%M0G0!E(%PT zaogFcVO2tq5SN2zp+1uF;;{RzR-zK^S(5|p277xzn}JoYq^fSmaTu`l?#PB()ERmBiCP62%}$exHC69B2@WkjFJeNRd*iAycn=G_oFRDb zXDfl@q|qKv=01G{U$W&edPcu749%uH!OiO^5~Qzt&dQbz6ZH!W8Hi&<49^R z=)&w>Od=<*>95GpM977FMzNHmu*PaK*y#Q1LDNcmG-U4e!?Bsz-14bC-bb@MeH|5M~V80!OE{p!}cDN%OE>fC?$&E6&L zJi9c0qIA5uv?jj3eR8;umr`U#$B**JwjcQZ8I^K=`_>C^h7L6$^Pw}o0)P8`y#Hz& z*$#U>_5Es)`HdVz(xTUEptB84wE2 zy{UaHi|DxT=W%+6IVqb;7k(};+jsI|Ks}_bn~g?`>?mFMro1c)FPjH*M*rKuy2vqP Y^fMl@EC9%I_9F+dv2Z{)m}BGr3oHoR4*&oF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/meta.json b/Resources/Textures/Constructible/Power/ame_shielding.rsi/meta.json new file mode 100644 index 0000000000..1ce0d8402b --- /dev/null +++ b/Resources/Textures/Constructible/Power/ame_shielding.rsi/meta.json @@ -0,0 +1,192 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/blob/Bleeding-Edge/icons/obj/machines/new_ame.dmi at 1b7952787c06c21ef1623e494dcfe7cb1f46e041", + "states": [ + { + "name": "shield_0", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_1", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_10", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_11", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_12", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_13", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_14", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_15", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_2", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_3", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_4", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_5", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_6", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_7", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_8", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "core", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "shield_9", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "core_weak", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "core_strong", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_0.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_0.png new file mode 100644 index 0000000000000000000000000000000000000000..cd62067877c2ee374f373ca3c45efd999989fb10 GIT binary patch literal 425 zcmV;a0apHrP)~Jx8!k6UYIkOBKjvyh9*WIu8&?liCXegmf+`7GYQ|Tx3a# zpzG*FXTq><;RC_XKkxm(&u``;2!d~nsLL_KCxEj6xccjc5W;E@rBolF3J=53N;u~n zLI@>97vNCT;lA%%0SLnoobzAr*}NZMy}pL{_yhnDLaYEZy_2t0y4GpJr{@=|p+nvs zfV2UOquWB~1M zKPiB%1*%fF2M&c)Hb*fbMC$<5qqyy@1bBUWm+IyyHj!!+x4o4Bj}Q08VY*UzcX}X6 zHubsg;-jl1*$i(;s@0HlZgop`^p>Uk3n--!LL6VTAfrub-wU=i`Y4_NMhEx-;AU_I ThOmbQ00000NkvXXu0mjfYzekS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_1.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4fa79f44d4b76d483e4d400ec2de74f0b7ecb13e GIT binary patch literal 569 zcmV-90>=G`P)P(k)(t2@KH` za$&rMV?~zdM^fzUfhi>2pToU#bZ1(V$z)3dNGX|4rvQXuNUzsx5{560yiSOVx(-rG z>-)Nus7(OKOJ9Bt!?1QNdkZ!h-esRCieQuF$%GKvl@r@!L{Wry+0Xq<&{m*WX8H6? z5Cq6H1KxwR+wB9N^?H5a8w3HrpPt{o?)-G^F}9#w<|5KGB~8;>ex~+V_rQ2OrrYi2 z&q^ucIA$~&Y3*mTnbF6D%A4><|2s-406LwH({}apS}AU20{0J(3 z67YRLufTjhciL7(qyK;qLaPGP#ymLzn+iUKfK3ITLcpbhvlDQs;OqokDmXiV^Qyox zz2E~X*kthao1K8?T_N)+rbkm1c-|F%{=OW%J30^i{B>sy0y`DxmJ7PrM-{lexqh4d zW;9j7?aj5Dz^+Gj0*zHr>c5_V0mX6bQbC<@T=`gj|L}N}u()itHdK~jaU3re3$2Y1 zBDdAzBQo442UsqbEdzn=-nMuwE5@!ZL#0%nJdR_MB+(`ZNRp(rKmQf|OtHZs!}4L$ zmb_%6y>Dt|Xu4`uO<2WmI2>+)qq_w_Yya_7$xSfj`S17#w4D=zfyv!A00000NkvXX Hu0mjfi8ux; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_10.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_10.png new file mode 100644 index 0000000000000000000000000000000000000000..8c6ab600e7f887241e55fabf3d6c9c54d744707f GIT binary patch literal 659 zcmV;E0&M+>P)04N!T z!8O>neKQY;lB%l7nb82j^#A}M%FZlGKU690;2a)7*L46uqtPfjJ^&;#%K(^ryXc*s z$NwvpN@0=1Fl6SI(-Xdb$v9C;K`EU&aKGOd+86+=C`@qsYzX^oC=HPYZfA{(31+TX&L~)^E?nj@Pq!G5#ZX6uJ;~K3|_C-@%H0y0KopH7DLDbj0UXNNFNUZ z8QfgTEW=ppniK#b1l?{I`hKmJoKc6fX;PtDW{|Zn70L!wtM%Q)Wy2-g#t5qz3 zWmyoNig>bZTL>X)R#IEBT2+`%n9!Y*k|?;XhS)y%f=|!i02jwm6T3Kuu|b6p@jKug z9*Khk*>E!`&VaeM3;#;4-#;Mtaq#{F8e7kRx3+6!=#Z?RHzjc3aNb85j+)_K?7F9R5+Q0L2*yf`ID~ toSsA1^~_CZCIHhkg}s0$(=-bO_zQw$-y5|Y!R`P6002ovPDHLkV1m3WCiVaT literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_11.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_11.png new file mode 100644 index 0000000000000000000000000000000000000000..155f3ca3ecbdf2a937f34491580ee2ccfe16d272 GIT binary patch literal 779 zcmV+m1N8ifP)8CzI*T9yHkV^(Z#~JzEQmHgR zK-i>EcuD2U9>ovuA(eixh+3_NxBL-)eJ5M}3V;v-+qUI9arptbuB%7^{zY?W_#O(c z@Q!TtE4r>@S(fCluCDMrPdb+Z9umS~$bS1QqtFjUQ3iYgiVz~I)oKHc{UN=N2gv1e ziRbzGc{%odAJ6lEZVD73L^Nzx4@Id|!nSQvsT2TFbp87{0$~^eP^naKU02cKk0ym| zHcKj%Len%8kn1#BM1UEH#enWXJ-dp*GJ~Jx3>XMRTWLsn4O*F z;NT!3Zhd{7^Ye2lN(#tiGH9B{%E}6sWnr2orfFgr#=U$dlfg92gd?VSn$F-e z48vf0dK%L-@qHh|Fz)52rl!z!UH(u}ltj&+_BrggYXFT#gCGbvK0cO)#l=P1?e@t0 z^767AcRC$bS6A68mlMw8MVJsIgoqxq4BPECVHmQzyW8yplWN7#ZA7u-yBbl9|ECql zljs$1XW{?= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_12.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_12.png new file mode 100644 index 0000000000000000000000000000000000000000..87a87841877e7cb978cfb1dbf08beea2483949ac GIT binary patch literal 839 zcmV-N1GxN&P)kg|9_qCy?0u0UH86TuQM;ADB|eo z2!Lv}N-me1o5S-wQgcWBX8boW-N0x_Vf7WAP6tNA*;z+JI-L%M)mMpeQ4|4S=@-Ta z&o3yIN<{r3kZdB(Q7V=Ac7E}2l^nO=y6%1A=pTS3Pp+@82{*Rk@{D}<1OV4{pOs!Z zq9`H=0sz9oCcJq^{`3IHaV8Du2n(C!yC>MTO*Wea!1w*Rgp0)@0E5Bcm$(5F2J)u| zY8G_(zK<+c>2!Lk@Mtsw#zjV&P=Ub-C9i<(M`<4Z8e)sgb?iP?5KhL{rw3N2`MgxC3GXwghVQpQe1J3 zX0wU4yu6HMSyZc4HJHg{SX^AhvW!Urz}wjM_k`zkE~7>^n?(qr(gh%w%Nb|D^!7UT z+HH1gHMX|4j9ey-zu$~{y&h2%k;!D#5k(R5zK%+zq86M9at-Lvxl9_??d>f>2(`Nb zSYKb~?(Qxzhavf!$1xZT6qiY3;i)Z|=Xo?5jk(eg#zm~vYCV~TGj+p8qX95eA(G+% ztyb$P>Tw~`OR?S&UDqWHLsiv;5ZJb@gyd@1^Iorl0Qr2LAP6Qpp@ic&<1BDuQNoV7TN?by@_fe90{;!!6AxI81=*q)dLW2uuH5+MY=UJrn^ zwY9kn$T+zk^4$~Tp5SF{$@CgM5A;8y=f+z=^1g30q)>Q`_xX_Whxd?PQbX}7Il(a+ z()se0`lpX{yFVu4;z(|H0O=*VS2vW)<*ARE;>zVR-K(3a;_%}CjQ#}!KLK3}uBq7* R{2BlN002ovPDHLkV1lAijGO=f literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_13.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_13.png new file mode 100644 index 0000000000000000000000000000000000000000..fe6f214f1712b1fb33ac023d62e83adffa176bd1 GIT binary patch literal 816 zcmV-01JC@4P)|5yUClsJT%#%^uxXY7B^^XT<@c%Bz( zzX!t?Ev>VDa>~}$R^gtNa!^2pNQmOPY0;S)3xG&w+353%gf8D7-^D9V7zzn1WeP6ZO3DLlt6+UA0K0yCi#3G0M~Wd+}z~p>FM2AsZJP_ zR&igpGnovAVUWpWLhU%+d9wHl++EA2=Xq$FCOtnA1p(bpBVgTMfNcZwqadjJX#{3v z(J1&b0t-jMR}lCg1^<2&xUM_bFq_TFW!H5*Q7?$)`^;Pd0F6c?m4IoQa@m9XpM>E! zPOMIpz+ig$G@H#>qgt&N`By9!L$eLq+WvM7x{=E%5(U8oqE*~~mq*XatbJT^5+P7O zIh}soUBlfqt>V5+u`J6%2!Rj+RaH?{ReoERh2uEbwmlwrVjqj0L?D{6If?qfOcEjiY#Sj2nx?U`vcl!%Wyox2XNPvX&1f`= z3>?OuM<5`DLP2`?vykplrNZv+uKeEE*Z{_dR;$%Y93z!LKA)GV zw`rP;Mk6^xfM1jM&E)O(udlC%QuZ_g(Ys&}p96l1#9*g}p)ZP}$hY5y@yu^#^n$vJ zU`MtfSPQtW%iG%<0G&<;fZ=dRxm@O`QVH3W%VpZ_cA}k+JzFCvwOTD)8&1kGh#tq) zY86e>&@>HIRi!^Dio$R>q~Gt;@As+K>mfV;7>+B`w0RfL?d`1s;1{uj!9WfiBmm>p uNwNbb6ASx+l2#r2AigYGNq^MtTjVcHU}|}X9U8z;ZVu; zSH(UzuiEW)ml9c)mCngptybFW^-vTARaF5<(;2U#%*IQSgfvY#KR?gqts0|h7)Jh% znBtD7OVw8@6{^)Ls;cG$BuPRX$HZ~G^sS9wwxF_=yQeM&{r<*jJK2jw;_ z2aAp}X1kR*xhJC1{8S=hFXd37f9OSzv=Sc0ro z%&W6P!nZ)?Kh?l!^r^4}#Tuw=0n?|vuf=2Awrn3CAJge{WQA**#>K@2CnqN|rnKu(t@pz2qdC%g2H8YU?N62EG3l=#R{{=P{P=2U0%D?0P0{;O1`^3|Bqp{@x0000F) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_15.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_15.png new file mode 100644 index 0000000000000000000000000000000000000000..cd62067877c2ee374f373ca3c45efd999989fb10 GIT binary patch literal 425 zcmV;a0apHrP)~Jx8!k6UYIkOBKjvyh9*WIu8&?liCXegmf+`7GYQ|Tx3a# zpzG*FXTq><;RC_XKkxm(&u``;2!d~nsLL_KCxEj6xccjc5W;E@rBolF3J=53N;u~n zLI@>97vNCT;lA%%0SLnoobzAr*}NZMy}pL{_yhnDLaYEZy_2t0y4GpJr{@=|p+nvs zfV2UOquWB~1M zKPiB%1*%fF2M&c)Hb*fbMC$<5qqyy@1bBUWm+IyyHj!!+x4o4Bj}Q08VY*UzcX}X6 zHubsg;-jl1*$i(;s@0HlZgop`^p>Uk3n--!LL6VTAfrub-wU=i`Y4_NMhEx-;AU_I ThOmbQ00000NkvXXu0mjfYzekS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_2.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7c558be6d1bee2f9712d1162f0a01160ddfde72b GIT binary patch literal 564 zcmV-40?Yl0P)7w`dk+i9?u@m=}=f)|g)gJ;ph7}QmorZ4P|+nhGDQh z7ay+Y$BxONyo6-4HFOPl)K~(%(Q>uMWHJE&jK^bsSXmWHX~_F+Hk&y1d_HH!9{2#S zFVD;~Aq0ewn2>CCeDb89EH)shfa4s6!3iNaolXFNPNyR!5!s61I7jsoTn+qG_kO=e zx7!7P_?L(0d9iJ;*Gn64$pOI<$S|9ZnCDij#k4HjETk(S!ROa^{NMAuc(y9r;sh?~ z^7H8T`@;U+ZkO$N@l(r?T7uti8}lzVi`*(mLZyNtC`F*O3hE*t+wuQKAkU7!DS@&osEt5r71TxGE-FYK z$0`*_kK-x?X44Vg-ai1SRWO^5a-WE$j$@SysvXA(M3+e(St^kE6ef`Iy^yH_nV$^8 zE16*!*QRS24xV7!HVj=u@*5%u0;Vy(x(3^}F&sR_eyQ(|Uo;krMdl5chwHkqEK4|M znx-_745i)!QJEtmMay1^Kr}G)2~MX|YPA}cWl<;;D3{Art5vD9SS(nrR@k;J zWrHwHQ_2USMJKA&sw6R;P7_%lA0K0yCX2-afO5G^zu%|Z?S=>oM9C-#1mV1T4}kIY zgGww@zc#wqi~u*+xeX;b7WyhE2^ixmocck`(An8pEC%-W_E@b}F~`RE3O4-&(tyB| zAzjxgl}hNk4nV0?;_>m3<#HL<$v~Wdx0J(1qamHRu8ZS1a;#|@uImEu@bDnVDm}a< z6rZUH)a$#PS#D!1OeRyx;pU3m#umL+#B&2}Pz=r@wnPtE}< zl?s(gg~4FJU@(x+;0I{xE+yE`JOxS4FE1|vIPLWSIO%i%Xt&$U=W}#j4+W(Pxd;dd z=fbf-kcc3W7n=C*uZtIv=N~zAl6+~=tfxZK>Vr7#^*HHtI6ORzy-V{G55j*8%{0x# z7fFoU?KUT!PUykv& zu^Ljr+ps3HN#Xb-Mh={zAD#!kVf&tF2%&1O?(KtV!v2_z+>sBK8t0qfmc zzCESmBocWMbuMgYrsMJWR*prv4PY1sj^pGi%MHU|GMNB`c4a)i%`QlM0Y45#qfzKp zEoVuVrngZxbm|9x4K2URRjEp{piWkOsO}4dq319C`^YDd*_a6Vn`@lt!}3sQbYnw*Gf}{s)pDy8MO|a%2Di002ov JPDHLkV1gi&g0lbs literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_4.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_4.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b362b9a48e491ecbd02b7d708340c4f02869f1 GIT binary patch literal 467 zcmV;^0WAKBP)BbwQ&x6fux&+ul75H_2sLhU>bx zy}8Ec@@sEWvX+>Jqzm{o?DzYX$jfT2*}Sl?RvS*nqe6~!0iTA)#$xeS{vhFs7eRcY>vrzR6MREDqlMQxo7$5-|$}w_y%u3unkC$1nd9+002ov JPDHLkV1gUx%boxL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_5.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_5.png new file mode 100644 index 0000000000000000000000000000000000000000..ac07397a5da5f6f5d62b8beb4d5cf27e05038489 GIT binary patch literal 636 zcmV-?0)zdDP)3XzR~+5mL9190F=_XVHi*p1!-lPrgUz% z+r^XA6<3NIhVh{MVwM0xO0|N)V1VZ9mr$w|D2ftjLb(8-RDrJRxV+*(sS=y&2bekN z^?Im1Re_lU=~xQ+_Q3egLA%|?@a)H8#$PBdmI}bO?Sf@l^GsG;2S7kjO6QuUt-Tmy zOfJ#$2}3s_Aq0dFOsCV(CgOw;kj*kiqY+*_eJ6CaopU;adST~@3mkl z08#wlbOQ&c8)&s!auDN7x2?!)!9tlE5dfexSPWjR%m<%miB@deHa@(e0DzN|p`1Ne z#mjh@m>LPNt#09(-!35pkd!XIxqTzq2OJ)06{?HRwIWd z1w*MtDIrRGC<~_cK^PqOph&i?-Id~4@dt~RnUUtx&d(08W;}W*N0id(+6Yier-os0 zbx(N4Wf4*93Q$qR1Sq9bP19EH*z-I9fOB#RUDw3~V$^E2l{p`cM#^J3V=N;Ng6oWodjbH^Xf*Jb{YyRw0ECc2&g~y#0D#eCs8*{p4(45GF8_cvpBXBUMME{1t{fZq3?VghmdObrtpeT-JCgIXG^BLUCSU{ z1r-Ilu19zFVkXOU_dq#iI0@l64mMwsXbh8}lzCt<4AE}4lTwQlu5<#XX~MFsJK6sS XWtPTi>+I9I00000NkvXXu0mjfd-fPF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_7.png b/Resources/Textures/Constructible/Power/ame_shielding.rsi/shield_7.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6884eb29f36c2a89701354be4fdf2487f5e898 GIT binary patch literal 753 zcmVtaTC|hV`%N<5r;Y?DjoWjEZcW}zVE%ecXtYaZQH_e98A;XCQ+}~ zQE${@3hoHV1fo98W|PwWdl2=>teXS+_>1?e&*tVPpTB&&lE{YAbn_;z{-?lo-OP&} z$C=A`LZH=ZDX!}Z0L!u@uRPDA)oKCIEj@<^Pq99}rC2P^ZY}E5eD|K}%NMlUKSl&% z61HuN<>h78*4C0WzVDBWr@-^PnK;N{ObG#iq9_OD#C1Z>+D)oK+0P16999Z-}@j!_ihdEP?29!C-aMN!Z+4PDn! zRaGJ|91c+w1+NmHc$|deI5;>+o-36KVHgqwfpko- zlLMnVu(PxC*JBulAyE|3?RKZ{=Zuh!p%8*F3=_jQRfuj!DIOysf^WVg!#sT7+lc@7T`dGh!n=1LyZG)LDI-9ibV<=NWWqTTrk jTAs|hg%S7r}{>@jD1kZubF%E?r6?bXPpwtQCTAG&jUS z?9e8?Bp3grQ5Szx?!Daoe)sO~y{Gj1{T(h0#ux}8pp+`POOr=&6Of&Ntq0?-it%_1 zY`vp>1=(7Ru~Zt^WR7mP3+8$Nygj}H0sw#zl1jv}pp+_d0YZp6olfS&wrvOGQUQk1 z0GrGK0II5HO3pct*`()C6h?0i{_~e?V0RUXrMZ4Wbxm4X!LqENXFEeN+9f8U075lXRTZ^r1+Q=KXti1=vx###=l+I5 zB4V##{QMFcJL|7h!0yHk+l9&ZC}btu^uGn}BJWcMD$W z0;>62Br)^Qen2oB4uP2`ZOisR3S8GsUjKLr!!Y3f^bqydqU|3AFvgboYyq6}%A$ao z2h`*OP1p6Mi5_Rz@x* zK!5RUy#nS_Z9M{3jJSY=d>2Aw7L!s1L`$*|0!*2JDHCZCMFhtLB$ecY!8r~F=hEbw zra{v*DG{-DY#trPdiL4#mjK{bxg2s;Rq^WWZvepYo(j%+b|s9h)S8Huf z$X!St?cYtZJwONn=N!j-DgfmEy}W<|9tcDP^E|`_MADED0;?;e4~*`+PwwH}*?V+4 zoy5JlX&4;1Os50<%S#$Lkl+D&atgyR!uQE!vJ|l_GSkp;oYD#BFQfoaPrKtMZC(W` gs;b_ui~PU9Ujcyce}P+9q5uE@07*qoM6N<$g3>f7761SM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/ame_shielding_base.png b/Resources/Textures/Constructible/Power/ame_shielding_base.png new file mode 100644 index 0000000000000000000000000000000000000000..cd62067877c2ee374f373ca3c45efd999989fb10 GIT binary patch literal 425 zcmV;a0apHrP)~Jx8!k6UYIkOBKjvyh9*WIu8&?liCXegmf+`7GYQ|Tx3a# zpzG*FXTq><;RC_XKkxm(&u``;2!d~nsLL_KCxEj6xccjc5W;E@rBolF3J=53N;u~n zLI@>97vNCT;lA%%0SLnoobzAr*}NZMy}pL{_yhnDLaYEZy_2t0y4GpJr{@=|p+nvs zfV2UOquWB~1M zKPiB%1*%fF2M&c)Hb*fbMC$<5qqyy@1bBUWm+IyyHj!!+x4o4Bj}Q08VY*UzcX}X6 zHubsg;-jl1*$i(;s@0HlZgop`^p>Uk3n--!LL6VTAfrub-wU=i`Y4_NMhEx-;AU_I ThOmbQ00000NkvXXu0mjfYzekS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Power/AME/ame_jar.rsi/jar.png b/Resources/Textures/Objects/Power/AME/ame_jar.rsi/jar.png new file mode 100644 index 0000000000000000000000000000000000000000..ede7ec4094a01bec9134787895ccb737fcc2f2b0 GIT binary patch literal 473 zcmV;~0Ve*5P)MO_{%V{jf=%Xvn&H(xm+@v&7!#EB*UF^ zIOmv7r{sCAtqA~d&T%;#ap&eX^Z7iMCLVd7tK563vUi}d+rtSwAUB?=oWF(HvQ*#R zP`|j_o(Ig%Q#D)HVN;V>;dHi*>>ae@0oi@7a%z`qbP1DYOvY!pc6A&r!iF{=f*B<+ z0I%@zI}AqfvyAg|c$WxRX*vxQCHz=N%?2VaAgj0RKlEIA0jM~@Gw z1NnlTE4Q6W@d;4CUw3j+S|1;SHMyl4M`9;e{zZz(wHQV>k_?|FdD z8eMy^J*+>()E2Bkiwa$>g6ZPk@SP{Begjp7NrxbUszG1H{R=yE_`mTBb9%2>UZdl? P00000NkvXXu0mjf&GpuY literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Power/AME/ame_jar.rsi/meta.json b/Resources/Textures/Objects/Power/AME/ame_jar.rsi/meta.json new file mode 100644 index 0000000000..38c5df1bfe --- /dev/null +++ b/Resources/Textures/Objects/Power/AME/ame_jar.rsi/meta.json @@ -0,0 +1,20 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/blob/Bleeding-Edge/icons/obj/machines/new_ame.dmi at 1b7952787c06c21ef1623e494dcfe7cb1f46e041", + "states": [ + { + "name": "jar", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Power/AME/ame_part.rsi/box.png b/Resources/Textures/Objects/Power/AME/ame_part.rsi/box.png new file mode 100644 index 0000000000000000000000000000000000000000..320d84905cac876a2502ac957f15296e8065abd8 GIT binary patch literal 384 zcmV-`0e}99P)#c!x!iysB~~C3eG}}(o)EsMX;um z!)?~Ow2**FZW@cr{ic)TB>#7BNDdeb2E#wIq0>~WSLUk*4By7F8CyEx#bP0Ku;)$D zxi40rR%aZ zqAWN$J;bu2e?&_8h_VQs^StTb2rN0e{fxZUYvlp(X9|GPaFjTRKw}ynw+>dCgb)2E etx0Pz7z{rIN@><7mg~X*0000