; -RA- v 1.41 User Advanced Torpedo Control 2 Doctrine

var PreEnableCourse
var PreEnableSpeed
var PreEnableDepth
var RunToEnable
var CircleSearchPattern
var Enabled
var Homing
var SearchDepth
var Floor
var Ceiling
var AcousticMode
var spdmin
var InitTime
var InitX
var InitY
var Run
var Enabled1
var WakeMode
var snakeleft
var snakecrs
var CorrInterogg
var fuel
var FSR
var K
var FSRMIN
var DMAX
var DMIN
var TorpMaxDepth
var ImpactTime
var CrushDpth
var Explode
var FIRST
var SrcSpd
var FD
var TFD
VAR OPRDEPTH
var fenab
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 fwake
VAR NumbNG
var UM
VAR Tconf
var TReatak
var FDROPA
VAR FREATAK
VAR UREATAK
var OLDPreCourse
var FKORIDOR
var ASW_Mission
VAR FSC
var SFloor
var SCeiling
var Udaloy
var curs_r
Var TR1
var Direct
var MODE
var RV
var RBV
var MCode
var TRange
var FS
var DFS
var DU
VAR TU 
var DK
VAR NUK
VAR KK
var DKR
var SilStart
var mission

func SearchON {
IF AcousticMode THEN {
; DEBUGOUT "Active Sensor Enabled"
ENABLE
SensorEnable "268" 0
SensorEnable "542" 0
SensorEnable "644" 0
SensorEnable "812" 0
SensorEnable "845" 0
} ELSE {
IF WakeMode THEN {
; DEBUGOUT "W A K E Sensor Enabled"
PASSIVEENABLE
SensorEnable "268" 0
SensorEnable "542" 0
SensorEnable "644" 0
SensorEnable "812" 0
} ELSE {
PASSIVEENABLE
; DEBUGOUT "Passive Sensor Enabled"
SensorEnable "268" 0
SensorEnable "845" 0
} ENDIF
} ENDIF
}

IF INIT THEN {
TU = -1
FIRST = 1
fenab = 1
FD = 1
TFD = -1
CorrInterogg = Time
PreEnableDepth = Ownalt
if ownalt > 12 then { Udaloy = true } endif
IF ( DBUser1Flags & 2 ) == 2 THEN { SetSnorkel On SilStart = 1 } ENDIF
if ownalt > -15 then { PreEnableDepth = -15 } endif
Explode = RND 10
InitTime = ( Time + 3 )
InitX = OwnX
InitY = OwnY
FREATAK = 1
Treatak = -1
FDROPA = 1
} ELSE {
IF FIRST THEN {
FIRST = 0
DKR = 0.25
IF OwnName $= "UGST Torpedo U" THEN { spdmin = 30 UM = 80 FREATAK = 1 TRange = 40000 DMAX = 31000 TorpMaxDepth = -1689 DFS = 1375 DK = 0.7 } ENDIF
IF OwnName $= "Black Shark Torpedo U" THEN { spdmin = 35 UM = 85 FREATAK = 1 TRange = 50000 DMAX = 30000 TorpMaxDepth = -2706 DFS = 1500 DK = 0.5 } ENDIF
IF OwnName $= "DM 2A4 Torpedo U" THEN { spdmin = 30 UM = 80 FREATAK = 1 TRange = 55560 DMAX = 38000 TorpMaxDepth = -1500 DFS = 1500 DK = 0.6 } ENDIF
IF ( OwnAlt <= TorpMaxDepth ) THEN { CrushDpth = 1 ImpactTime = ( Time + 10 ) } ENDIF
FUEL = 1000
DMIN = ( Trange / 1852 )
DMAX = ( DMAX / 1852 )
FSRMIN = ( FUEL / ( DMIN / ( spdmin / 3600 ) ) )
K = ( ( ( FUEL / ( DMAX / ( MAXSPD / 3600 ) ) ) - FSRMIN ) / ( MAXSPD - spdmin ) )
If Not Udaloy Then {
MCode = ( floor / 3.28 )
MCode = ( MCode - ( MCode mod 1 ) )
MODE = ( MCode / 1000 )
MODE = ( MODE - ( MODE mod 1 ) )
MCode = ( MCode - ( MODE * 1000 ) )
floor -= ( MODE * 1000 )
SFloor = ( MCode * 3.28 )
SCeiling = Ceiling
} ENDIF
If Udaloy Then {
MCode = floor
MCode = ( MCode - ( MCode mod 1 ) )
MODE = ( MCode / 1000 )
MODE = ( MODE - ( MODE mod 1 ) )
MCode = ( MCode - ( MODE * 1000 ) )
floor -= ( MODE * 1000 )
SFloor = ( floor * 3.28 )
if Ceiling == -2 then { Ceiling = -7
} elseif Ceiling == -3 then { Ceiling = -10
} elseif Ceiling < -3 then { Ceiling = ( Ceiling * 3.28 )
} endif
SearchDepth = ( SearchDepth * 3.28 )
If SearchDepth < TorpMaxDepth THEN {
	SearchDepth = -1650
} Endif
If SFloor > SearchDepth THEN {
	SFloor = -1650
} Endif
} ENDIF
if Ceiling == -7 then { ASW_Mission = 2
} elseif Ceiling == -10 then { ASW_Mission = 0
} elseif Ceiling < -10 then { ASW_Mission = 1
} endif
; ASW 1 - ONLY SUB
; ASW 2 - SUB+SURF
; ASW 0 - SURF
Floor = TorpMaxDepth
Ceiling = -7
DU = 3
IF ( MODE == -4 ) THEN { Direct = 1 MODE = "DIRECT MOVE"
} ELSEIF MODE == -3 AND ( CircleSearchPattern ) THEN { snakeleft = 0 RV = -3 DKR = ( DK * 0.5 ) MODE = "RightSide - Wide CIRCLE"
} ELSEIF MODE == -2 AND ( CircleSearchPattern ) THEN { snakeleft = 1 RV = -3 DKR = ( DK * 0.5 ) MODE = "LeftSide - Wide CIRCLE"
} ELSEIF MODE == -1 AND ( CircleSearchPattern ) THEN { snakeleft = 0 RV = -10 DK = ( DK * 0.5 ) DKR = DK MODE = "RightSide - Narrow CIRCLE"
} ELSEIF MODE == 0 AND ( CircleSearchPattern ) THEN { snakeleft = 1 RV = -10 DK = ( DK * 0.5 ) DKR = DK MODE = "LeftSide - Narrow CIRCLE"
} ELSEIF MODE == -3 THEN { snakeleft = 0 RBV = -45 RV = -3 DKR = ( DK * 0.5 ) MODE = "RightSide - WIDE SNAKE"
} ELSEIF MODE == -2 THEN { snakeleft = 1 RBV = -45 RV = -3 DKR = ( DK * 0.5 ) MODE = "LeftSide - WIDE SNAKE"
} ELSEIF MODE == -1 THEN { snakeleft = 0 RBV = -30 RV = -10 DKR = ( DK * 0.5 ) MODE = "RightSide - Narrow SNAKE"
} ELSEIF MODE == 0 THEN { snakeleft = 1 RBV = -30 RV = -10 DKR = ( DK * 0.5 ) MODE = "LeftSide - Narrow SNAKE"
} ENDIF
; DebugOut MODE
DK = ( 0.1 / ( DK * 3.1415926 ) )
DKR = ( 0.1 / ( DKR * 3.1415926 ) )
IF RunToEnable < 100 THEN { RunToEnable = 100 } ENDIF
SrcSpd = PreEnableSpeed
If ( SrcSpd < spdmin ) Then { SrcSpd = spdmin } Endif
IF ( PreEnableSpeed < spdmin ) THEN { PreEnableSpeed = spdmin } ENDIF
IF not AcousticMode THEN { 
IF ( SearchDepth > -34 ) THEN { WakeMode = 1
} ELSEIF PreEnableSpeed > ( spdmin + 5 ) THEN { SrcSpd = ( spdmin + 5 ) } ENDIF
} ENDIF
} ENDIF
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	
IF SilStart THEN {
	IF ( OwnSpd <= PreEnableSpeed ) AND ( mission != 1 ) THEN {
		SetPriority 255
		SetSnorkel OFF
		mission = 1
	} ENDIF
} ENDIF
IF NEWTRACK THEN {
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 { FSC = 0
} elseif ASW_Mission == 2 then {
	IF TGTALT < ( Sfloor + 10 ) THEN { FSC = 1 } else { FSC = 0 } endif
} else {
	IF tgtalt > -10 THEN {
		IF ASW_Mission == 1 THEN { FSC = 1 } ELSE { FSC = 0 } ENDIF
	} ELSE {
		IF ASW_Mission == 1 THEN {
			IF ( TGTALT > SCeiling ) OR ( TGTALT < Sfloor ) THEN { FSC = 1 } else { FSC = 0 } endif
		} ELSE { FSC = 1 } ENDIF
	} ENDIF
} endif
IF FSC THEN {
	SETTACTIC "SBROS_T"
} ELSE {
	IF WakeMode THEN {
		Homing = 0
		FREATAK = 0
		if not ( TargetName $= "Towed Decoy" ) then {
			SetTactic "Terminal_Home_Wake"
			Treatak = -1
		} endif
	} ELSE {
	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
		} ENDIF
	} ENDIF
} endif
} ENDIF
IF LOSTTRACK 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 ( CrushDpth == 1 ) AND ( Time >= ImpactTime ) THEN {
	IF Explode >= 5 THEN { Detonate } ELSE { Shutdown } ENDIF
} ENDIF
IF ( TFD != -1 ) AND ( TFD < TIME ) THEN { TFD = -1 Enabled1 = 0 } ENDIF
IF NOT Enabled THEN {
	fenab = 1
	TReatak = -1
	NUK = 1
IF ( RunToEnable != -1 ) AND ( Run >= RunToEnable ) THEN {
		SearchON
		Enabled = 1
		RunToEnable = -1
	} ELSEIF ( Time > InitTime ) AND ( OwnAlt <= 0 ) THEN {
		Homing = 0
		SETPRIORITY 252	SetCrs PreEnableCourse
		SETPRIORITY 252 SetSpd PreEnableSpeed
		SETPRIORITY 252	SetAlt PreEnableDepth
	} ENDIF
} else {
IF SearchDepth < ( TerrainAlt + 50 ) THEN { SearchDepth = ( TerrainAlt + 100 ) } ENDIF
IF SearchDepth > 0 THEN { SearchDepth = -15 } ENDIF
	if fenab then { fenab = 0 Enabled1 += 1 TFD = ( TIME + 4 ) } endif

IF NOT ( Homing OR NEWTRACK OR LOSTTRACK ) THEN {
	Tconf = 0
IF ( Time > InitTime ) AND ( OwnAlt <= 0 ) THEN {
IF PreEnableCourse != OLDPreCourse THEN { TReatak = -1 TU = ( TIME + 12 ) } ENDIF
	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 {
		IF TU != -1 THEN {
			SETPRIORITY 252 SetCrs PreEnableCourse
		} ELSEIF CircleSearchPattern THEN {
			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
		} ELSEIF WakeMode THEN {
			if fwake < time then { fwake = ( time + 1 ) SETPRIORITY 245 SetCrs PreEnableCourse SETPRIORITY 252 WakeFollow } endif
		} ELSEIF Direct THEN {
			SETPRIORITY 245 SetCrs PreEnableCourse
		} ELSE {
			snakecrs = RelativeBearing PreenableCourse OwnCrs
				IF snakecrs > ABS RBV THEN {
					snakeleft = 1
					DU = 3
				} ELSEIF snakecrs < RBV THEN {
					snakeleft = 0
					DU = 3
				} ENDIF
IF snakeleft THEN {
	SETPRIORITY 252 SETCRS ( OwnCrs - DU )
} ELSE {
	SETPRIORITY 252 SETCRS ( OwnCrs + DU )
} ENDIF
	DU += 1
	} endif
} endif
IF FD THEN { FD = 0 OPRDEPTH = SearchDepth } ENDIF
	SETPRIORITY 252 SetSpd SrcSpd
IF Enabled1 >= 2 THEN {
	Enabled1 = 0
	IF FLOOR < TerrainAlt THEN { COLT = ( TerrainAlt + 30 ) } ELSE { COLT = FLOOR } ENDIF
	IF LAYER == 0 THEN { LA = ( ( COLT - CEILING ) / 2 ) } ELSE { LA = LAYER } ENDIF
	IF ( -200 > TerrainAlt ) AND ( CEILING > LA ) THEN {
	IF OPRDEPTH < LA THEN {
;	DebugOut "Go Over Layer"
	if SearchDepth > LA THEN {
;		DebugOut "Restore Depth"
		CalcSpd = SearchDepth
	} ELSE {
		CalcSpd = ( LA - CEILING )
		CalcSpd = ( CalcSpd * 0.5 )
		CalcSpd = ( LA - CalcSpd )
	} ENDIF
} ELSE {
;	DebugOut "Go Under Layer"
	IF SearchDepth < LA THEN {
	CalcSpd = SearchDepth
} ELSE {
	CalcSpd = ( COLT - LA )
	CalcSpd = ( CalcSpd * 0.5 )
	CalcSpd = ( LA + CalcSpd )
} ENDIF	} ENDIF	} ENDIF
	OPRDEPTH = CalcSpd
} ENDIF
	SETPRIORITY 252	SetAlt OPRDEPTH
	} ENDIF
} ENDIF
} ENDIF
IF Time < InitTime THEN {
	SETPRIORITY 252	SetSpd PreEnableSpeed
	SETPRIORITY 252	SetAlt PreEnableDepth } 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
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
IF TU != -1 THEN {
	IF TU < TIME THEN { TU = -1 } ENDIF
} ENDIF
IF CorrInterogg > 0.8 THEN { Homing = 0 } ENDIF
OLDPreCourse = PreEnableCourse
CorrInterogg = Time
