Files
@ r3016:b28a60dfd364
Branch filter:
Location: cpp/openttd-patchpack/source/rail.c - annotation
r3016:b28a60dfd364
6.7 KiB
text/x-c
(svn r3596) -Codechange: [OSX] changed to use Apple's macros instead of OTTD macros for endian conversion
This increases the execution speed a lot since GCC can't detect the OTTD macro as an endian conversion
while Apple's code uses the instruction to convert endian instead of a series of instructions to produce the same result
Since we don't have that many endian conversions in the game, overall performance should not increase noteworthy
This increases the execution speed a lot since GCC can't detect the OTTD macro as an endian conversion
while Apple's code uses the instruction to convert endian instead of a series of instructions to produce the same result
Since we don't have that many endian conversions in the game, overall performance should not increase noteworthy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | r2186:5ee653b1b5e1 r2186:5ee653b1b5e1 r1948:23a8488e3554 r1948:23a8488e3554 r1942:ea8e39498c72 r1950:f617a407a75c r1942:ea8e39498c72 r1944:ed1b90ae1557 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1942:ea8e39498c72 r1942:ea8e39498c72 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1942:ea8e39498c72 r1942:ea8e39498c72 r2008:5e435ad4c8e4 r2008:5e435ad4c8e4 r2008:5e435ad4c8e4 r2008:5e435ad4c8e4 r2008:5e435ad4c8e4 r2008:5e435ad4c8e4 r2008:5e435ad4c8e4 r2008:5e435ad4c8e4 r2008:5e435ad4c8e4 r1942:ea8e39498c72 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1944:ed1b90ae1557 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1944:ed1b90ae1557 r1942:ea8e39498c72 r1942:ea8e39498c72 r1942:ea8e39498c72 r1944:ed1b90ae1557 r1944:ed1b90ae1557 r1942:ea8e39498c72 r1950:f617a407a75c r2006:bc0d47d1f3f0 r1950:f617a407a75c r1950:f617a407a75c r2030:855e256a4694 r1950:f617a407a75c r1950:f617a407a75c r1950:f617a407a75c r2049:7e26d55f0f4c r1950:f617a407a75c r1950:f617a407a75c r1950:f617a407a75c r1950:f617a407a75c r2049:7e26d55f0f4c r1950:f617a407a75c r1950:f617a407a75c r1950:f617a407a75c r2049:7e26d55f0f4c r1950:f617a407a75c r1950:f617a407a75c r1950:f617a407a75c r2049:7e26d55f0f4c r1950:f617a407a75c r2049:7e26d55f0f4c r1950:f617a407a75c r2049:7e26d55f0f4c r2049:7e26d55f0f4c r1950:f617a407a75c r2133:180eccd2c589 r2049:7e26d55f0f4c r1950:f617a407a75c r1950:f617a407a75c r1950:f617a407a75c r1950:f617a407a75c r1950:f617a407a75c r1950:f617a407a75c | /* $Id$ */
#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
* direction along with the trackdir */
const byte _signal_along_trackdir[] = {
0x80, 0x80, 0x80, 0x20, 0x40, 0x10, 0, 0,
0x40, 0x40, 0x40, 0x10, 0x80, 0x20
};
/* Maps a trackdir to the bit that stores its status in the map arrays, in the
* direction against the trackdir */
const byte _signal_against_trackdir[] = {
0x40, 0x40, 0x40, 0x10, 0x80, 0x20, 0, 0,
0x80, 0x80, 0x80, 0x20, 0x40, 0x10
};
/* Maps a Track to the bits that store the status of the two signals that can
* be present on the given track */
const byte _signal_on_track[] = {
0xC0, 0xC0, 0xC0, 0x30, 0xC0, 0x30
};
/* Maps a diagonal direction to the all trackdirs that are connected to any
* track entering in this direction (including those making 90 degree turns)
*/
const TrackdirBits _exitdir_reaches_trackdirs[] = {
TRACKDIR_BIT_DIAG1_NE | TRACKDIR_BIT_LOWER_E | TRACKDIR_BIT_LEFT_N, /* DIAGDIR_NE */
TRACKDIR_BIT_DIAG2_SE | TRACKDIR_BIT_LEFT_S | TRACKDIR_BIT_UPPER_E, /* DIAGDIR_SE */
TRACKDIR_BIT_DIAG1_SW | TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_RIGHT_S, /* DIAGDIR_SW */
TRACKDIR_BIT_DIAG2_NW | TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_LOWER_W /* DIAGDIR_NW */
};
const Trackdir _next_trackdir[] = {
TRACKDIR_DIAG1_NE, TRACKDIR_DIAG2_SE, TRACKDIR_LOWER_E, TRACKDIR_UPPER_E, TRACKDIR_RIGHT_S, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR,
TRACKDIR_DIAG1_SW, TRACKDIR_DIAG2_NW, TRACKDIR_LOWER_W, TRACKDIR_UPPER_W, TRACKDIR_RIGHT_N, TRACKDIR_LEFT_N
};
/* Maps a trackdir to all trackdirs that make 90 deg turns with it. */
const TrackdirBits _track_crosses_trackdirs[] = {
TRACKDIR_BIT_DIAG2_SE | TRACKDIR_BIT_DIAG2_NW, /* TRACK_DIAG1 */
TRACKDIR_BIT_DIAG1_NE | TRACKDIR_BIT_DIAG1_SW, /* TRACK_DIAG2 */
TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LEFT_S, /* TRACK_UPPER */
TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LEFT_S, /* TRACK_LOWER */
TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_LOWER_E, /* TRACK_LEFT */
TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_LOWER_E /* TRACK_RIGHT */
};
/* Maps a track to all tracks that make 90 deg turns with it. */
const TrackBits _track_crosses_tracks[] = {
TRACK_BIT_DIAG2, /* TRACK_DIAG1 */
TRACK_BIT_DIAG1, /* TRACK_DIAG2 */
TRACK_BIT_LEFT | TRACK_BIT_RIGHT, /* TRACK_UPPER */
TRACK_BIT_LEFT | TRACK_BIT_RIGHT, /* TRACK_LOWER */
TRACK_BIT_UPPER | TRACK_BIT_LOWER, /* TRACK_LEFT */
TRACK_BIT_UPPER | TRACK_BIT_LOWER /* TRACK_RIGHT */
};
/* Maps a trackdir to the (4-way) direction the tile is exited when following
* that trackdir */
const DiagDirection _trackdir_to_exitdir[] = {
DIAGDIR_NE,DIAGDIR_SE,DIAGDIR_NE,DIAGDIR_SE,DIAGDIR_SW,DIAGDIR_SE, DIAGDIR_NE,DIAGDIR_NE,
DIAGDIR_SW,DIAGDIR_NW,DIAGDIR_NW,DIAGDIR_SW,DIAGDIR_NW,DIAGDIR_NE,
};
const Trackdir _track_exitdir_to_trackdir[][DIAGDIR_END] = {
{TRACKDIR_DIAG1_NE, INVALID_TRACKDIR, TRACKDIR_DIAG1_SW, INVALID_TRACKDIR},
{INVALID_TRACKDIR, TRACKDIR_DIAG2_SE, INVALID_TRACKDIR, TRACKDIR_DIAG2_NW},
{TRACKDIR_UPPER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_W},
{INVALID_TRACKDIR, TRACKDIR_LOWER_E, TRACKDIR_LOWER_W, INVALID_TRACKDIR},
{INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LEFT_S, TRACKDIR_LEFT_N},
{TRACKDIR_RIGHT_N, TRACKDIR_RIGHT_S, INVALID_TRACKDIR, INVALID_TRACKDIR}
};
const Trackdir _track_enterdir_to_trackdir[][DIAGDIR_END] = { // TODO: replace magic with enums
{TRACKDIR_DIAG1_NE, INVALID_TRACKDIR, TRACKDIR_DIAG1_SW, INVALID_TRACKDIR},
{INVALID_TRACKDIR, TRACKDIR_DIAG2_SE, INVALID_TRACKDIR, TRACKDIR_DIAG2_NW},
{INVALID_TRACKDIR, TRACKDIR_UPPER_E, TRACKDIR_UPPER_W, INVALID_TRACKDIR},
{TRACKDIR_LOWER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_W},
{TRACKDIR_LEFT_N, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR},
{INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_RIGHT_S, TRACKDIR_RIGHT_N}
};
const Trackdir _track_direction_to_trackdir[][DIR_END] = {
{INVALID_TRACKDIR, TRACKDIR_DIAG1_NE, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_DIAG1_SW, INVALID_TRACKDIR, INVALID_TRACKDIR},
{INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_DIAG2_SE, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_DIAG2_NW},
{INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_W, INVALID_TRACKDIR},
{INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_W, INVALID_TRACKDIR},
{TRACKDIR_LEFT_N, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR},
{TRACKDIR_RIGHT_N, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_RIGHT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR}
};
const Trackdir _dir_to_diag_trackdir[] = {
TRACKDIR_DIAG1_NE, TRACKDIR_DIAG2_SE, TRACKDIR_DIAG1_SW, TRACKDIR_DIAG2_NW,
};
const DiagDirection _reverse_diagdir[] = {
DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE, DIAGDIR_SE
};
const Trackdir _reverse_trackdir[] = {
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, Trackdir trackdir)
{
RailType type = INVALID_RAILTYPE;
DiagDirection exitdir = TrackdirToExitdir(trackdir);
switch (GetTileType(tile)) {
case MP_RAILWAY:
/* railway track */
type = _m[tile].m3 & RAILTYPE_MASK;
break;
case MP_STREET:
/* rail/road crossing */
if (IsLevelCrossing(tile))
type = _m[tile].m4 & RAILTYPE_MASK;
break;
case MP_STATION:
if (IsTrainStationTile(tile))
type = _m[tile].m3 & RAILTYPE_MASK;
break;
case MP_TUNNELBRIDGE:
/* railway tunnel */
if ((_m[tile].m5 & 0xFC) == 0) type = _m[tile].m3 & RAILTYPE_MASK;
/* railway bridge ending */
if ((_m[tile].m5 & 0xC6) == 0x80) type = _m[tile].m3 & RAILTYPE_MASK;
/* on railway bridge */
if ((_m[tile].m5 & 0xC6) == 0xC0 && ((DiagDirection)(_m[tile].m5 & 0x1)) == (exitdir & 0x1))
type = (_m[tile].m3 >> 4) & RAILTYPE_MASK;
/* under bridge (any type) */
if ((_m[tile].m5 & 0xC0) == 0xC0 && (_m[tile].m5 & 0x1U) != (exitdir & 0x1))
type = _m[tile].m3 & RAILTYPE_MASK;
break;
default:
break;
}
return type;
}
|