From 72b72dbec37dc6cc8a26a4c093613e7857eeb3b5 Mon Sep 17 00:00:00 2001 From: peter1138 Date: Mon, 8 Apr 2019 10:15:11 +0100 Subject: [PATCH] Add: Press ctrl to build diagonal rivers in scenario editor. --- src/dock_gui.cpp | 4 ++-- src/lang/english.txt | 2 +- src/water_cmd.cpp | 16 +++++++++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index f5ebd1f7f0..69be76550d 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -161,7 +161,7 @@ struct BuildDocksToolbarWindow : Window { case WID_DT_RIVER: // Build river button (in scenario editor) if (_game_mode != GM_EDITOR) return; - HandlePlacePushButton(this, WID_DT_RIVER, SPR_CURSOR_RIVER, HT_RECT); + HandlePlacePushButton(this, WID_DT_RIVER, SPR_CURSOR_RIVER, HT_RECT | HT_DIAGONAL); break; case WID_DT_BUILD_AQUEDUCT: // Build aqueduct button @@ -238,7 +238,7 @@ struct BuildDocksToolbarWindow : Window { DoCommandP(end_tile, start_tile, (_game_mode == GM_EDITOR && _ctrl_pressed) ? WATER_CLASS_SEA : WATER_CLASS_CANAL, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_BUILD_CANALS), CcPlaySound_SPLAT_WATER); break; case DDSP_CREATE_RIVER: - DoCommandP(end_tile, start_tile, WATER_CLASS_RIVER, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_PLACE_RIVERS), CcPlaySound_SPLAT_WATER); + DoCommandP(end_tile, start_tile, WATER_CLASS_RIVER | (_ctrl_pressed ? 1 << 2 : 0), CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_PLACE_RIVERS), CcPlaySound_SPLAT_WATER); break; default: break; diff --git a/src/lang/english.txt b/src/lang/english.txt index 61fa2a91ba..f741841cfd 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2458,7 +2458,7 @@ STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Build sh STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Place a buoy which can be used as a waypoint. Shift toggles building/showing cost estimate STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Build aqueduct. Shift toggles building/showing cost estimate STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Define water area.{}Make a canal, unless Ctrl is held down at sea level, when it will flood the surroundings instead -STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Place rivers +STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Place rivers. Ctrl selects the area diagonally. # Ship depot construction window STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Ship Depot Orientation diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 03b321e686..8c4843a9f6 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -387,7 +387,9 @@ bool RiverModifyDesertZone(TileIndex tile, void *) * @param tile end tile of stretch-dragging * @param flags type of operation * @param p1 start tile of stretch-dragging - * @param p2 waterclass to build. sea and river can only be built in scenario editor + * @param p2 various bitstuffed data + * bits 0-1: waterclass to build. sea and river can only be built in scenario editor + * bit 2: Whether to use the Orthogonal (0) or Diagonal (1) iterator. * @param text unused * @return the cost of this operation or an error */ @@ -399,13 +401,17 @@ CommandCost CmdBuildCanal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 /* Outside of the editor you can only build canals, not oceans */ if (wc != WATER_CLASS_CANAL && _game_mode != GM_EDITOR) return CMD_ERROR; - TileArea ta(tile, p1); - /* Outside the editor you can only drag canals, and not areas */ - if (_game_mode != GM_EDITOR && ta.w != 1 && ta.h != 1) return CMD_ERROR; + if (_game_mode != GM_EDITOR) { + TileArea ta(tile, p1); + if (ta.w != 1 && ta.h != 1) return CMD_ERROR; + } CommandCost cost(EXPENSES_CONSTRUCTION); - TILE_AREA_LOOP(tile, ta) { + + TileIterator *iter = HasBit(p2, 2) ? (TileIterator *)new DiagonalTileIterator(tile, p1) : new OrthogonalTileIterator(tile, p1); + for (; *iter != INVALID_TILE; ++(*iter)) { + TileIndex tile = *iter; CommandCost ret; Slope slope = GetTileSlope(tile);