summaryrefslogtreecommitdiff
path: root/rail_map.h
diff options
context:
space:
mode:
authortron <tron@openttd.org>2006-06-18 15:28:29 +0000
committertron <tron@openttd.org>2006-06-18 15:28:29 +0000
commit000497273c55cf71cda01200e49b24a5249c6422 (patch)
tree76829680f3512a205c958d3557a4ef7c8c99b869 /rail_map.h
parent098bf494da4026d3c6cb1d6717191580af313b7f (diff)
downloadopenttd-000497273c55cf71cda01200e49b24a5249c6422.tar.xz
(svn r5309) Partially fix the rail header dependency fiasco: rail_map.h now depends on rail.h and not the other way round anymore
Diffstat (limited to 'rail_map.h')
-rw-r--r--rail_map.h98
1 files changed, 53 insertions, 45 deletions
diff --git a/rail_map.h b/rail_map.h
index 44a42f9aa..bf32f5030 100644
--- a/rail_map.h
+++ b/rail_map.h
@@ -4,6 +4,7 @@
#define RAIL_MAP_H
#include "direction.h"
+#include "rail.h"
#include "tile.h"
@@ -59,17 +60,6 @@ static inline RailTileSubtype GetRailTileSubtype(TileIndex tile)
}
-typedef enum RailTypes {
- RAILTYPE_RAIL = 0,
- RAILTYPE_ELECTRIC = 1,
- RAILTYPE_MONO = 2,
- RAILTYPE_MAGLEV = 3,
- RAILTYPE_END,
- INVALID_RAILTYPE = 0xFF
-} RailType;
-
-typedef byte RailTypeMask;
-
static inline RailType GetRailType(TileIndex t)
{
return (RailType)GB(_m[t].m3, 0, 4);
@@ -103,40 +93,6 @@ static inline void SetRailTypeOnBridge(TileIndex t, RailType r)
}
-/** These are used to specify a single track.
- * Can be translated to a trackbit with TrackToTrackbit */
-typedef enum Track {
- TRACK_X = 0,
- TRACK_Y = 1,
- TRACK_UPPER = 2,
- TRACK_LOWER = 3,
- TRACK_LEFT = 4,
- TRACK_RIGHT = 5,
- TRACK_END,
- INVALID_TRACK = 0xFF
-} Track;
-
-
-/** Bitfield corresponding to Track */
-typedef enum TrackBits {
- TRACK_BIT_NONE = 0U,
- TRACK_BIT_X = 1U << TRACK_X,
- TRACK_BIT_Y = 1U << TRACK_Y,
- TRACK_BIT_UPPER = 1U << TRACK_UPPER,
- TRACK_BIT_LOWER = 1U << TRACK_LOWER,
- TRACK_BIT_LEFT = 1U << TRACK_LEFT,
- TRACK_BIT_RIGHT = 1U << TRACK_RIGHT,
- TRACK_BIT_CROSS = TRACK_BIT_X | TRACK_BIT_Y,
- TRACK_BIT_HORZ = TRACK_BIT_UPPER | TRACK_BIT_LOWER,
- TRACK_BIT_VERT = TRACK_BIT_LEFT | TRACK_BIT_RIGHT,
- TRACK_BIT_3WAY_NE = TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_RIGHT,
- TRACK_BIT_3WAY_SE = TRACK_BIT_Y | TRACK_BIT_LOWER | TRACK_BIT_RIGHT,
- TRACK_BIT_3WAY_SW = TRACK_BIT_X | TRACK_BIT_LOWER | TRACK_BIT_LEFT,
- TRACK_BIT_3WAY_NW = TRACK_BIT_Y | TRACK_BIT_UPPER | TRACK_BIT_LEFT,
- TRACK_BIT_ALL = TRACK_BIT_CROSS | TRACK_BIT_HORZ | TRACK_BIT_VERT,
- TRACK_BIT_MASK = 0x3FU
-} TrackBits;
-
static inline TrackBits GetTrackBits(TileIndex tile)
{
return (TrackBits)GB(_m[tile].m5, 0, 6);
@@ -269,6 +225,58 @@ static inline SignalState GetSingleSignalState(TileIndex t, byte signalbit)
}
+/**
+ * Checks for the presence of signals (either way) on the given track on the
+ * given rail tile.
+ */
+static inline bool HasSignalOnTrack(TileIndex tile, Track track)
+{
+ assert(IsValidTrack(track));
+ return
+ GetRailTileType(tile) == RAIL_TILE_SIGNALS &&
+ (_m[tile].m3 & SignalOnTrack(track)) != 0;
+}
+
+/**
+ * Checks for the presence of signals along the given trackdir on the given
+ * rail tile.
+ *
+ * Along meaning if you are currently driving on the given trackdir, this is
+ * the signal that is facing us (for which we stop when it's red).
+ */
+static inline bool HasSignalOnTrackdir(TileIndex tile, Trackdir trackdir)
+{
+ assert (IsValidTrackdir(trackdir));
+ return
+ GetRailTileType(tile) == RAIL_TILE_SIGNALS &&
+ _m[tile].m3 & SignalAlongTrackdir(trackdir);
+}
+
+/**
+ * Gets the state of the signal along the given trackdir.
+ *
+ * Along meaning if you are currently driving on the given trackdir, this is
+ * the signal that is facing us (for which we stop when it's red).
+ */
+static inline SignalState GetSignalStateByTrackdir(TileIndex tile, Trackdir trackdir)
+{
+ assert(IsValidTrackdir(trackdir));
+ assert(HasSignalOnTrack(tile, TrackdirToTrack(trackdir)));
+ return _m[tile].m2 & SignalAlongTrackdir(trackdir) ?
+ SIGNAL_STATE_GREEN : SIGNAL_STATE_RED;
+}
+
+
+/**
+ * Return the rail type of tile, or INVALID_RAILTYPE if this is no rail tile.
+ * Note that there is no check if the given trackdir is actually present on
+ * the tile!
+ * The given trackdir is used when there are (could be) multiple rail types on
+ * one tile.
+ */
+RailType GetTileRailType(TileIndex tile, Trackdir trackdir);
+
+
typedef enum RailGroundType {
RAIL_MAP2LO_GROUND_MASK = 0xF,
RAIL_GROUND_BARREN = 0,