@@ -807,11 +807,28 @@ static void TileLoopTreesAlps(TileIndex tile)
|
|||||||
MarkTileDirtyByTile(tile);
|
MarkTileDirtyByTile(tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CanPlantExtraTrees(TileIndex tile)
|
/*
|
||||||
|
* Check if trees on this tile are allowed to spread.
|
||||||
|
* If they are allowed to spread, they are also allowed to die.
|
||||||
|
* @param tile The tile to check.
|
||||||
|
* @return Whether trees on this tile can spread.
|
||||||
|
*/
|
||||||
|
static bool TreesOnTileCanSpread(TileIndex tile)
|
||||||
{
|
{
|
||||||
return ((_settings_game.game_creation.landscape == LandscapeType::Tropic && GetTropicZone(tile) == TROPICZONE_RAINFOREST) ?
|
/* Desert and rainforest trees need special handling. */
|
||||||
(_settings_game.construction.extra_tree_placement == ETP_SPREAD_ALL || _settings_game.construction.extra_tree_placement == ETP_SPREAD_RAINFOREST) :
|
if (_settings_game.game_creation.landscape == LandscapeType::Tropic) {
|
||||||
_settings_game.construction.extra_tree_placement == ETP_SPREAD_ALL);
|
switch (GetTropicZone(tile)) {
|
||||||
|
case TROPICZONE_DESERT:
|
||||||
|
/* Cacti never spread. */
|
||||||
|
return false;
|
||||||
|
case TROPICZONE_RAINFOREST:
|
||||||
|
return (_settings_game.construction.extra_tree_placement == ETP_SPREAD_ALL || _settings_game.construction.extra_tree_placement == ETP_SPREAD_RAINFOREST);
|
||||||
|
default:
|
||||||
|
return _settings_game.construction.extra_tree_placement == ETP_SPREAD_ALL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (_settings_game.construction.extra_tree_placement == ETP_SPREAD_ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void TileLoop_Trees(TileIndex tile)
|
static void TileLoop_Trees(TileIndex tile)
|
||||||
@@ -861,7 +878,7 @@ static void TileLoop_Trees(TileIndex tile)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: // add a tree
|
case 1: // add a tree
|
||||||
if (GetTreeCount(tile) < 4 && CanPlantExtraTrees(tile)) {
|
if (GetTreeCount(tile) < 4 && TreesOnTileCanSpread(tile)) {
|
||||||
AddTreeCount(tile, 1);
|
AddTreeCount(tile, 1);
|
||||||
SetTreeGrowth(tile, TreeGrowthStage::Growing1);
|
SetTreeGrowth(tile, TreeGrowthStage::Growing1);
|
||||||
break;
|
break;
|
||||||
@@ -869,13 +886,12 @@ static void TileLoop_Trees(TileIndex tile)
|
|||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
|
|
||||||
case 2: { // add a neighbouring tree
|
case 2: { // add a neighbouring tree
|
||||||
if (!CanPlantExtraTrees(tile)) break;
|
if (!TreesOnTileCanSpread(tile)) break;
|
||||||
|
|
||||||
TreeType treetype = GetTreeType(tile);
|
TreeType treetype = GetTreeType(tile);
|
||||||
|
|
||||||
tile += TileOffsByDir(static_cast<Direction>(Random() % DIR_END));
|
tile += TileOffsByDir(static_cast<Direction>(Random() % DIR_END));
|
||||||
|
|
||||||
/* Cacti don't spread */
|
|
||||||
if (!CanPlantTreesOnTile(tile, false)) return;
|
if (!CanPlantTreesOnTile(tile, false)) return;
|
||||||
|
|
||||||
/* Don't plant trees, if ground was freshly cleared */
|
/* Don't plant trees, if ground was freshly cleared */
|
||||||
@@ -893,7 +909,7 @@ static void TileLoop_Trees(TileIndex tile)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case TreeGrowthStage::Dead: // final stage of tree destruction
|
case TreeGrowthStage::Dead: // final stage of tree destruction
|
||||||
if (!CanPlantExtraTrees(tile)) {
|
if (!TreesOnTileCanSpread(tile)) {
|
||||||
/* if trees can't spread just plant a new one to prevent deforestation */
|
/* if trees can't spread just plant a new one to prevent deforestation */
|
||||||
SetTreeGrowth(tile, TreeGrowthStage::Growing1);
|
SetTreeGrowth(tile, TreeGrowthStage::Growing1);
|
||||||
} else if (GetTreeCount(tile) > 1) {
|
} else if (GetTreeCount(tile) > 1) {
|
||||||
|
|||||||
Reference in New Issue
Block a user