|
|
|
@ -2793,7 +2793,7 @@ void ReverseTrainDirection(Train *v)
|
|
|
|
|
DiagDirection axial_dir = DirToDiagDirAlongAxis(v->direction, axis);
|
|
|
|
|
TileIndex next_tile = TileVirtXY(v->x_pos, v->y_pos) + TileOffsByDiagDir(axial_dir);
|
|
|
|
|
if ((!no_near_end_unreserve && next_tile == v->tile) || (!no_far_end_unreserve && next_tile == GetOtherTunnelBridgeEnd(v->tile))) {
|
|
|
|
|
Trackdir exit_td = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(next_tile)), ReverseDiagDir(GetTunnelBridgeDirection(next_tile)));
|
|
|
|
|
Trackdir exit_td = GetTunnelBridgeExitTrackdir(next_tile);
|
|
|
|
|
CFollowTrackRail ft(GetTileOwner(next_tile), GetRailTypeInfo(v->railtype)->all_compatible_railtypes);
|
|
|
|
|
if (ft.Follow(next_tile, exit_td)) {
|
|
|
|
|
TrackdirBits reserved = ft.m_new_td_bits & TrackBitsToTrackdirBits(GetReservedTrackbits(ft.m_new_tile));
|
|
|
|
@ -3968,8 +3968,7 @@ static void TryLongReserveChooseTrainTrack(Train *v, TileIndex tile, Trackdir td
|
|
|
|
|
TileIndex exit_tile = long_enough ? INVALID_TILE : CheckLongReservePbsTunnelBridgeOnTrackdir(v, tile, td);
|
|
|
|
|
if (exit_tile != INVALID_TILE) {
|
|
|
|
|
CFollowTrackRail ft(v);
|
|
|
|
|
DiagDirection exit_dir = ReverseDiagDir(GetTunnelBridgeDirection(exit_tile));
|
|
|
|
|
Trackdir exit_td = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(exit_tile)), exit_dir);
|
|
|
|
|
Trackdir exit_td = GetTunnelBridgeExitTrackdir(exit_tile);
|
|
|
|
|
if (ft.Follow(exit_tile, exit_td)) {
|
|
|
|
|
const TrackBits reserved_bits = GetReservedTrackbits(ft.m_new_tile);
|
|
|
|
|
if ((ft.m_new_td_bits & TrackBitsToTrackdirBits(reserved_bits)) == TRACKDIR_BIT_NONE) {
|
|
|
|
@ -4901,7 +4900,7 @@ static bool CheckTrainStayInWormHolePathReserve(Train *t, TileIndex tile)
|
|
|
|
|
if (mark_dirty) MarkTileDirtyByTile(tile, VMDF_NOT_MAP_MODE);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Trackdir td = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(tile)), ReverseDiagDir(GetTunnelBridgeDirection(tile)));
|
|
|
|
|
Trackdir td = GetTunnelBridgeExitTrackdir(tile);
|
|
|
|
|
CFollowTrackRail ft(GetTileOwner(tile), GetRailTypeInfo(t->railtype)->all_compatible_railtypes);
|
|
|
|
|
|
|
|
|
|
if (ft.Follow(tile, td)) {
|
|
|
|
@ -4995,7 +4994,7 @@ static bool CheckTrainStayInWormHole(Train *t, TileIndex tile)
|
|
|
|
|
SigSegState seg_state = (_settings_game.pf.reserve_paths || IsTunnelBridgeEffectivelyPBS(tile)) ? SIGSEG_PBS : UpdateSignalsOnSegment(tile, INVALID_DIAGDIR, t->owner);
|
|
|
|
|
if (seg_state != SIGSEG_PBS) {
|
|
|
|
|
CFollowTrackRail ft(GetTileOwner(tile), GetRailTypeInfo(t->railtype)->all_compatible_railtypes);
|
|
|
|
|
if (ft.Follow(tile, TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(tile)), ReverseDiagDir(GetTunnelBridgeDirection(tile))))) {
|
|
|
|
|
if (ft.Follow(tile, GetTunnelBridgeExitTrackdir(tile))) {
|
|
|
|
|
if (ft.m_new_td_bits != TRACKDIR_BIT_NONE && KillFirstBit(ft.m_new_td_bits) == TRACKDIR_BIT_NONE) {
|
|
|
|
|
Trackdir td = FindFirstTrackdir(ft.m_new_td_bits);
|
|
|
|
|
if (HasPbsSignalOnTrackdir(ft.m_new_tile, td)) {
|
|
|
|
|