(svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
--- a/road_cmd.c Fri Mar 24 13:46:45 2006 +0000
+++ b/road_cmd.c Fri Mar 24 15:24:16 2006 +0000
@@ -776,7 +776,7 @@
if (GetCrossingRoadAxis(ti->tile) == AXIS_X) image++;
- if ((ti->map5 & 4) != 0) image += 2;
+ if (IsCrossingBarred(ti->tile)) image += 2;
if ( _m[ti->tile].m4 & 0x80) {
image += 8;
@@ -1059,10 +1059,10 @@
{
switch (GetRoadType(tile)) {
case ROAD_CROSSING:
- if (v->type == VEH_Train && GB(_m[tile].m5, 2, 1) == 0) {
+ if (v->type == VEH_Train && !IsCrossingBarred(tile)) {
/* train crossing a road */
SndPlayVehicleFx(SND_0E_LEVEL_CROSSING, v);
- SB(_m[tile].m5, 2, 1, 1);
+ BarCrossing(tile);
MarkTileDirtyByTile(tile);
}
break;
@@ -1084,8 +1084,7 @@
static void VehicleLeave_Road(Vehicle *v, TileIndex tile, int x, int y)
{
if (IsLevelCrossing(tile) && v->type == VEH_Train && v->next == NULL) {
- // Turn off level crossing lights
- SB(_m[tile].m5, 2, 1, 0);
+ UnbarCrossing(tile);
MarkTileDirtyByTile(tile);
}
}
--- a/road_map.h Fri Mar 24 13:46:45 2006 +0000
+++ b/road_map.h Fri Mar 24 15:24:16 2006 +0000
@@ -66,6 +66,20 @@
_m[t].m3 = o;
}
+static inline void UnbarCrossing(TileIndex t)
+{
+ CLRBIT(_m[t].m5, 2);
+}
+
+static inline void BarCrossing(TileIndex t)
+{
+ SETBIT(_m[t].m5, 2);
+}
+
+static inline bool IsCrossingBarred(TileIndex t)
+{
+ return HASBIT(_m[t].m5, 2);
+}
typedef enum RoadType {
ROAD_NORMAL,
--- a/train_cmd.c Fri Mar 24 13:46:45 2006 +0000
+++ b/train_cmd.c Fri Mar 24 15:24:16 2006 +0000
@@ -1482,8 +1482,8 @@
if (IsTileType(tile, MP_STREET) &&
IsLevelCrossing(tile) &&
VehicleFromPos(tile, &tile, TestTrainOnCrossing) == NULL && // empty?
- GB(_m[tile].m5, 2, 1) != 0) { // Lights on?
- SB(_m[tile].m5, 2, 1, 0); // Switch lights off
+ IsCrossingBarred(tile)) {
+ UnbarCrossing(tile);
MarkTileDirtyByTile(tile);
}
}
@@ -3206,8 +3206,8 @@
if ((ts &= (ts >> 16)) == 0) {
// make a rail/road crossing red
if (IsTileType(tile, MP_STREET) && IsLevelCrossing(tile)) {
- if (GB(_m[tile].m5, 2, 1) == 0) {
- SB(_m[tile].m5, 2, 1, 1);
+ if (!IsCrossingBarred(tile)) {
+ BarCrossing(tile);
SndPlayVehicleFx(SND_0E_LEVEL_CROSSING, v);
MarkTileDirtyByTile(tile);
}