170 lines
6.0 KiB
Plaintext
170 lines
6.0 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.
|
||
|
|
# ****************************************************************************
|
||
|
|
|
||
|
|
// converted BRAWLER v7.5 alt34.f
|
||
|
|
// Replicates the 1v1 Offensive Maneuver 3,4,1,1 alternative behavior
|
||
|
|
// Straight Flight
|
||
|
|
//
|
||
|
|
// Operates on nearest perceived threat to generate maneuver alternative
|
||
|
|
|
||
|
|
behavior alt3411_straight_flight
|
||
|
|
|
||
|
|
script_debug_writes off
|
||
|
|
|
||
|
|
script_variables
|
||
|
|
|
||
|
|
WsfQuantumTaskerProcessor processor;
|
||
|
|
WsfPerceptionProcessor perception;
|
||
|
|
WsfBrawlerPlatform brawlerPlatform;
|
||
|
|
WsfLocalTrack targetTrack;
|
||
|
|
|
||
|
|
//**********************************************************************//
|
||
|
|
//** debugging parameters **//
|
||
|
|
//**********************************************************************//
|
||
|
|
bool mDrawSteering = false;
|
||
|
|
|
||
|
|
//**********************************************************************//
|
||
|
|
//** alternative parameters **//
|
||
|
|
//**********************************************************************//
|
||
|
|
// Flag used to enable/disable this alternative
|
||
|
|
bool mAlternative3411Enabled = true;
|
||
|
|
|
||
|
|
// Alternative ID
|
||
|
|
int ilevel = 3;
|
||
|
|
int kalt = 4;
|
||
|
|
int icall = 1;
|
||
|
|
int lcall = 1;
|
||
|
|
|
||
|
|
double mLongRange = 5.0 * Math.M_PER_NM();
|
||
|
|
|
||
|
|
Vec3 dir0;
|
||
|
|
double mGMX = 1.0;
|
||
|
|
double mSpd0 = 3.0;
|
||
|
|
|
||
|
|
// ALSO NEED:
|
||
|
|
// randomization to simulate imperfect decision making, valsig, read from MIND file, typically ~0.01
|
||
|
|
// Production rule bias, used in scoring of alternative
|
||
|
|
|
||
|
|
//**********************************************************************//
|
||
|
|
//********* VARIABLES BELOW THIS LINE ARE NOT FOR USER EDITING *********//
|
||
|
|
//**********************************************************************//
|
||
|
|
WsfDraw mDraw = WsfDraw();
|
||
|
|
double mLastTime = 0.0;
|
||
|
|
|
||
|
|
end_script_variables
|
||
|
|
|
||
|
|
on_init
|
||
|
|
if (PROCESSOR.IsA_TypeOf("WSF_QUANTUM_TASKER_PROCESSOR"))
|
||
|
|
{
|
||
|
|
processor = (WsfQuantumTaskerProcessor)PROCESSOR;
|
||
|
|
}
|
||
|
|
perception = (WsfPerceptionProcessor)PLATFORM.Processor("perception");
|
||
|
|
brawlerPlatform = (WsfBrawlerPlatform)PLATFORM;
|
||
|
|
end_on_init
|
||
|
|
|
||
|
|
precondition
|
||
|
|
#writeln_d(PLATFORM.Name(), " precondition behavior_alt3411_straight_flight, T=", TIME_NOW);
|
||
|
|
|
||
|
|
### Evaluate conditions that would prevent behavior alternative from running
|
||
|
|
|
||
|
|
if (!PROCESSOR.IsA_TypeOf("WSF_QUANTUM_TASKER_PROCESSOR"))
|
||
|
|
{
|
||
|
|
writeln_d("not a quantum tasker!");
|
||
|
|
return Failure("behavior not attached to a WSF_QUANTUM_TASKER_PROCESSOR");
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!mAlternative3411Enabled)
|
||
|
|
{
|
||
|
|
writeln_d("behavior not enabled!");
|
||
|
|
return Failure("behavior alternative not enabled");
|
||
|
|
}
|
||
|
|
|
||
|
|
WsfTaskList tasks = processor.TasksReceivedOfType("WEAPON");
|
||
|
|
if(tasks.Count() <= 0)
|
||
|
|
{
|
||
|
|
return Failure("no weapon (target) tasks!");
|
||
|
|
}
|
||
|
|
WsfTask targetTask = tasks.Entry(0);
|
||
|
|
targetTrack = PLATFORM.MasterTrackList().Find(targetTask.LocalTrackId());
|
||
|
|
if (!targetTrack.IsValid())
|
||
|
|
{
|
||
|
|
return Failure("no target track!");
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get nearest hostile and check that range is less than max
|
||
|
|
// alt34.f line 114
|
||
|
|
WsfTrack nearestHostile = perception.NearestThreat();
|
||
|
|
double rangeToNearest = 999999999; # default large value, in meters
|
||
|
|
if (nearestHostile.IsValid() &&
|
||
|
|
nearestHostile.LocationValid())
|
||
|
|
{
|
||
|
|
rangeToNearest = nearestHostile.SlantRangeTo(PLATFORM);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!nearestHostile.IsValid())
|
||
|
|
{
|
||
|
|
writeln_d("nearest hostile not valid!");
|
||
|
|
return Failure("no vaild hostiles closer than 5 nautical miles");
|
||
|
|
}
|
||
|
|
|
||
|
|
if (rangeToNearest > mLongRange)
|
||
|
|
{
|
||
|
|
writeln_d("nearest hostile too far away! (", rangeToNearest," m)");
|
||
|
|
return Failure("no vaild hostiles closer than 5 nautical miles");
|
||
|
|
}
|
||
|
|
|
||
|
|
// ALL CONDITIONS PASS
|
||
|
|
### Generate Maneuver Alternative
|
||
|
|
# alt34.f line 115 - 121
|
||
|
|
# iactn = 4
|
||
|
|
# call vnorm(vp(1,me),dir0) - get a unit vector (dir0) of my current velocity vector
|
||
|
|
# gmx = amin1(3.,gmxsu) - take the smaller of 3.0 and Maximum load possible at maximum thrust
|
||
|
|
# spd0 = 3.
|
||
|
|
# spdmod = thrttl (desspd = 1, thrttl = 2, desacc = 3)
|
||
|
|
int iactn = 4;
|
||
|
|
dir0 = PLATFORM.VelocityNED().Normal();
|
||
|
|
mGMX = Math.Min(3.0, brawlerPlatform.MaxSustainedGs());
|
||
|
|
mSpd0 = 3.0;
|
||
|
|
int spdmod = 2; // thrttl
|
||
|
|
|
||
|
|
### Project and Evaluate (Score) Maneuver Alternative
|
||
|
|
// Alternative is only projected tproj sec and then evaluated
|
||
|
|
double alternativeScore = brawlerPlatform.EvaluateVectorWithThrottle(dir0, mGMX, mSpd0, ilevel, kalt, icall, lcall);
|
||
|
|
writeln_d(PLATFORM.Name(), " behavior_alt3411_straight_flight score = ", alternativeScore, ", T=", TIME_NOW);
|
||
|
|
|
||
|
|
### Return Maneuver Alternative Score
|
||
|
|
return alternativeScore;
|
||
|
|
|
||
|
|
end_precondition
|
||
|
|
|
||
|
|
|
||
|
|
execute
|
||
|
|
#writeln_d(PLATFORM.Name(), " executing behavior_alt3411_straight_flight, T=", TIME_NOW);
|
||
|
|
brawlerPlatform.FlyVectorWithThrottle(dir0, mGMX, mSpd0);
|
||
|
|
|
||
|
|
# if (mDrawSteering == true)
|
||
|
|
# {
|
||
|
|
# mDraw.SetLayer("behavior_pursue_target");
|
||
|
|
# mDraw.SetDuration(processor.UpdateInterval());
|
||
|
|
# mDraw.SetColor(1.0, 0.5, 0.0);
|
||
|
|
# mDraw.SetLineSize(1);
|
||
|
|
# mDraw.BeginLines();
|
||
|
|
# mDraw.Vertex(PLATFORM.Location());
|
||
|
|
# mDraw.Vertex(mTargetPoint);
|
||
|
|
# mDraw.End();
|
||
|
|
# }
|
||
|
|
#
|
||
|
|
# string msg = write_str("pursue-target: ", targetTrack.TargetName(), " at speed ", (string)mTargetSpeed);
|
||
|
|
# writeln_d(" T=", TIME_NOW, " ", PLATFORM.Name(), " ", msg);
|
||
|
|
# FlyTarget( PLATFORM, mTargetPoint, mTargetSpeed);
|
||
|
|
end_execute
|
||
|
|
|
||
|
|
end_behavior
|
||
|
|
|