(svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
authorrubidium
Sat, 24 Nov 2007 08:45:04 +0000
changeset 7948 e408508f5727
parent 7947 91d47e2ebc1a
child 7949 730724a67d80
(svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
src/dock_gui.cpp
src/functions.h
src/industry_cmd.cpp
src/rail_cmd.cpp
src/station_cmd.cpp
src/water.h
src/water_cmd.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();
--- 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);
--- 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);
--- 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,
--- 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;
--- /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 */
--- 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);