]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIStorm.cxx
Merge branch 'next' of gitorious.org:fg/flightgear into next
[flightgear.git] / src / AIModel / AIStorm.cxx
index 372e69e705c128970e89aa2bed7bc25ece5d6029..a4241df465c2f3e17399dae1a0c687f3c5589a04 100644 (file)
 //
 // You should have received a copy of the GNU General Public License
 // along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
 
-#include <simgear/math/point3d.hxx>
 #include <Main/fg_props.hxx>
 #include <Main/globals.hxx>
 #include <Scenery/scenery.hxx>
 #include <string>
 #include <math.h>
 #include <cstdlib>
+#include <time.h>
 
-SG_USING_STD(string);
+using std::string;
 
 #include "AIStorm.hxx"
 
 
-FGAIStorm::FGAIStorm(FGAIManager* mgr) {
-   manager = mgr;   
-   _type_str = "thunderstorm";
-   _otype = otStorm;
+FGAIStorm::FGAIStorm() :
+   FGAIBase(otStorm, false)
+{
    delay = 3.6;
    subflashes = 1;
    timer = 0.0;
@@ -56,15 +55,28 @@ FGAIStorm::FGAIStorm(FGAIManager* mgr) {
    subflash_array[5] =  1;
    subflash_array[6] =  1;
    subflash_array[7] =  2;
+
+   turb_mag_node = fgGetNode("/environment/turbulence/magnitude-norm", true);
+   turb_rate_node = fgGetNode("/environment/turbulence/rate-hz", true);
 }
 
 
 FGAIStorm::~FGAIStorm() {
 }
 
+void FGAIStorm::readFromScenario(SGPropertyNode* scFileNode) {
+  if (!scFileNode)
+    return;
+
+  FGAIBase::readFromScenario(scFileNode);
+
+  setDiameter(scFileNode->getDoubleValue("diameter-ft", 0.0)/6076.11549);
+  setHeight(scFileNode->getDoubleValue("height-msl", 5000.0));
+  setStrengthNorm(scFileNode->getDoubleValue("strength-norm", 1.0)); 
+}
 
-bool FGAIStorm::init() {
-   return FGAIBase::init();
+bool FGAIStorm::init(bool search_in_AI_path) {
+   return FGAIBase::init(search_in_AI_path);
 }
 
 void FGAIStorm::bind() {
@@ -85,8 +97,6 @@ void FGAIStorm::update(double dt) {
 
 void FGAIStorm::Run(double dt) {
 
-   FGAIStorm::dt = dt;
-       
    double speed_north_deg_sec;
    double speed_east_deg_sec;
 
@@ -97,13 +107,16 @@ void FGAIStorm::Run(double dt) {
                           * speed * 1.686 / ft_per_deg_lon;
 
    // set new position
-   pos.setlat( pos.lat() + speed_north_deg_sec * dt);
-   pos.setlon( pos.lon() + speed_east_deg_sec * dt); 
+   pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt);
+   pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt); 
 
-   // do calculations for radar //
+   // do calculations for weather radar display 
    UpdateRadar(manager);
 
-   // do lightning
+   // **************************************************
+   // *     do lightning                               *
+   // **************************************************
+
    if (timer > random_delay) {
      srand((unsigned)time(0));
      random_delay = delay + (rand()%3) - 1.0;
@@ -118,11 +131,11 @@ void FGAIStorm::Run(double dt) {
    if (flashing) {
      if (flashed < subflashes) {
          timer += dt;
-         if (timer < 0.2) { 
+         if (timer < 0.1) { 
          flash_node->setBoolValue(true);
          } else {
             flash_node->setBoolValue(false);
-            if (timer > 0.4) {
+            if (timer > 0.2) {
               timer = 0.0;
               flashed++;
             }
@@ -136,6 +149,28 @@ void FGAIStorm::Run(double dt) {
    else {
      timer += dt;
    }  
+
+   // ***************************************************
+   // *      do turbulence                              *
+   // ***************************************************
+
+   // copy user's position from the AIManager
+   double user_latitude  = manager->get_user_latitude();
+   double user_longitude = manager->get_user_longitude();
+   double user_altitude  = manager->get_user_altitude();
+
+   // calculate range to target in feet and nautical miles
+   double lat_range = fabs(pos.getLatitudeDeg() - user_latitude) * ft_per_deg_lat;
+   double lon_range = fabs(pos.getLongitudeDeg() - user_longitude) * ft_per_deg_lon;
+   double range_ft = sqrt(lat_range*lat_range + lon_range*lon_range);
+   range = range_ft / 6076.11549;
+
+   if (range < (diameter * 0.5) &&
+       user_altitude > (altitude_ft - 1000.0) &&
+       user_altitude < height) {
+              turb_mag_node->setDoubleValue(strength_norm);
+              turb_rate_node->setDoubleValue(0.5);
+   } 
      
 }