changeset 14417:b5a77c309ac3 draft

(svn r18974) -Fix [FS#3578]: CMD_BUILD_ROAD missed CMD_AUTO. Also do not access tiles anymore after clearing them; that fails either in test or exec run.
author frosch <frosch@openttd.org>
date Sun, 31 Jan 2010 20:28:36 +0000
parents 4ab0cc96d96e
children 1a5f2a839c10
files src/command.cpp src/road_cmd.cpp
diffstat 2 files changed, 6 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/command.cpp
+++ b/src/command.cpp
@@ -221,7 +221,7 @@
 	{CmdRemoveRoadStop,                             0}, // CMD_REMOVE_ROAD_STOP
 	{CmdBuildLongRoad,        CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_LONG_ROAD
 	{CmdRemoveLongRoad,        CMD_NO_TEST | CMD_AUTO}, // CMD_REMOVE_LONG_ROAD; towns may disallow removing road bits (as they are connected) in test, but in exec they're removed and thus removing is allowed.
-	{CmdBuildRoad,                                  0}, // CMD_BUILD_ROAD
+	{CmdBuildRoad,            CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_ROAD
 	{CmdRemoveRoad,                                 0}, // CMD_REMOVE_ROAD
 	{CmdBuildRoadDepot,       CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_ROAD_DEPOT
 
--- a/src/road_cmd.cpp
+++ b/src/road_cmd.cpp
@@ -483,6 +483,7 @@
 
 	Slope tileh = GetTileSlope(tile, NULL);
 
+	bool tile_cleared = false; // Used to remember that the tile was cleared during test run
 	switch (GetTileType(tile)) {
 		case MP_ROAD:
 			switch (GetRoadTileType(tile)) {
@@ -601,6 +602,7 @@
 			CommandCost ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 			if (ret.Failed()) return ret;
 			cost.AddCost(ret);
+			tile_cleared = true;
 		} break;
 	}
 
@@ -615,7 +617,7 @@
 		cost.AddCost(ret);
 	}
 
-	if (IsTileType(tile, MP_ROAD)) {
+	if (!tile_cleared && IsTileType(tile, MP_ROAD)) {
 		/* Don't put the pieces that already exist */
 		pieces &= ComplementRoadBits(existing);
 
@@ -637,10 +639,10 @@
 		}
 	}
 
-	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+	if (!tile_cleared && !EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 	cost.AddCost(CountBits(pieces) * _price[PR_BUILD_ROAD]);
-	if (IsTileType(tile, MP_TUNNELBRIDGE)) {
+	if (!tile_cleared && IsTileType(tile, MP_TUNNELBRIDGE)) {
 		/* Pay for *every* tile of the bridge or tunnel */
 		cost.MultiplyCost(GetTunnelBridgeLength(GetOtherTunnelBridgeEnd(tile), tile) + 2);
 	}