Index: src/industry_cmd.cpp =================================================================== --- src/industry_cmd.cpp (revision 27198) +++ src/industry_cmd.cpp (working copy) @@ -1755,11 +1755,11 @@ i->location.Add(cur_tile); WaterClass wc = (IsWaterTile(cur_tile) ? GetWaterClass(cur_tile) : WATER_CLASS_INVALID); - + bool river = HasBit(_me[cur_tile].m6, 0); DoCommand(cur_tile, 0, 0, DC_EXEC | DC_NO_TEST_TOWN_RATING | DC_NO_MODIFY_TOWN_RATING, CMD_LANDSCAPE_CLEAR); - + if (river) SB(_me[cur_tile].m6, 0, 1, 1); MakeIndustry(cur_tile, i->index, it->gfx, Random(), wc); - + if (_generating_world) { SetIndustryConstructionCounter(cur_tile, 3); SetIndustryConstructionStage(cur_tile, 2); Index: src/station_cmd.cpp =================================================================== --- src/station_cmd.cpp (revision 27198) +++ src/station_cmd.cpp (working copy) @@ -2511,7 +2511,7 @@ /* Get the water class of the water tile before it is cleared.*/ WaterClass wc = GetWaterClass(tile_cur); - + bool river = HasBit(_me[tile_cur].m6, 0); ret = DoCommand(tile_cur, 0, 0, flags, CMD_LANDSCAPE_CLEAR); if (ret.Failed()) return ret; @@ -2551,7 +2551,7 @@ DirtyCompanyInfrastructureWindows(st->owner); MakeDock(tile, st->owner, st->index, direction, wc); - + if (river) SB(_me[tile + TileOffsByDiagDir(direction)].m6, 0, 1, 1); st->UpdateVirtCoord(); UpdateStationAcceptance(st, false); st->RecomputeIndustriesNear(); Index: src/water_cmd.cpp =================================================================== --- src/water_cmd.cpp (revision 27198) +++ src/water_cmd.cpp (working copy) @@ -123,6 +123,8 @@ CommandCost cost = CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_DEPOT_SHIP]); bool add_cost = !IsWaterTile(tile); + bool river1 = HasBit(_me[tile].m6, 0); + bool river2 = HasBit(_me[tile2].m6, 0); CommandCost ret = DoCommand(tile, 0, 0, flags | DC_AUTO, CMD_LANDSCAPE_CLEAR); if (ret.Failed()) return ret; if (add_cost) { @@ -145,7 +147,8 @@ } Company::Get(_current_company)->infrastructure.water += 2 * LOCK_DEPOT_TILE_FACTOR; DirtyCompanyInfrastructureWindows(_current_company); - + if (river1) SB(_me[tile].m6, 0, 1, 1); + if (river2) SB(_me[tile2].m6, 0, 1, 1); MakeShipDepot(tile, _current_company, depot->index, DEPOT_PART_NORTH, axis, wc1); MakeShipDepot(tile2, _current_company, depot->index, DEPOT_PART_SOUTH, axis, wc2); MarkTileDirtyByTile(tile); @@ -192,7 +195,7 @@ wc = WATER_CLASS_CANAL; } - + bool river = HasBit(_me[tile].m6, 0); /* Zero map array and terminate animation */ DoClearSquare(tile); @@ -199,7 +202,9 @@ /* Maybe change to water */ switch (wc) { case WATER_CLASS_SEA: MakeSea(tile); break; - case WATER_CLASS_CANAL: MakeCanal(tile, o, Random()); break; + case WATER_CLASS_CANAL: MakeCanal(tile, o, Random()); + if (river) SB(_me[tile].m6, 0, 1, 1); + break; case WATER_CLASS_RIVER: MakeRiver(tile, Random()); break; default: break; } @@ -231,9 +236,9 @@ c->infrastructure.water -= 2 * LOCK_DEPOT_TILE_FACTOR; DirtyCompanyInfrastructureWindows(c->index); } - MakeWaterKeepingClass(tile, GetTileOwner(tile)); MakeWaterKeepingClass(tile2, GetTileOwner(tile2)); + } return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_CLEAR_DEPOT_SHIP]); @@ -291,7 +296,8 @@ if (IsBridgeAbove(tile) || IsBridgeAbove(tile - delta) || IsBridgeAbove(tile + delta)) { return_cmd_error(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); } - + bool river_lower = HasBit(_me[tile - delta].m6, 0); + bool river_upper = HasBit(_me[tile + delta].m6, 0); if (flags & DC_EXEC) { /* Update company infrastructure counts. */ Company *c = Company::GetIfValid(_current_company); @@ -303,7 +309,8 @@ c->infrastructure.water += 3 * LOCK_DEPOT_TILE_FACTOR; // Lock is three tiles. DirtyCompanyInfrastructureWindows(_current_company); } - + if (river_lower) SB(_me[tile - delta].m6, 0, 1, 1); + if (river_upper) SB(_me[tile + delta].m6, 0, 1, 1); MakeLock(tile, _current_company, dir, wc_lower, wc_upper, wc_middle); MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile - delta); @@ -352,6 +359,7 @@ } MakeWaterKeepingClass(tile + delta, GetTileOwner(tile + delta)); MakeWaterKeepingClass(tile - delta, GetTileOwner(tile - delta)); + MarkCanalsAndRiversAroundDirty(tile); MarkCanalsAndRiversAroundDirty(tile - delta); MarkCanalsAndRiversAroundDirty(tile + delta); @@ -419,6 +427,7 @@ if (IsTileType(tile, MP_WATER) && (!IsTileOwner(tile, OWNER_WATER) || wc == WATER_CLASS_SEA)) continue; bool water = IsWaterTile(tile); + bool river = HasTileWaterClass(tile) && GetWaterClass(tile) == WATER_CLASS_RIVER; ret = DoCommand(tile, 0, 0, flags | DC_FORCE_CLEAR_TILE, CMD_LANDSCAPE_CLEAR); if (ret.Failed()) return ret; @@ -442,6 +451,7 @@ /* FALL THROUGH */ default: + if (river) SB(_me[tile].m6, 0, 1, 1); MakeCanal(tile, _current_company, Random()); if (Company::IsValidID(_current_company)) { Company::Get(_current_company)->infrastructure.water++; @@ -465,6 +475,7 @@ static CommandCost ClearTile_Water(TileIndex tile, DoCommandFlag flags) { + bool river = HasBit(_me[tile].m6, 0); switch (GetWaterTileType(tile)) { case WATER_TILE_CLEAR: { if (flags & DC_NO_WATER) return_cmd_error(STR_ERROR_CAN_T_BUILD_ON_WATER); @@ -492,6 +503,7 @@ DirtyCompanyInfrastructureWindows(owner); } DoClearSquare(tile); + if (river) MakeRiver(tile, Random()); MarkCanalsAndRiversAroundDirty(tile); }