(svn r3846) Add functions to set the type of stuff (clear, water, rail, road) under bridges
authortron
Mon, 13 Mar 2006 12:55:20 +0000
changeset 3189 1af302c5abd0
parent 3188 c2eb40c2224b
child 3190 f4094075e4b6
(svn r3846) Add functions to set the type of stuff (clear, water, rail, road) under bridges
bridge_map.h
rail_cmd.c
road_cmd.c
tunnelbridge_cmd.c
water_cmd.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bridge_map.h	Mon Mar 13 12:55:20 2006 +0000
@@ -0,0 +1,37 @@
+/* $Id$ */
+
+#ifndef BRIDGE_MAP_H
+#define BRIDGE_MAP_H
+
+#include "macros.h"
+#include "map.h"
+#include "rail.h"
+#include "tile.h"
+
+
+static inline void SetClearUnderBridge(TileIndex t)
+{
+	SetTileOwner(t, OWNER_NONE);
+	SB(_m[t].m5, 3, 3, 0 << 2 | 0);
+}
+
+static inline void SetWaterUnderBridge(TileIndex t)
+{
+	SetTileOwner(t, OWNER_WATER);
+	SB(_m[t].m5, 3, 3, 0 << 2 | 1);
+}
+
+static inline void SetRailUnderBridge(TileIndex t, Owner o, RailType r)
+{
+	SetTileOwner(t, o);
+	SB(_m[t].m5, 3, 3, 1 << 2 | TRANSPORT_RAIL);
+	SB(_m[t].m3, 0, 4, r);
+}
+
+static inline void SetRoadUnderBridge(TileIndex t, Owner o)
+{
+	SetTileOwner(t, o);
+	SB(_m[t].m5, 3, 3, 1 << 2 | TRANSPORT_ROAD);
+}
+
+#endif
--- a/rail_cmd.c	Mon Mar 13 07:12:49 2006 +0000
+++ b/rail_cmd.c	Mon Mar 13 12:55:20 2006 +0000
@@ -2,6 +2,7 @@
 
 #include "stdafx.h"
 #include "openttd.h"
+#include "bridge_map.h"
 #include "debug.h"
 #include "functions.h"
 #include "rail_map.h"
@@ -299,11 +300,7 @@
 					if (CmdFailed(ret)) return ret;
 					cost += ret;
 
-					if (flags & DC_EXEC) {
-						SetTileOwner(tile, _current_player);
-						SB(_m[tile].m3, 0, 4, p1);
-						_m[tile].m5 = (m5 & 0xC7) | 0x20; // railroad under bridge
-					}
+					if (flags & DC_EXEC) SetRailUnderBridge(tile, _current_player, p1);
 					break;
 
 				case 0x20: // rail already there
@@ -426,8 +423,7 @@
 			if (!(flags & DC_EXEC))
 				return _price.remove_rail;
 
-			SetTileOwner(tile, OWNER_NONE);
-			_m[tile].m5 = _m[tile].m5 & 0xC7;
+			SetClearUnderBridge(tile);
 			break;
 
 		case MP_STREET: {
--- a/road_cmd.c	Mon Mar 13 07:12:49 2006 +0000
+++ b/road_cmd.c	Mon Mar 13 12:55:20 2006 +0000
@@ -2,6 +2,7 @@
 
 #include "stdafx.h"
 #include "openttd.h"
+#include "bridge_map.h"
 #include "rail_map.h"
 #include "road_map.h"
 #include "table/sprites.h"
@@ -140,8 +141,7 @@
 
 			if (flags & DC_EXEC) {
 				ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
-				_m[tile].m5 = ti.map5 & 0xC7;
-				SetTileOwner(tile, OWNER_NONE);
+				SetClearUnderBridge(tile);
 				MarkTileDirtyByTile(tile);
 			}
 			return cost;
@@ -375,10 +375,8 @@
 			/* all checked, can build road now! */
 			cost = _price.build_road * 2;
 			if (flags & DC_EXEC) {
-				ModifyTile(tile,
-					MP_MAPOWNER_CURRENT | MP_MAP5,
-					(ti.map5 & 0xC7) | 0x28 // map5
-				);
+				SetRoadUnderBridge(tile, _current_player);
+				MarkTileDirtyByTile(tile);
 			}
 			return cost;
 
--- a/tunnelbridge_cmd.c	Mon Mar 13 07:12:49 2006 +0000
+++ b/tunnelbridge_cmd.c	Mon Mar 13 12:55:20 2006 +0000
@@ -7,6 +7,7 @@
 
 #include "stdafx.h"
 #include "openttd.h"
+#include "bridge_map.h"
 #include "rail_map.h"
 #include "road_map.h"
 #include "table/sprites.h"
@@ -334,6 +335,8 @@
 	delta = (direction == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
 	for (i = 0; i != bridge_len; i++) {
 		TransportType transport_under;
+		Owner owner_under = OWNER_NONE;
+		RailType rail_under = INVALID_RAILTYPE;
 		uint z;
 
 		tile += delta;
@@ -354,6 +357,8 @@
 					goto not_valid_below;
 				}
 				transport_under = TRANSPORT_RAIL;
+				owner_under = GetTileOwner(tile);
+				rail_under = GB(_m[tile].m3, 0, 4);
 				break;
 
 			case MP_STREET:
@@ -362,6 +367,7 @@
 					goto not_valid_below;
 				}
 				transport_under = TRANSPORT_ROAD;
+				owner_under = GetTileOwner(tile);
 				break;
 
 			default:
@@ -408,10 +414,10 @@
 			_m[tile].m2 = (bridge_type << 4) | piece;
 			SB(_m[tile].m3, 4, 4, railtype);
 			switch (transport_under) {
-				case TRANSPORT_RAIL:  _m[tile].m5 = 0xE0 | TRANSPORT_RAIL << 3 | transport << 1 | direction; break; // rail
-				case TRANSPORT_ROAD:  _m[tile].m5 = 0xE0 | TRANSPORT_ROAD << 3 | transport << 1 | direction; break; // road
-				case TRANSPORT_WATER: _m[tile].m5 = 0xC0 |              1 << 3 | transport << 1 | direction; break; // water
-				default:              _m[tile].m5 = 0xC0 |              0 << 3 | transport << 1 | direction; break; // grass
+				case TRANSPORT_RAIL:  SetRailUnderBridge(tile, owner_under, rail_under); break;
+				case TRANSPORT_ROAD:  SetRoadUnderBridge(tile, owner_under); break;
+				case TRANSPORT_WATER: SetWaterUnderBridge(tile); break;
+				default:              SetClearUnderBridge(tile); break;
 			}
 
 			MarkTileDirtyByTile(tile);
@@ -644,8 +650,7 @@
 		cost = (_m[tile].m5 & 8) ? _price.remove_road * 2 : _price.remove_rail;
 
 		if (flags & DC_EXEC) {
-			_m[tile].m5 = _m[tile].m5 & ~0x38;
-			SetTileOwner(tile, OWNER_NONE);
+			SetClearUnderBridge(tile);
 			MarkTileDirtyByTile(tile);
 		}
 		return cost;
@@ -658,8 +663,7 @@
 		if (!EnsureNoVehicleZ(tile, TilePixelHeight(tile))) return CMD_ERROR;
 		cost = _price.clear_water;
 		if (flags & DC_EXEC) {
-			_m[tile].m5 = _m[tile].m5 & ~0x38;
-			SetTileOwner(tile, OWNER_NONE);
+			SetClearUnderBridge(tile);
 			MarkTileDirtyByTile(tile);
 		}
 		return cost;
@@ -1355,7 +1359,7 @@
 			// the stuff BELOW the middle part is owned by the deleted player.
 			if (!(_m[tile].m5 & (1 << 4 | 1 << 3))) {
 				// convert railway into grass.
-				_m[tile].m5 &= ~(1 << 5 | 1 << 4 | 1 << 3); // no transport route under bridge anymore..
+				SetClearUnderBridge(tile);
 			} else {
 				// for road, change the owner of the road to local authority
 				SetTileOwner(tile, OWNER_NONE);
--- a/water_cmd.c	Mon Mar 13 07:12:49 2006 +0000
+++ b/water_cmd.c	Mon Mar 13 12:55:20 2006 +0000
@@ -2,6 +2,7 @@
 
 #include "stdafx.h"
 #include "openttd.h"
+#include "bridge_map.h"
 #include "table/sprites.h"
 #include "table/strings.h"
 #include "functions.h"
@@ -248,10 +249,7 @@
 				return_cmd_error(STR_1007_ALREADY_BUILT);
 			}
 
-			if (flags & DC_EXEC) {
-				// change owner to OWNER_WATER and set land under bridge bit to water
-				ModifyTile(tile, MP_MAP5 | MP_MAPOWNER, OWNER_WATER, _m[tile].m5 | 0x08);
-			}
+			if (flags & DC_EXEC) SetWaterUnderBridge(tile);
 		} else {
 			/* no bridge, try to clear it. */
 			int32 ret = DoCommandByTile(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
@@ -259,13 +257,13 @@
 			if (CmdFailed(ret)) return ret;
 			cost += ret;
 
-			if (flags & DC_EXEC) {
-				MakeWater(tile);
-				MarkTileDirtyByTile(tile);
-			}
+			if (flags & DC_EXEC) MakeWater(tile);
 		}
 
-		if (flags & DC_EXEC) MarkTilesAroundDirty(tile);
+		if (flags & DC_EXEC) {
+			MarkTileDirtyByTile(tile);
+			MarkTilesAroundDirty(tile);
+		}
 
 		cost += _price.clear_water;
 	} END_TILE_LOOP(tile, size_x, size_y, 0);
@@ -546,7 +544,7 @@
 			case MP_TUNNELBRIDGE:
 				// Middle part of bridge with clear land below?
 				if ((_m[target].m5 & 0xF8) == 0xC0) {
-					_m[target].m5 |= 0x08;
+					SetWaterUnderBridge(target);
 					MarkTileDirtyByTile(target);
 				}
 				break;
@@ -560,7 +558,8 @@
 			if ((m5 & 0xF8) == 0xC8 || (m5 & 0xF8) == 0xF0) return;
 
 			if ((m5 & 0xC0) == 0xC0) {
-				ModifyTile(target, MP_MAPOWNER | MP_MAP5, OWNER_WATER, (m5 & ~0x38) | 0x8);
+				SetWaterUnderBridge(target);
+				MarkTileDirtyByTile(target);
 				return;
 			}
 		}