# HG changeset patch # User rubidium # Date 1195893904 0 # Node ID e408508f5727306d81280621ffb843c4529632b6 # Parent 91d47e2ebc1ab1e73120199b26eb637f9eced459 (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build. diff -r 91d47e2ebc1a -r e408508f5727 src/dock_gui.cpp --- a/src/dock_gui.cpp Fri Nov 23 16:50:54 2007 +0000 +++ b/src/dock_gui.cpp Sat Nov 24 08:45:04 2007 +0000 @@ -16,6 +16,7 @@ #include "sound.h" #include "command.h" #include "variables.h" +#include "water.h" static void ShowBuildDockStationPicker(); static void ShowBuildDocksDepotPicker(); diff -r 91d47e2ebc1a -r e408508f5727 src/functions.h --- a/src/functions.h Fri Nov 23 16:50:54 2007 +0000 +++ b/src/functions.h Sat Nov 24 08:45:04 2007 +0000 @@ -17,10 +17,6 @@ void DrawClearLandFence(const TileInfo *ti); void TileLoopClearHelper(TileIndex tile); -/* water_land.cpp */ -void DrawShipDepotSprite(int x, int y, int image); -void TileLoop_Water(TileIndex tile); - /* players.cpp */ bool CheckPlayerHasMoney(CommandCost cost); void SubtractMoneyFromPlayer(CommandCost cost); diff -r 91d47e2ebc1a -r e408508f5727 src/industry_cmd.cpp --- a/src/industry_cmd.cpp Fri Nov 23 16:50:54 2007 +0000 +++ b/src/industry_cmd.cpp Sat Nov 24 08:45:04 2007 +0000 @@ -40,6 +40,7 @@ #include "misc/autoptr.hpp" #include "autoslope.h" #include "transparency.h" +#include "water.h" void ShowIndustryViewWindow(int industry); void BuildOilRig(TileIndex tile); diff -r 91d47e2ebc1a -r e408508f5727 src/rail_cmd.cpp --- a/src/rail_cmd.cpp Fri Nov 23 16:50:54 2007 +0000 +++ b/src/rail_cmd.cpp Sat Nov 24 08:45:04 2007 +0000 @@ -41,6 +41,7 @@ #include "misc/autoptr.hpp" #include "autoslope.h" #include "transparency.h" +#include "water.h" const byte _track_sloped_sprites[14] = { 14, 15, 22, 13, diff -r 91d47e2ebc1a -r e408508f5727 src/station_cmd.cpp --- a/src/station_cmd.cpp Fri Nov 23 16:50:54 2007 +0000 +++ b/src/station_cmd.cpp Sat Nov 24 08:45:04 2007 +0000 @@ -44,6 +44,7 @@ #include "strings.h" #include "autoslope.h" #include "transparency.h" +#include "water.h" DEFINE_OLD_POOL_GENERIC(Station, Station) DEFINE_OLD_POOL_GENERIC(RoadStop, RoadStop) @@ -1899,12 +1900,7 @@ /* We have to set the water tile's state to the same state as before the * buoy was placed. Otherwise one could plant a buoy on a canal edge, * remove it and flood the land (if the canal edge is at level 0) */ - Owner o = GetTileOwner(tile); - if (o == OWNER_WATER) { - MakeWater(tile); - } else { - MakeCanal(tile, o); - } + MakeWaterOrCanalDependingOnSurroundings(tile, GetTileOwner(tile)); MarkTileDirtyByTile(tile); UpdateStationVirtCoordDirty(st); @@ -2040,7 +2036,7 @@ if (flags & DC_EXEC) { DoClearSquare(tile1); - MakeWater(tile2); + MakeWaterOrCanalDependingOnSurroundings(tile2, st->owner); st->rect.AfterRemoveTile(st, tile1); st->rect.AfterRemoveTile(st, tile2); @@ -2064,9 +2060,6 @@ return &_station_display_datas[st][gfx]; } -/* For drawing canal edges on buoys */ -extern void DrawCanalWater(TileIndex tile); - static void DrawTile_Station(TileInfo *ti) { const DrawTileSprites *t = NULL; diff -r 91d47e2ebc1a -r e408508f5727 src/water.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/water.h Sat Nov 24 08:45:04 2007 +0000 @@ -0,0 +1,13 @@ +/* $Id$ */ + +/** @file water.h Functions related to water (management) */ + +#ifndef WATER_H +#define WATER_H + +void TileLoop_Water(TileIndex tile); +void DrawShipDepotSprite(int x, int y, int image); +void DrawCanalWater(TileIndex tile); +void MakeWaterOrCanalDependingOnSurroundings(TileIndex t, Owner o); + +#endif /* WATER_H */ diff -r 91d47e2ebc1a -r e408508f5727 src/water_cmd.cpp --- a/src/water_cmd.cpp Fri Nov 23 16:50:54 2007 +0000 +++ b/src/water_cmd.cpp Sat Nov 24 08:45:04 2007 +0000 @@ -55,6 +55,42 @@ static Vehicle *FindFloodableVehicleOnTile(TileIndex tile); static void FloodVehicle(Vehicle *v); +/** + * Makes a tile canal or water depending on the surroundings. + * This as for example docks and shipdepots do not store + * whether the tile used to be canal or 'normal' water. + * @param t the tile to change. + * @param o the owner of the new tile. + */ +void MakeWaterOrCanalDependingOnSurroundings(TileIndex t, Owner o) +{ + assert(GetTileSlope(t, NULL) == SLOPE_FLAT); + + /* Non-sealevel -> canal */ + if (TileHeight(t) != 0) { + MakeCanal(t, o); + return; + } + + bool has_water = false; + bool has_canal = false; + + for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) { + TileIndex neighbour = TileAddByDiagDir(t, dir); + if (IsTileType(neighbour, MP_WATER)) { + has_water |= IsSea(neighbour) || IsCoast(neighbour); + has_canal |= IsCanal(neighbour); + } + } + if (has_canal || !has_water) { + MakeCanal(t, o); + } else { + MakeWater(t); + } + MarkTileDirtyByTile(t); +} + + /** Build a ship depot. * @param tile tile where ship depot is built * @param flags type of operation @@ -178,8 +214,8 @@ if (flags & DC_EXEC) { DoClearSquare(tile); - DoClearSquare(tile + delta); - DoClearSquare(tile - delta); + MakeWaterOrCanalDependingOnSurroundings(tile + delta, _current_player); + MakeWaterOrCanalDependingOnSurroundings(tile - delta, _current_player); } return CommandCost(_price.clear_water * 2);