X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIStorm.cxx;h=a4241df465c2f3e17399dae1a0c687f3c5589a04;hb=f7cd808f2313a8b35165b44cbf805f2d57e2c567;hp=372e69e705c128970e89aa2bed7bc25ece5d6029;hpb=2d9108e2533afda5e50f175628db5a61b770136b;p=flightgear.git diff --git a/src/AIModel/AIStorm.cxx b/src/AIModel/AIStorm.cxx index 372e69e70..a4241df46 100644 --- a/src/AIModel/AIStorm.cxx +++ b/src/AIModel/AIStorm.cxx @@ -16,29 +16,28 @@ // // 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 #endif -#include #include
#include
#include #include #include #include +#include -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); + } }