diff --git a/src/Scripting/NasalSys.cxx b/src/Scripting/NasalSys.cxx index 1f952b325..72a99bc93 100644 --- a/src/Scripting/NasalSys.cxx +++ b/src/Scripting/NasalSys.cxx @@ -737,12 +737,15 @@ void FGNasalSys::init() // Now load the various source files in the Nasal directory simgear::Dir nasalDir(SGPath(globals->get_fg_root(), "Nasal")); - simgear::PathList scripts = nasalDir.children(simgear::Dir::TYPE_FILE, ".nas"); - - for (unsigned int i=0; i0) + { + SGPropertyNode* nasal = globals->get_props()->getNode("nasal"); + SGPropertyNode* module_node = nasal->getChild(moduleName,0,true); + for (unsigned int i=0; igetChild("file",i,true); + pFileNode->setStringValue(scripts[i].c_str()); + } + if (!module_node->hasChild("enabled",0)) + { + SGPropertyNode* node = module_node->getChild("enabled",0,true); + node->setBoolValue(true); + node->setAttribute(SGPropertyNode::USERARCHIVE,true); + } + } +} + // Loads the scripts found under /nasal in the global tree void FGNasalSys::loadPropertyScripts() { @@ -785,33 +819,51 @@ void FGNasalSys::loadPropertyScripts() for(int i=0; inChildren(); i++) { SGPropertyNode* n = nasal->getChild(i); + bool is_loaded = false; const char* module = n->getName(); if(n->hasChild("module")) module = n->getStringValue("module"); + if (n->getBoolValue("enabled",true)) + { + // allow multiple files to be specified within a single + // Nasal module tag + int j = 0; + SGPropertyNode *fn; + bool file_specified = false; + while((fn = n->getChild("file", j)) != NULL) { + file_specified = true; + const char* file = fn->getStringValue(); + SGPath p(file); + if (!p.isAbsolute() || !p.exists()) + { + p = globals->resolve_maybe_aircraft_path(file); + } + loadModule(p, module); + j++; + } + + const char* src = n->getStringValue("script"); + if(!n->hasChild("script")) src = 0; // Hrm... + if(src) + createModule(module, n->getPath().c_str(), src, strlen(src)); + + if(!file_specified && !src) + { + // module no longer exists - clear the archived "enable" flag + n->setAttribute(SGPropertyNode::USERARCHIVE,false); + SGPropertyNode* node = n->getChild("enabled",0,false); + if (node) + node->setAttribute(SGPropertyNode::USERARCHIVE,false); - // allow multiple files to be specified within a single - // Nasal module tag - int j = 0; - SGPropertyNode *fn; - bool file_specified = false; - while((fn = n->getChild("file", j)) != NULL) { - file_specified = true; - const char* file = fn->getStringValue(); - SGPath p = globals->resolve_maybe_aircraft_path(file); - loadModule(p, module); - j++; + SG_LOG(SG_NASAL, SG_ALERT, "Nasal error: " << + "no or