X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIStorm.cxx;h=fded8012d9ef85e4ed623c4bd0adb2cda146d860;hb=40639d38a877b7f58702db0c2b8831985b8ddbaf;hp=edba9038dc7720b24d4ea6e2a6cde15bf246de97;hpb=1974be7fafecb307e44beb07598122e9bbfae992;p=flightgear.git diff --git a/src/AIModel/AIStorm.cxx b/src/AIModel/AIStorm.cxx index edba9038d..fded8012d 100644 --- a/src/AIModel/AIStorm.cxx +++ b/src/AIModel/AIStorm.cxx @@ -16,37 +16,65 @@ // // 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) { + delay = 3.6; + subflashes = 1; + timer = 0.0; + random_delay = 3.6; + flash_node = fgGetNode("/environment/lightning/flash", true); + flash_node->setBoolValue(false); + flashed = 0; + flashing = false; + subflash_index = -1; + subflash_array[0] = 1; + subflash_array[1] = 2; + subflash_array[2] = 1; + subflash_array[3] = 3; + subflash_array[4] = 2; + 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; -bool FGAIStorm::init() { - return FGAIBase::init(); + 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(bool search_in_AI_path) { + return FGAIBase::init(search_in_AI_path); } void FGAIStorm::bind() { @@ -67,8 +95,6 @@ void FGAIStorm::update(double dt) { void FGAIStorm::Run(double dt) { - FGAIStorm::dt = dt; - double speed_north_deg_sec; double speed_east_deg_sec; @@ -79,12 +105,70 @@ 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 * + // ************************************************** + + if (timer > random_delay) { + srand((unsigned)time(0)); + random_delay = delay + (rand()%3) - 1.0; + //cout << "random_delay = " << random_delay << endl; + timer = 0.0; + flashing = true; + subflash_index++; + if (subflash_index == 8) subflash_index = 0; + subflashes = subflash_array[subflash_index]; + } + + if (flashing) { + if (flashed < subflashes) { + timer += dt; + if (timer < 0.1) { + flash_node->setBoolValue(true); + } else { + flash_node->setBoolValue(false); + if (timer > 0.2) { + timer = 0.0; + flashed++; + } + } + } else { + flashing = false; + timer = 0.0; + flashed = 0; + } + } + 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); + } + }