diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index cc4923d8d..8c149b2ae 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -116,6 +116,8 @@ + + diff --git a/Subsurface/Content/Items/Electricity/signalcomp.png b/Subsurface/Content/Items/Electricity/signalcomp.png index 726b7921e..bb7510542 100644 Binary files a/Subsurface/Content/Items/Electricity/signalcomp.png and b/Subsurface/Content/Items/Electricity/signalcomp.png differ diff --git a/Subsurface/Content/Items/Electricity/signalitems.xml b/Subsurface/Content/Items/Electricity/signalitems.xml index b3f0e4b25..8128c1d74 100644 --- a/Subsurface/Content/Items/Electricity/signalitems.xml +++ b/Subsurface/Content/Items/Electricity/signalitems.xml @@ -202,7 +202,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > signalQueue; + + [InGameEditable, HasDefaultValue(1.0f, true)] + public float Delay + { + get { return (float)delay.TotalSeconds; } + set + { + float seconds = MathHelper.Clamp(value, 0.0f, 60.0f); + + delay = new TimeSpan(0,0,0,0, (int)(seconds*1000.0f)); + } + } + + public DelayComponent(Item item, XElement element) + : base (item, element) + { + signalQueue = new Queue>(); + + IsActive = true; + } + + public override void Update(float deltaTime, Camera cam) + { + while (signalQueue.Any() && signalQueue.Peek().Item2 + delay <= DateTime.Now) + { + var signalOut = signalQueue.Dequeue(); + + item.SendSignal(signalOut.Item1, "signal_out"); + } + } + + public override void ReceiveSignal(string signal, Connection connection, Item sender, float power=0.0f) + { + switch (connection.Name) + { + case "signal_in": + signalQueue.Enqueue(new Tuple(signal, DateTime.Now)); + break; + } + } + } +} diff --git a/Subsurface/Source/Items/Components/Signal/RelayComponent.cs b/Subsurface/Source/Items/Components/Signal/RelayComponent.cs new file mode 100644 index 000000000..950ddd41a --- /dev/null +++ b/Subsurface/Source/Items/Components/Signal/RelayComponent.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml.Linq; + +namespace Barotrauma.Items.Components +{ + class RelayComponent : ItemComponent + { + public RelayComponent(Item item, XElement element) + : base (item, element) + { + IsActive = true; + } + + public override void ReceiveSignal(string signal, Connection connection, Item sender, float power=0.0f) + { + if (connection.Name.Contains("_in")) + { + if (!IsActive) return; + + string outConnection = connection.Name.Contains("power_in") ? "power_out" : "signal_out"; + + int connectionNumber = -1; + int.TryParse(connection.Name.Substring(connection.Name.Length - 1, 1), out connectionNumber); + + if (connectionNumber > 0) outConnection += connectionNumber; + + item.SendSignal(signal, outConnection, power); + } + else if (connection.Name == "toggle") + { + IsActive = !IsActive; + } + else if (connection.Name == "set_state") + { + IsActive = signal == "1"; + } + + } + } +}