Mercurial > hg > openttd
changeset 6172:b3b8cbc5e854 draft
(svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
author | rubidium <rubidium@openttd.org> |
---|---|
date | Tue, 27 Feb 2007 23:36:28 +0000 |
parents | c7702350b836 |
children | 214cf8e79e71 |
files | docs/landscape.html docs/landscape_grid.html src/elrail.cpp src/openttd.cpp src/pathfind.cpp src/rail.cpp src/rail_cmd.cpp src/rail_map.h src/road_cmd.cpp src/road_map.h src/saveload.cpp src/train_cmd.cpp |
diffstat | 12 files changed, 108 insertions(+), 114 deletions(-) [+] |
line wrap: on
line diff
--- a/docs/landscape.html +++ b/docs/landscape.html @@ -125,7 +125,7 @@ </ul> </li> <li>m2 bits 7..4: bit clear = signal shows red; same bits as in m3</li> - <li>OpenTTD bits in m4: + <li>OpenTTD bits in m2: <table> <tr><td nowrap valign=top>bits 1..0: </td><td align=left>type of signal:</td></tr> <tr><td nowrap valign=top><tt>00</tt>: </td><td align=left>normal signals</td></tr> @@ -138,7 +138,7 @@ </ul> </li> <li>m1: <a href="#OwnershipInfo">owner</a> of the track</li> - <li>m2 bits 0..3: + <li>m4 bits 0..3: <table> <tr><td nowrap valign=top><tt>0</tt> </td><td align=left>on bare land</td></tr> <tr><td nowrap valign=top><tt>1</tt> </td><td align=left>on grass, no fences</td></tr> @@ -165,7 +165,7 @@ </li> </ul> </li> - <li>m5 bits 7 and 6 set: railway depot / checkpoints + <li>m5 bit 7 set: railway depot / checkpoints <ul> <li>m5 value C0..C3: railway depot <table> @@ -177,7 +177,7 @@ <tr><td><tt>03</tt> </td><td>NW</td></tr> </table> </li> - <li>m5 value C4..C5: checkpoint + <li>m5 value 80..81: checkpoint <table> <tr><td colspan=2>bit 0</td></tr> <tr><td>clear</td><td>in X direction</td></tr> @@ -187,7 +187,7 @@ <li>m1: <a href="#OwnershipInfo">owner</a> of the depot / checkpoint</li> <li>m2: For waypoints, index into the array of waypoints.</li> <li>m3 bits 0..3 = <a href="#TrackType">track type</a></li> - <li>m4 bits 0..3 = ground type, as per m2 bits 0..3 for railway tiles.</li> + <li>m4 bits 0..3 = ground type, as per m4 bits 0..3 for railway tiles.</li> </ul> </li> </ul> @@ -210,8 +210,8 @@ </li> <li>m1: <a href="#OwnershipInfo">owner</a> of the road</li> <li>m2: Index into the array of towns, 0 for non-town roads</li> - <li>m4 bits 0..3: counter for the roadworks</li> - <li>m4 bits 4..6: + <li>m3 bits 0..3: counter for the roadworks</li> + <li>m3 bits 4..6: <table> <tr><td><tt>0</tt> </td><td>on bare land</td></tr> <tr><td><tt>1</tt> </td><td>on grass</td></tr> @@ -222,7 +222,7 @@ <tr><td><tt>7</tt> </td><td>paved with road works</td></tr> </table> </li> - <li>m4 bit 7 set = on snow or desert</li> + <li>m3 bit 7 set = on snow or desert</li> </ul> </li> <li>m5 bit 4 set, bits 7..5 clear: level crossing @@ -231,17 +231,17 @@ <li>m5 bit 2: set if crossing lights are on</li> <li>m1: <a href="#OwnershipInfo">owner</a> of the railway track</li> <li>m2: Index into the array of towns, 0 for non-town roads</li> - <li>m3 bits 0..7: <a href="#OwnershipInfo">owner</a> of the road</li> - <li>m4 bits 3..0: <a href="#TrackType">track type</a></li> - <li>m4 bits 4..6: <tt>0</tt> - on bare land, <tt>1</tt> - on grass, <tt>2</tt> or higher - paved</li> - <li>m4 bit 7 set = on snow or desert</li> + <li>m4 bits 0..7: <a href="#OwnershipInfo">owner</a> of the road</li> + <li>m3 bits 3..0: <a href="#TrackType">track type</a></li> + <li>m3 bits 4..6: <tt>0</tt> - on bare land, <tt>1</tt> - on grass, <tt>2</tt> or higher - paved</li> + <li>m3 bit 7 set = on snow or desert</li> </ul> </li> <li>m5 bit 5 set: road depot <ul> <li>m5 bits 3..0 - direction: exit towards: <tt>0</tt> = NE, <tt>1</tt> = SE, <tt>2</tt> = SW, <tt>3</tt> = NW</li> <li>m1: <a href="#OwnershipInfo">owner</a> of the depot</li> - <li>m4 bit 7 set = on snow or desert (not displayed, but set internally)</li> + <li>m3 bit 7 set = on snow or desert (not displayed, but set internally)</li> </ul> </li> </ul>
--- a/docs/landscape_grid.html +++ b/docs/landscape_grid.html @@ -135,8 +135,8 @@ <td class="bits">-inherit-</td> <td class="bits">-inherit-</td> <td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td> + <td class="bits">X<span class="free">OOO OOOO</span></td> <td class="bits"><span class="free">OOOO OOOO</span></td> - <td class="bits">X<span class="free">OOO OOOO</span></td> <td class="bits">XXXX XXXX</td> <td class="bits">XX<span class="free">OO OO</span>XX</td> </tr>
--- a/src/elrail.cpp +++ b/src/elrail.cpp @@ -81,8 +81,8 @@ switch (GetRailTileType(t)) { case RAIL_TILE_NORMAL: case RAIL_TILE_SIGNALS: return GetTrackBits(t); - case RAIL_TILE_DEPOT_WAYPOINT: - if (GetRailTileSubtype(t) == RAIL_SUBTYPE_WAYPOINT) return GetRailWaypointBits(t); + case RAIL_TILE_WAYPOINT: + return GetRailWaypointBits(t); default: return TRACK_BIT_NONE; } @@ -103,7 +103,7 @@ case MP_STREET: if (GetRoadTileType(t) != ROAD_TILE_CROSSING) return TRACK_BIT_NONE; - if (GetRailTypeCrossing(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE; + if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE; return GetCrossingRailBits(t); case MP_STATION:
--- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -1467,6 +1467,34 @@ } } + if (CheckSavegameVersion(48)) { + for (TileIndex t = 0; t < map_size; t++) { + switch (GetTileType(t)) { + case MP_RAILWAY: + if (IsPlainRailTile(t)) { + /* Swap ground type and signal type for plain rail tiles, so the + * ground type uses the same bits as for depots and waypoints. */ + uint tmp = GB(_m[t].m4, 0, 4); + SB(_m[t].m4, 0, 4, GB(_m[t].m2, 0, 4)); + SB(_m[t].m2, 0, 4, tmp); + } else if (HASBIT(_m[t].m5, 2)) { + /* Split waypoint and depot rail type and remove the subtype. */ + CLRBIT(_m[t].m5, 2); + CLRBIT(_m[t].m5, 6); + } + break; + + case MP_STREET: + /* Swap m3 and m4, so the track type for rail crossings is the + * same as for normal rail. */ + Swap(_m[t].m3, _m[t].m4); + break; + + default: break; + } + } + } + /* Elrails got added in rev 24 */ if (CheckSavegameVersion(24)) { Vehicle *v; @@ -1490,7 +1518,7 @@ case MP_STREET: if (IsLevelCrossing(t)) { - SetRailTypeCrossing(t, UpdateRailType(GetRailTypeCrossing(t), min_rail)); + SetRailType(t, UpdateRailType(GetRailType(t), min_rail)); } break; @@ -1575,11 +1603,11 @@ case MP_RAILWAY: if (HasSignals(t)) { // convert PBS signals to combo-signals - if (HASBIT(_m[t].m4, 2)) SetSignalType(t, SIGTYPE_COMBO); + if (HASBIT(_m[t].m2, 2)) SetSignalType(t, SIGTYPE_COMBO); // move the signal variant back - SetSignalVariant(t, HASBIT(_m[t].m4, 3) ? SIG_SEMAPHORE : SIG_ELECTRIC); - CLRBIT(_m[t].m4, 3); + SetSignalVariant(t, HASBIT(_m[t].m2, 3) ? SIG_SEMAPHORE : SIG_ELECTRIC); + CLRBIT(_m[t].m2, 3); } // Clear PBS reservation on track
--- a/src/pathfind.cpp +++ b/src/pathfind.cpp @@ -786,7 +786,7 @@ // Check that the tile contains exactly one track if (bits == 0 || KILL_FIRST_BIT(bits) != 0) break; - if (!HASBIT(tpf->railtypes, IsTileType(tile, MP_STREET) ? GetRailTypeCrossing(tile) : GetRailType(tile))) { + if (!HASBIT(tpf->railtypes, GetRailType(tile))) { bits = TRACK_BIT_NONE; break; }
--- a/src/rail.cpp +++ b/src/rail.cpp @@ -110,7 +110,7 @@ case MP_STREET: /* rail/road crossing */ - if (IsLevelCrossing(tile)) return GetRailTypeCrossing(tile); + if (IsLevelCrossing(tile)) return GetRailType(tile); break; case MP_STATION:
--- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -661,7 +661,7 @@ if (flags & DC_EXEC) { if (!HasSignals(tile)) { // there are no signals at all on this tile yet - _m[tile].m5 |= RAIL_TILE_SIGNALS; // change into signals + SetHasSignals(tile, true); _m[tile].m2 |= 0xF0; // all signals are on _m[tile].m3 &= ~0xF0; // no signals built by default SetSignalType(tile, SIGTYPE_NORMAL); @@ -824,7 +824,7 @@ /* removed last signal from tile? */ if (GB(_m[tile].m3, 4, 4) == 0) { SB(_m[tile].m2, 4, 4, 0); - SB(_m[tile].m5, 6, 2, RAIL_TILE_NORMAL >> 6); // XXX >> because the constant is meant for direct application, not use with SB + SetHasSignals(tile, false); SetSignalVariant(tile, SIG_ELECTRIC); // remove any possible semaphores } @@ -1004,12 +1004,11 @@ return cost; } - case RAIL_TILE_DEPOT_WAYPOINT: - if (GetRailTileSubtype(tile) == RAIL_SUBTYPE_DEPOT) { - return RemoveTrainDepot(tile, flags); - } else { - return RemoveTrainWaypoint(tile, flags, false); - } + case RAIL_TILE_DEPOT: + return RemoveTrainDepot(tile, flags); + + case RAIL_TILE_WAYPOINT: + return RemoveTrainWaypoint(tile, flags, false); default: return CMD_ERROR; @@ -1284,7 +1283,7 @@ if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh); - if (GetRailTileSubtype(ti->tile) == RAIL_SUBTYPE_DEPOT) { + if (IsRailDepot(ti->tile)) { dts = &_depot_gfx_table[GetRailDepotDirection(ti->tile)]; relocation = rti->total_offset; @@ -1877,7 +1876,7 @@ } return ret; } else { - if (GetRailTileSubtype(tile) == RAIL_SUBTYPE_DEPOT) { + if (IsRailDepot(tile)) { return AxisToTrackBits(DiagDirToAxis(GetRailDepotDirection(tile))) * 0x101; } else { return GetRailWaypointBits(tile) * 0x101; @@ -1914,10 +1913,13 @@ break; } - case RAIL_TILE_DEPOT_WAYPOINT: + case RAIL_TILE_DEPOT: + td->str = STR_1023_RAILROAD_TRAIN_DEPOT; + break; + + case RAIL_TILE_WAYPOINT: default: - td->str = (GetRailTileSubtype(tile) == RAIL_SUBTYPE_DEPOT) ? - STR_1023_RAILROAD_TRAIN_DEPOT : STR_LANDINFO_WAYPOINT; + td->str = STR_LANDINFO_WAYPOINT; break; } }
--- a/src/rail_map.h +++ b/src/rail_map.h @@ -9,17 +9,16 @@ typedef enum RailTileType { - RAIL_TILE_NORMAL = 0x0, - RAIL_TILE_SIGNALS = 0x40, - RAIL_TILE_UNUSED = 0x80, /* XXX: Maybe this could become waypoints? */ - RAIL_TILE_DEPOT_WAYPOINT = 0xC0, /* Is really depots and waypoints... */ - RAIL_TILE_TYPE_MASK = 0xC0 + RAIL_TILE_NORMAL = 0, + RAIL_TILE_SIGNALS = 1, + RAIL_TILE_WAYPOINT = 2, + RAIL_TILE_DEPOT = 3, } RailTileType; static inline RailTileType GetRailTileType(TileIndex t) { assert(IsTileType(t, MP_RAILWAY)); - return (RailTileType)(_m[t].m5 & RAIL_TILE_TYPE_MASK); + return (RailTileType)GB(_m[t].m5, 6, 2); } /** @@ -40,39 +39,25 @@ return GetRailTileType(tile) == RAIL_TILE_SIGNALS; } - -/** These specify the subtype when the main rail type is - * RAIL_TILE_DEPOT_WAYPOINT */ -typedef enum RailTileSubtypes { - RAIL_SUBTYPE_DEPOT = 0x00, - RAIL_SUBTYPE_WAYPOINT = 0x04, - RAIL_SUBTYPE_MASK = 0x3C -} RailTileSubtype; - /** - * Returns the RailTileSubtype of a given rail tile with type - * RAIL_TILE_DEPOT_WAYPOINT + * Add/remove the 'has signal' bit from the RailTileType */ -static inline RailTileSubtype GetRailTileSubtype(TileIndex tile) +static inline void SetHasSignals(TileIndex tile, bool signals) { - assert(GetRailTileType(tile) == RAIL_TILE_DEPOT_WAYPOINT); - return (RailTileSubtype)(_m[tile].m5 & RAIL_SUBTYPE_MASK); + assert(IsPlainRailTile(tile)); + SB(_m[tile].m5, 6, 1, signals); } static inline bool IsRailDepot(TileIndex t) { - return - GetRailTileType(t) == RAIL_TILE_DEPOT_WAYPOINT && - GetRailTileSubtype(t) == RAIL_SUBTYPE_DEPOT; + return GetRailTileType(t) == RAIL_TILE_DEPOT; } static inline bool IsRailWaypoint(TileIndex t) { - return - GetRailTileType(t) == RAIL_TILE_DEPOT_WAYPOINT && - GetRailTileSubtype(t) == RAIL_SUBTYPE_WAYPOINT; + return GetRailTileType(t) == RAIL_TILE_WAYPOINT; } @@ -81,23 +66,11 @@ return (RailType)GB(_m[t].m3, 0, 4); } -// TODO remove this by moving to the same bits as GetRailType() -static inline RailType GetRailTypeCrossing(TileIndex t) -{ - return (RailType)GB(_m[t].m4, 0, 4); -} - static inline void SetRailType(TileIndex t, RailType r) { SB(_m[t].m3, 0, 4, r); } -// TODO remove this by moving to the same bits as SetRailType() -static inline void SetRailTypeCrossing(TileIndex t, RailType r) -{ - SB(_m[t].m4, 0, 4, r); -} - static inline TrackBits GetTrackBits(TileIndex tile) { @@ -151,13 +124,13 @@ static inline SignalType GetSignalType(TileIndex t) { assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); - return (SignalType)GB(_m[t].m4, 0, 2); + return (SignalType)GB(_m[t].m2, 0, 2); } static inline void SetSignalType(TileIndex t, SignalType s) { assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); - SB(_m[t].m4, 0, 2, s); + SB(_m[t].m2, 0, 2, s); } static inline bool IsPresignalEntry(TileIndex t) @@ -189,12 +162,12 @@ static inline SignalVariant GetSignalVariant(TileIndex t) { - return (SignalVariant)GB(_m[t].m4, 2, 1); + return (SignalVariant)GB(_m[t].m2, 2, 1); } static inline void SetSignalVariant(TileIndex t, SignalVariant v) { - SB(_m[t].m4, 2, 1, v); + SB(_m[t].m2, 2, 1, v); } static inline bool IsSignalPresent(TileIndex t, byte signalbit) @@ -283,18 +256,12 @@ static inline void SetRailGroundType(TileIndex t, RailGroundType rgt) { - if (GetRailTileType(t) == RAIL_TILE_DEPOT_WAYPOINT) { - SB(_m[t].m4, 0, 4, rgt); - return; - } - SB(_m[t].m2, 0, 4, rgt); + SB(_m[t].m4, 0, 4, rgt); } static inline RailGroundType GetRailGroundType(TileIndex t) { - /* TODO Unify this */ - if (GetRailTileType(t) == RAIL_TILE_DEPOT_WAYPOINT) return (RailGroundType)GB(_m[t].m4, 0, 4); - return (RailGroundType)GB(_m[t].m2, 0, 4); + return (RailGroundType)GB(_m[t].m4, 0, 4); } static inline bool IsSnowRailGround(TileIndex t) @@ -310,7 +277,7 @@ _m[t].m2 = 0; _m[t].m3 = r; _m[t].m4 = 0; - _m[t].m5 = RAIL_TILE_NORMAL | b; + _m[t].m5 = RAIL_TILE_NORMAL << 6 | b; } @@ -321,7 +288,7 @@ _m[t].m2 = 0; _m[t].m3 = r; _m[t].m4 = 0; - _m[t].m5 = RAIL_TILE_DEPOT_WAYPOINT | RAIL_SUBTYPE_DEPOT | d; + _m[t].m5 = RAIL_TILE_DEPOT << 6 | d; } @@ -332,7 +299,7 @@ _m[t].m2 = index; _m[t].m3 = r; _m[t].m4 = 0; - _m[t].m5 = RAIL_TILE_DEPOT_WAYPOINT | RAIL_SUBTYPE_WAYPOINT | a; + _m[t].m5 = RAIL_TILE_WAYPOINT << 6 | a; } #endif /* RAIL_MAP_H */
--- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -162,7 +162,7 @@ if (flags & DC_EXEC) { ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM); - MakeRailNormal(tile, GetTileOwner(tile), GetCrossingRailBits(tile), GetRailTypeCrossing(tile)); + MakeRailNormal(tile, GetTileOwner(tile), GetCrossingRailBits(tile), GetRailType(tile)); MarkTileDirtyByTile(tile); YapfNotifyTrackLayoutChange(tile, FindFirstTrack(GetTrackBits(tile))); } @@ -374,13 +374,13 @@ // not owned by me? if (!CheckTileOwnership(tile) || !EnsureNoVehicle(tile)) return CMD_ERROR; - if (GetRailTypeCrossing(tile) == totype) return CMD_ERROR; + if (GetRailType(tile) == totype) return CMD_ERROR; // 'hidden' elrails can't be downgraded to normal rail when elrails are disabled - if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailTypeCrossing(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR; + if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR; if (exec) { - SetRailTypeCrossing(tile, totype); + SetRailType(tile, totype); MarkTileDirtyByTile(tile); YapfNotifyTrackLayoutChange(tile, FindFirstTrack(GetCrossingRailBits(tile))); } @@ -717,7 +717,7 @@ if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh); - image = GetRailTypeInfo(GetRailTypeCrossing(ti->tile))->base_sprites.crossing; + image = GetRailTypeInfo(GetRailType(ti->tile))->base_sprites.crossing; if (GetCrossingRoadAxis(ti->tile) == AXIS_X) image++; if (IsCrossingBarred(ti->tile)) image += 2; @@ -733,7 +733,7 @@ } DrawGroundSprite(image, pal); - if (GetRailTypeCrossing(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti); + if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti); break; }
--- a/src/road_map.h +++ b/src/road_map.h @@ -65,13 +65,13 @@ static inline Owner GetCrossingRoadOwner(TileIndex t) { assert(GetRoadTileType(t) == ROAD_TILE_CROSSING); - return (Owner)_m[t].m3; + return (Owner)_m[t].m4; } static inline void SetCrossingRoadOwner(TileIndex t, Owner o) { assert(GetRoadTileType(t) == ROAD_TILE_CROSSING); - _m[t].m3 = o; + _m[t].m4 = o; } static inline void UnbarCrossing(TileIndex t) @@ -95,13 +95,13 @@ #define IsOnDesert IsOnSnow static inline bool IsOnSnow(TileIndex t) { - return HASBIT(_m[t].m4, 7); + return HASBIT(_m[t].m3, 7); } #define ToggleDesert ToggleSnow static inline void ToggleSnow(TileIndex t) { - TOGGLEBIT(_m[t].m4, 7); + TOGGLEBIT(_m[t].m3, 7); } @@ -117,12 +117,12 @@ static inline Roadside GetRoadside(TileIndex tile) { - return (Roadside)GB(_m[tile].m4, 4, 3); + return (Roadside)GB(_m[tile].m3, 4, 3); } static inline void SetRoadside(TileIndex tile, Roadside s) { - SB(_m[tile].m4, 4, 3, s); + SB(_m[tile].m3, 4, 3, s); } static inline bool HasRoadWorks(TileIndex t) @@ -132,9 +132,9 @@ static inline bool IncreaseRoadWorksCounter(TileIndex t) { - AB(_m[t].m4, 0, 4, 1); + AB(_m[t].m3, 0, 4, 1); - return GB(_m[t].m4, 0, 4) == 15; + return GB(_m[t].m3, 0, 4) == 15; } static inline void StartRoadWorks(TileIndex t) @@ -153,7 +153,7 @@ assert(HasRoadWorks(t)); SetRoadside(t, (Roadside)(GetRoadside(t) - ROADSIDE_GRASS_ROAD_WORKS + ROADSIDE_GRASS)); /* Stop the counter */ - SB(_m[t].m4, 0, 4, 0); + SB(_m[t].m3, 0, 4, 0); } @@ -183,8 +183,8 @@ SetTileType(t, MP_STREET); SetTileOwner(t, owner); _m[t].m2 = town; - _m[t].m3 = 0; - _m[t].m4 = 0 << 7 | 0 << 4 | 0; + _m[t].m3 = 0 << 7 | 0 << 4 | 0; + _m[t].m4 = 0; _m[t].m5 = ROAD_TILE_NORMAL << 4 | bits; } @@ -194,8 +194,8 @@ SetTileType(t, MP_STREET); SetTileOwner(t, rail); _m[t].m2 = town; - _m[t].m3 = road; - _m[t].m4 = 0 << 7 | 0 << 4 | rt; + _m[t].m3 = 0 << 7 | 0 << 4 | rt; + _m[t].m4 = road; _m[t].m5 = ROAD_TILE_CROSSING << 4 | roaddir << 3 | 0 << 2; }
--- a/src/saveload.cpp +++ b/src/saveload.cpp @@ -28,7 +28,7 @@ #include "variables.h" #include <setjmp.h> -extern const uint16 SAVEGAME_VERSION = 47; +extern const uint16 SAVEGAME_VERSION = 48; uint16 _sl_version; ///< the major savegame version identifier byte _sl_minor_version; ///< the minor savegame version, DO NOT USE!
--- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -67,7 +67,7 @@ /* Power is not added for articulated parts */ if (IsArticulatedPart(u)) continue; - RailType railtype = (IsLevelCrossingTile(u->tile) ? GetRailTypeCrossing(u->tile) : GetRailType(u->tile)); + RailType railtype = GetRailType(u->tile); bool engine_has_power = HasPowerOnRail(u->u.rail.railtype, railtype); bool wagon_has_power = HasPowerOnRail(v->u.rail.railtype, railtype); @@ -2705,10 +2705,7 @@ return IsTileOwner(tile, v->owner) && ( !IsFrontEngine(v) || - HASBIT( - v->u.rail.compatible_railtypes, - IsTileType(tile, MP_STREET) ? GetRailTypeCrossing(tile) : GetRailType(tile) - ) + HASBIT(v->u.rail.compatible_railtypes, GetRailType(tile)) ); }