- cleaning/moving data
- can be run as addon (mostly working)
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
|
||||
|
||||
var extensions_load = func {
|
||||
|
||||
globals["__mission"] = {};
|
||||
|
||||
var i = 0;
|
||||
var k = "";
|
||||
|
||||
#load mission extension
|
||||
foreach(var script; mission_node.getChildren("include")) {
|
||||
globals["__mission"][k = "__" ~ i] = {};
|
||||
load_nasal(mission_root ~ "/extensions/" ~ script.getValue(), k);
|
||||
i += 1;
|
||||
}
|
||||
|
||||
#load core extensions
|
||||
foreach(var script; extension_list()) {
|
||||
globals["__mission"][k = "__" ~ i] = {};
|
||||
load_nasal(getprop("/sim/mission/root_path") ~ "/Nasal/extensions/" ~ script, k);
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var extension_add = func (type, h) {
|
||||
if (type == "MissionObject") {
|
||||
append (objects, h);
|
||||
} elsif (type == "Handler") {
|
||||
append (handlers, h);
|
||||
}
|
||||
}
|
||||
|
||||
var extension_list = func {
|
||||
var v = [];
|
||||
var path = getprop("/sim/mission/root_path") ~ "/Nasal/extensions";
|
||||
if((var dir = directory(path)) == nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach(var file; sort(dir, cmp)) {
|
||||
if(size(file) > 4) {
|
||||
if (substr(file, -4) == ".nas") {
|
||||
append(v, file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
var load_nasal = func(file, module) { # (copy-paste from io.nas)
|
||||
var code = call(func compile(io.readfile(file), file), nil, var err = []);
|
||||
if (size(err)) {
|
||||
if (substr(err[0], 0, 12) == "Parse error:") { # hack around Nasal feature
|
||||
var e = split(" at line ", err[0]);
|
||||
if (size(e) == 2) {
|
||||
err[0] = string.join("", [e[0], "\n at ", file, ", line ", e[1], "\n "]);
|
||||
}
|
||||
}
|
||||
for (var i = 1; (var c = caller(i)) != nil; i += 1) {
|
||||
err ~= subvec(c, 2, 2);
|
||||
}
|
||||
debug.printerror(err);
|
||||
return 0;
|
||||
}
|
||||
call(bind(code, globals), nil, nil, globals.__mission[module], err);
|
||||
debug.printerror(err);
|
||||
}
|
||||
@@ -48,4 +48,4 @@ var adjust_payload_action = {
|
||||
del: func,
|
||||
};
|
||||
|
||||
mission.addExtension("MissionObject", adjust_payload_action);
|
||||
mission.extension_add("MissionObject", adjust_payload_action);
|
||||
@@ -14,7 +14,7 @@ var ground_speed = func getprop("/velocities/groundspeed-kt");
|
||||
|
||||
var full_stop = func math.abs(ground_speed()) <= 1;
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
type: "airport-landing-trigger",
|
||||
|
||||
new: func(n) {
|
||||
|
||||
@@ -16,7 +16,7 @@ var ground_speed = func getprop("/velocities/groundspeed-kt");
|
||||
var full_stop = func math.abs(ground_speed()) <= 1;
|
||||
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
type: "area-landing-trigger",
|
||||
|
||||
new: func(n) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
type: "goal",
|
||||
|
||||
new: func(n) {
|
||||
|
||||
@@ -33,7 +33,7 @@ var draw_message = func (s = 1) {
|
||||
window.show();
|
||||
}
|
||||
|
||||
mission.addExtension("Handler", {
|
||||
mission.extension_add("Handler", {
|
||||
init: func {
|
||||
me.listeners = [
|
||||
setlistener(me.node.getNode("goal-state-changed", 1), func me.update()),
|
||||
|
||||
@@ -12,7 +12,7 @@ var goal_group_status = func (group, status) {
|
||||
goal_status(ref.getValue(), status);
|
||||
}
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
type: "goal-resolution-action",
|
||||
|
||||
new: func(n) {
|
||||
|
||||
@@ -129,4 +129,4 @@ var menu_prompt_trigger = {
|
||||
del: func me._window.del(),
|
||||
};
|
||||
|
||||
mission.addExtension("MissionObject", menu_prompt_trigger);
|
||||
mission.extension_add("MissionObject", menu_prompt_trigger);
|
||||
@@ -13,11 +13,12 @@ var show_message = func (m, delay, snd = nil) {
|
||||
setprop("/sim/mission/message/message-delay", delay);
|
||||
setprop("/sim/mission/message/show-message", 1);
|
||||
|
||||
if (snd != nil)
|
||||
if (snd != nil) {
|
||||
mission.play_sound(snd);
|
||||
}
|
||||
}
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
type: "dialog-action",
|
||||
|
||||
new: func(n) {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
var play_sound = nil;
|
||||
var show_message = nil;
|
||||
|
||||
mission.addExtension("Handler", {
|
||||
mission.extension_add("Handler", {
|
||||
init: func {
|
||||
#me.DELAY = 4;
|
||||
me.timer = maketimer(0, func me._hide_msg());
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
|
||||
mission.addExtension("Handler", {
|
||||
mission.extension_add("Handler", {
|
||||
init: func {
|
||||
me.timer = maketimer(0.1, func me._loop());
|
||||
me.timer.start();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
type: "model",
|
||||
|
||||
new: func(n) {
|
||||
@@ -18,7 +18,7 @@ mission.addExtension("MissionObject", {
|
||||
#m.object_N = props.getNode("/sim/mission/objects", 1).addChild("model");
|
||||
#m.position_N = n.getNode("world-position");
|
||||
|
||||
m.model = mission.put_model(m._path, m._coord, m._heading, m._pitch, m._roll);
|
||||
m.model = mission.put_model(getprop("/sim/mission/root_path") ~ m._path, m._coord, m._heading, m._pitch, m._roll);
|
||||
|
||||
if (!m._activated)
|
||||
m._hide();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
var get = mission.get;
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
type: "object-activation-action",
|
||||
|
||||
new: func(n) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
|
||||
type: "point-of-interest",
|
||||
|
||||
@@ -49,7 +49,7 @@ mission.addExtension("MissionObject", {
|
||||
];
|
||||
me._apply_offsets();
|
||||
}
|
||||
me._model = mission.put_model(getprop("/sim/fg-root") ~ me._path, me._mdl_coord);
|
||||
me._model = mission.put_model(getprop("/sim/mission/root_path") ~ me._path, me._mdl_coord);
|
||||
me.node.setValues({
|
||||
"latitude-deg" : me._coord.lat(),
|
||||
"longitude-deg" : me._coord.lon(),
|
||||
|
||||
@@ -82,7 +82,7 @@ var loop = func {
|
||||
poi("hdg", crs - getprop("/orientation/heading-deg"));
|
||||
}
|
||||
|
||||
mission.addExtension("Handler", {
|
||||
mission.extension_add("Handler", {
|
||||
init: func {
|
||||
listeners = [
|
||||
setlistener("/sim/mission/point-of-interest/signals/POI-changed", func update()),
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
# </object>
|
||||
#
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
|
||||
type: "property-trigger",
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
type: "proximity-trigger",
|
||||
|
||||
new: func(n) {
|
||||
|
||||
@@ -53,4 +53,4 @@ var random_action = {
|
||||
del: func,
|
||||
};
|
||||
|
||||
mission.addExtension("MissionObject", random_action);
|
||||
mission.extension_add("MissionObject", random_action);
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
type: "rectangle-area",
|
||||
|
||||
new: func(n) {
|
||||
|
||||
@@ -37,4 +37,4 @@ var refuel_action = {
|
||||
del: func,
|
||||
};
|
||||
|
||||
mission.addExtension("MissionObject", refuel_action);
|
||||
mission.extension_add("MissionObject", refuel_action);
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
type: "single-shot-sound-action",
|
||||
|
||||
new: func(n) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
mission.addExtension("Handler", {
|
||||
mission.extension_add("Handler", {
|
||||
init: func {
|
||||
me.timer = maketimer(0.02, func me._loop());
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ __mission.timer = {current_time: nil};
|
||||
|
||||
var dtN = props.getNode("/sim/time/delta-sec");
|
||||
|
||||
mission.addExtension("MissionObject", {
|
||||
mission.extension_add("MissionObject", {
|
||||
type: "timer-trigger",
|
||||
|
||||
new: func(n) {
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
|
||||
var scr_x = func getprop("/sim/startup/xsize");
|
||||
var scr_y = func getprop("/sim/startup/ysize");
|
||||
|
||||
var init_gui = func {
|
||||
# do not reinit gui
|
||||
foreach(var menu; props.getNode("/sim/menubar/default").getChildren("menu")) {
|
||||
if (menu.getValue("label") == "Missions") {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
gui.Dialog.new("/sim/gui/dialogs/mission-browser/dialog",
|
||||
getprop("/sim/mission/root_path") ~ "/GUI/mission_browser.xml");
|
||||
|
||||
var h = {
|
||||
label: "Missions",
|
||||
item: [
|
||||
{ #0
|
||||
label: "Mission browser",
|
||||
binding: {
|
||||
command: "nasal",
|
||||
script: "gui.showDialog('mission-browser')",
|
||||
},
|
||||
},
|
||||
{ #1
|
||||
label: "Toggle compass",
|
||||
},
|
||||
{ #2
|
||||
label: "Stop mission",
|
||||
binding: {
|
||||
command: "nasal",
|
||||
script: "mission.stop_mission()",
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
props.getNode("/sim/menubar/default").addChild("menu").setValues(h);
|
||||
fgcommand("gui-redraw");
|
||||
}
|
||||
|
||||
var fdm_init_listener = _setlistener("/sim/signals/fdm-initialized", func {
|
||||
removelistener(fdm_init_listener);
|
||||
|
||||
setprop("/sim/sound/chatter/enabled", 1);
|
||||
setprop("/sim/sound/chatter/volume", 1.0);
|
||||
|
||||
init_gui();
|
||||
|
||||
print("Mission initalized");
|
||||
});
|
||||
|
||||
+45
-162
@@ -9,64 +9,21 @@ var handlers = [];
|
||||
|
||||
var hasmember = view.hasmember;
|
||||
|
||||
var addExtension = func (type, h) {
|
||||
if (type == "MissionObject") {
|
||||
append (objects, h);
|
||||
} elsif (type == "Handler") {
|
||||
append (handlers, h);
|
||||
}
|
||||
}
|
||||
|
||||
var extension_list = func {
|
||||
var v = [];
|
||||
var path = getprop("/sim/mission/root_path") ~ "/Nasal/extensions";
|
||||
if((var dir = directory(path)) == nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach(var file; sort(dir, cmp)) {
|
||||
if(size(file) > 4) {
|
||||
if (substr(file, -4) == ".nas") {
|
||||
append(v, file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
var load_nasal = func(file, module) { # (copy-paste from io.nas)
|
||||
var code = call(func compile(io.readfile(file), file), nil, var err = []);
|
||||
if (size(err)) {
|
||||
if (substr(err[0], 0, 12) == "Parse error:") { # hack around Nasal feature
|
||||
var e = split(" at line ", err[0]);
|
||||
if (size(e) == 2) {
|
||||
err[0] = string.join("", [e[0], "\n at ", file, ", line ", e[1], "\n "]);
|
||||
}
|
||||
}
|
||||
for (var i = 1; (var c = caller(i)) != nil; i += 1) {
|
||||
err ~= subvec(c, 2, 2);
|
||||
}
|
||||
debug.printerror(err);
|
||||
return 0;
|
||||
}
|
||||
call(bind(code, globals), nil, nil, globals.__mission[module], err);
|
||||
debug.printerror(err);
|
||||
}
|
||||
|
||||
var load_preferences = func() {
|
||||
foreach (var a; directory(mission_root))
|
||||
if (a == "preferences.xml") {
|
||||
io.read_properties(mission_root ~ "/preferences.xml", props.getNode(""));
|
||||
break;
|
||||
}
|
||||
foreach (var a; directory(mission_root)) {
|
||||
if (a == "preferences.xml") {
|
||||
io.read_properties(mission_root ~ "/preferences.xml", props.getNode(""));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var start_mission = func(name) {
|
||||
if (mission_started) return;
|
||||
if (mission_started) {
|
||||
return;
|
||||
}
|
||||
|
||||
# FIXME - ResourceLoader in FG Source
|
||||
# FIXME - FIX ResourceLoader in FG Source
|
||||
mission_root = resolvepath("/Aircraft/Missions/" ~ name);
|
||||
if (mission_root == "") {
|
||||
return;
|
||||
@@ -78,32 +35,18 @@ var start_mission = func(name) {
|
||||
io.read_properties(mission_root ~ "/mission.xml", mission_node);
|
||||
|
||||
var presets = mission_node.getChild("presets");
|
||||
if (presets != nil) {
|
||||
props.copy(presets, props.getNode("/sim/presets"));
|
||||
fgcommand("reposition");
|
||||
}
|
||||
# causes FG reload and reinit all data
|
||||
# if (presets != nil) {
|
||||
# props.copy(presets, props.getNode("/sim/presets"));
|
||||
# fgcommand("reposition");
|
||||
# }
|
||||
|
||||
var timeofday = mission_node.getChild("timeofday");
|
||||
if (timeofday != nil) {
|
||||
fgcommand("timeofday", props.Node.new({ "timeofday" : timeofday.getValue() }));
|
||||
}
|
||||
|
||||
globals["__mission"] = {};
|
||||
|
||||
#load_extensions();
|
||||
|
||||
var i = 0;
|
||||
var k = "";
|
||||
foreach(var script; mission_node.getChildren("include")) {
|
||||
globals["__mission"][k = "__" ~ i] = {};
|
||||
load_nasal(mission_root ~ "/extensions/" ~ script.getValue(), k);
|
||||
i += 1;
|
||||
}
|
||||
foreach(var script; extension_list()) {
|
||||
globals["__mission"][k = "__" ~ i] = {};
|
||||
load_nasal(getprop("/sim/fg-root") ~ "/Nasal/mission/extensions/" ~ script, k);
|
||||
i += 1;
|
||||
}
|
||||
extensions_load();
|
||||
|
||||
settimer (func _start_mission(), 0);
|
||||
}
|
||||
@@ -128,9 +71,11 @@ var _start_mission = func {
|
||||
}
|
||||
}
|
||||
|
||||
foreach(var obj; mission_objects)
|
||||
if( hasmember(obj, "init") )
|
||||
foreach(var obj; mission_objects) {
|
||||
if( hasmember(obj, "init") ) {
|
||||
obj.init();
|
||||
}
|
||||
}
|
||||
|
||||
mission_started = 1;
|
||||
}
|
||||
@@ -142,16 +87,23 @@ var splash_screen = func {
|
||||
}
|
||||
|
||||
var stop_mission = func {
|
||||
if (!mission_started) return;
|
||||
if (!mission_started) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach(var obj; mission_objects) obj.del();
|
||||
|
||||
foreach(var obj; mission_objects) {
|
||||
obj.del();
|
||||
}
|
||||
|
||||
setsize(mission_objects, 0);
|
||||
setsize(objects, 0);
|
||||
|
||||
foreach (var h; handlers)
|
||||
if (hasmember(h, "stop"))
|
||||
foreach (var h; handlers) {
|
||||
if (hasmember(h, "stop")) {
|
||||
h.stop();
|
||||
}
|
||||
}
|
||||
setsize(handlers, 0);
|
||||
|
||||
delete(globals, "__mission");
|
||||
@@ -161,15 +113,19 @@ var stop_mission = func {
|
||||
|
||||
|
||||
var activate_object = func(name, start = 1) {
|
||||
if (name == nil)
|
||||
if (name == nil) {
|
||||
return;
|
||||
foreach(var obj; mission_objects)
|
||||
}
|
||||
|
||||
foreach(var obj; mission_objects) {
|
||||
if (obj.name == name) {
|
||||
if (start)
|
||||
if (start) {
|
||||
obj.start();
|
||||
else
|
||||
} else {
|
||||
obj.stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -192,11 +148,12 @@ var put_model = func(path, coord, heading = 0, pitch = 0, roll = 0) {
|
||||
var models = props.getNode("/models");
|
||||
var model = nil;
|
||||
|
||||
for (var i = 0; 1; i += 1)
|
||||
for (var i = 0; 1; i += 1) {
|
||||
if (models.getChild("model", i, 0) == nil) {
|
||||
model = models.getChild("model", i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var model_path = model.getPath();
|
||||
|
||||
@@ -231,9 +188,11 @@ var model = {
|
||||
};
|
||||
|
||||
var get = func(node, path, default = nil) {
|
||||
if ( (var value = node.getValue(path)) == nil)
|
||||
if ( (var value = node.getValue(path)) == nil) {
|
||||
default;
|
||||
else value;
|
||||
} else {
|
||||
value;
|
||||
}
|
||||
}
|
||||
|
||||
var play_sound = func (file) {
|
||||
@@ -245,80 +204,4 @@ var play_sound = func (file) {
|
||||
fgcommand("play-audio-sample", props.Node.new(sound));
|
||||
}
|
||||
|
||||
var scr_x = func getprop("/sim/startup/xsize");
|
||||
var scr_y = func getprop("/sim/startup/ysize");
|
||||
|
||||
var init_gui = func {
|
||||
gui.Dialog.new("/sim/gui/dialogs/mission-browser/dialog", getprop("/sim/mission/root_path") ~ "/GUI/mission_browser.xml");
|
||||
|
||||
#reset handling
|
||||
foreach(var menu; props.getNode("/sim/menubar/default").getChildren("menu"))
|
||||
if (menu.getValue("label") == "Missions")
|
||||
return;
|
||||
#/reset handling
|
||||
|
||||
var h = {
|
||||
label: "Missions",
|
||||
item: [
|
||||
{ #0
|
||||
label: "Mission browser",
|
||||
binding: {
|
||||
command: "nasal",
|
||||
script: "gui.showDialog('mission-browser')",
|
||||
},
|
||||
},
|
||||
{ #1
|
||||
label: "Toggle compass",
|
||||
},
|
||||
{ #2
|
||||
label: "Stop mission",
|
||||
binding: {
|
||||
command: "nasal",
|
||||
script: "mission.stop_mission()",
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
props.getNode("/sim/menubar/default").addChild("menu").setValues(h);
|
||||
fgcommand("gui-redraw");
|
||||
}
|
||||
|
||||
###
|
||||
var save_data = func {
|
||||
var path = getprop("/sim/fg-home") ~ "/Export/state.xml";
|
||||
|
||||
var fdm_node = props.getNode("fdm");
|
||||
var engines_node = props.getNode("engines");
|
||||
var rotors_node = props.getNode("rotors");
|
||||
var systems_node = props.getNode("systems");
|
||||
var controls_node = props.getNode("controls");
|
||||
|
||||
var data = props.Node.new();
|
||||
|
||||
props.copy(fdm_node, data.getNode("fdm", 1));
|
||||
props.copy(engines_node, data.getNode("engines", 1));
|
||||
props.copy(rotors_node, data.getNode("rotors", 1));
|
||||
props.copy(systems_node, data.getNode("systems", 1));
|
||||
props.copy(controls_node, data.getNode("controls", 1));
|
||||
|
||||
io.write_properties(path, data);
|
||||
data.remove();
|
||||
}
|
||||
|
||||
var load_data = func {
|
||||
var path = getprop("/sim/fg-home") ~ "/Export/state.xml";
|
||||
io.read_properties(path, "/");
|
||||
}
|
||||
|
||||
###
|
||||
|
||||
var fdm_init_listener = _setlistener("/sim/signals/fdm-initialized", func {
|
||||
removelistener(fdm_init_listener);
|
||||
setprop("/sim/sound/chatter/enabled", 1);
|
||||
setprop("/sim/sound/chatter/volume", 1.0);
|
||||
init_gui();
|
||||
|
||||
print("Mission initalized");
|
||||
});
|
||||
|
||||
print("Mission loaded");
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
var save_data = func {
|
||||
var path = getprop("/sim/fg-home") ~ "/Export/state.xml";
|
||||
|
||||
var fdm_node = props.getNode("fdm");
|
||||
var engines_node = props.getNode("engines");
|
||||
var rotors_node = props.getNode("rotors");
|
||||
var systems_node = props.getNode("systems");
|
||||
var controls_node = props.getNode("controls");
|
||||
|
||||
var data = props.Node.new();
|
||||
|
||||
props.copy(fdm_node, data.getNode("fdm", 1));
|
||||
props.copy(engines_node, data.getNode("engines", 1));
|
||||
props.copy(rotors_node, data.getNode("rotors", 1));
|
||||
props.copy(systems_node, data.getNode("systems", 1));
|
||||
props.copy(controls_node, data.getNode("controls", 1));
|
||||
|
||||
io.write_properties(path, data);
|
||||
data.remove();
|
||||
}
|
||||
|
||||
var load_data = func {
|
||||
var path = getprop("/sim/fg-home") ~ "/Export/state.xml";
|
||||
io.read_properties(path, "/");
|
||||
}
|
||||
Reference in New Issue
Block a user