Mercurial > hg > openttd
changeset 20182:dcad43854ec0 draft
(svn r25132) -Fix [FS#5510, FS#5516]: station rebuilding could leave reserved tiles which caused crashes later on
author | rubidium <rubidium@openttd.org> |
---|---|
date | Sun, 31 Mar 2013 20:07:32 +0000 |
parents | 1cbdb4cc4c71 |
children | c38c3455a2c8 |
files | src/station_cmd.cpp |
diffstat | 1 files changed, 10 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1319,8 +1319,16 @@ TILE_AREA_LOOP(tile, update_reservation_area) { DiagDirection dir = AxisToDiagDir(axis); TileIndexDiff tile_offset = TileOffsByDiagDir(dir); - TileIndex platform_begin = tile - tile_offset * (st->GetPlatformLength(tile, ReverseDiagDir(dir)) - 1); - TileIndex platform_end = tile + tile_offset * (st->GetPlatformLength(tile, dir) - 1); + TileIndex platform_begin = tile; + TileIndex platform_end = tile; + + /* We can only account for tiles that are reachable from this tile, so ignore primarily blocked tiles while finding the platform begin and end. */ + for (TileIndex next_tile = platform_begin - tile_offset; IsCompatibleTrainStationTile(next_tile, platform_begin); next_tile -= tile_offset) { + platform_begin = next_tile; + } + for (TileIndex next_tile = platform_end + tile_offset; IsCompatibleTrainStationTile(next_tile, platform_end); next_tile += tile_offset) { + platform_end = next_tile; + } /* If there is at least on reservation on the platform, we reserve the whole platform. */ bool reservation = false;