Files
lab1/processors/ripr_agents/aiai/old.formations.old/four.script
2025-09-12 15:20:28 +08:00

202 lines
6.2 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.
# ****************************************************************************
//compile_debug true
script_variables
// TEMPORARY eventually get this from a waypoint or a battle manager
string mManeuverName = "la";
string mFlightName = "four";
int mFlightIndex = -1;
bool mFirstPass = true;
WsfAIFLProcessor mFlightLeadAgent;
end_script_variables
include_once aiai_scripts.txt
include_once formation.script
include_once la_methods.script
on_initialize
// check in to the FlightLead agent
mFlightLeadAgent = (WsfAIFLProcessor)(PROCESSOR.GetCommander());
writeln_d(" mFlightLeadAgent.IsValid() == ", mFlightLeadAgent.IsValid());
// mFlightLeadAgent.CheckIn(PLATFORM, false);
// tweak the formation flying for fueling
formation_initialize(0.2 * MATH.M_PER_NM(), // waypoint proximity
5.0 * MATH.M_PER_NM(), // far from waypoint
0.4, // min mach
1.5, // max mach
2.0 * MATH.M_PER_NM()); // out of formation
aiai_initialize();
end_on_initialize
script void lead_wait_logic()
// get the tracks from my flight
WsfLocalTrackList flightTracks = mFlightLeadAgent.FlightTrackList();
// assume targets are in-bound to my flight and find the smallest range
// target selection should be done A LOT better
double minRange = 9999999.9;
WsfTrack closestTrack = NULL;
foreach (WsfTrack track in flightTracks)
{
if (DetermineTargetType(track) == "unknown")
{
continue;
}
double thisRange = PLATFORM.SlantRangeTo(track);
writeln_d(" considering: ", track.TargetName(), " at ", thisRange);
if (thisRange < minRange)
{
minRange = thisRange;
closestTrack = track;
}
}
// if I'm within range of to start the formation tactic, do it
if (minRange < cSTART_MANEUVER_RANGE && closestTrack.IsValid())
{
writeln_d("Maneuver started at range: ", minRange);
mFlightLeadAgent.TargetSet(closestTrack);
PLATFORM.Comment("Maneuver started...");
mFlightLeadAgent.SetTopState("FLIGHT_MANEUVER");
}
if (closestTrack.IsValid())
{
mFlightLeadAgent.TargetSet(closestTrack);
PLATFORM.Comment("Range to target: " + (string)minRange);
// turn towards the track
double heading = PLATFORM.TrueBearingTo(closestTrack);
PLATFORM.TurnToHeading(heading);
PLATFORM.GoToAltitude(closestTrack.Altitude());
PLATFORM.GoToSpeed(cINTERCEPT_SPEED);
}
else
{
// PLATFORM.GoToAltitude(cDEFAULT_ALTITUDE);
// PLATFORM.GoToSpeed(cWAIT_SPEED);
}
end_script
on_update
string flightTopState = "*NO*FLIGHT*LEAD*";
writeln_d("--- four on_update Platform: ", PLATFORM.Name(), ", Time: ", TIME_NOW);
// string myTopState = PLATFORM.GetTopState();
if (!mFlightLeadAgent.IsValid())
{
mFlightLeadAgent = (WsfAIFLProcessor)(PROCESSOR.GetCommander());
if (mFlightLeadAgent.IsValid())
{
writeln_d(" acquired mFlightLeadAgent ", mFlightLeadAgent.Name());
}
else
{
// aiai_update();
// can't do anything without a FL
return;
}
}
flightTopState = mFlightLeadAgent.GetTopState();
writeln_d(" flightTopState: ", flightTopState);
// one time transition to FLIGHT_WAIT state
// if ((myTopState == "STRAIGHT") && (mFirstPass == true))
if (mFirstPass == true)
{
mFlightLeadAgent.AssignNewLead(0);
// PLATFORM.SetTopState("FLIGHT_WAIT");
mFirstPass = false;
}
// if my flight has been disrupted, just go to ai logic
if (!mFlightLeadAgent.FlightIntact())
{
aiai_update();
return;
}
// the flight is waiting for something to act on
// - lead flies straight and level
// - flight follows the lead in formation
writeln_d(" mFlightIndex: ", mFlightIndex);
// if (myTopState == "FLIGHT_WAIT")
// extern string mFlightName;
if (mFlightName == "four")
{
writeln_d(" four...");
// if lead has commanded to do the maneuver, do it
if (flightTopState == "FLIGHT_SOLO")
{
aiai_update();
return;
}
else if (flightTopState == "FLIGHT_MANEUVER")
{
writeln_d(" FLIGHT_MANEUVER...");
// get my position in the flight if not done already
// if (mFlightIndex < 0)
// {
mFlightIndex = mFlightLeadAgent.GetFormationIndex(PLATFORM) + 1;
writeln_d(" mFlightIndex acquired == ", mFlightIndex);
// }
perform_maneuver(mFlightIndex);
}
else if (flightTopState == "FLIGHT_RELEASE")
{
if (mFlightLeadAgent.GetLeadStatus(PLATFORM) == true && !mFlightLeadAgent.TargetPlatformGet().IsValid())
{
writeln_d(" target dead, FLIGHT_WAIT");
mFlightLeadAgent.SetTopState("FLIGHT_WAIT");
// PLATFORM.FollowRoute("DEFAULT_ROUTE", "CLOSEST_POINT");
PLATFORM.FollowRoute("DEFAULT_ROUTE");
return;
}
writeln_d(" FLIGHT_RELEASE...");
aiai_update();
return;
}
else
{
writeln_d(" other (", flightTopState, ")...");
if (mFlightLeadAgent.GetLeadStatus(PLATFORM) == true)
{
writeln_d(" I am lead, so wait");
SetUpdateInterval(cFAST_UPDATE_RATE);
// PLATFORM.GoToLocation(0, 0, 0); // trying to trick mover so next FollowRoute works right
// PLATFORM.FollowRoute("DEFAULT_ROUTE", "CLOSEST_POINT");
// PLATFORM.FollowRoute("line", "CLOSEST_POINT");
lead_wait_logic();
}
else
{
writeln_d(" follow the leader");
// follow the lead
WsfPlatform leadPlatform = mFlightLeadAgent.GetPlatformInFormation(-1);
SetFollowingFormationIndex(-1);
mManeuverState = 0;
SetUpdateInterval(cFAST_UPDATE_RATE);
formation_update(leadPlatform);
}
}
}
end_on_update