Index: src/elrail.cpp =================================================================== --- src/elrail.cpp (Revision 12066) +++ src/elrail.cpp (Arbeitskopie) @@ -69,12 +69,33 @@ #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 trackbits = GetTrackBits(t); + TrackBits neighbour_mask = TRACK_BIT_NONE; + 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) { + neighbour_mask |= TrackdirBitsToTrackBits(DiagdirReachesTrackdirs(ReverseDiagDir(d))); + } + } + /* Mask out TrackBits where at least one neighbour is unelectrified + * make sure, at least one TrackBit is left + */ + if ((trackbits & ~neighbour_mask) != TRACK_BIT_NONE) return trackbits & ~neighbour_mask; + return trackbits; +} + +/** * 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 +108,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: