diff --git a/src/station_base.h b/src/station_base.h index 5de9465811..def8c595d5 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -121,6 +121,11 @@ public: return IsRailStationTile(tile) && GetStationIndex(tile) == this->index; } + /* virtual */ FORCEINLINE bool TileBelongsToAirport(TileIndex tile) const + { + return IsAirportTile(tile) && GetStationIndex(tile) == this->index; + } + /* virtual */ uint32 GetNewGRFVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) const; /* virtual */ void GetTileArea(TileArea *ta, StationType type) const; diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 2ed623ea6c..1e24a70fc0 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2066,7 +2066,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags) int w = as->size_x; int h = as->size_y; - CommandCost cost(EXPENSES_CONSTRUCTION, w * h * _price[PR_CLEAR_STATION_AIRPORT]); + CommandCost cost(EXPENSES_CONSTRUCTION); const Aircraft *a; FOR_ALL_AIRCRAFT(a) { @@ -2077,6 +2077,10 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags) TILE_LOOP(tile_cur, w, h, tile) { if (!EnsureNoVehicleOnGround(tile_cur)) return CMD_ERROR; + if (!st->TileBelongsToAirport(tile_cur)) continue; + + cost.AddCost(_price[PR_CLEAR_STATION_AIRPORT]); + if (flags & DC_EXEC) { DeleteAnimatedTile(tile_cur); DoClearSquare(tile_cur); diff --git a/src/station_map.h b/src/station_map.h index f4b3b691a3..52e72657d2 100644 --- a/src/station_map.h +++ b/src/station_map.h @@ -184,6 +184,16 @@ static inline bool IsAirport(TileIndex t) return GetStationType(t) == STATION_AIRPORT; } +/** + * Is this tile a station tile and an airport tile? + * @param t the tile to get the information from + * @return true if and only if the tile is an airport + */ +static inline bool IsAirportTile(TileIndex t) +{ + return IsTileType(t, MP_STATION) && IsAirport(t); +} + bool IsHangar(TileIndex t); /**