Remove global variable for terraforming errors
Add sanity checks on error tile in CcTerraform
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user