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

pull/306/head
Jonathan G Rennison 3 years ago
parent 93c23b4096
commit 55c4fe7d45

@ -423,7 +423,7 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra
if (lookahead != nullptr) {
lookahead->reservation_end_position += (DistanceManhattan(tile, end) - 1) * TILE_SIZE;
}
Trackdir end_trackdir = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(end)), ReverseDiagDir(GetTunnelBridgeDirection(end)));
Trackdir end_trackdir = GetTunnelBridgeExitTrackdir(end);
if (lookahead != nullptr) {
if ((flags & FRF_TB_EXIT_FREE) && GetTunnelBridgeLength(tile, end) > 1) {
/* middle part of bridge is in wormhole direction */
@ -444,7 +444,7 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra
if (HasAcrossTunnelBridgeReservation(end) && TunnelBridgeIsFree(tile, end, nullptr, true).Succeeded()) {
/* skip far end */
tile = end;
trackdir = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(tile)), ReverseDiagDir(GetTunnelBridgeDirection(tile)));
trackdir = GetTunnelBridgeExitTrackdir(tile);
return true;
}
}
@ -697,8 +697,7 @@ PBSTileInfo FollowTrainReservation(const Train *v, Vehicle **train_on_res, Follo
TileIndex exit_tile = GetOtherTunnelBridgeEnd(tile);
if (IsTunnelBridgeSignalSimulationExit(exit_tile) && GetTunnelBridgeExitSignalState(exit_tile) == SIGNAL_STATE_GREEN && HasAcrossTunnelBridgeReservation(exit_tile)) {
tile = exit_tile;
DiagDirection exit_dir = ReverseDiagDir(GetTunnelBridgeDirection(exit_tile));
trackdir = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(exit_tile)), exit_dir);
trackdir = GetTunnelBridgeExitTrackdir(exit_tile);
}
}
} else {
@ -839,7 +838,7 @@ void TryCreateLookAheadForTrainInTunnelBridge(Train *t)
/* going in the right direction, allocate a new lookahead */
t->lookahead.reset(new TrainReservationLookAhead());
t->lookahead->reservation_end_tile = t->tile;
t->lookahead->reservation_end_trackdir = TrackExitdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(t->tile)), GetTunnelBridgeDirection(t->tile));
t->lookahead->reservation_end_trackdir = GetTunnelBridgeEntranceTrackdir(t->tile);
t->lookahead->reservation_end_z = t->z_pos;
t->lookahead->current_position = 0;
t->lookahead->tunnel_bridge_reserved_tiles = DistanceManhattan(t->tile, TileVirtXY(t->x_pos, t->y_pos));

@ -445,7 +445,7 @@ static SigInfo ExploreSegment(Owner owner)
info.flags |= SF_FULL;
return info;
}
Trackdir exit_track = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(tile)), ReverseDiagDir(tunnel_bridge_dir));
Trackdir exit_track = GetTunnelBridgeExitTrackdir(tile, tunnel_bridge_dir);
exitdir = TrackdirToExitdir(exit_track);
enterdir = ReverseDiagDir(exitdir);
tile += TileOffsByDiagDir(exitdir); // just skip to next tile

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

@ -506,6 +506,26 @@ static inline void SetTunnelBridgePBS(TileIndex t, bool is_pbs)
SB(_me[t].m6, 6, 1, is_pbs ? 1 : 0);
}
static inline Trackdir GetTunnelBridgeExitTrackdir(TileIndex t, DiagDirection tunnel_bridge_dir)
{
return TrackEnterdirToTrackdir((Track)FIND_FIRST_BIT(GetAcrossTunnelBridgeTrackBits(t)), ReverseDiagDir(tunnel_bridge_dir));
}
static inline Trackdir GetTunnelBridgeExitTrackdir(TileIndex t)
{
return GetTunnelBridgeExitTrackdir(t, GetTunnelBridgeDirection(t));
}
static inline Trackdir GetTunnelBridgeEntranceTrackdir(TileIndex t, DiagDirection tunnel_bridge_dir)
{
return TrackExitdirToTrackdir((Track)FIND_FIRST_BIT(GetAcrossTunnelBridgeTrackBits(t)), tunnel_bridge_dir);
}
static inline Trackdir GetTunnelBridgeEntranceTrackdir(TileIndex t)
{
return GetTunnelBridgeEntranceTrackdir(t, GetTunnelBridgeDirection(t));
}
void AddRailTunnelBridgeInfrastructure(Company *c, TileIndex begin, TileIndex end);
void SubtractRailTunnelBridgeInfrastructure(Company *c, TileIndex begin, TileIndex end);
void AddRailTunnelBridgeInfrastructure(TileIndex begin, TileIndex end);

Loading…
Cancel
Save