changeset 3103:e7803c7f5beb draft

(svn r3698) Add GetCrossingRailBits() and ComplementRoadBits(). Simplify the code by using them
author tron <tron@openttd.org>
date Wed, 01 Mar 2006 12:31:39 +0000
parents bef483a4087b
children a488aaa0e3ae
files rail_cmd.c road.h road_cmd.c
diffstat 3 files changed, 17 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/rail_cmd.c
+++ b/rail_cmd.c
@@ -434,23 +434,15 @@
 			break;
 
 		case MP_STREET: {
-			RoadBits bits;
-
 			if (!IsLevelCrossing(tile)) return CMD_ERROR;
 
 			/* This is a crossing, let's check if the direction is correct */
-			if (_m[tile].m5 & 8) {
-				if (track != TRACK_X) return CMD_ERROR;
-				bits = ROAD_Y;
-			} else {
-				if (track != TRACK_Y) return CMD_ERROR;
-				bits = ROAD_X;
-			}
+			if (GetCrossingRailBits(tile) != trackbit) return CMD_ERROR;
 
 			if (!(flags & DC_EXEC))
 				return _price.remove_rail;
 
-			MakeRoadNormal(tile, _m[tile].m3, bits, 0);
+			MakeRoadNormal(tile, _m[tile].m3, GetCrossingRoadBits(tile), 0);
 			break;
 		}
 
--- a/road.h
+++ b/road.h
@@ -17,6 +17,11 @@
 	ROAD_ALL = ROAD_X  | ROAD_Y
 } RoadBits;
 
+static inline RoadBits ComplementRoadBits(RoadBits r)
+{
+	return ROAD_ALL ^ r;
+}
+
 static inline RoadBits GetRoadBits(TileIndex tile)
 {
 	return GB(_m[tile].m5, 0, 4);
@@ -27,6 +32,12 @@
 	return _m[tile].m5 & 8 ? ROAD_Y : ROAD_X;
 }
 
+static inline TrackBits GetCrossingRailBits(TileIndex tile)
+{
+	return _m[tile].m5 & 8 ? TRACK_BIT_X : TRACK_BIT_Y;
+}
+
+
 typedef enum RoadType {
 	ROAD_NORMAL,
 	ROAD_CROSSING,
--- a/road_cmd.c
+++ b/road_cmd.c
@@ -235,21 +235,15 @@
 				}
 
 				case ROAD_CROSSING: {
-					TrackBits track;
-
-					if (!(ti.map5 & 8)) {
-						if (pieces & ROAD_Y) goto return_error;
-						track = TRACK_BIT_Y;
-					} else {
-						if (pieces & ROAD_X) goto return_error;
-						track = TRACK_BIT_X;
+					if (pieces & ComplementRoadBits(GetCrossingRoadBits(tile))) {
+						goto return_error;
 					}
 
 					cost = _price.remove_road * 2;
 					if (flags & DC_EXEC) {
 						ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
 
-						MakeRailNormal(tile, GetTileOwner(tile), track, GB(_m[tile].m4, 0, 4));
+						MakeRailNormal(tile, GetTileOwner(tile), GetCrossingRailBits(tile), GB(_m[tile].m4, 0, 4));
 						MarkTileDirtyByTile(tile);
 					}
 					return cost;
@@ -371,7 +365,7 @@
 					break;
 
 				case ROAD_CROSSING:
-					if (pieces != (ti.map5 & 8 ? ROAD_Y : ROAD_X)) { // XXX is this correct?
+					if (pieces != GetCrossingRoadBits(ti.tile)) { // XXX is this correct?
 						return_cmd_error(STR_1007_ALREADY_BUILT);
 					}
 					goto do_clear;