private static void ProcessTrees( ForesterArgs args, IList<Tree> treelist )
{
TreeShape[] shapeChoices;
switch ( args.Shape ) {
case TreeShape.Stickly:
shapeChoices = new[]{ TreeShape.Normal,
TreeShape.Bamboo,
TreeShape.Palm };
break;
case TreeShape.Procedural:
shapeChoices = new[]{ TreeShape.Round,
TreeShape.Cone };
break;
default:
shapeChoices = new[] { args.Shape };
break;
}
for ( int i = 0; i < treelist.Count; i++ ) {
TreeShape newshape = shapeChoices[args.Rand.Next( 0, shapeChoices.Length )];
Tree newTree;
switch ( newshape ) {
case TreeShape.Normal:
newTree = new NormalTree();
break;
case TreeShape.Bamboo:
newTree = new BambooTree();
break;
case TreeShape.Palm:
newTree = new PalmTree();
break;
case TreeShape.Round:
newTree = new RoundTree();
break;
case TreeShape.Cone:
newTree = new ConeTree();
break;
case TreeShape.Rainforest:
newTree = new RainforestTree();
break;
case TreeShape.Mangrove:
newTree = new MangroveTree();
break;
default:
throw new ArgumentException( "Unknown tree shape type" );
}
newTree.Copy( treelist[i] );
if ( args.MapHeightLimit ) {
int height = newTree.Height;
int ybase = newTree.Pos[1];
int mapHeight = args.Map.Height;
int foliageHeight;
if ( args.Shape == TreeShape.Rainforest ) {
foliageHeight = 2;
} else {
foliageHeight = 4;
}
if ( ybase + height + foliageHeight > mapHeight ) {
newTree.Height = mapHeight - ybase - foliageHeight;
}
}
if ( newTree.Height < 1 )
newTree.Height = 1;
newTree.Prepare();
treelist[i] = newTree;
}
}