private void PostProcess_NorthernForest(XSafeGrid <xMapCell> map) { map.Iterate((grid, x, y) => { xeTerrainType t = grid.mData[x, y].mTerrain; if (t == xeTerrainType.Sand) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } }); }
private void PostProcess_NorthSeaIslands(XSafeGrid <xMapCell> map) { // rock - grass - rock - snow. so sand and forest become rock map.Iterate((grid, x, y) => { xeTerrainType t = grid.mData[x, y].mTerrain; if (t == xeTerrainType.Sand) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else if (t == xeTerrainType.Forest) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } }); }
private void PostProcess_ArcticIslands(XSafeGrid <xMapCell> map) { // swap rock and snow map.Iterate((grid, x, y) => { xeTerrainType t = grid.mData[x, y].mTerrain; if (t == xeTerrainType.Snow) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else if (t == xeTerrainType.Rock) { grid.mData[x, y].mTerrain = xeTerrainType.Snow; } }); }
private void PostProcess_Badlands(XSafeGrid <xMapCell> map) { map.Iterate((grid, x, y) => { xeTerrainType t = grid.mData[x, y].mTerrain; if (t == xeTerrainType.DeepWater) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else if (t == xeTerrainType.ShallowWater) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else if (t == xeTerrainType.Sand) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else if (t == xeTerrainType.Forest) { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } }); }
private void Generate_Physical() { // set up the grid xCoord min_map_size = mGen.GetMinMapSize(); xCoord map_size = mMapScale * min_map_size; mMap = new XSafeGrid <xMapCell>(); xMapCell init_val = new xMapCell(); init_val.mTerrain = xeTerrainType.Invalid; init_val.mColor = new Color(); mMap.Init(map_size, init_val); Random rand = new Random(); // tuning derrivatives double min_spike_height = mGenSet.mSpikeHeight * (1d - mGenSet.mSpikeVariance); double max_spike_height = mGenSet.mSpikeHeight * (1d + mGenSet.mSpikeVariance); double spike_height_spread = max_spike_height - min_spike_height; int num_spikes = (int)(mGenSet.mSpikeDensity * mMap.mBounds.x * mMap.mBounds.y); XSafeGrid <double>[] heights = new XSafeGrid <double> [2]; for (int h = 0; h < 2; ++h) { heights[h] = new XSafeGrid <double>(); heights[h].Init(mMap.mBounds, 0d); } // assign spikes for (int i = 0; i < num_spikes; ++i) { int x = rand.Next() % mMap.mBounds.x; int y = rand.Next() % mMap.mBounds.y; double spike_height = min_spike_height + rand.NextDouble() * spike_height_spread; heights[0].mData[x, y] = spike_height; } // smooth int n = 0; int smoothing_passes = (mGenSet.mSmoothingPasses % 2) == 1 ? mGenSet.mSmoothingPasses + 1 : mGenSet.mSmoothingPasses; for (int i = 0; i < smoothing_passes; ++i) { int target = n == 0 ? 1 : 0; heights[n].Iterate((grid, x, y) => { double lo_x = grid.GetValueSafe(x - 1, y); double hi_x = grid.GetValueSafe(x + 1, y); double lo_y = grid.GetValueSafe(x, y - 1); double hi_y = grid.GetValueSafe(x, y + 1); double here = grid.mData[x, y]; double blended = 0.25d * (lo_x + lo_y + hi_x + hi_y); double result = mGenSet.mSmoothingScalar * here + (1d - mGenSet.mSmoothingScalar) * blended; heights[target].mData[x, y] = result; }); n = n == 0 ? 1 : 0; } // normalize double max_height = 0.0d; heights[0].Iterate((grid, x, y) => { if (grid.mData[x, y] > max_height) { max_height = grid.mData[x, y]; } }); double normalizer = max_height > 0.0d ? 1d / max_height : 1d; heights[0].Iterate((grid, x, y) => { grid.mData[x, y] *= normalizer; }); // height capping heights[0].Iterate((grid, x, y) => { grid.mData[x, y] = XMath.Clamp(grid.mData[x, y], mGenSet.mMinNormalizedHeight, mGenSet.mMaxNormalizedHeight); }); mMap.Iterate((grid, x, y) => { xeTerrainType terrain = xeTerrainType.Snow; for (int t = 0; t < (int)xeTerrainType.Num - 1; ++t) { if (heights[0].mData[x, y] <= mGenSet.mHeightThresh[t]) { terrain = (xeTerrainType)t; break; } } grid.mData[x, y].mTerrain = terrain; }); mGenSet.mPostProcess(mMap); }
private void PostProcess_GulfIslands(XSafeGrid <xMapCell> map) { PostProcess_DoNothing(map); }
private void PostProcess_TropicalForest(XSafeGrid <xMapCell> map) { PostProcess_DoNothing(map); }
private void PostProcess_TemperateForest(XSafeGrid <xMapCell> map) { PostProcess_DoNothing(map); }
private void PostProcess_ScandinavianCoast(XSafeGrid <xMapCell> map) { PostProcess_DoNothing(map); }
private void PostProcess_DesertMountains(XSafeGrid <xMapCell> map) { Random r = new Random(); map.Iterate((grid, x, y) => { xeTerrainType t = grid.mData[x, y].mTerrain; if (t == xeTerrainType.DeepWater) { double d = r.NextDouble(); if (d < 0.5) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else if (d < 0.9) { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } else { grid.mData[x, y].mTerrain = xeTerrainType.Forest; } } else if (t == xeTerrainType.ShallowWater) { double d = r.NextDouble(); if (d < 0.15) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else if (d < 0.6) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } } else if (t == xeTerrainType.Sand) { double d = r.NextDouble(); if (d < 0.1) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else if (d < 0.65) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } } else if (t == xeTerrainType.Grassland) { double d = r.NextDouble(); if (d < 0.5) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } } else if (t == xeTerrainType.Forest) { double d = r.NextDouble(); if (d < 0.7) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } } else if (t == xeTerrainType.Rock) { double d = r.NextDouble(); if (d < 0.2) { grid.mData[x, y].mTerrain = xeTerrainType.Snow; } else if (d < 0.8) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } } else if (t == xeTerrainType.Snow) { double d = r.NextDouble(); if (d < 0.4) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Snow; } } }); }
private void PostProcess_Tundra(XSafeGrid <xMapCell> map) { Random r = new Random(); // deep - water // shallow - snow // sand - sand, rock, snow // grassland - sand, rock, snow, grass // forest - rock, snow, grass // rock - rock, snow // snow - more snow, less rock map.Iterate((grid, x, y) => { xeTerrainType t = grid.mData[x, y].mTerrain; if (t == xeTerrainType.DeepWater) { grid.mData[x, y].mTerrain = xeTerrainType.ShallowWater; } else if (t == xeTerrainType.ShallowWater) { grid.mData[x, y].mTerrain = xeTerrainType.Snow; } else if (t == xeTerrainType.Sand) { double d = r.NextDouble(); if (d < 0.75) { grid.mData[x, y].mTerrain = xeTerrainType.Snow; } else if (d < 0.85) { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } else { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } } else if (t == xeTerrainType.Grassland) { double d = r.NextDouble(); if (d < 0.1) { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } else if (d < 0.3) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else if (d < 0.8) { grid.mData[x, y].mTerrain = xeTerrainType.Snow; } else { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } } else if (t == xeTerrainType.Forest) { double d = r.NextDouble(); if (d < 0.3) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else if (d < 0.6) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Snow; } } else if (t == xeTerrainType.Rock) { double d = r.NextDouble(); if (d < 0.6) { grid.mData[x, y].mTerrain = xeTerrainType.Snow; } else { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } } else { double d = r.NextDouble(); if (d < 0.85) { grid.mData[x, y].mTerrain = xeTerrainType.Snow; } else { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } } }); }
private void PostProcess_Desert(XSafeGrid <xMapCell> map) { Random r = new Random(); // deep - pure desert // shallow - extremely sparse grass and rocks // sand - very sparse grass and rocks map.Iterate((grid, x, y) => { xeTerrainType t = grid.mData[x, y].mTerrain; if (t == xeTerrainType.DeepWater) { grid.mData[x, y].mTerrain = xeTerrainType.ShallowWater; } else if (t == xeTerrainType.ShallowWater) { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } else if (t == xeTerrainType.Sand) { double d = r.NextDouble(); if (d < 0.01) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else if (d < 0.02) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } } else if (t == xeTerrainType.Grassland) { double d = r.NextDouble(); if (d < 0.02) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else if (d < 0.04) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } } else if (t == xeTerrainType.Forest) { double d = r.NextDouble(); if (d < 0.04) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else if (d < 0.35) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } } else if (t == xeTerrainType.Rock) { double d = r.NextDouble(); if (d < 0.03) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else if (d < 0.7) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Sand; } } else if (t == xeTerrainType.Snow) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } }); }
private void PostProcess_Prairie(XSafeGrid <xMapCell> map) { Random r = new Random(); // deep - shallow // shallow - half trees with grass // sand - sparse trees with grass // grass - very sparse trees with grass // forest - grass // rock - grass with sprinkled rocks // snow - mostly rock map.Iterate((grid, x, y) => { xeTerrainType t = grid.mData[x, y].mTerrain; if (t == xeTerrainType.DeepWater) { grid.mData[x, y].mTerrain = xeTerrainType.ShallowWater; } else if (t == xeTerrainType.ShallowWater) { if (r.NextDouble() < 0.5) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else { grid.mData[x, y].mTerrain = xeTerrainType.Forest; } } else if (t == xeTerrainType.Sand) { if (r.NextDouble() < 0.5 / 3) { grid.mData[x, y].mTerrain = xeTerrainType.Forest; } else { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } } else if (t == xeTerrainType.Grassland) { if (r.NextDouble() < 0.5 / 9) { grid.mData[x, y].mTerrain = xeTerrainType.Forest; } else { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } } else if (t == xeTerrainType.Forest) { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } else if (t == xeTerrainType.Rock) { if (r.NextDouble() < 0.33) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } } else if (t == xeTerrainType.Snow) { if (r.NextDouble() < 0.67) { grid.mData[x, y].mTerrain = xeTerrainType.Rock; } else { grid.mData[x, y].mTerrain = xeTerrainType.Grassland; } } }); }
private void PostProcess_Mediterranean(XSafeGrid <xMapCell> map) { PostProcess_DoNothing(map); }
private void PostProcess_DoNothing(XSafeGrid <xMapCell> map) { }