Add helper functions to get tunnel/bridge entrance/exit trackdirs
This commit is contained in:
@@ -423,7 +423,7 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra
|
|||||||
if (lookahead != nullptr) {
|
if (lookahead != nullptr) {
|
||||||
lookahead->reservation_end_position += (DistanceManhattan(tile, end) - 1) * TILE_SIZE;
|
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 (lookahead != nullptr) {
|
||||||
if ((flags & FRF_TB_EXIT_FREE) && GetTunnelBridgeLength(tile, end) > 1) {
|
if ((flags & FRF_TB_EXIT_FREE) && GetTunnelBridgeLength(tile, end) > 1) {
|
||||||
/* middle part of bridge is in wormhole direction */
|
/* 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()) {
|
if (HasAcrossTunnelBridgeReservation(end) && TunnelBridgeIsFree(tile, end, nullptr, true).Succeeded()) {
|
||||||
/* skip far end */
|
/* skip far end */
|
||||||
tile = end;
|
tile = end;
|
||||||
trackdir = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(tile)), ReverseDiagDir(GetTunnelBridgeDirection(tile)));
|
trackdir = GetTunnelBridgeExitTrackdir(tile);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -697,8 +697,7 @@ PBSTileInfo FollowTrainReservation(const Train *v, Vehicle **train_on_res, Follo
|
|||||||
TileIndex exit_tile = GetOtherTunnelBridgeEnd(tile);
|
TileIndex exit_tile = GetOtherTunnelBridgeEnd(tile);
|
||||||
if (IsTunnelBridgeSignalSimulationExit(exit_tile) && GetTunnelBridgeExitSignalState(exit_tile) == SIGNAL_STATE_GREEN && HasAcrossTunnelBridgeReservation(exit_tile)) {
|
if (IsTunnelBridgeSignalSimulationExit(exit_tile) && GetTunnelBridgeExitSignalState(exit_tile) == SIGNAL_STATE_GREEN && HasAcrossTunnelBridgeReservation(exit_tile)) {
|
||||||
tile = exit_tile;
|
tile = exit_tile;
|
||||||
DiagDirection exit_dir = ReverseDiagDir(GetTunnelBridgeDirection(exit_tile));
|
trackdir = GetTunnelBridgeExitTrackdir(exit_tile);
|
||||||
trackdir = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(exit_tile)), exit_dir);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -839,7 +838,7 @@ void TryCreateLookAheadForTrainInTunnelBridge(Train *t)
|
|||||||
/* going in the right direction, allocate a new lookahead */
|
/* going in the right direction, allocate a new lookahead */
|
||||||
t->lookahead.reset(new TrainReservationLookAhead());
|
t->lookahead.reset(new TrainReservationLookAhead());
|
||||||
t->lookahead->reservation_end_tile = t->tile;
|
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->reservation_end_z = t->z_pos;
|
||||||
t->lookahead->current_position = 0;
|
t->lookahead->current_position = 0;
|
||||||
t->lookahead->tunnel_bridge_reserved_tiles = DistanceManhattan(t->tile, TileVirtXY(t->x_pos, t->y_pos));
|
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;
|
info.flags |= SF_FULL;
|
||||||
return info;
|
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);
|
exitdir = TrackdirToExitdir(exit_track);
|
||||||
enterdir = ReverseDiagDir(exitdir);
|
enterdir = ReverseDiagDir(exitdir);
|
||||||
tile += TileOffsByDiagDir(exitdir); // just skip to next tile
|
tile += TileOffsByDiagDir(exitdir); // just skip to next tile
|
||||||
|
@@ -2793,7 +2793,7 @@ void ReverseTrainDirection(Train *v)
|
|||||||
DiagDirection axial_dir = DirToDiagDirAlongAxis(v->direction, axis);
|
DiagDirection axial_dir = DirToDiagDirAlongAxis(v->direction, axis);
|
||||||
TileIndex next_tile = TileVirtXY(v->x_pos, v->y_pos) + TileOffsByDiagDir(axial_dir);
|
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))) {
|
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);
|
CFollowTrackRail ft(GetTileOwner(next_tile), GetRailTypeInfo(v->railtype)->all_compatible_railtypes);
|
||||||
if (ft.Follow(next_tile, exit_td)) {
|
if (ft.Follow(next_tile, exit_td)) {
|
||||||
TrackdirBits reserved = ft.m_new_td_bits & TrackBitsToTrackdirBits(GetReservedTrackbits(ft.m_new_tile));
|
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);
|
TileIndex exit_tile = long_enough ? INVALID_TILE : CheckLongReservePbsTunnelBridgeOnTrackdir(v, tile, td);
|
||||||
if (exit_tile != INVALID_TILE) {
|
if (exit_tile != INVALID_TILE) {
|
||||||
CFollowTrackRail ft(v);
|
CFollowTrackRail ft(v);
|
||||||
DiagDirection exit_dir = ReverseDiagDir(GetTunnelBridgeDirection(exit_tile));
|
Trackdir exit_td = GetTunnelBridgeExitTrackdir(exit_tile);
|
||||||
Trackdir exit_td = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(exit_tile)), exit_dir);
|
|
||||||
if (ft.Follow(exit_tile, exit_td)) {
|
if (ft.Follow(exit_tile, exit_td)) {
|
||||||
const TrackBits reserved_bits = GetReservedTrackbits(ft.m_new_tile);
|
const TrackBits reserved_bits = GetReservedTrackbits(ft.m_new_tile);
|
||||||
if ((ft.m_new_td_bits & TrackBitsToTrackdirBits(reserved_bits)) == TRACKDIR_BIT_NONE) {
|
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);
|
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);
|
CFollowTrackRail ft(GetTileOwner(tile), GetRailTypeInfo(t->railtype)->all_compatible_railtypes);
|
||||||
|
|
||||||
if (ft.Follow(tile, td)) {
|
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);
|
SigSegState seg_state = (_settings_game.pf.reserve_paths || IsTunnelBridgeEffectivelyPBS(tile)) ? SIGSEG_PBS : UpdateSignalsOnSegment(tile, INVALID_DIAGDIR, t->owner);
|
||||||
if (seg_state != SIGSEG_PBS) {
|
if (seg_state != SIGSEG_PBS) {
|
||||||
CFollowTrackRail ft(GetTileOwner(tile), GetRailTypeInfo(t->railtype)->all_compatible_railtypes);
|
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) {
|
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);
|
Trackdir td = FindFirstTrackdir(ft.m_new_td_bits);
|
||||||
if (HasPbsSignalOnTrackdir(ft.m_new_tile, td)) {
|
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);
|
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 AddRailTunnelBridgeInfrastructure(Company *c, TileIndex begin, TileIndex end);
|
||||||
void SubtractRailTunnelBridgeInfrastructure(Company *c, TileIndex begin, TileIndex end);
|
void SubtractRailTunnelBridgeInfrastructure(Company *c, TileIndex begin, TileIndex end);
|
||||||
void AddRailTunnelBridgeInfrastructure(TileIndex begin, TileIndex end);
|
void AddRailTunnelBridgeInfrastructure(TileIndex begin, TileIndex end);
|
||||||
|
Reference in New Issue
Block a user