Files
flightgear-addon-aerotow-ev…/nasal/dialogs/thermal.nas
T

94 lines
3.2 KiB
Plaintext

#
# Aerotow Everywhere - Add-on for FlightGear
#
# Written and developer by Roman Ludwicki (PlayeRom, SP-ROM)
#
# Copyright (C) 2022 Roman Ludwicki
#
# Aerotow Everywhere is an Open Source project and it is licensed
# under the GNU Public License v3 (GPLv3)
#
var Thermal = {
#
# Constructor
#
# addon - Addon object
# message - Message object
#
new: func (addon, message) {
var obj = { parents: [Thermal] };
obj.addon = addon;
obj.addonNodePath = addon.node.getPath();
obj.message = message;
obj.listeners = [];
# Listener for calculate distance from meters to nautical miles.
append(obj.listeners, setlistener(obj.addonNodePath ~ "/addon-devel/add-thermal/distance-m", func (node) {
setprop(obj.addonNodePath ~ "/addon-devel/add-thermal/distance-nm", node.getValue() * globals.M2NM);
}));
# Listener for calculate strength from ft/s to m/s.
append(obj.listeners, setlistener(obj.addonNodePath ~ "/addon-devel/add-thermal/strength-fps", func (node) {
setprop(obj.addonNodePath ~ "/addon-devel/add-thermal/strength-mps", node.getValue() * globals.FPS2KT * globals.KT2MPS);
}));
# Listener for calculate diameter from ft to m.
append(obj.listeners, setlistener(obj.addonNodePath ~ "/addon-devel/add-thermal/diameter-ft", func (node) {
setprop(obj.addonNodePath ~ "/addon-devel/add-thermal/diameter-m", node.getValue() * globals.FT2M);
}));
# Listener for calculate height from ft to m.
append(obj.listeners, setlistener(obj.addonNodePath ~ "/addon-devel/add-thermal/height-msl", func (node) {
setprop(obj.addonNodePath ~ "/addon-devel/add-thermal/height-msl-m", node.getValue() * globals.FT2M);
}));
return obj;
},
#
# Destructor
#
del: func () {
foreach (var listener; me.listeners) {
removelistener(listener);
}
},
#
# Add thermal 300 m before glider position.
#
# Return 1 on successful, otherwise 0.
#
add: func () {
var heading = getprop("/orientation/heading-deg") or 0;
var distance = getprop(me.addonNodePath ~ "/addon-devel/add-thermal/distance-m") or 300;
var position = geo.aircraft_position();
position.apply_course_distance(heading, distance);
# Get random layer from 1 to 4
var layer = int(rand() * 4) + 1;
var args = props.Node.new({
"type": "thermal",
"model": "Models/Weather/altocumulus_layer" ~ layer ~ ".xml",
"latitude": position.lat(),
"longitude": position.lon(),
"strength-fps": getprop(me.addonNodePath ~ "/addon-devel/add-thermal/strength-fps") or 16.0,
"diameter-ft": getprop(me.addonNodePath ~ "/addon-devel/add-thermal/diameter-ft") or 4000,
"height-msl": getprop(me.addonNodePath ~ "/addon-devel/add-thermal/height-msl") or 9000,
"search-order": "DATA_ONLY"
});
if (fgcommand("add-aiobject", args)) {
me.message.success("The thermal has been added");
return 1;
}
me.message.error("Adding thermal failed");
return 0;
},
};