(svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
authortron
Wed, 15 Mar 2006 07:10:41 +0000
changeset 3209 98153d2f1ba7
parent 3208 a0cf0c614729
child 3210 2c3f6ea896f4
(svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
bridge_map.h
direction.h
tunnelbridge_cmd.c
--- a/bridge_map.h	Tue Mar 14 23:28:04 2006 +0000
+++ b/bridge_map.h	Wed Mar 15 07:10:41 2006 +0000
@@ -47,4 +47,51 @@
 	SB(_m[t].m5, 3, 3, 1 << 2 | TRANSPORT_ROAD);
 }
 
+
+static inline void MakeBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d, TransportType tt)
+{
+	uint northsouth = (d == DIAGDIR_NE || d == DIAGDIR_NW);
+
+	SetTileType(t, MP_TUNNELBRIDGE);
+	SetTileOwner(t, o);
+	_m[t].m2 = bridgetype << 4;
+	_m[t].m4 = 0;
+	_m[t].m5 = 1 << 7 | 0 << 6 | northsouth << 5 | tt << 1 | DiagDirToAxis(d);
+}
+
+static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d)
+{
+	MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_ROAD);
+	_m[t].m3 = 0;
+}
+
+static inline void MakeRailBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d, RailType r)
+{
+	MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_RAIL);
+	_m[t].m3 = r;
+}
+
+
+static inline void MakeBridgeMiddle(TileIndex t, uint bridgetype, uint piece, Axis a, TransportType tt)
+{
+	SetTileType(t, MP_TUNNELBRIDGE);
+	SetTileOwner(t, OWNER_NONE);
+	_m[t].m2 = bridgetype << 4 | piece;
+	_m[t].m3 = 0;
+	_m[t].m4 = 0;
+	_m[t].m5 = 1 << 7 | 1 << 6 | 0 << 5 | 0 << 3 | tt << 1 | a;
+}
+
+static inline void MakeRoadBridgeMiddle(TileIndex t, uint bridgetype, uint piece, Axis a)
+{
+	MakeBridgeMiddle(t, bridgetype, piece, a, TRANSPORT_ROAD);
+}
+
+static inline void MakeRailBridgeMiddle(TileIndex t, uint bridgetype, uint piece, Axis a, RailType r)
+{
+	MakeBridgeMiddle(t, bridgetype, piece, a, TRANSPORT_RAIL);
+	SB(_m[t].m3, 4, 4, r);
+}
+
+
 #endif
--- a/direction.h	Tue Mar 14 23:28:04 2006 +0000
+++ b/direction.h	Wed Mar 15 07:10:41 2006 +0000
@@ -102,4 +102,14 @@
 	return (Axis)(d & 1);
 }
 
+
+/*
+ * Converts an Axis to a DiagDirection
+ * Points always in the positive direction, i.e. S[EW]
+ */
+static inline DiagDirection AxisToDiagDir(Axis a)
+{
+	return (DiagDirection)(2 - a);
+}
+
 #endif
--- a/tunnelbridge_cmd.c	Tue Mar 14 23:28:04 2006 +0000
+++ b/tunnelbridge_cmd.c	Wed Mar 15 07:10:41 2006 +0000
@@ -309,23 +309,17 @@
 
 	/* do the drill? */
 	if (flags & DC_EXEC) {
-		/* build the start tile */
-		ModifyTile(ti_start.tile,
-			MP_SETTYPE(MP_TUNNELBRIDGE) |
-			MP_MAP2 | MP_MAP3LO | MP_MAPOWNER_CURRENT | MP_MAP5,
-			(bridge_type << 4), /* map2 */
-			railtype, /* map3_lo */
-			0x80 | direction | transport << 1 /* map5 */
-		);
+		DiagDirection dir = AxisToDiagDir(direction);
 
-		/* build the end tile */
-		ModifyTile(ti_end.tile,
-			MP_SETTYPE(MP_TUNNELBRIDGE) |
-			MP_MAP2 | MP_MAP3LO | MP_MAPOWNER_CURRENT | MP_MAP5,
-			(bridge_type << 4), /* map2 */
-			railtype, /* map3_lo */
-			0x80 | 0x20 | direction | transport << 1 /* map5 */
-		);
+		if (transport == TRANSPORT_RAIL) {
+			MakeRailBridgeRamp(ti_start.tile, _current_player, bridge_type, dir, railtype);
+			MakeRailBridgeRamp(ti_end.tile,   _current_player, bridge_type, ReverseDiagDir(dir), railtype);
+		} else {
+			MakeRoadBridgeRamp(ti_start.tile, _current_player, bridge_type, dir);
+			MakeRoadBridgeRamp(ti_end.tile,   _current_player, bridge_type, ReverseDiagDir(dir));
+		}
+		MarkTileDirtyByTile(ti_start.tile);
+		MarkTileDirtyByTile(ti_end.tile);
 	}
 
 	// position of middle part of the odd bridge (larger than MAX(i) otherwise)
@@ -380,12 +374,9 @@
 				break;
 		}
 
-		/* do middle part of bridge */
 		if (flags & DC_EXEC) {
 			uint piece;
 
-			SetTileType(tile, MP_TUNNELBRIDGE);
-
 			//bridges pieces sequence (middle parts)
 			// bridge len 1: 0
 			// bridge len 2: 0 1
@@ -411,9 +402,11 @@
 					piece = 2 + ((i % 2 == 0) ^ (i > odd_middle_part));
 			}
 
-			_m[tile].m2 = (bridge_type << 4) | piece;
-			SB(_m[tile].m3, 4, 4, railtype);
-			_m[tile].m5 = 0xC0 | transport << 1 | direction;
+			if (transport == TRANSPORT_RAIL) {
+				MakeRailBridgeMiddle(tile, bridge_type, piece, direction, railtype);
+			} else {
+				MakeRoadBridgeMiddle(tile, bridge_type, piece, direction);
+			}
 			switch (transport_under) {
 				case TRANSPORT_RAIL:  SetRailUnderBridge(tile, owner_under, rail_under); break;
 				case TRANSPORT_ROAD:  SetRoadUnderBridge(tile, owner_under); break;