; SubAtkSub Doctrine
; Finally Edited For RA Addon DWX 1.41

var LegTimer
var MinFiringRng	; changed this string, modified by game. Default AI long range shots available. Change, made short engage range - around 7 km (3.8nm)
var OrigSpeed
var ClosingSpeed
var TargetDepart	; 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 PingWaiting		; Wait for Ping ... Plot Snapshot
var Solution2
var Solution3
var WpCount
var Lock
var ReadyToShot
var Pursuit
var NCS
var NCSP
var NCD
var Lock2
var Lock3
var RunningDepth
var ShotLegTimer
var ShotSolve
VAR T_PUSK
VAR NUM
var T_PR_UKL
VAR BP
var CF3
var CF4
var TooFast
var spd
var WeaponArea

func CounterPing {
	if -1 == GetEntVar "STOP_PING" then {
		SetEntVar "GO_PING" 1
		ENABLE
		SensorEnable "Sub Active Intercept" 0
		SensorEnable "Active Intercept AI" 0
	} ENDIF
	ShotLegTimer = ( Time + 6 + ( ( TgtRng / 1524 ) * 2 ) )
	SetPersist ShotLegTimer SetPriority 250 SteerTo
}

func ActPinged {
	If ( TgtRng < ( 9260 + RND 4630 ) ) AND ( ABS TgtAOB < 150 ) Then {
		SetEntVar "HoldContact" ( Time + 26 )
		CounterPing
	} ELSEIF ( TgtRng > 13890 ) AND ( TgtRng <= 18520 ) AND ( ABS TgtAOB < 150 ) Then {
		IF Solution3 <= RND 100 Then {
			SetEntVar "HoldContact" ( Time + 32 )
			CounterPing
		} ENDIF
	} ENDIF
}

func PursuitDepth {
NCSP = ClosingSpeed
CF4 = ( ( ( NCSP / CF3 ) * ( NCSP / CF3 ) - 33 ) * -1 )
If OwnAlt < CF4 Then {
	NCD = OwnAlt
	NCS = NCSP
} Endif

If OwnAlt > CF4 Then {
	If ( CF4 > PeriDepth ) Then {
		NCD = PeriDepth
		NCS = NCSP
	} ELSE {
		NCD = ( CF4 - 10 )
	} ENDIF
} Endif

IF Pursuit THEN {
	If TgtRng > AttackRng Then {
} ELSE {
	NCS = NCSP 
	} ENDIF
} ENDIF
}

func Dive {
IF ownalt > CF4 Then {
	spd = ( CF3 * sqrt ( ABS OwnAlt + 33 ) - 0.5 )
	setspd spd
} ENDIF
}


IF INIT THEN {
	NUM = ( time + rnd 100 )
	ReadyToShot = 0
	Lock = 0
	Pursuit = 0
	CF3 = GetEntVar "CF2"
	MinFiringRng = ATTACKRNG
	DoctrinePriority = 200
	ApproachAngle = TgtBrg
	SnapShot = FALSE
	PingWaiting = ( Time + 6 + ( TgtRng / 1524 ) )
	; Threshold Noise (TgtConf value)
	Solution2 = 50
	; Percent Prob CounterPing if target more 5 nmi (value 75 - default 25 percent)
	Solution3 = 75
	ShotLegTimer = -1
	T_PR_UKL = -1
	T_PUSK = -1
	IF 90 < RND 100 THEN { BP = 1 } ELSE { BP = 0 } ENDIF
	RunningDepth = OwnAlt
} ELSEIF LostTrack THEN {
	SetEntVar "BEZ" 0
} ELSEIF ATTACKRNG == 0 THEN {
	SETTACTIC "SubAvoidSub"
} ELSE {
	SetEntVar "BEZ" 1
	; let sub attack sub
	IF DoctrinePriority > 0 THEN {
		; if the guy is actively pinging us, lets waste him!
		; attack active intercept
		IF ( ( TgtSource $= "Active Intercept" ) OR ( ( TGTRNG < ( 7000 + rnd 2000 ) ) AND BP ) ) AND ( TgtID $= "Hostile" ) AND NOT snapshot THEN {
			IF TIME >= PingWaiting THEN {
				snapshot = 1
				ShotLegTimer = ( TIME + 90 + RND 120 )
				ActPinged
			 } ENDIF
		} ELSE {
			SETPRIORITY DoctrinePriority
			; Store current speed
			; Avoid Neutral
			IF ( TgtID $= "NEUTRAL" ) OR ( TgtID $= "UAF" ) THEN {
;				DEBUGOUT "Avoid Neutral!"
				SETTACTIC "SubAvoidSub"
			} ENDIF
			; ID Unknown
			IF TgtID $= "UPD" THEN {
				SETPRIORITY DoctrinePriority
;				DebugOut "Prosecuting UPD"
				IF TIME > LegTimer THEN {
					; Approaching?
					IF TgtSilos > -3 THEN {
						Pursuit = 1
						TargetDepart = 1
						ClosingSpeed = ( OWNSPD + TgtSilos + 3 + RND 2 )
					If ( TgtSpd >= MaxSpd ) Then {
						TooFast = 1
						ClosingSpeed = OwnSpd
						Pursuit = 0
						TargetDepart = FALSE
					} endif
				IF ABS TGTAOB <= 30 Then {
					TargetDepart = FALSE
						IF TgtAOB < 0 THEN {
							ApproachAngle = ( TgtBrg - 35 )
						} ELSE {
							ApproachAngle = ( TgtBrg + 35 )
						} endif
					} endif
					} ELSE {
						Lock2 = 0
						Pursuit = 0
						TargetDepart = FALSE
						ClosingSpeed = LoiterSpd
						; 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 ( TargetDepart ) THEN {
	SETCRS ApproachAngle
		} ELSEIF TgtRng > 2000 THEN {
	STEERTO
} ENDIF
; Minimum speed
IF ( ClosingSpeed < 3 ) And Not TooFast THEN { ClosingSpeed = 3 } ENDIF
	IF not Pursuit THEN { SetPriority 250 SETSPD ClosingSpeed } ENDIF	
		IF Pursuit AND ( OwnAlt <= -3000 ) THEN {
		} ELSEIF Pursuit Then {
		SetPriority 255 SetAlt NCD
		SetPriority 255 SetSpd NCS
		Dive
	} ENDIF
} ENDIF
; *** HOSTILE ***
			IF ( TgtID $= "HOSTILE" ) OR ( TgtID $= "UAE" ) THEN {
				If Lock3 == 0 Then { LegTimer = 0 } ENDIF
				SETPRIORITY DoctrinePriority
;				DebugOut "Prosecuting Hostile"
				IF TIME > LegTimer THEN {
					; Approaching?
					IF TgtSilos > -3 THEN {
			ClosingSpeed = ( OWNSPD + TgtSilos + 3 + RND 2 )
;					DEBUGOUT "Target Away"
					Pursuit = 1
;					Lock2 = 0
					IF ( TgtRng > MinFiringRng ) AND ( TIME > LegTimer ) THEN {
						Pursuit = 1
						TargetDepart = 1
;						DEBUGOUT "Target Away, Pursuit"
						ClosingSpeed = ( OWNSPD + TgtSilos + 3 + RND 2 )
						If ( TgtSpd >= MaxSpd ) Then {
						TooFast = 1
						ClosingSpeed = OwnSpd
						Pursuit = 0
						TargetDepart = FALSE
					} endif
					} ENDIF
				} ELSE {
;					DEBUGOUT "Target Closing"
					Pursuit = 0
					Lock2 = 0
					TargetDepart = FALSE
					ClosingSpeed = LoiterSpd
;					Compute oblique angle for leg
					IF TgtAOB < 0 THEN {
						ApproachAngle = ( TgtBrg - 30 - RND 30 )
					} ELSE {
						ApproachAngle = ( TgtBrg + 30 + RND 30 )
					} ENDIF
				} ENDIF
				Lock3 = 1
				LegTimer = ( TIME + 480 + RND 120 )
			} ENDIF 
;			Proceed on leg, or pursue
			IF NOT TargetDepart THEN { SetPriority 245 SETCRS ApproachAngle
			} ELSEIF TgtRng > 2000 THEN { SetPriority 245 STEERTO } ENDIF
; 			Minimum speed
			IF ( ClosingSpeed < 3 ) And Not TooFast THEN { ClosingSpeed = 3 } ENDIF
			IF not Pursuit THEN {
				SETSPD ClosingSpeed
			} ENDIF	

			IF Pursuit AND ShotSolve THEN {
;				DebugOut "Shot Solution. Just stay on depth and course"
				SetSpd OwnSpd
				SetAlt OwnAlt
			} ELSEIF Pursuit THEN {
;				DebugOut "Pursuit Target at Safety Speed And Depth"
				SetPriority 255 SetAlt NCD
				SetPriority 255 SetSpd NCS
				Dive
			} ENDIF

			If Not Snapshot AND not ShotSolve and WeaponArea Then {
				ShotSolve = 1
				IF ( TgtRNG * 0.69 ) < 4630 Then {
					ShotLegTimer = ( TIME + 30 + RND 15 )
				} ElseIf TgtConf < Solution2 Then {
					ShotLegTimer = ( TIME + 120 + RND 120 )
				} ELSE {
					ShotLegTimer = ( TIME + 30 + RND 90 )
				} ENDIF
			} ENDIF
			IF Time > ShotLegTimer and ( ShotLegTimer != -1 ) THEN {
				ShotLegTimer = -1
				ReadyToShot = 1
			} ENDIF
			IF ReadyToShot THEN {
				if NOT LOCK then {
					IF WpCount == 0 THEN {
						Lock = 1
						T_PUSK = ( TIME + 10 + RND 25 )
						SetPriority 254 ATTACKBEST
					} ELSEIF ( T_PUSK != -1 ) AND ( T_PUSK < TIME ) THEN {
						T_PUSK = -1
						T_PR_UKL = ( TIME + 30 + RND 60 )
						Lock = 1
						SetPriority 255 FIREBEST
					} ENDIF 
				} endif
			} ENDIF
		} ENDIF
	} ENDIF
} ENDIF
	IF WeaponAway THEN {
		IF WpCount < 2 Then {
			Lock = 0
			WpCount += 1
		} ENDIF
	} ENDIF
IF WeaponAway THEN {
	IF ( TgtType $= "Sub" ) AND ( ( TgtSource $= "Visual" ) AND ( TgtID $= "UPD" ) ) THEN {
		DROP
	} Endif
} Endif
; PostLaunch
	IF ( WpCount >= 2 ) OR ( ( T_PR_UKL != -1 ) AND ( T_PR_UKL < TIME ) ) THEN {
;		DEBUGOUT "Avoid after shooting"
		SETTACTIC "SubAvoidSub"
	} ENDIF
	IF Pursuit AND ( Lock2 == 0 ) THEN {
		PursuitDepth
		Lock2 = 1
	} ENDIF
} ENDIF
IF ( TgtRng < MinFiringRng ) THEN {
	WeaponArea = 1
} ELSE {
	WeaponArea = 0
} endif
