; -RA- DWX v.1.41 Addon Doctrine

var PreEnableCourse
var PreEnableSpeed
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 TRange
var CorrInterogg
var Fuel
var Fsr
var K
var FsrMin
var DmaX
var DmiN
var TIW
var snakeleft
var TorpMaxDepth
var SrcSpd
var FIRST
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 snakecrs
var Delta2
var Mode
var RV
var RBV
var Direct
VAR NumbNG
var UM
VAR Tconf
var TReatak
var FDROPA
VAR FREATAK
VAR UREATAK
var OLDPreCourse
var FKORIDOR
var MSyst
var curs_r
Var TR1
var FS
var DFS
VAR DU
var DK
VAR NUK
VAR KK
var DKR

func SearchON {
IF AcousticMode THEN {
ENABLE
SensorEnable "268" 0
SensorEnable "540" 0
SensorEnable "549" 0
SensorEnable "556" 0
SensorEnable "557" 0
SensorEnable "709" 0
SensorEnable "817" 0
} ELSE {
PASSIVEENABLE
SensorEnable "268" 0
} ENDIF
}
IF INIT THEN {
InitTime = ( Time + 1000 )
FIRST = 1
DFS = 800
Run = 0
Tiw = 0
Enabled = 0
Homing = 0
RunToEnable = 1000
Ceiling = -10
SearchDepth = -50
SETPRIORITY 252	SetAlt -20
Tconf = 0
Treatak = -1
FDROPA = 1
} ELSE {
IF FIRST Then {
FIRST = 0
IF OwnName $= "MK 54 Torpedo User AIR" THEN { spdmin = 30 UM = 99 FREATAK = 0 TRange = 16668 DMAX = 11112 TorpMaxDepth = -1721 DFS = 1000 DK = 0.6
} elseIF OwnName $= "MK 54 Torpedo User FFG" THEN { spdmin = 30 UM = 99 FREATAK = 0 TRange = 16668 DMAX = 11112 TorpMaxDepth = -1721 DFS = 1000 DK = 0.6
} elseIF OwnName $= "MK 50 Torpedo User AIR" THEN { spdmin = 35 UM = 99 FREATAK = 1 TRange = 12964 DMAX = 9075 TorpMaxDepth = -3935 DFS = 1112 DK = 0.6
} elseIF OwnName $= "Mk 50 Torpedo User FFG" THEN { spdmin = 35 UM = 99 FREATAK = 1 TRange = 12964 DMAX = 9075 TorpMaxDepth = -3935 DFS = 1112 DK = 0.6
} elseIF OwnName $= "UMGT-1 Torpedo U" THEN { spdmin = 25 UM = 99 FREATAK = 1 TRange = 12964 DMAX = 9075 TorpMaxDepth = -1641 MSyst = 1 DK = 0.4
} elseIF OwnName $= "MPT-1UE Torpedo U" THEN { spdmin = 30 UM = 99 FREATAK = 0 TRange = 14816 DMAX = 10371 TorpMaxDepth = -2351 MSyst = 1 DFS = 875 DK = 0.4
} elseIF OwnName $= "Mk 46 Torpedo U" THEN { spdmin = 30 UM = 99 FREATAK = 1 TRange = 11112 DMAX = 8334 TorpMaxDepth = -1509 MSyst = 1 DFS = 875 DK = 0.35
} elseIF OwnName $= "L5 Torpedo U" THEN { spdmin = 20 UM = 99 FREATAK = 1 TRange = 9260 DMAX = 7000 TorpMaxDepth = -1640 MSyst = 1 DFS = 1000 DK = 0.25
} elseIF ( OwnName $= "MU-90 Torp FFG User" ) OR ( OwnName $= "MU-90 Torp Helo User" ) THEN { spdmin = 29 UM = 99 FREATAK = 1 TRange = 23004 DMAX = 11075 TorpMaxDepth = -3935 MSyst = 1 DFS = 1000 DK = 0.6
} elseIF OwnName $= "AT-2UM Torpedo User" THEN { spdmin = 23 UM = 99 FREATAK = 0 TRange = 10500 DMAX = 8330 TorpMaxDepth = -1312 MSyst = 1 DFS = 875 DK = 0.22
} ENDIF
FUEL = 1000
DMIN = ( Trange / 1852 )
DMAX = ( DMAX / 1852 )
FSRMIN = ( FUEL / ( DMIN / ( spdmin / 3600 ) ) )
K = ( ( ( FUEL / ( DMAX / ( MAXSPD / 3600 ) ) ) - FSRMIN ) / ( MAXSPD - spdmin ) )
If NOT MSyst Then {
DELTA2 = floor
DELTA2 = ( DELTA2 - ( DELTA2 mod 1 ) )
MODE = ( DELTA2 / 10000 )
MODE = ( MODE - ( MODE mod 1 ) )
DELTA2 = ( DELTA2 - ( MODE * 10000 ) )
floor -= ( MODE * 10000 )
} ELSE {
delta2 = abs floor
MODE = 0
if ( ( delta2 / 3000 ) mod 2 ) >= 1 then {
delta2 -= 3000
MODE = -3
} elseif ( ( delta2 / 2000 ) mod 2 ) >= 1 then {
delta2 -= 2000
MODE = -2
} elseif ( ( delta2 / 1000 ) mod 2 ) >= 1 then {
delta2 -= 1000
MODE = -1
} endif
floor = ( -3.28 * delta2 )
SearchDepth = ( SearchDepth * 3.28 )
Ceiling = ( Ceiling * 3.28 )
} ENDIF
IF Floor < TorpMaxDepth THEN { Floor = TorpMaxDepth } ENDIF
IF ( ( MODE == -3 ) AND ( Floor == -2555 ) ) 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 ) )
DU = RV
If ( PreEnableCourse == 0 ) Then { PreEnableCourse = OwnCrs } Endif
IF Floor < TorpMaxDepth THEN { Floor = TorpMaxDepth } ENDIF
IF SearchDepth < Floor THEN { SearchDepth = ( Floor + 5 ) } ENDIF
IF ( not AcousticMode ) and ( PreEnableSpeed > ( spdmin + 6 ) ) and ( CircleSearchPattern == 1 ) THEN {	
PreEnableSpeed = spdmin SrcSpd = spdmin
} ELSEIF ( not AcousticMode ) and ( PreEnableSpeed > ( spdmin + 6 ) ) and ( CircleSearchPattern == 0 ) THEN {
PreEnableSpeed = PreEnableSpeed SrcSpd = spdmin
} ELSEIF ( not AcousticMode ) and ( PreEnableSpeed < ( spdmin + 6 ) ) THEN {
PreEnableSpeed = PreEnableSpeed SrcSpd = PreEnableSpeed
} ELSEIF AcousticMode THEN {
SrcSpd = PreEnableSpeed } ENDIF
IF ( PreEnableSpeed < spdmin ) THEN { PreEnableSpeed = spdmin } ENDIF
If ( SrcSpd < spdmin ) Then { SrcSpd = spdmin } Endif
} ENDIF
IF ( OwnAlt <= 0 ) AND ( not TIW ) AND ( OwnSpd <= ( MAXSPD + 1 ) ) THEN {
TIW = 1
InitTime = ( Time + 1 )
CorrInterogg = TIME
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 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 ) ) then {
	SETTACTIC "SBROS_T"
} else {
	IF ( TGTALT >= Floor ) AND ( TGTALT < ( Ceiling + 10 ) ) 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
IF LOSTTRACK 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
IF NOT Enabled THEN {
	NUK = 1
 	TReatak = -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 SearchDepth
	SETPRIORITY 252	SetSpd SrcSpd
	IF PreEnableCourse != OLDPreCourse THEN { TReatak = -1 } 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 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 Direct THEN {
			SETPRIORITY 252 SETCRS PreEnableCourse
		} ELSE {
			snakecrs = RelativeBearing PreenableCourse OwnCrs
			IF snakecrs > ABS RBV THEN {
				snakeleft = 1
				DU = RV
			} ELSEIF snakecrs < RBV THEN {
				snakeleft = 0
				DU = RV
			} ENDIF
			IF snakeleft THEN { SETPRIORITY 252 SETCRS ( OwnCrs + DU ) } ELSE { SETPRIORITY 252 SETCRS ( OwnCrs - DU ) } ENDIF
			DU -= 1
		} ENDIF
	} ENDIF
} endif
IF ( Time < InitTime ) OR ( NOT ENABLED ) THEN {
SETPRIORITY 252	SetSpd PreEnableSpeed
SETPRIORITY 252 SETCRS PreEnableCourse
SETPRIORITY 252	SetAlt -30
} 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 ) ) 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 -8 } endif
OLDPreCourse = PreEnableCourse
Homing = 0