summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ai/api/ai_tile.cpp2
-rw-r--r--src/map_type.h7
-rw-r--r--src/terraform_cmd.cpp14
-rw-r--r--src/terraform_gui.cpp6
4 files changed, 22 insertions, 7 deletions
diff --git a/src/ai/api/ai_tile.cpp b/src/ai/api/ai_tile.cpp
index 969ba9c0c..1fc9d9abf 100644
--- a/src/ai/api/ai_tile.cpp
+++ b/src/ai/api/ai_tile.cpp
@@ -234,7 +234,7 @@
EnforcePrecondition(false, start_tile < ::MapSize());
EnforcePrecondition(false, end_tile < ::MapSize());
- return AIObject::DoCommand(end_tile, start_tile, 0, CMD_LEVEL_LAND);
+ return AIObject::DoCommand(end_tile, start_tile, LM_LEVEL << 1, CMD_LEVEL_LAND);
}
/* static */ bool AITile::DemolishTile(TileIndex tile)
diff --git a/src/map_type.h b/src/map_type.h
index 9c1d1c925..93aded4d9 100644
--- a/src/map_type.h
+++ b/src/map_type.h
@@ -75,4 +75,11 @@ static const uint MAX_MAP_SIZE = 1 << MAX_MAP_SIZE_BITS; ///< Maximal map s
*/
#define STRAIGHT_TRACK_LENGTH 7071/10000
+/** Argument for CmdLevelLand describing what to do. */
+enum LevelMode {
+ LM_LEVEL, ///< Level the land.
+ LM_LOWER, ///< Lower the land.
+ LM_RAISE, ///< Raise the land.
+};
+
#endif /* MAP_TYPE_H */
diff --git a/src/terraform_cmd.cpp b/src/terraform_cmd.cpp
index 1b58a91da..406bdf5be 100644
--- a/src/terraform_cmd.cpp
+++ b/src/terraform_cmd.cpp
@@ -378,7 +378,8 @@ CommandCost CmdTerraformLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
* @param tile end tile of area-drag
* @param flags for this command type
* @param p1 start tile of area drag
- * @param p2 height difference; eg raise (+1), lower (-1) or level (0)
+ * @param p2 various bitstuffed data.
+ * bits 1 - 2: Mode of leveling \c LevelMode.
* @param text unused
* @return the cost of this operation or an error
*/
@@ -392,14 +393,21 @@ CommandCost CmdLevelLand(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
uint oldh = TileHeight(p1);
/* compute new height */
- uint h = oldh + (int8)p2;
+ uint h = oldh;
+ LevelMode lm = (LevelMode)GB(p2, 1, 2);
+ switch (lm) {
+ case LM_LEVEL: break;
+ case LM_RAISE: h++; break;
+ case LM_LOWER: h--; break;
+ default: return CMD_ERROR;
+ }
/* Check range of destination height */
if (h > MAX_TILE_HEIGHT) return_cmd_error((oldh == 0) ? STR_ERROR_ALREADY_AT_SEA_LEVEL : STR_ERROR_TOO_HIGH);
Money money = GetAvailableMoneyForCommand();
CommandCost cost(EXPENSES_CONSTRUCTION);
- CommandCost last_error((p2 == 0) ? STR_ERROR_ALREADY_LEVELLED : INVALID_STRING_ID);
+ CommandCost last_error(lm == LM_LEVEL ? STR_ERROR_ALREADY_LEVELLED : INVALID_STRING_ID);
bool had_success = false;
TileArea ta(tile, p1);
diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp
index 3c7dc199e..98f5a3fcc 100644
--- a/src/terraform_gui.cpp
+++ b/src/terraform_gui.cpp
@@ -110,13 +110,13 @@ bool GUIPlaceProcDragXY(ViewportDragDropSelectionProcess proc, TileIndex start_t
DoCommandP(end_tile, start_tile, 0, CMD_CLEAR_AREA | CMD_MSG(STR_ERROR_CAN_T_CLEAR_THIS_AREA), CcPlaySound10);
break;
case DDSP_RAISE_AND_LEVEL_AREA:
- DoCommandP(end_tile, start_tile, 1, CMD_LEVEL_LAND | CMD_MSG(STR_ERROR_CAN_T_RAISE_LAND_HERE), CcTerraform);
+ DoCommandP(end_tile, start_tile, LM_RAISE << 1, CMD_LEVEL_LAND | CMD_MSG(STR_ERROR_CAN_T_RAISE_LAND_HERE), CcTerraform);
break;
case DDSP_LOWER_AND_LEVEL_AREA:
- DoCommandP(end_tile, start_tile, (uint32)-1, CMD_LEVEL_LAND | CMD_MSG(STR_ERROR_CAN_T_LOWER_LAND_HERE), CcTerraform);
+ DoCommandP(end_tile, start_tile, LM_LOWER << 1, CMD_LEVEL_LAND | CMD_MSG(STR_ERROR_CAN_T_LOWER_LAND_HERE), CcTerraform);
break;
case DDSP_LEVEL_AREA:
- DoCommandP(end_tile, start_tile, 0, CMD_LEVEL_LAND | CMD_MSG(STR_ERROR_CAN_T_LEVEL_LAND_HERE), CcTerraform);
+ DoCommandP(end_tile, start_tile, LM_LEVEL << 1, CMD_LEVEL_LAND | CMD_MSG(STR_ERROR_CAN_T_LEVEL_LAND_HERE), CcTerraform);
break;
case DDSP_CREATE_ROCKS:
GenerateRockyArea(end_tile, start_tile);