|
@@ -1833,97 +1833,97 @@ CommandCost CmdBuildAirport(TileIndex ti
|
|
|
{
|
|
|
const byte *b = _airport_sections[p1];
|
|
|
|
|
|
BEGIN_TILE_LOOP(tile_cur, w, h, tile) {
|
|
|
MakeAirport(tile_cur, st->owner, st->index, *b);
|
|
|
b++;
|
|
|
} END_TILE_LOOP(tile_cur, w, h, tile)
|
|
|
}
|
|
|
|
|
|
UpdateStationVirtCoordDirty(st);
|
|
|
UpdateStationAcceptance(st, false);
|
|
|
st->RecomputeIndustriesNear();
|
|
|
InvalidateWindowData(WC_SELECT_STATION, 0, 0);
|
|
|
InvalidateWindowData(WC_STATION_LIST, st->owner, 0);
|
|
|
InvalidateWindowWidget(WC_STATION_VIEW, st->index, SVW_PLANES);
|
|
|
|
|
|
if (_settings_game.economy.station_noise_level) {
|
|
|
InvalidateWindow(WC_TOWN_VIEW, st->town->index);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return cost;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Remove an airport
|
|
|
* @param tile TileIndex been queried
|
|
|
* @param flags operation to perform
|
|
|
* @return cost or failure of operation
|
|
|
*/
|
|
|
static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags)
|
|
|
{
|
|
|
Station *st = Station::GetByTile(tile);
|
|
|
|
|
|
if (_current_company != OWNER_WATER && !CheckOwnership(st->owner)) {
|
|
|
return CMD_ERROR;
|
|
|
}
|
|
|
|
|
|
tile = st->airport_tile;
|
|
|
|
|
|
const AirportFTAClass *afc = st->Airport();
|
|
|
int w = afc->size_x;
|
|
|
int h = afc->size_y;
|
|
|
|
|
|
CommandCost cost(EXPENSES_CONSTRUCTION, w * h * _price.remove_airport);
|
|
|
|
|
|
const Aircraft *a;
|
|
|
FOR_ALL_AIRCRAFT(a) {
|
|
|
if (!IsNormalAircraft(a)) continue;
|
|
|
if (!a->IsNormalAircraft()) continue;
|
|
|
if (a->targetairport == st->index && a->state != FLYING) return CMD_ERROR;
|
|
|
}
|
|
|
|
|
|
BEGIN_TILE_LOOP(tile_cur, w, h, tile) {
|
|
|
if (!EnsureNoVehicleOnGround(tile_cur)) return CMD_ERROR;
|
|
|
|
|
|
if (flags & DC_EXEC) {
|
|
|
DeleteAnimatedTile(tile_cur);
|
|
|
DoClearSquare(tile_cur);
|
|
|
}
|
|
|
} END_TILE_LOOP(tile_cur, w, h, tile)
|
|
|
|
|
|
if (flags & DC_EXEC) {
|
|
|
for (uint i = 0; i < afc->nof_depots; ++i) {
|
|
|
DeleteWindowById(
|
|
|
WC_VEHICLE_DEPOT, tile + ToTileIndexDiff(afc->airport_depots[i])
|
|
|
);
|
|
|
}
|
|
|
|
|
|
/* Go get the final noise level, that is base noise minus factor from distance to town center.
|
|
|
* And as for construction, always remove it, even if the setting is not set, in order to avoid the
|
|
|
* need of recalculation */
|
|
|
Town *nearest = AirportGetNearestTown(afc, tile);
|
|
|
nearest->noise_reached -= GetAirportNoiseLevelForTown(afc, nearest->xy, tile);
|
|
|
|
|
|
st->rect.AfterRemoveRect(st, tile, w, h);
|
|
|
|
|
|
st->airport_tile = INVALID_TILE;
|
|
|
st->facilities &= ~FACIL_AIRPORT;
|
|
|
|
|
|
InvalidateWindowWidget(WC_STATION_VIEW, st->index, SVW_PLANES);
|
|
|
|
|
|
if (_settings_game.economy.station_noise_level) {
|
|
|
InvalidateWindow(WC_TOWN_VIEW, st->town->index);
|
|
|
}
|
|
|
|
|
|
UpdateStationVirtCoordDirty(st);
|
|
|
st->RecomputeIndustriesNear();
|
|
|
DeleteStationIfEmpty(st);
|
|
|
}
|
|
|
|
|
|
return cost;
|
|
|
}
|
|
|
|
|
|
/** Build a buoy.
|
|
|
* @param tile tile where to place the bouy
|
|
|
* @param flags operation to perform
|
|
|
* @param p1 unused
|