From 834afe5aa768a9d0c1b70d2668555176d5eec266 Mon Sep 17 00:00:00 2001
From: mfranz <mfranz>
Date: Sun, 29 Mar 2009 08:04:35 +0000
Subject: [PATCH] make file reloadable at runtime; minor fixes; cleanup

---
 Nasal/tanker.nas | 71 ++++++++++++++++++++++++++++++------------------
 1 file changed, 45 insertions(+), 26 deletions(-)

diff --git a/Nasal/tanker.nas b/Nasal/tanker.nas
index 9390caa0d..21c381e97 100644
--- a/Nasal/tanker.nas
+++ b/Nasal/tanker.nas
@@ -1,3 +1,13 @@
+if (globals["tanker"] != nil) {
+	# reload with io.load_nasal(getprop("/sim/fg-root") ~ "/Nasal/tanker.nas");
+	print("reloading " ~ caller(0)[2]);
+	var _setlistener = reinit;
+	reinit();
+}
+#--------------------------------------------------------------------------------------------------
+
+
+
 var boom_tanker = "Models/Geometry/KC135/KC135.xml";
 var probe_tanker = "Models/Geometry/KA6-D/KA6-D.xml";
 
@@ -5,8 +15,13 @@ var probe_tanker = "Models/Geometry/KA6-D/KA6-D.xml";
 var oclock = func(bearing) int(0.5 + geo.normdeg(bearing) / 30) or 12;
 
 
+var tanker_msg = func setprop("sim/messages/ai-plane", call(sprintf, arg));
+var pilot_msg = func setprop("/sim/messages/pilot", call(sprintf, arg));
+var atc_msg = func setprop("sim/messages/atc", call(sprintf, arg));
+
+
 var identity = {
-	# return free ai id number and least used, free callsign/channel pair
+	# return free AI id number and least used, free callsign/channel pair
 	get: func {
 		var data = {};     # copy of me.pool
 		var revdata = {};  # channel->callsign
@@ -72,7 +87,7 @@ var Tanker = {
 		m.ai = n.getChild("tanker", i, 1);
 
 		m.ai.getNode("id", 1).setIntValue(aiid);
-		m.ai.getNode("callsign", 1).setValue(m.callsign);
+		m.ai.getNode("callsign", 1).setValue(m.callsign ~ "");
 		m.ai.getNode("tanker", 1).setBoolValue(1);
 		m.ai.getNode("valid", 1).setBoolValue(1);
 		m.ai.getNode("navaids/tacan/channel-ID", 1).setValue(m.tacan);
@@ -105,7 +120,7 @@ var Tanker = {
 		return Tanker.active[m.callsign] = m;
 	},
 	del: func {
-		setprop("sim/messages/ai-plane", me.callsign ~ " returns to base");
+		tanker_msg(me.callsign ~ " returns to base");
 		me.model.remove();
 		me.ai.remove();
 		delete(Tanker.active, me.callsign);
@@ -124,8 +139,9 @@ var Tanker = {
 		var deviation = me.roll ? dt * 1085.941 * math.tan(me.roll * D2R) / me.ktas : 0;
 
 		if (me.mode == "leg") {
-			if (me.lastmode == "turn") {
+			if (me.lastmode != "leg") {
 				me.lastmode = "leg";
+				# swap ARCP anchor and tanker exit point as leg end points
 				var g = me.goal[0];
 				me.goal[0] = me.goal[1];
 				me.goal[1] = g;
@@ -138,8 +154,8 @@ var Tanker = {
 			if ((me.leg_remaining -= distance) < 0)
 				me.mode = "turn";
 
-		} else { # if (me.mode == "turn")
-			if (me.lastmode == "leg") {
+		} else { # me.mode == "turn"
+			if (me.lastmode != "turn") {
 				me.lastmode = "turn";
 				me.full_bank_turn_angle = 0;
 				me.turn_remaining = 180;
@@ -152,8 +168,7 @@ var Tanker = {
 				me.roll_target = 0;
 
 			if ((me.turn_remaining -= deviation) < 0) {
-				if (me.goal[1] == nil)
-					# set tanker exit point (opposite of anchor point/ARCP)
+				if (me.goal[1] == nil)  # define tanker exit point (opposite of anchor point/ARCP)
 					me.goal[1] = geo.Coord.new(me.coord).apply_course_distance(me.course - 180,
 							me.length);
 				me.mode = "leg";
@@ -195,33 +210,33 @@ var Tanker = {
 		}
 
 		if (!me.leg_warning and me.leg_remaining < NM2M) {
-			setprop("sim/messages/ai-plane", me.callsign ~ ", turn in one mile");
+			tanker_msg(me.callsign ~ ", turn in one mile");
 			me.leg_warning = 1;
 		}
 
-		var now = getprop("/sim/time/elapsed-sec");
+		me.now = getprop("/sim/time/elapsed-sec");
 		if (me.distance < 90000)
-			me.out_of_range_time = now;
-		elsif (now - me.out_of_range_time > 600)
+			me.out_of_range_time = me.now;
+		elsif (me.now - me.out_of_range_time > 600)
 			return me.del();
 		settimer(func me.update(), 0);
 	},
 	identify: func {
+		me.out_of_range_time = me.now;
 		var alt = int((me.coord.alt() * M2FT + 50) / 100) * 100;
-		var msg = sprintf("%s at %.0f, heading %.0f with %.0f knots, TACAN %s",
+		tanker_msg("%s at %.0f, heading %.0f with %.0f knots, TACAN %s",
 				me.callsign, alt, me.heading, me.kias, me.tacan);
-		setprop("sim/messages/ai-plane", msg);
 	},
 	report: func {
+		me.out_of_range_time = me.now;
 		var dist = int(me.distance * M2NM);
 		var hdg = getprop("orientation/heading-deg");
 		var diff = (me.coord.alt() - me.ac.alt()) * M2FT;
 		var qual = diff > 3000 ? " well" : abs(diff) > 1000 ? " slightly" : "";
 		var rel = diff > 1000 ? " above" : diff < -1000 ? " below" : "";
-		var msg = sprintf("Tanker %s is at %s o'clock%s",
+		atc_msg("Tanker %s is at %s o'clock%s",
 				me.callsign, oclock(me.ac.course_to(me.coord) - hdg),
 				qual ~ rel);
-		setprop("sim/messages/ground", msg);
 	},
 	active: {},
 };
@@ -255,19 +270,23 @@ var report = func {
 }
 
 
-_setlistener("/sim/signals/nasal-dir-initialized", func {
-	var aar_capable = size(props.globals.getNode("systems/refuel", 1).getChildren("type"));
-	gui.menuEnable("tanker", aar_capable);
-	if (!aar_capable)
-		request = func { setprop("sim/messages/ai-plane", "no tanker in range") };
-
-	setlistener("/sim/signals/reinit", func {
-		foreach (var t; values(Tanker.active))
-			t.del();
-	});
+var reinit = func {
+	foreach (var t; values(Tanker.active))
+		t.del();
 
 	# randomize tacan pool usage counter (0 and -1)
 	foreach (var t; values(identity.pool))
 		t[1] = int(rand() * 2) - 1;
+}
+
+
+_setlistener("/sim/signals/nasal-dir-initialized", func {
+	var aar_capable = size(props.globals.getNode("systems/refuel", 1).getChildren("type"));
+	gui.menuEnable("tanker", aar_capable);
+	if (!aar_capable)
+		request = func { atc_msg("no tanker in range") }; # braces mandatory
+
+	setlistener("/sim/signals/reinit", reinit, 1);
 });
 
+