]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIAircraft.cxx
warnings--
[flightgear.git] / src / AIModel / AIAircraft.cxx
index b6605278555257cad86f0821cfebd8c2314d2b3d..c312e51049bd39dbdd5db24c6273565023ff9001 100644 (file)
@@ -58,7 +58,9 @@ const FGAIAircraft::PERF_STRUCT FGAIAircraft::settings[] = {
     // jet_fighter
     {7.0, 3.0, 4000.0, 2000.0, 150.0, 350.0, 500.0, 350.0, 150.0},
     // tanker
-    {5.0, 2.0, 3000.0, 1500.0, 140.0, 300.0, 430.0, 300.0, 130.0}
+    {5.0, 2.0, 3000.0, 1500.0, 140.0, 300.0, 430.0, 300.0, 130.0},
+    // ufo (extreme accel/decel)
+    {30.0, 30.0, 6000.0, 6000.0, 150.0, 300.0, 430.0, 300.0, 130.0}
 };
 
 
@@ -150,6 +152,8 @@ void FGAIAircraft::setPerformance(const std::string& acclass) {
     } else if (acclass == "tanker") {
         SetPerformance(&FGAIAircraft::settings[FGAIAircraft::JET_TRANSPORT]);
         SetTanker(true);
+    } else if (acclass == "ufo") {
+        SetPerformance(&FGAIAircraft::settings[FGAIAircraft::UFO]);
     } else {
         SetPerformance(&FGAIAircraft::settings[FGAIAircraft::JET_TRANSPORT]);
     }
@@ -165,7 +169,7 @@ void FGAIAircraft::SetPerformance(const PERF_STRUCT *ps) {
 void FGAIAircraft::Run(double dt) {
 
     FGAIAircraft::dt = dt;
-
+    
     if (fp) {
         time_t now = time(NULL) + fgGetLong("/sim/time/warp");
         ProcessFlightPlan(dt, now);
@@ -189,7 +193,6 @@ void FGAIAircraft::Run(double dt) {
         // from control properties.  These default to the initial
         // settings in the config file, but can be changed "on the
         // fly".
-
         string lat_mode = props->getStringValue("controls/flight/lateral-mode");
         if ( lat_mode == "roll" ) {
             double angle
@@ -214,7 +217,7 @@ void FGAIAircraft::Run(double dt) {
 
         AccelTo( props->getDoubleValue("controls/flight/target-spd" ) );
     }
-
+      
     double turn_radius_ft;
     double turn_circum_ft;
     double speed_north_deg_sec;
@@ -229,27 +232,47 @@ void FGAIAircraft::Run(double dt) {
     } else {
         speed_diff = groundTargetSpeed - speed;
     }
-    if (fabs(speed_diff) > 0.2) {
-        if (speed_diff > 0.0)
-            speed += performance->accel * dt;
-        if (speed_diff < 0.0) {
-            if (no_roll) { // was (!no_roll) but seems more logical this way (ground brakes).
-                speed -= performance->decel * dt * 3;
-            } else {
-                speed -= performance->decel * dt;
-            }
+
+    if (speed_diff > 0.0) {
+        speed += performance->accel * dt;
+       if (no_roll) { // apply overshoot correction
+         if ( speed > groundTargetSpeed ) speed = groundTargetSpeed;
+       }else {
+         if ( speed > tgt_speed ) speed = tgt_speed;
+       }
+    } else if (speed_diff < 0.0) {
+        if (no_roll) {
+            // on ground (aircraft can't roll)
+           // deceleration performance is better due to wheel brakes.
+            speed -= performance->decel * dt * 3;
+        } else {
+            speed -= performance->decel * dt;
         }
+       if (no_roll) { // apply overshoot correction
+        if (speed < groundTargetSpeed ) speed = groundTargetSpeed;
+       } else { 
+         if ( speed < tgt_speed ) speed = tgt_speed;
+       }
     }
-
+    
+    
     // convert speed to degrees per second
-    speed_north_deg_sec = cos( hdg / SG_RADIANS_TO_DEGREES )
+    speed_north_deg_sec = cos( hdg * SGD_DEGREES_TO_RADIANS )
                           * speed * 1.686 / ft_per_deg_lat;
-    speed_east_deg_sec  = sin( hdg / SG_RADIANS_TO_DEGREES )
+    speed_east_deg_sec  = sin( hdg * SGD_DEGREES_TO_RADIANS )
                           * speed * 1.686 / ft_per_deg_lon;
 
     // set new position
     pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt);
     pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt); 
+
+    /* printf("%.7f %0.4f %.7f %.5f %.7f %.7f %.8f %.8f %.9f %.9f\n",
+           dt, hdg, speed, ft_per_deg_lat,
+           cos( hdg * SGD_DEGREES_TO_RADIANS ),
+           speed * 1.686 / ft_per_deg_lat,
+           speed_north_deg_sec, speed_east_deg_sec,
+           pos.getLatitudeDeg(), pos.getLongitudeDeg()); */
+
     //if (!(finite(pos.lat()) && finite(pos.lon())))
     //  {
     //    cerr << "Position is not finite" << endl;