128 lines
3.7 KiB
Plaintext
128 lines
3.7 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.
|
|
# ****************************************************************************
|
|
|
|
|
|
|
|
#this is a parent behavior of any defensive manuevers
|
|
# first determine if we are in danger, then defend in the child behaviors
|
|
|
|
include_once behavior_unload.txt
|
|
include_once behavior_force_overshoot.txt
|
|
|
|
|
|
|
|
behavior in_danger
|
|
|
|
script_variables
|
|
double cANGLE_TOLERANCE = 45.0; # degrees
|
|
WsfTrack mBiggestThreat;
|
|
end_script_variables
|
|
|
|
|
|
script bool NotWeapon(WsfTrack aTrack)
|
|
if (aTrack.Target().IsValid() && aTrack.Target().WeaponEngagement().IsValid())
|
|
{
|
|
return false; //it is a weapon
|
|
}
|
|
return true;
|
|
end_script
|
|
|
|
|
|
script bool IsFlyer(WsfPlatform aPlat)
|
|
if (!aPlat.IsValid())
|
|
{
|
|
return false;
|
|
}
|
|
if (aPlat.Mover().IsA_TypeOf("WSF_AIR_MOVER" ) ||
|
|
aPlat.Mover().IsA_TypeOf("WSF_6DOF_MOVER") )
|
|
{
|
|
return true;
|
|
}
|
|
else if (aPlat.MakeTrack().AirDomain())
|
|
{
|
|
return true;
|
|
}
|
|
else if((aPlat.Altitude() > 152.4) && (aPlat.Speed() > 51.44) ) // ~500 feet alt, ~100 knots speed
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
end_script
|
|
|
|
|
|
precondition
|
|
writeln("precondition in_danger");
|
|
|
|
//check track list for any threats
|
|
#extern double mVisualRange;
|
|
#extern string CalculatePositioning( WsfPlatform, WsfTrack, double );
|
|
|
|
//see if anybody is threatening me
|
|
mBiggestThreat = null;
|
|
|
|
foreach (WsfLocalTrack t in PLATFORM.MasterTrackList())
|
|
{
|
|
if (!t.SideValid() || t.Side() != PLATFORM.Side())
|
|
{
|
|
double range = PLATFORM.SlantRangeTo(t);
|
|
if ((range < mVisualRange) && NotWeapon(t) && IsFlyer(t.Target()))
|
|
{
|
|
string pos = CalculatePositioning(PLATFORM, t, cANGLE_TOLERANCE );
|
|
if (pos=="tail-to-head" || pos=="target-facing-me")
|
|
{
|
|
if (!mBiggestThreat.IsValid() || (range < PLATFORM.SlantRangeTo(mBiggestThreat)))
|
|
{
|
|
#mBiggestThreat = (WsfTrack)t;
|
|
mBiggestThreat = t;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (mBiggestThreat.IsValid())
|
|
{
|
|
//if we are closer to our target, stay in the fight
|
|
WsfTrack targetTrack = PROCESSOR.GetTarget();
|
|
if (!targetTrack.IsNull() && targetTrack.IsValid())
|
|
{
|
|
#extern double mEngagementAggressiveness;
|
|
double threatRange = PLATFORM.SlantRangeTo(mBiggestThreat);
|
|
double requiredAggressiveness = threatRange / (threatRange + PLATFORM.SlantRangeTo(targetTrack));
|
|
if (mEngagementAggressiveness >= requiredAggressiveness)
|
|
{
|
|
string myPos = CalculatePositioning(PLATFORM, targetTrack, cANGLE_TOLERANCE );
|
|
if (myPos=="head-to-tail" || myPos="me-facing-target")
|
|
{
|
|
writeln(" not in enough danger, I am chasing target: ", targetTrack.TargetName());
|
|
return false; #do not defend, I am aggressive enough to stay after my target, and I am facing my target
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
end_precondition
|
|
|
|
|
|
execute
|
|
writeln("executing in_danger");
|
|
PLATFORM.Comment("in_danger");
|
|
end_execute
|
|
|
|
|
|
selector
|
|
behavior unload end_behavior
|
|
behavior force_overshoot end_behavior
|
|
end_selector
|
|
|
|
|
|
end_behavior
|
|
|