From df149dd0fa991e0f7e1207c40a5aa149b6dc81cd Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sun, 10 Jun 2018 23:40:28 +0300 Subject: [PATCH] Option to make delay component reset (discarding previously received signals) when a new signal is received, fixed delay countdown running even when the game is paused. Closes #435 --- .../Items/Components/Signal/DelayComponent.cs | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/DelayComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/DelayComponent.cs index 68761a18c..eb6331673 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/DelayComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/DelayComponent.cs @@ -10,49 +10,51 @@ namespace Barotrauma.Items.Components { const int SignalQueueSize = 500; - //the output is sent if both inputs have received a signal within the timeframe - private TimeSpan delay; - - private Queue> signalQueue; + private Queue> signalQueue; - [InGameEditable, Serialize(1.0f, true)] + [InGameEditable(MinValueFloat = 0.0f, MaxValueFloat = 60.0f), Serialize(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)); - } + get; + set; } - + + [InGameEditable(ToolTip = "Should the component discard previously received signals when a new one is received."), Serialize(false, true)] + public bool ResetWhenSignalReceived + { + get; + set; + } + public DelayComponent(Item item, XElement element) : base (item, element) { - signalQueue = new Queue>(); - + signalQueue = new Queue>(); IsActive = true; } public override void Update(float deltaTime, Camera cam) { - while (signalQueue.Any() && signalQueue.Peek().Item2 + delay <= DateTime.Now) + foreach (var val in signalQueue) + { + val.Second -= deltaTime; + } + + while (signalQueue.Count > 0 && signalQueue.Peek().Second <= 0.0f) { var signalOut = signalQueue.Dequeue(); - - item.SendSignal(0, signalOut.Item1, "signal_out", null); + item.SendSignal(0, signalOut.First, "signal_out", null); } } - public override void ReceiveSignal(int stepsTaken, string signal, Connection connection, Item source, Character sender, float power=0.0f) + public override void ReceiveSignal(int stepsTaken, string signal, Connection connection, Item source, Character sender, float power = 0.0f) { switch (connection.Name) { case "signal_in": if (signalQueue.Count >= SignalQueueSize) return; - - signalQueue.Enqueue(new Tuple(signal, DateTime.Now)); + if (ResetWhenSignalReceived) signalQueue.Clear(); + signalQueue.Enqueue(Pair.Create(signal, Delay)); break; } }