Files
lab1/processors/ripr_agents/aiai/behavior_in_danger.txt

128 lines
3.7 KiB
Plaintext
Raw Normal View History

2025-09-12 15:20:28 +08:00
# ****************************************************************************
# 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