void OnTick()
{
// go through all tiles in one year
int amount = m_env.Width * m_env.Height / World.YEAR_LENGTH;
var woodMaterials = Materials.GetMaterials(MaterialCategory.Wood).ToArray();
var grassMaterials = Materials.GetMaterials(MaterialCategory.Grass).ToArray();
var r = m_env.World.Random;
for (int i = 0; i < amount; ++i)
{
var idx = m_currentIdx++;
if (m_currentIdx == m_env.Width * m_env.Height)
m_currentIdx = 0;
var p = m_env.GetRandomSurfaceLocation(idx);
var td = m_env.GetTileData(p);
if (td.ID == TileID.Sapling)
{
if (r.Next(100) < 80)
{
// any object prevents sapling from growing to tree
if (m_env.HasContents(p) == false)
{
// A sapling grows to a tree
td.ID = TileID.Tree;
m_env.SetTileData(p, td);
}
}
}
else if (td.ID == TileID.Tree)
{
if (r.Next(100) < 20)
{
// A tree dies
td.ID = TileID.DeadTree;
m_env.SetTileData(p, td);
}
}
else if (td.ID == TileID.DeadTree)
{
if (r.Next(100) < 60)
{
// A dead tree disappears
td.ID = TileID.Grass;
td.MaterialID = grassMaterials[r.Next(grassMaterials.Length)].ID;
m_env.SetTileData(p, td);
}
}
else if (m_numTrees < m_targetNumTrees && td.WaterLevel == 0 && td.IsClearFloor)
{
if (r.Next(100) < 60)
{
// A new sapling is planted
td.ID = TileID.Sapling;
td.MaterialID = woodMaterials[r.Next(woodMaterials.Length)].ID;
m_env.SetTileData(p, td);
}
}
}
}