Current as of 99/05/27.
Original text and updates supplied by Mike Kolar of Sonalysts, Inc.

The doctrine files some of you have begun to investigate were intended
from the start to let you customize the AI's behavior (they could have
more easily been hardcoded instead of editable).  Time and scope
prohibited even thinking about the ability to provide an effective
interface to manipulate them from within the program.  Providing
multiple sets might have been nice, but we decided to concentrate on a
single implementation with the broadest appeal.  Besides, read just a
few messages in this newsgroup, and it's apparent that in some cases you
guys know best what you're going to like (and nobody else).  I hope
you'll be able to use this tool to customize behavior to your
satisfaction.

Note that neither Sonalysts nor EA/Jane’s will support editing of
doctrine files- Fleet Command was intended to run with the files as
shipped.  What you do with them after that is at your own risk.  Having
said that, the doctrine spec is attached as a text file.

First a little about how doctrines work:

Every platform has a default doctrine assigned by the object database.  
It can also be specified per platform in the scenario file by the DOCTRINE 
<filename> command.  FC will evaluate this doctrine at regular intervals.  
Whenever a platform detects a new contact, the platform doctrine is evaluated 
with NEW_TRACK equal to 1.  Platform doctrine can chose to assign a particular 
doctrine file to that contact using the TACTIC command.  Thereafter, the 
original platform doctrine continues to be evaluated as before, 
plus the assigned tactic doctrine is evaluated every time the contact is 
updated.  It's important to understand the distinction: the original 
platform doctrine is routinely evaluated without a reference solution, 
except when a new contact is detected.  When a new contact is detected, 
the platform doctrine is called only once referring to the new solution. 
This is the only opportunity to set a tactic doctrine for that contact. 

Note that doctrine priority is by default higher than user commands.  You 
can test against the user order currently being executed using the ORDER 
term.  In this way all user commands could be overridden and redefined in
doctrine.

Following are some syntax specifications.  Note that neither Sonalysts nor
EA/Jane's will support editing of doctrine files- Fleet Command was intended
to run with the files as shipped.  What you do with them after that is at 
your own risk.

Rules
Rules consist of expressions and commands in the following form:

RULE <rule name>
IF
        <expressions>
THEN
        <commands>
END


Expressions
Expressions consist of values and operators in the following form:

<value> <operator> <value>

Expressions can be joined by AND or OR, and support nested sub-expressions,
for example:

( BRG < 90 OR BRG >270 ) AND SPD > 400

Fleet Command is capable of following sub-expressions recursively to any
depth.

Possible terms for <operator> are "=3D", "!=3D" (not equal), "<", ">".

Possible terms for <value> are:
        real                    Any real number
        {real1,real2}           A real number of random value from
                                real1 to real2
        "string"                Any character string enclosed in quotes
        BRG                     Solution bearing
        RNG                     Solution range
        CRS                     Solution course
        SPD                     Solution speed
        ALT                     Solution alt/depth
        PERIDEPTH               Platform's periscope depth
        ID                      Solution classification (see below)
        CPA                     Solution projected closest point of approach
        CLASS                   Contact object class (see below)
        SILOS                   Solution speed in the line-of-sight
                                (approach speed)
        AOB                     Angle-on-bow of contact bearing
        LAYER                   Acoustic Layer Depth
        ATTACKRNG               Max attack range of best available weapon
        SOURCE                  Source of reporting sensor (see below)
        MISSILE_CLASS           Class of contact missile: AAM or ASM
        AGE                     Time since last new position
        CONF                    Solution confidence, 0-100
        TIME                    Simulation time
        INIT                    Boolean, TRUE first time doctrine is evaluated
        NEWTRACK                Boolean, TRUE first time solution is evaluated
        TIMERx                  1-8, timer remaining or -1
        VARx                    1-8, user variable
        WEAPON_AWAY             Boolean, TRUE whenever weapon is fired
        WEAPON_CLASS            Object class of weapon fired (see below)
        EXPR                    Indicates a mathematical expression will      
                                follow, e.g. {1,10} > 5, which evaluates
                                truth of a random draw from 1 to 10 being > 5.
        ORDER                   Current user order being executed
	DOCTRINENAME		Name of the current doctrine.
				(for use in an expression,
				 e.g. DOCTRINENAME != Evade)
	LOSTTRACK		True when a contact has been lost and is about to be removed,
				applies to platform doctrine only.
	ALLIANCE		Platform's side as specified in mission editor (0-7, 8=NEUTRAL).
	OWNALLIANCE		Player's side.

Commands
Commands consist of commands and values in the following form:

<command> [value1] [value2]

Supported terms for <command> are (so far):
	DONE			Clears this doctrine for the current platform or solution
        SETCRS                  Set own course to value1
        STEER_ABEAM             Set course to put contact abeam
        STEER_AWAY              Set course to put contact astern
        STEER_TO                Set course toward contact
        STEER_OBLIQUE           Set course toward contact with given AOB
        INTERCEPT               Set intercept course
        TERMINAL_HOME           Set collision course
        STEER_EVASIVE           Steer contact off rear quarter
        SETPITCH                (A/C or Sub only) Set pitch
        SETSPD                  Set own speed to value1
        MIN_SPD                 Set own speed to minimum speed
        LOITER_SPD              Set own speed to loiter speed
        TRANSIT_SPD             Set own speed to transit speed
        MAX_SPD                 Set own speed to max speed
        SETALT                  Set own alt/depth to value1
        IDENTIFY                Set solution classification to value1 (see below).
        SENSOR                  Turn sensor value1 on or off dependent on value2
        ATTACK                  Attack contact using weapon value1
        ATTACK_BEST             Attack contact using best weapon.
        FIRE_BEST               Fire best weapon immediately, no range considerations.
        TACTIC                  Apply doctrine value1 to contact.
        ENABLE                  Set weapon enable.
        COUNTERMEASURE          Launch specified countermeasure.
        DETONATE                Detonate now
        SHUTDOWN                Shutdown
        SET_TIMER               Set timer value1 (1-8) to value2 seconds.
        VAR_SET                 Set user variable value1 (1-8) to value2
        VAR_ADD                 Add value2 to user variable value1 =

        VAR_SUB                 Subtract value2 from user variable value1
        VAR_MUL                 Multiply user variable value1 by value2
        VAR_DIV                 Divide user variable value1 by value2
        CLEAR_TIMER             Clear timer value1 (1-8)
        LAUNCH                  Launch aircraft of type value1
        LAND                    Instruct an aircraft to return to base.
        TACTIC_CENTER           Recenter the platform's original scenario tactic at its
                                current location.
        PRIORITY                Set commands in the current scope to priority value1
                                (1-255).  Doctrine commands default to 250.  Other
                                defaults are: Scenario orders, 1; AI orders, 100; User
                                orders, 225.
        PERSIST                 Set commands in the current scope to persist for
                                value1 seconds.  Default persistence is 10 seconds.

	SETENTMODE		Change the variable and timer set.
	SETSOLNMODE		Doctrines are evaluated in reference to either platforms
				or solutions, and have a separate set of timers and variables
				for both.
				SETENTMODE declares that any following variable or timer references
				should refer to the platform set.
				SETSOLNMODE means they should refer to the contact's set.
				These only apply when evaluating a doctrine in reference to a contact.

	SNAKE			Orders platform to perform a snake maneuver.
				Course oscillates from left to right.
	CIRCLE			Orders platform to circle.
	LAYER_ALT		Orders platform to the opposite side of the thermal layer
				(subs and torps only, obviously).
               

String constants:

Object Class:
SUB,SURF,AIR,HELO,LAND,MINE,WEAP,MISSILE,PROJECTILE,DOWNED_PILOT,SR Shell,MR Shell

Classification:
UPD,UEV,UAF,UAE,HOSTILE,FRIEND
UPD = Unknown, pending
UEV = Unknown, evaluated
UAF = Unknown, assumed friend
UAE = Unknown, assumed enemy (you'll often get this after missile separation from an unknown)
HOSTILE = Positively ID'd as hostile
FRIEND = Positively ID'd as friendly

Sensor Class:
Active Sonar,Active Intercept,ESM,Visual,MAD,Infrared,Passive Sonar,Sonobuoy,Radar,FCRadar

User Orders:
NONE,VID,ENGAGE,RETURNTOBASE,COVER,SCRAM,MOVE,RESCUE,SEARCH