From f0e478e01569b8a7ee024366df6a791cc2e202c2 Mon Sep 17 00:00:00 2001 From: dP Date: Mon, 8 Nov 2021 21:16:16 +0300 Subject: [PATCH] Fix #12: Crash when rail blueprint is out of map bounds --- src/citymania/cm_blueprint.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/citymania/cm_blueprint.cpp b/src/citymania/cm_blueprint.cpp index b48ec7d5c6..64b53b75e3 100644 --- a/src/citymania/cm_blueprint.cpp +++ b/src/citymania/cm_blueprint.cpp @@ -111,7 +111,9 @@ CommandContainer GetBlueprintCommand(TileIndex start, const Blueprint::Item &ite auto end_tile = start_tile; auto tdir = item.u.rail.track.start_dir; for (auto i = 1; i < item.u.rail.track.length; i++) { - end_tile = TileAddByDiagDir(end_tile, TrackdirToExitdir(tdir)); + auto new_tile = AddTileIndexDiffCWrap(end_tile, TileIndexDiffCByDiagDir(TrackdirToExitdir(tdir))); + if (new_tile == INVALID_TILE) break; + end_tile = new_tile; tdir = NextTrackdir(tdir); } return CommandContainer { @@ -212,7 +214,9 @@ std::multimap Blueprint::GetTiles(TileIndex tile auto tdir = o.u.rail.track.start_dir; for (auto i = 0; i < o.u.rail.track.length; i++) { add_tile(end_tile, ObjectTileHighlight::make_rail_track(palette, TrackdirToTrack(tdir))); - end_tile = TileAddByDiagDir(end_tile, TrackdirToExitdir(tdir)); + auto new_tile = AddTileIndexDiffCWrap(end_tile, TileIndexDiffCByDiagDir(TrackdirToExitdir(tdir))); + if (new_tile == INVALID_TILE) break; + end_tile = new_tile; tdir = NextTrackdir(tdir); } break;