From 419ca91e59c0acadd1ce5a0cb96eb919f8957966 Mon Sep 17 00:00:00 2001 From: J0anJosep Date: Thu, 31 Dec 2020 12:30:17 +0100 Subject: [PATCH] Add: Reservation and penalties for extended depots. --- src/pathfinder/yapf/yapf_rail.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp index 8d7e55267e..d88e88110f 100644 --- a/src/pathfinder/yapf/yapf_rail.cpp +++ b/src/pathfinder/yapf/yapf_rail.cpp @@ -86,6 +86,23 @@ private: return true; } + /** Reserve a railway platform. Tile contains the failed tile on abort. */ + bool ReserveRailDepotPlatform(TileIndex &tile, DiagDirection dir) + { + assert(IsExtendedRailDepotTile(tile)); + TileIndex start = tile; + TileIndexDiff diff = TileOffsByDiagDir(dir); + + do { + if (HasDepotReservation(tile)) return false; + SetDepotReservation(tile, true); + MarkTileDirtyByTile(tile); + tile = TileAdd(tile, diff); + } while (IsCompatibleTrainDepotTile(tile, start) && tile != m_origin_tile); + + return true; + } + /** Try to reserve a single track/platform. */ bool ReserveSingleTrack(TileIndex tile, Trackdir td) { @@ -95,6 +112,12 @@ private: m_res_fail_tile = tile; m_res_fail_td = td; } + } else if (IsExtendedRailDepotTile(tile)) { + if (!ReserveRailDepotPlatform(tile, TrackdirToExitdir(ReverseTrackdir(td)))) { + /* Platform could not be reserved, undo. */ + m_res_fail_tile = tile; + m_res_fail_td = td; + } } else { if (!TryReserveRailTrack(tile, TrackdirToTrack(td))) { /* Tile couldn't be reserved, undo. */ @@ -117,6 +140,13 @@ private: SetRailStationReservation(tile, false); tile = TileAdd(tile, diff); } + } else if (IsExtendedRailDepotTile(tile)) { + TileIndex start = tile; + TileIndexDiff diff = TileOffsByDiagDir(TrackdirToExitdir(ReverseTrackdir(td))); + while ((tile != m_res_fail_tile || td != m_res_fail_td) && IsCompatibleTrainDepotTile(tile, start)) { + SetDepotReservation(tile, false); + tile = TileAdd(tile, diff); + } } else if (tile != m_res_fail_tile || td != m_res_fail_td) { UnreserveRailTrack(tile, TrackdirToTrack(td)); }