; -RA- DWX 1.41 mk 48 ADCAP User Doctrine

var PreEnableCourse
var PreEnableSpeed
var PreEnableDepth
var RunToEnable
var Enabled
var CircleSearchPattern
var snakeright
var SearchDepth
var SensorTime
var Floor
var Ceiling
var AcousticMode
var spdmin
var InitTime
var InitX
var InitY
var Run
var Enabled1
var TorpMaxDepth
var CorrInterogg
var fuel
var FSR
var K
var FSRMIN
var DMAX
var DMIN
var ImpactTime
var CrushDpth
var Explode
var Homing
var WORK
var Valid
var FIRST
var SrcSpd
var fenab
var OPRDEPTH
var LA
var FD
var TFD
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 MODE
VAR NumbNG
var UM
VAR Tconf
var TReatak
var FDROPA
VAR FREATAK
VAR UREATAK
var OLDPreCourse
VAR ataksensor
var FKORIDOR
var a1
var a2
var a3
var a4
var a5
VAR SENOFF
var ASW_Mission
VAR FSC
var SFloor
var SCeiling
var curs_r
Var TR1
var FS
var DFS
var RV
var DK
VAR NUK
VAR KK
var DKR
var attf
VAR GP
var mission
func akflag {
a1 = 1
a2 = 1
a3 = 1
a4 = 1
a5 = 1
}
Func Act000 {
IF A1 THEN {
a1 = 0
a2 = 1
a3 = 1
a4 = 1
a5 = 1
SensorEnable "7920" 1
SensorEnable "7930" 0
SensorEnable "7940" 0
SensorEnable "7950" 0
SensorEnable "7960" 0
SensorEnable "7970" 0
} ENDIF
}
Func Act340 {
IF A2 THEN {
a1 = 1
a2 = 0
a3 = 1
a4 = 1
a5 = 1
SensorEnable "7920" 0
SensorEnable "7930" 0
SensorEnable "7940" 1
SensorEnable "7950" 0
SensorEnable "7960" 0
SensorEnable "7970" 0
} ENDIF
}
Func Act320 {
IF A3 THEN {
a1 = 1
a2 = 1
a3 = 0
a4 = 1
a5 = 1
SensorEnable "7920" 0
SensorEnable "7930" 0
SensorEnable "7940" 0
SensorEnable "7950" 1
SensorEnable "7960" 0
SensorEnable "7970" 0
} ENDIF
}
Func Act020 {
IF A4 THEN {
a1 = 1
a2 = 1
a3 = 1
a4 = 0
a5 = 1
SensorEnable "7920" 0
SensorEnable "7930" 0
SensorEnable "7940" 0
SensorEnable "7950" 0
SensorEnable "7960" 1
SensorEnable "7970" 0
} ENDIF
}
Func Act040 {
IF A5 THEN {
a1 = 1
a2 = 1
a3 = 1
a4 = 1
a5 = 0
SensorEnable "7920" 0
SensorEnable "7930" 0
SensorEnable "7940" 0
SensorEnable "7950" 0
SensorEnable "7960" 0
SensorEnable "7970" 1
} ENDIF
}
Func Pass000 {
IF A1 THEN {
a1 = 0
a2 = 1
a3 = 1
a4 = 1
a5 = 1
SensorEnable "8000" 1
SensorEnable "8010" 0
SensorEnable "8020" 0
SensorEnable "8030" 0
SensorEnable "8040" 0
SensorEnable "8050" 0
} ENDIF
}
Func Pass340 {
IF A2 THEN {
a1 = 1
a2 = 0
a3 = 1
a4 = 1
a5 = 1
SensorEnable "8000" 0
SensorEnable "8010" 0
SensorEnable "8020" 1
SensorEnable "8030" 0
SensorEnable "8040" 0
SensorEnable "8050" 0
} ENDIF
}
Func Pass320 {
IF A3 THEN {
a1 = 1
a2 = 1
a3 = 0
a4 = 1
a5 = 1
SensorEnable "8000" 0
SensorEnable "8010" 0
SensorEnable "8020" 0
SensorEnable "8030" 1
SensorEnable "8040" 0
SensorEnable "8050" 0
} ENDIF
}
Func Pass020 {
IF A4 THEN {
a1 = 1
a2 = 1
a3 = 1
a4 = 0
a5 = 1
SensorEnable "8000" 0
SensorEnable "8010" 0
SensorEnable "8020" 0
SensorEnable "8030" 0
SensorEnable "8040" 1
SensorEnable "8050" 0
} ENDIF
}
Func Pass040 {
IF A5 THEN {
a1 = 1
a2 = 1
a3 = 1
a4 = 1
a5 = 0
SensorEnable "8000" 0
SensorEnable "8010" 0
SensorEnable "8020" 0
SensorEnable "8030" 0
SensorEnable "8040" 0
SensorEnable "8050" 1
} ENDIF
}
IF INIT THEN {
FIRST = 1
DFS = 1500
fenab = 1
FD = 1
TFD = -1
Homing = 0
WORK = 0
Valid = 0
InitTime = ( Time + 3 )
SensorTime = 0
Enabled = 0
Enabled1 = 0
Explode = RND 10
ImpactTime = 0
CrushDpth = 0
InitX = OwnX
InitY = OwnY
CorrInterogg = Time
spdmin = 40
TorpMaxDepth = -2500
PreEnableDepth = Ownalt
if ownalt > -15 then { PreEnableDepth = -23 } endif
SetSnorkel on
UM = 75
FREATAK = 1
Tconf = 0
Treatak = -1
FDROPA = 1
ataksensor = 0
SENOFF = 1
akflag
} ELSE {
IF FIRST THEN {
FIRST = 0
FUEL = 1000
DMIN = 27
DMAX = 21
FSRMIN = ( FUEL / ( DMIN / ( spdmin / 3600 ) ) )
K = ( ( ( FUEL / ( DMAX / ( MAXSPD / 3600 ) ) ) - FSRMIN ) / ( MAXSPD - spdmin ) )
DELTA1 = floor
DELTA1 = ( DELTA1 - ( DELTA1 mod 1 ) )
MODE = ( DELTA1 / 10000 )
MODE = ( MODE - ( MODE mod 1 ) )
DELTA1 = ( DELTA1 - ( MODE * 10000 ) )
floor -= ( MODE * 10000 )
IF Floor < TorpMaxDepth THEN { Floor = TorpMaxDepth + 10 } ENDIF
IF ( MODE == -2 ) AND ( CircleSearchPattern ) THEN { snakeright = 1 MODE = -2
} ELSEIF ( MODE == -1 ) AND ( CircleSearchPattern ) THEN { snakeright = 0 MODE = -2
} ELSEIF ( MODE == 0 ) AND ( CircleSearchPattern ) THEN { snakeright = 1 MODE = -2
} ENDIF
if Ceiling == -9 then { ASW_Mission = 2
} elseif Ceiling < -10 then {
ASW_Mission = 1
; ASW 1 - ONLY SUB
; ASW 2 - SUB+SURF
; ASW 0 - SURF
} endif
SFloor = Floor
SCeiling = Ceiling
Floor = TorpMaxDepth
Ceiling = -7
IF RunToEnable < 200 THEN { RunToEnable = 200 } ENDIF
SrcSpd = PreEnableSpeed
IF ( PreEnableSpeed > ( spdmin + 5 ) ) AND not AcousticMode THEN { SrcSpd = ( spdmin + 5 ) } ENDIF
IF PreEnableSpeed < spdmin THEN { PreEnableSpeed = spdmin } ENDIF
If ( SrcSpd < spdmin ) Then { SrcSpd = spdmin } Endif
DK = 0.5
DK = ( 0.1 / ( DK * 3.1415926 ) )
DKR = 0.3
DKR = ( 0.1 / ( DKR * 3.1415926 ) )
} 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 ( OwnSpd <= PreEnableSpeed ) AND ( mission != 1 ) THEN {
		SetPriority 255
		SetSnorkel OFF
		mission = 1
	} 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 WORK THEN {
	Valid = 1
} ELSE {
IF AcousticMode THEN {
	IF ABS TgtAOB > 20 THEN {
			Valid = 0
			SETTACTIC "SBROS_T"
		} ELSEIF OwnAlt < 0 THEN {
			Valid = 1
		} ENDIF
	} ELSE {
		IF ABS TgtAOB > 30 THEN {
				Valid = 0
				SETTACTIC "SBROS_T"
			} ELSEIF OwnAlt < 0 THEN {
				Valid = 1
		} ENDIF
	} ENDIF
} ENDIF
IF Valid THEN {
	if tconf < tgtconf then {
			ataksensor = 1
			SensorTime = 0
			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 {
	akflag
	IF FREATAK THEN {
	IF FDROPA and ( TRng < ( 1000 + rnd 500 ) ) THEN {
		TReatak = Time
		NUK = 1
		TR1 = ( Time + 30 )
		GP = OWNALT
		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 OwnAlt < ( TorpMaxDepth ) THEN {
	CrushDpth = 1
	ImpactTime += CorrInterogg
} ELSE { CrushDpth = 0 ImpactTime = 0 } ENDIF
IF ( CrushDpth == 1 ) AND ( ImpactTime >= 15 ) THEN {
	IF Explode >= 5 THEN { Detonate } ELSE { Shutdown } ENDIF
} ENDIF	
IF Enabled AND NOT ( Homing OR NEWTRACK OR LOSTTRACK ) THEN {
	Tconf = 0
	SensorTime += CorrInterogg
	attf = 1
IF AcousticMode THEN {
if ( mode == -2 ) or ( TReatak != -1 ) then { Act000 
} elseif mode == 0 then {
		if SensorTime > 20 then { Act320
					} elseif SensorTime > 16 then { Act340
						} elseif SensorTime > 12 then { Act000
							} elseif SensorTime > 8 then { Act040
								} elseif SensorTime > 4 then { Act020
												} else { Act000 } endif
} elseif mode == -1 then {
				if SensorTime > 20 then { Act040
					} elseif SensorTime > 16 then { Act020
						} elseif SensorTime > 12 then { Act000
							} elseif SensorTime > 8 then { Act320
								} elseif SensorTime > 4 then { Act340
												} else { Act000 } endif
} endif
	} ELSE {
if ( mode == -2 ) or ( TReatak != -1 ) then { Pass000
} elseif mode == 0 then {
				if SensorTime > 20 then { Pass320
					} elseif SensorTime > 16 then { Pass340
						} elseif SensorTime > 12 then { Pass000
							} elseif SensorTime > 8 then { Pass040
								} elseif SensorTime > 4 then { Pass020
												} else { Pass000 } endif
} elseif mode == -1 then {
				if SensorTime > 20 then { Pass040
					} elseif SensorTime > 16 then { Pass020
						} elseif SensorTime > 12 then { Pass000
							} elseif SensorTime > 8 then { Pass320
								} elseif SensorTime > 4 then { Pass340
												} else { Pass000 } endif
} endif
} endif
if SensorTime > 23 then { SensorTime = 0 } endif
WORK = 1
} 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 {
		WORK = 0
	IF AcousticMode THEN {
		ENABLE
		SensorEnable "268" 0
		SensorEnable "8000" 0
		SensorEnable "8010" 0
		SensorEnable "8020" 0
		SensorEnable "8030" 0
		SensorEnable "8040" 0
		SensorEnable "8050" 0
	} ELSE {
		PASSIVEENABLE
		SensorEnable "268" 0
		SensorEnable "8010" 0
		SensorEnable "8020" 0
		SensorEnable "8030" 0
		SensorEnable "8040" 0
		SensorEnable "8050" 0
	} ENDIF
		SensorTime = 0
		Enabled = 1
		RunToEnable = -1
		SENOFF = 1
	} ELSE { 
		IF SENOFF THEN {
			SENOFF = 0 
			PREENABLE
		} ENDIF
IF ( Time > InitTime ) AND ( OwnAlt <= 0 ) THEN {
	SETPRIORITY 252	SetCrs PreEnableCourse
	SETPRIORITY 252 SetSpd PreEnableSpeed
	SETPRIORITY 252	SetAlt PreEnableDepth
	} ENDIF
} ENDIF
} else {
IF SearchDepth < ( TerrainAlt + 50 ) THEN { SearchDepth = ( TerrainAlt + 100 ) } ENDIF
IF SearchDepth > 0 THEN { SearchDepth = Ceiling } ENDIF
if fenab then { fenab = 0 Enabled1 += 1 TFD = ( TIME + 4 ) } endif
IF not Homing THEN {
	Tconf = 0
	IF ( Time > InitTime ) AND ( OwnAlt <= 0 ) THEN {
	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
			SETPRIORITY 252	SetAlt GP
		} endif
	} else {
		SETPRIORITY 252	SetAlt OPRDEPTH
		IF CircleSearchPattern THEN {
			IF NUK THEN { NUK = 0 KK = OWNCRS } ENDIF
			RV = ( DK * OWNSPD )
			IF snakeright THEN { KK = ( KK + RV ) MOD 360 } ELSE { KK = ( KK - RV ) MOD 360 } ENDIF
			SETPRIORITY 252 SETCRS KK
		} ELSE {
			SETPRIORITY 252 SetCrs PreEnableCourse } 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 {
			if SearchDepth > LA THEN { CalcSpd = SearchDepth } ELSE {
				CalcSpd = ( LA - CEILING )
				CalcSpd = ( CalcSpd * 0.5 )
				CalcSpd = ( LA - CalcSpd )
				} ENDIF
			} ELSE {
			if SearchDepth < LA THEN { CalcSpd = SearchDepth } ELSE {
				CalcSpd = ( COLT - LA )
				CalcSpd = ( CalcSpd * 0.5 )
				CalcSpd = ( LA + CalcSpd )
				} ENDIF
			} ENDIF
		} ENDIF
			OPRDEPTH = CalcSpd
		} ENDIF
	} ENDIF
} Elseif ( not NewTrack ) and ataksensor and attf then {
	ataksensor = 0
	attf = 0
	IF AcousticMode THEN {
	SensorEnable "7930" 1
	SensorEnable "7920" 0
	SensorEnable "7940" 0
	SensorEnable "7950" 0
	SensorEnable "7970" 0
	SensorEnable "7960" 0
} ELSE {
	SensorEnable "8010" 1
	SensorEnable "8000" 0
	SensorEnable "8020" 0
	SensorEnable "8030" 0
	SensorEnable "8040" 0
	SensorEnable "8050" 0
	} 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 ) ) 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 += 3
		IF CalcSpd > mspd THEN { CalcSpd = mspd } ENDIF
	} ELSE {
		IF OWNSPD > spdmin THEN {
		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 CorrInterogg > 0.8 THEN { Homing = 0 } ENDIF
CorrInterogg = Time
OLDPreCourse = PreEnableCourse
if ownalt > -8 then { SETPRIORITY 255 setalt -8 } endif
