changeset 15139:7c6ac8de8bfb draft

(svn r19768) -Fix: half-desert tiles would never revert back to clear tiles
author smatz <smatz@openttd.org>
date Sat, 08 May 2010 14:36:56 +0000
parents 9ce158e1d59e
children 8676e88fecb0
files src/clear_cmd.cpp
diffstat 1 files changed, 29 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/clear_cmd.cpp
+++ b/src/clear_cmd.cpp
@@ -189,19 +189,40 @@
 	MarkTileDirtyByTile(tile);
 }
 
+/**
+ * Tests if at least one surrounding tile is desert
+ * @param tile tile to check
+ * @return does this tile have at least one desert tile around?
+ */
+static inline bool NeighbourIsDesert(TileIndex tile)
+{
+	return GetTropicZone(tile + TileDiffXY(  1,  0)) == TROPICZONE_DESERT ||
+			GetTropicZone(tile + TileDiffXY( -1,  0)) == TROPICZONE_DESERT ||
+			GetTropicZone(tile + TileDiffXY(  0,  1)) == TROPICZONE_DESERT ||
+			GetTropicZone(tile + TileDiffXY(  0, -1)) == TROPICZONE_DESERT;
+}
+
 static void TileLoopClearDesert(TileIndex tile)
 {
-	if (IsClearGround(tile, CLEAR_DESERT)) return;
+	/* Current desert level - 0 if it is not desert */
+	uint current = 0;
+	if (IsClearGround(tile, CLEAR_DESERT)) current = GetClearDensity(tile);
 
+	/* Expected desert level - 0 if it shouldn't be desert */
+	uint expected = 0;
 	if (GetTropicZone(tile) == TROPICZONE_DESERT) {
-		SetClearGroundDensity(tile, CLEAR_DESERT, 3);
+		expected = 3;
+	} else if (NeighbourIsDesert(tile)) {
+		expected = 1;
+	}
+
+	if (current == expected) return;
+
+	if (expected == 0) {
+		SetClearGroundDensity(tile, CLEAR_GRASS, 3);
 	} else {
-		if (GetTropicZone(tile + TileDiffXY( 1,  0)) != TROPICZONE_DESERT &&
-				GetTropicZone(tile + TileDiffXY(-1,  0)) != TROPICZONE_DESERT &&
-				GetTropicZone(tile + TileDiffXY( 0,  1)) != TROPICZONE_DESERT &&
-				GetTropicZone(tile + TileDiffXY( 0, -1)) != TROPICZONE_DESERT)
-			return;
-		SetClearGroundDensity(tile, CLEAR_DESERT, 1);
+		/* Transition from clear to desert is not smooth (after clearing desert tile) */
+		SetClearGroundDensity(tile, CLEAR_DESERT, expected);
 	}
 
 	MarkTileDirtyByTile(tile);