; -RA- v 1.41 Addon MultiSensor Torpedo Doctrine.

var PreEnableCourse
var PreEnableDepth
var RunToEnable
var RunoutSpeed
var Enabled
var Homing
var SrcDepth
var Floor
var Ceiling
var AcousticMode
var spdmin
var InitTime
var InitX
var InitY
var Run
var Trange
var PassSearchSpd
var snakeleft
var WakeMode
var SrcSpd
var snakecrs
var CorrInterogg
var fuel
var FSR
var K
var FSRMIN
var DMAX
var DMIN
var SearchDepth
var TorpMaxDepth
var RollTheBones
var PreSet
var TEMP
var LA
VAR CalcSpd
VAR mspd
VAR DELAY
VAR OrdDpth
var GotHim
var ColT
VAR DELTA1
VAR OLDBRG
var trng
var tbrg
var tage
var talt
var TSILOS
VAR FTERM
var AM
var Turn
var TurnAngle
var RngT
var RTB
var WireGuide
VAR NumbNG
var UM
VAR Tconf
var TReatak
var FDROPA
VAR FREATAK
VAR UREATAK
var FKORIDOR
var fwake
var FN
var SUB_SURF
var curs_r
var TReatak
Var TR1
var FS
var DFS
var DU
var RV
VAR NUK
VAR KK
var DKR
var Tdist
var TClass
var Mishit
var SilStart
var mission

func SearchON {
IF AcousticMode THEN {
	ENABLE
	SensorEnable "268" 0
	SensorEnable "542" 0
	SensorEnable "551" 0
	SensorEnable "552" 0
	SensorEnable "553" 0
	SensorEnable "555" 0
	SensorEnable "818" 0
	SensorEnable "821" 0
	SensorEnable "830" 0
	SensorEnable "843" 0
	SensorEnable "844" 0
	SensorEnable "845" 0
} ELSE {
	IF WakeMode THEN {
	PASSIVEENABLE
	SensorEnable "268" 0
	SensorEnable "542" 0
	SensorEnable "551" 0
	SensorEnable "552" 0
	SensorEnable "553" 0
	SensorEnable "555" 0
	SensorEnable "818" 0
	SensorEnable "821" 0
	SensorEnable "830" 0
} ELSE {
	PASSIVEENABLE
	SensorEnable "268" 0
	SensorEnable "843" 0
	SensorEnable "844" 0
	SensorEnable "845" 0
} ENDIF
} ENDIF
}
Func AI_Wire {
If NOT GotHim Then {
	ShutDown
} endif
If ( SUB_SURF == 1 ) Then {
	If ( TClass != 1 ) Then {
		ShutDown
	} endif
} endif
If ( SUB_SURF == 0 ) Then {
	If ( TClass != 2 ) Then {
		ShutDown
	} endif
} endif
}

IF INIT THEN {
PreSet = 1
DFS = 800
DU = 3
CorrInterogg = Time
PreEnableDepth = Ownalt
IF ( DBUser1Flags & 2 ) == 2 THEN { SetSnorkel On SilStart = 1 } ENDIF
if ownalt > -15 then { PreEnableDepth = -15 } endif
WakeMode = 0
TorpMaxDepth = ( MinAlt * 3.28 )
RollTheBones = ( RND 12 )
InitTime = ( Time + 3 )
Enabled = 0
Homing = 0
InitX = OwnX
InitY = OwnY
AM = RND 10
RTB = RND 1000
RunToEnable = 1000
RunoutSpeed = MaxSpd
Tconf = 0
Treatak = -1
FDROPA = 1
} ELSE {
IF PreSet THEN {
PreSet = 0
IF ( DBUser1Flags & 1 ) == 1 THEN { WireGuide = 1 } ELSE { WireGuide = 0 } ENDIF
IF OwnName $= "TEST-71M Torpedo" THEN { spdmin = 26 UM = 200 FREATAK = 1 TRange = 25000 DMAX = 15000 DFS = 875
} elseIF OwnName $= "TEST-71ME-NK Torpedo" THEN { spdmin = 26 UM = 200 FREATAK = 1 TRange = 25000 DMAX = 15000 FN = 1 DFS = 875
} elseIF OwnName $= "UGST Torpedo" THEN { spdmin = 30 UM = 80 FREATAK = 1 TRange = 40000 DMAX = 31000 FN = 1 DFS = 1375
} elseIF OwnName $= "USET-80 Torpedo" THEN { spdmin = 30 UM = 200 FREATAK = 1 TRange = 18000 DMAX = 13500 FN = 1 DFS = 1150
} elseIF OwnName $= "USET-80K Torpedo" THEN { spdmin = 35 UM = 200 FREATAK = 1 TRange = 22000 DMAX = 17500 FN = 1 DFS = 1200
} elseIF OwnName $= "USET-95 Torpedo" THEN { spdmin = 30 UM = 200 FREATAK = 0 TRange = 14816 DMAX = 11500
} elseIF OwnName $= "Black Shark Torpedo" THEN { spdmin = 30 UM = 70 FREATAK = 1 TRange = 50004 DMAX = 30000 FN = 1 DFS = 1500
} elseIF OwnName $= "DM 2A4 Torpedo" THEN { spdmin = 30 UM = 75 FREATAK = 1 TRange = 55560 DMAX = 38000 FN = 1 DFS = 1500
} elseIF OwnName $= "Yu-6 Torpedo AI" THEN { spdmin = 40 UM = 70 FREATAK = 1 TRange = 45001 DMAX = 32000 FN = 1 DFS = 1700
} elseIF OwnName $= "F 17 Mod2 Torpedo" THEN { spdmin = 30 UM = 85 FREATAK = 1 TRange = 20000 DMAX = 18500 } ENDIF
FUEL = 1000
DMIN = ( Trange / 1852 )
DMAX = ( DMAX / 1852 )
FSRMIN = ( FUEL / ( DMIN / ( spdmin / 3600 ) ) )
K = ( ( ( FUEL / ( DMAX / ( MAXSPD / 3600 ) ) ) - FSRMIN ) / ( MAXSPD - spdmin ) )
DKR = 0.25
DKR = ( 0.1 / ( DKR * 3.1415926 ) )
RunoutSpeed = ( MaxSpd - ( RND 10 ) )
IF RunToEnable < 250 THEN { RunToEnable = 250 } ENDIF
IF ( TgtType $= "Ship" ) Then {
SUB_SURF = 0
Ceiling = -7
SrcDepth = -21
Floor = -40
IF RollTheBones < 7 THEN { WakeMode = 1 AcousticMode = 0
SrcDepth = -15
SrcSpd = ( spdmin + ( RND 15 ) )
} ELSEIF RollTheBones < 10.01 THEN { AcousticMode = 0
SrcDepth = Floor
SrcSpd = ( spdmin + ( RND 6 ) )
} ELSE { AcousticMode = 1
SrcDepth = Floor
SrcSpd = ( MaxSpd - ( RND 10 ) )
} ENDIF
} ELSE {
SUB_SURF = 1
IF RollTheBones <= 6 THEN {
AcousticMode = 1
WakeMode = 0
SrcSpd = ( MaxSpd - ( RND 10 ) )
} ELSE {
AcousticMode = 0
WakeMode = 0
SrcSpd = ( spdmin + ( RND 6 ) )
} ENDIF
FLOOR = TorpMaxDepth
IF floor <= TerrainAlt THEN { FLOOR = ( TerrainAlt + 30 ) } ENDIF
IF FLOOR > 0 THEN { FLOOR = TerrainAlt } ENDIF
Ceiling = -12
Turn = 1
IF FLOOR > CEILING THEN { Ceiling = -10 } ENDIF
IF LAYER == 0 THEN { LA = ( ( FLOOR - CEILING ) / 2 )
} ELSE { LA = LAYER } ENDIF
IF 5 > ( AM ) THEN {
	TEMP = ( LA - CEILING )
	TEMP = RND ( TEMP ) 
	TEMP = ( TEMP * 0.6 )
	SrcDepth = ( La - TEMP )
} ELSE {
	TEMP = ( FLOOR - LA )
	TEMP = RND ( TEMP ) 
	TEMP = ( TEMP * 0.6 )
	SrcDepth = ( La + TEMP )
} ENDIF
FLOOR = TorpMaxDepth
If ( ( TgtAlt > -1 ) AND ( SearchDepth == -6.6 ) ) THEN {
;	DebugOut "Surf Snapshot"
	RunoutSpeed = MaxSpd
	Turn = 0
} ENDIF
If ( ( TgtSource $= "Visual" ) AND ( ( TgtAlt < -3 ) AND ( SearchDepth != -6.6 ) ) ) THEN {
;	DebugOut "Sub Snapshot"
	RunoutSpeed = MaxSpd
	Turn = 0
} ENDIF
} ENDIF
DROP
TDist = TgtRng
IF SrcDepth < TorpMaxDepth THEN { SrcDepth = TorpMaxDepth } ENDIF
IF SrcDepth < ( TerrainAlt + 100 ) THEN { SrcDepth = ( TerrainAlt + 50 ) } ENDIF
IF SrcDepth > Ceiling THEN { SrcDepth = Ceiling } ENDIF
IF SrcDepth >= 0 THEN { SrcDepth = PreEnableDepth } ENDIF
IF ( ( WakeMode == 1 ) And ( RunToEnable < 926 ) ) THEN { RunToEnable = 926 } ENDIF
IF RunToEnable < 5000 Then { RngT = ( RunToEnable - 926 ) TurnAngle = -20 } ELSE { RngT = ( RunToEnable / 2 ) TurnAngle = -10 } ENDIF
} ENDIF
IF WireGuide THEN {
IF ( Run >= RngT ) AND ( Time >= InitTime ) AND Turn Then {
	TurnAngle = RND ( TurnAngle )
IF RTB <= 500 THEN { TurnAngle = ABS ( TurnAngle ) } ENDIF
	PreEnableCourse = ( PreEnableCourse + TurnAngle )
	Turn = 0
} ENDIF } ENDIF
; Fuel Calc
IF FUEL < 0 THEN {
	SHUTDOWN
} ELSE {
	CorrInterogg = ( Time - CorrInterogg )
	IF ( ( OWNALT < 0 ) AND ( ( OWNSPD >= ( spdmin - 1 ) ) OR ( OWNSPD <= ( MAXSPD + 1 ) ) ) ) THEN {
		FSR = ( FSRMIN + ( ( OWNSPD - spdmin ) * K ) )
		FSR = ( FSR * CorrInterogg )
		FUEL = ( FUEL - FSR )	
	} ENDIF	
	CorrInterogg = Time
IF SilStart THEN {
	IF ( OwnSpd <= RunOutSpeed ) AND ( mission != 1 ) THEN {
		SetPriority 255
		SetSnorkel OFF
		mission = 1
	} ENDIF
} ENDIF
If ( Time >= InitTime ) Then {
IF NEWTRACK THEN {
IF ( TgtClass $= "Sub" ) Then { TClass = 1 } Endif
IF ( TgtClass $= "Surf" ) Then { TClass = 2 } Endif
if ( ( ownalt >= Layer ) and ( tgtalt < Layer ) ) or ( ( ownalt < Layer ) and ( tgtalt >= Layer ) ) then { ColT = 1 } else { ColT = 0 } endif
if ColT and ( ( AcousticMode and ( tgtrng > dfs ) ) or ( ( tgtconf < 50 ) and not ( AcousticMode or WakeMode ) ) ) then {
	SETTACTIC "SBROS_T"
} else {
	IF WakeMode THEN {
		Homing = 0
		if not ( TargetName $= "Towed Decoy" ) then {
			SetTactic "Terminal_Home_Wake"
		} endif
	} ELSE {
		if FN then {
			if ( ( TGTALT > -20 ) AND ( SUB_SURF == 0 ) ) or ( ( TGTALT < -20 ) and SUB_SURF ) then { temp = 1 } else { temp = 0 } endif
		} else { temp = 1 } endif
			IF TEMP THEN {
				if tconf < tgtconf then { 
					TRNG = TGTRNG
					TALT = TGTALT
					TBRG = TGTBRG
					TSILOS = TGTSILOS
					GotHim = 0
					Treatak = -1
					FDROPA = 1
				} endif
IF ( ( TgtClass $= "Weap" ) AND NOT ( TargetName $= "Towed Decoy" ) ) OR ( TgtType $= "Bio" ) THEN { SETTACTIC "TorpHomCMN" } else { SETTACTIC "TorpHom" } ENDIF
			} else {
				SETTACTIC "SBROS_T"
			} endif
		} ENDIF
	} ENDIF
} ENDIF
} endif
IF LOSTTRACK AND ( Time > InitTime ) THEN {
IF not WakeMode THEN {
	IF FREATAK THEN {
	IF FDROPA and ( TRng < ( 1000 + rnd 500 ) ) THEN {
		TReatak = Time
		NUK = 1
		TR1 = ( Time + 30 )
		curs_r = owncrs
		IF ( ( TIME MOD 2 ) - ( TIME MOD 1 ) ) THEN {
			UREATAK = -5
		} ELSE { 
			UREATAK = 5
		} ENDIF
	} ENDIF
	} ENDIF
	FDROPA = 1
} ENDIF
} ENDIF
	Run += xyrng ( OwnX - InitX ) ( OwnY - InitY )
		InitX = OwnX
		InitY = OwnY
IF NOT Enabled THEN {
       IF ( RunToEnable != -1 ) AND ( Run >= RunToEnable ) THEN {
		NUK = 1
		Enabled = 1
		RunToEnable = -1
		SearchON
	} ENDIF
	SETPRIORITY 252	SetAlt PreEnableDepth
	SETPRIORITY 252	SetSpd RunoutSpeed
	IF Time > InitTime THEN {
		SETPRIORITY 252	SetCrs PreenableCourse
	} endif
} else {
	IF SrcDepth < ( TerrainAlt + 50 ) THEN { SrcDepth = ( TerrainAlt + 100 ) } ENDIF
	IF ( SrcDepth > 0 ) THEN { SrcDepth = Ceiling } ENDIF
	IF not HOMING THEN {
		Tconf = 0
		IF ( Time > InitTime ) AND ( OwnAlt <= 0 ) THEN {
			Tconf = 0
			if TReatak != -1 then {
				IF ( TR1 < Time ) and ( 5 > abs RelativeBearing curs_r owncrs ) THEN { TReatak = -1 } ELSE {
					RV = ( DKR * OWNSPD )
					IF NUK THEN { NUK = 0 KK = OWNCRS } ENDIF
					IF UREATAK == -5 THEN { KK = ( KK + RV ) MOD 360 } ELSE { KK = ( KK - RV ) MOD 360 } ENDIF
					SETPRIORITY 252 SETCRS KK
				} endif
			} ELSEIF WakeMode THEN {
				if fwake < time then {
					fwake = ( time + 1 )
					SETPRIORITY 245 SetCrs PreEnableCourse
					PreEnableDepth = SrcDepth
					SETPRIORITY 252 WakeFollow
				} endif
			} ELSE {
				snakecrs = RelativeBearing PreenableCourse OwnCrs
				IF snakecrs > 30 THEN {
					snakeleft = 1
					DU = 3
				} ELSEIF snakecrs < -30 THEN {
					snakeleft = 0
					DU = 3
				} ENDIF
				IF snakeleft THEN {
					SETPRIORITY 252 SETCRS ( OwnCrs - DU )
				} ELSE {
					SETPRIORITY 252 SETCRS ( OwnCrs + DU )
				} ENDIF
				DU += 1
			} ENDIF
			SETPRIORITY 252	SetAlt SrcDepth
			SETPRIORITY 252 SetSpd SrcSpd
		} ENDIF
	} ENDIF
} ENDIF

if Homing then {
fs = 0
if ( ( ownalt >= Layer ) and ( talt < Layer ) ) or ( ( ownalt < Layer ) and ( talt >= Layer ) ) then { ColT = 1
} else { ColT = 0 } endif
if ColT and ( ( AcousticMode and ( trng > dfs ) ) or ( ( tconf < 50 ) and not ( AcousticMode or WakeMode ) ) ) then {
fs = 1
} else {
IF not GotHim THEN {
	FTERM = 0
	GotHim = 1
	mspd = ( spdmin + 10 )
	IF DBBuoyFlags & 3 THEN { mspd = MaxSpd } ENDIF
	OLDBRG = TBRG
	IF AcousticMode THEN {
		mspd = MAXSPD
		DELAY = 7
	} ELSE {
		DELAY = 3
	} ENDIF
TAGE = 0
} ENDIF
NUK = 1
if ( ( talt - 11 ) > Ceiling ) or ( talt < floor ) then { FKORIDOR = 1 } else { FKORIDOR = 0 } endif
CalcSpd = ownspd
IF TAGE < DELAY THEN {
		CalcSpd = ( CalcSpd + 3 )
		IF CalcSpd > mspd THEN { CalcSpd = mspd } ENDIF
} ELSE {
		IF OWNSPD > spdmin THEN {
		CalcSpd = ( CalcSpd - 3 )
		IF CalcSpd < spdmin THEN { CalcSpd = spdmin } ENDIF
		} endif
} ENDIF
IF TRNG >= 180 THEN {
OrdDpth = TALT
IF TALT > Ceiling THEN { OrdDpth = Ceiling } ENDIF
IF TALT < floor THEN { OrdDpth = floor } ENDIF
DELTA1 = ( OrdDpth - ownalt )
ColT = ( ( ownspd * 1852 ) / 3600 )
if ColT != 0 then { 
ColT = ( TRNG / ColT ) } else { ColT = 0.001 } endif
if ( ( TRNG > 1300 ) OR ( ABS TSILOS < 11 ) ) then { SETPRIORITY 252 SETCRS TBRG
fterm = 0
} elseif ( ( TRNG > 500 ) OR ( ABS TSILOS < 30 ) ) then {
fterm = 0
IF ColT > 20 THEN { ColT = 20 } ENDIF
ColT += 3
OLDBRG = ( ( ColT * TBRG ) - ( ( ColT - 1 ) * OLDBRG ) )
OLDBRG = ( OLDBRG + 720 )
OLDBRG = ( OLDBRG MOD 360 )
SETPRIORITY 252 SETCRS OLDBRG
} else { fterm = 1 } endif
ColT = XYBRG ABS DELTA1 ( TRNG * 3.28 )
if DELTA1 < 0 then { ColT = ( -1 * ColT ) } endif
SETPRIORITY 252 setpitch ColT
} ENDIF
SETPRIORITY 252
SETSPD CalcSpd
OLDBRG = TBRG
} endif
} ENDIF
} ENDIF
} ENDIF
if ownalt > -8 then { SETPRIORITY 255 setalt -8 } endif
Homing = 0
If WireGuide Then {
	If Run >= ( TDist + 6000 ) AND NOT Mishit Then {
		AI_Wire
	} Endif
} Endif
