public void AdjustRiver()
{
int minZ = m_riverPath.Min(p => m_terrain.GetSurfaceLevel(p));
var pos = DirectionSet.Cardinal | DirectionSet.Exact;
var coreLocs = new HashSet<IntVector2>(m_riverPath.SelectMany(p => pos.ToSurroundingPoints(p)));
foreach (var pp in coreLocs)
{
if (m_terrain.Size.Plane.Contains(pp) == false)
continue;
for (int z = m_terrain.Depth - 1; z >= minZ - 1; --z)
{
var p = new IntVector3(pp.X, pp.Y, z);
var td = TileData.EmptyTileData;
if (z == minZ - 1)
td.WaterLevel = TileData.MaxWaterLevel;
m_terrain.SetTileData(p, td);
}
}
}
public void Generate(DiamondSquare.CornerData corners, double range, double h, double amplify) { GenerateHeightMap(corners, range, h, amplify); FillMap(); var random = m_random; var terrain = m_data; double xk = (random.NextDouble() * 2 - 1) * 0.01; double yk = (random.NextDouble() * 2 - 1) * 0.01; TerrainHelpers.CreateBaseMinerals(terrain, random, xk, yk); TerrainHelpers.CreateOreVeins(terrain, random, xk, yk); TerrainHelpers.CreateOreClusters(terrain, random); if (m_data.Width > 128) { var riverGen = new RiverGen(m_data, m_random); if (riverGen.CreateRiverPath()) { riverGen.AdjustRiver(); } else { Trace.TraceError("Failed to create river"); } } int soilLimit = m_size.Depth * 4 / 5; TerrainHelpers.CreateSoil(m_data, soilLimit); }