diff --git a/src/airport.cpp b/src/airport.cpp --- a/src/airport.cpp +++ b/src/airport.cpp @@ -11,6 +11,205 @@ #include "date_func.h" #include "settings_type.h" + +/* 8-66 are mapped to 0-58, 83+ are mapped to 59+ */ +enum AirportTiles { + APT_APRON = 8, + APT_APRON_FENCE_NW = 9, + APT_APRON_FENCE_SW = 10, + APT_STAND = 11, + APT_APRON_W = 12, + APT_APRON_S = 13, + APT_APRON_VER_CROSSING_S = 14, + APT_APRON_HOR_CROSSING_W = 15, + APT_APRON_VER_CROSSING_N = 16, + APT_APRON_HOR_CROSSING_E = 17, + APT_APRON_E = 18, + APT_ARPON_N = 19, + APT_APRON_HOR = 20, + APT_APRON_N_FENCE_SW = 21, + APT_RUNWAY_1 = 22, + APT_RUNWAY_2 = 23, + APT_RUNWAY_3 = 24, + APT_RUNWAY_4 = 25, + APT_RUNWAY_END_FENCE_SE = 26, + APT_BUILDING_2 = 27, + APT_TOWER_FENCE_SW = 28, + APT_ROUND_TERMINAL = 29, + APT_BUILDING_3 = 30, + APT_BUILDING_1 = 31, + APT_DEPOT_SE = 32, + APT_STAND_1 = 33, + APT_STAND_PIER_NE = 34, + APT_PIER_NW_NE = 35, + APT_PIER = 36, + APT_EMPTY = 37, + APT_EMPTY_FENCE_NE = 38, + APT_RADAR_GRASS_FENCE_SW = 39, + /* 40-50 are for turning the radar */ + APT_RADIO_TOWER_FENCE_NE = 51, + APT_SMALL_BUILDING_3 = 52, + APT_SMALL_BUILDING_2 = 53, + APT_SMALL_BUILDING_1 = 54, + APT_GRASS_FENCE_SW = 55, + APT_GRASS_2 = 56, + APT_GRASS_1 = 57, + APT_GRASS_FENCE_NE_FLAG = 58, + /* 59-61 are for flag animation */ + APT_RUNWAY_SMALL_NEAR_END = 62, + APT_RUNWAY_SMALL_MIDDLE = 63, + APT_RUNWAY_SMALL_FAR_END = 64, + APT_SMALL_DEPOT_SE = 65, + APT_HELIPORT = 66, + APT_RUNWAY_END = 83, + APT_RUNWAY_5 = 84, + APT_TOWER = 85, + APT_SMALL_DEPOT_SE_2 = 86, // unused (copy of 65) + APT_APRON_FENCE_NE = 87, + APT_RUNWAY_END_FENCE_NW = 88, + APT_RUNWAY_FENCE_NW = 89, + APT_RADAR_FENCE_SW = 90, + /* 91-101 are for turning the radar */ + APT_RADAR_FENCE_NE = 102, + /* 103-113 are for turning the radar */ + APT_HELIPAD_1 = 114, + APT_HELIPAD_2_FENCE_NW = 115, + APT_HELIPAD_2 = 116, + APT_APRON_FENCE_NE_SW = 117, + APT_RUNWAY_END_FENCE_NW_SW = 118, + APT_RUNWAY_END_FENCE_SE_SW = 119, + APT_RUNWAY_END_FENCE_NE_NW = 120, + APT_RUNWAY_END_FENCE_NE_SE = 121, + APT_HELIPAD_2_FENCE_NE_SE = 122, + APT_APRON_FENCE_SE_SW = 123, + APT_LOW_BUILDING_FENCE_N = 124, + APT_ROT_RUNWAY_FENCE_NE = 125, // unused + APT_ROT_RUNWAY_END_FENCE_NE= 126, // unused + APT_ROT_RUNWAY_FENCE_SW = 127, // unused + APT_ROT_RUNWAY_END_FENCE_SW= 128, // unused + APT_DEPOT_SW = 129, // unused + APT_DEPOT_NW = 130, // unused + APT_DEPOT_NE = 131, // unused + APT_HELIPAD_2_FENCE_SE_SW = 132, // unused + APT_HELIPAD_2_FENCE_SE = 133, // unused + APT_LOW_BUILDING_FENCE_NW = 134, + APT_LOW_BUILDING_FENCE_NE = 135, // unused + APT_LOW_BUILDING_FENCE_SW = 136, // unused + APT_LOW_BUILDING_FENCE_SE = 137, // unused + APT_STAND_FENCE_NE = 138, // unused + APT_STAND_FENCE_SE = 139, // unused + APT_STAND_FENCE_SW = 140, // unused + APT_APRON_FENCE_NE_2 = 141, // unused (copy of 87) + APT_APRON_FENCE_SE = 142, + APT_HELIPAD_2_FENCE_NW_SW = 143, // unused + APT_HELIPAD_2_FENCE_SW = 144, // unused + APT_RADAR_FENCE_SE = 145, // unused + /* 146-156 used for radar rotation */ + APT_HELIPAD_3_FENCE_SE_SW = 157, + APT_HELIPAD_3_FENCE_NW_SW = 158, + APT_HELIPAD_3_FENCE_NW = 159, + APT_LOW_BUILDING = 160, + APT_APRON_FENCE_NE_SE = 161, + APT_APRON_HALF_EAST = 162, + APT_APRON_HALF_WEST = 163, + APT_GRASS_FENCE_NE_FLAG_2 = 164, + APT_GRASS_2_FENCE_NE_FLAG = 165, + /* 166-169 used for flag animation */ +}; + +/** Tiles for Country Airfield (small) */ +static const byte _airport_sections_country[] = { + APT_SMALL_BUILDING_1, APT_SMALL_BUILDING_2, APT_SMALL_BUILDING_3, APT_SMALL_DEPOT_SE, + APT_GRASS_FENCE_NE_FLAG, APT_GRASS_1, APT_GRASS_2, APT_GRASS_FENCE_SW, + APT_RUNWAY_SMALL_FAR_END, APT_RUNWAY_SMALL_MIDDLE, APT_RUNWAY_SMALL_MIDDLE, APT_RUNWAY_SMALL_NEAR_END +}; + +/** Tiles for City Airport (large) */ +static const byte _airport_sections_town[] = { + APT_BUILDING_1, APT_APRON_FENCE_NW, APT_STAND_1, APT_APRON_FENCE_NW, APT_APRON_FENCE_NW, APT_DEPOT_SE, + APT_BUILDING_2, APT_PIER, APT_ROUND_TERMINAL, APT_STAND_PIER_NE, APT_APRON, APT_APRON_FENCE_SW, + APT_BUILDING_3, APT_STAND, APT_PIER_NW_NE, APT_APRON_S, APT_APRON_HOR, APT_APRON_N_FENCE_SW, + APT_RADIO_TOWER_FENCE_NE, APT_APRON_W, APT_APRON_VER_CROSSING_S, APT_APRON_HOR_CROSSING_E, APT_ARPON_N, APT_TOWER_FENCE_SW, + APT_EMPTY_FENCE_NE, APT_APRON_S, APT_APRON_HOR_CROSSING_W, APT_APRON_VER_CROSSING_N, APT_APRON_E, APT_RADAR_GRASS_FENCE_SW, + APT_RUNWAY_END_FENCE_SE, APT_RUNWAY_1, APT_RUNWAY_2, APT_RUNWAY_3, APT_RUNWAY_4, APT_RUNWAY_END_FENCE_SE +}; + +/** Tiles for Metropolitain Airport (large) - 2 runways */ +static const byte _airport_sections_metropolitan[] = { + APT_BUILDING_1, APT_APRON_FENCE_NW, APT_STAND_1, APT_APRON_FENCE_NW, APT_APRON_FENCE_NW, APT_DEPOT_SE, + APT_BUILDING_2, APT_PIER, APT_ROUND_TERMINAL, APT_STAND_PIER_NE, APT_APRON, APT_APRON_FENCE_SW, + APT_BUILDING_3, APT_STAND, APT_PIER_NW_NE, APT_APRON_S, APT_APRON_HOR, APT_APRON_N_FENCE_SW, + APT_RADAR_FENCE_NE, APT_APRON, APT_APRON, APT_APRON, APT_APRON, APT_TOWER_FENCE_SW, + APT_RUNWAY_END, APT_RUNWAY_5, APT_RUNWAY_5, APT_RUNWAY_5, APT_RUNWAY_5, APT_RUNWAY_END, + APT_RUNWAY_END_FENCE_SE, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_END_FENCE_SE +}; + +/** Tiles for International Airport (large) - 2 runways */ +static const byte _airport_sections_international[] = { + APT_RUNWAY_END_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_END_FENCE_NW, + APT_RADIO_TOWER_FENCE_NE, APT_APRON, APT_APRON, APT_APRON, APT_APRON, APT_APRON, APT_DEPOT_SE, + APT_BUILDING_3, APT_APRON, APT_STAND, APT_BUILDING_2, APT_STAND, APT_APRON, APT_APRON_FENCE_SW, + APT_DEPOT_SE, APT_APRON, APT_STAND, APT_BUILDING_2, APT_STAND, APT_APRON, APT_HELIPAD_1, + APT_APRON_FENCE_NE, APT_APRON, APT_STAND, APT_TOWER, APT_STAND, APT_APRON, APT_HELIPAD_1, + APT_APRON_FENCE_NE, APT_APRON, APT_APRON, APT_APRON, APT_APRON, APT_APRON, APT_RADAR_FENCE_SW, + APT_RUNWAY_END_FENCE_SE, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_END_FENCE_SE +}; + +/** Tiles for Intercontinental Airport (vlarge) - 4 runways */ +static const byte _airport_sections_intercontinental[] = { + APT_RADAR_FENCE_NE, APT_RUNWAY_END_FENCE_NE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_END_FENCE_NW_SW, + APT_RUNWAY_END_FENCE_NE_NW, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_END_FENCE_SE_SW, APT_APRON_FENCE_NE_SW, + APT_APRON_FENCE_NE, APT_SMALL_BUILDING_1, APT_APRON_FENCE_NE, APT_APRON, APT_APRON, APT_APRON, APT_APRON, APT_RADIO_TOWER_FENCE_NE, APT_APRON_FENCE_NE_SW, + APT_APRON_FENCE_NE, APT_APRON_HALF_EAST, APT_APRON_FENCE_NE, APT_TOWER, APT_HELIPAD_2, APT_HELIPAD_2, APT_APRON, APT_APRON_FENCE_NW, APT_APRON_FENCE_SW, + APT_APRON_FENCE_NE, APT_APRON, APT_APRON, APT_STAND, APT_BUILDING_1, APT_STAND, APT_APRON, APT_LOW_BUILDING, APT_DEPOT_SE, + APT_DEPOT_SE, APT_LOW_BUILDING, APT_APRON, APT_STAND, APT_BUILDING_2, APT_STAND, APT_APRON, APT_APRON, APT_APRON_FENCE_SW, + APT_APRON_FENCE_NE, APT_APRON, APT_APRON, APT_STAND, APT_BUILDING_3, APT_STAND, APT_APRON, APT_APRON, APT_APRON_FENCE_SW, + APT_APRON_FENCE_NE, APT_APRON_FENCE_SE, APT_APRON, APT_STAND, APT_ROUND_TERMINAL, APT_STAND, APT_APRON_FENCE_SW, APT_APRON_HALF_WEST, APT_APRON_FENCE_SW, + APT_APRON_FENCE_NE, APT_GRASS_FENCE_NE_FLAG_2, APT_APRON_FENCE_NE, APT_APRON, APT_APRON, APT_APRON, APT_APRON_FENCE_SW, APT_EMPTY, APT_APRON_FENCE_NE_SW, + APT_APRON_FENCE_NE, APT_RUNWAY_END_FENCE_NE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_FENCE_NW, APT_RUNWAY_END_FENCE_SE_SW, + APT_RUNWAY_END_FENCE_NE_SE, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_END_FENCE_SE_SW, APT_EMPTY +}; + + +/** Tiles for Commuter Airfield (small) */ +static const byte _airport_sections_commuter[] = { + APT_TOWER, APT_BUILDING_3, APT_HELIPAD_2_FENCE_NW, APT_HELIPAD_2_FENCE_NW, APT_DEPOT_SE, + APT_APRON_FENCE_NE, APT_APRON, APT_APRON, APT_APRON, APT_APRON_FENCE_SW, + APT_APRON_FENCE_NE, APT_STAND, APT_STAND, APT_STAND, APT_APRON_FENCE_SW, + APT_RUNWAY_END_FENCE_SE, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_2, APT_RUNWAY_END_FENCE_SE +}; + +/** Tiles for Heliport */ +static const byte _airport_sections_heliport[] = { + APT_HELIPORT, +}; + +/** Tiles for Helidepot */ +static const byte _airport_sections_helidepot[] = { + APT_LOW_BUILDING_FENCE_N, APT_DEPOT_SE, + APT_HELIPAD_2_FENCE_NE_SE, APT_APRON_FENCE_SE_SW +}; + +/** Tiles for Helistation */ +static const byte _airport_sections_helistation[] = { + APT_DEPOT_SE, APT_LOW_BUILDING_FENCE_NW, APT_HELIPAD_3_FENCE_NW, APT_HELIPAD_3_FENCE_NW_SW, + APT_APRON_FENCE_NE_SE, APT_APRON_FENCE_SE, APT_APRON_FENCE_SE, APT_HELIPAD_3_FENCE_SE_SW +}; + +const byte * const _airport_sections[] = { + _airport_sections_country, // Country Airfield (small) + _airport_sections_town, // City Airport (large) + _airport_sections_heliport, // Heliport + _airport_sections_metropolitan, // Metropolitain Airport (large) + _airport_sections_international, // International Airport (xlarge) + _airport_sections_commuter, // Commuter Airport (small) + _airport_sections_helidepot, // Helidepot + _airport_sections_intercontinental, // Intercontinental Airport (xxlarge) + _airport_sections_helistation, // Helistation +}; + +assert_compile(NUM_AIRPORTS == lengthof(_airport_sections)); + /* Uncomment this to print out a full report of the airport-structure * You should either use * - true: full-report, print out every state and choice with string-names diff --git a/src/airport.h b/src/airport.h --- a/src/airport.h +++ b/src/airport.h @@ -27,6 +27,7 @@ enum { AT_HELIDEPOT = 6, AT_INTERCON = 7, AT_HELISTATION = 8, + NUM_AIRPORTS = 9, AT_OILRIG = 15, AT_DUMMY = 255 }; @@ -200,4 +201,6 @@ const AirportFTAClass *GetAirport(const */ uint32 GetValidAirports(); +extern const byte * const _airport_sections[]; + #endif /* AIRPORT_H */ diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1599,99 +1599,6 @@ CommandCost CmdRemoveRoadStop(TileIndex return ret; } -/* FIXME -- need to move to its corresponding Airport variable*/ - -/* Country Airfield (small) */ -static const byte _airport_sections_country[] = { - 54, 53, 52, 65, - 58, 57, 56, 55, - 64, 63, 63, 62 -}; - -/* City Airport (large) */ -static const byte _airport_sections_town[] = { - 31, 9, 33, 9, 9, 32, - 27, 36, 29, 34, 8, 10, - 30, 11, 35, 13, 20, 21, - 51, 12, 14, 17, 19, 28, - 38, 13, 15, 16, 18, 39, - 26, 22, 23, 24, 25, 26 -}; - -/* Metropolitain Airport (large) - 2 runways */ -static const byte _airport_sections_metropolitan[] = { - 31, 9, 33, 9, 9, 32, - 27, 36, 29, 34, 8, 10, - 30, 11, 35, 13, 20, 21, - 102, 8, 8, 8, 8, 28, - 83, 84, 84, 84, 84, 83, - 26, 23, 23, 23, 23, 26 -}; - -/* International Airport (large) - 2 runways */ -static const byte _airport_sections_international[] = { - 88, 89, 89, 89, 89, 89, 88, - 51, 8, 8, 8, 8, 8, 32, - 30, 8, 11, 27, 11, 8, 10, - 32, 8, 11, 27, 11, 8, 114, - 87, 8, 11, 85, 11, 8, 114, - 87, 8, 8, 8, 8, 8, 90, - 26, 23, 23, 23, 23, 23, 26 -}; - -/* Intercontinental Airport (vlarge) - 4 runways */ -static const byte _airport_sections_intercontinental[] = { - 102, 120, 89, 89, 89, 89, 89, 89, 118, - 120, 23, 23, 23, 23, 23, 23, 119, 117, - 87, 54, 87, 8, 8, 8, 8, 51, 117, - 87, 162, 87, 85, 116, 116, 8, 9, 10, - 87, 8, 8, 11, 31, 11, 8, 160, 32, - 32, 160, 8, 11, 27, 11, 8, 8, 10, - 87, 8, 8, 11, 30, 11, 8, 8, 10, - 87, 142, 8, 11, 29, 11, 10, 163, 10, - 87, 164, 87, 8, 8, 8, 10, 37, 117, - 87, 120, 89, 89, 89, 89, 89, 89, 119, - 121, 23, 23, 23, 23, 23, 23, 119, 37 -}; - - -/* Commuter Airfield (small) */ -static const byte _airport_sections_commuter[] = { - 85, 30, 115, 115, 32, - 87, 8, 8, 8, 10, - 87, 11, 11, 11, 10, - 26, 23, 23, 23, 26 -}; - -/* Heliport */ -static const byte _airport_sections_heliport[] = { - 66, -}; - -/* Helidepot */ -static const byte _airport_sections_helidepot[] = { - 124, 32, - 122, 123 -}; - -/* Helistation */ -static const byte _airport_sections_helistation[] = { - 32, 134, 159, 158, - 161, 142, 142, 157 -}; - -static const byte * const _airport_sections[] = { - _airport_sections_country, // Country Airfield (small) - _airport_sections_town, // City Airport (large) - _airport_sections_heliport, // Heliport - _airport_sections_metropolitan, // Metropolitain Airport (large) - _airport_sections_international, // International Airport (xlarge) - _airport_sections_commuter, // Commuter Airport (small) - _airport_sections_helidepot, // Helidepot - _airport_sections_intercontinental, // Intercontinental Airport (xxlarge) - _airport_sections_helistation // Helistation -}; - /** * Computes the minimal distance from town's xy to any airport's tile. * @param afc airport's description @@ -1793,7 +1700,6 @@ void UpdateAirportsNoise() } } - /** Place an Airport. * @param tile tile where airport will be built * @param flags operation to perform @@ -1813,7 +1719,7 @@ CommandCost CmdBuildAirport(TileIndex ti if (distant_join && (!_settings_game.station.distant_join_stations || !Station::IsValidID(station_to_join))) return CMD_ERROR; /* Check if a valid, buildable airport was chosen for construction */ - if (p1 >= lengthof(_airport_sections) || !HasBit(GetValidAirports(), p1)) return CMD_ERROR; + if (p1 >= NUM_AIRPORTS || !HasBit(GetValidAirports(), p1)) return CMD_ERROR; if (!CheckIfAuthorityAllowsNewStation(tile, flags)) { return CMD_ERROR;