; -RA- DWX v1.41 Addon Mk 37 Mod 0 And Mod 1 User Torpedo Doctrine v 1.0

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 TRange
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 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 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 curs_r
Var TR1
var FS
var DFS
VAR DU
VAR TU 
var RV
var DK
VAR NUK
VAR KK
var DKR
var ReSwitch

func SearchOn {
; DebugOut OwnName
IF AcousticMode THEN {
; DebugOut "Active Sensor Enabled"
	ENABLE
If Not Reswitch Then {
	SensorEnable "268" 0
} Endif
	SensorEnable "810" 0
	SensorEnable "962" 0
} ELSE {
; DebugOut "Passive Sensor Enabled"
	PASSIVEENABLE
	SensorEnable "268" 0
} ENDIF
}
IF INIT THEN {
FIRST = 1
TU = -1
DU = 3
CorrInterogg = Time
PreEnableDepth = Ownalt
if ownalt > -15 then { PreEnableDepth = -20 } endif
InitTime = ( Time + 3 )
TorpMaxDepth = ( MinAlt * 3.28 )
Explode = RND 10
InitX = OwnX
InitY = OwnY
Tconf = 0
Treatak = -1
FDROPA = 1
IF ( OwnAlt <= TorpMaxDepth ) THEN {
	CrushDpth = 1
	ImpactTime = ( Time + 10 )
} ENDIF
} ELSE {
IF FIRST THEN {
	SFloor = Floor
	SCeiling = Ceiling
IF RunToEnable < 100 THEN { RunToEnable = 100 } ENDIF
	FIRST = 0
	DK = 0.5
	DK = ( 0.1 / ( DK * 3.1415926 ) )
	DKR = 0.3
	DKR = ( 0.1 / ( DKR * 3.1415926 ) )
IF OwnName $= "Mk 37 Torp Mod 0 U" THEN { spdmin = 17 UM = 200 FREATAK = 0 TRange = 21000 DMAX = 9100 DFS = 1350 DU = 0
} ELSEIF OwnName $= "Mk 37 Torp Mod 1 U" THEN { spdmin = 16 UM = 30 FREATAK = 0 TRange = 16500 DMAX = 7300 DFS = 1500 DU = 0 } ENDIF
	FUEL = 1000
	DMIN = ( Trange / 1852 )
	DMAX = ( DMAX / 1852 )
	FSRMIN = ( FUEL / ( DMIN / ( spdmin / 3600 ) ) )
	K = ( ( ( FUEL / ( DMAX / ( MAXSPD / 3600 ) ) ) - FSRMIN ) / ( MAXSPD - spdmin ) )
	AcousticMode = 0
	CircleSearchPattern = 0
	Reswitch = 0
	ASW_Mission = 2
	Floor = TorpMaxDepth
	SrcSpd = PreEnableSpeed
IF ( PreEnableSpeed > 15 ) AND not AcousticMode THEN { SrcSpd = PreEnableSpeed } ENDIF
IF PreEnableSpeed < spdmin THEN { PreEnableSpeed = spdmin } ENDIF
IF ( SrcSpd < spdmin ) Then { SrcSpd = spdmin } ENDIF
} ENDIF
; C_o_r_e
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 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 ASW_Mission == 2 then {
	IF TGTALT < Sfloor 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 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 {
	AcousticMode = 1
	SETTACTIC "TorpHomCMN"
} else {
; DebugOut OwnName
; DebugOut "Homing To:"
; DebugOut TargetName
	AcousticMode = 1
	SETTACTIC "TorpHom"
} ENDIF

} ENDIF
} ENDIF
} ENDIF

If Homing AND NOT Reswitch Then {
	If Trng <= 640 Then {
; DebugOut "700 Yards To Target, Re switching Sensor To Active. Passive Off"
		Reswitch = 1
		AcousticMode = 1
		SearchOn
		SensorEnable "810" 0
		SensorEnable "962" 0
	} Endif
} Endif

IF LOSTTRACK THEN {
; DebugOut OwnName
; DebugOut "LostTrack, Return To Passive Mode."
	AcousticMode = 0
	SensorEnable "268" 0
	SensorEnable "432" 0
	Reswitch = 0
	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 {
	NUK = 1
	TReatak = -1
IF ( RunToEnable != -1 ) AND ( Run >= RunToEnable ) THEN {
	SearchON
	Enabled = 1
	RunToEnable = -1
} ENDIF
	IF ( Time > InitTime ) AND ( OwnAlt <= 0 ) THEN {
		SETPRIORITY 252	SetCrs PreEnableCourse
		SETPRIORITY 252 SetSpd PreEnableSpeed
		SETPRIORITY 252	SetAlt PreEnableDepth
	} ENDIF
} ELSEIF ( Time > InitTime ) AND ( OwnAlt <= 0 ) AND ( not HOMING ) THEN {
	Tconf = 0
	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
	} ELSE {
		snakecrs = RelativeBearing PreenableCourse OwnCrs
	IF snakecrs > 30 THEN {
		snakeleft = 1
		DU = DU
	} ELSEIF snakecrs < -30 THEN {
		snakeleft = 0
		DU = DU
	} ENDIF
IF snakeleft THEN {
	SETPRIORITY 252 SETCRS ( OwnCrs - DU )
} ELSE {
	SETPRIORITY 252 SETCRS ( OwnCrs + DU )
} ENDIF
;	DU += 1
} ENDIF
	SETPRIORITY 252 SetSpd SrcSpd
	SETPRIORITY 252	SetAlt SearchDepth
} ENDIF
} endif
IF Time < InitTime THEN {
	SETPRIORITY 252	SetSpd PreEnableSpeed
	SETPRIORITY 252	SetAlt PreEnableDepth } ENDIF
IF ( CrushDpth == 1 ) AND ( Time >= ImpactTime ) THEN {
	IF Explode >= 5 THEN { Detonate } ELSE { Shutdown } 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 ) ) 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 = OwnSpd
		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 TU != -1 THEN {
	IF TU < TIME THEN { TU = -1 } ENDIF
} ENDIF
if ownalt > -8 then { SETPRIORITY 255 setalt -8 } endif
OLDPreCourse = PreEnableCourse
Homing = 0
CorrInterogg = Time
