public ushort GetHeuristic(IntVector3 p) { // Add a bit random so that the river doesn't go straight var r = new MWCRandom(p, 1); return((ushort)(p.Z * 10 + r.Next(4))); }
public static void CreateVegetation(TerrainData terrain, Random random, int vegetationLimit) { var grassMaterials = Materials.GetMaterials(MaterialCategory.Grass).ToArray(); var woodMaterials = Materials.GetMaterials(MaterialCategory.Wood).ToArray(); var berryMaterials = Materials.GetMaterials(MaterialCategory.Berry).ToArray(); int baseSeed = random.Next(); if (baseSeed == 0) { baseSeed = 1; } terrain.Size.Plane.Range().AsParallel().ForAll(p2d => { int z = terrain.GetSurfaceLevel(p2d); var p = new IntVector3(p2d, z); if (z >= vegetationLimit) { return; } var td = terrain.GetTileData(p); if (td.WaterLevel > 0) { return; } if (terrain.GetMaterial(p.Down).Category != MaterialCategory.Soil) { return; } var r = new MWCRandom(p, baseSeed); int v = r.Next(100); if (v >= 95) { td.ID = TileID.Sapling; td.MaterialID = woodMaterials[r.Next(woodMaterials.Length)].ID; } else if (v >= 90) { td.ID = TileID.Tree; td.MaterialID = woodMaterials[r.Next(woodMaterials.Length)].ID; } else if (v >= 80) { td.ID = TileID.Shrub; td.MaterialID = berryMaterials[r.Next(berryMaterials.Length)].ID; } else { td.ID = TileID.Grass; td.MaterialID = grassMaterials[r.Next(grassMaterials.Length)].ID; } terrain.SetTileDataNoHeight(p, td); }); }