Index: src/elrail.cpp =================================================================== --- src/elrail.cpp (Revision 12066) +++ src/elrail.cpp (Arbeitskopie) @@ -69,12 +69,31 @@ #include "table/sprites.h" #include "table/elrail_data.h" +#include "core/bitmath_func.hpp" + static inline TLG GetTLG(TileIndex t) { return (TLG)((HasBit(TileX(t), 0) << 1) + HasBit(TileY(t), 0)); } /** + * Masks out TrackBits when neighbouring tiles are unelectrified + */ +static TrackBits MaskTrackBits(TileIndex t) { + TrackBits result = GetTrackBits(t); + byte neighbour_mask = 0; + for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) { + //Get unelectrified neighbours, non-rail neighbours count as electrified + if (GetTileType(TileAddByDiagDir(t, d)) != MP_RAILWAY || GetRailType(TileAddByDiagDir(t, d)) == RAILTYPE_ELECTRIC) SetBit(neighbour_mask, d); + } + for (Track track = TRACK_BEGIN; track < TRACK_END; track++) { + // Mask out TrackBits where at least one neighbour is unelectrified + if (!HasBit(neighbour_mask,TrackdirToExitdir(TrackToTrackdir(track))) || !HasBit(neighbour_mask,TrackdirToExitdir(ReverseTrackdir(TrackToTrackdir(track))))) ClrBit(result, track); + } + return result; +} + +/** * Finds which Electrified Rail Bits are present on a given tile. * @param t tile to check * @param override pointer to PCP override, can be NULL @@ -87,7 +106,7 @@ if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE; switch (GetRailTileType(t)) { case RAIL_TILE_NORMAL: case RAIL_TILE_SIGNALS: - return GetTrackBits(t); + return MaskTrackBits(t); case RAIL_TILE_WAYPOINT: return GetRailWaypointBits(t); default: