diff -r ee5d398ea802 -r 6e4d384034d9 rail.c --- a/rail.c Fri Jun 17 13:39:59 2005 +0000 +++ b/rail.c Fri Jun 17 17:11:05 2005 +0000 @@ -1,6 +1,7 @@ #include "stdafx.h" #include "openttd.h" #include "rail.h" +#include "station.h" /* XXX: Below 3 tables store duplicate data. Maybe remove some? */ /* Maps a trackdir to the bit that stores its status in the map arrays, in the @@ -95,3 +96,39 @@ TRACKDIR_DIAG1_SW, TRACKDIR_DIAG2_NW, TRACKDIR_UPPER_W, TRACKDIR_LOWER_W, TRACKDIR_LEFT_N, TRACKDIR_RIGHT_N, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_DIAG1_NE, TRACKDIR_DIAG2_SE, TRACKDIR_UPPER_E, TRACKDIR_LOWER_E, TRACKDIR_LEFT_S, TRACKDIR_RIGHT_S }; + +RailType GetTileRailType(TileIndex tile, byte trackdir) +{ + RailType type = INVALID_RAILTYPE; + switch (GetTileType(tile)) { + case MP_RAILWAY: + /* railway track */ + type = _map3_lo[tile] & RAILTYPE_MASK; + break; + case MP_STREET: + /* rail/road crossing */ + if (IsLevelCrossing(tile)) + type = _map3_hi[tile] & RAILTYPE_MASK; + break; + case MP_STATION: + if (IsTrainStationTile(tile)) + type = _map3_lo[tile] & RAILTYPE_MASK; + break; + case MP_TUNNELBRIDGE: + /* railway tunnel */ + if ((_map5[tile] & 0xFC) == 0) type = _map3_lo[tile] & RAILTYPE_MASK; + /* railway bridge ending */ + if ((_map5[tile] & 0xC6) == 0x80) type = _map3_lo[tile] & RAILTYPE_MASK; + /* on railway bridge */ + if ((_map5[tile] & 0xC6) == 0xC0 && ((DiagDirection)(_map5[tile] & 0x1)) == (TrackdirToExitdir(trackdir) & 0x1)) + type = (_map3_lo[tile] >> 4) & RAILTYPE_MASK; + /* under bridge (any type) */ + if ((_map5[tile] & 0xC0) == 0xC0 && (_map5[tile] & 0x1) != (trackdir & 0x1)) + type = _map3_lo[tile] & RAILTYPE_MASK; + break; + default: + break; + } + return type; +} +