changeset 16035:db77f9f00373 draft

(svn r20728) -Codechange: shuffle some code in CMD_BUILD_ROAD so it doesn't call CMD_LANDSCAPE_CLEAR in test-mode from exec-mode
author yexo <yexo@openttd.org>
date Fri, 03 Sep 2010 21:41:08 +0000
parents 7e7692b0e94d
children 86c457462b35
files src/road_cmd.cpp
diffstat 1 files changed, 27 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
@@ -476,7 +476,7 @@
 
 	Slope tileh = GetTileSlope(tile, NULL);
 
-	bool tile_cleared = false; // Used to remember that the tile was cleared during test run
+	bool need_to_clear = false;
 	switch (GetTileType(tile)) {
 		case MP_ROAD:
 			switch (GetRoadTileType(tile)) {
@@ -614,14 +614,17 @@
 
 		default: {
 do_clear:;
-			CommandCost ret = DoCommand(tile, 0, 0, flags & ~DC_EXEC, CMD_LANDSCAPE_CLEAR);
-			if (ret.Failed()) return ret;
-			cost.AddCost(ret);
-			tile_cleared = true;
+			need_to_clear = true;
 			break;
 		}
 	}
 
+	if (need_to_clear) {
+		CommandCost ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
+		if (ret.Failed()) return ret;
+		cost.AddCost(ret);
+	}
+
 	if (other_bits != pieces) {
 		/* Check the foundation/slopes when adding road/tram bits */
 		CommandCost ret = CheckRoadSlope(tileh, &pieces, existing, other_bits);
@@ -633,44 +636,41 @@
 		cost.AddCost(ret);
 	}
 
-	if (!tile_cleared && IsTileType(tile, MP_ROAD)) {
-		/* Don't put the pieces that already exist */
-		pieces &= ComplementRoadBits(existing);
+	if (!need_to_clear) {
+		if (IsTileType(tile, MP_ROAD)) {
+			/* Don't put the pieces that already exist */
+			pieces &= ComplementRoadBits(existing);
 
-		/* Check if new road bits will have the same foundation as other existing road types */
-		if (IsNormalRoad(tile)) {
-			Slope slope = GetTileSlope(tile, NULL);
-			Foundation found_new = GetRoadFoundation(slope, pieces | existing);
+			/* Check if new road bits will have the same foundation as other existing road types */
+			if (IsNormalRoad(tile)) {
+				Slope slope = GetTileSlope(tile, NULL);
+				Foundation found_new = GetRoadFoundation(slope, pieces | existing);
 
-			/* Test if all other roadtypes can be built at that foundation */
-			for (RoadType rtest = ROADTYPE_ROAD; rtest < ROADTYPE_END; rtest++) {
-				if (rtest != rt) { // check only other road types
-					RoadBits bits = GetRoadBits(tile, rtest);
-					/* do not check if there are not road bits of given type */
-					if (bits != ROAD_NONE && GetRoadFoundation(slope, bits) != found_new) {
-						return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION);
+				/* Test if all other roadtypes can be built at that foundation */
+				for (RoadType rtest = ROADTYPE_ROAD; rtest < ROADTYPE_END; rtest++) {
+					if (rtest != rt) { // check only other road types
+						RoadBits bits = GetRoadBits(tile, rtest);
+						/* do not check if there are not road bits of given type */
+						if (bits != ROAD_NONE && GetRoadFoundation(slope, bits) != found_new) {
+							return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION);
+						}
 					}
 				}
 			}
 		}
-	}
 
-	if (!tile_cleared) {
 		CommandCost ret = EnsureNoVehicleOnGround(tile);
 		if (ret.Failed()) return ret;
-	}
 
+	}
 	cost.AddCost(CountBits(pieces) * _price[PR_BUILD_ROAD]);
-	if (!tile_cleared && IsTileType(tile, MP_TUNNELBRIDGE)) {
+
+	if (!need_to_clear && IsTileType(tile, MP_TUNNELBRIDGE)) {
 		/* Pay for *every* tile of the bridge or tunnel */
 		cost.MultiplyCost(GetTunnelBridgeLength(GetOtherTunnelBridgeEnd(tile), tile) + 2);
 	}
 
 	if (flags & DC_EXEC) {
-		/* CmdBuildLongRoad calls us directly with DC_EXEC, so we may only clear the tile after all
-		 * fail/success tests have been done. */
-		if (tile_cleared) DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
-
 		switch (GetTileType(tile)) {
 			case MP_ROAD: {
 				RoadTileType rtt = GetRoadTileType(tile);