home *** CD-ROM | disk | FTP | other *** search
- TITLE SubDef
-
- ; Timer 1 : Comms Intvl Surface Timer
- ; Timer 2 : Comms Intvl Submerge Timer
- ; Var 1 : Comms Intvl
- ; Var 2 : Running depth
- ; Var 3 : Speed limit storage
- ; Var 4 : Boolean that indicates sub hit last waypoint of user tactic
- ; Var 5 : integer value that indicates sub is prosecuting target automatically
- ; Var 6 : Boolean when 1 means we should stay at comms depth
- ; var 7 : integer value that indicates sub is avoiding a target automatically
- ; var 8 : indicates that user ordered us to come to comms depth
-
- ;this timer8 = -1 should always be true - we always want
- ;to execute this doctrine!
- RULE sub default tactic
- IF TIMER8 = -1 THEN
- ;DEBUG "executing sub default tactic!"
-
- RULE Set up comms intvl
- IF INIT = 1 THEN
- RULE Check Default Intvl Set
- IF VAR1 = -1 OR VAR1 = 0 THEN
- ; set default 2 hour comms intvl
- DEBUG "Doctrine: Using default comms intvl"
- VAR_SET 1 7200
- END
- DEBUG "Doctrine: Initializing all vars"
- VAR_SET 2 -150
- VAR_SET 3 0
- VAR_SET 4 0
- VAR_SET 5 0
- VAR_SET 6 0
- VAR_SET 7 0
- VAR_SET 8 0
- END
-
- RULE print out
- IF ORDER != NONE THEN
- DEBUG "We have an order!"
- DEBUG ORDER
- END
- ;we need to set to ent mode because var8 is an entity variable
- SETENTMODE
- RULE Set Tactic
- IF ( ( NEWTRACK = 1 AND ORDER = NONE ) OR ORDER = ENGAGE ) AND VAR8 = 0 AND LOSTTRACK != 1 THEN
- DEBUG "Got into order block!!!"
- SETENTMODE
- DEBUG "ORDER :"
- DEBUG ORDER
- ; if we have an order on a valid target, then lets submerge first
- ; we check the class because if its an air contact and the air contact is far away,
- ; we don't want to have to submerge...
- RULE Resubmerge and Reset
- IF VAR2 != O AND ( ORDER != NONE OR CLASS = SURF OR CLASS = SUB ) THEN
- SETENTMODE
- DEBUG "Doctrine: resubmerge for orders!"
- DEBUG VAR2
- RULE check var2
- IF VAR2 > -100 THEN
- VAR_SET 2 -150
- END
- DEBUG "ALT:"
- DEBUG ALT
- DEBUG "PERIDEPTH"
- DEBUG PERIDEPTH
- RULE resubmerge if needed
- IF ALT > -100 OR ALT = -100 THEN
- SETENTMODE
- PRIORITY 255
- PERSIST 0
- RULE set depth
- IF VAR2 != 0 THEN
- SETALT VAR2 ; restore stored depth
- ELSE
- SETALT -150
- END
- END
- VAR_SET 2 0 ; clear var2
- SET_TIMER 1 -1 ; clear timer
- SET_TIMER 2 -1
- SENSOR Radar 0
- VAR_SET 6 0
- END
- RULE reset timers if we have an order!
- IF ORDER != NONE THEN
- SETENTMODE
- SET_TIMER 1 -1 ; clear timer
- SET_TIMER 2 -1
- END
- ;if we have an air contact within 10 nmi we should go deep
- RULE Avoid Air
- IF ( CLASS = AIR OR CLASS = HELO ) AND ( RNG < 20000 ) THEN
- SETSOLNMODE
- RULE loading sub avoid doctrine for first time!
- IF DOCTRINENAME != "SubAvoidAir" THEN
- SETENTMODE
- VAR_ADD 5 1
- VAR_ADD 7 1
- END
- DEBUG "Doctrine: sub avoid air"
- TACTIC SubAvoidAir
- END
- RULE Avoid Torp
- IF CLASS = WEAP THEN
- SETSOLNMODE
- RULE loading sub avoid weapon doctrine for first time!
- IF DOCTRINENAME != "SubAvoidWeap" THEN
- SETENTMODE
- VAR_ADD 5 1
- VAR_ADD 7 1
- END
- DEBUG "Doctrine: sub avoid weapon"
- ;EXPR {0,10} > 5
- ;RULE fire back
- ;IF CLASS = WEAP THEN
- ; DEBUG "Firing Back!"
- ; FIRE_BEST
- ;END
- TACTIC SubAvoidWeap
- END
- RULE Prosecute Surf
- IF CLASS = SURF THEN
- SETSOLNMODE
- RULE loading surf attack doctrine for first time!
- IF DOCTRINENAME != "SubAtkSurf" THEN
- SETENTMODE
- VAR_ADD 5 1
- END
- DEBUG "Doctrine: sub attack surf"
- TACTIC SubAtkSurf
- END
- RULE Prosecute Sub
- IF CLASS = SUB THEN
- SETSOLNMODE
- RULE loading sub attack doctrine for first time!
- IF DOCTRINENAME != "SubAtkSub" THEN
- SETENTMODE
- VAR_ADD 5 1
- END
- DEBUG "Doctrine: sub attack sub"
- DEBUG VAR5
- DEBUG ALLIANCE
- TACTIC SubAtkSub
- END
-
- RULE unknown contact
- IF CLASS != SUB AND CLASS != SURF AND CLASS != WEAP AND CLASS != AIR AND CLASS != HELO THEN
- DEBUG "Doctrine: unknown contact!"
- END
- ELSE
- SETENTMODE
- RULE lost track
- IF LOSTTRACK = 1 THEN
- DEBUG "Doctrine: Lost Track!"
- SETENTMODE
- VAR_SUB 5 1
- ;check 5 and make sure its not below zero
- RULE check var5
- IF VAR5 < 0 THEN
- SETENTMODE
- VAR_SET 5 0
- END
- ;lets check the soln doctrine - if its avoidance then decrement avoidance var
- SETSOLNMODE
- RULE check avoid
- IF DOCTRINENAME = "SubAvoidWeap" OR DOCTRINENAME = "SubAvoidAir" THEN
- SETENTMODE
- VAR_SUB 7 1
- END
- RULE check var7
- IF VAR7 < 0 THEN
- SETENTMODE
- VAR_SET 7 0
- END
- ;finished auto command so lets set var2 = 0 so comms cycle can continue again
- RULE reset var2
- IF VAR5 = 0 THEN
- SETENTMODE
- VAR_SET 2 0
- END
- END
-
- ; done transiting so turn off var8
- RULE end transit order
- IF ORDER = MOVE AND VAR4 = 1 THEN
- SETENTMODE
- VAR_SET 8 0
- VAR_SET 2 0
- END
-
- ;if we are not engaging someone or coming to comms depth
- RULE start comms if no auto tactic
- IF VAR5 = 0 OR VAR8 = 1 THEN
- SETENTMODE
- RULE execute comms sequence
- ;lets make sure the user has not ordered our guy to do anything
- ;if order is move and VAR4 = 1 then the sub just finished transiting,
- ;so he should come to comms depth
- IF ( ORDER = NONE OR ( ORDER = MOVE AND VAR4 = 1 ) OR VAR8 = 1 ) AND VAR6 = 0 THEN
- ;sub has no orders so it can do comms sequence
-
- DEBUG "Doctrine: enter comms sequence"
- SETENTMODE
- ;sub just executed an order, so now we should set timer for next comms period
- ;var2 = 0 when we finished executing an order
- DEBUG "about to try to reset comms timer!"
- DEBUG "VAR2 :"
- DEBUG VAR2
- RULE reset comms timer
- IF TIMER1 = -1 AND TIMER2 = -1 AND ALT < -100 AND VAR2 = O AND VAR8 = 0 THEN
- SETENTMODE
- DEBUG "Doctrine: reset comms timer"
- SET_TIMER 1 VAR1 ; set timer for next comms interval
- DEBUG "Doctrine: Here is var1"
- DEBUG VAR1
- DEBUG "Doctrine: setting var2"
- VAR_SET 2 ALT ; store current alt
- END
-
- RULE comms interval timer has just fired
- IF TIMER1 = 0 THEN
- SETENTMODE
- DEBUG "Doctrine: Coming to comms depth"
- DEBUG "Doctrine: setting var2"
- DEBUG TIMER2
- VAR_SET 2 ALT ; store current alt
- DEBUG VAR2
- RULE check speed
- IF SPD < 1 THEN
- SETENTMODE
- PERSIST 0
- PRIORITY 255
- SETSPD 3
- END
- PRIORITY 255
- PERSIST 0 ; prevent this rule from timing out
- SETALT PERIDEPTH ; come to periscope depth
- END
-
- RULE Rising to comms depth
- IF TIMER1 = -1 AND TIMER2 = -1 AND VAR1 > 0 THEN
- ; we must be on our way to comms depth
- RULE reached comms depth?
- IF ALT > PERIDEPTH OR ALT = PERIDEPTH THEN
- DEBUG "Doctrine: Reached Comms Depth"
- SETENTMODE
- SET_TIMER 2 {300,600} ; stay at comms depth 5-10 mins
- END
- END
-
- RULE resubmerge timer has just fired
- IF TIMER2 = 0 THEN
- SETENTMODE
- DEBUG "Doctrine: Resubmerging!"
- DEBUG VAR2
- PERSIST 0
- PRIORITY 255
- RULE check var2
- IF VAR2 != 0 THEN
- SETALT VAR2 ; restore stored depth
- ELSE
- SETALT -150
- VAR_SET 2 -150
- END
- RULE set timer for resubmerge
- IF VAR2 < -100 THEN
- SETENTMODE
- SET_TIMER 1 VAR1 ; set timer for next comms interval
- END
- SENSOR Radar 0
- VAR_SET 8 0
- END
-
- RULE Limit speed at PD
- IF ALT > -70 AND SPD > 5 THEN
- SETENTMODE
- DEBUG "Doctrine: Limit Speed at PD!"
- RULE Store old speed
- IF VAR3 = 0 THEN
- SETENTMODE
- DEBUG "Storing speed in Var3"
- DEBUG SPD
- VAR_SET 3 SPD
- END
- PRIORITY 255
- SETSPD 5
- END
-
- RULE Restore speed after submerge
- IF ALT < -70 AND VAR3 != 0 THEN
- SETENTMODE
- DEBUG "Doctrine: Restore speed after submerge"
- PRIORITY 255
- SETSPD VAR3
- DEBUG VAR3
- VAR_SET 3 0
- END
-
- DEBUG "Doctrine: Leave comms sequence"
-
- ELSE
- SETENTMODE
- ; we have an order, so lets submerge first
- RULE Resubmerge for order
- IF VAR2 != O AND ORDER != NONE THEN
- SETENTMODE
- DEBUG "Doctrine: resubmerge for orders 2!"
- DEBUG "VAR2"
- DEBUG VAR2
- PERSIST 0
- RULE set resubmerge depth
- IF ORDER = SCRAM THEN
- SETENTMODE
- PERSIST 0
- PRIORITY 255
- MIN_ALT
- ELSE
- SETENTMODE
- PERSIST 0
- PRIORITY 255
- RULE set depth check var2
- IF VAR2 != 0 THEN
- SETALT VAR2 ; restore stored depth
- ELSE
- SETALT -150
- END
- END
- VAR_SET 2 0 ; clear var2
- SET_TIMER 1 -1
- SET_TIMER 2 -1
- SENSOR Radar 0
- VAR_SET 6 0
- VAR_SET 8 0
- ELSE
- SETENTMODE
- ;this means VAR6 = 1 so we want to stay at comms depth
- RULE stay at comms depth
- DEBUG "Doctrine: stay at comms depth rule"
- IF ORDER = NONE THEN
- SETENTMODE
- PRIORITY 255
- PERSIST 0 ; prevent this rule from timing out
- SETALT PERIDEPTH ; come to periscope depth
- END
- END ;if we have an order resubmerge
- END ;if should do comms depth sequence
- ELSE
- DEBUG "Doctrine: VAR5 IS NON-ZERO!"
- END ;if VAR5 =0
- END
-
- END ;sub default rule
-
-