1
0
Fork 0

Add: Reservation and penalties for extended depots.

pull/8480/head
J0anJosep 2020-12-31 12:30:17 +01:00
parent 30a62aa2b5
commit 419ca91e59
1 changed files with 30 additions and 0 deletions

View File

@ -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));
}