Index: src/rail_cmd.cpp =================================================================== --- src/rail_cmd.cpp (wersja 26262) +++ src/rail_cmd.cpp (kopia robocza) @@ -1515,16 +1515,19 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) { RailType totype = Extract(p2); + TileIndex area_start = p1; + TileIndex area_end = tile; + bool diagonal = HasBit(p2, 4); if (!ValParamRailtype(totype)) return CMD_ERROR; - if (p1 >= MapSize()) return CMD_ERROR; + if (area_start >= MapSize()) return CMD_ERROR; TrainList affected_trains; CommandCost cost(EXPENSES_CONSTRUCTION); CommandCost error = CommandCost(STR_ERROR_NO_SUITABLE_RAILROAD_TRACK); // by default, there is no track to convert. - TileArea ta(tile, p1); - TileIterator *iter = HasBit(p2, 4) ? (TileIterator *)new DiagonalTileIterator(tile, p1) : new OrthogonalTileIterator(ta); + + TileIterator *iter = diagonal ? (TileIterator *)new DiagonalTileIterator(area_start, area_end) : new OrthogonalTileIterator(TileArea(area_start, area_end)); for (; (tile = *iter) != INVALID_TILE; ++(*iter)) { TileType tt = GetTileType(tile); @@ -1639,8 +1642,21 @@ /* If both ends of tunnel/bridge are in the range, do not try to convert twice - * it would cause assert because of different test and exec runs */ - if (endtile < tile && TileX(endtile) >= TileX(ta.tile) && TileX(endtile) < TileX(ta.tile) + ta.w && - TileY(endtile) >= TileY(ta.tile) && TileY(endtile) < TileY(ta.tile) + ta.h) continue; + if (endtile < tile) { + if (diagonal) { + int a = TileY(endtile) + TileX(endtile); + int b = TileY(endtile) - TileX(endtile); + int start_a = TileY(area_start) + TileX(area_start); + int start_b = TileY(area_start) - TileX(area_start); + int end_a = TileY(area_end) + TileX(area_end); + int end_b = TileY(area_end) - TileX(area_end); + if (start_a > end_a) Swap(start_a, end_a); + if (start_b > end_b) Swap(start_b, end_b); + if (a >= start_a && a <= end_a && b >= start_b && b <= end_b) continue; + } else { + if (TileArea(area_start, area_end).Contains(endtile)) continue; + } + } /* When not converting rail <-> el. rail, any vehicle cannot be in tunnel/bridge */ if (!IsCompatibleRail(GetRailType(tile), totype)) {