Use separate non-scrolling message display for tutorials.
This commit is contained in:
parent
e4ec7a6e56
commit
645cfac648
1 changed files with 17 additions and 19 deletions
|
@ -16,6 +16,10 @@ var step_iter_count = 0; # number or step loop iterations
|
||||||
var last_step_time = nil; # for set_targets() eta calculation
|
var last_step_time = nil; # for set_targets() eta calculation
|
||||||
var audio_dir = nil;
|
var audio_dir = nil;
|
||||||
|
|
||||||
|
# Screen display. On bottom of screen, with no auto-scroll.
|
||||||
|
var display = screen.window.new(nil, 30, 5, 0);
|
||||||
|
display.sticky = 0; # don't turn on; makes scrolling up messages jump left and right
|
||||||
|
|
||||||
# property nodes (to be initialized with listener)
|
# property nodes (to be initialized with listener)
|
||||||
var markerN = nil;
|
var markerN = nil;
|
||||||
var headingN = nil;
|
var headingN = nil;
|
||||||
|
@ -74,7 +78,7 @@ var startTutorial = func {
|
||||||
|
|
||||||
var dir = tutorialN.getNode("audio-dir");
|
var dir = tutorialN.getNode("audio-dir");
|
||||||
if (dir != nil)
|
if (dir != nil)
|
||||||
audio_dir = getprop("/sim/fg-root") ~ "/" ~ dir.getValue() ~ "/";
|
audio_dir = getprop("/sim/fg-root") ~ "/" ~ dir.getValue();
|
||||||
else
|
else
|
||||||
audio_dir = "";
|
audio_dir = "";
|
||||||
|
|
||||||
|
@ -101,6 +105,7 @@ var startTutorial = func {
|
||||||
# <init>
|
# <init>
|
||||||
do_group(tutorialN.getNode("init"));
|
do_group(tutorialN.getNode("init"));
|
||||||
is_running(1); # needs to be after "presets-commit"
|
is_running(1); # needs to be after "presets-commit"
|
||||||
|
display.show();
|
||||||
|
|
||||||
# Pick up any weather conditions/scenarios set
|
# Pick up any weather conditions/scenarios set
|
||||||
setprop("/environment/rebuild-layers", getprop("/environment/rebuild-layers") + 1);
|
setprop("/environment/rebuild-layers", getprop("/environment/rebuild-layers") + 1);
|
||||||
|
@ -116,6 +121,7 @@ var stopTutorial = func {
|
||||||
set_properties(end);
|
set_properties(end);
|
||||||
run_nasal(end);
|
run_nasal(end);
|
||||||
set_view(end) or view.point.restore();
|
set_view(end) or view.point.restore();
|
||||||
|
settimer(func() { if (!is_running()) { display.close(); } }, 10);
|
||||||
}
|
}
|
||||||
set_marker();
|
set_marker();
|
||||||
is_running(0);
|
is_running(0);
|
||||||
|
@ -136,7 +142,7 @@ var step_tutorial = func(id) {
|
||||||
|
|
||||||
# Check to ensure that this is the currently running tutorial.
|
# Check to ensure that this is the currently running tutorial.
|
||||||
id == loop_id or return;
|
id == loop_id or return;
|
||||||
|
|
||||||
var continue_after = func(n, w) {
|
var continue_after = func(n, w) {
|
||||||
settimer(func { step_tutorial(id) }, w);
|
settimer(func { step_tutorial(id) }, w);
|
||||||
}
|
}
|
||||||
|
@ -145,7 +151,7 @@ var step_tutorial = func(id) {
|
||||||
if (current_step >= size(steps)) {
|
if (current_step >= size(steps)) {
|
||||||
var end = tutorialN.getNode("end");
|
var end = tutorialN.getNode("end");
|
||||||
say_message(end, "Tutorial finished.");
|
say_message(end, "Tutorial finished.");
|
||||||
say_message(nil, "Deviations: " ~ num_errors);
|
#say_message(nil, "Deviations: " ~ num_errors);
|
||||||
stopTutorial();
|
stopTutorial();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -162,7 +168,7 @@ var step_tutorial = func(id) {
|
||||||
step_countN.setIntValue(step_iter_count = 0);
|
step_countN.setIntValue(step_iter_count = 0);
|
||||||
|
|
||||||
do_group(step, "Tutorial step " ~ current_step);
|
do_group(step, "Tutorial step " ~ current_step);
|
||||||
|
|
||||||
# A <wait> tag affects only the initial entry to the step
|
# A <wait> tag affects only the initial entry to the step
|
||||||
var w = read_int(step, "wait", step_interval);
|
var w = read_int(step, "wait", step_interval);
|
||||||
return continue_after(step, w);
|
return continue_after(step, w);
|
||||||
|
@ -388,10 +394,8 @@ var lastmsgcount = 0;
|
||||||
var say_message = func(node, default = nil) {
|
var say_message = func(node, default = nil) {
|
||||||
var msg = default;
|
var msg = default;
|
||||||
var audio = nil;
|
var audio = nil;
|
||||||
var is_error = 0;
|
|
||||||
|
|
||||||
if (node != nil) {
|
if (node != nil) {
|
||||||
is_error = node.getName() == "error";
|
|
||||||
|
|
||||||
var m = node.getChildren("message");
|
var m = node.getChildren("message");
|
||||||
if (size(m))
|
if (size(m))
|
||||||
|
@ -402,23 +406,17 @@ var say_message = func(node, default = nil) {
|
||||||
audio = a[rand() * size(a)].getValue();
|
audio = a[rand() * size(a)].getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg != last_messageN.getValue() or (is_error and lastmsgcount == 1)) {
|
if (msg != last_messageN.getValue()) {
|
||||||
# Error messages are only displayed every 10 seconds (2 iterations)
|
# Messages are only displayed if they change
|
||||||
# Other messages are only displayed if they change
|
|
||||||
if (audio != nil) {
|
if (audio != nil) {
|
||||||
var prop = { path : audio_dir, file : audio };
|
var prop = { path : audio_dir, file : audio, volume : 1.0 };
|
||||||
fgcommand("play-audio-sample", props.Node.new(prop));
|
fgcommand("play-audio-sample", props.Node.new(prop));
|
||||||
screen.log.write(msg, 1, 1, 1);
|
|
||||||
} elsif (msg != nil) {
|
|
||||||
setprop("/sim/messages/copilot", msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg != nil)
|
if (msg != nil) {
|
||||||
|
display.write(msg, 1, 1, 1);
|
||||||
last_messageN.setValue(msg);
|
last_messageN.setValue(msg);
|
||||||
|
}
|
||||||
lastmsgcount = 0;
|
|
||||||
} else {
|
|
||||||
lastmsgcount += 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -449,7 +447,7 @@ var run_nasal = func(node) {
|
||||||
|
|
||||||
|
|
||||||
var say = func(what, who = "copilot", delay = 0) {
|
var say = func(what, who = "copilot", delay = 0) {
|
||||||
settimer(func { setprop("/sim/messages/", who, what) }, delay);
|
settimer(func { display.write(what, 1, 1, 1) }, delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue