(svn r3837) Partially unmagicfy restoring the tiles when deleting a bridge
authortron
Sun, 12 Mar 2006 20:59:56 +0000
changeset 3187 6f83f483fed0
parent 3186 4317b5b295c4
child 3188 d1316a266fa8
(svn r3837) Partially unmagicfy restoring the tiles when deleting a bridge
Existing bug: When restoring a road piece which belongs to a town the town index unconditionally gets set to 0
tunnelbridge_cmd.c
--- a/tunnelbridge_cmd.c	Sun Mar 12 17:42:04 2006 +0000
+++ b/tunnelbridge_cmd.c	Sun Mar 12 20:59:56 2006 +0000
@@ -7,6 +7,7 @@
 
 #include "stdafx.h"
 #include "openttd.h"
+#include "rail_map.h"
 #include "road_map.h"
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -23,6 +24,7 @@
 #include "variables.h"
 #include "bridge.h"
 #include "train.h"
+#include "water_map.h"
 
 #include "table/bridge_land.h"
 
@@ -691,9 +693,7 @@
 	}
 
 	if (flags & DC_EXEC) {
-		byte m5;
-		uint c = tile;
-		uint16 new_data;
+		TileIndex c = tile;
 
 		//checks if the owner is town then decrease town rating by RATING_TUNNEL_BRIDGE_DOWN_STEP until
 		// you have a "Poor" (0) town rating
@@ -701,27 +701,34 @@
 			ChangeTownRating(t, RATING_TUNNEL_BRIDGE_DOWN_STEP, RATING_TUNNEL_BRIDGE_MINIMUM);
 
 		do {
-			m5 = _m[c].m5;
-
-			if (m5 & 0x40) {
-				if (m5 & 0x20) {
-					static const uint16 _new_data_table[] = {0x1002, 0x1001, 0x2005, 0x200A, 0, 0, 0, 0};
-					new_data = _new_data_table[((m5 & 0x18) >> 2) | (m5 & 1)];
-				}	else {
-					if (GB(m5, 3, 2) == 0) goto clear_it;
-					new_data = (GetTileSlope(c, NULL) == 0) ? 0x6000 : 0x6001;
+			if (!(_m[c].m5 & 0x40)) {
+				// bridge ramp
+				DoClearSquare(c);
+			} else {
+				// bridge middle part
+				if (_m[c].m5 & 0x20) {
+					// transport under bridge
+					if (GB(_m[c].m5, 3, 2) == TRANSPORT_RAIL) {
+						MakeRailNormal(c, GetTileOwner(c), _m[c].m5 & 1 ? TRACK_BIT_X : TRACK_BIT_Y, GB(_m[c].m3, 0, 3));
+					} else {
+						MakeRoadNormal(c, GetTileOwner(c), _m[c].m5 & 1 ? ROAD_X : ROAD_Y, 0); // XXX Determine town, missing till now
+					}
+					MarkTileDirtyByTile(c);
+				} else {
+					// clear under bridge
+					if (GB(_m[c].m5, 3, 2) == 0) {
+						// grass under bridge
+						DoClearSquare(c);
+					} else {
+						// water under bridge
+						if (GetTileSlope(c, NULL) == 0) {
+							MakeWater(c);
+						} else {
+							MakeShore(c);
+						}
+						MarkTileDirtyByTile(c);
+					}
 				}
-
-				SetTileType(c, new_data >> 12);
-				_m[c].m5 = (byte)new_data;
-				_m[c].m2 = 0;
-				_m[c].m4 &= 0x0F;
-
-				MarkTileDirtyByTile(c);
-
-			} else {
-clear_it:;
-				DoClearSquare(c);
 			}
 			c += (direction == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
 		} while (c <= endtile);