|
|
|
@ -2473,7 +2473,7 @@ static void CheckNextTrainTile(Train *v)
|
|
|
|
|
if (HasPbsSignalOnTrackdir(ft.m_new_tile, FindFirstTrackdir(ft.m_new_td_bits))) {
|
|
|
|
|
/* If the next tile is a PBS signal, try to make a reservation. */
|
|
|
|
|
TrackBits tracks = TrackdirBitsToTrackBits(ft.m_new_td_bits);
|
|
|
|
|
if (ft.m_tiles_skipped == 0 && Rail90DegTurnDisallowed(GetTileRailType(ft.m_old_tile), GetTileRailType(ft.m_new_tile))) {
|
|
|
|
|
if (ft.m_tiles_skipped == 0 && Rail90DegTurnDisallowedTilesFromTrackdir(ft.m_old_tile, ft.m_new_tile, ft.m_old_td)) {
|
|
|
|
|
tracks &= ~TrackCrossesTracks(TrackdirToTrack(ft.m_old_td));
|
|
|
|
|
}
|
|
|
|
|
ChooseTrainTrack(v, ft.m_new_tile, ft.m_exitdir, tracks, false, nullptr, false);
|
|
|
|
@ -2803,7 +2803,7 @@ static PBSTileInfo ExtendTrainReservation(const Train *v, const PBSTileInfo &ori
|
|
|
|
|
if (HasOnewaySignalBlockingTrackdir(ft.m_new_tile, FindFirstTrackdir(ft.m_new_td_bits))) break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ft.m_tiles_skipped == 0 && Rail90DegTurnDisallowed(GetTileRailType(ft.m_old_tile), GetTileRailType(ft.m_new_tile))) {
|
|
|
|
|
if (ft.m_tiles_skipped == 0 && Rail90DegTurnDisallowedTilesFromTrackdir(ft.m_old_tile, ft.m_new_tile, ft.m_old_td)) {
|
|
|
|
|
ft.m_new_td_bits &= ~TrackdirCrossesTrackdirs(ft.m_old_td);
|
|
|
|
|
if (ft.m_new_td_bits == TRACKDIR_BIT_NONE) break;
|
|
|
|
|
}
|
|
|
|
@ -2865,7 +2865,7 @@ static PBSTileInfo ExtendTrainReservation(const Train *v, const PBSTileInfo &ori
|
|
|
|
|
while (tile != stopped || cur_td != stopped_td) {
|
|
|
|
|
if (!ft.Follow(tile, cur_td)) break;
|
|
|
|
|
|
|
|
|
|
if (ft.m_tiles_skipped == 0 && Rail90DegTurnDisallowed(GetTileRailType(ft.m_old_tile), GetTileRailType(ft.m_new_tile))) {
|
|
|
|
|
if (ft.m_tiles_skipped == 0 && Rail90DegTurnDisallowedTilesFromTrackdir(ft.m_old_tile, ft.m_new_tile, ft.m_old_td)) {
|
|
|
|
|
ft.m_new_td_bits &= ~TrackdirCrossesTrackdirs(ft.m_old_td);
|
|
|
|
|
assert(ft.m_new_td_bits != TRACKDIR_BIT_NONE);
|
|
|
|
|
}
|
|
|
|
@ -3153,7 +3153,7 @@ static Track ChooseTrainTrack(Train *v, TileIndex tile, DiagDirection enterdir,
|
|
|
|
|
DiagDirection exitdir = TrackdirToExitdir(res_dest.trackdir);
|
|
|
|
|
TileIndex next_tile = TileAddByDiagDir(res_dest.tile, exitdir);
|
|
|
|
|
TrackBits reachable = TrackdirBitsToTrackBits((TrackdirBits)(GetTileTrackStatus(next_tile, TRANSPORT_RAIL, 0))) & DiagdirReachesTracks(exitdir);
|
|
|
|
|
if (Rail90DegTurnDisallowed(GetTileRailType(res_dest.tile), GetTileRailType(next_tile))) {
|
|
|
|
|
if (Rail90DegTurnDisallowedTilesFromDiagDir(res_dest.tile, next_tile, exitdir)) {
|
|
|
|
|
reachable &= ~TrackCrossesTracks(TrackdirToTrack(res_dest.trackdir));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3264,7 +3264,7 @@ bool TryPathReserve(Train *v, bool mark_as_stuck, bool first_tile_okay)
|
|
|
|
|
TileIndex new_tile = TileAddByDiagDir(origin.tile, exitdir);
|
|
|
|
|
TrackBits reachable = TrackdirBitsToTrackBits(TrackStatusToTrackdirBits(GetTileTrackStatus(new_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTrackdirs(exitdir));
|
|
|
|
|
|
|
|
|
|
if (Rail90DegTurnDisallowed(GetTileRailType(origin.tile), GetTileRailType(new_tile))) reachable &= ~TrackCrossesTracks(TrackdirToTrack(origin.trackdir));
|
|
|
|
|
if (Rail90DegTurnDisallowedTilesFromDiagDir(origin.tile, new_tile, exitdir)) reachable &= ~TrackCrossesTracks(TrackdirToTrack(origin.trackdir));
|
|
|
|
|
|
|
|
|
|
bool res_made = false;
|
|
|
|
|
ChooseTrainTrack(v, new_tile, exitdir, reachable, true, &res_made, mark_as_stuck);
|
|
|
|
@ -3942,7 +3942,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse)
|
|
|
|
|
TrackBits red_signals = TrackdirBitsToTrackBits(TrackStatusToRedSignals(ts) & reachable_trackdirs);
|
|
|
|
|
|
|
|
|
|
TrackBits bits = TrackdirBitsToTrackBits(trackdirbits);
|
|
|
|
|
if (Rail90DegTurnDisallowed(GetTileRailType(gp.old_tile), GetTileRailType(gp.new_tile)) && prev == nullptr) {
|
|
|
|
|
if (Rail90DegTurnDisallowedTilesFromDiagDir(gp.old_tile, gp.new_tile, enterdir) && prev == nullptr) {
|
|
|
|
|
/* We allow wagons to make 90 deg turns, because forbid_90_deg
|
|
|
|
|
* can be switched on halfway a turn */
|
|
|
|
|
if (!(v->track & TRACK_BIT_WORMHOLE)) {
|
|
|
|
@ -4746,7 +4746,7 @@ static bool TrainCheckIfLineEnds(Train *v, bool reverse)
|
|
|
|
|
|
|
|
|
|
/* mask unreachable track bits if we are forbidden to do 90deg turns */
|
|
|
|
|
TrackBits bits = TrackdirBitsToTrackBits(trackdirbits);
|
|
|
|
|
if (Rail90DegTurnDisallowed(GetTileRailType(v->tile), GetTileRailType(tile))) {
|
|
|
|
|
if (Rail90DegTurnDisallowedTilesFromDiagDir(v->tile, tile, dir)) {
|
|
|
|
|
bits &= ~TrackCrossesTracks(FindFirstTrack(v->track));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|