(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. NewGRF_ports
authorrichk
Tue, 27 Mar 2007 21:11:34 +0000
branchNewGRF_ports
changeset 6715 ce1614834bc3
parent 6714 42fa878a14fb
child 6716 bbe3f6d2dcaf
(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.
projects/openttd.vcproj
projects/openttd_vs80.vcproj
source.list
src/aircraft_cmd.cpp
src/airport.h
src/airport_movement.h
src/airport_states.h
src/disaster_cmd.cpp
src/newgrf_engine.cpp
--- a/projects/openttd.vcproj	Tue Mar 27 20:12:11 2007 +0000
+++ b/projects/openttd.vcproj	Tue Mar 27 21:11:34 2007 +0000
@@ -387,6 +387,9 @@
 				RelativePath=".\..\src\airport_movement.h">
 			</File>
 			<File
+				RelativePath=".\..\src\airport_states.h">
+			</File>
+			<File
 				RelativePath=".\..\src\aystar.h">
 			</File>
 			<File
--- a/projects/openttd_vs80.vcproj	Tue Mar 27 20:12:11 2007 +0000
+++ b/projects/openttd_vs80.vcproj	Tue Mar 27 21:11:34 2007 +0000
@@ -744,6 +744,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\airport_states.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\aystar.h"
 				>
 			</File>
--- a/source.list	Tue Mar 27 20:12:11 2007 +0000
+++ b/source.list	Tue Mar 27 21:11:34 2007 +0000
@@ -96,6 +96,7 @@
 aircraft.h
 airport.h
 airport_movement.h
+airport_states.h
 aystar.h
 bmp.h
 cargotype.h
--- a/src/aircraft_cmd.cpp	Tue Mar 27 20:12:11 2007 +0000
+++ b/src/aircraft_cmd.cpp	Tue Mar 27 21:11:34 2007 +0000
@@ -31,11 +31,7 @@
 #include "date.h"
 #include "spritecache.h"
 #include "cargotype.h"
-
-/** this maps the terminal to its corresponding state and block flag
- *  currently set for 10 terms, 4 helipads */
-static const byte _airport_terminal_state[] = {2, 3, 4, 5, 6, 7, 19, 20, 0, 0, 8, 9, 21, 22};
-static const byte _airport_terminal_flag[] =  {0, 1, 2, 3, 4, 5, 22, 23, 0, 0, 6, 7, 24, 25};
+#include "airport_states.h"
 
 static bool AirportMove(Vehicle *v, const AirportFTAClass *apc);
 static bool AirportSetBlocks(Vehicle *v, const AirportFTA *current_pos, const AirportFTAClass *apc);
@@ -1954,10 +1950,9 @@
 {
 	Station *st = GetStation(v->u.air.targetairport);
 	for (; i < last_terminal; i++) {
-		if (!HASBIT(st->airport_flags, _airport_terminal_flag[i])) {
-			/* TERMINAL# HELIPAD# */
-			v->u.air.state = _airport_terminal_state[i]; // start moving to that terminal/helipad
-			SETBIT(st->airport_flags, _airport_terminal_flag[i]); // occupy terminal/helipad
+		if (!(st->airport_flags & _airport_terminals[i].block)) {  // if terminal's block is clear
+			v->u.air.state = _airport_terminals[i].state;          // set heading target (state) to that terminal/helipad
+			st->airport_flags |= _airport_terminals[i].block;      // occupy terminal/helipad on airport
 			return true;
 		}
 	}
--- a/src/airport.h	Tue Mar 27 20:12:11 2007 +0000
+++ b/src/airport.h	Tue Mar 27 21:11:34 2007 +0000
@@ -7,10 +7,10 @@
 
 #include "direction.h"
 
-enum {MAX_TERMINALS =  10};
+enum {MAX_TERMINALS =  12};
 enum {MAX_HELIPADS  =   4};
 enum {MAX_ELEMENTS  = 255};
-enum {MAX_HEADINGS  =  22};
+enum {MAX_HEADINGS  =  30};
 
 // Airport types
 enum {
@@ -23,95 +23,14 @@
 	AT_HELIDEPOT     =  6,
 	AT_INTERCON      =  7,
 	AT_HELISTATION   =  8,
+	AT_LGA           =  9,
+	AT_MUC           = 10,
+	AT_SFO           = 11,
+	AT_AMS           = 12,
 	AT_OILRIG        = 15
 };
 
 
-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
-};
-
-/* 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,
-	TERM9_block              = 1 << 24,
-	HELIPAD3_block           = 1 << 24,
-	TERM10_block             = 1 << 25,
-	HELIPAD4_block           = 1 << 25,
-	HANGAR1_AREA_block       = 1 << 26,
-	OUT_WAY2_block           = 1 << 27,
-	IN_WAY2_block            = 1 << 28,
-	RUNWAY_IN2_block         = 1 << 29,
-	RUNWAY_OUT2_block        = 1 << 10,   // note re-uses TAXIWAY_BUSY
-	HELIPAD_GROUP_block      = 1 << 13,   // note re-uses AIRPORT_ENTRANCE
-	OUT_WAY_block2           = 1 << 31,
-// end of new blocks
-
-	NOTHING_block            = 1 << 30;
-
 struct AirportMovingData {
 	int16 x;
 	int16 y;
--- a/src/airport_movement.h	Tue Mar 27 20:12:11 2007 +0000
+++ b/src/airport_movement.h	Tue Mar 27 21:11:34 2007 +0000
@@ -5,6 +5,7 @@
 #ifndef AIRPORT_MOVEMENT_H
 #define AIRPORT_MOVEMENT_H
 
+#include "airport_states.h"
 
 // state machine input struct (from external file, etc.)
 // Finite sTate mAchine --> FTA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/airport_states.h	Tue Mar 27 21:11:34 2007 +0000
@@ -0,0 +1,170 @@
+/* $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 },
+};
--- a/src/disaster_cmd.cpp	Tue Mar 27 20:12:11 2007 +0000
+++ b/src/disaster_cmd.cpp	Tue Mar 27 21:11:34 2007 +0000
@@ -37,6 +37,7 @@
 #include "variables.h"
 #include "table/sprites.h"
 #include "date.h"
+#include "airport_states.h"
 
 enum DisasterSubType {
 	ST_Zeppeliner,
--- a/src/newgrf_engine.cpp	Tue Mar 27 20:12:11 2007 +0000
+++ b/src/newgrf_engine.cpp	Tue Mar 27 21:11:34 2007 +0000
@@ -21,6 +21,7 @@
 #include "date.h"
 #include "helpers.hpp"
 #include "cargotype.h"
+#include "airport_states.h"
 
 
 int _traininfo_vehicle_pitch = 0;
@@ -283,6 +284,10 @@
 		case TERM6:
 		case TERM7:
 		case TERM8:
+		case TERM9:
+		case TERM10:
+		case TERM11:
+		case TERM12:
 			/* TTDPatch only has 3 terminals, so treat these states the same */
 			if (amdflag & AMED_EXACTPOS) return AMS_TTDP_TO_PAD3;
 			return AMS_TTDP_TO_ENTRY_2_AND_3_AND_H;
@@ -387,6 +392,10 @@
 		case TERM6:
 		case TERM7:
 		case TERM8:
+		case TERM9:
+		case TERM10:
+		case TERM11:
+		case TERM12:
 		case HELIPAD3:
 		case HELIPAD4:
 			return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD3 : AMA_TTDP_LANDING_TO_PAD3;