Example #1
0
        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;
                }
            });
        }
Example #2
0
        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;
                }
            });
        }
Example #3
0
        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;
                }
            });
        }
Example #4
0
        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;
                }
            });
        }
Example #5
0
        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);
        }
Example #6
0
        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;
                    }
                }
            });
        }
Example #7
0
        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;
                    }
                }
            });
        }
Example #8
0
        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;
                }
            });
        }
Example #9
0
        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;
                    }
                }
            });
        }