; -RA- v1.41 Addon General Torpedo Doctrine v.2

var PreenableCourse
var PreenableDepth
var RunToEnable
var RunoutSpeed
var Enabled
var Homing
var SrcDepth
var Floor
var Ceiling
var InitTime
var InitX
var InitY
var Run
var SrcSpd
var AcousticMode
var spdmin
var CorrInterogg
var fuel
var FSR
var K
var FSRMIN
var DMAX
var DMIN
var TRange
var TorpMaxDepth
var SearchDepth
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 Turn
var AM
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 FN
var SUB_SURF
var curs_r
var TReatak
Var TR1
var FS
var DFS
var RV
VAR NUK
VAR KK
var DKR
var TDist
var TClass
var Mishit
var SilStart
var mission
var stab

func SearchON {
IF AcousticMode THEN {
	ENABLE
	SensorEnable "268" 0
} ELSE {
	PASSIVEENABLE
	SensorEnable "268" 0
} 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
}
Func CLC_DPT {
	FLOOR = TorpMaxDepth
	IF floor <= TerrainAlt THEN { FLOOR = ( TerrainAlt + 30 ) } ENDIF
	IF FLOOR > 0 THEN { FLOOR = TerrainAlt } ENDIF
	Ceiling = -12
	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 INIT THEN {
PreSet = 1
DFS = 800
CorrInterogg = Time
TorpMaxDepth = ( MinAlt * 3.28 )
IF ( DBUser1Flags & 2 ) == 2 THEN { SetSnorkel On SilStart = 1 } ENDIF
if ownalt > -15 then { PreEnableDepth = -23 } else { PreEnableDepth = Ownalt } endif
InitTime = ( Time + 4 )
Enabled = 0
Homing = 0
AM = 4
RTB = RND 1000
InitX = OwnX
InitY = OwnY
Floor = TorpMaxDepth
Tconf = 0
Treatak = -1
FDROPA = 1
} ELSE {
IF PreSet THEN {
PreSet = 0
DKR = 0.3
IF ( DBUser1Flags & 1 ) == 1 THEN { WireGuide = 1 } ELSE { WireGuide = 0 } ENDIF
IF ( OwnName $= "SET-53 Torpedo" ) THEN { spdmin = 28 UM = 200 FREATAK = 0 TRange = 14000 DMAX = 13995 Stab = 1
} elseIF ( OwnName $= "SAET-60 Torpedo" ) THEN { spdmin = 32 UM = 200 FREATAK = 1 TRange = 24000 DMAX = 16800 PreEnableDepth = -46 FN = 1
} elseIF ( OwnName $= "YU-4 Torpedo" ) THEN { spdmin = 30 UM = 200 FREATAK = 0 TRange = 22000 DMAX = 18000 FN = 1
} elseIF ( OwnName $= "E 15 Torpedo" ) THEN { spdmin = 20 UM = 200 FREATAK = 0 TRange = 10000 DMAX = 8000 PreEnableDepth = -46 } ENDIF
FUEL = 1000
DMIN = ( Trange / 1852 )
DMAX = ( DMAX / 1852 )
FSRMIN = ( FUEL / ( DMIN / ( spdmin / 3600 ) ) )
K = ( ( ( FUEL / ( DMAX / ( MAXSPD / 3600 ) ) ) - FSRMIN ) / ( MAXSPD - spdmin ) )
DKR = ( 0.1 / ( DKR * 3.1415926 ) )
RunoutSpeed = ( MaxSpd - ( RND 10 ) )
IF RunToEnable < 250 THEN { RunToEnable = 250 } ENDIF
IF ( TgtType $= "Ship" ) Then {
	SUB_SURF = 0
	IF AM <= 7 THEN {
		AcousticMode = 0
		SrcSpd = ( spdmin + ( RND 6 ) )
	} ELSE { AcousticMode = 0
		SrcSpd = ( spdmin + ( RND 6 ) )
	} ENDIF
	Ceiling = -7
	SrcDepth = -21
	Floor = -40
} ELSE {
	SUB_SURF = 1
	if WireGuide then { Turn = 1 } endif
	IF AM >= 5 THEN {
		AcousticMode = 0
		SrcSpd = ( spdmin + ( RND 6 ) )
	} ELSE {
		AcousticMode = 0
		SrcSpd = ( spdmin + ( RND 6 ) )
	} ENDIF
		CLC_DPT
If ( ( TgtAlt > -1 ) AND ( SearchDepth == -6.6 ) ) THEN {
	RunoutSpeed = MaxSpd
	Turn = 0
} ENDIF
If ( ( TgtSource $= "Visual" ) AND ( ( TgtAlt < -3 ) AND ( SearchDepth != -6.6 ) ) ) THEN {
	RunoutSpeed = MaxSpd
	Turn = 0
} ENDIF
} ENDIF
IF Stab Then { SrcSpd = MaxSpd RunoutSpeed = MaxSpd } 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 RunToEnable < 5000 Then { RngT = ( RunToEnable - 926 ) TurnAngle = -20 } ELSE { RngT = ( RunToEnable / 2 ) TurnAngle = -10 } ENDIF
Floor = TorpMaxDepth
Ceiling = -7
} ENDIF

; AI WireGuide
IF Turn THEN {
	IF ( Run >= RngT ) AND ( Time >= InitTime ) Then {
		TurnAngle = RND ( TurnAngle )
		IF RTB <= 500 THEN { TurnAngle = ABS ( TurnAngle ) } ENDIF
		PreEnableCourse = ( PreEnableCourse + TurnAngle )
		Turn = 0
	} ENDIF
} ENDIF

; Fuel Calculate
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 ) ) then {
	SETTACTIC "SBROS_T"
} 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
IF LOSTTRACK AND ( Time > InitTime ) 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
	Run += xyrng ( OwnX - InitX ) ( OwnY - InitY )
		InitX = OwnX
		InitY = OwnY
IF NOT Enabled THEN {
	IF ( RunToEnable != -1 ) AND ( Run >= RunToEnable ) THEN {
		Enabled = 1
		SearchON
		NUK = 1
		RunToEnable = -1
	} ENDIF
	SETPRIORITY 252	SetAlt PreEnableDepth
	SETPRIORITY 252	SetSpd RunoutSpeed
	if Time > InitTime Then {
		SETPRIORITY 252	SetCrs PreenableCourse
	} ENDIF
} ELSEIF not HOMING 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
	} else {
		SETPRIORITY 252 Snake PreEnableCourse
		SETPRIORITY 252	SetAlt SrcDepth
		SETPRIORITY 252 SetSpd SrcSpd
	} ENDIF
} ELSE {
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 ) ) 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
if ownalt > -8 then { SETPRIORITY 255 setalt -8 } endif
Homing = 0
If WireGuide Then {
 	If Run >= ( TDist + 6000 ) AND NOT Mishit Then {
 		Mishit = 1
 		AI_Wire
	} Endif
} Endif
