init
This commit is contained in:
329
platforms/brawler/alternatives/behavior_weapon_decision_gun.txt
Normal file
329
platforms/brawler/alternatives/behavior_weapon_decision_gun.txt
Normal file
@@ -0,0 +1,329 @@
|
||||
# ****************************************************************************
|
||||
# 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 aslct7.f and akshn7.f
|
||||
// Replicates the gun fire 7,3,7,x alternative behavior
|
||||
|
||||
include_once BrawlerScriptUtil.txt
|
||||
|
||||
behavior weapon_decision_gun
|
||||
|
||||
script_debug_writes off
|
||||
|
||||
script_variables
|
||||
|
||||
double RNGWPN = 3000.0; #feet (from MIND file)
|
||||
|
||||
WsfQuantumTaskerProcessor processor;
|
||||
WsfBrawlerPlatform brawlerPlatform;
|
||||
|
||||
//**********************************************************************//
|
||||
//** debugging parameters **//
|
||||
//**********************************************************************//
|
||||
bool mDrawGuns = true;
|
||||
WsfDraw mDraw = WsfDraw();
|
||||
|
||||
//**********************************************************************//
|
||||
//** alternative parameters **//
|
||||
//**********************************************************************//
|
||||
// Flag used to enable/disable this alternative
|
||||
// Takes the place of production rules
|
||||
bool mAlternative7371Enabled = true;
|
||||
|
||||
// Alternative ID
|
||||
int ilevel = 7;
|
||||
int kalt = 3;
|
||||
int icall = 7; // Always 7 for gun
|
||||
int lcall = 1;
|
||||
|
||||
|
||||
end_script_variables
|
||||
|
||||
on_init
|
||||
if (PROCESSOR.IsA_TypeOf("WSF_QUANTUM_TASKER_PROCESSOR"))
|
||||
{
|
||||
processor = (WsfQuantumTaskerProcessor)PROCESSOR;
|
||||
}
|
||||
|
||||
// Needed?
|
||||
brawlerPlatform = (WsfBrawlerPlatform)PLATFORM;
|
||||
end_on_init
|
||||
|
||||
// Replicates the checks done in canfirg.f
|
||||
// Return true if the gun can be fired ("hard" checks)
|
||||
// Sets the string to the fail reason
|
||||
script bool canfirg(string failMsg)
|
||||
/*
|
||||
cnfire = .false.
|
||||
C --NOTE THAT WE ARE RECALCULATING PILOT POSTURE VARIABLES HERE
|
||||
C --ppmrmx WILL BE NEEDED IN shldfrg, SO PERFORM THIS CALCULATION
|
||||
C --UNCONDITIONALLY.
|
||||
call gunenv(xp(1,me),vp(1,me),xp(1,ppmiac),vp(1,ppmiac),
|
||||
1 ppmptr,ppmrmn,ppmrmx,ppmapt,ppmse,ppmaof,ppmenv,ppmtrk,ppmohr,
|
||||
2 rbep )
|
||||
C --If temp midway in a 0.5 second burst exceeds maximum (1.0 by
|
||||
C --definition) then you can't shoot. Rate of temperature rise
|
||||
C --is 1.0/t_to_heat, so that firing for t_to_heat seconds reaches
|
||||
C --the limit.
|
||||
overheat = (gun_temp+0.25/t_to_heat .gt. 1.0)
|
||||
if (overheat) then
|
||||
rsfail = 'GUN OVERHEAT'
|
||||
return
|
||||
endif
|
||||
C
|
||||
C --CHECK IF TARGET IS IN ENVELOPE
|
||||
if (.not.ppmenv) then
|
||||
rsfail = 'NOT IN ENVELOPE '
|
||||
return
|
||||
endif
|
||||
C
|
||||
C --CHECK ON PROBABILITY IN RANGE
|
||||
pinrng = prmax2(ppmiac,ppmrmx,1.0,0.2)
|
||||
pbinrg = pinrng.ge.pr2lim
|
||||
if (.not.pbinrg) then
|
||||
rsfail = 'LOW PROB IN RANGE'
|
||||
return
|
||||
endif
|
||||
C
|
||||
visacq = inform(ppmiac).eq.1 .and. time.le.seet(ppmiac)+0.5
|
||||
C --If pilot has not had a recent visual (or does not have a
|
||||
C --radar lock if rdrgun is set), then gun can't be fired.
|
||||
if(.not.rdrgun) then
|
||||
C --DO I HAVE A RECENT VISUAL?
|
||||
if(.not.visacq) then
|
||||
rsfail = 'NO RECENT VISUAL'
|
||||
return
|
||||
endif
|
||||
else
|
||||
C --AN ESTABLISHED RADAR TRACK MAY SUBSTITUTE FOR A VISUAL
|
||||
C --IF RDRGUN=.TRUE.
|
||||
call lockid(iacid,ppmjid,locked)
|
||||
gunacq = visacq .or. locked.eq.2
|
||||
if(.not.gunacq) then
|
||||
rsfail = 'NO RECENT VISUAL OR LOCK'
|
||||
return
|
||||
endif
|
||||
endif
|
||||
C
|
||||
cnfire = .true.
|
||||
*/
|
||||
#bool canFire = false;
|
||||
bool canFire = true; #LBM - temporary
|
||||
|
||||
return canFire;
|
||||
end_script
|
||||
|
||||
// Replicates the checks done in shldfrg.f
|
||||
// Return true if the should should be fired ("soft" checks)
|
||||
// Sets the string to the fail reason if any
|
||||
script bool shldfrg(string failMsg)
|
||||
/*
|
||||
C --If target is inside Rmax2, don't need the following
|
||||
C --tests(target is inside no-escape range).
|
||||
C --CHECK THAT PILOT BELIEVES RANGE IS OK FOR TARGETING
|
||||
pinrng = prmax2(ppmiac,ppmrmx,ppm_rpeak,0.2)
|
||||
pbinrg = pinrng.ge.pr2lim
|
||||
call pdset('PROB_IN_RANGE',pbinrg)
|
||||
C
|
||||
C --CALCULATE CURRENT ENVELOPE LEVEL; ppmrmx WAS RECALCULATED IN canfirg
|
||||
elevnow = envlvg(rngnow(me,ppmiac),rdotme(ppmiac),ppmse,ppmrmx,
|
||||
1 'SHOOT')
|
||||
C --CALCULATE PROJECTED ENVELOPE, CONSTANT VELOCITY PROJECTION FOR
|
||||
C --ME AND CURRENT ACCELERATION PROJECTION FOR TARGET.
|
||||
C --call vecinc(xp(1,me),tproj3,vp(1,me),xme)
|
||||
C --Full projection for target, fixed velocity projection
|
||||
C --for attacker.
|
||||
C --call gunenv(xme,vp(1,me),xeut(1,ppmiac),veut(1,ppmiac),
|
||||
call gunenv(xeuan,veuan,xeut(1,ppmiac),veut(1,ppmiac),
|
||||
1 ppmptr,rmin,rmax,aimp,se,aof,inenvp,trkbl,ovrhoz,rbep)
|
||||
elevprj = envlvg(rngun(ppmiac),rngrun(ppmiac),se,rmax,'SHOOT')
|
||||
if(lprnt) write(ioutp,2000) rmin,rmax,rng(ppmiac),aimp,se,aof,
|
||||
1 elevprj
|
||||
C
|
||||
C --CHECK PROJECTION -- IS LEVEL DECREASING?
|
||||
worse = (elevnow.ge.elevprj)
|
||||
call pdset('SHOT_WORSENING',worse)
|
||||
C
|
||||
needid = (irel(ppmiac).eq.0) .and. (id_mode.ne.bvr_id_md)
|
||||
call pdset('SURE_BAD_GUY',.not.needid)
|
||||
C
|
||||
if (needid)then
|
||||
lfire = .false.
|
||||
rsfail = 'NEED ID'
|
||||
elseif(.not.(pbinrg.or.worse))then
|
||||
rsfail = '!(IN RPEAK OR WORSE)'
|
||||
lfire = .false.
|
||||
else
|
||||
lfire = .true.
|
||||
endif
|
||||
*/
|
||||
# bool lfire = false;
|
||||
bool lfire = true; #LBM - temporary
|
||||
|
||||
|
||||
return lfire;
|
||||
end_script
|
||||
|
||||
precondition
|
||||
#writeln_d(PLATFORM.Name(), " precondition weapon_decision_gun, 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");
|
||||
}
|
||||
|
||||
// aslct7.f line 123 - 132
|
||||
# --CHECK IF TARGET SELECTED
|
||||
# if (ppmiac .eq. 0 .and. .not.dewvmsl)then
|
||||
# rsfail = 'NO TARGET SELECTED'
|
||||
# goto 800
|
||||
# endif
|
||||
# --CHECK IF WEAPON SELECTED
|
||||
# if (ppmptr .eq. 0)then
|
||||
# rsfail = 'NO WEAPON SELECTED'
|
||||
# goto 800
|
||||
# endif
|
||||
WsfTaskList tasks = processor.TasksReceivedOfType("WEAPON");
|
||||
if(tasks.Count() <= 0)
|
||||
{
|
||||
return Failure("no target selected");
|
||||
}
|
||||
|
||||
WsfTrack targetTrack = PLATFORM.MasterTrackList().FindTrack(tasks.Entry(0).LocalTrackId());
|
||||
if (!targetTrack.IsValid())
|
||||
{
|
||||
return Failure("no valid target track");
|
||||
}
|
||||
|
||||
#LBM - temporary
|
||||
# // Weapon selection done in selwpn.f (called from aslct2.f)
|
||||
# // checks weapon inventory. Use a similar check here as a replacement
|
||||
# if (!HaveWeapon(PLATFORM))
|
||||
# {
|
||||
# // TODO Account for weapon type gun/missile
|
||||
# return Failure("no weapon selected");
|
||||
# }
|
||||
|
||||
if (!PLATFORM.Weapon("gun").IsValid() || PLATFORM.Weapon("gun").QuantityRemaining() <= 0)
|
||||
{
|
||||
writeln_d(" ", PLATFORM.Name(), " no weapon selected at time: ", TIME_NOW);
|
||||
return Failure("no weapon selected");
|
||||
}
|
||||
|
||||
# // aslct7() calls canfir().
|
||||
# // canfir.f checks production rules and GCI inhibit
|
||||
# // just doing a simple flag for now
|
||||
# if (!mAlternative7371Enabled)
|
||||
# {
|
||||
# writeln_d("behavior not enabled!");
|
||||
# return Failure("behavior alternative not enabled");
|
||||
# }
|
||||
#
|
||||
# //canfir.f calls canfirg()
|
||||
# string msg = "";
|
||||
# if (!canfirg(msg))
|
||||
# {
|
||||
# return Failure(msg);
|
||||
# }
|
||||
#
|
||||
# // aslct7 line 199 - 205
|
||||
# // if undamaged calls shldfr().
|
||||
# // if we are damaged skip checks and fire now
|
||||
# if (PLATFORM.DamageFactor() <= 0.0)
|
||||
# {
|
||||
# // shldfr.f just calls the specific weapon type
|
||||
# if (!shldfrg(msg))
|
||||
# {
|
||||
# return Failure(msg);
|
||||
# }
|
||||
# }
|
||||
#
|
||||
# // aslct7 creates and alternative to evaluate.
|
||||
# // The alternative has no projection and always
|
||||
# // evaluates to 1, so skip that processing
|
||||
|
||||
WsfWeapon gun = PLATFORM.Weapon("gun");
|
||||
if (gun.LaunchComputer().CanIntercept(targetTrack, 0.1)) #see "firing_delay" for BULLET weapon
|
||||
{
|
||||
WsfGeoPoint pt = gun.LaunchComputer().InterceptPoint();
|
||||
|
||||
#TODO - move slant range check to gun's launch computer???
|
||||
|
||||
if (PLATFORM.SlantRangeTo(pt) <= (RNGWPN * MATH.M_PER_FT()))
|
||||
{
|
||||
# #draw line to intercept point
|
||||
# if (mDrawGuns)
|
||||
# {
|
||||
# double delta = ((WsfBrawlerPlatform)PLATFORM).ProjectedTimeDelta();
|
||||
# mDraw.SetLayer("behavior_weapon_decision_gun");
|
||||
# mDraw.SetDuration(delta);
|
||||
# mDraw.SetColor(0.5, 0.5, 0.5); #gray
|
||||
# mDraw.SetLineSize(1);
|
||||
# mDraw.SetLineStyle("solid");
|
||||
# mDraw.BeginLines();
|
||||
# mDraw.Vertex(PLATFORM.Location());
|
||||
# mDraw.Vertex(pt);
|
||||
# mDraw.End();
|
||||
# }
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
writeln_d("no gun fire, too far away");
|
||||
return Failure("no gun fire, too far away");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
writeln_d("gun cannot intercept target yet");
|
||||
return Failure("gun cannot intercept target yet");
|
||||
}
|
||||
|
||||
// All conditions pass, weapon can fire
|
||||
return true;
|
||||
end_precondition
|
||||
|
||||
execute
|
||||
// Replicates akshn7.f
|
||||
// We don't need to do all the bookeeping that BRAWLER
|
||||
// does. Just launch the weapon.
|
||||
// TODO Fill in gun fire
|
||||
|
||||
|
||||
|
||||
#LBM - temporary
|
||||
WsfTrack targetTrack = PLATFORM.MasterTrackList().FindTrack(processor.TasksReceivedOfType("WEAPON").Entry(0).LocalTrackId());
|
||||
WsfWeapon weapon = PLATFORM.Weapon("gun");
|
||||
bool launched = weapon.FireSalvo(targetTrack, 1); // Always firing one for now
|
||||
if (!launched)
|
||||
{
|
||||
writeln_d(" ", PLATFORM.Name(), " could NOT fire at track: ", targetTrack.TargetName(), " at time: ", TIME_NOW);
|
||||
}
|
||||
else if (mDrawGuns)
|
||||
{
|
||||
double delta = ((WsfBrawlerPlatform)PLATFORM).ProjectedTimeDelta();
|
||||
|
||||
mDraw.SetLayer("behavior_weapon_decision_gun");
|
||||
mDraw.SetDuration(delta);
|
||||
mDraw.SetColor(1.0, 1.0, 1.0); #white
|
||||
mDraw.SetLineSize(2);
|
||||
mDraw.SetLineStyle("dotted2");
|
||||
mDraw.BeginLines();
|
||||
mDraw.Vertex(PLATFORM.Location());
|
||||
mDraw.Vertex(targetTrack.CurrentLocation());
|
||||
mDraw.End();
|
||||
}
|
||||
|
||||
end_execute
|
||||
|
||||
end_behavior
|
||||
|
||||
Reference in New Issue
Block a user