/** Convert to or from snowy tiles. */ static void TileLoopClearAlps(TileIndex tile) { int k = GetTileZ(tile) - GetSnowLine() + 1; if (k < 0) { /* Below the snow line, do nothing if no snow. */ if (!IsSnowTile(tile)) return; } else { /* At or above the snow line, make snow tile if needed. */ if (!IsSnowTile(tile)) { MakeSnow(tile); MarkTileDirtyByTile(tile); return; } } /* Update snow density. */ uint current_density = GetClearDensity(tile); uint req_density = (k < 0) ? 0u : min((uint)k, 3); if (current_density < req_density) { AddClearDensity(tile, 1); } else if (current_density > req_density) { AddClearDensity(tile, -1); } else { /* Density at the required level. */ if (k >= 0) return; ClearSnow(tile); } MarkTileDirtyByTile(tile); }
static void TileLoop_Trees(TileIndex tile) { if (GetTreeGround(tile) == TREE_GROUND_SHORE) { TileLoop_Water(tile); } else { switch (_settings_game.game_creation.landscape) { case LT_TROPIC: TileLoopTreesDesert(tile); break; case LT_ARCTIC: TileLoopTreesAlps(tile); break; } } TileLoopClearHelper(tile); uint treeCounter = GetTreeCounter(tile); /* Handle growth of grass (under trees/on MP_TREES tiles) at every 8th processings, like it's done for grass on MP_CLEAR tiles. */ if ((treeCounter & 7) == 7 && GetTreeGround(tile) == TREE_GROUND_GRASS) { uint density = GetTreeDensity(tile); if (density < 3) { SetTreeGroundDensity(tile, TREE_GROUND_GRASS, density + 1); MarkTileDirtyByTile(tile); } } if (GetTreeCounter(tile) < 15) { AddTreeCounter(tile, 1); return; } SetTreeCounter(tile, 0); switch (GetTreeGrowth(tile)) { case 3: // regular sized tree if (_settings_game.game_creation.landscape == LT_TROPIC && GetTreeType(tile) != TREE_CACTUS && GetTropicZone(tile) == TROPICZONE_DESERT) { AddTreeGrowth(tile, 1); } else { switch (GB(Random(), 0, 3)) { case 0: // start destructing AddTreeGrowth(tile, 1); break; case 1: // add a tree if (GetTreeCount(tile) < 4) { AddTreeCount(tile, 1); SetTreeGrowth(tile, 0); break; } /* FALL THROUGH */ case 2: { // add a neighbouring tree /* Don't plant extra trees if that's not allowed. */ if ((_settings_game.game_creation.landscape == LT_TROPIC && GetTropicZone(tile) == TROPICZONE_RAINFOREST) ? _settings_game.construction.extra_tree_placement == ETP_NONE : _settings_game.construction.extra_tree_placement != ETP_ALL) { break; } TreeType treetype = GetTreeType(tile); tile += TileOffsByDir((Direction)(Random() & 7)); /* Cacti don't spread */ if (!CanPlantTreesOnTile(tile, false)) return; /* Don't plant trees, if ground was freshly cleared */ if (IsTileType(tile, MP_CLEAR) && GetClearGround(tile) == CLEAR_GRASS && GetClearDensity(tile) != 3) return; PlantTreesOnTile(tile, treetype, 0, 0); break; } default: return; } } break; case 6: // final stage of tree destruction if (GetTreeCount(tile) > 1) { /* more than one tree, delete it */ AddTreeCount(tile, -1); SetTreeGrowth(tile, 3); } else { /* just one tree, change type into MP_CLEAR */ switch (GetTreeGround(tile)) { case TREE_GROUND_SHORE: MakeShore(tile); break; case TREE_GROUND_GRASS: MakeClear(tile, CLEAR_GRASS, GetTreeDensity(tile)); break; case TREE_GROUND_ROUGH: MakeClear(tile, CLEAR_ROUGH, 3); break; case TREE_GROUND_ROUGH_SNOW: { uint density = GetTreeDensity(tile); MakeClear(tile, CLEAR_ROUGH, 3); MakeSnow(tile, density); break; } default: // snow or desert if (_settings_game.game_creation.landscape == LT_TROPIC) { MakeClear(tile, CLEAR_DESERT, GetTreeDensity(tile)); } else { uint density = GetTreeDensity(tile); MakeClear(tile, CLEAR_GRASS, 3); MakeSnow(tile, density); } break; } } break; default: AddTreeGrowth(tile, 1); break; } MarkTileDirtyByTile(tile); }