From c05eaeacaa5295a34b507069b2cd4625d8fecb5e Mon Sep 17 00:00:00 2001
From: legoboyvdlp R <legoboyvdlp@gmail.com>
Date: Wed, 17 Apr 2019 17:40:49 +0100
Subject: [PATCH] Major bugfix

---
 A320-main.xml                          |  3 +-
 Models/Instruments/OHpanel/OHpanel.xml | 42 +++++++++----
 Nasal/ECAM/ECAM-controller.nas         |  4 ++
 Nasal/fire.nas                         | 82 +++++++++++++++++++-------
 Systems/a320-engine-fire.xml           |  6 +-
 5 files changed, 102 insertions(+), 35 deletions(-)

diff --git a/A320-main.xml b/A320-main.xml
index f9d2fb9b..235129e0 100644
--- a/A320-main.xml
+++ b/A320-main.xml
@@ -626,7 +626,8 @@
 		</engines>
 		<fire>
 			<apu-test-btn type="bool">0</apu-test-btn>
-			<test-btn type="bool">0</test-btn>
+			<test-btn-1 type="bool">0</test-btn-1>
+			<test-btn-2 type="bool">0</test-btn-2>
 		</fire>
 		<flight>
 			<aileron-drives-tiller type="bool">0</aileron-drives-tiller>
diff --git a/Models/Instruments/OHpanel/OHpanel.xml b/Models/Instruments/OHpanel/OHpanel.xml
index 5c76df2c..fa70921e 100644
--- a/Models/Instruments/OHpanel/OHpanel.xml
+++ b/Models/Instruments/OHpanel/OHpanel.xml
@@ -6185,7 +6185,7 @@
         <type>translate</type>
 		<object-name>Eng1FireBtn</object-name>
         <property>controls/engines/engine[0]/fire-btn</property>
-        <factor>0.0225</factor>
+        <factor>0.0025</factor>
         <axis>
             <x>1</x>
             <y>0</y>
@@ -6249,7 +6249,7 @@
 					<value>1</value>
 				</equals>
 				<equals>
-					<property>/controls/fire/test-btn</property>
+					<property>/controls/fire/test-btn-1</property>
 					<value>1</value>
 				</equals>
 				<equals>
@@ -6270,7 +6270,7 @@
 					<value>1</value>
 				</equals>
 				<equals>
-					<property>/controls/fire/test-btn</property>
+					<property>/controls/fire/test-btn-1</property>
 					<value>1</value>
 				</equals>
 				<equals>
@@ -6291,7 +6291,7 @@
 					<value>1</value>
 				</equals>
 				<equals>
-					<property>/controls/fire/test-btn</property>
+					<property>/controls/fire/test-btn-1</property>
 					<value>1</value>
 				</equals>
 				<equals>
@@ -6306,19 +6306,39 @@
 	<animation>
 		<type>pick</type>
 		<object-name>Eng1FireTst</object-name>
+		<action>
+			<button>0</button>
+			<repeatable>false</repeatable>
+			<binding>
+				<command>property-assign</command>
+				<property>controls/fire/test-btn-1</property>
+				<value>1</value>
+			</binding>
+			<mod-up>
+				<binding>
+					<command>property-assign</command>
+					<property>controls/fire/test-btn-1</property>
+					<value>0</value>
+				</binding>
+			</mod-up>
+		</action>
+	</animation>
+	
+	<animation>
+		<type>pick</type>
 		<object-name>Eng2FireTst</object-name>
 		<action>
 			<button>0</button>
 			<repeatable>false</repeatable>
 			<binding>
 				<command>property-assign</command>
-				<property>controls/fire/test-btn</property>
+				<property>controls/fire/test-btn-2</property>
 				<value>1</value>
 			</binding>
 			<mod-up>
 				<binding>
 					<command>property-assign</command>
-					<property>controls/fire/test-btn</property>
+					<property>controls/fire/test-btn-2</property>
 					<value>0</value>
 				</binding>
 			</mod-up>
@@ -6424,7 +6444,7 @@
         <type>translate</type>
 		<object-name>APUFireBtn</object-name>
         <property>controls/APU/fire-btn</property>
-        <factor>0.0225</factor>
+        <factor>0.0025</factor>
         <axis>
             <x>1</x>
             <y>0</y>
@@ -6581,7 +6601,7 @@
         <type>translate</type>
 		<object-name>Eng2FireBtn</object-name>
         <property>controls/engines/engine[1]/fire-btn</property>
-        <factor>0.0225</factor>
+        <factor>0.0025</factor>
         <axis>
             <x>1</x>
             <y>0</y>
@@ -6645,7 +6665,7 @@
 					<value>1</value>
 				</equals>
 				<equals>
-					<property>controls/fire/test-btn</property>
+					<property>controls/fire/test-btn-2</property>
 					<value>1</value>
 				</equals>
 				<equals>
@@ -6666,7 +6686,7 @@
 					<value>1</value>
 				</equals>
 				<equals>
-					<property>controls/fire/test-btn</property>
+					<property>controls/fire/test-btn-2</property>
 					<value>1</value>
 				</equals>
 				<equals>
@@ -6687,7 +6707,7 @@
 					<value>1</value>
 				</equals>
 				<equals>
-					<property>controls/fire/test-btn</property>
+					<property>controls/fire/test-btn-2</property>
 					<value>1</value>
 				</equals>
 				<equals>
diff --git a/Nasal/ECAM/ECAM-controller.nas b/Nasal/ECAM/ECAM-controller.nas
index 185c8254..bb6afd11 100644
--- a/Nasal/ECAM/ECAM-controller.nas
+++ b/Nasal/ECAM/ECAM-controller.nas
@@ -282,6 +282,10 @@ var ECAMloopTimer = maketimer(0.15, func {
 });
 
 # Flash Master Warning Light
+var shutUpYou = func() {
+	lights[0].setBoolValue(0);
+}
+
 var warnTimer = maketimer(0.25, func {
 	if (!lights[0].getBoolValue()) {
 		warnTimer.stop();
diff --git a/Nasal/fire.nas b/Nasal/fire.nas
index da6e563f..f23cc7d9 100644
--- a/Nasal/fire.nas
+++ b/Nasal/fire.nas
@@ -31,7 +31,8 @@ var et = 0;
 
 var elapsedTime = props.globals.getNode("/sim/time/elapsed-sec");
 var apuTestBtn = props.globals.getNode("/controls/fire/apu-test-btn", 1);
-var testBtn = props.globals.getNode("/controls/fire/test-btn", 1);
+var testBtn = props.globals.getNode("/controls/fire/test-btn-1", 1);
+var testBtn2 = props.globals.getNode("/controls/fire/test-btn-2", 1);
 var eng1FireWarn = props.globals.initNode("/systems/fire/engine1/warning-active", 0, "BOOL");
 var eng2FireWarn = props.globals.initNode("/systems/fire/engine2/warning-active", 0, "BOOL");
 var apuFireWarn = props.globals.initNode("/systems/fire/apu/warning-active", 0, "BOOL");
@@ -322,21 +323,47 @@ var detectorLoop = {
 var extinguisherBottle = {
 	quantity: 100,
 	squib: 0,
+	number: 0,
 	lightProp: "",
 	elecProp: "",
-	new: func(lightProp, elecProp) {
+	failProp: "",
+	warningProp: "",
+	new: func(number, lightProp, elecProp, failProp, warningProp) {
 		var eB = {parents:[extinguisherBottle]};
 		eB.quantity = 100;
 		eB.squib = 0;
+		eB.number = number;
 		eB.lightProp = props.globals.getNode(lightProp, 1);
 		eB.elecProp = props.globals.getNode(elecProp, 1);
+		eB.failProp = props.globals.getNode(failProp, 1);
+		eB.warningProp = props.globals.getNode(warningProp, 1);
 		return eB;
 	},
 	emptyBottle: func() {
-		me.quantity = me.quantity - 1;
-		if (me.quantity > 0) { settimer(me.emptyBottle, 0.05); }
-		else {
+		me.quantity -= 1;
+		if (me.quantity > 0) { 
+			settimer(func() {
+				me.emptyBottle()
+			}, 0.05); 
+		} else {
 			me.lightProp.setValue(1);
+			# make things interesting. If your fire won't go out you should play the lottery
+			if (me.number == 0) {
+				if (rand() < 0.75) { 
+					me.failProp.setValue(0);
+					me.warningProp.setValue(0);
+				}
+			elsif (me.number == 1) {
+				if (rand() < 0.98) {
+					me.failProp.setValue(0);
+					me.warningProp.setValue(0);
+				}
+			} elsif (me.number == 9) {
+				if (rand() <= 0.999) {
+					me.failProp.setValue(0);
+					me.warningProp.setValue(0);
+				}
+			}
 		}
 	},
 	discharge: func() {
@@ -428,8 +455,9 @@ detectorLoop.new(2, 1, "/systems/fire/apu/temperature", "/systems/electrical/bus
 ]);
 
 # Create extinguisher bottles
-var extinguisherBottles = std.Vector.new([extinguisherBottle.new("/systems/fire/engine1/disch1", "/systems/electrical/bus/dcbat"), extinguisherBottle.new("/systems/fire/engine1/disch2", "/systems/electrical/bus/dc2"),
-extinguisherBottle.new("/systems/fire/engine2/disch1", "/systems/electrical/bus/dcbat"), extinguisherBottle.new("/systems/fire/engine2/disch2", "/systems/electrical/bus/dc2"), extinguisherBottle.new("/systems/fire/apu/disch", "/systems/electrical/bus/dcbat") ]);
+var extinguisherBottles = std.Vector.new([extinguisherBottle.new(0, "/systems/fire/engine1/disch1", "/systems/electrical/bus/dcbat", "/systems/failures/engine-left-fire", "/systems/fire/engine1/warning-active"), extinguisherBottle.new(1, "/systems/fire/engine1/disch2", "/systems/electrical/bus/dc2", "/systems/failures/engine-left-fire", "/systems/fire/engine1/warning-active"),
+extinguisherBottle.new(0, "/systems/fire/engine2/disch1", "/systems/electrical/bus/dcbat", "/systems/failures/engine-right-fire", "/systems/fire/engine2/warning-active"), extinguisherBottle.new(1, "/systems/fire/engine2/disch2", "/systems/electrical/bus/dc2", "/systems/failures/engine-right-fire", "/systems/fire/engine2/warning-active"), 
+extinguisherBottle.new(9, "/systems/fire/apu/disch", "/systems/electrical/bus/dcbat", "/systems/failures/apu-fire", "/systems/fire/apu/warning-active") ]);
 
 # Props.nas helper
 var propsNasFire = std.Vector.new();
@@ -438,40 +466,54 @@ foreach (detectorLoop; detectorLoops.vector) {
 };
 
 # Setlistener helper
-var createFireBottleListener = func(prop, index) {
+var createFireBottleListener = func(prop, fireBtnProp, index) {
 	if (index >= extinguisherBottles.size()) {
 		print("Error - calling listener on non-existent fire extinguisher bottle, index: " ~ index); 
 		return;
 	}
 	
 	setlistener(prop, func() {
-		if (getprop(prop) == 1) {
+		if (getprop(prop) == 1 and getprop(fireBtnProp) == 1) {
 			extinguisherBottles.vector[index].discharge();
 		}
 	}, 0, 0);
 }
 
 # Listeners 
-setlistener("/controls/engines/engine[0]/fire-btn", func() { eng1FireWarn.setBoolValue(0); }, 0, 0);
-setlistener("/controls/engines/engine[1]/fire-btn", func() { eng2FireWarn.setBoolValue(0); }, 0, 0);
-setlistener("/controls/APU/fire-btn", func() { apuFireWarn.setBoolValue(0); }, 0, 0);
+setlistener("/controls/engines/engine[0]/fire-btn", func() { ecam.shutUpYou(); }, 0, 0);
+setlistener("/controls/engines/engine[1]/fire-btn", func() { ecam.shutUpYou(); }, 0, 0);
+setlistener("/controls/APU/fire-btn", func() { ecam.shutUpYou(); }, 0, 0);
 
-setlistener("/controls/fire/test-btn", func() {
+setlistener("/controls/fire/test-btn-1", func() {
+	if (getprop("/systems/failures/engine-left-fire")) { return; }
+	
 	if (testBtn.getValue() == 1) {
 		if (dcbatNode.getValue() > 25 or dcessNode.getValue() > 25) {
 			eng1FireWarn.setBoolValue(1);
-			eng2FireWarn.setBoolValue(1);
 		} else {
 			eng1FireWarn.setBoolValue(0);
-			eng2FireWarn.setBoolValue(0);
 		}
 	} else {
 		eng1FireWarn.setBoolValue(0);
+	}
+}, 0, 0);
+
+setlistener("/controls/fire/test-btn-2", func() {
+	if (getprop("/systems/failures/engine-right-fire")) { return; }
+	
+	if (testBtn2.getValue() == 1) {
+		if (dcbatNode.getValue() > 25 or dcessNode.getValue() > 25) {
+			eng2FireWarn.setBoolValue(1);
+		} else {
+			eng2FireWarn.setBoolValue(0);
+		}
+	} else {
 		eng2FireWarn.setBoolValue(0);
 	}
 }, 0, 0);
 
 setlistener("/controls/fire/apu-test-btn", func() {
+	if (getprop("/systems/failures/apu-fire")) { return; }
 	if (apuTestBtn.getValue() == 1) {
 		if (dcbatNode.getValue() > 25 or dcessNode.getValue() > 25) {
 			apuFireWarn.setBoolValue(1);
@@ -483,11 +525,11 @@ setlistener("/controls/fire/apu-test-btn", func() {
 	}
 }, 0, 0);
 
-createFireBottleListener("/controls/engines/engine[0]/agent1-btn", 0);
-createFireBottleListener("/controls/engines/engine[0]/agent2-btn", 1);
-createFireBottleListener("/controls/engines/engine[1]/agent1-btn", 2);
-createFireBottleListener("/controls/engines/engine[1]/agent2-btn", 3);
-createFireBottleListener("/controls/APU/agent-btn", 4);
+createFireBottleListener("/controls/engines/engine[0]/agent1-btn", "/controls/engines/engine[0]/fire-btn", 0);
+createFireBottleListener("/controls/engines/engine[0]/agent2-btn", "/controls/engines/engine[0]/fire-btn", 1);
+createFireBottleListener("/controls/engines/engine[1]/agent1-btn", "/controls/engines/engine[1]/fire-btn", 2);
+createFireBottleListener("/controls/engines/engine[1]/agent2-btn", "/controls/engines/engine[1]/fire-btn", 3);
+createFireBottleListener("/controls/APU/agent-btn", "/controls/APU/fire-btn", 4);
 
 var updateUnits = func() {
 	foreach (var units; engFireDetectorUnits.vector) {
diff --git a/Systems/a320-engine-fire.xml b/Systems/a320-engine-fire.xml
index 15c561d9..9f991d91 100644
--- a/Systems/a320-engine-fire.xml
+++ b/Systems/a320-engine-fire.xml
@@ -12,7 +12,7 @@
 							<independentVar lookup="row">/systems/failures/engine-left-fire</independentVar>
 							<tableData>
 								0    -5
-							    1	 10
+							    1	 20
 							</tableData>
 						</table>
 						<property>simulation/channel-dt</property>
@@ -35,7 +35,7 @@
 							<independentVar lookup="row">/systems/failures/engine-right-fire</independentVar>
 							<tableData>
 								0    -5
-							    1	 10
+							    1	 20
 							</tableData>
 						</table>
 						<property>simulation/channel-dt</property>
@@ -58,7 +58,7 @@
 							<independentVar lookup="row">/systems/failures/apu-fire</independentVar>
 							<tableData>
 								0    -5
-							    1	 10
+							    1	 20
 							</tableData>
 						</table>
 						<property>simulation/channel-dt</property>