123 lines
4.5 KiB
Plaintext
123 lines
4.5 KiB
Plaintext
# ****************************************************************************
|
|
# CUI
|
|
#
|
|
# The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
|
|
#
|
|
# The use, dissemination or disclosure of data in this file is subject to
|
|
# limitation or restriction. See accompanying README and LICENSE for details.
|
|
# ****************************************************************************
|
|
|
|
|
|
|
|
behavior snap_shot
|
|
|
|
script_variables
|
|
double cDIVE_ALTITUDE = 304.8; # 1000 feet
|
|
double cDEFAULT_SPEED = 200.0; # m/s
|
|
double cMIN_SPEED = 0.0; # m/s
|
|
double cGRAVITY_ACCEL = 9.80665; # 1 G
|
|
double cDEFAULT_ACCEL = (cGRAVITY_ACCEL * 7.5); # m/s^2 ~7.5 Gs
|
|
double cMAX_RADIAL_ACCEL = 100 * cGRAVITY_ACCEL; //larger than possible, make the aircraft limit the turn
|
|
end_script_variables
|
|
|
|
|
|
precondition
|
|
writeln("precondition snap_shot");
|
|
|
|
//this behavior applies when a snap shot is required and won't be suicide
|
|
WsfTrack targetTrack = PROCESSOR.GetTarget();
|
|
WsfMover mover = PLATFORM.Mover();
|
|
|
|
if (targetTrack.IsNull() || !targetTrack.IsValid() || mover.IsNull() || !mover.IsValid())
|
|
{
|
|
writeln("target or mover not valid for executing snap_shot");
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
//distance versus turn radius
|
|
#double turnRadius = mover.TurnRadius();
|
|
#double range = PLATFORM.SlantRangeTo(targetTrack);
|
|
#writeln("turn radius = ", turnRadius, ", my range = ", range);
|
|
#double maxVelocityAllowed = mover.CornerVelocity(targetTrack.CurrentLocation());
|
|
#double mySpeed = PLATFORM.Speed();
|
|
#writeln("max corner speed = ", maxVelocityAllowed, ", my speed = ", mySpeed);
|
|
|
|
//check if I've already fired at the target
|
|
if (PROCESSOR.WeaponsActive(targetTrack) > 0)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//check the relative angles and speeds between agent and the target
|
|
double relMe = MATH.Fabs( PLATFORM.RelativeBearingTo(targetTrack) );
|
|
double relHim = MATH.Fabs( targetTrack.RelativeBearingTo(PLATFORM) );
|
|
//lets try multiplying relative angles by speed
|
|
//lower relative angle and lower speed is better for snap shotting
|
|
if ((relMe * PLATFORM.Speed()) > (relHim*targetTrack.Speed()))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
|
|
//check if I'm already pointed at the target
|
|
if (relMe < 5.0) //within five degrees
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//check if any threats are within visual range ~20 nm
|
|
//check for side
|
|
extern double mVisualRange;
|
|
int totalThreatsWVR = 0;
|
|
foreach (WsfLocalTrack t in PLATFORM.MasterTrackList())
|
|
{
|
|
if (!t.SideValid() || t.Side() != PLATFORM.Side())
|
|
{
|
|
if (PLATFORM.SlantRangeTo(t) < mVisualRange)
|
|
{
|
|
totalThreatsWVR = totalThreatsWVR + 1;
|
|
}
|
|
}
|
|
}
|
|
if (totalThreatsWVR > 1) //don't slow down if other threats are nearby
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
//check if a snapshot would help me actually fire at my target (create a fake track that has relative bearing = 0)
|
|
WsfTrack projectedTarget = WsfTrack();
|
|
projectedTarget.SetBearing(0);
|
|
projectedTarget.SetRange(PLATFORM.SlantRangeTo(targetTrack));
|
|
projectedTarget.SetElevation(PLATFORM.RelativeElevationOf(targetTrack.CurrentLocation()));
|
|
projectedTarget.SetAirDomain();
|
|
Vec3 v = targetTrack.VelocityWCS();
|
|
projectedTarget.SetVelocityWCS(v.X(), v.Y(), v.Z());
|
|
extern string GetWeaponForThreat(WsfPlatform, WsfTrack);
|
|
string wStr = GetWeaponForThreat(PLATFORM, projectedTarget); #checks domain & kinematic capability, & valid quantity remaining
|
|
if (wStr == "")
|
|
{
|
|
writeln("checking snap_shot, projected target could NOT be fired upon");
|
|
return false;
|
|
}
|
|
*/
|
|
|
|
return true;
|
|
}
|
|
end_precondition
|
|
|
|
|
|
execute
|
|
writeln("executing snap_shot.");
|
|
PLATFORM.Comment("snap_shot");
|
|
|
|
WsfTrack targetTrack = PROCESSOR.GetTarget();
|
|
|
|
extern bool FlyTarget( WsfPlatform, WsfGeoPoint, double);
|
|
FlyTarget( PLATFORM, targetTrack.CurrentLocation(), cMIN_SPEED);
|
|
|
|
end_execute
|
|
|
|
end_behavior
|