(svn r23461) -Fix: handle a missing airport newgrf as graceful as possible by not crashing when loading such savegame or when an airport is removed

This commit is contained in:
yexo
2011-12-09 19:30:30 +00:00
parent 42c4fdf9ab
commit c9be5d50da
5 changed files with 118 additions and 38 deletions

View File

@@ -127,16 +127,17 @@
/* static */ int ScriptAirport::GetNoiseLevelIncrease(TileIndex tile, AirportType type)
{
extern Town *AirportGetNearestTown(const AirportSpec *as, byte layout, TileIndex airport_tile);
extern uint8 GetAirportNoiseLevelForTown(const AirportSpec *as, byte layout, TileIndex town_tile, TileIndex tile);
extern Town *AirportGetNearestTown(const AirportSpec *as, const TileIterator &it);
extern uint8 GetAirportNoiseLevelForTown(const AirportSpec *as, TileIterator &it, TileIndex town_tile);
if (!::IsValidTile(tile)) return -1;
if (!IsAirportInformationAvailable(type)) return -1;
if (_settings_game.economy.station_noise_level) {
const AirportSpec *as = ::AirportSpec::Get(type);
const Town *t = AirportGetNearestTown(as, 0, tile);
return GetAirportNoiseLevelForTown(as, 0, t->xy, tile);
AirportTileTableIterator it(as->table[0], tile);
const Town *t = AirportGetNearestTown(as, it);
return GetAirportNoiseLevelForTown(as, it, t->xy);
}
return 1;
@@ -144,12 +145,13 @@
/* static */ TownID ScriptAirport::GetNearestTown(TileIndex tile, AirportType type)
{
extern Town *AirportGetNearestTown(const AirportSpec *as, byte layout, TileIndex airport_tile);
extern Town *AirportGetNearestTown(const AirportSpec *as, const TileIterator &it);
if (!::IsValidTile(tile)) return INVALID_TOWN;
if (!IsAirportInformationAvailable(type)) return INVALID_TOWN;
return AirportGetNearestTown(AirportSpec::Get(type), 0, tile)->index;
const AirportSpec *as = AirportSpec::Get(type);
return AirportGetNearestTown(as, AirportTileTableIterator(as->table[0], tile))->index;
}
/* static */ uint16 ScriptAirport::GetMaintenanceCostFactor(AirportType type)