changeset 16760:9e31dde37aed draft

(svn r21493) -Codechange: don't use the full 32 bits of the level land command to tell whether to raise, lower or keep the level of the first selected tile
author rubidium <rubidium@openttd.org>
date Mon, 13 Dec 2010 11:21:53 +0000 (2010-12-13)
parents aa34ba5a7da1
children 89c7d67629e8
files src/ai/api/ai_tile.cpp src/map_type.h src/terraform_cmd.cpp src/terraform_gui.cpp
diffstat 4 files changed, 22 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- a/src/map_type.h
+++ b/src/map_type.h
@@ -75,4 +75,11 @@
  */
 #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 */
--- a/src/terraform_cmd.cpp
+++ b/src/terraform_cmd.cpp
@@ -378,7 +378,8 @@
  * @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 @@
 	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);
--- a/src/terraform_gui.cpp
+++ b/src/terraform_gui.cpp
@@ -110,13 +110,13 @@
 			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);