Files
lab1/processors/ripr_agents/aiai/behavior_pursue_altitude.txt
2025-09-12 15:20:28 +08:00

106 lines
3.6 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 pursue_altitude
script_debug_writes off
script_variables
WsfTrack mTargetTrack;
double mMinAltitude = 4572; # ~15000 feet
//switch for matching threat's altitude during pursuit
bool DefaultMatchThreatAltitude = false;
Map<string, bool> mThreatTypeMatchAltitude = Map<string, bool>();
mThreatTypeMatchAltitude["unknown"] = false;
mThreatTypeMatchAltitude["uav"] = false;
mThreatTypeMatchAltitude["sam"] = false;
mThreatTypeMatchAltitude["ship"] = false;
mThreatTypeMatchAltitude["jammer"] = false;
mThreatTypeMatchAltitude["missile"] = false;
//mThreatTypeMatchAltitude["missile_fast"] = true;
//mThreatTypeMatchAltitude["awacs"] = true;
//mThreatTypeMatchAltitude["bomber"] = true;
//mThreatTypeMatchAltitude["fighter"] = true;
end_script_variables
script bool MatchAltitudeForThreat(WsfTrack track)
WsfPlatform plat = WsfSimulation.FindPlatform( track.TargetName() );
if (plat.IsValid())
{
foreach (string aCategory : bool match in mThreatTypeMatchAltitude)
{
if (plat.CategoryMemberOf(aCategory))
{
return match;
}
}
}
return DefaultMatchThreatAltitude;
end_script
precondition
writeln_d(PLATFORM.Name(), " precondition pursue_altitude, T=", TIME_NOW);
if (!PROCESSOR.IsA_TypeOf("WSF_RIPR_PROCESSOR"))
{
return Failure("behavior not attached to a RIPR processor!");
} // ((WsfRIPRProcessor)PROCESSOR)
//get target from ripr processor, to be sure
mTargetTrack = ((WsfRIPRProcessor)PROCESSOR).GetTarget();
if (mTargetTrack.IsNull() || !mTargetTrack.IsValid())
{
writeln_d(" No valid target track found to pursue!");
return Failure("target track not found");
}
return true;
end_precondition
execute
string comment = write_str(PLATFORM.Name(), " executing pursue_altitude, T=", TIME_NOW);
writeln_d(comment);
#PLATFORM.Comment(comment);
extern double mDesiredAltitude;
// If we got the altitude from the TRACK, match it
extern double cDEFAULT_ALTITUDE;
mDesiredAltitude = cDEFAULT_ALTITUDE;
//check for targets altitude, and whether or not we should match it
if (mTargetTrack.ElevationValid() ||
mTargetTrack.LocationValid())
{
if (mTargetTrack.Altitude() > mDesiredAltitude) //always climb up to target
{
mDesiredAltitude = mTargetTrack.Altitude();
}
else if (MatchAltitudeForThreat(mTargetTrack) == true) //just useful for diving down to threat lower level
{
mDesiredAltitude = mTargetTrack.Altitude();
}
}
//always bound the altitude by the min & max restrictions (in case mover is not setup to do it)
if (mDesiredAltitude < mMinAltitude)
{
mDesiredAltitude = mMinAltitude;
}
writeln_d("desired intercept altitude: ", mDesiredAltitude);
end_execute
end_behavior