]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIScenario.cxx
David Culp:
[flightgear.git] / src / AIModel / AIScenario.cxx
index 9742db92c340f2d4dea1bea9a4e676f3cef45ca8..6fd72613a78ace5a514aadc1e069af041f58e04f 100644 (file)
@@ -16,6 +16,7 @@
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
+#include <cstdio>
 
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/debug/logstream.hxx>
 #include "AIScenario.hxx"
 #include "AIFlightPlan.hxx"
 
+static list<string>
+getAllStringNodeVals(const char* name, SGPropertyNode * entry_node);
+static list<ParkPosition>
+getAllOffsetNodeVals(const char* name, SGPropertyNode * entry_node);
 
-
-FGAIScenario::FGAIScenario(string &filename)
+FGAIScenario::FGAIScenario(const string &filename)
 {
   int i;
   SGPath path( globals->get_fg_root() );
+  
+//   cout << "/Data/AI/" << filename << endl;
+  
   path.append( ("/Data/AI/" + filename + ".xml").c_str() );
   SGPropertyNode root;
-
+  readProperties(path.str(), &root);
+  
+//   cout <<"path " << path.str() << endl;
+  
   try {
       readProperties(path.str(), &root);
   } catch (const sg_exception &e) {
       SG_LOG(SG_GENERAL, SG_ALERT,
        "Incorrect path specified for AI scenario: ");
+       
        cout << path.str() << endl;
+      
       return;
   }
 
   entries.clear();
   SGPropertyNode * node = root.getNode("scenario");
   for (i = 0; i < node->nChildren(); i++) { 
-     //cout << "Reading entry " << i << endl;        
+     
+//      cout << "Reading entity data entry " << i << endl;        
+     
      SGPropertyNode * entry_node = node->getChild(i);
 
      FGAIModelEntity* en = new FGAIModelEntity;
@@ -71,18 +85,33 @@ FGAIScenario::FGAIScenario(string &filename)
      en->roll           = entry_node->getDoubleValue("roll", 0.0); 
      en->azimuth        = entry_node->getDoubleValue("azimuth", 0.0); 
      en->elevation      = entry_node->getDoubleValue("elevation", 0.0); 
-     en->rudder         = entry_node->getDoubleValue("rudder", 0.0);
-     en->strength       = entry_node->getDoubleValue("strength-fps", 0.0);
+     en->rudder         = entry_node->getFloatValue("rudder", 0.0);
+     en->strength       = entry_node->getDoubleValue("strength-fps", 8.0);
+     en->turb_strength  = entry_node->getDoubleValue("strength-norm", 1.0);  
      en->diameter       = entry_node->getDoubleValue("diameter-ft", 0.0);
+     en->height_msl     = entry_node->getDoubleValue("height-msl", 5000.0);
      en->eda            = entry_node->getDoubleValue("eda", 0.007);
      en->life           = entry_node->getDoubleValue("life", 900.0);
      en->buoyancy       = entry_node->getDoubleValue("buoyancy", 0);
      en->wind_from_east = entry_node->getDoubleValue("wind_from_east", 0);
      en->wind_from_north = entry_node->getDoubleValue("wind_from_north", 0);
-     en->wind            = entry_node->getBoolValue("wind", false);
-     en->cd              = entry_node->getDoubleValue  ("cd", 0.029); 
-     en->mass            = entry_node->getDoubleValue  ("mass", 0.007); 
-
+     en->wind            = entry_node->getBoolValue  ("wind", false);
+     en->cd              = entry_node->getDoubleValue("cd", 0.029); 
+     en->mass            = entry_node->getDoubleValue("mass", 0.007); 
+     en->radius          = entry_node->getDoubleValue("turn-radius-ft", 2000);
+     en->TACAN_channel_ID= entry_node->getStringValue("TACAN-channel-ID", "029Y");
+     en->name            = entry_node->getStringValue("name", "Nimitz");
+     en->pennant_number  = entry_node->getStringValue("pennant-number", "");
+     en->wire_objects     = getAllStringNodeVals("wire", entry_node);
+     en->catapult_objects = getAllStringNodeVals("catapult", entry_node);
+     en->solid_objects    = getAllStringNodeVals("solid", entry_node);
+     en->ppositions       = getAllOffsetNodeVals("parking-pos", entry_node);
+     en->max_lat          = entry_node->getDoubleValue("max-lat", 0);
+     en->min_lat          = entry_node->getDoubleValue("min-lat",0);
+     en->max_long          = entry_node->getDoubleValue("max-long", 0);
+     en->min_long          = entry_node->getDoubleValue("min-long", 0);
+     list<ParkPosition> flolspos = getAllOffsetNodeVals("flols-pos", entry_node);
+     en->flols_offset     = flolspos.front().offset;
 
      en->fp             = NULL;
      if (en->flightplan != ""){
@@ -102,7 +131,7 @@ FGAIScenario::~FGAIScenario()
 }
 
 
-FGAIModelEntity*
+FGAIModelEntity* const
 FGAIScenario::getNextEntry( void )
 {
   if (entries.size() == 0) return 0;
@@ -118,5 +147,44 @@ int FGAIScenario::nEntries( void )
   return entries.size();
 }
 
+static list<string>
+getAllStringNodeVals(const char* name, SGPropertyNode * entry_node)
+{
+  list<string> retval;
+  int i=0;
+  do {
+    char nodename[100];
+    snprintf(nodename, sizeof(nodename), "%s[%d]", name, i);
+    const char* objname = entry_node->getStringValue(nodename, 0);
+    if (objname == 0)
+      return retval;
+
+    retval.push_back(string(objname));
+    ++i;
+  } while (1);
+
+  return retval;
+}
+
+static list<ParkPosition>
+getAllOffsetNodeVals(const char* name, SGPropertyNode * entry_node)
+{
+  list<ParkPosition> retval;
+
+  vector<SGPropertyNode_ptr>::const_iterator it;
+  vector<SGPropertyNode_ptr> children = entry_node->getChildren(name);
+  for (it = children.begin(); it != children.end(); ++it) {
+    string name = (*it)->getStringValue("name", "unnamed");
+    double offset_x = (*it)->getDoubleValue("x-offset-m", 0);
+    double offset_y = (*it)->getDoubleValue("y-offset-m", 0);
+    double offset_z = (*it)->getDoubleValue("z-offset-m", 0);
+    double hd = (*it)->getDoubleValue("heading-offset-deg", 0);
+    ParkPosition pp(name, Point3D(offset_x, offset_y, offset_z), hd);
+    retval.push_back(pp);
+  }
+
+  return retval;
+}
+
 // end scenario.cxx