]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/performancedb.cxx
toggle fullscreen: also adapt GUI plane when resizing
[flightgear.git] / src / AIModel / performancedb.cxx
index 3f9aafa6893f704d496f68d89a9308ef263be529..a5230a59a1f3d7a196bed6ba88720a0b1f4be053 100644 (file)
@@ -1,3 +1,11 @@
+#ifdef HAVE_CONFIG_H
+  #include "config.h"
+#endif
+
+#include "performancedb.hxx"
+
+#include <boost/foreach.hpp>
+
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/props/props.hxx>
 #include <simgear/props/props_io.hxx>
@@ -7,7 +15,7 @@
 #include <iostream>
 #include <fstream>
 
-#include "performancedb.hxx"
+#include "performancedata.hxx"
 
 using std::string;
 using std::cerr;
@@ -32,59 +40,87 @@ void PerformanceDB::registerPerformanceData(const std::string& id, PerformanceDa
     _db[id] = data;
 }
 
-void PerformanceDB::registerPerformanceData(const std::string& id, const std::string& filename) {
-    registerPerformanceData(id, new PerformanceData(filename));
-}
-
-PerformanceData* PerformanceDB::getDataFor(const std::string& id) {
-    if (_db.find(id) == _db.end()) // id not found -> return jet_transport data
+PerformanceData* PerformanceDB::getDataFor(const string& acType, const string& acClass)
+{
+  // first, try with the specific aircraft type, such as 738 or A322
+    if (_db.find(acType) != _db.end()) {
+        return _db[acType];
+    }
+    
+    string alias = findAlias(acType);
+    if (_db.find(alias) != _db.end()) {
+      return _db[alias];
+    }
+  
+    SG_LOG(SG_AI, SG_INFO, "no performance data for " << acType);
+  
+    if (_db.find(acClass) == _db.end()) {
         return _db["jet_transport"];
-
-    return _db[id];
+    }
+  
+    return _db[acClass];
 }
 
-void PerformanceDB::load(SGPath filename) {
-    string name;
-    double acceleration;
-    double deceleration;
-    double climbRate;
-    double descentRate;
-    double vRotate;
-    double vTakeOff;
-    double vClimb;
-    double vCruise;
-    double vDescent;
-    double vApproach;
-    double vTouchdown;
-    double vTaxi;
+void PerformanceDB::load(const SGPath& filename)
+{
     SGPropertyNode root;
     try {
         readProperties(filename.str(), &root);
     } catch (const sg_exception &) {
-        SG_LOG(SG_GENERAL, SG_ALERT,
+        SG_LOG(SG_AI, SG_ALERT,
             "Error reading AI aircraft performance database: " << filename.str());
         return;
     }
 
     SGPropertyNode * node = root.getNode("performancedb");
-    for (int i = 0; i < node->nChildren(); i++) { 
+    for (int i = 0; i < node->nChildren(); i++) {
         SGPropertyNode * db_node = node->getChild(i);
-            name         = db_node->getStringValue("type", "heavy_jet");
-            acceleration = db_node->getDoubleValue("acceleration-kts-hour", 4.0);
-            deceleration = db_node->getDoubleValue("deceleration-kts-hour", 2.0);
-            climbRate    = db_node->getDoubleValue("climbrate-fpm", 3000.0);
-            descentRate  = db_node->getDoubleValue("decentrate-fpm", 1500.0);
-            vRotate      = db_node->getDoubleValue("rotate-speed-kts", 150.0);
-            vTakeOff     = db_node->getDoubleValue("takeoff-speed-kts", 160.0);
-            vClimb       = db_node->getDoubleValue("climb-speed-kts", 300.0);
-            vCruise      = db_node->getDoubleValue("cruise-speed-kts", 430.0);
-            vDescent     = db_node->getDoubleValue("decent-speed-kts", 300.0);
-            vApproach    = db_node->getDoubleValue("approach-speed-kts", 170.0);
-            vTouchdown   = db_node->getDoubleValue("touchdown-speed-kts", 150.0);
-            vTaxi        = db_node->getDoubleValue("taxi-speed-kts", 15.0);
-
-            registerPerformanceData(name, new PerformanceData(
-                acceleration, deceleration, climbRate, descentRate, vRotate, vTakeOff, vClimb, vCruise, vDescent, vApproach, vTouchdown, vTaxi));
-    }
+        if (!strcmp(db_node->getName(), "aircraft")) {
+            PerformanceData* data = NULL;
+            if (db_node->hasChild("base")) {
+              string baseName = db_node->getStringValue("base");
+              PerformanceData* baseData = _db[baseName];
+              if (!baseData) {
+                SG_LOG(SG_AI, SG_ALERT,
+                       "Error reading AI aircraft performance database: unknown base type " << baseName);
+                return;
+              }
+              
+              // clone base data to 'inherit' from it
+              data = new PerformanceData(baseData); 
+            } else {
+              data = new PerformanceData;
+            }
+          
+            data->initFromProps(db_node);
+            string name  = db_node->getStringValue("type", "heavy_jet");
+            registerPerformanceData(name, data);
+        } else if (!strcmp(db_node->getName(), "alias")) {
+            string alias(db_node->getStringValue("alias"));
+            if (alias.empty()) {
+                SG_LOG(SG_AI, SG_ALERT, "performance DB alias entry with no <alias> definition");
+                continue;
+            }
+          
+            BOOST_FOREACH(SGPropertyNode* matchNode, db_node->getChildren("match")) {
+                string match(matchNode->getStringValue());
+                _aliases.push_back(StringPair(match, alias));
+            }
+        } else {
+            SG_LOG(SG_AI, SG_ALERT, "unrecognized performance DB entry:" << db_node->getName());
+        }
+    } // of nodes iteration
 }
 
+string PerformanceDB::findAlias(const string& acType) const
+{
+    BOOST_FOREACH(const StringPair& alias, _aliases) {
+        if (acType.find(alias.first) == 0) { // matched!
+            return alias.second;
+        }
+    } // of alias iteration
+  
+    return string();
+}
+
+