; -RA- ver. 1.41 Addon AI Air Torpedo Doctrine
; NEW ASROCS Torpedoes ADDED

var PreEnableCourse
var RunToEnable
var RunoutSpeed
var Enabled
var Homing
var SearchDepth
var Floor
var Ceiling
var AcousticMode
var spdmin
var InitTime
var InitX
var InitY
var Run
var TRange
var CorrInterogg
var Fuel
var Fsr
var K
var FsrMin
var DmaX
var DmiN
var SrcDepth
var Temp
var TIW
var TorpMaxDepth
var Snakeleft
VAR LA
var FIRST
var SrcSpd
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 Aprxm
var MistakeSolution
VAR FTERM
VAR FMAD
VAR NumbNG
var UM
VAR Tconf
var FDROPA
var FKORIDOR
VAR GOSUB
var Stab
var FS
var DFS
var RV
var DK
VAR NUK
VAR KK
var NLA
var VC
func SearchON {
IF AcousticMode THEN {
	ENABLE
	SensorEnable "268" 0
	SensorEnable "539" 0
	SensorEnable "540" 0
	SensorEnable "547" 0
	SensorEnable "548" 0
	SensorEnable "549" 0
	SensorEnable "556" 0
	SensorEnable "556" 0
	SensorEnable "557" 0
	SensorEnable "813" 0
	SensorEnable "814" 0
	SensorEnable "815" 0
	SensorEnable "709" 0
	SensorEnable "817" 0
	SensorEnable "1069" 0
	SensorEnable "1072" 0
	SensorEnable "AI AIR Shallow ID" 0
} ELSE {
	PASSIVEENABLE
	SensorEnable "268" 0
	SensorEnable "AI AIR Shallow ID" 0
} ENDIF
}
IF INIT THEN {
FMAD = 1
InitTime = ( Time + 1000 )
FIRST = 1
TorpMaxDepth = ( MinAlt * 3.28 )
Run = 0
Tiw = 0
Enabled = 0
Homing = 0
RunToEnable = 1000
Floor = TorpMaxDepth
Ceiling = -10
AcousticMode = ( RND 10 )
MistakeSolution = ( RND 10 )
SensorEnable "AI AIR Shallow ID" 1
DFS = 800
GOSUB = 0
temp = ( time + rnd 100 )
IF ( ( temp MOD 2 ) - ( temp MOD 1 ) ) THEN { snakeleft = 0 } ELSE { snakeleft = 1 } ENDIF
IF ( AcousticMode >= 5 ) THEN { AcousticMode = 1 } ELSE { AcousticMode = 0 } endif
IF ( ( OwnName $= "AIR Mk 54 Torpedo AI" ) OR ( OwnName $= "AIR MK 54 Torp Helo CTRL" ) ) THEN { spdmin = 30 UM = 90 TRange = 16668 DMAX = 11112 GOSUB = 0 DFS = 1000 VC = 1 DK = 0.5
} elseIF ( OwnName $= "AIR Mk 50 Torp AI" ) THEN { spdmin = 35 UM = 99 TRange = 12964 DMAX = 9075 GOSUB = 1 DFS = 1112 VC = 1 DK = 0.34
} elseIF ( OwnName $= "AIR APR-2E Torpedo AI" ) THEN { spdmin = 35 UM = 99 TRange = 4630 DMAX = 3010 GOSUB = 1 DFS = 900 DK = 0.22
} elseIF ( OwnName $= "AIR APR-3E Torpedo AI" ) THEN { spdmin = 35 UM = 99 TRange = 5556 DMAX = 3333 GOSUB = 1 DFS = 1000 DK = 0.22
} elseIF ( OwnName $= "AIR UMGT-1 Torpedo AI" ) THEN { spdmin = 25 UM = 99 TRange = 12964 DMAX = 9075 GOSUB = 0 VC = 1 DK = 0.39
} elseIF ( OwnName $= "UMGT-1 Torpedo Silex AI" ) THEN { spdmin = 25 UM = 99 TRange = 12964 DMAX = 9075 GOSUB = 0 AcousticMode = 1 VC = 1 DK = 0.39
} elseIF ( OwnName $= "UMGT-1 Torpedo Silex User" ) THEN { spdmin = 25 UM = 99 TRange = 12964 DMAX = 9075 GOSUB = 0 AcousticMode = 1 DK = 0.39
} elseIF ( OwnName $= "AIR MPT-1UE Torpedo AI" ) THEN { spdmin = 30 UM = 99 TRange = 14816 DMAX = 10371 GOSUB = 0 DFS = 875 DK = 0.4
} elseIF ( OwnName $= "AIR Mk 44 Torpedo AI" ) THEN { spdmin = 20 UM = 200 AcousticMode = 1 TRange = 6500 DMAX = 4500 DK = 0.25
} elseIF ( OwnName $= "AIR Yu-7 Torpedo" ) THEN { spdmin = 20 UM = 99 AcousticMode = 1 TRange = 6500 DMAX = 4500 DK = 0.25
} elseIF ( OwnName $= "AIR A 244 Torpedo" ) THEN { spdmin = 20 UM = 99 TRange = 13500 DMAX = 9500 GOSUB = 1 DK = 0.25
} elseIF ( OwnName $= "AIR Stingray Torpedo" ) THEN { spdmin = 25 UM = 200 TRange = 11112 DMAX = 8330 DFS = 1000 DK = 0.25
} elseIF ( OwnName $= "AIR L5 Torpedo" ) THEN { spdmin = 20 UM = 99 TRange = 9260 DMAX = 7000 GOSUB = 1 DK = 0.25
} elseIF ( OwnName $= "AIR Mk 46 Torpedo" ) THEN { spdmin = 30 UM = 99 TRange = 11112 DMAX = 8334 DK = 0.35
} elseIF ( OwnName $= "Mk 46 Ikara ASROC Torpedo" ) THEN { spdmin = 30 UM = 99 TRange = 11112 GOSUB = 1 DMAX = 8334 DK = 0.35
} elseIF ( OwnName $= "AIR E45-75A Torpedo AI" ) THEN { spdmin = 20 UM = 200 TRange = 12964 DMAX = 9000 DK = 0.4
} elseIF ( OwnName $= "AIR AT-1 Torpedo AI" ) THEN { spdmin = 26 UM = 200 TRange = 9260 DMAX = 9000 stab = 1 DK = 0.25
} elseIF ( OwnName $= "AIR AT-2UM Torpedo AI" ) THEN { spdmin = 23 UM = 99 TRange = 10500 DMAX = 8330 stab = 1 DK = 0.22
} elseIF ( OwnName $= "AIR MU-90 Torp AI" ) THEN { spdmin = 29 UM = 99 TRange = 23004 DMAX = 11075 GOSUB = 1 DFS = 1000 VC = 1 DK = 0.34
} elseIF ( OwnName $= "AI MU-90 Milas Torpedo" ) THEN { spdmin = 29 UM = 99 TRange = 23004 DMAX = 11075 GOSUB = 1 AcousticMode = 1 VC = 1 DFS = 1000 DK = 0.34
} elseIF ( OwnName $= "MU-90 Milas Torpedo User" ) THEN { spdmin = 29 UM = 99 TRange = 23004 DMAX = 11075 GOSUB = 1 AcousticMode = 1 DFS = 1000 DK = 0.5
} elseIF ( OwnName $= "AIR L7 Torpedo" ) THEN { spdmin = 20 UM = 99 TRange = 12964 DMAX = 9075 GOSUB = 1 DFS = 1000 DK = 0.39 } ENDIF
If VC Then {
	IF ( AcousticMode >= 5 ) THEN {
		DK = ( DK * 1.5 )
	} endif
} endif
DK = ( 0.1 / ( DK * 3.1415926 ) )
FUEL = 1000
DMIN = ( Trange / 1852 )
DMAX = ( DMAX / 1852 )
FSRMIN = ( FUEL / ( DMIN / ( spdmin / 3600 ) ) )
K = ( ( ( FUEL / ( DMAX / ( MAXSPD / 3600 ) ) ) - FSRMIN ) / ( MAXSPD - spdmin ) ) 
IF RunToEnable < 200 THEN { RunToEnable = 200 } ENDIF
SETPRIORITY 252 SetAlt -20
Tconf = 0
FDROPA = 0
} ELSE {
IF NOT TIW THEN {
IF FMAD THEN {
IF TgtSource $= "MAD" THEN {
	FMAD = 0
 	If TgtType $= "Sub" Then {
		if TgtClass $= "SURF" then {
			SrcDepth = -23
		} else {
			Aprxm = RND -375
	If TgtAOB < 0 Then {
		snakeleft = 0
	} elseif TgtAOB > 0 Then {
		snakeleft = 1
	} endif
		If MistakeSolution <= 5 Then { Aprxm = ABS Aprxm } Endif
			SrcDepth = ( TgtAlt + Aprxm )
			IF SrcDepth >= 0 THEN { SrcDepth = -100 } ENDIF
		If MistakeSolution >= 7 Then { SrcDepth = TgtAlt } Endif
	If ( TgtSpd <= 7 ) Then { AcousticMode = 1 } endif
		} endif
	} ELSEIF TgtType $= "Ship" Then {
		SrcDepth = -23
	If TgtSpd < 5 Then {
		AcousticMode = 1
	} Endif
} endif
	SensorEnable "AI AIR Shallow ID" 0
	SETTACTIC "SBROS"
} endif
} ENDIF
} ELSEIF FIRST THEN {
FIRST = 0
SrcSpd = spdmin
RunoutSpeed = ( spdmin + ( RND 20 ) )
FLOOR = TorpMaxDepth
IF floor <= TerrainAlt THEN { FLOOR = ( TerrainAlt + 30 ) } ENDIF
IF FLOOR > 0 THEN { FLOOR = TerrainAlt } ENDIF
Ceiling = -1
IF FMAD THEN {
IF LAYER == 0 THEN { NLA = ( ( FLOOR - CEILING ) / 2 )
	LA = ( RND NLA )
} ELSE {
	LA = LAYER
} ENDIF

IF 5 > RND 10 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
} ENDIF
FLOOR = TorpMaxDepth
IF SrcDepth < TorpMaxDepth THEN { SrcDepth = TorpMaxDepth } ENDIF
IF SrcDepth < ( TerrainAlt + 50 ) THEN { SrcDepth = ( TerrainAlt + 25 ) } ENDIF
IF SrcDepth > Ceiling THEN { SrcDepth = Ceiling } ENDIF
IF Stab Then { SrcSpd = MaxSpd RunoutSpeed = MaxSpd } Endif
} endif
IF ( OwnAlt <= 0 ) AND ( not TIW ) AND ( OwnSpd <= ( MAXSPD + 1 ) ) THEN {
	SensorEnable "AI AIR Shallow ID" 0
	TIW = 1
	CorrInterogg = TIME
	InitTime = ( Time + 3 )
	InitX = OwnX
	InitY = OwnY
} ENDIF
IF TIW THEN {
	Run += xyrng ( OwnX - InitX ) ( OwnY - InitY )
		InitX = OwnX
		InitY = OwnY
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 NEWTRACK AND NOT ( TgtType $= "Sonobuoy" ) THEN {
if ( ( ( ownalt >= Layer ) and ( tgtalt < Layer ) ) or ( ( ownalt < Layer ) and ( tgtalt >= Layer ) ) ) and ( tgtrng > dfs ) then {
	SETTACTIC "SBROS_T"
} else {
IF GOSUB THEN {
	IF TGTALT < -20 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
	} endif
IF ( ( TgtClass $= "Weap" ) AND NOT ( TargetName $= "Towed Decoy" ) ) OR ( TgtType $= "Bio" ) THEN {
	SETTACTIC "TorpHomCMN"
} else {
	SETTACTIC "TorpHom"
} ENDIF
	} ELSE {
		SETTACTIC "SBROS"
	} ENDIF
} ENDIF
} ENDIF
IF NOT Enabled THEN {
	NUK = 1
	IF ( RunToEnable != -1 ) AND ( Run >= RunToEnable ) THEN {
		SearchON
	Enabled = 1
	RunToEnable = -1
	} ENDIF
} ELSEIF ( not Homing ) AND ( Time > InitTime ) AND ( OwnAlt <= 0 ) then {
	Tconf = 0
	SETPRIORITY 252	SetAlt SrcDepth
	SETPRIORITY 252	SetSpd SrcSpd

	IF NUK THEN { NUK = 0 KK = OWNCRS } ENDIF
	RV = ( DK * OWNSPD )
	IF snakeleft THEN { KK = ( KK + RV ) MOD 360 } ELSE { KK = ( KK - RV ) MOD 360 } ENDIF
	SETPRIORITY 252 SETCRS KK
} ENDIF
if ( Time < InitTime ) or ( not enabled ) Then {
	SETPRIORITY 252	SetSpd RunoutSpeed
	SETPRIORITY 252 SETCRS PreEnableCourse
	SETPRIORITY 252	SetAlt -30 } endif
if Homing then {
if ( ( ( ownalt >= Layer ) and ( talt < Layer ) ) or ( ( ownalt < Layer ) and ( talt >= Layer ) ) ) and ( trng > dfs ) 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
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
} ENDIF
if ownalt > -8 then { SETPRIORITY 255 setalt -27 } endif
Homing = 0
If OwnAlt <= TorpMaxDepth Then {
	If Time > ( InitTime + 5 ) Then {
; DebugOut "Torpedo Reached Fatal Depth, has been remove:"
; DebugOut OwnName
	ShutDown
	} endif
} endif
