From b68d263d5f58c7cba13b6b9e1c57747e041ea7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Fri, 9 Feb 2024 18:17:08 +0100 Subject: [PATCH] Fix #12014: Remove water when area clearing ship depot (#12030) --- src/landscape.cpp | 2 ++ src/water_cmd.cpp | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/landscape.cpp b/src/landscape.cpp index 9202253a1b..43dacf8a35 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -712,6 +712,8 @@ std::tuple CmdClearArea(DoCommandFlag flags, TileIndex tile, const Company *c = (flags & (DC_AUTO | DC_BANKRUPT)) ? nullptr : Company::GetIfValid(_current_company); int limit = (c == nullptr ? INT32_MAX : GB(c->clear_limit, 16, 16)); + if (tile != start_tile) flags |= DC_FORCE_CLEAR_TILE; + std::unique_ptr iter = TileIterator::Create(tile, start_tile, diagonal); for (; *iter != INVALID_TILE; ++(*iter)) { TileIndex t = *iter; diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 21bf4dbd21..d503bfcda4 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -273,16 +273,19 @@ static CommandCost RemoveShipDepot(TileIndex tile, DoCommandFlag flags) if (ret.Failed()) return ret; } + bool do_clear = (flags & DC_FORCE_CLEAR_TILE) != 0; + if (flags & DC_EXEC) { delete Depot::GetByTile(tile); Company *c = Company::GetIfValid(GetTileOwner(tile)); if (c != nullptr) { c->infrastructure.water -= 2 * LOCK_DEPOT_TILE_FACTOR; + if (do_clear && GetWaterClass(tile) == WATER_CLASS_CANAL) c->infrastructure.water--; DirtyCompanyInfrastructureWindows(c->index); } - MakeWaterKeepingClass(tile, GetTileOwner(tile)); + if (!do_clear) MakeWaterKeepingClass(tile, GetTileOwner(tile)); MakeWaterKeepingClass(tile2, GetTileOwner(tile2)); }