; SubAtkSurf Doctrine
; Edited For RA Addon DWX 1.41

var LegTimer
var MaxFiringRng
var OrigSpeed
var ClosingSpeed
var TargetOpening
var ApproachAngle
var DoctrinePriority
var SnapShot
var PingSolve
var Solution1
var Pursuit
var NCS
var NCSP
var NCD
var Lock
var Lock2
var Lock3
var bl
var ShotSolve
var ShotLegTimer
var ReadyToShot
var CF3
var CF4
var TooFast
var spd
var SMSCH

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
If SMSCH > 5 Then { 
} ELSE {
	NCD = ( ( CF4 ) + -32 )
} Endif

} Endif
}

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

IF INIT THEN {
	Pursuit = 0
	LegTimer = -1
	MaxFiringRng = ATTACKRNG
	OrigSpeed = OWNSPD
	DoctrinePriority = 200
	CF3 = GetEntVar "CF2"
	SMSCH = RND 10
	SnapShot = FALSE
	ApproachAngle = TgtBrg
	PingSolve = ( Time + 15 + ( TgtRng / 1524 ) )
	Solution1 = ( 39 + RND 20 )
	bl = 1
} ELSEIF LostTrack THEN {
	SetEntVar "BEZ" 0
} ELSE {
SetEntVar "BEZ" 1
	IF TgtID $= "UPD" THEN {
;		New Leg
		IF TIME > LegTimer THEN {
;			Approaching?
			IF ( TgtSilos > -3 ) OR ( TgtRng > MaxFiringRng ) THEN {
			Pursuit = 1
			TargetOpening = TRUE
			ClosingSpeed = ( OWNSPD + TgtSilos + 3 + RND 2 )
				If ( TgtSpd >= MaxSpd ) Then {
				TooFast = 1
				ClosingSpeed = OwnSpd
				Pursuit = 0
				TargetOpening = FALSE
				} endif
			} ELSE {
			Pursuit = 0
			TargetOpening = FALSE
			ClosingSpeed = LoiterSpd
; Compute oblique angle for leg
				IF TgtAOB < 0 THEN {
				ApproachAngle = ( TgtBrg - 50 - RND 20 )
				} ELSE {
				ApproachAngle = ( TgtBrg + 50 + RND 20 )
				} ENDIF
			} ENDIF
		LegTimer = ( TIME + 300 + RND 120 )
		} ENDIF

; Proceed on leg, or pursue
			IF NOT TargetOpening THEN {
						SETCRS ApproachAngle
					} ELSE {
						IF TgtRng > 2000 THEN {
							STEERTO
						} ENDIF
					} ENDIF

; Minimum speed
					IF ( ClosingSpeed < 4 ) And Not TooFast THEN {
					ClosingSpeed = 4
					} ENDIF
	IF not Pursuit THEN { SETSPD ClosingSpeed } ENDIF	
	IF Pursuit AND ( OwnAlt <= -3000 ) THEN {
	} ELSEIF Pursuit THEN {
		PursuitDepth
		SetPriority 255
		SetAlt NCD
		SetPriority 255
		SetSpd NCS
		Dive
	} ENDIF
} ENDIF

IF ( TgtID $= "HOSTILE" ) OR ( TgtID $= "UAE" ) THEN {
	If not Lock3 Then {
	LegTimer = 0
	} ENDIF
SETPRIORITY DoctrinePriority
;	New Closing Leg
	IF TIME > LegTimer THEN {
		; Approaching?
		IF TgtSilos > -3 THEN {
			ClosingSpeed = ( OWNSPD + TgtSilos + 3 + RND 2 )
			Pursuit = 1
;			Lock2 = 0
			IF ( TgtRng > MaxFiringRng ) AND ( TIME > LegTimer ) THEN {
			TooFast = 0
			Pursuit = 1
			TargetOpening = 1
			ClosingSpeed = ( OWNSPD + TgtSilos + 3 + RND 2 )
				If ( TgtSpd >= MaxSpd ) Then {
				TooFast = 1
				ClosingSpeed = OwnSpd
				Pursuit = 0
				TargetOpening = FALSE
				} endif
			} ENDIF
		} ELSE {
		Pursuit = 0
		Lock2 = 0
		TargetOpening = 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 TargetOpening 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

	If Not Snapshot AND not ShotSolve Then {
	ShotSolve = 1
		IF ( TgtRNG * 0.69 ) < 4630 Then {
		ShotLegTimer = ( TIME + 30 + RND 15 )
		} ElseIf TgtConf < Solution1 Then {
		ShotLegTimer = ( TIME + 180 + RND 120 )
		} ELSE {
		ShotLegTimer = ( TIME + 30 + RND 150 )
		} ENDIF
	} ENDIF

	IF Time > ShotLegTimer and ( ShotLegTimer != -1 ) THEN {
	ShotLegTimer = -1
	ReadyToShot = 1
	} ENDIF

;	Attack
	if bl then {
		IF ( TgtRng < MaxFiringRng ) and ( TgtID $= "HOSTILE" ) THEN {
			IF ReadyToShot THEN {
			bl = 0
			SetPriority 255 ATTACKBEST
			} ENDIF
		} endif
	} endif
} ENDIF

; PostLaunch
IF WEAPONAWAY or ( ATTACKRNG == 0 ) THEN {
;	DEBUGOUT "sub avoiding Surf after shot"
	SETTACTIC "SubAvoidSurf"
	} ENDIF
} ENDIF

IF WeaponAway THEN {
	IF ( TgtType $= "Surf" ) AND ( ( TgtSource $= "Visual" ) AND ( TgtID $= "UPD" ) ) THEN {
	DROP
	} Endif
} Endif

IF Pursuit AND not Lock2 THEN {
	PursuitDepth
	Lock2 = 1
} ENDIF
