Add helper functions to get tunnel/bridge entrance/exit trackdirs

This commit is contained in:
Jonathan G Rennison
2021-08-27 18:30:21 +01:00
parent 93c23b4096
commit 55c4fe7d45
4 changed files with 29 additions and 11 deletions

View File

@@ -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)) {