- persisted mission_root between repositioning - refactored code (new separate files, function move)
104 lines
2.2 KiB
Plaintext
104 lines
2.2 KiB
Plaintext
|
|
var objects = [];
|
|
var handlers = [];
|
|
|
|
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 extensions_clear = func {
|
|
setsize(objects, 0);
|
|
|
|
foreach (var h; handlers) {
|
|
if (hasmember(h, "stop")) {
|
|
h.stop();
|
|
}
|
|
}
|
|
setsize(handlers, 0);
|
|
}
|
|
|
|
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 extensions_models_init = func() {
|
|
foreach (var h; handlers) {
|
|
if( hasmember(h, "init") ) {
|
|
h.init();
|
|
}
|
|
}
|
|
|
|
foreach(var c; mission_node.getChildren("object")) {
|
|
foreach(var obj; objects) {
|
|
if (c.getValue("type") == obj.type) {
|
|
append(mission_objects, obj.new(c));
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach(var obj; mission_objects) {
|
|
if( hasmember(obj, "init") ) {
|
|
obj.init();
|
|
}
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|