(svn r11759) -Feature: Add drag-n-drop support to the raise/lower land tools. Land is raised/lowered at the start and the rest of the area levelled to match. Patch by Roujin.
authorpeter1138
Fri, 04 Jan 2008 18:18:46 +0000
changeset 8196 784ea9554da3
parent 8195 7f4a17a2d14b
child 8197 3af783256580
(svn r11759) -Feature: Add drag-n-drop support to the raise/lower land tools. Land is raised/lowered at the start and the rest of the area levelled to match. Patch by Roujin.
src/clear_cmd.cpp
src/gui.h
src/main_gui.cpp
src/terraform_gui.cpp
--- a/src/clear_cmd.cpp	Fri Jan 04 17:25:53 2008 +0000
+++ b/src/clear_cmd.cpp	Fri Jan 04 18:18:46 2008 +0000
@@ -355,7 +355,7 @@
  * @param tile end tile of area-drag
  * @param flags for this command type
  * @param p1 start tile of area drag
- * @param p2 unused
+ * @param p2 height difference; eg raise (+1), lower (-1) or level (0)
  * @return  error or cost of terraforming
  */
 CommandCost CmdLevelLand(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
@@ -364,7 +364,7 @@
 	int ex;
 	int ey;
 	int sx, sy;
-	uint h, curh;
+	uint h, oldh, curh;
 	CommandCost money;
 	CommandCost ret;
 	CommandCost cost;
@@ -374,7 +374,13 @@
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
 	/* remember level height */
-	h = TileHeight(p1);
+	oldh = TileHeight(p1);
+
+	/* compute new height */
+	h = oldh + p2;
+
+	/* Check range of destination height */
+	if (h > MAX_TILE_HEIGHT) return_cmd_error((oldh == 0) ? STR_1003_ALREADY_AT_SEA_LEVEL : STR_1004_TOO_HIGH);
 
 	/* make sure sx,sy are smaller than ex,ey */
 	ex = TileX(tile);
--- a/src/gui.h	Fri Jan 04 17:25:53 2008 +0000
+++ b/src/gui.h	Fri Jan 04 18:18:46 2008 +0000
@@ -64,6 +64,8 @@
  * you've selected it. */
 enum {
 	DDSP_DEMOLISH_AREA,
+	DDSP_RAISE_AND_LEVEL_AREA,
+	DDSP_LOWER_AND_LEVEL_AREA,
 	DDSP_LEVEL_AREA,
 	DDSP_CREATE_DESERT,
 	DDSP_CREATE_ROCKS,
--- a/src/main_gui.cpp	Fri Jan 04 17:25:53 2008 +0000
+++ b/src/main_gui.cpp	Fri Jan 04 18:18:46 2008 +0000
@@ -1382,6 +1382,8 @@
 				case DDSP_CREATE_ROCKS:
 				case DDSP_CREATE_DESERT:
 				case DDSP_CREATE_WATER:
+				case DDSP_RAISE_AND_LEVEL_AREA:
+				case DDSP_LOWER_AND_LEVEL_AREA:
 				case DDSP_LEVEL_AREA:
 				case DDSP_DEMOLISH_AREA:
 					GUIPlaceProcDragXY(e);
--- a/src/terraform_gui.cpp	Fri Jan 04 17:25:53 2008 +0000
+++ b/src/terraform_gui.cpp	Fri Jan 04 18:18:46 2008 +0000
@@ -105,6 +105,12 @@
 		case DDSP_DEMOLISH_AREA:
 			DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
 			break;
+		case DDSP_RAISE_AND_LEVEL_AREA:
+			DoCommandP(end_tile, start_tile, 1, CcTerraform, CMD_LEVEL_LAND| CMD_MSG(STR_0808_CAN_T_RAISE_LAND_HERE));
+			break;
+		case DDSP_LOWER_AND_LEVEL_AREA:
+			DoCommandP(end_tile, start_tile, -1, CcTerraform, CMD_LEVEL_LAND | CMD_MSG(STR_0809_CAN_T_LOWER_LAND_HERE));
+			break;
 		case DDSP_LEVEL_AREA:
 			DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_LEVEL_LAND);
 			break;
@@ -143,18 +149,12 @@
 
 static void PlaceProc_RaiseLand(TileIndex tile)
 {
-	DoCommandP(
-		tile, SLOPE_N, 1, CcTerraform,
-		CMD_TERRAFORM_LAND | CMD_MSG(STR_0808_CAN_T_RAISE_LAND_HERE)
-	);
+	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_RAISE_AND_LEVEL_AREA);
 }
 
 static void PlaceProc_LowerLand(TileIndex tile)
 {
-	DoCommandP(
-		tile, SLOPE_N, 0, CcTerraform,
-		CMD_TERRAFORM_LAND | CMD_MSG(STR_0809_CAN_T_LOWER_LAND_HERE)
-	);
+	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_LOWER_AND_LEVEL_AREA);
 }
 
 void PlaceProc_LevelLand(TileIndex tile)
@@ -244,6 +244,8 @@
 		if (e->we.place.pt.x != -1) {
 			switch (e->we.place.select_proc) {
 				case DDSP_DEMOLISH_AREA:
+				case DDSP_RAISE_AND_LEVEL_AREA:
+				case DDSP_LOWER_AND_LEVEL_AREA:
 				case DDSP_LEVEL_AREA:
 					GUIPlaceProcDragXY(e);
 					break;