From b6b4b5fe77239c6f0e367b6b289f6b09bd9bfc1b Mon Sep 17 00:00:00 2001 From: stuart Date: Sat, 3 May 2008 19:46:47 +0000 Subject: [PATCH] Add additional runway selection so the runway in use doesn't change as you roll past mid-point. Also fix possible bug for north-south runways. --- gui/dialogs/chat-menu.xml | 165 +++++++++++++++++++++----------------- 1 file changed, 92 insertions(+), 73 deletions(-) diff --git a/gui/dialogs/chat-menu.xml b/gui/dialogs/chat-menu.xml index c229af03f..9b66a5cc6 100644 --- a/gui/dialogs/chat-menu.xml +++ b/gui/dialogs/chat-menu.xml @@ -48,7 +48,7 @@ - left + left /sim/multiplay/chat-menu/entry[1] true @@ -130,7 +130,7 @@ = 180) course -= 360; + while (course < -180) course += 360; + + var deviation = math.abs(course); + if (deviation < max) { active_runway = r; max = deviation; } } + + # It may be the case that we're taxiing down the runway, past the mid-point. + # If the aircraft is facing the "wrong" way for this runway, then take the + # reciprocal runway. + var heading = getprop("/orientation/heading-magnetic-deg"); + var deviation = heading - airport.runways[active_runway].heading; + + while (deviation >= 180) deviation -= 360; + while (deviation < -180) deviation += 360; + deviation = math.abs(deviation); + + if (deviation > 90) + { + var number = math.mod(num(substr(active_runway, 0, 2)) + 18, 36); + var side = substr(active_runway, 2, 1); + active_runway = sprintf("%02d%s", number, side == "R" ? "L" : side == "L" ? "R" : side); + } } else - { + { var wind_speed = getprop("/environment/wind-speed-kt"); var wind_from = wind_speed ? getprop("/environment/wind-from-heading-deg") : 270; var max = -1; foreach (var r; keys(airport.runways)) { var curr = airport.runways[r]; - + var wind = wind_from - curr.heading; while (wind >= 180) wind -= 360; while (wind < -180) wind += 360; - + var deviation = math.abs(wind) + 1e-20; var v = (0.01 * curr.length + 0.01 * curr.width) / deviation; @@ -232,23 +251,23 @@ max = v; active_runway = r; } - } + } } - - # Find our distance and cardinal direction to the airport. + + # Find our distance and cardinal direction to the airport. var directions = split(",", "North,North East,East,South East,South,South West,West,North West"); var loc = geo.aircraft_position(); - var airportloc = geo.Coord.new(); + var airportloc = geo.Coord.new(); airportloc.set_latlon(airport.lat, airport.lon, airport.elevation); - + # We want the course _from_ the airport to the aircraft - for reporting ".. approaching from the SW" var airport_course = airportloc.course_to(loc); var airport_distance = int((airportloc.distance_to(loc) / 1609) + 0.5); - + # Get an index into our array of directions. var dir = int(math.mod((airport_course + 22.5), 360) / 45); var airport_direction = directions[dir]; - + # Now launch the keyboard listener. var kbdevent = setlistener("/devices/status/keyboard/event", func (event) { @@ -257,58 +276,58 @@ return; var key = event.getNode("key"); - + if (handle_key(key.getValue())) key.setValue(-1); # drop key event }); - + var handle_key = func (key) { # We only handle keys 0-9 and Esc - - if (key == 27) + + if (key == 27) { # escape -> cancel removelistener(kbdevent); gui.popdown(); fgcommand("dialog-close", props.Node.new({"dialog-name": "chat-menu"})); return 1; - } - + } + if ((key < `0`) or (key > `9`)) { # pass the event back. - return 0; + return 0; } - + if (key == `0`) { - # Go back one level. + # Go back one level. text = ""; - + if (pos.getName() != "config") { # Build up the chat string again. pos = pos.getParent(); var p = pos; - - while ((p.getName() != "config") and + + while ((p.getName() != "config") and (p.getChild("name").getValue() != nil)) { var t = string.trim(p.getChild("name").getValue()); - - # Entries that begin with "[" are silent. + + # Entries that begin with "[" are silent. if (t[0] != `[`) - { + { text = t ~ " " ~ text; } - + p = p.getParent(); - } + } } - + updateDialog(); } - + if (key == `1`) { # Go to edit mode using the inline editor. @@ -317,18 +336,18 @@ multiplayer.compose_message(text); fgcommand("dialog-close", props.Node.new({"dialog-name": "chat-menu"})); } - + if ((key > `1`) and (key <= `9`)) { # Select the appropriate new node and update. # The index starts from position 2. - var i = key - `2`; - + var i = key - `2`; + if (i > (size(pos.getChildren("menu")) -1)) { # Drop out if the user has entered a too large value. return 0; - } + } var t = entryNodes[i].getValue(); @@ -351,16 +370,16 @@ fgcommand("dialog-close", props.Node.new({"dialog-name": "chat-menu"})); } else - { + { # We've got more tree to traverse. updateDialog(); } } - + # If we got here, we consumed the event - return 1; + return 1; } - + # Substitute simple values into the string. # The values we handle are # @@ -373,47 +392,47 @@ # var subvals = func (str) { var t = ""; - - for (var p = 0; p < size(str); p += 1) + + for (var p = 0; p < size(str); p += 1) { - if (str[p] == `!`) t ~= airport_direction; - elsif (str[p] == `^`) t ~= airport_distance; + if (str[p] == `!`) t ~= airport_direction; + elsif (str[p] == `^`) t ~= airport_distance; elsif (str[p] == `(`) t ~= active_runway; - elsif (str[p] == `*`) t ~= airport.name; + elsif (str[p] == `*`) t ~= airport.name; elsif (str[p] == `%`) t ~= type; elsif (str[p] == `#`) t ~= callsign; - elsif (str[p] == `$`) t ~= altitude; + elsif (str[p] == `$`) t ~= altitude; else t ~= chr(str[p]); } - + return t; } var updateDialog = func { - + var children = pos.getChildren("menu"); var i = 0; foreach(var c; children) { var p = i + 2; var txt = p ~ ': ' ~ subvals(c.getChild("name").getValue()); - + if (i < 9) - { + { entryNodes[i].setValue(txt); } i = i + 1; } - + # Set the rest of the dialog to blank. while (i <= 9) - { + { entryNodes[i].setValue(""); i = i + 1; } - + # Write the popup. - gui.popupTip(text, 1000000); + gui.popupTip(text, 1000000); } # Start by updating the dialog.