--- a/src/aircraft_cmd.cpp Wed Aug 15 10:24:47 2007 +0000
+++ b/src/aircraft_cmd.cpp Wed Aug 15 10:30:49 2007 +0000
@@ -552,7 +552,7 @@
if (v->type != VEH_AIRCRAFT || !CheckOwnership(v->owner)) return CMD_ERROR;
/* cannot stop airplane when in flight, or when taking off / landing */
- if (v->u.air.state >= STARTTAKEOFF && v->u.air.state < TERM7)
+ if (v->u.air.state >= TAKEOFF && v->u.air.state <= FLYING)
return_cmd_error(STR_A017_AIRCRAFT_IS_IN_FLIGHT);
/* Check if this aircraft can be started/stopped. The callback will fail or
@@ -1869,39 +1869,25 @@
}
typedef void AircraftStateHandler(Vehicle *v, const AirportFTAClass *apc);
-static AircraftStateHandler * const _aircraft_state_handlers[] = {
- AircraftEventHandler_General, // TO_ALL = 0
- AircraftEventHandler_InHangar, // HANGAR = 1
- AircraftEventHandler_AtTerminal, // TERM1 = 2
- AircraftEventHandler_TakeOff, // TAKEOFF = 3
- AircraftEventHandler_StartTakeOff, // STARTTAKEOFF = 4
- AircraftEventHandler_EndTakeOff, // ENDTAKEOFF = 5
- AircraftEventHandler_HeliTakeOff, // HELITAKEOFF = 6
- AircraftEventHandler_Flying, // FLYING = 7
- AircraftEventHandler_Landing, // LANDING = 8
- AircraftEventHandler_EndLanding, // ENDLANDING = 9
- AircraftEventHandler_HeliLanding, // HELILANDING = 10
- AircraftEventHandler_HeliEndLanding, // HELIENDLANDING = 11
- AircraftEventHandler_HeliEndTakeOff, // HELIENDTAKEOFF = 12
-};
-byte MapStateToHandler(byte state)
+AircraftStateHandler *MapStateToHandler(byte state)
{
- byte handler = 0x00;
- if (state == 0x40) handler = 0x01; //hangar
- if (state >= 0x01 && state <= 0x3C) handler = 0x02; //at terminal
- if (state == 0x41) handler = 0x03; //takeoff
- if (state == 0x42) handler = 0x04; //starttakeoff
- if (state == 0x43) handler = 0x05; //endtakeoff
- if (state == 0x44) handler = 0x08; //landing
- if (state == 0x45) handler = 0x09; //endlanding
- if (state == 0x51) handler = 0x06; //helitakeoff
- if (state == 0x53) handler = 0x0C; //heliendtakeoff
- if (state == 0x54) handler = 0x0A; //helilanding
- if (state == 0x55) handler = 0x0B; //heliendlanding
- if (state == 0x7F) handler = 0x07; //flying
-
- return handler;
+ switch (state) {
+ default: return (state >= FIRST_TERMINAL && state <= LAST_HELIPAD) ?
+ AircraftEventHandler_AtTerminal :
+ AircraftEventHandler_General;
+ case HANGAR: return AircraftEventHandler_InHangar;
+ case TAKEOFF: return AircraftEventHandler_TakeOff;
+ case STARTTAKEOFF: return AircraftEventHandler_StartTakeOff;
+ case ENDTAKEOFF: return AircraftEventHandler_EndTakeOff;
+ case LANDING: return AircraftEventHandler_Landing;
+ case ENDLANDING: return AircraftEventHandler_EndLanding;
+ case HELITAKEOFF: return AircraftEventHandler_HeliTakeOff;
+ case HELIENDTAKEOFF: return AircraftEventHandler_HeliEndTakeOff;
+ case HELILANDING: return AircraftEventHandler_HeliLanding;
+ case HELIENDLANDING: return AircraftEventHandler_HeliEndLanding;
+ case FLYING: return AircraftEventHandler_Flying;
+ }
}
@@ -1911,8 +1897,6 @@
if (!AircraftController(v)) return;
const AirportFTAClass *apc = GetStation(v->u.air.targetairport)->Airport();
- Station *st = GetStation(v->u.air.targetairport);
-
AirportMove(v, apc); // move aircraft to next position
}
@@ -1934,7 +1918,7 @@
if (amd->state == v->u.air.state) {
byte prev_pos = v->u.air.pos; // location could be changed in state, so save it before-hand
byte prev_state = v->u.air.state;
- _aircraft_state_handlers[MapStateToHandler(v->u.air.state)](v, apc);
+ MapStateToHandler(v->u.air.state)(v, apc);
if (v->u.air.state != FLYING) v->u.air.previous_pos = prev_pos;
if (v->u.air.state != prev_state || v->u.air.pos != prev_pos) {
/* release blocks on airport */
--- a/src/airport_states.h Wed Aug 15 10:24:47 2007 +0000
+++ b/src/airport_states.h Wed Aug 15 10:30:49 2007 +0000
@@ -22,149 +22,25 @@
/* Movement States on Airports (headings target) */
enum {
- TO_ALL = 0,
- HANGAR = 64,
- TERM1 = 1,
- TERM2 = 2,
- TERM3 = 3,
- TERM4 = 4,
- TERM5 = 5,
- TERM6 = 6,
- HELIPAD1 = 37,
- HELIPAD2 = 38,
- TAKEOFF = 65,
- STARTTAKEOFF = 66,
- ENDTAKEOFF = 67,
- HELITAKEOFF = 81,
- FLYING = 127,
- LANDING = 68,
- ENDLANDING = 69,
- HELILANDING = 84,
- HELIENDLANDING = 85,
- TERM7 = 7,
- TERM8 = 8,
- HELIPAD3 = 39,
- HELIPAD4 = 40,
- TERM9 = 9,
- TERM10 = 10,
- TERM11 = 11,
- TERM12 = 12,
- SHORTTAKEOFF = 73, /* Only used in movement command choices. If used as the heading in the first command element, treated as TAKEOFF.
+ TO_ALL = 0x00,
+ FIRST_TERMINAL = 0x01,
+ LAST_TERMINAL = 0x24,
+ FIRST_HELIPAD = 0x25,
+ LAST_HELIPAD = 0x3C,
+ HANGAR = 0x40,
+ TAKEOFF = 0x41,
+ STARTTAKEOFF = 0x42,
+ ENDTAKEOFF = 0x43,
+ LANDING = 0x44,
+ ENDLANDING = 0x45,
+ SHORTTAKEOFF = 0x49, /* 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 },
*/
+ HELITAKEOFF = 0x51,
+ HELIENDTAKEOFF = 0x53,
+ HELILANDING = 0x54,
+ HELIENDLANDING = 0x55,
+ FLYING = 0x7F,
};
-
-/* 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)
- */
-
-struct AirportTerminal {
- byte state; // the terminal state/target heading
- uint64 block; // the block that reserves that terminal
-};
-
-// 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 },
-};