From 173b56b895eb929991d9c83233a2ad95e6b3f82e Mon Sep 17 00:00:00 2001 From: smatz Date: Sat, 8 May 2010 14:36:56 +0000 Subject: (svn r19768) -Fix: half-desert tiles would never revert back to clear tiles --- src/clear_cmd.cpp | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) (limited to 'src/clear_cmd.cpp') diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp index 6497ed1f1..2f91f2fd0 100644 --- a/src/clear_cmd.cpp +++ b/src/clear_cmd.cpp @@ -189,19 +189,40 @@ static void TileLoopClearAlps(TileIndex tile) 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); -- cgit v1.2.3-54-g00ecf