Changeset - r15129:8dfbde8c1ebf
[Not reviewed]
master
0 1 0
smatz - 14 years ago 2010-05-08 14:36:56
smatz@openttd.org
(svn r19768) -Fix: half-desert tiles would never revert back to clear tiles
1 file changed with 29 insertions and 8 deletions:
0 comments (0 inline, 0 general)
src/clear_cmd.cpp
Show inline comments
 
@@ -189,19 +189,40 @@ static void TileLoopClearAlps(TileIndex 
 
	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);
0 comments (0 inline, 0 general)