Reactor temperature has to stay above the meltdown temperature for 30 seconds before it explodes. The reactors now also have an output connection that sends out a signal when the temperature is critical. + Added reactor meltdown warning sirens & lights to vanilla subs. Closes #157

This commit is contained in:
Joonas Rikkonen
2018-01-10 00:32:58 +02:00
parent d1bb33be78
commit 5f2227489b
6 changed files with 45 additions and 36 deletions
@@ -11,6 +11,15 @@ namespace Barotrauma.Items.Components
{ {
private GUITickBox autoTempTickBox; private GUITickBox autoTempTickBox;
private const int GraphSize = 25;
private float graphTimer;
private int updateGraphInterval = 500;
private float[] fissionRateGraph = new float[GraphSize];
private float[] coolingRateGraph = new float[GraphSize];
private float[] tempGraph = new float[GraphSize];
private float[] loadGraph = new float[GraphSize];
partial void InitProjSpecific() partial void InitProjSpecific()
{ {
var button = new GUIButton(new Rectangle(410, 70, 40, 40), "-", "", GuiFrame); var button = new GUIButton(new Rectangle(410, 70, 40, 40), "-", "", GuiFrame);
@@ -39,6 +39,7 @@
<output name="power_out"/> <output name="power_out"/>
<output name="temperature_out"/> <output name="temperature_out"/>
<input name="shutdown"/> <input name="shutdown"/>
<output name="meltdown_warning"/>
</ConnectionPanel> </ConnectionPanel>
<ItemContainer capacity="5" canbeselected="true"> <ItemContainer capacity="5" canbeselected="true">
@@ -32,22 +32,13 @@ namespace Barotrauma.Items.Components
//turned down and cooling increased //turned down and cooling increased
private float shutDownTemp; private float shutDownTemp;
private float fireTemp, meltDownTemp; private float fireTemp, meltDownTemp, meltDownDelay;
private float meltDownTimer;
//how much power is provided to the grid per 1 temperature unit //how much power is provided to the grid per 1 temperature unit
private float powerPerTemp; private float powerPerTemp;
private int graphSize = 25;
private float graphTimer;
private int updateGraphInterval = 500;
private float[] fissionRateGraph;
private float[] coolingRateGraph;
private float[] tempGraph;
private float[] loadGraph;
private float load; private float load;
private bool unsentChanges; private bool unsentChanges;
@@ -67,6 +58,13 @@ namespace Barotrauma.Items.Components
} }
} }
[Serialize(30.0f, true)]
public float MeltdownDelay
{
get { return meltDownDelay; }
set { meltDownDelay = Math.Max(value, 0.0f); }
}
[Editable(ToolTip = "The temperature at which the reactor catches fire."), Serialize(9000.0f, true)] [Editable(ToolTip = "The temperature at which the reactor catches fire."), Serialize(9000.0f, true)]
public float FireTemp public float FireTemp
{ {
@@ -155,17 +153,9 @@ namespace Barotrauma.Items.Components
public Reactor(Item item, XElement element) public Reactor(Item item, XElement element)
: base(item, element) : base(item, element)
{ {
fissionRateGraph = new float[graphSize];
coolingRateGraph = new float[graphSize];
tempGraph = new float[graphSize];
loadGraph = new float[graphSize];
shutDownTemp = 500.0f; shutDownTemp = 500.0f;
powerPerTemp = 1.0f; powerPerTemp = 1.0f;
IsActive = true; IsActive = true;
InitProjSpecific(); InitProjSpecific();
} }
@@ -227,8 +217,19 @@ namespace Barotrauma.Items.Components
if (temperature > meltDownTemp) if (temperature > meltDownTemp)
{ {
MeltDown(); item.SendSignal(0, "1", "meltdown_warning", null);
return; meltDownTimer += deltaTime;
if (meltDownTimer > MeltdownDelay)
{
MeltDown();
return;
}
}
else
{
item.SendSignal(0, "0", "meltdown_warning", null);
meltDownTimer = Math.Max(0.0f, meltDownTimer - deltaTime);
} }
load = 0.0f; load = 0.0f;
@@ -326,27 +327,25 @@ namespace Barotrauma.Items.Components
private void MeltDown() private void MeltDown()
{ {
if (item.Condition <= 0.0f) return; if (item.Condition <= 0.0f || GameMain.Client != null) return;
GameServer.Log("Reactor meltdown!", ServerLog.MessageType.ItemInteraction); GameServer.Log("Reactor meltdown!", ServerLog.MessageType.ItemInteraction);
item.Condition = 0.0f; item.Condition = 0.0f;
var containedItems = item.ContainedItems; var containedItems = item.ContainedItems;
if (containedItems == null) return; if (containedItems != null)
foreach (Item containedItem in item.ContainedItems)
{ {
if (containedItem == null) continue; foreach (Item containedItem in containedItems)
containedItem.Condition = 0.0f; {
if (containedItem == null) continue;
containedItem.Condition = 0.0f;
}
} }
if (GameMain.Server != null) if (GameMain.Server != null && GameMain.Server.ConnectedClients.Contains(BlameOnBroken))
{ {
if (GameMain.Server.ConnectedClients.Contains(BlameOnBroken)) BlameOnBroken.Karma = 0.0f;
{
BlameOnBroken.Karma = 0.0f;
}
} }
} }
Binary file not shown.