; RA add-on v.1.41 Doctrine
; Version 3.0

var LegTimer
var RecognitionDelay
var Snapshot
var LegCourse
var CMAct
var CMPas
var ReloadAct
var SecAct
var ReloadPas
var SecPas
var ActLoaded
var PasLoaded
var UnloadedPas
var UnloadedAct
var PasUnload
var ActUnload
var ActTorp
var UnkTorp
var PasTorp
var EvadeSpd
var TAR
var RunSpd
var RunAlt
var PasSpd
var InitialSpd
var TorpClosing
var WAL
var WBL
var MaxDpt
var GoAbove
var GoBelow
var SprintSpd
var Markus
var Headon
var Sprinting
var PassIdx
var ActIdx
var SpdCng
var InitPassed
var DelayA
var Danger ; changed this string, modified by game. Range of Evade AI Sub From Torpedo.
var CorrInterogg
var BMBT
var BMB
var BTE
var Lock
var Blow
var WJ ; Whale Jumping
var WJ_RTB
var Ballast
var BallastEmpty
var RG
var PW
var GPBACS
var PassiveControl
var IncptControl
var TorpedoTracking
var Observation
var TorpPosBrg
var TorpPosCrs
var TorpPosRng
var TorpPosSil
var TorpPosAOB
var TorpPosBrgOLD
var TorpPosCrsOLD
var TorpPosRngOLD
var TorpPosSilOLD
var TorpPosAOBOLD
var RetractTowed
var TowArray
var TEMP
var SnapTimer
var OldSpd
var OldCrs
var OldAlt

func DEPTH_SPEED {
	IF ( TerrainAlt > MaxDpt ) THEN {
		MaxDpt = ( TerrainAlt + 50 )
	} ENDIF
	WBL = ( MaxDpt - Layer )
	WAL = ( Layer - PeriDepth )
	GoBelow = ( MaxDpt - ( RND WBL ) )
	If ( GoBelow >= PeriDepth ) Then { GoBelow = ( PeriDepth + -5 ) } Endif
	GoAbove = ( PeriDepth + ( RND WAL ) )
	If ( GoAbove >= PeriDepth ) Then { GoAbove = ( PeriDepth + -5 ) } Endif
	IF ( Layer == 0 ) THEN {
		MaxDpt = ( MaxDpt - PeriDepth )
		GoAbove = ( RND MaxDpt )	
	If ( GoAbove >= PeriDepth ) Then { GoAbove = ( PeriDepth + -5 ) } Endif
} ENDIF
}
IF INIT THEN {
	CorrInterogg = Time
	PassIdx = DBIdxFromRecNum 1414
	ActIdx = DBIdxFromRecNum 1412
	DelayA = 0
	InitialSpd = OwnSpd
	RunSpd = InitialSpd
	RunAlt = OwnAlt
	OldSpd = OwnSpd
	OldCrs = OwnCrs
	OldAlt = OwnAlt
	LegCourse = OwnCrs
	TorpClosing = 1
	ActTorp = 0
	PasTorp = 0
	UnkTorp = 1
	PasLoaded = 1
	ActLoaded = 1
	UnLoadedPas = 1
	UnLoadedAct = 1
	PasUnload = 0
	ActUnload = 0
	SecAct = 0
	SecPas = 0
	Markus = 0
	Headon = False
	InitPassed = ( InitPassed + 0.5 )
	Sprinting = False
	LegTimer = -1
	Snapshot = False
	MaxDpt = ( MinAlt * 3.28 )
	WJ = GetEntVar "WJ"
	Ballast = GetEntVar "Ballast"
	TowArray = GetEntVar "TowedArrayON"
	RetractTowed = GetEntVar "RT"
	PW = ( GetEntVar "PassiveWashout" - 2.4 )
	GPBACS = GetEntVar "TowedCutSpeed"
If ( InitPassed == 1 ) Then {
 	InitPassed = 0
	DANGER = ( 10000 + RND 10000 )
	SpdCng = RND 10
	RecognitionDelay = ( TIME + 15 + RND 15 )
	If ( TgtConf >= 100 ) Then { RecognitionDelay = ( Time + 10 ) } Endif
	SnapTimer = ( RecognitionDelay + 3 )
	BTE = 1
	bmbt = 1
	PasSpd = ( 2 + RND 4 )
If ( GPBACS != 50 ) Then {
; DebugOut "SubAvoidWeap: GPBACS != 50_"
	GPBACS = ( GetEntVar "TowedCutSpeed" - 1 )
	SprintSpd = GPBACS
	EvadeSpd = PW
} Endif

If ( GPBACS == 50 ) Then {
	SprintSpd = MaxSpd
	EvadeSpd = ( 4 + ( RND ( MaxSpd - 4 ) ) )
;	DebugValueOut EvadeSpd
	IF ( EvadeSpd > PW ) Then { EvadeSpd = PW } Endif
	EvadeSpd = PW
} Endif
	TorpPosBrg = TgtBrg
	TorpPosCrs = TgtCrs
	TorpPosRng = TgtRng
	TorpPosSil = TgtSilos
	TorpPosAOB = TgtAOB

DEPTH_SPEED
If WJ Then {
	If ( Ballast ) Then { WJ_RTB = RND 10 } endif
If ( ( WJ ) AND ( WJ_RTB >= 8 ) ) Then {
	BLOW = 1
} endif
	} ENDIF
} ENDIF
} ELSEIF ( LegTimer == -1 ) THEN {
		Observation = 1
	IF ( TIME > RecognitionDelay ) AND TorpedoTracking THEN {
		IF ( Not Snapshot ) and not ( TgtID $= "FRIEND" ) THEN {
			FireBest
			Snapshot = true
		} ENDIF
		IF ( TorpPosRng < ( DANGER ) ) AND ( TorpPosSil < 0 ) AND ( ABS RelativeBearing TorpPosCrs ( TorpPosBrg + 180 MOD 360 ) < 30 ) THEN {
			TAR += 1
			TorpPosBrgOLD = TorpPosBrg
			TorpPosCrsOLD = TorpPosCrs
			TorpPosRngOLD = TorpPosRng
			TorpPosSilOLD = TorpPosSil			
			TorpPosSilOLD = TorpPosAOB			
			LegTimer = ( 180 + RND 190 )
			IF NOT ( Headon ) THEN {
				Markus = ( RND 15 )
				IF ( Markus > 12 ) AND ( TorpPosRng > 5000 ) AND ( TorpPosRng < 10000 ) AND ( UnkTorp ) THEN {
					LegCourse = TorpPosBrg
					RunSpd = SprintSpd
					Headon = True
					TorpClosing = 1
					Legtimer = ( ( ( ( MaxSpd / 1.6 ) + TgtSpd ) * 1852 ) / 3600 )
					IF Legtimer == 0 THEN { Legtimer = 0.00001 } ENDIF
					Legtimer = ( TorpPosRng / Legtimer )
				} ELSEIF ( Markus > 5 ) THEN {
						RunSpd = SprintSpd
						Sprinting = True
					IF ( TorpPosAOB < 0 ) THEN {
						LegCourse = ( ( TorpPosBrg + 75 ) + RND 60 MOD 360 )
					} ELSE {
						LegCourse = ( ( TorpPosBrg + 225 ) + RND 60 MOD 360 )
					} ENDIF
				} ELSE {
					RunSpd = SprintSpd
					Sprinting = True
					IF ( TorpPosAOB < 0 ) THEN {
						LegCourse = ( ( TorpPosBrg + 225 ) + RND 60 MOD 360 )
					} ELSE {
						LegCourse = ( ( TorpPosBrg + 75 ) + RND 60 MOD 360 )
					} ENDIF
				} ENDIF
			} ENDIF
			; Set Depth Opposite Layer
			IF ( TgtAlt < LAYER ) THEN {
				RunAlt = GoAbove
			} ELSE {
				RunAlt = GoBelow
			} ENDIF
			IF ( GetEntVar "CMActL" ) THEN {
;				DebugOut OwnName
;				DebugOut "Active CM Loaded before Evade"
				CMAct = 1
				ReLoadAct = 0
				SecAct = 0
				SetEntVar "CMActL" 0
			} ENDIF
			IF ( GetEntVar "CMPasL" ) THEN {
;				DebugOut OwnName
;				DebugOut "Passive CM Loaded before Evade"
				CMPas = 1
				ReLoadPas = 0
				SecPas = 0
				SetEntVar "CMPasL" 0
			} ENDIF
			; Throw CM?
			IF ( TgtSource $= "Active Intercept" ) OR ( ActTorp ) THEN {
				ActTorp = 1
				PasTorp = 0
				UnkTorp = 0
				IF ( CMAct >= 1 ) AND ( TorpClosing ) THEN {	
					IF ( CMact >= 2 ) THEN {
						CMAct = 2
					} ENDIF
;					DebugOut OwnName
;					DEBUGOUT "Active Intercept -- CM Decoy"
					if ( getEntVar "tperdec" == 0 ) and ( TorpPosrng < ( 4000 + rnd 2000 ) ) then { CountermeasureIdx ActIdx
					SetEntVar "tperdec" ( Time + 120 + RND 60 )
					CMAct = ( CMAct - 1 )
					IF ( CMAct == 0 ) THEN {
						ActLoaded = 0
					} ENDIF } endif
					IF ( SpdCng >= 6 ) THEN {
						RunSpd = EvadeSpd
					} ELSE {
						RunSpd = SprintSpd
					} ENDIF
				} ENDIF
			} ELSE {
				IF NOT ( Headon ) AND NOT ( Sprinting ) THEN {
					IF ( TorpPosRng < 10000 ) AND NOT ( TorpClosing ) THEN {
						IF NOT ( ActTorp ) AND NOT ( PasTorp ) THEN {
							PasTorp = 0
							ActTorp = 0
							UnkTorp = 1
							RunSpd = ( ( EvadeSpd - ( RND EvadeSpd ) ) - 2 )
						} ELSE {
							IF ( SpdCng >= 4 ) THEN {
								RunSpd = EvadeSpd
							} ELSE {
								RunSpd = InitialSpd
							} ENDIF
						} ENDIF
					 } ELSE {
						RunSpd = SprintSpd
					} ENDIF
					IF ( TorpPosSil < -100 ) THEN {
						TorpClosing = 1
						RunSpd = SprintSpd
					} ELSEIF ( TorpPosSil < -25 ) THEN {
						TorpClosing = 1
						IF ( SpdCng >= 4 ) THEN {
							RunSpd = EvadeSpd
						} ELSE {
							RunSpd = SprintSpd
						} ENDIF
					} ELSE {
						TorpClosing = 0
						IF OwnSpd < 2 THEN {
							RunSpd = 1
						} ELSE {
							RunSpd = ( OwnSpd - 2 )
						} ENDIF
					} ENDIF
				} ENDIF
				IF ( TorpPosRng > 5001 ) AND ( TorpClosing ) AND NOT ( ActTorp ) AND NOT ( PasTorp ) THEN {
					UnkTorp = 1
				} ENDIF
				IF ( CMPas >= 1 ) AND ( TorpClosing ) AND NOT ( ActTorp ) THEN {
					IF ( CMPas >= 2 ) THEN {
						CMPas = 2
					} ENDIF
;					DebugOut OwnName
;					DEBUGOUT "CM Jammer"
					if ( getEntVar "tperjam" == 0 ) and ( TorpPosrng < ( 4000 + rnd 2000 ) ) then { CountermeasureIdx PassIdx
					SetEntVar "tperjam" ( Time + 120 + RND 60 )
					CMPas = ( CMPas - 1 )
					IF ( CMPas == 0 ) THEN {
						PasLoaded = 0
					} ENDIF } endif
				} ENDIF
				IF ( CMAct >= 1 ) AND ( TorpClosing ) AND NOT ( PasTorp ) THEN {
					IF ( CMact >= 2 ) THEN {
						CMAct = 2
					} ENDIF
;					DebugOut OwnName
;					DEBUGOUT "CM Decoy"
					if ( getEntVar "tperdec" == 0 ) and ( TorpPosrng < ( 4000 + rnd 2000 ) ) then { CountermeasureIdx ActIdx
					SetEntVar "tperdec" ( Time + 120 + RND 60 )
					CMAct = ( CMAct - 1 )
					IF ( CMAct == 0 ) THEN {
						ActLoaded = 0
					} ENDIF
					} endif
				} ENDIF
			} ENDIF
			LegTimer += TIME
		} ENDIF
	} ENDIF
} ELSEIF ( TIME > LegTimer ) THEN {
	Headon = False
	LegTimer = -1
	RunSpd = InitialSpd
	IF ( InitialSpd > PW ) Then { RunSpd = EvadeSpd } endif
} ELSE {
	IF ( UnkTorp ) THEN {	
		IF ( CMPas == 0 ) AND ( ReloadPas == 0 ) AND NOT ( ActTorp ) THEN {
;			DebugOut OwnName
;			DebugOut "Reloading Passive CM"
			ReloadPas = ( Time + 120 + ( RND 60 ) )
			SecPas = 0
		} ENDIF
		IF ( CMAct == 0 ) AND ( ReloadAct == 0 ) AND NOT ( PasTorp ) THEN {
;			DebugOut OwnName
;			DebugOut "Reloading Active CM"
			ReloadAct = ( Time + 120 + ( RND 60 ) )
			SecAct = 0
		} ENDIF
	} ELSE {
		IF ( ActTorp ) AND ( ReloadAct == 0 ) THEN {
;			DebugOut OwnName
;			DebugOut "Reloading - 2 Active CMs"
			ReloadAct = ( Time + 120 + ( RND 60 ) )
			IF NOT ( CMPas ) THEN {
				SecAct = 1
			} ELSE {
				PasUnload = ( Time + 60 + RND 30 )
				UnloadedPas = 0
			} ENDIF
		} ELSE {
			IF ( PasTorp ) AND ( ReloadPas == 0 ) THEN {
				ReloadPas = ( Time + 120 + ( RND 60 ) )
;				DebugOut OwnName
;				DebugOut "Reloading - 2 Passive CMs"
				IF NOT ( CMAct ) THEN {
					SecPas = 1
				} ELSE {
					ActUnload = ( Time + 60 + RND 30 )
					UnloadedAct = 0
				} ENDIF
			} ENDIF
		} ENDIF
	} ENDIF
	IF ( TIME > ReloadPas ) AND NOT ( PasLoaded ) THEN {
;		DebugOut OwnName
;		DebugOut "Passive CM Reloaded"
		CMPas = 1
		ReloadPas = 0
		IF ( PasTorp ) THEN {
			CMPas = ( CMPas + SecPas )
			SecPas = 0
		} ENDIF
		PasLoaded = 1
	} ENDIF
	IF ( TIME > ReloadAct ) AND NOT ( ActLoaded ) THEN {
;		DebugOut OwnName
;		DebugOut "Active CM Reloaded"
		CMAct = 1
		ReloadAct = 0
		IF ( ActTorp ) THEN {
			CMAct = ( CMAct + SecAct )
			SecAct = 0
		} ENDIF
		ActLoaded = 1
	} ENDIF
	IF ( Time > ActUnload ) AND NOT ( UnloadedAct ) THEN {
		CMAct = 0
		UnloadedAct = 1
;		DebugOut OwnName
;		DebugOut "Active CM Unloaded"
	} ENDIF
	IF ( Time > PasUnload ) AND NOT ( UnloadedPas ) THEN {
		CMPas = 0
		UnloadedPas = 1
;		DebugOut OwnName
;		DebugOut "Passive CM Unloaded"
	} ENDIF
	IF NOT ( Headon ) THEN {
		IF ( ( ABS RelativeBearing OwnCrs LegCourse ) < 5 ) THEN {
			Sprinting = False
			RunSpd = EvadeSpd
		} ELSE {
			RunSpd = RunSpd	
		} ENDIF
		IF ( TorpPosRng < 2500 ) AND ( TorpClosing ) THEN {
			IF ( TgtSource $= "Active Intercept" ) OR ( ActTorp ) THEN {
				ActTorp = 1
				PasTorp = 0
				UnkTorp = 0
				RunSpd = SprintSpd
			} ELSE {
				IF ( ( TorpPosAOB < -150 ) OR ( TorpPosAOB > 150 ) ) AND NOT ( PasTorp ) THEN {
					PasTorp = 0
					UnkTorp = 1
					ActTorp = 0
					RunSpd = SprintSpd
				} ELSE {
					UnkTorp = 0
					PasTorp = 1
					ActTorp = 0
					RunSpd = PasSpd
				} ENDIF
			} ENDIF
		} ENDIF
		IF NOT ( Sprinting ) THEN {
			IF ( TorpPosSil < -100 ) THEN {
				TorpClosing = 1
				RunSpd = SprintSpd
			} ELSEIF ( TorpPosSil < -25 ) THEN {
				TorpClosing = 1
				RunSpd = SprintSpd
			} ELSE {
				TorpClosing = 0
		IF OwnSpd < 2 THEN {
			RunSpd = 1
		} ELSE {
			RunSpd = ( OwnSpd - 2 )
		} ENDIF
			} ENDIF
		} ENDIF
	} ENDIF
	IF ( TorpPosRng > 5000 ) AND ( TorpClosing ) AND NOT ( ActTorp ) AND NOT ( PasTorp ) THEN {
		UnkTorp = 1
		PasTorp = 0
		ActTorp = 0
	} ENDIF
	; Set Depth Opposite Layer
	IF ( TgtAlt < LAYER ) THEN {
		RunAlt = GoAbove
	} ELSE {
		RunAlt = GoBelow
	} ENDIF
	IF ( TgtSource $= "Active Intercept" ) OR ( ActTorp ) THEN {
			ActTorp = 1
			PasTorp = 0
			UnkTorp = 0
		IF ( CMAct >= 1 ) AND ( TorpClosing ) THEN {
			IF ( CMact >= 2 ) THEN {
				CMAct = 2
			} ENDIF
;			DebugOut OwnName
;			DEBUGOUT "Active Intercept -- CM Decoy whilst Evading"
					if ( getEntVar "tperdec" == 0 ) and ( TorpPosrng < ( 4000 + rnd 2000 ) ) then { CountermeasureIdx ActIdx
					SetEntVar "tperdec" ( Time + 120 + RND 60 )
			CMAct = ( CMAct - 1 )
			IF ( CMAct == 0 ) THEN {
				ActLoaded = 0
			} ENDIF } endif
		} ENDIF	
	} ELSE {
		IF ( CMPas >= 1 ) AND ( TorpClosing ) AND NOT ( ActTorp ) THEN {
			IF ( CMPas >= 2 ) THEN {
				CMPas = 2
			} ENDIF
;			DebugOut OwnName
;			DEBUGOUT "CM Jammer whilst Evading"
			if ( getEntVar "tperjam" == 0 ) and ( TorpPosrng < ( 4000 + rnd 2000 ) ) then { CountermeasureIdx PassIdx
			SetEntVar "tperjam" ( Time + 120 + RND 60 )
			CMPas = ( CMPas - 1 )
			IF ( CMPas == 0 ) THEN {
				PasLoaded = 0
			} ENDIF } endif
		} ENDIF
		IF ( CMAct >= 1 ) AND ( TorpClosing ) AND NOT ( PasTorp ) THEN {
			IF ( CMAct >= 2 ) THEN {
				CMAct = 2
			} ENDIF
;			DebugOut OwnName
;			DEBUGOUT "CM Decoy whilst Evading"
			if ( getEntVar "tperdec" == 0 ) and ( TorpPosrng < ( 4000 + rnd 2000 ) ) then { CountermeasureIdx ActIdx
			SetEntVar "tperdec" ( Time + 120 + RND 60 )
			CMAct = ( CMAct - 1 )
			IF ( CMAct == 0 ) THEN {
				ActLoaded = 0
			} ENDIF } endif
		} ENDIF
	} ENDIF
} ENDIF
DelayA = ( DelayA + 1 )
IF ( DelayA == 1200 ) THEN { SpdCng = RND 10 DelayA = 0 } ENDIF
	SetEntVar "fulltrottle" 1

If NOT BMB Then {
	SETPRIORITY 255	SetCrs LegCourse
	SETPRIORITY 255	SetAlt RunAlt
	SETPRIORITY 255	SetSpd RunSpd
	IF RetractTowed AND ( ( TAR > 0 ) AND ( TAR < 3 ) ) THEN {
		IF OWNSPD > ( SprintSpd - 2.45 ) THEN {
			TEMP = ( RunSpd - 2.45 )
			SetPriority 255
			SetSpd TEMP
		} ENDIF
	} ENDIF
} ELSE {
	SETPRIORITY 255
	SetPitch 35
} endif

IF BLOW THEN {
If Not Ballast Then { BallastEmpty = 1 } endif
IF Bmbt And NOT BallastEmpty Then {
	If ( OwnAlt <= -328 ) And NOT BMB Then {
		RG = ABS ( OwnAlt - TgtAlt )
If ( TgtRng <= 1000 ) AND BTE THEN {
	IF ( RG <= 328 ) Then {
; DebugOut "This Is AI Captain. Blowing Main Ballast Tanks!"
 		BMB = 1
		SetSnorkel ON
	} endif
} endif
} endif
} endif
	CorrInterogg = ( Time - CorrInterogg )
If BMB Then {
	Lock = ( Lock + CorrInterogg )
IF ( Lock <= 1 ) Then {
		SETPRIORITY 255
		SetPitch 35
		SETPRIORITY 255
		SetSpd 0
	} ELSE {
		SETPRIORITY 255
		SetCrs OwnCrs
		SetSpd MaxSpd
	} endif

If LOSTTRACK Then {
	SetEntVar "fulltrottle" 0
	BTE = 0
	SetEntVar "Ballast" 0
	SetSnorkel OFF
	} endif
} endif

If BMBT AND BMB Then { 
	If ( OwnAlt >= -125 ) Then {
; DebugOut "This AI Captain. Stop Blowing Main Ballast Tanks!"
 	BMB = 0
	BTE = 0
	SetEntVar "Ballast" 0
	SetSnorkel OFF
	} endif
} endif
If ( Lock >= 60 ) Then { BMB = 0 BTE = 0 SetEntVar "Ballast" 0 SetSnorkel OFF } Endif
	CorrInterogg = Time
} ENDIF
	Ballast = GetEntVar "Ballast"

If LOSTTRACK THEN {
	IF NOT BLOW THEN {
		SetSpd OldSpd
		SetCrs OldCrs
		SetAlt OldAlt
		DROP
		SetEntVar "fulltrottle" 0
	} ENDIF
} ENDIF

If TgtSource $= "PASSIVE SONAR" THEN {
	If TgtAge <= 5 THEN {
		PassiveControl = 1
	} ELSE {
		PassiveControl = 0
	} ENDIF
} ENDIF
If TgtSource $= "Active Intercept" THEN {
	If TgtAge <= 30 THEN {
		IncptControl = 1
	} ELSE {
		IncptControl = 0
	} ENDIF
} ENDIF

IF OBSERVATION THEN {
	If ( ( PassiveControl == 1 ) OR ( IncptControl == 1 ) ) THEN {
		TorpedoTracking = 1
		TorpPosBrg = TgtBrg
		TorpPosCrs = TgtCrs
		TorpPosRng = TgtRng
		TorpPosSil = TgtSilos
		TorpPosAOB = TgtAOB
		TorpPosBrgOLD = TorpPosBrg
		TorpPosCrsOLD = TorpPosCrs
		TorpPosRngOLD = TorpPosRng
		TorpPosSilOLD = TorpPosSil
		TorpPosAOBOLD = TorpPosAOB
;		DebugOut "Torpedo At AI Acoustic Display"
	} ELSE {
		TorpedoTracking = 0
		TorpPosBrg = TorpPosBrgOLD
		TorpPosCrs = TorpPosCrsOLD
		TorpPosRng = TorpPosRngOLD
		TorpPosSil = TorpPosSilOLD
		TorpPosAOB = TorpPosAOBOLD
;		DebugOut "*** TORPEDO CONTACT - LOST! ***" 
	} ENDIF
} ENDIF

If Time < SnapTimer Then {
	SetEntVar "snap" 1
} ELSE {
	SetEntVar "snap" 0
} ENDIF
