Files
flightgear-addon-missions/Nasal/extensions/point_of_interest_handler.nas
2017-10-25 16:45:58 +03:00

104 lines
2.7 KiB
Plaintext

var POI_changed = 0;
var listeners = [];
var node = props.getNode("/sim/mission/point-of-interest", 1);
var current_POI = node.getNode("current-POI", 1);
var active_POI = [];
var timer = maketimer(0, func loop());
__mission.POI = {
coord : geo.Coord.new(),
count : 0,
name : "",
alt : 0,
dist : 0,
crs : 0,
hdg : 0,
current : nil,
};
var poi = func (k, v = nil) {
if (v == nil)
return __mission.POI[k];
__mission.POI[k] = v;
}
var compass_visible = func getprop("/sim/mission/compass/visible") or 0;
var show_compass = func !compass_visible() ? setprop("/sim/mission/compass/show-compass", 1) : return;
var hide_compass = func compass_visible() ? setprop("/sim/mission/compass/hide-compass", 1) : return;
var update = func {
if (POI_changed) return;
POI_changed = 1;
settimer(func check_POI(), 0);
}
var check_POI = func {
if (!mission.mission_started)
return;
poi("count", var count = 0);
setsize(active_POI, 0);
foreach (var p; node.getChildren("point-of-interest"))
if (p.getValue("active")) {
poi("count", count += 1);
append(active_POI, p);
}
if (poi("count"))
select_POI();
POI_changed = 0;
setprop("/sim/mission/point-of-interest/POI-count", poi("count"));
}
var next_POI = func select_POI(poi("current") + 1);
var prev_POI = func select_POI(poi("current") - 1);
var select_POI = func(i = nil) {
var s = size(active_POI) - 1;
if (i == nil) i = 0;
if (i < 0) i = s;
if (i > s) i = 0;
var p = node.getChild("point-of-interest", var index = active_POI[i].getIndex());
__mission.POI.coord.set_latlon (
p.getValue("latitude-deg"),
p.getValue("longitude-deg"),
p.getValue("altitude-m"),
);
poi("name", p.getValue("name"));
poi("alt", p.getValue("altitude-m"));
poi("current", i);
setprop("/sim/mission/point-of-interest/target-name", poi("name"));
setprop("/sim/mission/point-of-interest/altitude-m", poi("alt"));
foreach (var p; active_POI)
p.setValue("selected", p.getIndex() == index ? 1 : 0);
}
var loop = func {
poi("count") or return;
var ac_coord = geo.aircraft_position();
var crs = ac_coord.course_to(poi("coord"));
var dist = ac_coord.distance_to(poi("coord"));
poi("dist", dist);
poi("crs", crs);
poi("hdg", crs - getprop("/orientation/heading-deg"));
}
mission.extension_add("Handler", {
init: func {
listeners = [
setlistener("/sim/mission/point-of-interest/signals/POI-changed", func update()),
setlistener("/sim/mission/point-of-interest/signals/next-POI", func next_POI()),
setlistener("/sim/mission/point-of-interest/signals/prev-POI", func prev_POI()),
];
timer.start();
},
stop: func {
timer.stop();
foreach(var l; listeners)
removelistener(l);
setsize(listeners, 0);
node.remove();
},
});