(svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions. NewGRF_ports
authorrubidium
Wed, 15 Aug 2007 10:30:49 +0000
branchNewGRF_ports
changeset 6825 c6ec828eeb0d
parent 6824 6324369ce26e
child 6826 5d1265dc2a73
(svn r10908) [NewGRF_ports] -Codechange: remove the hardcoded TERMn and HELIPADn and the now unused block definitions.
src/aircraft_cmd.cpp
src/airport_states.h
src/disaster_cmd.cpp
src/newgrf_engine.cpp
--- 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 },
-};
--- a/src/disaster_cmd.cpp	Wed Aug 15 10:24:47 2007 +0000
+++ b/src/disaster_cmd.cpp	Wed Aug 15 10:30:49 2007 +0000
@@ -186,7 +186,7 @@
 }
 
 
-static const int SMALL_AIRPORT_RUNWAY_BLOCK = 40;
+static const byte SMALL_AIRPORT_RUNWAY_BLOCK = 40;
 
 /**
  * Zeppeliner handling, v->current_order.dest states:
@@ -252,7 +252,7 @@
 				IsAirport(tile) &&
 				IsHumanPlayer(GetTileOwner(tile))) {
 			st = GetStationByTile(tile);
-			st->airport_flags.ReleaseBlocks(SetFSMSingleBlock(SMALL_AIRPORT_RUNWAY_BLOCK));
+			st->airport_flags.ReleaseBlocks(SetFSMSingleBlock(&SMALL_AIRPORT_RUNWAY_BLOCK));
 		}
 
 		SetDisasterVehiclePos(v, v->x_pos, v->y_pos, v->z_pos);
@@ -293,7 +293,7 @@
 			IsAirport(tile) &&
 			IsHumanPlayer(GetTileOwner(tile))) {
 		st = GetStationByTile(tile);
-		st->airport_flags.ReleaseBlocks(SetFSMSingleBlock(SMALL_AIRPORT_RUNWAY_BLOCK));
+		st->airport_flags.ReleaseBlocks(SetFSMSingleBlock(&SMALL_AIRPORT_RUNWAY_BLOCK));
 	}
 }
 
--- a/src/newgrf_engine.cpp	Wed Aug 15 10:24:47 2007 +0000
+++ b/src/newgrf_engine.cpp	Wed Aug 15 10:30:49 2007 +0000
@@ -272,36 +272,14 @@
 			/* Still moving towards hanger. */
 			return AMS_TTDP_TO_HANGAR;
 
-		case TERM1:
+		case FIRST_TERMINAL: // TERM 1
 			if (amdflag & AMED_EXACTPOS) return AMS_TTDP_TO_PAD1;
 			return AMS_TTDP_TO_JUNCTION;
 
-		case TERM2:
+		case FIRST_TERMINAL + 1: // TERM 2
 			if (amdflag & AMED_EXACTPOS) return AMS_TTDP_TO_PAD2;
 			return AMS_TTDP_TO_ENTRY_2_AND_3_AND_H;
 
-		case TERM3:
-		case TERM4:
-		case TERM5:
-		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;
-
-		case HELIPAD1:
-		case HELIPAD2:
-		case HELIPAD3:
-		case HELIPAD4: // Will only occur for helicopters.
-			if (amdflag & AMED_HELI_LOWER) return AMS_TTDP_HELI_LAND_AIRPORT; // Descending.
-			if (amdflag & AMED_SLOWTURN)   return AMS_TTDP_FLIGHT_TO_TOWER;   // Still hasn't started descent.
-			return AMS_TTDP_TO_JUNCTION; // On the ground.
-
 		case TAKEOFF: // Moving to takeoff position.
 			return AMS_TTDP_TO_OUTWAY;
 
@@ -340,6 +318,16 @@
 			}
 
 		default:
+			if (FIRST_TERMINAL <= v->u.air.state && v->u.air.state <= LAST_TERMINAL) {
+				/* TTDPatch only has 3 terminals, so treat these states the same */
+				return (amdflag & AMED_EXACTPOS) ? AMS_TTDP_TO_PAD3 : AMS_TTDP_TO_ENTRY_2_AND_3_AND_H;
+			}
+			if (FIRST_HELIPAD <= v->u.air.state && v->u.air.state <= LAST_HELIPAD) {
+				if (amdflag & AMED_HELI_LOWER) return AMS_TTDP_HELI_LAND_AIRPORT; // Descending.
+				if (amdflag & AMED_SLOWTURN)   return AMS_TTDP_FLIGHT_TO_TOWER;   // Still hasn't started descent.
+				return AMS_TTDP_TO_JUNCTION; // On the ground.
+			}
+
 			return AMS_TTDP_HANGAR;
 	}
 }
@@ -380,28 +368,14 @@
 		case HANGAR:
 			return (v->cur_speed > 0) ? AMA_TTDP_LANDING_TO_HANGAR : AMA_TTDP_IN_HANGAR;
 
-		case TERM1:
-		case HELIPAD1:
+		case FIRST_TERMINAL:
+		case FIRST_HELIPAD:
 			return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD1 : AMA_TTDP_LANDING_TO_PAD1;
 
-		case TERM2:
-		case HELIPAD2:
+		case FIRST_TERMINAL + 1:
+		case FIRST_HELIPAD + 1:
 			return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD2 : AMA_TTDP_LANDING_TO_PAD2;
 
-		case TERM3:
-		case TERM4:
-		case TERM5:
-		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;
-
 		case TAKEOFF:      // Moving to takeoff position
 		case STARTTAKEOFF: // Accelerating down runway
 		case ENDTAKEOFF:   // Ascent
@@ -421,6 +395,10 @@
 				AMA_TTDP_LANDING_TO_HANGAR : AMA_TTDP_LANDING_TO_PAD1;
 
 		default:
+			if (FIRST_TERMINAL <= v->u.air.state && v->u.air.state <= LAST_HELIPAD) {
+				return (v->current_order.type == OT_LOADING) ? AMA_TTDP_ON_PAD3 : AMA_TTDP_LANDING_TO_PAD3;
+			}
+
 			return AMA_TTDP_IN_HANGAR;
 	}
 }