Add GetTileTrackStatus wrapper for when red signals part is not needed

This commit is contained in:
Jonathan G Rennison
2023-03-04 01:50:18 +00:00
parent ae7c86c49d
commit 4ec6a99dd8
26 changed files with 56 additions and 46 deletions

View File

@@ -700,7 +700,7 @@ static bool DisasterTick_Submarine(DisasterVehicle *v)
TileIndex tile = v->tile + TileOffsByDiagDir(DirToDiagDir(v->direction)); TileIndex tile = v->tile + TileOffsByDiagDir(DirToDiagDir(v->direction));
if (IsValidTile(tile)) { if (IsValidTile(tile)) {
TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0)); TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_WATER, 0));
if (trackbits == TRACK_BIT_ALL && !Chance16(1, 90)) { if (trackbits == TRACK_BIT_ALL && !Chance16(1, 90)) {
GetNewVehiclePosResult gp = GetNewVehiclePos(v); GetNewVehiclePosResult gp = GetNewVehiclePos(v);
v->UpdatePosition(gp.x, gp.y, v->z_pos); v->UpdatePosition(gp.x, gp.y, v->z_pos);

View File

@@ -169,7 +169,7 @@ static TrackBits MaskWireBits(TileIndex t, TrackBits tracks)
TileIndex next_tile = TileAddByDiagDir(t, d); TileIndex next_tile = TileAddByDiagDir(t, d);
RailType rt = GetTileRailTypeByEntryDir(next_tile, d); RailType rt = GetTileRailTypeByEntryDir(next_tile, d);
if (rt == INVALID_RAILTYPE || !HasRailCatenary(rt) || if (rt == INVALID_RAILTYPE || !HasRailCatenary(rt) ||
((TrackStatusToTrackBits(GetTileTrackStatus(next_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTracks(d)) == TRACK_BIT_NONE && ((TrackdirBitsToTrackBits(GetTileTrackdirBits(next_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTracks(d)) == TRACK_BIT_NONE &&
(!HasStationTileRail(next_tile) || GetRailStationAxis(next_tile) != DiagDirToAxis(d) || !CanStationTileHaveWires(next_tile)))) { (!HasStationTileRail(next_tile) || GetRailStationAxis(next_tile) != DiagDirToAxis(d) || !CanStationTileHaveWires(next_tile)))) {
neighbour_tdb |= DiagdirReachesTrackdirs(ReverseDiagDir(d)); neighbour_tdb |= DiagdirReachesTrackdirs(ReverseDiagDir(d));
} }

View File

@@ -200,7 +200,7 @@ static uint32 GetRailContinuationInfo(TileIndex tile)
for (i = 0; i < lengthof(x_dir); i++, dir++, diagdir++) { for (i = 0; i < lengthof(x_dir); i++, dir++, diagdir++) {
TileIndex neighbour_tile = tile + TileOffsByDir(*dir); TileIndex neighbour_tile = tile + TileOffsByDir(*dir);
TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(neighbour_tile, TRANSPORT_RAIL, 0)); TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(neighbour_tile, TRANSPORT_RAIL, 0));
if (trackbits != TRACK_BIT_NONE) { if (trackbits != TRACK_BIT_NONE) {
/* If there is any track on the tile, set the bit in the second byte */ /* If there is any track on the tile, set the bit in the second byte */
SetBit(res, i + 8); SetBit(res, i + 8);

View File

@@ -124,9 +124,8 @@ struct CFollowTrackT
m_old_td = old_td; m_old_td = old_td;
m_err = EC_NONE; m_err = EC_NONE;
dbg_assert_tile( dbg_assert_tile(
((TrackStatusToTrackdirBits( ((GetTileTrackdirBits(m_old_tile, TT(), (IsRoadTT() && m_veh != nullptr) ? (this->IsTram() ? RTT_TRAM : RTT_ROAD) : 0)
GetTileTrackStatus(m_old_tile, TT(), (IsRoadTT() && m_veh != nullptr) ? (this->IsTram() ? RTT_TRAM : RTT_ROAD) : 0) & TrackdirToTrackdirBits(m_old_td)) != 0) ||
) & TrackdirToTrackdirBits(m_old_td)) != 0) ||
(IsTram() && GetSingleTramBit(m_old_tile) != INVALID_DIAGDIR), // Disable the assertion for single tram bits (IsTram() && GetSingleTramBit(m_old_tile) != INVALID_DIAGDIR), // Disable the assertion for single tram bits
m_old_tile m_old_tile
); );
@@ -243,7 +242,7 @@ protected:
} else if (IsRoadTT()) { } else if (IsRoadTT()) {
m_new_td_bits = GetTrackdirBitsForRoad(m_new_tile, this->IsTram() ? RTT_TRAM : RTT_ROAD); m_new_td_bits = GetTrackdirBitsForRoad(m_new_tile, this->IsTram() ? RTT_TRAM : RTT_ROAD);
} else { } else {
m_new_td_bits = TrackStatusToTrackdirBits(GetTileTrackStatus(m_new_tile, TT(), 0)); m_new_td_bits = GetTileTrackdirBits(m_new_tile, TT(), 0);
} }
return (m_new_td_bits != TRACKDIR_BIT_NONE); return (m_new_td_bits != TRACKDIR_BIT_NONE);
} }

View File

@@ -834,7 +834,7 @@ static bool CanEnterTile(TileIndex tile, DiagDirection dir, AyStarUserData *user
*/ */
static TrackdirBits GetDriveableTrackdirBits(TileIndex dst_tile, TileIndex src_tile, Trackdir src_trackdir, TransportType type, uint subtype) static TrackdirBits GetDriveableTrackdirBits(TileIndex dst_tile, TileIndex src_tile, Trackdir src_trackdir, TransportType type, uint subtype)
{ {
TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(dst_tile, type, subtype)); TrackdirBits trackdirbits = GetTileTrackdirBits(dst_tile, type, subtype);
if (trackdirbits == TRACKDIR_BIT_NONE && type == TRANSPORT_ROAD && (RoadTramType)subtype == RTT_TRAM) { if (trackdirbits == TRACKDIR_BIT_NONE && type == TRANSPORT_ROAD && (RoadTramType)subtype == RTT_TRAM) {
/* GetTileTrackStatus() returns 0 for single tram bits. /* GetTileTrackStatus() returns 0 for single tram bits.
@@ -1222,7 +1222,7 @@ bool NPFShipCheckReverse(const Ship *v, Trackdir *best_td)
AyStarUserData user = { v->owner, TRANSPORT_WATER, RAILTYPES_NONE, ROADTYPES_NONE, 0 }; AyStarUserData user = { v->owner, TRANSPORT_WATER, RAILTYPES_NONE, ROADTYPES_NONE, 0 };
if (best_td != nullptr) { if (best_td != nullptr) {
DiagDirection entry = ReverseDiagDir(VehicleExitDir(v->direction, v->state)); DiagDirection entry = ReverseDiagDir(VehicleExitDir(v->direction, v->state));
TrackdirBits rtds = DiagdirReachesTrackdirs(entry) & TrackStatusToTrackdirBits(GetTileTrackStatus(v->tile, TRANSPORT_WATER, 0, entry)); TrackdirBits rtds = DiagdirReachesTrackdirs(entry) & GetTileTrackdirBits(v->tile, TRANSPORT_WATER, 0, entry);
Trackdir best = (Trackdir)FindFirstBit2x64(rtds); Trackdir best = (Trackdir)FindFirstBit2x64(rtds);
rtds = KillFirstBit(rtds); rtds = KillFirstBit(rtds);
if (rtds == TRACKDIR_BIT_NONE) return false; /* At most one choice. */ if (rtds == TRACKDIR_BIT_NONE) return false; /* At most one choice. */

View File

@@ -59,7 +59,7 @@ static inline TileIndex CalcClosestStationTile(StationID station, TileIndex tile
*/ */
static inline TrackdirBits GetTrackdirBitsForRoad(TileIndex tile, RoadTramType rtt) static inline TrackdirBits GetTrackdirBitsForRoad(TileIndex tile, RoadTramType rtt)
{ {
TrackdirBits bits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, rtt)); TrackdirBits bits = GetTileTrackdirBits(tile, TRANSPORT_ROAD, rtt);
if (rtt == RTT_TRAM && bits == TRACKDIR_BIT_NONE) { if (rtt == RTT_TRAM && bits == TRACKDIR_BIT_NONE) {
if (IsNormalRoadTile(tile)) { if (IsNormalRoadTile(tile)) {

View File

@@ -167,7 +167,7 @@ public:
default: default:
m_destTile = v->dest_tile; m_destTile = v->dest_tile;
m_dest_station_id = INVALID_STATION; m_dest_station_id = INVALID_STATION;
m_destTrackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(v->dest_tile, TRANSPORT_RAIL, 0)); m_destTrackdirs = GetTileTrackdirBits(v->dest_tile, TRANSPORT_RAIL, 0);
break; break;
} }
CYapfDestinationRailBase::SetDestination(v); CYapfDestinationRailBase::SetDestination(v);

View File

@@ -297,7 +297,7 @@ public:
} else { } else {
m_dest_station = INVALID_STATION; m_dest_station = INVALID_STATION;
m_destTile = v->dest_tile; m_destTile = v->dest_tile;
m_destTrackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(v->dest_tile, TRANSPORT_ROAD, GetRoadTramType(v->roadtype))); m_destTrackdirs = GetTileTrackdirBits(v->dest_tile, TRANSPORT_ROAD, GetRoadTramType(v->roadtype));
} }
} }

View File

@@ -41,7 +41,7 @@ public:
} else { } else {
m_destStation = INVALID_STATION; m_destStation = INVALID_STATION;
m_destTile = v->dest_tile; m_destTile = v->dest_tile;
m_destTrackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(v->dest_tile, TRANSPORT_WATER, 0)); m_destTrackdirs = GetTileTrackdirBits(v->dest_tile, TRANSPORT_WATER, 0);
} }
} }
@@ -216,7 +216,7 @@ public:
pf.SetOrigin(tile, TrackdirToTrackdirBits(td1) | TrackdirToTrackdirBits(td2)); pf.SetOrigin(tile, TrackdirToTrackdirBits(td1) | TrackdirToTrackdirBits(td2));
} else { } else {
DiagDirection entry = ReverseDiagDir(VehicleExitDir(v->direction, v->state)); DiagDirection entry = ReverseDiagDir(VehicleExitDir(v->direction, v->state));
TrackdirBits rtds = DiagdirReachesTrackdirs(entry) & TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0, entry)); TrackdirBits rtds = DiagdirReachesTrackdirs(entry) & GetTileTrackdirBits(tile, TRANSPORT_WATER, 0, entry);
pf.SetOrigin(tile, rtds); pf.SetOrigin(tile, rtds);
} }
pf.SetDestination(v); pf.SetDestination(v);

View File

@@ -105,8 +105,8 @@ bool TryReserveRailTrackdir(const Train *v, TileIndex tile, Trackdir td, bool tr
*/ */
bool TryReserveRailTrack(TileIndex tile, Track track, bool trigger_stations) bool TryReserveRailTrack(TileIndex tile, Track track, bool trigger_stations)
{ {
assert_msg_tile((TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & TrackToTrackBits(track)) != 0, tile, assert_msg_tile((TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)) & TrackToTrackBits(track)) != 0, tile,
"%X, %X, %X", TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)), track, TrackToTrackBits(track)); "%X, %X, %X", TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)), track, TrackToTrackBits(track));
if (_settings_client.gui.show_track_reservation) { if (_settings_client.gui.show_track_reservation) {
/* show the reserved rail if needed */ /* show the reserved rail if needed */
@@ -202,7 +202,7 @@ void UnreserveRailTrackdir(TileIndex tile, Trackdir td)
*/ */
void UnreserveRailTrack(TileIndex tile, Track t) void UnreserveRailTrack(TileIndex tile, Track t)
{ {
assert_msg_tile(TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & TrackToTrackBits(t), tile, "track: %u", t); assert_msg_tile(TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)) & TrackToTrackBits(t), tile, "track: %u", t);
if (_settings_client.gui.show_track_reservation) { if (_settings_client.gui.show_track_reservation) {
if (IsTileType(tile, MP_TUNNELBRIDGE)) { if (IsTileType(tile, MP_TUNNELBRIDGE)) {
@@ -871,7 +871,7 @@ bool ValidateLookAhead(const Train *v)
} }
if (HasBit(v->lookahead->flags, TRLF_DEPOT_END) && !IsRailDepotTile(tile)) return false; if (HasBit(v->lookahead->flags, TRLF_DEPOT_END) && !IsRailDepotTile(tile)) return false;
TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); TrackdirBits trackdirbits = GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0);
if (!HasTrackdir(trackdirbits, trackdir)) return false; if (!HasTrackdir(trackdirbits, trackdir)) return false;
return true; return true;

View File

@@ -419,7 +419,7 @@ public:
{ {
if (this->IsWidgetLowered(PROGRAM_WIDGET_COPY_PROGRAM)) { if (this->IsWidgetLowered(PROGRAM_WIDGET_COPY_PROGRAM)) {
//Copy program from another progsignal //Copy program from another progsignal
TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile1, TRANSPORT_RAIL, 0)); TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile1, TRANSPORT_RAIL, 0));
if (trackbits & TRACK_BIT_VERT) { // N-S direction if (trackbits & TRACK_BIT_VERT) { // N-S direction
trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT;
} }
@@ -466,7 +466,7 @@ public:
return; return;
} }
TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile1, TRANSPORT_RAIL, 0)); TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile1, TRANSPORT_RAIL, 0));
if (trackbits & TRACK_BIT_VERT) { // N-S direction if (trackbits & TRACK_BIT_VERT) { // N-S direction
trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT;
} }

View File

@@ -1876,7 +1876,7 @@ static bool CheckSignalAutoFill(TileIndex &tile, Trackdir &trackdir, int &signal
if (tile == INVALID_TILE) return false; if (tile == INVALID_TILE) return false;
/* Check for track bits on the new tile */ /* Check for track bits on the new tile */
TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); TrackdirBits trackdirbits = GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0);
if (TracksOverlap(TrackdirBitsToTrackBits(trackdirbits))) return false; if (TracksOverlap(TrackdirBitsToTrackBits(trackdirbits))) return false;
trackdirbits &= TrackdirReachesTrackdirs(trackdir); trackdirbits &= TrackdirReachesTrackdirs(trackdir);
@@ -1920,7 +1920,7 @@ static bool CheckSignalAutoFill(TileIndex &tile, Trackdir &trackdir, int &signal
signal_ctr += GetTunnelBridgeLength(orig_tile, tile) * 2; signal_ctr += GetTunnelBridgeLength(orig_tile, tile) * 2;
/* Check for track bits on the new tile */ /* Check for track bits on the new tile */
trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); trackdirbits = GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0);
if (TracksOverlap(TrackdirBitsToTrackBits(trackdirbits))) return false; if (TracksOverlap(TrackdirBitsToTrackBits(trackdirbits))) return false;
trackdirbits &= TrackdirReachesTrackdirs(trackdir); trackdirbits &= TrackdirReachesTrackdirs(trackdir);
@@ -3916,6 +3916,7 @@ static TrackStatus GetTileTrackStatus_Track(TileIndex tile, TransportType mode,
case RAIL_TILE_SIGNALS: { case RAIL_TILE_SIGNALS: {
trackbits = GetTrackBits(tile); trackbits = GetTrackBits(tile);
if (sub_mode & TTSSM_NO_RED_SIGNALS) break;
byte a = GetPresentSignals(tile); byte a = GetPresentSignals(tile);
uint b = GetSignalStates(tile); uint b = GetSignalStates(tile);
@@ -3953,7 +3954,7 @@ static TrackStatus GetTileTrackStatus_Track(TileIndex tile, TransportType mode,
static bool ClickTile_Track(TileIndex tile) static bool ClickTile_Track(TileIndex tile)
{ {
if (_ctrl_pressed && IsPlainRailTile(tile)) { if (_ctrl_pressed && IsPlainRailTile(tile)) {
TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0));
if (trackbits & TRACK_BIT_VERT) { // N-S direction if (trackbits & TRACK_BIT_VERT) { // N-S direction
trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT;

View File

@@ -239,7 +239,7 @@ static SignalType GetDefaultSignalType()
*/ */
static void GenericPlaceSignals(TileIndex tile) static void GenericPlaceSignals(TileIndex tile)
{ {
TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0));
if (trackbits & TRACK_BIT_VERT) { // N-S direction if (trackbits & TRACK_BIT_VERT) { // N-S direction
trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT;

View File

@@ -2721,7 +2721,7 @@ static TrackStatus GetTileTrackStatus_Road(TileIndex tile, TransportType mode, u
RoadType rt = (RoadType)(rtfield - 1); RoadType rt = (RoadType)(rtfield - 1);
return HasBit(_roadtypes_non_train_colliding, rt); return HasBit(_roadtypes_non_train_colliding, rt);
}; };
if (IsCrossingBarred(tile) && !is_non_colliding()) { if (!(sub_mode & TTSSM_NO_RED_SIGNALS) && IsCrossingBarred(tile) && !is_non_colliding()) {
red_signals = trackdirbits; red_signals = trackdirbits;
if (TrainOnCrossing(tile)) break; if (TrainOnCrossing(tile)) break;

View File

@@ -339,8 +339,7 @@ protected: // These functions should not be called outside acceleration code.
*/ */
inline bool TileMayHaveSlopedTrack() const inline bool TileMayHaveSlopedTrack() const
{ {
TrackStatus ts = GetTileTrackStatus(this->tile, TRANSPORT_ROAD, GetRoadTramType(this->roadtype)); TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(this->tile, TRANSPORT_ROAD, GetRoadTramType(this->roadtype)));
TrackBits trackbits = TrackStatusToTrackBits(ts);
return trackbits == TRACK_BIT_X || trackbits == TRACK_BIT_Y; return trackbits == TRACK_BIT_X || trackbits == TRACK_BIT_Y;
} }

View File

@@ -383,7 +383,7 @@ inline bool IsOneWaySideJunctionRoadTile(TileIndex tile)
static bool MayReverseOnOneWayRoadTile(TileIndex tile, DiagDirection dir) static bool MayReverseOnOneWayRoadTile(TileIndex tile, DiagDirection dir)
{ {
TrackdirBits bits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, RTT_ROAD)); TrackdirBits bits = GetTileTrackdirBits(tile, TRANSPORT_ROAD, RTT_ROAD);
return bits & DiagdirReachesTrackdirs(ReverseDiagDir(dir)); return bits & DiagdirReachesTrackdirs(ReverseDiagDir(dir));
} }

View File

@@ -3011,8 +3011,7 @@ bool AfterLoadGame()
if (rv->state == RVSB_IN_DEPOT || rv->state == RVSB_WORMHOLE) break; if (rv->state == RVSB_IN_DEPOT || rv->state == RVSB_WORMHOLE) break;
TrackStatus ts = GetTileTrackStatus(rv->tile, TRANSPORT_ROAD, GetRoadTramType(rv->roadtype)); TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(rv->tile, TRANSPORT_ROAD, GetRoadTramType(rv->roadtype)));
TrackBits trackbits = TrackStatusToTrackBits(ts);
/* Only X/Y tracks can be sloped. */ /* Only X/Y tracks can be sloped. */
if (trackbits != TRACK_BIT_X && trackbits != TRACK_BIT_Y) break; if (trackbits != TRACK_BIT_X && trackbits != TRACK_BIT_Y) break;

View File

@@ -62,11 +62,11 @@
DiagDirection to_other_tile = ::DiagdirBetweenTiles(t2, t1); DiagDirection to_other_tile = ::DiagdirBetweenTiles(t2, t1);
/* Determine the reachable tracks from the shared edge */ /* Determine the reachable tracks from the shared edge */
TrackBits gtts1 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t1, TRANSPORT_WATER, 0, ReverseDiagDir(to_other_tile))) & ::DiagdirReachesTracks(to_other_tile); TrackBits gtts1 = ::TrackdirBitsToTrackBits(::GetTileTrackdirBits(t1, TRANSPORT_WATER, 0, ReverseDiagDir(to_other_tile))) & ::DiagdirReachesTracks(to_other_tile);
if (gtts1 == TRACK_BIT_NONE) return false; if (gtts1 == TRACK_BIT_NONE) return false;
to_other_tile = ReverseDiagDir(to_other_tile); to_other_tile = ReverseDiagDir(to_other_tile);
TrackBits gtts2 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t2, TRANSPORT_WATER, 0, ReverseDiagDir(to_other_tile))) & ::DiagdirReachesTracks(to_other_tile); TrackBits gtts2 = ::TrackdirBitsToTrackBits(::GetTileTrackdirBits(t2, TRANSPORT_WATER, 0, ReverseDiagDir(to_other_tile))) & ::DiagdirReachesTracks(to_other_tile);
return gtts2 != TRACK_BIT_NONE; return gtts2 != TRACK_BIT_NONE;
} }

View File

@@ -214,10 +214,10 @@
if (!::IsValidTile(tile)) return false; if (!::IsValidTile(tile)) return false;
if (transport_type == TRANSPORT_ROAD) { if (transport_type == TRANSPORT_ROAD) {
return ::TrackStatusToTrackdirBits(::GetTileTrackStatus(tile, (::TransportType)transport_type, 0)) != TRACKDIR_BIT_NONE || return ::GetTileTrackdirBits(tile, (::TransportType)transport_type, 0) != TRACKDIR_BIT_NONE ||
::TrackStatusToTrackdirBits(::GetTileTrackStatus(tile, (::TransportType)transport_type, 1)) != TRACKDIR_BIT_NONE; ::GetTileTrackdirBits(tile, (::TransportType)transport_type, 1) != TRACKDIR_BIT_NONE;
} else { } else {
return ::TrackStatusToTrackdirBits(::GetTileTrackStatus(tile, (::TransportType)transport_type, 0)) != TRACKDIR_BIT_NONE; return ::GetTileTrackdirBits(tile, (::TransportType)transport_type, 0) != TRACKDIR_BIT_NONE;
} }
} }

View File

@@ -81,7 +81,7 @@ bool IsValidImageIndex<VEH_SHIP>(uint8 image_index)
static inline TrackBits GetTileShipTrackStatus(TileIndex tile) static inline TrackBits GetTileShipTrackStatus(TileIndex tile)
{ {
return TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0)); return TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_WATER, 0));
} }
static void GetShipIcon(EngineID engine, EngineImageType image_type, VehicleSpriteSeq *result) static void GetShipIcon(EngineID engine, EngineImageType image_type, VehicleSpriteSeq *result)
@@ -933,7 +933,7 @@ static void ShipController(Ship *v)
/* Test if continuing forward would lead to a dead-end, moving into the dock. */ /* Test if continuing forward would lead to a dead-end, moving into the dock. */
DiagDirection exitdir = VehicleExitDir(v->direction, v->state); DiagDirection exitdir = VehicleExitDir(v->direction, v->state);
TileIndex tile = TileAddByDiagDir(v->tile, exitdir); TileIndex tile = TileAddByDiagDir(v->tile, exitdir);
if (TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0, exitdir)) == TRACK_BIT_NONE) goto reverse_direction; if (TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_WATER, 0, exitdir)) == TRACK_BIT_NONE) goto reverse_direction;
} else if (v->dest_tile != 0) { } else if (v->dest_tile != 0) {
/* We have a target, let's see if we reached it... */ /* We have a target, let's see if we reached it... */
if (v->current_order.IsType(OT_GOTO_WAYPOINT) && if (v->current_order.IsType(OT_GOTO_WAYPOINT) &&

View File

@@ -969,7 +969,7 @@ static SigSegState UpdateSignalsInBuffer(Owner owner)
case MP_STATION: case MP_STATION:
case MP_ROAD: case MP_ROAD:
if ((TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) { if ((TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) {
/* only add to set when there is some 'interesting' track */ /* only add to set when there is some 'interesting' track */
_tbdset.Add(tile, dir); _tbdset.Add(tile, dir);
_tbdset.Add(tile + TileOffsByDiagDir(dir), ReverseDiagDir(dir)); _tbdset.Add(tile + TileOffsByDiagDir(dir), ReverseDiagDir(dir));
@@ -981,7 +981,7 @@ static SigSegState UpdateSignalsInBuffer(Owner owner)
/* jump to next tile */ /* jump to next tile */
tile = tile + TileOffsByDiagDir(dir); tile = tile + TileOffsByDiagDir(dir);
dir = ReverseDiagDir(dir); dir = ReverseDiagDir(dir);
if ((TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) { if ((TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) {
_tbdset.Add(tile, dir); _tbdset.Add(tile, dir);
break; break;
} }

View File

@@ -14,6 +14,7 @@
#include "vehicle_type.h" #include "vehicle_type.h"
#include "cargo_type.h" #include "cargo_type.h"
#include "track_type.h" #include "track_type.h"
#include "track_func.h"
#include "tile_map.h" #include "tile_map.h"
/** The returned bits of VehicleEnterTile. */ /** The returned bits of VehicleEnterTile. */
@@ -168,7 +169,19 @@ struct TileTypeProcs {
extern const TileTypeProcs * const _tile_type_procs[16]; extern const TileTypeProcs * const _tile_type_procs[16];
enum TileTrackStatusSubMode {
TTSSM_ROAD_RTT_MASK = 0xFF,
TTSSM_ROAD_ROADTYPE_MASK = 0xFF00,
TTSSM_NO_RED_SIGNALS = 0x10000,
};
TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side = INVALID_DIAGDIR); TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side = INVALID_DIAGDIR);
inline TrackdirBits GetTileTrackdirBits(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side = INVALID_DIAGDIR)
{
return TrackStatusToTrackdirBits(GetTileTrackStatus(tile, mode, sub_mode | TTSSM_NO_RED_SIGNALS, side));
}
VehicleEnterTileStatus VehicleEnterTile(Vehicle *v, TileIndex tile, int x, int y); VehicleEnterTileStatus VehicleEnterTile(Vehicle *v, TileIndex tile, int x, int y);
void ChangeTileOwner(TileIndex tile, Owner old_owner, Owner new_owner); void ChangeTileOwner(TileIndex tile, Owner old_owner, Owner new_owner);
void GetTileDesc(TileIndex tile, TileDesc *td); void GetTileDesc(TileIndex tile, TileDesc *td);

View File

@@ -2401,7 +2401,7 @@ public:
return; return;
} }
TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(source_tile, TRANSPORT_RAIL, 0)); TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(source_tile, TRANSPORT_RAIL, 0));
if (trackbits & TRACK_BIT_VERT) { // N-S direction if (trackbits & TRACK_BIT_VERT) { // N-S direction
trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT;
} }

View File

@@ -584,8 +584,7 @@ int GetTrainStopLocation(StationID station_id, TileIndex tile, Train *v, bool up
TileIndex tile = front->tile + TileOffsByDiagDir(dir); TileIndex tile = front->tile + TileOffsByDiagDir(dir);
/* Determine the track status on the next tile */ /* Determine the track status on the next tile */
TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0, ReverseDiagDir(dir)); TrackdirBits trackdirbits = GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0, ReverseDiagDir(dir)) & DiagdirReachesTrackdirs(dir);
TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts) & DiagdirReachesTrackdirs(dir);
/* mask unreachable track bits if we are forbidden to do 90deg turns */ /* mask unreachable track bits if we are forbidden to do 90deg turns */
TrackBits bits = TrackdirBitsToTrackBits(trackdirbits); TrackBits bits = TrackdirBitsToTrackBits(trackdirbits);
@@ -4446,7 +4445,7 @@ static Track ChooseTrainTrack(Train *v, TileIndex tile, DiagDirection enterdir,
/* Extend reservation until we have found a safe position. */ /* Extend reservation until we have found a safe position. */
DiagDirection exitdir = TrackdirToExitdir(res_dest.trackdir); DiagDirection exitdir = TrackdirToExitdir(res_dest.trackdir);
TileIndex next_tile = TileAddByDiagDir(res_dest.tile, exitdir); TileIndex next_tile = TileAddByDiagDir(res_dest.tile, exitdir);
TrackBits reachable = TrackdirBitsToTrackBits((TrackdirBits)(GetTileTrackStatus(next_tile, TRANSPORT_RAIL, 0))) & DiagdirReachesTracks(exitdir); TrackBits reachable = TrackdirBitsToTrackBits(GetTileTrackdirBits(next_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTracks(exitdir);
if (Rail90DegTurnDisallowedTilesFromDiagDir(res_dest.tile, next_tile, exitdir)) { if (Rail90DegTurnDisallowedTilesFromDiagDir(res_dest.tile, next_tile, exitdir)) {
reachable &= ~TrackCrossesTracks(TrackdirToTrack(res_dest.trackdir)); reachable &= ~TrackCrossesTracks(TrackdirToTrack(res_dest.trackdir));
} }
@@ -4610,7 +4609,7 @@ bool TryPathReserve(Train *v, bool mark_as_stuck, bool first_tile_okay)
} else { } else {
new_tile = TileAddByDiagDir(origin.tile, exitdir); new_tile = TileAddByDiagDir(origin.tile, exitdir);
} }
TrackBits reachable = TrackdirBitsToTrackBits(TrackStatusToTrackdirBits(GetTileTrackStatus(new_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTrackdirs(exitdir)); TrackBits reachable = TrackdirBitsToTrackBits(GetTileTrackdirBits(new_tile, TRANSPORT_RAIL, 0) & DiagdirReachesTrackdirs(exitdir));
if (Rail90DegTurnDisallowedTilesFromDiagDir(origin.tile, new_tile, exitdir)) reachable &= ~TrackCrossesTracks(TrackdirToTrack(origin.trackdir)); if (Rail90DegTurnDisallowedTilesFromDiagDir(origin.tile, new_tile, exitdir)) reachable &= ~TrackCrossesTracks(TrackdirToTrack(origin.trackdir));

View File

@@ -2818,7 +2818,7 @@ static void TileLoop_TunnelBridge(TileIndex tile)
static bool ClickTile_TunnelBridge(TileIndex tile) static bool ClickTile_TunnelBridge(TileIndex tile)
{ {
if (_ctrl_pressed && IsTunnelBridgeWithSignalSimulation(tile)) { if (_ctrl_pressed && IsTunnelBridgeWithSignalSimulation(tile)) {
TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0));
if (trackbits & TRACK_BIT_VERT) { // N-S direction if (trackbits & TRACK_BIT_VERT) { // N-S direction
trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT;

View File

@@ -180,7 +180,7 @@ bool IsPossibleDockingTile(TileIndex t)
case MP_RAILWAY: case MP_RAILWAY:
case MP_STATION: case MP_STATION:
case MP_TUNNELBRIDGE: case MP_TUNNELBRIDGE:
return TrackStatusToTrackBits(GetTileTrackStatus(t, TRANSPORT_WATER, 0)) != TRACK_BIT_NONE; return TrackdirBitsToTrackBits(GetTileTrackdirBits(t, TRANSPORT_WATER, 0)) != TRACK_BIT_NONE;
default: default:
return false; return false;