(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.
--- 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;