Remove global variable for terraforming errors

Add sanity checks on error tile in CcTerraform
pull/444/head
Jonathan G Rennison 2 years ago
parent 02cb1dc2c4
commit 4c61d4ce8b

@ -36,8 +36,6 @@ struct TerraformerState {
TileIndexToHeightMap tile_to_new_height; ///< The tiles for which the height has changed. TileIndexToHeightMap tile_to_new_height; ///< The tiles for which the height has changed.
}; };
TileIndex _terraform_err_tile; ///< first tile we couldn't terraform
/** /**
* Gets the TileHeight (height of north corner) of a tile as of current terraforming progress. * Gets the TileHeight (height of north corner) of a tile as of current terraforming progress.
* *
@ -123,8 +121,9 @@ static CommandCost TerraformTileHeight(TerraformerState *ts, TileIndex tile, int
*/ */
if (x == 1) x = 0; if (x == 1) x = 0;
if (y == 1) y = 0; if (y == 1) y = 0;
_terraform_err_tile = TileXY(x, y); CommandCost err(STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP);
return_cmd_error(STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP); err.SetTile(TileXY(x, y));
return err;
} }
/* Mark incident tiles that are involved in the terraforming. */ /* Mark incident tiles that are involved in the terraforming. */
@ -187,8 +186,6 @@ static CommandCost TerraformTileHeight(TerraformerState *ts, TileIndex tile, int
*/ */
CommandCost CmdTerraformLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) CommandCost CmdTerraformLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
{ {
_terraform_err_tile = INVALID_TILE;
CommandCost total_cost(EXPENSES_CONSTRUCTION); CommandCost total_cost(EXPENSES_CONSTRUCTION);
int direction = (p2 != 0 ? 1 : -1); int direction = (p2 != 0 ? 1 : -1);
TerraformerState ts; TerraformerState ts;
@ -258,20 +255,23 @@ CommandCost CmdTerraformLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
/* Check if bridge would take damage. */ /* Check if bridge would take damage. */
if (direction == 1 && bridge_height <= z_max) { if (direction == 1 && bridge_height <= z_max) {
_terraform_err_tile = t; // highlight the tile under the bridge CommandCost err(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST);
return_cmd_error(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); err.SetTile(t); // highlight the tile under the bridge
return err;
} }
/* Is the bridge above not too high afterwards? */ /* Is the bridge above not too high afterwards? */
if (direction == -1 && bridge_height > (z_min + _settings_game.construction.max_bridge_height)) { if (direction == -1 && bridge_height > (z_min + _settings_game.construction.max_bridge_height)) {
_terraform_err_tile = t; CommandCost err(STR_ERROR_BRIDGE_TOO_HIGH_AFTER_LOWER_LAND);
return_cmd_error(STR_ERROR_BRIDGE_TOO_HIGH_AFTER_LOWER_LAND); err.SetTile(t);
return err;
} }
} }
/* Check if tunnel would take damage */ /* Check if tunnel would take damage */
if (direction == -1 && IsTunnelInWay(t, z_min, ITIWF_IGNORE_CHUNNEL)) { if (direction == -1 && IsTunnelInWay(t, z_min, ITIWF_IGNORE_CHUNNEL)) {
_terraform_err_tile = t; // highlight the tile above the tunnel CommandCost err(STR_ERROR_EXCAVATION_WOULD_DAMAGE);
return_cmd_error(STR_ERROR_EXCAVATION_WOULD_DAMAGE); err.SetTile(t); // highlight the tile above the tunnel
return err;
} }
} }
@ -295,7 +295,7 @@ CommandCost CmdTerraformLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
} }
old_generating_world.Restore(); old_generating_world.Restore();
if (cost.Failed()) { if (cost.Failed()) {
_terraform_err_tile = t; cost.SetTile(t);
return cost; return cost;
} }
if (pass == 1) total_cost.AddCost(cost); if (pass == 1) total_cost.AddCost(cost);
@ -346,8 +346,6 @@ CommandCost CmdLevelLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
{ {
if (p1 >= MapSize()) return CMD_ERROR; if (p1 >= MapSize()) return CMD_ERROR;
_terraform_err_tile = INVALID_TILE;
/* remember level height */ /* remember level height */
uint oldh = TileHeight(p1); uint oldh = TileHeight(p1);

@ -52,8 +52,10 @@ void CcTerraform(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2
if (result.Succeeded()) { if (result.Succeeded()) {
if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_CONSTRUCTION_OTHER, tile); if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_CONSTRUCTION_OTHER, tile);
} else { } else {
extern TileIndex _terraform_err_tile; TileIndex err_tile = result.GetTile();
SetRedErrorSquare(_terraform_err_tile); if (err_tile == INVALID_TILE || IsValidTile(err_tile)) {
SetRedErrorSquare(err_tile);
}
} }
} }

Loading…
Cancel
Save