1
0
Fork 0

(svn r20728) -Codechange: shuffle some code in CMD_BUILD_ROAD so it doesn't call CMD_LANDSCAPE_CLEAR in test-mode from exec-mode

release/1.1
yexo 2010-09-03 21:41:08 +00:00
parent 9b5808a89d
commit bd379e283f
1 changed files with 27 additions and 27 deletions

View File

@ -476,7 +476,7 @@ CommandCost CmdBuildRoad(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
Slope tileh = GetTileSlope(tile, NULL); 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)) { switch (GetTileType(tile)) {
case MP_ROAD: case MP_ROAD:
switch (GetRoadTileType(tile)) { switch (GetRoadTileType(tile)) {
@ -614,14 +614,17 @@ CommandCost CmdBuildRoad(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
default: { default: {
do_clear:; do_clear:;
CommandCost ret = DoCommand(tile, 0, 0, flags & ~DC_EXEC, CMD_LANDSCAPE_CLEAR); need_to_clear = true;
if (ret.Failed()) return ret;
cost.AddCost(ret);
tile_cleared = true;
break; 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) { if (other_bits != pieces) {
/* Check the foundation/slopes when adding road/tram bits */ /* Check the foundation/slopes when adding road/tram bits */
CommandCost ret = CheckRoadSlope(tileh, &pieces, existing, other_bits); CommandCost ret = CheckRoadSlope(tileh, &pieces, existing, other_bits);
@ -633,44 +636,41 @@ do_clear:;
cost.AddCost(ret); cost.AddCost(ret);
} }
if (!tile_cleared && IsTileType(tile, MP_ROAD)) { if (!need_to_clear) {
/* Don't put the pieces that already exist */ if (IsTileType(tile, MP_ROAD)) {
pieces &= ComplementRoadBits(existing); /* 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 */ /* Check if new road bits will have the same foundation as other existing road types */
if (IsNormalRoad(tile)) { if (IsNormalRoad(tile)) {
Slope slope = GetTileSlope(tile, NULL); Slope slope = GetTileSlope(tile, NULL);
Foundation found_new = GetRoadFoundation(slope, pieces | existing); Foundation found_new = GetRoadFoundation(slope, pieces | existing);
/* Test if all other roadtypes can be built at that foundation */ /* Test if all other roadtypes can be built at that foundation */
for (RoadType rtest = ROADTYPE_ROAD; rtest < ROADTYPE_END; rtest++) { for (RoadType rtest = ROADTYPE_ROAD; rtest < ROADTYPE_END; rtest++) {
if (rtest != rt) { // check only other road types if (rtest != rt) { // check only other road types
RoadBits bits = GetRoadBits(tile, rtest); RoadBits bits = GetRoadBits(tile, rtest);
/* do not check if there are not road bits of given type */ /* do not check if there are not road bits of given type */
if (bits != ROAD_NONE && GetRoadFoundation(slope, bits) != found_new) { if (bits != ROAD_NONE && GetRoadFoundation(slope, bits) != found_new) {
return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION);
}
} }
} }
} }
} }
}
if (!tile_cleared) {
CommandCost ret = EnsureNoVehicleOnGround(tile); CommandCost ret = EnsureNoVehicleOnGround(tile);
if (ret.Failed()) return ret; if (ret.Failed()) return ret;
}
}
cost.AddCost(CountBits(pieces) * _price[PR_BUILD_ROAD]); 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 */ /* Pay for *every* tile of the bridge or tunnel */
cost.MultiplyCost(GetTunnelBridgeLength(GetOtherTunnelBridgeEnd(tile), tile) + 2); cost.MultiplyCost(GetTunnelBridgeLength(GetOtherTunnelBridgeEnd(tile), tile) + 2);
} }
if (flags & DC_EXEC) { 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)) { switch (GetTileType(tile)) {
case MP_ROAD: { case MP_ROAD: {
RoadTileType rtt = GetRoadTileType(tile); RoadTileType rtt = GetRoadTileType(tile);