; -RA- v.1.41 Torp Subroc Doctrine

var SearchDepth
var RunToEnable
var RunoutSpeed
var Enabled
var Homing
var SrcDepth
var Floor
var Ceiling
var AcousticMode
var spdmin
var InitTime
var InitX
var InitY
var Run
var TRange
VAR SrcSpd
var snakeleft
var CorrInterogg
var fuel
var FSR
var K
var FSRMIN
VAR DMAX
VAR DMIN
var TorpMaxDepth 
var Preset
Var Temp
var la
var nla
var mode
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 FDROPA
var FKORIDOR
VAR FSC
VAR FSUB
var PALT
var Klin
var FS
var DFS
var RV
var DK
VAR NUK
VAR KK

func SearchON {
IF AcousticMode THEN {
ENABLE
SensorEnable "268" 0
SensorEnable "539" 0
SensorEnable "540" 0
SensorEnable "548" 0
SensorEnable "549" 0
SensorEnable "557" 0
} ELSE {
PASSIVEENABLE
SensorEnable "268" 0
} ENDIF
}

IF INIT THEN {
IF not PRESET THEN {
PRESET = 1
DFS = 800
palt = ownalt
CorrInterogg = Time
TorpMaxDepth = ( MinAlt * 3.28 )
InitTime = ( Time + 2 )
Enabled = 0
Homing = 0
InitX = OwnX
InitY = OwnY
IF ( OwnName $= "APR-3ME Subroc Torpedo U" ) THEN { spdmin = 35 UM = 99 TRange = 5556 DMAX = 3333 FSUB = 1 DFS = 1000 DK = 0.25
} elseIF ( OwnName $= "UMGT-1 Subroc Torpedo U" ) THEN { spdmin = 25 UM = 99 TRange = 12964 DMAX = 9075 FSUB = 1 DK = 0.65
} elseIF ( OwnName $= "Yu-7 Subroc Torp U" ) THEN { spdmin = 20 UM = 99 TRange = 6500 DMAX = 4500 DFS = 700 DK = 0.25
} elseIF ( OwnName $= "MPT-1UE Subroc Torpedo U" ) THEN { spdmin = 30 UM = 99 TRange = 14816 DMAX = 10371 DFS = 875 DK = 0.5
} elseIF ( OwnName $= "Mk 50 Subroc Torp U" ) THEN { spdmin = 35 UM = 99 TRange = 12964 DMAX = 9075 FSUB = 1 DFS = 1112 DK = 0.5 } 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 ) )
SETPRIORITY 252	SetAlt -10
Tconf = 0
RunToEnable = 100
Ceiling = -1
RunoutSpeed = spdmin
SrcSpd = spdmin
FLOOR = TorpMaxDepth
if palt > 120 then {
MODE = "ActiveOverLayer"
AcousticMode = 1
Klin = 1
} elseif palt > 60 then {
MODE = "ActiveUnderLayer"
AcousticMode = 1
Klin = 0
} elseif palt > 0 then {
MODE = "PassiveOverLayer"
AcousticMode = 0
Klin = 1
} else {
MODE = "PassiveUnderLayer"
AcousticMode = 0
Klin = 0
} endif
IF floor <= TerrainAlt THEN { FLOOR = ( TerrainAlt + 30 ) } ENDIF
IF FLOOR > 0 THEN { FLOOR = TerrainAlt } ENDIF
Ceiling = -1
IF LAYER == 0 THEN { NLA = ( ( FLOOR - CEILING ) / 2 )
LA = ( RND NLA )
} ELSE { LA = LAYER } ENDIF
IF Klin 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 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 = -15 } ENDIF
temp = ( time + rnd 2 )
IF ( ( temp MOD 2 ) - ( temp MOD 1 ) ) THEN { snakeleft = 0 } ELSE { snakeleft = 1 } ENDIF

; DebugOut OwnName
; DebugOut "LAYER:"
; DebugValueOut layer
; DebugOut "Search_Depth:"
; DebugValueOut SrcDepth
; DebugOut "Regime:"
; DebugOut mode


} ENDIF
} ELSE {
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 FSUB THEN {
	IF tgtalt < -10 THEN { FSC = 0
;	DEBUGOUT "ASW_OrderAttack"
} ELSE {
	FSC = 1
; DEBUGOUT "Not ASW-Skip"
} ENDIF
} ELSE {
	FSC = 0
; DEBUGOUT "Dual_Order"
} ENDIF
IF FSC THEN {
	SETTACTIC "SBROS"
;	DEBUGOUT "Invalid Target"
} ELSE {
if tconf < tgtconf then {
;	DebugOut OwnName
;	DebugOut "Acquired"
;	DebugOut TargetName
	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
} endif
} ENDIF
} ENDIF
	Run += xyrng ( OwnX - InitX ) ( OwnY - InitY )
		InitX = OwnX
		InitY = OwnY
; Search Mode
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	SetAlt -15
} 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
if ownalt > -8 then { SETPRIORITY 255 setalt -8 } endif
Homing = 0