diff --git a/src/script/api/script_airport.cpp b/src/script/api/script_airport.cpp index b1edbec48d..c0b28408c7 100644 --- a/src/script/api/script_airport.cpp +++ b/src/script/api/script_airport.cpp @@ -139,7 +139,7 @@ if (_settings_game.economy.station_noise_level) { AirportTileTableIterator it(as->table[0], tile); uint dist; - AirportGetNearestTown(as, it, dist); + AirportGetNearestTown(as, tile, it, dist); return GetAirportNoiseLevelForDistance(as, dist); } @@ -155,7 +155,7 @@ if (!as->IsWithinMapBounds(0, tile)) return INVALID_TOWN; uint dist; - return AirportGetNearestTown(as, AirportTileTableIterator(as->table[0], tile), dist)->index; + return AirportGetNearestTown(as, tile, AirportTileTableIterator(as->table[0], tile), dist)->index; } /* static */ SQInteger ScriptAirport::GetMaintenanceCostFactor(AirportType type) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 0444a3feed..619bf02aea 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2303,18 +2303,19 @@ uint8_t GetAirportNoiseLevelForDistance(const AirportSpec *as, uint distance) * Finds the town nearest to given airport. Based on minimal manhattan distance to any airport's tile. * If two towns have the same distance, town with lower index is returned. * @param as airport's description + * @param tile origin tile (top corner of the airport) * @param it An iterator over all airport tiles * @param[out] mindist Minimum distance to town * @return nearest town to airport */ -Town *AirportGetNearestTown(const AirportSpec *as, const TileIterator &it, uint &mindist) +Town *AirportGetNearestTown(const AirportSpec *as, TileIndex tile, const TileIterator &it, uint &mindist) { assert(Town::GetNumItems() > 0); Town *nearest = nullptr; - uint perimeter_min_x = TileX(it); - uint perimeter_min_y = TileY(it); + uint perimeter_min_x = TileX(tile); + uint perimeter_min_y = TileY(tile); uint perimeter_max_x = perimeter_min_x + as->size_x - 1; uint perimeter_max_y = perimeter_min_y + as->size_y - 1; @@ -2322,6 +2323,8 @@ Town *AirportGetNearestTown(const AirportSpec *as, const TileIterator &it, uint std::unique_ptr copy(it.Clone()); for (TileIndex cur_tile = *copy; cur_tile != INVALID_TILE; cur_tile = ++*copy) { + assert(IsInsideBS(TileX(cur_tile), perimeter_min_x, as->size_x)); + assert(IsInsideBS(TileY(cur_tile), perimeter_min_y, as->size_y)); if (TileX(cur_tile) == perimeter_min_x || TileX(cur_tile) == perimeter_max_x || TileY(cur_tile) == perimeter_min_y || TileY(cur_tile) == perimeter_max_y) { Town *t = CalcClosestTownFromTile(cur_tile, mindist + 1); if (t == nullptr) continue; @@ -2349,7 +2352,7 @@ void UpdateAirportsNoise() const AirportSpec *as = st->airport.GetSpec(); AirportTileIterator it(st); uint dist; - Town *nearest = AirportGetNearestTown(as, it, dist); + Town *nearest = AirportGetNearestTown(as, st->airport.tile, it, dist); nearest->noise_reached += GetAirportNoiseLevelForDistance(as, dist); } } @@ -2399,7 +2402,7 @@ CommandCost CmdBuildAirport(DoCommandFlag flags, TileIndex tile, byte airport_ty /* The noise level is the noise from the airport and reduce it to account for the distance to the town center. */ uint dist; - Town *nearest = AirportGetNearestTown(as, tile_iter, dist); + Town *nearest = AirportGetNearestTown(as, tile, tile_iter, dist); uint newnoise_level = GetAirportNoiseLevelForDistance(as, dist); /* Check if local auth would allow a new airport */ @@ -2527,7 +2530,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags) * need of recalculation */ AirportTileIterator it(st); uint dist; - Town *nearest = AirportGetNearestTown(as, it, dist); + Town *nearest = AirportGetNearestTown(as, st->airport.tile, it, dist); nearest->noise_reached -= GetAirportNoiseLevelForDistance(as, dist); if (_settings_game.economy.station_noise_level) { diff --git a/src/station_cmd.h b/src/station_cmd.h index 9359daf453..38f393fd00 100644 --- a/src/station_cmd.h +++ b/src/station_cmd.h @@ -16,7 +16,7 @@ enum StationClassID : byte; enum RoadStopClassID : byte; -extern Town *AirportGetNearestTown(const struct AirportSpec *as, const TileIterator &it, uint &mindist); +extern Town *AirportGetNearestTown(const struct AirportSpec *as, TileIndex tile, const TileIterator &it, uint &mindist); extern uint8_t GetAirportNoiseLevelForDistance(const struct AirportSpec *as, uint distance); CommandCost CmdBuildAirport(DoCommandFlag flags, TileIndex tile, byte airport_type, byte layout, StationID station_to_join, bool allow_adjacent);