(svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
authorcelestar
Fri, 24 Mar 2006 15:24:16 +0000
changeset 3322 fa5d46929db9
parent 3321 c5f2375046bc
child 3323 cfda77cb7fed
(svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
road_cmd.c
road_map.h
train_cmd.c
--- 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);
 				}