So here's what I have so far... mind you that this is *completely* untested and I have no idea if it works. Its up for testing to those with the time and/or patience to do so.
Unfortunately I'm going on vacation today and won't be back until next week to test it myself.
For what its worth, draft #1 is:
CIWS doctrine changes:
Code:
; $Header: CIWS.txt Wed Dec 15 17:34:41 EST 2004 mike $
; $Revision: 4 $
; $Copyrt1: Copyright (c) 2003, Sonalysts, Inc. All rights reserved. $
;
; CIWS Self-defense
var CMTimer
; New Track
IF NEWTRACK THEN {
; Set Tactic
IF TgtClass $= "MISSILE" OR ( TgtClass $= "AIR" ) THEN {
SETTACTIC "CIWSAttack"
} ENDIF
; Auto Evade Torps
IF TgtClass $= "WEAP" AND NOT ( TgtType $= "SONOBUOY" ) THEN {
SETTACTIC "SurfEvadeWeap"
} ENDIF
; Steer away from a hostile sub
IF TgtClass $= "sub" AND ( TgtID $= "Hostile" ) THEN {
DEBUGOUT "target bearing"
DEBUGVALUEOUT TgtBrg
SETTACTIC "SurfAvoidSub"
} ENDIF
} ENDIF
SurfAvoidSub Doctrine
Code:
; SurfAvoidSubDef
var LegTimer
var Avoid
var DoctrinePriority
var InitSpeed
var LegTimer
var RunTime
var InitTime
IF INIT THEN {
Avoid = true
InitSpeed = OwnSpd
LegTimer = -1
InitTime = TIME
} ELSEIF ( LegTimer = -1 ) AND NOT ( LostTrack ) THEN {
SetPriority DoctrinePriority
IF TgtRng < ( ( 80000 + RND 5000 ) ) AND ( TgTID $= "HOSTILE" ) THEN {
IF ( TgtID $= "HOSTILE" ) and ( Order $= "ENGAGE" ) THEN {
IF AssignedTarget THEN {
DebugOut "Switching from Avoid to Attack"
Avoid = False
SetTactic "SurfAtkSub"
} ELSEIF TgtID $= "HOSTILE" AND NOT AssignedTarget THEN {
DebugOut "Avoiding Hostile Sub!"
IF ( TgtRng < ( 50000 + RND 10000 ) ) THEN {
DEBUGOUT "Very Close! Evading!"
SetCrs ( TgtBrg + 70 + Rnd 50 )
SetSpd MaxSpd
LegTimer = 900 + Rnd 300
IniTime = Time
} ELSE {
DEBUGOUT "Enemy afar, circuling around"
SetCrs ( TgtBrg + 80 + Rnd 10 )
LegTimer = TgtRng / OwnSpd
} ENDIF
} ENDIF
IF TIME > InitTime + LegTimer THEN {
LegTimer = -1
} ENDIF
} ENDIF
SurfAtkSub Doctrine
Code:
; SubAtkSubDef -- SCX 1.3
Edited by LoBlo 10/20/2008 for surface ships
var LegTimer
var MinFiringRng
var OrigSpeed
var ClosingSpeed
var TargetOpening ; 0 = Closing target, 1 = Receding target
var ApproachAngle
var DoctrinePriority ; priority of this action, modified by game
var SnapShot ; indicates if we did a shot already at active pinger
var PingSolve ; Wait for Ping ... Plot Snapshot
var Solution2
var Solution3
IF ( INIT ) THEN {
MinFiringRng = ( 4500 + RND 2500 )
DoctrinePriority = 200
ApproachAngle = TgtBrg
SnapShot = FALSE
PingSolve = ( Time + 15 + ( TgtRng / 1700 ) )
Solution2 = ( 30 + RND 20 )
Solution3 = ( 50 + RND 20 )
} ELSE {
; let surf attack sub
IF ( DoctrinePriority > 0 ) THEN {
; if the guy is actively pinging us, lets waste him!
; attack active intercept
IF ( ( TgtSource $= "Active Intercept" ) AND ( TgtID $= "Hostile" ) ) AND NOT ( SnapShot ) THEN {
IF ( TIME >= PingSolve ) AND TgtRng <= AttackRng THEN {
DebugOut Ownname
DEBUGOUT "Attacking Active Ping"
ATTACKBEST
snapshot = TRUE
} ENDIF
} ELSE {
SETPRIORITY DoctrinePriority
; Store current speed
IF ( NEWTRACK ) THEN {
OrigSpeed = OWNSPD
} ENDIF
; Avoid Friendly
; ID
IF ( TgtID $= "UPD" ) THEN {
SETPRIORITY DoctrinePriority
; DebugOut "Prosecuting UPD"
; New Leg
IF ( TIME > LegTimer ) THEN {
; Approaching?
IF ( TgtSilos > 0 ) THEN {
TargetOpening = TRUE
ClosingSpeed = ( OWNSPD + TgtSilos + 10 + RND 2 )
} ELSE {
TargetOpening = FALSE
ClosingSpeed = Abs ( TgtSilo ) + RND 10 )
; Compute oblique angle for leg
IF ( TgtAOB < 0 ) THEN {
ApproachAngle = ( TgtBrg - 30 - RND 30 )
} ELSE {
ApproachAngle = ( TgtBrg + 30 + RND 30 )
} ENDIF
} ENDIF
LegTimer = ( TIME + 300 + RND 120 )
} ENDIF
; Proceed on leg, or pursue
IF NOT ( TargetOpening ) THEN {
SETCRS ApproachAngle
} ELSEIF ( TgtRng > 2000 ) THEN {
STEERTO
} ENDIF
; Minimum speed
IF ( ClosingSpeed < 4 ) THEN {
ClosingSpeed = 4
} ENDIF
SETSPD ClosingSpeed
} ELSEIF ( TgtID $= "HOSTILE" ) OR ( TgtID $= "UAE" ) THEN {
SETPRIORITY DoctrinePriority
; DebugOut Ownname
DebugOut "Prosecuting Hostile"
; New Closing Leg
IF ( TgtRng > MinFiringRng ) AND ( TIME > LegTimer ) THEN {
; Approaching?
IF ( TgtSilos > 0 ) THEN {
TargetOpening = TRUE
ClosingSpeed = ( OWNSPD + TgtSilos + 3 + RND 2 )
} ELSE {
TargetOpening = FALSE
ClosingSpeed = Abs ( TgtSilo ) + RND 10 )
; Compute oblique angle for leg
IF ( TgtAOB < 0 ) THEN {
ApproachAngle = ( TgtBrg - 30 - RND 30 )
} ELSE {
ApproachAngle = ( TgtBrg + 30 + RND 30 )
} ENDIF
} ENDIF
LegTimer = ( TIME + 480 + RND 120 )
} ENDIF
; Proceed on leg, or pursue
IF NOT ( TargetOpening ) THEN {
SETCRS ApproachAngle
} ELSEIF ( TgtRng > 2000 ) THEN {
STEERTO
} ENDIF
; Minimum speed
IF ( ClosingSpeed < 4 ) THEN {
ClosingSpeed = 4
} ENDIF
SETSPD ClosingSpeed
; Attack
IF TgtRng < AttackRng THEN {
ATTACKBEST
SnapShot = True
} ENDIF
} ENDIF
; PostLaunch
IF ( WEAPONAWAY ) THEN {
DEBUGOUT "Avoid after shooting"
SteerEvasive
} ENDIF
} ENDIF ; if not active ping
} ENDIF ; let sub engage
} ENDIF