Files
afsim_addfuel/processors/aa_intercept.txt

993 lines
23 KiB
Plaintext

#processor aa_intercept WSF_TASK_PROCESSOR
#
# update_interval 5 sec
#
# script_variables
# double launchRange = 20 * MATH.M_PER_NM();
# double salvoSize = 2;
# string weaponName = "aa_mrm";
# WsfWeapon aa_mrm = PLATFORM.Weapon(weaponName);
# bool canPursue = false;
# Map<string, int> aa_mrmUseful = Map<string, int>();
# WsfTrack currentTarget;
# end_script_variables
#
# //
# //@ pursueCondition
# //
# script bool pursueCondition()
# return (
# aa_mrm.QuantityRemaining() > 0 &&
# TRACK.Target().IsValid()
# );
# end_script
#
# //
# //@ Pursue
# //
# script bool Pursue()
# if (pursueCondition())
# {
# if(PLATFORM.GroundRangeTo(TRACK.CurrentLocation()) >= launchRange)
# {
# PLATFORM.GoToLocation(TRACK.CurrentLocation());
# }
# canPursue = true;
# return canPursue;
# }
# canPursue = false;
# return canPursue;
# end_script
#
# //
# //@ CanEngage
# //
# script bool CanEngage()
# bool canEngage = false;
# if (aa_mrm.IsValid() &&
# aa_mrm.QuantityRemaining() >= salvoSize &&
# TRACK.Target().IsValid() &&
# PLATFORM.GroundRangeTo(TRACK) < launchRange &&
# WeaponsActiveFor(TRACK.TrackId()) < 1
# )
# {
# aa_mrmUseful[weaponName] = 1;
# canEngage = true;
# }
# return canEngage;
# end_script
#
# //
# //@ Engage
# //
# script void Engage()
# if (CanEngage())
# {
# if(aa_mrmUseful.Exists(weaponName))
# {
# if(aa_mrmUseful[weaponName] == 1)
# {
# Fire(TRACK,"FIRE",weaponName,salvoSize,PLATFORM);
# aa_mrmUseful[weaponName] == 0;
# }
# }
# }
# else
# {
# writeln_d("Cannot engage: Conditions not met.");
# }
# end_script
#
# //
# //@ TrackAndEngage
# //
# script void TrackAndEngage()
# if (TRACK.Target().IsValid())
# {
# if (CanEngage())
# {
# Engage();
# }
# else
# {
# Pursue();
# }
# }
# else
# {
# writeln_d("No valid target to track.");
# }
# end_script
#
# //
# //@ WeaponReplenishment
# //
## script void ReplenishWeapons()
## if (aa_mrm.QuantityRemaining() < salvoSize)
## {
## writeln_d("Replenishing weapons: ", weaponName);
## PLATFORM.ReplenishWeapon(weaponName); //
## }
## end_script
#
#/////////////////////state////////////////////////
#evaluation_interval IDLE 1 sec
#
# state IDLE
# on_entry
# writeln_d("Entering IDLE state.");
# end_on_entry
#
# next_state TRACKING
# return TRACK.Target().IsValid();
# end_next_state
#
# on_exit
# writeln_d("Exiting IDLE state.");
# end_on_exit
# end_state
#evaluation_interval TRACKING 1 sec
# state TRACKING
# on_entry
# writeln_d("Entering TRACKING state.");
# end_on_entry
#
# next_state ENGAGING
# return CanEngage();
# end_next_state
#
# next_state PURSUING
# return pursueCondition() && !CanEngage();
# end_next_state
#
# on_exit
# writeln_d("Exiting TRACKING state.");
# end_on_exit
# end_state
#evaluation_interval ENGAGING 1 sec
# state ENGAGING
# on_entry
# writeln_d("Entering ENGAGING state.");
# Engage();
# end_on_entry
#
# next_state IDLE
# return !TRACK.Target().IsValid() || aa_mrm.QuantityRemaining() < salvoSize;
# end_next_state
#
# next_state TRACKING
# return TRACK.Target().IsValid() && !CanEngage();
# end_next_state
#
# on_exit
# writeln_d("Exiting ENGAGING state.");
# end_on_exit
# end_state
#evaluation_interval PURSUING 1 sec
# state PURSUING
# on_entry
# writeln_d("Entering PURSUING state.");
# Pursue();
# end_on_entry
#
# next_state TRACKING
# return TRACK.Target().IsValid() && PLATFORM.GroundRangeTo(TRACK) < launchRange;
# end_next_state
#
# next_state IDLE
# return !pursueCondition();
# end_next_state
#
# on_exit
# writeln_d("Exiting PURSUING state.");
# end_on_exit
# end_state
#
#end_processor
#processor aa_intercept WSF_TASK_PROCESSOR
#
# update_interval 5 sec
#
# script_variables
# double launchRange = 20 * MATH.M_PER_NM(); //
# double salvoSize = 2; //
# string weaponName = "aa_mrm"; //
# WsfWeapon aa_mrm = PLATFORM.Weapon(weaponName); //
# bool canPursue = false; //
# Map<string, int> aa_mrmUseful = Map<string, int>(); //
# WsfTrack currentTarget; //
# end_script_variables
#
# //
# //@ SelectClosestTrack
# //
# script WsfTrack SelectClosestTrack()
# WsfTrack closestTarget;
# double closestDistance = 100000000000000000000000; //
# foreach (WsfTrack track in PLATFORM.MasterTrackList())
# {
# if (track.IsValid() && PLATFORM.GroundRangeTo(track) < closestDistance)
# {
# closestTarget = track;
# closestDistance = PLATFORM.GroundRangeTo(track);
# }
# }
# return closestTarget;
# end_script
#
# //
# //@ pursueCondition
# //
# script bool pursueCondition()
# return (
# aa_mrm.QuantityRemaining() > 0 &&
# currentTarget.IsValid()
# );
# end_script
#
# //
# //@ Pursue
# //
# script bool Pursue()
# if (pursueCondition())
# {
# double distanceToTarget = PLATFORM.GroundRangeTo(currentTarget);
# if (distanceToTarget >= launchRange)
# {
# PLATFORM.GoToLocation(currentTarget.CurrentLocation());
# }
# canPursue = true;
# return canPursue;
# }
# canPursue = false;
# return canPursue;
# end_script
#
# //
# //@ CanEngage
# //
# script bool CanEngage()
# bool canEngage = false;
# if (aa_mrm.IsValid() &&
# aa_mrm.QuantityRemaining() >= salvoSize &&
# currentTarget.IsValid() &&
# PLATFORM.GroundRangeTo(currentTarget) < launchRange &&
# WeaponsActiveFor(currentTarget.TrackId()) < 1
# )
# {
# aa_mrmUseful[weaponName] = 1;
# canEngage = true;
# }
# return canEngage;
# end_script
#
# //
# //@ Engage
# //
# script void Engage()
# if (CanEngage())
# {
# if (aa_mrmUseful.Exists(weaponName))
# {
# if (aa_mrmUseful[weaponName] == 1)
# {
# Fire(currentTarget, "FIRE", weaponName, salvoSize, PLATFORM);
# aa_mrmUseful[weaponName] = 0; //
## EvadeAfterEngage(); //
# }
# }
# }
# else
# {
# writeln_d("Cannot engage: Conditions not met.");
# }
# end_script
#
# //
# //@ EvadeAfterEngage
# //
## script void EvadeAfterEngage()
## writeln_d("Executing evade maneuver after engage.");
## double evadeDistance = launchRange * 0.3; // 30%
## Location evadeLocation = PLATFORM.CurrentLocation().OffsetBy(evadeDistance, MATH.RandomAngle());
## PLATFORM.GoToLocation(RANDOM.loevadeLocation); //
## end_script
#
# //
# //@ TrackAndEngage
# //
# script void TrackAndEngage()
# currentTarget = SelectClosestTrack();
# if (currentTarget.IsValid())
# {
# writeln_d("Selected target ID: ", currentTarget.TrackId());
# if (CanEngage())
# {
# Engage();
# }
# else
# {
# Pursue();
# }
# }
# else
# {
# writeln_d("No valid targets available.");
# }
# end_script
#
#/////////////////////state////////////////////////
#evaluation_interval IDLE 1 sec
#
# state IDLE
# on_entry
# writeln_d("Entering IDLE state.");
# currentTarget = SelectClosestTrack();
# end_on_entry
#
# next_state TRACKING
# return currentTarget.IsValid();
# end_next_state
#
# on_exit
# writeln_d("Exiting IDLE state.");
# end_on_exit
# end_state
#
#evaluation_interval TRACKING 1 sec
#
# state TRACKING
# on_entry
# writeln_d("Entering TRACKING state.");
# currentTarget = SelectClosestTrack();
# end_on_entry
#
# next_state ENGAGING
# return CanEngage();
# end_next_state
#
# next_state PURSUING
# return pursueCondition() && !CanEngage();
# end_next_state
#
# on_exit
# writeln_d("Exiting TRACKING state.");
# end_on_exit
# end_state
#
#evaluation_interval ENGAGING 1 sec
#
# state ENGAGING
# on_entry
# writeln_d("Entering ENGAGING state.");
# Engage();
# end_on_entry
#
# next_state IDLE
# return !currentTarget.IsValid() || aa_mrm.QuantityRemaining() < salvoSize;
# end_next_state
#
# next_state TRACKING
# return currentTarget.IsValid() && !CanEngage();
# end_next_state
#
# on_exit
# writeln_d("Exiting ENGAGING state.");
# end_on_exit
# end_state
#
#evaluation_interval PURSUING 1 sec
#
# state PURSUING
# on_entry
# writeln_d("Entering PURSUING state.");
# Pursue();
# end_on_entry
#
# next_state TRACKING
# return currentTarget.IsValid() && PLATFORM.GroundRangeTo(currentTarget) < launchRange;
# end_next_state
#
# next_state IDLE
# return !pursueCondition();
# end_next_state
#
# on_exit
# writeln_d("Exiting PURSUING state.");
# end_on_exit
# end_state
#
#end_processor
#processor aa_intercept WSF_TASK_PROCESSOR
#
## Update interval
#update_interval 5 sec
#
## Script variables
#script_variables
# double launchRange = 20 * MATH.M_PER_NM(); //
# double salvoSize = 2; //
# string weaponName = "aa_mrm"; //
# WsfWeapon aa_mrm = PLATFORM.Weapon(weaponName); //
# Map<string, int> aa_mrmUseful = Map<string, int>(); //
# WsfTrack currentTarget; //
#end_script_variables
#
## SelectClosestTrack
#script WsfTrack SelectClosestTrack()
# WsfTrack closestTarget;
# double closestDistance = 1000000000; //
# foreach (WsfTrack track in PLATFORM.MasterTrackList())
# {
# if (track.IsValid() && PLATFORM.GroundRangeTo(track) < closestDistance)
# {
# closestTarget = track;
# closestDistance = PLATFORM.GroundRangeTo(track);
# }
# }
# return closestTarget;
#end_script
#
## CanEngage
#script bool CanEngage()
# bool canEngage = false;
# if (aa_mrm.IsValid() &&
# aa_mrm.QuantityRemaining() >= salvoSize &&
# currentTarget.IsValid() &&
# PLATFORM.GroundRangeTo(currentTarget) < launchRange &&
# WeaponsActiveFor(currentTarget.TrackId()) < 1
# )
# {
# aa_mrmUseful[weaponName] = 1;
# canEngage = true;
# }
# return canEngage;
#end_script
#
## Engage
#script void Engage()
# if (CanEngage())
# {
# if (aa_mrmUseful.Exists(weaponName))
# {
# if (aa_mrmUseful[weaponName] == 1)
# {
# Fire(currentTarget, "FIRE", weaponName, salvoSize, PLATFORM);
# aa_mrmUseful[weaponName] = 0; //
# }
# }
# }
# else
# {
# writeln_d("Cannot engage: Conditions not met.");
# }
#end_script
#
## Pursue
#script bool Pursue()
# if (currentTarget.IsValid() && aa_mrm.QuantityRemaining() > 0)
# {
# double distanceToTarget = PLATFORM.GroundRangeTo(currentTarget);
# if (distanceToTarget >= launchRange)
# {
# writeln_d("Target is out of range. Moving closer...");
# PLATFORM.GoToLocation(currentTarget.CurrentLocation());
# return true;
# }
# }
# return false;
#end_script
#
## TrackAndEngage
#script void TrackAndEngage()
# currentTarget = SelectClosestTrack();
# if (currentTarget.IsValid())
# {
# writeln_d("Selected target ID: ", currentTarget.TrackId());
# if (CanEngage())
# {
# Engage();
# }
# else
# {
# Pursue();
# }
# }
# else
# {
# writeln_d("No valid targets available.");
# }
#end_script
#
## States
#
#evaluation_interval IDLE 1 sec
#state IDLE
# on_entry
# writeln_d("Entering IDLE state.");
# currentTarget = SelectClosestTrack();
# end_on_entry
#
# next_state TRACKING
# return currentTarget.IsValid();
# end_next_state
#
# on_exit
# writeln_d("Exiting IDLE state.");
# end_on_exit
#end_state
#
#evaluation_interval TRACKING 1 sec
#state TRACKING
# on_entry
# writeln_d("Entering TRACKING state.");
# currentTarget = SelectClosestTrack();
# end_on_entry
#
# next_state ENGAGING
# return CanEngage();
# end_next_state
#
# next_state PURSUING
# return Pursue() && !CanEngage();
# end_next_state
#
# on_exit
# writeln_d("Exiting TRACKING state.");
# end_on_exit
#end_state
#
#evaluation_interval ENGAGING 1 sec
#state ENGAGING
# on_entry
# writeln_d("Entering ENGAGING state.");
# Engage();
# end_on_entry
#
# next_state IDLE
# return !currentTarget.IsValid() || aa_mrm.QuantityRemaining() < salvoSize;
# end_next_state
#
# next_state TRACKING
# return currentTarget.IsValid() && !CanEngage();
# end_next_state
#
# on_exit
# writeln_d("Exiting ENGAGING state.");
# end_on_exit
#end_state
#
#evaluation_interval PURSUING 1 sec
#state PURSUING
# on_entry
# writeln_d("Entering PURSUING state.");
# end_on_entry
#
# next_state MOVE_TO_TARGET
# return PLATFORM.GroundRangeTo(currentTarget) >= launchRange;
# end_next_state
#
# next_state TRACKING
# return PLATFORM.GroundRangeTo(currentTarget) < launchRange;
# end_next_state
#
# next_state IDLE
# return !currentTarget.IsValid();
# end_next_state
#
# on_exit
# writeln_d("Exiting PURSUING state.");
# end_on_exit
#end_state
#
#evaluation_interval MOVE_TO_TARGET 1 sec
#state MOVE_TO_TARGET
# on_entry
# writeln_d("Entering MOVE_TO_TARGET state.");
# WsfGeoPoint targetLocation = currentTarget.CurrentLocation();
# PLATFORM.GoToLocation(targetLocation);
# end_on_entry
#
# next_state PURSUING
# return PLATFORM.GroundRangeTo(currentTarget) < launchRange;
# end_next_state
#
# next_state IDLE
# return !currentTarget.IsValid();
# end_next_state
#
# on_exit
# writeln_d("Exiting MOVE_TO_TARGET state.");
# end_on_exit
#end_state
#
#end_processor
#processor aa_intercept WSF_TASK_PROCESSOR
#
## Update interval
#update_interval 5 sec
#
## Script variables
#script_variables
# double launchRange = 20 * MATH.M_PER_NM(); //
# double minRange = launchRange * 0.3; // 30%
# double speedFactor = 1.2; // 20%
# string weaponName = "aa_mrm"; //
# WsfWeapon aa_mrm = PLATFORM.Weapon(weaponName); //
# WsfTrack currentTarget; //
#end_script_variables
#
## SelectClosestTrack
#script WsfTrack SelectClosestTrack()
# WsfTrack closestTarget;
# double closestDistance = 1000000000; //
# foreach (WsfTrack track in PLATFORM.MasterTrackList())
# {
# if (track.IsValid() && PLATFORM.GroundRangeTo(track) < closestDistance)
# {
# closestTarget = track;
# closestDistance = PLATFORM.GroundRangeTo(track);
# }
# }
# return closestTarget;
#end_script
#
## AdjustSpeedTowardsTarget
#script void AdjustSpeedTowardsTarget()
# if (currentTarget.IsValid())
# {
# double targetSpeed = currentTarget.Speed();
# double platformSpeed = PLATFORM.Speed();
# double adjustedSpeed = targetSpeed * speedFactor;
#
# if (platformSpeed != adjustedSpeed)
# {
# writeln_d("Adjusting speed to match target...");
# PLATFORM.GoToSpeed(adjustedSpeed); //
# }
# }
#end_script
#
## MaintainOptimalDistance
#script void MaintainOptimalDistance()
# if (currentTarget.IsValid())
# {
# double distanceToTarget = PLATFORM.GroundRangeTo(currentTarget);
# WsfGeoPoint targetLocation = currentTarget.CurrentLocation();
#
# if (distanceToTarget > launchRange) //
# {
# writeln_d("Target out of range, moving closer...");
# PLATFORM.GoToLocation(targetLocation);
# }
# else if (distanceToTarget < minRange) //
# {
# writeln_d("Too close to target, increasing distance...");
## WsfGeoPoint evadeLocation = PLATFORM.Location().OffsetBy(minRange, MATH.OppositeAngle(PLATFORM.BearingTo(targetLocation)));
## PLATFORM.GoToLocation(evadeLocation);
# }
# else
# {
# writeln_d("Optimal distance maintained.");
# }
# }
#end_script
#
## CanEngage
#script bool CanEngage()
# bool canEngage = false;
# if (aa_mrm.IsValid() &&
# aa_mrm.QuantityRemaining() >= 2 &&
# currentTarget.IsValid() &&
# PLATFORM.GroundRangeTo(currentTarget) < launchRange &&
# WeaponsActiveFor(currentTarget.TrackId()) < 1
# )
# {
# canEngage = true;
# }
# return canEngage;
#end_script
#
## Engage
#script void Engage()
# if (CanEngage())
# {
# Fire(currentTarget, "FIRE", weaponName, 2, PLATFORM);
# }
# else
# {
# writeln_d("Cannot engage: Conditions not met.");
# }
#end_script
#
## States
#
#evaluation_interval IDLE 1 sec
#state IDLE
# on_entry
# writeln_d("Entering IDLE state.");
# currentTarget = SelectClosestTrack();
# end_on_entry
#
# next_state TRACKING
# return currentTarget.IsValid();
# end_next_state
#
# on_exit
# writeln_d("Exiting IDLE state.");
# end_on_exit
#end_state
#
#evaluation_interval TRACKING 1 sec
#state TRACKING
# on_entry
# writeln_d("Entering TRACKING state.");
# currentTarget = SelectClosestTrack();
# end_on_entry
#
# next_state ENGAGING
# return CanEngage();
# end_next_state
#
# next_state PURSUING
# return currentTarget.IsValid() && !CanEngage();
# end_next_state
#
# on_exit
# writeln_d("Exiting TRACKING state.");
# end_on_exit
#end_state
#
#evaluation_interval ENGAGING 1 sec
#state ENGAGING
# on_entry
# writeln_d("Entering ENGAGING state.");
# Engage();
# end_on_entry
#
# next_state IDLE
# return !currentTarget.IsValid() || aa_mrm.QuantityRemaining() < 2;
# end_next_state
#
# next_state TRACKING
# return currentTarget.IsValid() && !CanEngage();
# end_next_state
#
# on_exit
# writeln_d("Exiting ENGAGING state.");
# end_on_exit
#end_state
#
#evaluation_interval PURSUING 1 sec
#state PURSUING
# on_entry
# writeln_d("Entering PURSUING state.");
# end_on_entry
#
# next_state ADJUSTING_SPEED
# return currentTarget.IsValid();
# end_next_state
#
# next_state IDLE
# return !currentTarget.IsValid();
# end_next_state
#
# on_exit
# writeln_d("Exiting PURSUING state.");
# end_on_exit
#end_state
#
#evaluation_interval ADJUSTING_SPEED 1 sec
#state ADJUSTING_SPEED
# on_entry
# writeln_d("Entering ADJUSTING_SPEED state.");
# AdjustSpeedTowardsTarget();
# MaintainOptimalDistance();
# end_on_entry
#
# next_state PURSUING
# return true; // PURSUING
# end_next_state
#
# on_exit
# writeln_d("Exiting ADJUSTING_SPEED state.");
# end_on_exit
#end_state
#
#end_processor
processor aa_intercept WSF_TASK_PROCESSOR
# Update interval
update_interval 5 sec
# Script variables
script_variables
double launchRange = 20 * MATH.M_PER_NM(); //
double minRange = launchRange * 0.3; //
double speedFactor = 1.2; // 20%
string weaponName = "aa_mrm"; //
WsfWeapon aa_mrm = PLATFORM.Weapon(weaponName); //
WsfTrack currentTarget; //
end_script_variables
# SelectClosestTrack
script WsfTrack SelectClosestTrack()
WsfTrack closestTarget;
double closestDistance = 1000000000; //
foreach (WsfTrack track in PLATFORM.MasterTrackList())
{
if (track.IsValid() && PLATFORM.GroundRangeTo(track) < closestDistance)
{
closestTarget = track;
closestDistance = PLATFORM.GroundRangeTo(track);
}
}
return closestTarget;
end_script
# PursueLogic
script void PursueLogic()
if (currentTarget.IsValid())
{
double distanceToTarget = PLATFORM.GroundRangeTo(currentTarget);
double targetSpeed = currentTarget.Speed();
double platformSpeed = PLATFORM.Speed();
double adjustedSpeed = targetSpeed * speedFactor;
//
if (platformSpeed != adjustedSpeed)
{
PLATFORM.GoToSpeed(adjustedSpeed);
}
//
if (distanceToTarget > launchRange)
{
PLATFORM.GoToLocation(currentTarget.CurrentLocation());
writeln("Moving closer to target...");
}
}
end_script
# CanEngage
script bool CanEngage()
bool canEngage = false;
if (aa_mrm.IsValid() &&
aa_mrm.QuantityRemaining() >= 1 &&
currentTarget.IsValid() &&
PLATFORM.GroundRangeTo(currentTarget) < launchRange &&
WeaponsActiveFor(currentTarget.TrackId()) < 1
)
{
canEngage = true;
}
return canEngage;
end_script
# Engage
script void Engage()
if (CanEngage())
{
Fire(currentTarget, "FIRE", weaponName, 1, PLATFORM);
}
else
{
writeln("Cannot engage: Conditions not met.");
}
end_script
# States
evaluation_interval IDLE 10 sec
state IDLE
on_entry
writeln("Entering IDLE state.");
currentTarget = SelectClosestTrack();
end_on_entry
next_state TRACKING
return currentTarget.IsValid();
end_next_state
on_exit
writeln("Exiting IDLE state.");
end_on_exit
end_state
evaluation_interval TRACKING 10 sec
time_to_evaluate TRACKING 30 s
state TRACKING
on_entry
writeln("Entering TRACKING state.");
currentTarget = SelectClosestTrack();
end_on_entry
next_state ENGAGING
return CanEngage();
end_next_state
next_state PURSUING
return currentTarget.IsValid() && !CanEngage();
end_next_state
on_exit
writeln("Exiting TRACKING state.");
end_on_exit
end_state
evaluation_interval ENGAGING 10 sec
state ENGAGING
on_entry
writeln("Entering ENGAGING state.");
Engage();
end_on_entry
next_state IDLE
return !currentTarget.IsValid() || aa_mrm.QuantityRemaining() == 0;
end_next_state
next_state TRACKING
return currentTarget.IsValid() && !CanEngage();
end_next_state
on_exit
writeln("Exiting ENGAGING state.");
end_on_exit
end_state
evaluation_interval PURSUING 10 sec
state PURSUING
on_entry
writeln("Entering PURSUING state.");
end_on_entry
next_state ENGAGING
return CanEngage(); //
end_next_state
next_state TRACKING
return !currentTarget.IsValid();
end_next_state
on_exit
writeln("Exiting PURSUING state.");
end_on_exit
end_state
script bool pursueCondition()
return (
aa_mrm.QuantityRemaining() > 0 &&
currentTarget.IsValid()
);
end_script
update_interval 100 sec
on_update
if(pursueCondition())
{
PursueLogic();
}
if(aa_mrm.QuantityRemaining() < 0 &&
!currentTarget.IsValid() )
{
PROCESSOR.TurnOff();
}
end_on_update
end_processor