src/airport_states.h
author richk
Tue, 27 Mar 2007 21:11:34 +0000
branchNewGRF_ports
changeset 6715 ce1614834bc3
child 6716 bbe3f6d2dcaf
permissions -rw-r--r--
(svn r9507) [NewGRF_ports] -Codechange: Moved airport state definitions into their own separate file to permit better logical grouping of state machine related data & code.
/* $Id$ */

/** @file airport_states.h Defines values used in airport state machines */

/***************************
 * This include defines the Movement States, Movement Speeds,
 * and Blocks for the airport Finite State Machines.
 ***************************/

/* Airport movements & speeds */
enum {
	AMED_NOSPDCLAMP = 1 << 0,
	AMED_TAKEOFF    = 1 << 1,
	AMED_SLOWTURN   = 1 << 2,
	AMED_LAND       = 1 << 3,
	AMED_EXACTPOS   = 1 << 4,
	AMED_BRAKE      = 1 << 5,
	AMED_HELI_RAISE = 1 << 6,
	AMED_HELI_LOWER = 1 << 7,
	AMED_HOLD       = 1 << 8,
};

/* Movement States on Airports (headings target) */
enum {
	TO_ALL         =  0,
	HANGAR         =  1,
	TERM1          =  2,
	TERM2          =  3,
	TERM3          =  4,
	TERM4          =  5,
	TERM5          =  6,
	TERM6          =  7,
	HELIPAD1       =  8,
	HELIPAD2       =  9,
	TAKEOFF        = 10,
	STARTTAKEOFF   = 11,
	ENDTAKEOFF     = 12,
	HELITAKEOFF    = 13,
	FLYING         = 14,
	LANDING        = 15,
	ENDLANDING     = 16,
	HELILANDING    = 17,
	HELIENDLANDING = 18,
	TERM7          = 19,
	TERM8          = 20,
	HELIPAD3       = 21,
	HELIPAD4       = 22,
	TERM9          = 23,
	TERM10         = 24,
	TERM11         = 25,
	TERM12         = 26,
	SHORTTAKEOFF   = 27,  /* Only used in movement command choices. If used as the heading in the first command element, treated as TAKEOFF.
						   * This is best placed on the TAKEOFF line at the start of the runway. The aircraft will make the acceleration noise,
						   * and then you give the instruction of where to go to for the SHORTTAKEOFF instruction sequence. eg.:
						   * { 40, TAKEOFF, RUNWAY_OUT_block, 0 }, { 40, SHORTTAKEOFF, RUNWAY_OUT_block2, 42 }, { 40, 0, RUNWAY_OUT_block2, 41 },
						   */
};

/* Movement Blocks on Airports */
// blocks (eg_airport_flags)
static const uint64
	TERM1_block              = 1 <<  0,
	TERM2_block              = 1 <<  1,
	TERM3_block              = 1 <<  2,
	TERM4_block              = 1 <<  3,
	TERM5_block              = 1 <<  4,
	TERM6_block              = 1 <<  5,
	HELIPAD1_block           = 1 <<  6,
	HELIPAD2_block           = 1 <<  7,
	RUNWAY_IN_OUT_block      = 1 <<  8,
	RUNWAY_IN_block          = 1 <<  8,
	AIRPORT_BUSY_block       = 1 <<  8,
	RUNWAY_OUT_block         = 1 <<  9,
	TAXIWAY_BUSY_block       = 1 << 10,
	OUT_WAY_block            = 1 << 11,
	IN_WAY_block             = 1 << 12,
	AIRPORT_ENTRANCE_block   = 1 << 13,
	TERM_GROUP1_block        = 1 << 14,
	TERM_GROUP2_block        = 1 << 15,
	HANGAR2_AREA_block       = 1 << 16,
	TERM_GROUP2_ENTER1_block = 1 << 17,
	TERM_GROUP2_ENTER2_block = 1 << 18,
	TERM_GROUP2_EXIT1_block  = 1 << 19,
	TERM_GROUP2_EXIT2_block  = 1 << 20,
	PRE_HELIPAD_block        = 1 << 21,

// blocks for new airports
	TERM7_block              = 1 << 22,
	TERM8_block              = 1 << 23,
	HELIPAD3_block           = 1 << 24,
	HELIPAD4_block           = 1 << 25,
	HANGAR1_AREA_block       = 1 << 26,
	OUT_WAY2_block           = 1 << 27,
	IN_WAY2_block            = 1 << 28,
	RUNWAY_IN2_block         = 1 << 29,
	OUT_WAY_block2           = 1ULL << 31,

// re-used names
	RUNWAY_OUT2_block        = 1 << 10,   // re-uses TAXIWAY_BUSY
	HELIPAD_GROUP_block      = 1 << 13,   // re-uses AIRPORT_ENTRANCE
	HELIPAD_ENTER_block      = 1 << 17,   // re-uses TERM_GROUP2_ENTER1_block
	TW1_block                = 1 << 17,   // re-uses TERM_GROUP2_ENTER1_block
	TW2_block                = 1 << 18,   // re-uses TERM_GROUP2_ENTER2_block
	TW3_block                = 1 << 19,   // re-uses TERM_GROUP2_EXIT1_block
	TW4_block                = 1 << 20,   // re-uses TERM_GROUP2_EXIT2_block
	RWX_block1               = 1 << 11,   // re-uses OUT_WAY_block
	RWX_block2               = 1 << 12,   // re-uses IN_WAY_block
	RWX_block3               = 1 << 27,   // re-uses OUT_WAY2_block
	RWX_block4               = 1 << 28,   // re-uses IN_WAY2_block

// high byte blocks
	TERM9_block              = 1ULL << 32,
	TERM10_block             = 1ULL << 33,
	TERM11_block             = 1ULL << 34,
	TERM12_block             = 1ULL << 35,
	TERM_GROUP3_block        = 1ULL << 36,
	TERM_GROUP4_block        = 1ULL << 37,
	RUNWAY_OUT_block2        = 1ULL << 38,
	RUNWAY_OUT2_block2       = 1ULL << 39,
	TW5_block                = 1ULL << 40,
	TW6_block                = 1ULL << 41,
	TW7_block                = 1ULL << 42,
	TW8_block                = 1ULL << 43,
	TW9_block                = 1ULL << 44,
	TW10_block               = 1ULL << 45,
	TW11_block               = 1ULL << 46,
	TW12_block               = 1ULL << 47,
	TW13_block               = 1ULL << 48,
	RW1_APPROACH             = 1ULL << 49,
	RW2_APPROACH             = 1ULL << 50,

// Special blocks
	HOLD                     = 1ULL << 63,
	NOTHING_block            = 1 << 30;

static const uint64 NOHOLD = ~HOLD;

/* Cross reference between terminal states and their corresponding reservation blocks.
 * Originally OTTD assumed the first 6 states were TERMs 1-6, and HELIs1-2 were 7 & 8.
 * After the introduction of the Intercontinental airport, this assumption no longer held.
 * This table allows the blocks and states to change independently, so a new TERM state
 * can be anywhere in the state list, and its corresponding block can be anywhere in the
 * block list.
 * (based on _airport_terminal_state[] removed from aircraft_cmd.cpp, with numbers un-magicked)
 */

typedef struct AirportTerminal {
	byte state;   // the terminal state/target heading
	uint64 block; // the block that reserves that terminal
} AirportTerminal;

// currently set for 12 terms, 4 helipads
static const AirportTerminal _airport_terminals[MAX_TERMINALS + MAX_HELIPADS] = {
	{ TERM1,     TERM1_block    },
	{ TERM2,     TERM2_block    },
	{ TERM3,     TERM3_block    },
	{ TERM4,     TERM4_block    },
	{ TERM5,     TERM5_block    },
	{ TERM6,     TERM6_block    },
	{ TERM7,     TERM7_block    },
	{ TERM8,     TERM8_block    },
	{ TERM9,     TERM9_block    },
	{ TERM10,    TERM10_block   },
	{ TERM11,    TERM11_block   },
	{ TERM12,    TERM12_block   },
	{ HELIPAD1,  HELIPAD1_block },
	{ HELIPAD2,  HELIPAD2_block },
	{ HELIPAD3,  HELIPAD3_block },
	{ HELIPAD4,  HELIPAD4_block },
};