From 6faabbf3ee48a594f0ef4592e45a5a0c1c9b8edf Mon Sep 17 00:00:00 2001 From: Hexus_One Date: Wed, 27 Mar 2019 04:02:57 +1100 Subject: [PATCH] Treedozer treats clear tiles as don't-care, so less commands are sent :) --HG-- branch : feature/treedozer --- src/terraform_gui.cpp | 89 +++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 33 deletions(-) diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index 42fa301cb6..38f4212da6 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -121,37 +121,34 @@ bool GUIPlaceProcDragXY(ViewportDragDropSelectionProcess proc, TileIndex start_t case DDSP_DEMOLISH_TREES: // loop through every tile and send a demolish command for each tree // orthogonal area - TileIndex tree_start_tile, prev_tile; - tree_start_tile = prev_tile = 0; + TileIndex tree_start_tile, tree_recent_tile, prev_tile; + tree_start_tile = tree_recent_tile = prev_tile = 0; if (!_ctrl_pressed) { OrthogonalTileArea square_area = OrthogonalTileArea(start_tile, end_tile); TILE_AREA_LOOP(curr_tile, square_area) { - // if we're on a consecutive tile - if (curr_tile == prev_tile + 1) { - if (GetTileType(prev_tile) != MP_TREES && GetTileType(curr_tile) == MP_TREES) { - tree_start_tile = curr_tile; - } else if (GetTileType(prev_tile) == MP_TREES && GetTileType(curr_tile) != MP_TREES) { - DoCommandP(tree_start_tile, prev_tile, 0, CMD_CLEAR_AREA | CMD_MSG(STR_ERROR_CAN_T_CLEAR_THIS_AREA), CcPlaySound_EXPLOSION); - } - // remaining cases include: both prev and curr are trees, or both prev and curr are not trees - /** - * first tile of the search, or we've just jumped to a new row - * (so prev_tile is last tile of previous row and curr_tile is first tile of new row) - */ - } else { - if (GetTileType(prev_tile) == MP_TREES) { - DoCommandP(tree_start_tile, prev_tile, 0, CMD_CLEAR_AREA | CMD_MSG(STR_ERROR_CAN_T_CLEAR_THIS_AREA), CcPlaySound_EXPLOSION); - } - if (GetTileType(curr_tile) == MP_TREES) { + // if we're on a non-consecutive tile or we've hit a black-marked tile + // safe tiles are: TREES or non-FIELD clear tiles (because they're expensive to demolish) + if (tree_start_tile != 0 && + (curr_tile != prev_tile + 1 || + (!IsTileType(curr_tile, MP_TREES) && (!IsTileType(curr_tile, MP_CLEAR) || IsClearGround(curr_tile, CLEAR_FIELDS))))) { + DoCommandP(tree_start_tile, tree_recent_tile, 0, CMD_CLEAR_AREA | CMD_MSG(STR_ERROR_CAN_T_CLEAR_THIS_AREA), CcPlaySound_EXPLOSION); + tree_start_tile = tree_recent_tile = 0; + } + // if current tile is a tree + if (IsTileType(curr_tile, MP_TREES)) { + if (tree_start_tile == 0) { tree_start_tile = curr_tile; } + tree_recent_tile = curr_tile; } prev_tile = curr_tile; } - // at this point prev_tile is the last tile of the selection - - // diagonal area (not working optimally yet) + // one last ride to flavortown + if (tree_start_tile != 0) { + DoCommandP(tree_start_tile, tree_recent_tile, 0, CMD_CLEAR_AREA | CMD_MSG(STR_ERROR_CAN_T_CLEAR_THIS_AREA), CcPlaySound_EXPLOSION); + } + // diagonal area } //*/ else { @@ -160,22 +157,27 @@ bool GUIPlaceProcDragXY(ViewportDragDropSelectionProcess proc, TileIndex start_t { // same as above but with a different criteria for consecutive tiles TileIndexDiffC tile_diff = TileIndexToTileIndexDiffC(curr_tile, prev_tile); - if ((tile_diff.x == 1 && tile_diff.y == 1) || (tile_diff.x == -1 && tile_diff.y == -1)){ - if (GetTileType(prev_tile) != MP_TREES && GetTileType(curr_tile) == MP_TREES) { - tree_start_tile = curr_tile; - } else if (GetTileType(prev_tile) == MP_TREES && GetTileType(curr_tile) != MP_TREES) { - DoCommandP(tree_start_tile, prev_tile, 1, CMD_CLEAR_AREA | CMD_MSG(STR_ERROR_CAN_T_CLEAR_THIS_AREA), CcPlaySound_EXPLOSION); - } - } else { - if (GetTileType(prev_tile) == MP_TREES) { - DoCommandP(tree_start_tile, prev_tile, 1, CMD_CLEAR_AREA | CMD_MSG(STR_ERROR_CAN_T_CLEAR_THIS_AREA), CcPlaySound_EXPLOSION); - } - if (GetTileType(curr_tile) == MP_TREES) { + // if we're on a non-consecutive tile or we've hit a black-marked tile + // safe tiles are: TREES or non-FIELD clear tiles (because they're expensive to demolish) + if (tree_start_tile != 0 && + (!((tile_diff.x == 1 && tile_diff.y == 1) || (tile_diff.x == -1 && tile_diff.y == -1)) || + (!IsTileType(curr_tile, MP_TREES) && (!IsTileType(curr_tile, MP_CLEAR) || IsClearGround(curr_tile, CLEAR_FIELDS))))) { + DoCommandP(tree_start_tile, tree_recent_tile, 1, CMD_CLEAR_AREA | CMD_MSG(STR_ERROR_CAN_T_CLEAR_THIS_AREA), CcPlaySound_EXPLOSION); + tree_start_tile = tree_recent_tile = 0; + } + // if current tile is a tree + if (IsTileType(curr_tile, MP_TREES)) { + if (tree_start_tile == 0) { tree_start_tile = curr_tile; } + tree_recent_tile = curr_tile; } prev_tile = curr_tile; } + // one last ride to flavortown + if (tree_start_tile != 0) { + DoCommandP(tree_start_tile, tree_recent_tile, 1, CMD_CLEAR_AREA | CMD_MSG(STR_ERROR_CAN_T_CLEAR_THIS_AREA), CcPlaySound_EXPLOSION); + } } //*/ break; @@ -226,6 +228,27 @@ struct TerraformToolbarWindow : Window { { } + virtual void DrawWidget(const Rect &r, int widget) const + { + if (widget == WID_TT_DEMOLISH_TREES) { + uint offset = this->IsWidgetLowered(WID_TT_DEMOLISH_TREES) ? 1 : 0; + ZoomLevelByte temp_zoom; + switch (_gui_zoom) { + case ZOOM_LVL_NORMAL: + temp_zoom = ZOOM_LVL_OUT_2X; + break; + case ZOOM_LVL_OUT_2X: + temp_zoom = ZOOM_LVL_OUT_4X; + break; + case ZOOM_LVL_OUT_4X: + temp_zoom = ZOOM_LVL_OUT_8X; + break; + } + Dimension d = GetSpriteSize(SPR_IMG_PLANTTREES, (Point *)0, temp_zoom); + DrawSprite(SPR_IMG_PLANTTREES, PAL_NONE, (r.left + r.right - d.width) / 2 + offset, (r.top + r.bottom - d.height) / 2 + offset, (const SubSprite *)0, temp_zoom); + } + } + virtual void OnInit() { /* Don't show the place object button when there are no objects to place. */