mirror of https://github.com/OpenTTD/OpenTTD
(svn r20728) -Codechange: shuffle some code in CMD_BUILD_ROAD so it doesn't call CMD_LANDSCAPE_CLEAR in test-mode from exec-mode
parent
9b5808a89d
commit
bd379e283f
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue