1
0
Fork 0

Nasal loadpriority; remove nasal-dir-initialized listeners;

add more dependencies to loadpriority.xml and remove _setlistener stuff
This commit is contained in:
Henning Stahlke 2020-05-30 21:55:28 +02:00 committed by Stuart Buchanan
parent 60097f3c74
commit 148328d793
21 changed files with 492 additions and 526 deletions

View file

@ -96,7 +96,7 @@ var init = func {
} }
} }
var id = _setlistener("/sim/signals/fdm-initialized", func { var id = setlistener("/sim/signals/fdm-initialized", func {
removelistener(id); removelistener(id);
addons.init(); addons.init();
}) }, 0, 0);

View file

@ -1174,40 +1174,32 @@ var crossfeed_valve = {
} }
}; };
props.globals.initNode("/sim/time/elapsed-sec", 0);
props.globals.initNode("/sim/time/delta-sec", 0);
props.globals.initNode("/sim/time/delta-realtime-sec", 0.00000001);
HUD.init();
data.init();
# module initialization autotrim.init();
# ==============================================================================
#
_setlistener("/sim/signals/nasal-dir-initialized", func {
props.globals.initNode("/sim/time/elapsed-sec", 0);
props.globals.initNode("/sim/time/delta-sec", 0);
props.globals.initNode("/sim/time/delta-realtime-sec", 0.00000001);
HUD.init();
data.init();
autotrim.init();
##### temporary hack to provide backward compatibility for /sim/auto-coordination ##### temporary hack to provide backward compatibility for /sim/auto-coordination
##### remove this code when all references to /sim/auto-coordination are gone ##### remove this code when all references to /sim/auto-coordination are gone
var ac = props.globals.getNode("/sim/auto-coordination"); var ac = props.globals.getNode("/sim/auto-coordination");
if (ac != nil) { if (ac != nil) {
logprint(LOG_ALERT, "WARNING: using deprecated property "~ logprint(LOG_ALERT, "WARNING: using deprecated property "~
"/sim/auto-coordination. Please change to /controls/flight/auto-coordination"); "/sim/auto-coordination. Please change to /controls/flight/auto-coordination");
ac.alias(props.globals.getNode("/controls/flight/auto-coordination", 1)); ac.alias(props.globals.getNode("/controls/flight/auto-coordination", 1));
} }
#### end of temporary hack for /sim/auto-coordination #### end of temporary hack for /sim/auto-coordination
if (!getprop("/sim/startup/restore-defaults")) { if (!getprop("/sim/startup/restore-defaults")) {
# load user-specific aircraft settings # load user-specific aircraft settings
data.load(); data.load();
var n = props.globals.getNode("/sim/aircraft-data"); var n = props.globals.getNode("/sim/aircraft-data");
if (n != nil) { if (n != nil) {
foreach (var c; n.getChildren("path")) { foreach (var c; n.getChildren("path")) {
if (c.getType() != "NONE") if (c.getType() != "NONE")
data.add(c.getValue()); data.add(c.getValue());
}
} }
} }
}); }

View file

@ -80,6 +80,4 @@ var convert_checklists = func {
} }
} }
_setlistener("/sim/signals/nasal-dir-initialized", func { convert_checklists();
convert_checklists();
});

View file

@ -1,40 +1,30 @@
######### #########
# contrail calculator. Based on an approxmation to the "Appleman Chart" # contrail calculator. Based on an approxmation to the "Appleman Chart"
# y = -0.077x2 + 2.7188x - 64.36 # y = -0.077x2 + 2.7188x - 64.36
#
######## ########
updateContrail = func{ var pressure_Node = props.globals.initNode("environment/pressure-inhg", 1, "DOUBLE");
var pressure_Node = props.globals.getNode("environment/pressure-inhg"); var temperature_Node = props.globals.initNode("environment/temperature-degc", 1, "DOUBLE");
var temperature_Node = props.globals.getNode("environment/temperature-degc"); var contrail_Node = props.globals.initNode("environment/contrail", 1, "BOOL");
var contrail_Node = props.globals.getNode("environment/contrail"); var contrail_temp_Node = props.globals.initNode("environment/contrail-temperature-degc", 1, "DOUBLE");
var contrail_temp_Node = props.globals.getNode("environment/contrail-temperature-degc"); var static_contrail_node = props.globals.getNode("sim/ai/aircraft/contrail", 1);
var time_node = props.globals.getNode("sim/time/elapsed-sec", 1);
updateContrail = func {
var x = pressure_Node.getValue(); var x = pressure_Node.getValue();
var y = temperature_Node.getValue(); var y = temperature_Node.getValue();
var con_temp = -0.077 * x * x + 2.7188 * x - 64.36; var con_temp = -0.077 * x * x + 2.7188 * x - 64.36;
contrail_temp_Node.setValue(con_temp); contrail_temp_Node.setValue(con_temp);
if (y < con_temp and y < -40){ if (y < con_temp and y < -40) {
contrail_Node.setValue(1); contrail_Node.setValue(1);
} else { } else {
contrail_Node.setValue(0); contrail_Node.setValue(0);
} }
} }
### Contrail updateContrail(); # avoid 30 second delay on startup https://sourceforge.net/p/flightgear/codetickets/2077/
contrailTimer = maketimer(30, updateContrail); contrailTimer = maketimer(30, updateContrail);
contrailTimer.simulatedTime = 1; contrailTimer.simulatedTime = 1;
contrailTimer.restart(30);
_setlistener("/sim/signals/nasal-dir-initialized", func {
logprint(LOG_INFO, "Init contrail");
props.globals.initNode("environment/pressure-inhg", 1, "DOUBLE");
props.globals.initNode("environment/temperature-degc", 1, "DOUBLE");
props.globals.initNode("environment/contrail", 1, "BOOL");
props.globals.initNode("environment/contrail-temperature-degc", 1, "DOUBLE");
var static_contrail_node = props.globals.getNode("sim/ai/aircraft/contrail", 1);
var time_node = props.globals.getNode("sim/time/elapsed-sec", 1);
updateContrail(); # avoid 30 second delay on startup https://sourceforge.net/p/flightgear/codetickets/2077/
contrailTimer.restart(30);
});

View file

@ -973,44 +973,43 @@ var dumpProbeStats = func () {
return; return;
} }
#-- Init -----------------------------------------------------------------------
# General purpose breakpoint for the lazy ones.
var bp = Breakpoint.new("default", 0);
var dumpN = props.getNode("/_debug/nas/_dumpstats", 1);
dumpN.setBoolValue(0);
setlistener(dumpN, func(n) {
n.setBoolValue(0);
debug.dumpProbeStats();
}, 0, 0);
# --prop:debug=1 enables debug mode with additional warnings # --prop:debug=1 enables debug mode with additional warnings
# #
_setlistener("sim/signals/nasal-dir-initialized", func {
# General purpose breakpoint for the lazy ones.
debug.bp = debug.Breakpoint.new("default", 0);
var dumpN = props.getNode("/_debug/nas/_dumpstats", 1);
dumpN.setBoolValue(0);
setlistener(dumpN, func(n) {
n.setBoolValue(0);
debug.dumpProbeStats();
}, 0, 0);
if (!getprop("debug"))
return;
var writewarn = func(f, p, r) {
if (!r) {
var hint = "";
if ((var n = props.globals.getNode(p)) != nil) {
if (!n.getAttribute("writable"))
hint = " (write protected)";
elsif (n.getAttribute("tied"))
hint = " (tied)";
}
warn("Warning: " ~ f ~ " -> writing to " ~ p ~ " failed" ~ hint, 2);
}
return r;
}
setprop = (func { var _ = setprop; func writewarn("setprop",
globals.string.join("", arg[:-2]), call(_, arg)) })();
props.Node.setDoubleValue = func writewarn("setDoubleValue", me.getPath(),
props._setDoubleValue(me._g, arg));
props.Node.setBoolValue = func writewarn("setBoolValue", me.getPath(),
props._setBoolValue(me._g, arg));
props.Node.setIntValue = func writewarn("setIntValue", me.getPath(),
props._setIntValue(me._g, arg));
props.Node.setValue = func writewarn("setValue", me.getPath(),
props._setValue(me._g, arg));
});
if (getprop("debug")) {
var writewarn = func(f, p, r) {
if (!r) {
var hint = "";
if ((var n = props.globals.getNode(p)) != nil) {
if (!n.getAttribute("writable"))
hint = " (write protected)";
elsif (n.getAttribute("tied"))
hint = " (tied)";
}
warn("Warning: " ~ f ~ " -> writing to " ~ p ~ " failed" ~ hint, 2);
}
return r;
}
setprop = (func { var _ = setprop; func writewarn("setprop",
globals.string.join("", arg[:-2]), call(_, arg)) })();
props.Node.setDoubleValue = func writewarn("setDoubleValue", me.getPath(),
props._setDoubleValue(me._g, arg));
props.Node.setBoolValue = func writewarn("setBoolValue", me.getPath(),
props._setBoolValue(me._g, arg));
props.Node.setIntValue = func writewarn("setIntValue", me.getPath(),
props._setIntValue(me._g, arg));
props.Node.setValue = func writewarn("setValue", me.getPath(),
props._setValue(me._g, arg));
}

View file

@ -374,67 +374,64 @@ var enabled = nil;
var loop_id = 0; var loop_id = 0;
# Initialization. # disable menu entry and return for inappropriate FDMs (see Main/fg_init.cxx)
# var fdms = {
_setlistener("/sim/signals/nasal-dir-initialized", func { acms:0, ada:0, balloon:0, external:0,
# disable menu entry and return for inappropriate FDMs (see Main/fg_init.cxx) jsb:1, larcsim:1, magic:0, network:0,
var fdms = { null:0, pipe:0, ufo:0, yasim:1,
acms:0, ada:0, balloon:0, external:0, };
jsb:1, larcsim:1, magic:0, network:0, var fdm = getprop("/sim/flight-model");
null:0, pipe:0, ufo:0, yasim:1, if (!contains(fdms, fdm) or !fdms[fdm])
}; return;
var fdm = getprop("/sim/flight-model");
if (!contains(fdms, fdm) or !fdms[fdm])
return;
enabled = props.globals.getNode("/sim").getChildren("view"); enabled = props.globals.getNode("/sim").getChildren("view");
forindex (var i; enabled) forindex (var i; enabled)
enabled[i] = ((var n = enabled[i].getNode("config/dynamic-view")) != nil) and n.getBoolValue(); enabled[i] = ((var n = enabled[i].getNode("config/dynamic-view")) != nil) and n.getBoolValue();
# some properties may still be unavailable or nil # some properties may still be unavailable or nil
props.globals.initNode("/accelerations/pilot/x-accel-fps_sec", 0); props.globals.initNode("/accelerations/pilot/x-accel-fps_sec", 0);
props.globals.initNode("/accelerations/pilot/y-accel-fps_sec", 0); props.globals.initNode("/accelerations/pilot/y-accel-fps_sec", 0);
props.globals.initNode("/accelerations/pilot/z-accel-fps_sec", -32); props.globals.initNode("/accelerations/pilot/z-accel-fps_sec", -32);
props.globals.initNode("/orientation/side-slip-deg", 0); props.globals.initNode("/orientation/side-slip-deg", 0);
props.globals.initNode("/gear/gear/wow", 1, "BOOL"); props.globals.initNode("/gear/gear/wow", 1, "BOOL");
elapsedN = props.globals.getNode("/sim/time/elapsed-sec", 1); elapsedN = props.globals.getNode("/sim/time/elapsed-sec", 1);
# let listeners keep some variables up-to-date, so that they don't have # let listeners keep some variables up-to-date, so that they do not have
# to be queried in the loop # to be queried in the loop
setlistener("/sim/panel/visibility", func(n) { panel_visible = n.getValue() }, 1); setlistener("/sim/panel/visibility", func(n) { panel_visible = n.getValue() }, 1);
setlistener("/sim/current-view/view-number", func(n) { cockpit_view = enabled[n.getValue()] }, 1); setlistener("/sim/current-view/view-number", func(n) { cockpit_view = enabled[n.getValue()] }, 1);
setlistener("/devices/status/mice/mouse/button", func(n) { mouse_button = n.getValue() }, 1); setlistener("/devices/status/mice/mouse/button", func(n) { mouse_button = n.getValue() }, 1);
setlistener("/devices/status/mice/mouse/x", freeze); setlistener("/devices/status/mice/mouse/x", freeze);
setlistener("/devices/status/mice/mouse/y", freeze); setlistener("/devices/status/mice/mouse/y", freeze);
setlistener("/devices/status/mice/mouse/mode", func(n) { setlistener("/devices/status/mice/mouse/mode", func(n) {
if (mouse_mode = n.getValue()) if (mouse_mode = n.getValue())
view_manager.unfreeze(); view_manager.unfreeze();
}, 1); }, 1);
setlistener("/sim/signals/reinit", func(n) { setlistener("/sim/signals/reinit", func(n) {
n.getValue() and return; n.getValue() and return;
cockpit_view = enabled[getprop("/sim/current-view/view-number")]; cockpit_view = enabled[getprop("/sim/current-view/view-number")];
view_manager.reset(); view_manager.reset();
}, 0); }, 0);
view_manager.init(); view_manager.init();
original_resetView = view.resetView; original_resetView = view.resetView;
view.resetView = func { view.resetView = func {
original_resetView(); original_resetView();
if (cockpit_view and dynamic_view) if (cockpit_view and dynamic_view)
view_manager.add_offset(); view_manager.add_offset();
} }
settimer(func {
setlistener("/sim/current-view/dynamic-view", func(n) {
dynamic_view = n.getBoolValue();
loop_id += 1;
view.resetView();
if (dynamic_view)
main_loop(loop_id);
}, 1);
}, 0);
settimer(func {
setlistener("/sim/current-view/dynamic-view", func(n) {
dynamic_view = n.getBoolValue();
loop_id += 1;
view.resetView();
if (dynamic_view)
main_loop(loop_id);
}, 1);
}, 0);
});

View file

@ -64,13 +64,6 @@ var resetVisibility = func {
visibilityOverrideProp.setBoolValue(0); visibilityOverrideProp.setBoolValue(0);
} }
var visibilityProp = props.globals.initNode("/environment/config/presets/visibility-m", 0, "DOUBLE" );
var visibilityProp = nil; var visibilityOverrideProp = props.globals.initNode("/environment/config/presets/visibility-m-override", 0, "BOOL" );
var visibilityOverrideProp = nil; var auxvisibilityProp = props.globals.initNode("/local-weather/config/aux-max-vis-range-m", 0, "DOUBLE" );
var auxvisibilityProp = nil;
_setlistener("/sim/signals/nasal-dir-initialized", func {
visibilityProp = props.globals.initNode("/environment/config/presets/visibility-m", 0, "DOUBLE" );
visibilityOverrideProp = props.globals.initNode("/environment/config/presets/visibility-m-override", 0, "BOOL" );
auxvisibilityProp = props.globals.initNode("/local-weather/config/aux-max-vis-range-m", 0, "DOUBLE" );
});

View file

@ -128,94 +128,6 @@ var autopilotDisableProps = [
"/autopilot/CENTURYIII/locks" "/autopilot/CENTURYIII/locks"
]; ];
_setlistener("/sim/signals/nasal-dir-initialized", func {
screenHProp = props.globals.getNode("/sim/startup/ysize");
props.globals.getNode("/sim/help/debug", 1).setValues(debug_keys);
props.globals.getNode("/sim/help/basic", 1).setValues(basic_keys);
props.globals.getNode("/sim/help/common", 1).setValues(common_aircraft_keys);
# enable/disable menu entries
menuEnable("fuel-and-payload", fdm == "yasim" or fdm == "jsb");
menuEnable("aircraft-checklists", props.globals.getNode("/sim/checklists") != nil);
var isAutopilotMenuEnabled = func {
foreach( var apdp; autopilotDisableProps ) {
if( props.globals.getNode( apdp ) != nil )
return 0;
}
return 1;
}
menuEnable("autopilot", isAutopilotMenuEnabled() );
menuEnable("joystick-info", size(props.globals.getNode("/input/joysticks", 1).getChildren("js")));
menuEnable("rendering-buffers", getprop("/sim/rendering/rembrandt/enabled"));
menuEnable("rembrandt-buffers-choice", getprop("/sim/rendering/rembrandt/enabled"));
menuEnable("stereoscopic-options", !getprop("/sim/rendering/rembrandt/enabled"));
menuEnable("sound-config", getprop("/sim/sound/working"));
menuEnable("swift_connection", getprop("/sim/swift/available"));
# frame-per-second display
var fps = props.globals.getNode("/sim/rendering/fps-display", 1);
setlistener(fps, fpsDisplay, 1);
setlistener("/sim/startup/xsize", func {
if (fps.getValue()) {
fpsDisplay(0);
fpsDisplay(1);
}
});
# frame-latency display
var latency = props.globals.getNode("/sim/rendering/frame-latency-display", 1);
setlistener(latency, latencyDisplay, 1);
setlistener("/sim/startup/xsize", func {
if (latency.getValue()) {
latencyDisplay(0);
latencyDisplay(1);
}
});
# only enable precipitation if gui *and* aircraft want it
var p = "/sim/rendering/precipitation-";
var precip_gui = getprop(p ~ "gui-enable");
var precip_ac = getprop(p ~ "aircraft-enable");
props.globals.getNode(p ~ "enable", 1).setAttribute("userarchive", 0); # TODO remove later
var set_precip = func setprop(p ~ "enable", precip_gui and precip_ac);
setlistener(p ~ "gui-enable", func(n) set_precip(precip_gui = n.getValue()),1);
setlistener(p ~ "aircraft-enable", func(n) set_precip(precip_ac = n.getValue()),1);
# the autovisibility feature of the menubar
# automatically show the menubar if the mouse is at the upper edge of the window
# the menubar is hidden by a binding to a LMB click in mode 0 in mice.xml
var menubarAutoVisibilityListener = nil;
var menubarAutoVisibilityEdge = props.globals.initNode( "/sim/menubar/autovisibility/edge-size", 5, "INT" );
var menubarVisibility = props.globals.initNode( "/sim/menubar/visibility", 0, "BOOL" );
var currentMenubarVisibility = menubarVisibility.getValue();
var mouseMode = props.globals.initNode( "/devices/status/mice/mouse/mode", 0, "INT" );
setlistener( "/sim/menubar/autovisibility/enabled", func(n) {
if( n.getValue() and menubarAutoVisibilityListener == nil ) {
currentMenubarVisibility = menubarVisibility.getValue();
menubarVisibility.setBoolValue( 0 );
menubarAutoVisibilityListener = setlistener( "/devices/status/mice/mouse/y", func(n) {
if( n.getValue() == nil ) return;
if( mouseMode.getValue() != 0 ) return;
if( n.getValue() <= menubarAutoVisibilityEdge.getValue() )
menubarVisibility.setBoolValue( 1 );
}, 1, 0 );
}
# don't listen to the mouse position if this feature is enabled
if( n.getValue() == 0 and menubarAutoVisibilityListener != nil ) {
removelistener( menubarAutoVisibilityListener );
menubarAutoVisibilityListener = nil;
menubarVisibility.setBoolValue(currentMenubarVisibility);
}
}, 1, 0);
});
## ##
# Show/hide the fps display dialog. # Show/hide the fps display dialog.
# #
@ -303,6 +215,7 @@ var Widget = {
# livery_dialog.toggle(); # livery_dialog.toggle();
# #
var Dialog = { var Dialog = {
instance: {},
new: func(prop, path = nil, name = nil) { new: func(prop, path = nil, name = nil) {
var m = { parents: [Dialog] }; var m = { parents: [Dialog] };
m.state = 0; m.state = 0;
@ -321,8 +234,7 @@ var Dialog = {
} }
return Dialog.instance[m.name] = m; return Dialog.instance[m.name] = m;
}, },
del: func del: func {
{
if (me.listener != nil) if (me.listener != nil)
removelistener(me.listener); removelistener(me.listener);
}, },
@ -368,7 +280,6 @@ var Dialog = {
is_open: func { is_open: func {
me.state; me.state;
}, },
instance: {},
}; };
@ -1424,7 +1335,7 @@ var common_aircraft_keys = {
], ],
}; };
_setlistener("/sim/signals/screenshot", func { setlistener("/sim/signals/screenshot", func {
var path = getprop("/sim/paths/screenshot-last"); var path = getprop("/sim/paths/screenshot-last");
var button = { button: { legend: "Ok", default: 1, binding: { command: "dialog-close" }}}; var button = { button: { legend: "Ok", default: 1, binding: { command: "dialog-close" }}};
var success= getprop("/sim/signals/screenshot"); var success= getprop("/sim/signals/screenshot");
@ -1436,7 +1347,7 @@ _setlistener("/sim/signals/screenshot", func {
}); });
var terrasync_stalled = 0; var terrasync_stalled = 0;
_setlistener("/sim/terrasync/stalled", func { setlistener("/sim/terrasync/stalled", func {
var stalled = getprop("/sim/terrasync/stalled"); var stalled = getprop("/sim/terrasync/stalled");
if (stalled and !terrasync_stalled) if (stalled and !terrasync_stalled)
{ {
@ -1447,7 +1358,7 @@ _setlistener("/sim/terrasync/stalled", func {
}); });
var do_welcome = 1; var do_welcome = 1;
_setlistener("/sim/signals/fdm-initialized", func { setlistener("/sim/signals/fdm-initialized", func {
var haveTutorials = size(props.globals.getNode("/sim/tutorials", 1).getChildren("tutorial")); var haveTutorials = size(props.globals.getNode("/sim/tutorials", 1).getChildren("tutorial"));
gui.menuEnable("tutorial-start", haveTutorials); gui.menuEnable("tutorial-start", haveTutorials);
if (do_welcome and haveTutorials) if (do_welcome and haveTutorials)
@ -1497,6 +1408,91 @@ var update_shader_settings = func() {
setprop("/sim/rendering/shaders/skydome",0); setprop("/sim/rendering/shaders/skydome",0);
} }
}; };
_setlistener("/sim/rendering/shaders/custom-settings", func { update_shader_settings() } );
_setlistener("/sim/rendering/shaders/quality-level-internal", func { update_shader_settings() } ); setlistener("/sim/rendering/shaders/custom-settings", func { update_shader_settings() } );
setlistener("/sim/rendering/shaders/quality-level-internal", func { update_shader_settings() } );
update_shader_settings(); update_shader_settings();
screenHProp = props.globals.getNode("/sim/startup/ysize");
props.globals.getNode("/sim/help/debug", 1).setValues(debug_keys);
props.globals.getNode("/sim/help/basic", 1).setValues(basic_keys);
props.globals.getNode("/sim/help/common", 1).setValues(common_aircraft_keys);
# enable/disable menu entries
menuEnable("fuel-and-payload", fdm == "yasim" or fdm == "jsb");
menuEnable("aircraft-checklists", props.globals.getNode("/sim/checklists") != nil);
var isAutopilotMenuEnabled = func {
foreach( var apdp; autopilotDisableProps ) {
if( props.globals.getNode( apdp ) != nil )
return 0;
}
return 1;
}
menuEnable("autopilot", isAutopilotMenuEnabled() );
menuEnable("joystick-info", size(props.globals.getNode("/input/joysticks", 1).getChildren("js")));
menuEnable("rendering-buffers", getprop("/sim/rendering/rembrandt/enabled"));
menuEnable("rembrandt-buffers-choice", getprop("/sim/rendering/rembrandt/enabled"));
menuEnable("stereoscopic-options", !getprop("/sim/rendering/rembrandt/enabled"));
menuEnable("sound-config", getprop("/sim/sound/working"));
menuEnable("swift_connection", getprop("/sim/swift/available"));
# frame-per-second display
var fps = props.globals.getNode("/sim/rendering/fps-display", 1);
setlistener(fps, fpsDisplay, 1);
setlistener("/sim/startup/xsize", func {
if (fps.getValue()) {
fpsDisplay(0);
fpsDisplay(1);
}
});
# frame-latency display
var latency = props.globals.getNode("/sim/rendering/frame-latency-display", 1);
setlistener(latency, latencyDisplay, 1);
setlistener("/sim/startup/xsize", func {
if (latency.getValue()) {
latencyDisplay(0);
latencyDisplay(1);
}
});
# only enable precipitation if gui *and* aircraft want it
var p = "/sim/rendering/precipitation-";
var precip_gui = getprop(p ~ "gui-enable");
var precip_ac = getprop(p ~ "aircraft-enable");
props.globals.getNode(p ~ "enable", 1).setAttribute("userarchive", 0); # TODO remove later
var set_precip = func setprop(p ~ "enable", precip_gui and precip_ac);
setlistener(p ~ "gui-enable", func(n) set_precip(precip_gui = n.getValue()),1);
setlistener(p ~ "aircraft-enable", func(n) set_precip(precip_ac = n.getValue()),1);
# the autovisibility feature of the menubar
# automatically show the menubar if the mouse is at the upper edge of the window
# the menubar is hidden by a binding to a LMB click in mode 0 in mice.xml
var menubarAutoVisibilityListener = nil;
var menubarAutoVisibilityEdge = props.globals.initNode( "/sim/menubar/autovisibility/edge-size", 5, "INT" );
var menubarVisibility = props.globals.initNode( "/sim/menubar/visibility", 0, "BOOL" );
var currentMenubarVisibility = menubarVisibility.getValue();
var mouseMode = props.globals.initNode( "/devices/status/mice/mouse/mode", 0, "INT" );
setlistener( "/sim/menubar/autovisibility/enabled", func(n) {
if( n.getValue() and menubarAutoVisibilityListener == nil ) {
currentMenubarVisibility = menubarVisibility.getValue();
menubarVisibility.setBoolValue( 0 );
menubarAutoVisibilityListener = setlistener( "/devices/status/mice/mouse/y", func(n) {
if( n.getValue() == nil ) return;
if( mouseMode.getValue() != 0 ) return;
if( n.getValue() <= menubarAutoVisibilityEdge.getValue() )
menubarVisibility.setBoolValue( 1 );
}, 1, 0 );
}
# do not listen to the mouse position if this feature is enabled
if( n.getValue() == 0 and menubarAutoVisibilityListener != nil ) {
removelistener( menubarAutoVisibilityListener );
menubarAutoVisibilityListener = nil;
menubarVisibility.setBoolValue(currentMenubarVisibility);
}
}, 1, 0);

View file

@ -90,5 +90,4 @@ var masterSwitch = func() {
} }
} }
mpStart();
_setlistener("/sim/signals/nasal-dir-initialized", mpStart);

View file

@ -4,11 +4,53 @@
The files listed below will be loaded in order before any other files in the The files listed below will be loaded in order before any other files in the
Nasal directory. This is to avoid dependency problems that would otherwise Nasal directory. This is to avoid dependency problems that would otherwise
occur if aaaa.nas relied on props.nas occur if aaaa.nas relied on props.nas
<file> tag must include ONLY a filename.nas nothing else.
Comments must be placed outside the <file></file>
================================================================================
Short overview over the files and prominent functions they provide:
props.nas
props.Node class for easy access to the property tree
globals.nas
cmdarg, fgcommand, isa, setlistener,
several constants
deferred loading of user nas files from $FGHOME/Nasal
io.nas (uses string.nas)
include, load_nasal, read_properties, write_properties,
readxml, writexml
debug.nas (uses io.nas)
benchmark, backtrace, dump,
classes Breakpoint, Probe, Tracer
Dependencies:
modules.nas <- addons.nas
string.nas <- io.nas
string.nas <- gui.nas
io.nas <- gui.nas
gui.nas <- multiplayer.nas
multiplayer.nas <- view.nas
geo.nas <- view.nas
view.nas <- dynamic_view.nas
--> -->
<PropertyList> <PropertyList>
<file n="0">props.nas</file> <!-- stage 0 -->
<file n="1">globals.nas</file> <file>props.nas</file>
<file n="2">math.nas</file> <file>globals.nas</file>
<file n="3">string.nas</file> <file>math.nas</file>
<file n="3">io.nas</file> <file>string.nas</file>
<file>io.nas</file>
<file>debug.nas</file>
<!-- stage 1 -->
<file>modules.nas</file>
<file>mp_broadcast.nas</file>
<file>gui.nas</file>
<file>multiplayer.nas</file>
<file>geo.nas</file>
<file>view.nas</file>
</PropertyList> </PropertyList>

View file

@ -23,7 +23,7 @@
# my_foo_sys.load(); # my_foo_sys.load();
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
var MODULES_DIR = getprop("/sim/fg-root")~"/Nasal/modules/"; var MODULES_DIR = getprop("/sim/fg-root")~"/Nasal/modules/";
var MODULES_NODE = nil; var MODULES_NODE = props.getNode("/nasal/modules", 1);
var MODULES_DEFAULT_FILENAME = "main.nas"; var MODULES_DEFAULT_FILENAME = "main.nas";
var _modules_available = {}; var _modules_available = {};
@ -330,22 +330,16 @@ var load = func(name, ns="") {
# scan MODULES_DIR for subdirectories; it is assumed, that only well-formed # scan MODULES_DIR for subdirectories; it is assumed, that only well-formed
# modules are stored in that directories, so no further checks right here # modules are stored in that directories, so no further checks right here
var _findModules = func() { #var _findModules = func() {
var module_dirs = io.subdirectories(MODULES_DIR);
_modules_available = {}; _modules_available = {};
foreach (var name; module_dirs) { foreach (var name; io.subdirectories(MODULES_DIR)) {
if (!io.is_regular_file(MODULES_DIR~"/"~name~"/"~MODULES_DEFAULT_FILENAME)) if (!io.is_regular_file(MODULES_DIR~"/"~name~"/"~MODULES_DEFAULT_FILENAME))
break; break;
_modules_available[name] = 1; _modules_available[name] = 1;
MODULES_NODE.getNode(name~"/available",1).setBoolValue(1); MODULES_NODE.getNode(name~"/available",1).setBoolValue(1);
} }
} #}
#_findModules();
#props.getNode is available only after nasal dir has been initialized
_setlistener("sim/signals/nasal-dir-initialized", func {
MODULES_NODE = props.getNode("/nasal/modules", 1);
_findModules();
});
var commandModuleReload = func(node) var commandModuleReload = func(node)
{ {
@ -359,4 +353,5 @@ var commandModuleReload = func(node)
m.reload(); m.reload();
}; };
addcommand("nasal-module-reload", commandModuleReload); addcommand("nasal-module-reload", commandModuleReload);

View file

@ -266,8 +266,4 @@ var init = func {
data = { format: "", node: tree, children: scan(tree) }; data = { format: "", node: tree, children: scan(tree) };
} }
init();
_setlistener("/sim/signals/nasal-dir-initialized", init);

View file

@ -663,19 +663,13 @@ var mp_mode_changed = func(n) {
} }
} }
_setlistener("/sim/signals/nasal-dir-initialized", func { model.init();
setlistener("/sim/multiplay/online", mp_mode_changed, 1, 1);
# Call-back to ensure we see our own messages.
setlistener("/sim/multiplay/chat", chat_listener);
model.init(); if (getprop("/sim/presets/avoided-mp-runway")) {
setlistener("/sim/sceneryloaded", func {
setlistener("/sim/multiplay/online", mp_mode_changed, 1, 1);
# Call-back to ensure we see our own messages.
setlistener("/sim/multiplay/chat", chat_listener);
if (getprop("/sim/presets/avoided-mp-runway")) {
_setlistener("/sim/sceneryloaded", func {
gui.popupTip("Multi-player enabled, start moved to runway hold short position."); gui.popupTip("Multi-player enabled, start moved to runway hold short position.");
}); });
} }
});

View file

@ -76,15 +76,13 @@ var _set_state = func {
} }
} }
#-- Init -----------------------------------------------------------------------
_setlistener("sim/signals/nasal-dir-initialized", func { events = mp_broadcast.EventChannel.new("scenery/events");
events = mp_broadcast.EventChannel.new("scenery/events"); if (getprop(shared_pp)) {
if (getprop(shared_pp)) { #print("scenery.nas: starting event sharing.");
#print("scenery.nas: starting event sharing."); events.start();
events.start(); } else {
} else { #print("scenery.nas: stopping event sharing.");
#print("scenery.nas: stopping event sharing."); events.stop();
events.stop(); }
} setlistener(shared_pp, _set_state);
setlistener(shared_pp, _set_state);
});

View file

@ -403,63 +403,6 @@ var controls = nil;
# Shift-Alt-click adds all children of the selected property to the property display # Shift-Alt-click adds all children of the selected property to the property display
# Shift-Ctrl-click removes all properties from the display # Shift-Ctrl-click removes all properties from the display
# #
_setlistener("/sim/signals/nasal-dir-initialized", func {
property_display = display.new(5, -25);
listener.display = setlistener("/sim/gui/dialogs/property-browser/selected", func(n) {
var n = n.getValue();
if (n != "" and getprop("/devices/status/keyboard/shift")) {
if (getprop("/devices/status/keyboard/ctrl"))
return property_display.reset();
n = props.globals.getNode(n);
if (!n.getAttribute("children"))
property_display.add(n);
elsif (getprop("/devices/status/keyboard/alt"))
property_display.add(n.getChildren());
}
});
setlistener("/sim/gui/current-style", func {
theme_font = getprop("/sim/gui/selected-style/fonts/message-display/name");
}, 1);
log = window.new(nil, -30, 10, 10);
log.sticky = 0; # don't turn on; makes scrolling up messages jump left and right
var b = "/sim/screen/";
setlistener(b ~ "black", func(n) log.write(n.getValue(), 0, 0, 0));
setlistener(b ~ "white", func(n) log.write(n.getValue(), 1, 1, 1));
setlistener(b ~ "red", func(n) log.write(n.getValue(), 0.8, 0, 0));
setlistener(b ~ "green", func(n) log.write(n.getValue(), 0, 0.6, 0));
setlistener(b ~ "blue", func(n) log.write(n.getValue(), 0, 0, 0.8));
setlistener(b ~ "yellow", func(n) log.write(n.getValue(), 0.8, 0.8, 0));
setlistener(b ~ "magenta", func(n) log.write(n.getValue(), 0.7, 0, 0.7));
setlistener(b ~ "cyan", func(n) log.write(n.getValue(), 0, 0.6, 0.6));
});
# --prop:display=sim/frame-rate ... adds this property to the property display
# --prop:display=position/ ... adds all properties under /position/ (ends with slash!)
# --prop:display=position/,orientation/ ... separate multiple properties with comma
#
var fdm_init_listener = _setlistener("/sim/signals/fdm-initialized", func {
removelistener(fdm_init_listener); # uninstall, so we're only called once
foreach (var n; props.globals.getChildren("display")) {
foreach (var p; split(",", n.getValue())) {
if (!size(p))
continue;
if (find('%', p) >= 0)
property_display.format = p;
elsif (p[-1] == `/`)
property_display.add(props.globals.getNode(p, 1).getChildren());
else
property_display.add(p);
}
}
props.globals.removeChildren("display");
});
var search_name_in_msg = func(msg, call) { var search_name_in_msg = func(msg, call) {
var matching = 0; var matching = 0;
@ -607,3 +550,55 @@ _setlistener("/sim/signals/nasal-dir-initialized", func {
}); });
#-- Init -----------------------------------------------------------------------
property_display = display.new(5, -25);
listener.display = setlistener("/sim/gui/dialogs/property-browser/selected", func(n) {
var n = n.getValue();
if (n != "" and getprop("/devices/status/keyboard/shift")) {
if (getprop("/devices/status/keyboard/ctrl"))
return property_display.reset();
n = props.globals.getNode(n);
if (!n.getAttribute("children"))
property_display.add(n);
elsif (getprop("/devices/status/keyboard/alt"))
property_display.add(n.getChildren());
}
});
setlistener("/sim/gui/current-style", func {
theme_font = getprop("/sim/gui/selected-style/fonts/message-display/name");
}, 1);
log = window.new(nil, -30, 10, 10);
log.sticky = 0; # do not turn on; makes scrolling up messages jump left and right
var b = "/sim/screen/";
setlistener(b ~ "black", func(n) log.write(n.getValue(), 0, 0, 0));
setlistener(b ~ "white", func(n) log.write(n.getValue(), 1, 1, 1));
setlistener(b ~ "red", func(n) log.write(n.getValue(), 0.8, 0, 0));
setlistener(b ~ "green", func(n) log.write(n.getValue(), 0, 0.6, 0));
setlistener(b ~ "blue", func(n) log.write(n.getValue(), 0, 0, 0.8));
setlistener(b ~ "yellow", func(n) log.write(n.getValue(), 0.8, 0.8, 0));
setlistener(b ~ "magenta", func(n) log.write(n.getValue(), 0.7, 0, 0.7));
setlistener(b ~ "cyan", func(n) log.write(n.getValue(), 0, 0.6, 0.6));
# --prop:display=sim/frame-rate ... adds this property to the property display
# --prop:display=position/ ... adds all properties under /position/ (ends with slash!)
# --prop:display=position/,orientation/ ... separate multiple properties with comma
#
var fdm_init_listener = _setlistener("/sim/signals/fdm-initialized", func {
removelistener(fdm_init_listener); # uninstall, so we are only called once
foreach (var n; props.globals.getChildren("display")) {
foreach (var p; split(",", n.getValue())) {
if (!size(p))
continue;
if (find('%', p) >= 0)
property_display.format = p;
elsif (p[-1] == `/`)
property_display.add(props.globals.getNode(p, 1).getChildren());
else
property_display.add(p);
}
}
props.globals.removeChildren("display");
});

View file

@ -1,13 +1,11 @@
_setlistener("/sim/signals/nasal-dir-initialized", func { setlistener("/sim/presets/latitude-deg", func {
setlistener("/sim/presets/latitude-deg", func { logprint(LOG_INFO, "*** NEW LOCATION ***");
logprint(LOG_INFO, "*** NEW LOCATION ***"); settimer(func {
settimer(func { var typ = getprop("/sim/type");
var typ = getprop("/sim/type"); var lat = getprop("/position/latitude-deg");
var lat = getprop("/position/latitude-deg"); var lon = getprop("/position/longitude-deg");
var lon = getprop("/position/longitude-deg"); var g = geodinfo(lat, lon);
var g = geodinfo(lat, lon); if ((g != nil and g[1] != nil and g[1].solid) and (typ == "seaplane") )
if ((g != nil and g[1] != nil and g[1].solid) and (typ == "seaplane") ) fgcommand("dialog-show", props.Node.new({ "dialog-name": "seaport" }));
fgcommand("dialog-show", props.Node.new({ "dialog-name": "seaport" })); }, 8);
}, 8); }, 1);
}, 1);
});

View file

@ -495,8 +495,4 @@ var color = func(color, s, enabled=nil) {
# print(string.color("31;1", "this is red")); # print(string.color("31;1", "this is red"));
# #
var color_enabled = 0; var color_enabled = 0;
_setlistener("/sim/signals/nasal-dir-initialized", func { setlistener("/sim/startup/terminal-ansi-colors", func(n) setcolors(n.getBoolValue()), 1, 0);
setlistener("/sim/startup/terminal-ansi-colors", func(n) setcolors(n.getBoolValue()), 1, 0);
});

View file

@ -447,14 +447,12 @@ var reinit = func {
} }
_setlistener("/sim/signals/nasal-dir-initialized", func { var aar_capable = size(props.globals.getNode("systems/refuel", 1).getChildren("type"));
var aar_capable = size(props.globals.getNode("systems/refuel", 1).getChildren("type")); gui.menuEnable("tanker", aar_capable);
gui.menuEnable("tanker", aar_capable); if (!aar_capable)
if (!aar_capable) request = func { atc_msg("no tanker in range") }; # braces mandatory
request = func { atc_msg("no tanker in range") }; # braces mandatory
setlistener("/sim/signals/reinit", reinit, 1); setlistener("/sim/signals/reinit", reinit, 1);
});
if (globals["tanker"] != nil) { if (globals["tanker"] != nil) {
# reload with io.load_nasal(getprop("/sim/fg-root") ~ "/Nasal/tanker.nas"); # reload with io.load_nasal(getprop("/sim/fg-root") ~ "/Nasal/tanker.nas");

View file

@ -934,32 +934,31 @@ var screenWidthCompens = {
}; };
_setlistener("/sim/signals/nasal-dir-initialized", func { views = props.globals.getNode("/sim", 1).getChildren("view");
views = props.globals.getNode("/sim", 1).getChildren("view"); fovProp = props.globals.getNode("/sim/current-view/field-of-view", 1);
fovProp = props.globals.getNode("/sim/current-view/field-of-view", 1); point.init();
point.init();
setlistener("/sim/current-view/view-number", func(n) { setlistener("/sim/current-view/view-number", func(n) {
current = views[index = n.getValue()]; current = views[index = n.getValue()];
}, 1); }, 1);
props.globals.initNode("/position/altitude-agl-ft"); # needed by Fly-By View props.globals.initNode("/position/altitude-agl-ft"); # needed by Fly-By View
screenWidthCompens.init(); screenWidthCompens.init();
manager.init(); manager.init();
manager.register("Fly-By View", fly_by_view_handler); manager.register("Fly-By View", fly_by_view_handler);
});
_setlistener("/sim/signals/reinit", func { setlistener("/sim/signals/reinit", func {
screenWidthCompens.update(opt:nil,force:1); screenWidthCompens.update(opt:nil,force:1);
}); });
_setlistener("/sim/startup/xsize", func { setlistener("/sim/startup/xsize", func {
screenWidthCompens.update(); screenWidthCompens.update();
}); });
_setlistener("/sim/startup/ysize", func { setlistener("/sim/startup/ysize", func {
screenWidthCompens.update(); screenWidthCompens.update();
}); });
var fdm_init_listener = _setlistener("/sim/signals/fdm-initialized", func { var fdm_init_listener = setlistener("/sim/signals/fdm-initialized", func {
removelistener(fdm_init_listener); # uninstall, so we are only called once removelistener(fdm_init_listener); # uninstall, so we are only called once
var zoffset = nil; var zoffset = nil;
foreach (var v; views) { foreach (var v; views) {

View file

@ -31,33 +31,30 @@ var initialize_weather_scenario = func {
} }
}; };
_setlistener("/sim/signals/nasal-dir-initialized", func {
initialize_weather_scenario(); initialize_weather_scenario();
setlistener("/environment/weather-scenario", func(n) { setlistener("/environment/weather-scenario", func(n) {
var scenario = find_weather_scenario( n.getValue() ); var scenario = find_weather_scenario( n.getValue() );
if( scenario == nil ) return; if( scenario == nil ) return;
var scenarioName = scenario.getNode("name",1).getValue(); var scenarioName = scenario.getNode("name",1).getValue();
if( scenarioName == "Disabled" ) { if( scenarioName == "Disabled" ) {
setprop( "/environment/params/metar-updates-environment", 0 ); setprop( "/environment/params/metar-updates-environment", 0 );
setprop( "/environment/realwx/enabled", 0 ); setprop( "/environment/realwx/enabled", 0 );
setprop( "/environment/config/enabled", 0 ); setprop( "/environment/config/enabled", 0 );
} else if( scenarioName == "Live data" ) { } else if( scenarioName == "Live data" ) {
setprop( "/environment/params/metar-updates-environment", 1 ); setprop( "/environment/params/metar-updates-environment", 1 );
setprop( "/environment/realwx/enabled", 1 ); setprop( "/environment/realwx/enabled", 1 );
setprop( "/environment/config/enabled", 1 ); setprop( "/environment/config/enabled", 1 );
} else if( scenarioName == "Manual input" ) { } else if( scenarioName == "Manual input" ) {
setprop( "/environment/params/metar-updates-environment", 1 ); setprop( "/environment/params/metar-updates-environment", 1 );
setprop( "/environment/realwx/enabled", 0 ); setprop( "/environment/realwx/enabled", 0 );
setprop( "/environment/config/enabled", 1 ); setprop( "/environment/config/enabled", 1 );
} else { } else {
setprop( "/environment/params/metar-updates-environment", 1 ); setprop( "/environment/params/metar-updates-environment", 1 );
setprop( "/environment/realwx/enabled", 0 ); setprop( "/environment/realwx/enabled", 0 );
setprop( "/environment/config/enabled", 1 ); setprop( "/environment/config/enabled", 1 );
var metar = scenario.getNode("metar",1).getValue(); var metar = scenario.getNode("metar",1).getValue();
setprop( "environment/metar/data", metar ); setprop( "environment/metar/data", metar );
} }
});
}); });

View file

@ -935,104 +935,6 @@ wildfire_score_report_loop_timer.simulatedTime = 1;
wildfire_score_CAFire_loop_timer = maketimer(CAFire.GENERATION_DURATION, CAFire, CAFire._loop_ ); wildfire_score_CAFire_loop_timer = maketimer(CAFire.GENERATION_DURATION, CAFire, CAFire._loop_ );
wildfire_score_CAFire_loop_timer.simulatedTime = 1; wildfire_score_CAFire_loop_timer.simulatedTime = 1;
###############################################################################
# Main initialization.
var Binary = nil;
_setlistener("/sim/signals/nasal-dir-initialized", func {
Binary = mp_broadcast.Binary;
# Create configuration properties if they do not exist already.
props.globals.initNode(CA_enabled_pp, 1, "BOOL");
setlistener(CA_enabled_pp, func (n) {
if (getprop("/sim/signals/reinit")) return; # Ignore resets.
CAFire.reset(n.getValue(), SimTime.current_time());
});
props.globals.initNode(MP_share_pp, 1, "BOOL");
props.globals.initNode(crash_fire_pp, 1, "BOOL");
props.globals.initNode(impact_fire_pp, 1, "BOOL");
props.globals.initNode(save_on_exit_pp, 0, "BOOL");
props.globals.initNode(restore_on_startup_pp, 0, "BOOL");
props.globals.initNode(models_enabled_pp, 1, "BOOL");
props.globals.initNode(report_score_pp, 1, "BOOL");
props.globals.initNode(event_file_pp, "", "STRING");
props.globals.initNode(time_hack_pp, "", "STRING");
props.globals.initNode(fire_LOD_pp, 10, "INT");
props.globals.initNode(smoke_LOD_pp, 10, "INT");
SimTime.init();
broadcast =
mp_broadcast.BroadcastChannel.new(msg_channel_mpp, parse_msg);
CAFire.init();
# Start the score reporting.
wildfire_score_report_loop_timer.restart(CAFire.GENERATION_DURATION);
setlistener("/sim/signals/exit", func {
if (getprop(report_score_pp) and (CAFire.cells_created > 0))
print_score();
if (getprop(save_on_exit_pp))
CAFire.save_event_log(SAVEDIR ~ "fire_log.xml");
});
# Determine the skip-ahead-to time, if any.
var time_hack = time_string_to_epoch(getprop(time_hack_pp));
if (time_hack > SimTime.current_time()) {
logprint(LOG_ALERT,
"wildfire.nas: Ignored time hack " ~
(SimTime.current_time() - time_hack) ~
" seconds into the future.");
# Skip ahead to current time instead.
time_hack = -1;
} elsif (time_hack > 0) {
logprint(LOG_ALERT,
"wildfire.nas: Time hack " ~
(SimTime.current_time() - time_hack) ~
" seconds ago.");
} else {
# Skip ahead to current time instead.
time_hack = -1;
}
if (getprop(event_file_pp) != "") {
settimer(func {
# Delay loading the log until the terrain is there. Note: hack.
CAFire.load_event_log(getprop(event_file_pp), time_hack);
}, 3);
} elsif (getprop(restore_on_startup_pp)) {
settimer(func {
# Delay loading the log until the terrain is there. Note: hack.
# Restore skips ahead to current time.
CAFire.load_event_log(SAVEDIR ~ "fire_log.xml", -1);
}, 3);
}
# Detect aircraft crash.
setlistener("sim/crashed", func(n) {
if (getprop(crash_fire_pp) and n.getBoolValue())
wildfire.ignite(geo.aircraft_position());
});
# Detect impact.
var impact_node = props.globals.getNode("sim/ai/aircraft/impact/bomb", 1);
setlistener("sim/ai/aircraft/impact/bomb", func(n) {
if (getprop(impact_fire_pp) and n.getBoolValue()){
var node = props.globals.getNode(n.getValue(), 1);
var impactpos = geo.Coord.new();
impactpos.set_latlon
(node.getNode("impact/latitude-deg").getValue(),
node.getNode("impact/longitude-deg").getValue());
wildfire.ignite(impactpos);
}
});
logprint(LOG_INFO, "Wildfire ... initialized.");
});
###############################################################################
############################################################################### ###############################################################################
# Utility functions # Utility functions
@ -1192,5 +1094,97 @@ var dialog = {
"fire_log.xml"); # default file name "fire_log.xml"); # default file name
selector.open(); selector.open();
} }
} };
############################################################################### ###############################################################################
###############################################################################
# Main initialization.
var Binary = mp_broadcast.Binary;
# Create configuration properties if they do not exist already.
props.globals.initNode(CA_enabled_pp, 1, "BOOL");
setlistener(CA_enabled_pp, func (n) {
if (getprop("/sim/signals/reinit")) return; # Ignore resets.
CAFire.reset(n.getValue(), SimTime.current_time());
});
props.globals.initNode(MP_share_pp, 1, "BOOL");
props.globals.initNode(crash_fire_pp, 1, "BOOL");
props.globals.initNode(impact_fire_pp, 1, "BOOL");
props.globals.initNode(save_on_exit_pp, 0, "BOOL");
props.globals.initNode(restore_on_startup_pp, 0, "BOOL");
props.globals.initNode(models_enabled_pp, 1, "BOOL");
props.globals.initNode(report_score_pp, 1, "BOOL");
props.globals.initNode(event_file_pp, "", "STRING");
props.globals.initNode(time_hack_pp, "", "STRING");
props.globals.initNode(fire_LOD_pp, 10, "INT");
props.globals.initNode(smoke_LOD_pp, 10, "INT");
SimTime.init();
broadcast = mp_broadcast.BroadcastChannel.new(msg_channel_mpp, parse_msg);
CAFire.init();
# Start the score reporting.
wildfire_score_report_loop_timer.restart(CAFire.GENERATION_DURATION);
setlistener("/sim/signals/exit", func {
if (getprop(report_score_pp) and (CAFire.cells_created > 0))
print_score();
if (getprop(save_on_exit_pp))
CAFire.save_event_log(SAVEDIR ~ "fire_log.xml");
});
# Determine the skip-ahead-to time, if any.
var time_hack = time_string_to_epoch(getprop(time_hack_pp));
if (time_hack > SimTime.current_time()) {
logprint(LOG_ALERT,
"wildfire.nas: Ignored time hack " ~
(SimTime.current_time() - time_hack) ~
" seconds into the future.");
# Skip ahead to current time instead.
time_hack = -1;
} elsif (time_hack > 0) {
logprint(LOG_ALERT,
"wildfire.nas: Time hack " ~
(SimTime.current_time() - time_hack) ~
" seconds ago.");
} else {
# Skip ahead to current time instead.
time_hack = -1;
}
if (getprop(event_file_pp) != "") {
settimer(func {
# Delay loading the log until the terrain is there. Note: hack.
CAFire.load_event_log(getprop(event_file_pp), time_hack);
}, 3);
} elsif (getprop(restore_on_startup_pp)) {
settimer(func {
# Delay loading the log until the terrain is there. Note: hack.
# Restore skips ahead to current time.
CAFire.load_event_log(SAVEDIR ~ "fire_log.xml", -1);
}, 3);
}
# Detect aircraft crash.
setlistener("sim/crashed", func(n) {
if (getprop(crash_fire_pp) and n.getBoolValue())
wildfire.ignite(geo.aircraft_position());
});
# Detect impact.
var impact_node = props.globals.getNode("sim/ai/aircraft/impact/bomb", 1);
setlistener("sim/ai/aircraft/impact/bomb", func(n) {
if (getprop(impact_fire_pp) and n.getBoolValue()){
var node = props.globals.getNode(n.getValue(), 1);
var impactpos = geo.Coord.new();
impactpos.set_latlon
(node.getNode("impact/latitude-deg").getValue(),
node.getNode("impact/longitude-deg").getValue());
wildfire.ignite(impactpos);
}
});
logprint(LOG_INFO, "Wildfire ... initialized.");