Changeset - r12145:7a03e28f3078
[Not reviewed]
master
0 3 0
yexo - 15 years ago 2009-06-12 14:53:57
yexo@openttd.org
(svn r16566) -Codechange: enumify all airport tiles
3 files changed with 203 insertions and 95 deletions:
0 comments (0 inline, 0 general)
src/airport.cpp
Show inline comments
 
@@ -8,12 +8,211 @@
 
#include "airport_movement.h"
 
#include "core/bitmath_func.hpp"
 
#include "core/alloc_func.hpp"
 
#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
 
 * OR
 
 * - false: give a summarized report which only shows current and next position */
 
//#define DEBUG_AIRPORT false
src/airport.h
Show inline comments
 
@@ -24,12 +24,13 @@ enum {
 
	AT_METROPOLITAN  =   3,
 
	AT_INTERNATIONAL =   4,
 
	AT_COMMUTER      =   5,
 
	AT_HELIDEPOT     =   6,
 
	AT_INTERCON      =   7,
 
	AT_HELISTATION   =   8,
 
	NUM_AIRPORTS     =   9,
 
	AT_OILRIG        =  15,
 
	AT_DUMMY         = 255
 
};
 

	
 

	
 
enum {
 
@@ -197,7 +198,9 @@ const AirportFTAClass *GetAirport(const 
 
 * @return get all buildable airports at this given time, bitmasked.
 
 * Bit 0 means the small airport is buildable, etc.
 
 * @todo set availability of airports by year, instead of airplane
 
 */
 
uint32 GetValidAirports();
 

	
 
extern const byte * const _airport_sections[];
 

	
 
#endif /* AIRPORT_H */
src/station_cmd.cpp
Show inline comments
 
@@ -1596,105 +1596,12 @@ CommandCost CmdRemoveRoadStop(TileIndex 
 
				road_owner, tram_owner);
 
	}
 

	
 
	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
 
 * @param town_tile town's tile (t->xy)
 
 * @param airport_tile st->airport_tile
 
 * @return minimal manhattan distance from town_tile to any airport's tile
 
@@ -1790,13 +1697,12 @@ void UpdateAirportsNoise()
 
			Town *nearest = AirportGetNearestTown(afc, st->airport_tile);
 
			nearest->noise_reached += GetAirportNoiseLevelForTown(afc, nearest->xy, st->airport_tile);
 
		}
 
	}
 
}
 

	
 

	
 
/** Place an Airport.
 
 * @param tile tile where airport will be built
 
 * @param flags operation to perform
 
 * @param p1 airport type, @see airport.h
 
 * @param p2 various bitstuffed elements
 
 * - p2 = (bit     0) - allow airports directly adjacent to other airports.
 
@@ -1810,13 +1716,13 @@ CommandCost CmdBuildAirport(TileIndex ti
 
	if (!reuse) station_to_join = INVALID_STATION;
 
	bool distant_join = (station_to_join != INVALID_STATION);
 

	
 
	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;
 
	}
 

	
 
	Town *t = ClosestTownFromTile(tile, UINT_MAX);
0 comments (0 inline, 0 general)