Пример #1
0
        public Continent generateContinent(int size)
        {
            Continent continent = new Continent();

            continent.size = size;

            generateHeightMap(continent);
            generateTemperatureMap(continent);
            generateTerrainMap(continent);
            generateRivers(continent);

            //TODO: create other stuff here...

            return continent;
        }
Пример #2
0
        public void generateHeightMap(Continent continent)
        {
            continent.heightMap = new int[continent.size, continent.size];

            //generate heightmap from a modified perlin noise
            r1 = random.Next(1000, 10000);
            r2 = random.Next(100000, 1000000);
            r3 = random.Next(1000000000, 2000000000);

            for (int i = 0; i < continent.size; i++)
            {
                for (int j = 0; j < continent.size; j++)
                {
                    continent.heightMap[i, j] = (int)(Common.MAX_TERRAIN_HEIGHT * PerlinNoise(i, j));
                }
            }
        }
Пример #3
0
        public Form1()
        {
            InitializeComponent();

            //Random r = new Random();

            wg = new WorldGenerator(DateTime.Now.Millisecond);

            continent = wg.generateContinent(300);

            gfx = new GFXEngine(this);

            offsetX = offsetY = 50;
            areaX = areaY = 0;

            //timer.Start();

            ConsoleForm console = new ConsoleForm(this);
            console.Show();
        }
Пример #4
0
 private void generate_CALLABLE(int size)
 {
     this.size = size;
     continent = wg.generateContinent(size);
 }
Пример #5
0
        public void generateRivers(Continent continent)
        {
            //get maximum height
            int maxHeight = 0;
            for (int i = 0; i < continent.size; i++)
            {
                for (int j = 0; j < continent.size; j++)
                {
                    if (continent.heightMap[i, j] > maxHeight)
                        maxHeight = continent.heightMap[i, j];
                }
            }

            //find number of fountains
            int fountains = Common.MAX_FOUNTAINS_PER_100 * (continent.size / 100);

            //find actual fountains
            continent.fountainsX = new int[fountains];
            continent.fountainsY = new int[fountains];
            int countFountains = 0;
            int newX, newY;
            while (countFountains < fountains)
            {
                newX = random.Next(20, continent.size - 20);
                newY = random.Next(20, continent.size - 20);
                if (continent.heightMap[newX, newY] == maxHeight - 2 || continent.heightMap[newX, newY] == maxHeight - 3)
                {
                    continent.fountainsX[countFountains] = newX;
                    continent.fountainsY[countFountains] = newY;
                    countFountains++;
                }
            }

            //rivers
            int rivers = random.Next(1, fountains / 2);
            continent.riversList = new River[rivers];
            List<WaterMass> waterMassList = new List<WaterMass>();
            for (int i = 0; i < rivers; i++)
            {
                int maxWidth = random.Next(3, 9);
                int width = 1;
                int halfWidth = 1;
                int length = random.Next(50, 200);
                int x = continent.fountainsX[i];
                int y = continent.fountainsY[i];
                int dir = 5;
                bool lowerOrEqual = false;
                int[] point = new int[2];
                int[] center = new int[2];
                for (int j = 0; j < length; j++)
                {
                    lowerOrEqual = false;
                    bool []tested = new bool[8];
                    int increment = 1;
                    while (!lowerOrEqual)
                    {
                        if (x - increment <= 0 || x + increment >= continent.size || y - increment <= 0 || y + increment >= 0)
                        {
                            break;
                        }
                        dir++;
                        if (dir > 7) dir = 0;
                        else if (dir < 0) dir = 7;
                        switch (dir)
                        {
                            case 0:
                                tested[0] = true;
                                if (!tested[0] && x - increment > 0 && y - increment > 0)
                                {
                                    lowerOrEqual = continent.heightMap[x - increment, y - increment] <= continent.heightMap[x, y];
                                }
                                break;
                            case 1:
                                tested[1] = true;
                                if (!tested[1] && y - increment > 0)
                                {
                                    lowerOrEqual = continent.heightMap[x, y - increment] <= continent.heightMap[x, y];
                                }
                                break;
                            case 2:
                                tested[2] = true;
                                if (!tested[2] && x + increment < continent.size && y - increment > 0)
                                {
                                    lowerOrEqual = continent.heightMap[x + increment, y - increment] <= continent.heightMap[x, y];
                                }
                                break;
                            case 3:
                                tested[3] = true;
                                if (!tested[3] && x + increment < continent.size)
                                {
                                    lowerOrEqual = continent.heightMap[x + increment, y] <= continent.heightMap[x, y];
                                }
                                break;
                            case 4:
                                tested[4] = true;
                                if (!tested[4] && x + increment < continent.size && y + increment < continent.size)
                                {
                                    lowerOrEqual = continent.heightMap[x + increment, y + increment] <= continent.heightMap[x, y];
                                }
                                break;
                            case 5:
                                tested[5] = true;
                                if (!tested[5] && y + increment < continent.size)
                                {
                                    lowerOrEqual = continent.heightMap[x, y + increment] <= continent.heightMap[x, y];
                                }
                                break;
                            case 6:
                                tested[6] = true;
                                if (!tested[6] && x - increment > 0 && y + increment < continent.size)
                                {
                                    lowerOrEqual = continent.heightMap[x - increment, y + increment] <= continent.heightMap[x, y];
                                }
                                break;
                            case 7:
                                tested[7] = true;
                                if (!tested[7] && x - increment > 0)
                                {
                                    lowerOrEqual = continent.heightMap[x - increment, y] <= continent.heightMap[x, y];
                                }
                                break;
                            default: lowerOrEqual = false; break;
                        }

                        if (!lowerOrEqual && tested[0] && tested[1] && tested[2] && tested[3] && tested[4] && tested[5] && tested[6] && tested[7])
                        {
                            tested = new bool[8];
                            increment++;
                        }
                    }
                    switch (dir)
                    {
                        //up+left
                        case 0:
                            x--;
                            y--;
                            if (x > 0 && y > 0)
                            {
                                x += (x > 0 ? random.Next(-1, 2) : 0);
                                y += (y > 0 ? random.Next(-1, 2) : 0);
                            }
                            break;

                        //up
                        case 1:
                            y--;
                            if (y > 0)
                            {
                                x += (x > 0 ? random.Next(-1, 2) : 0);
                            }
                            break;

                        //up+right
                        case 2:
                            x++;
                            y--;
                            if (x < continent.size && y > 0)
                            {
                                x += (x > 0 ? random.Next(-1, 2) : 0);
                                y += (y > 0 ? random.Next(-1, 2) : 0);
                            }
                            break;

                        //right
                        case 3:
                            x++;
                            if (x < continent.size)
                            {
                                y += (y > 0 ? random.Next(-1, 2) : 0);
                            }
                            break;

                        //down+right
                        case 4:
                            x++;
                            y++;
                            if (x < continent.size && y < continent.size)
                            {
                                x += (x > 0 ? random.Next(-1, 2) : 0);
                                y += (y > 0 ? random.Next(-1, 2) : 0);
                            }
                            break;

                        //down
                        case 5:
                            y++;
                            if (y < continent.size)
                            {
                                x += (x > 0 ? random.Next(-1, 2) : 0);
                            }
                            break;

                        //down+left
                        case 6:
                            x--;
                            y++;
                            if (x > 0 && y < continent.size)
                            {
                                x += (x > 0 ? random.Next(-1, 2) : 0);
                                y += (y > 0 ? random.Next(-1, 2) : 0);
                            }
                            break;

                        //left
                        case 7:
                            x--;
                            if (x > 0)
                            {
                                y += (y > 0 ? random.Next(-1, 2) : 0);
                            }
                            break;

                        default: break;
                    }

                    //fill width-wise
                    center[0] = x;
                    center[1] = y;

                    WaterMass watermass = new WaterMass();
                    watermass.x = center[0];
                    watermass.y = center[1];
                    watermass.radius = halfWidth;
                    watermass.dir = dir;
                    watermass.depth = 1; //TODO: add dynamic depth

                    waterMassList.Add(watermass);

                    if (width < maxWidth)
                        width = Math.Max(1, j / 10);
                    halfWidth = width / 2;
                }

                //put a lake at the end:
                int maxLakeRadius = random.Next(Common.MIN_LAKE_WIDTH, Common.MAX_LAKE_WIDTH);
                int lakeRadius = 1;
                center = new int[2];
                center[0] = x;
                center[1] = y;
                while (lakeRadius < maxLakeRadius)
                {
                    for (int angle = 0; angle < 360; angle++)
                    {
                        point = new int[2];
                        point = getCircleCoordinate(center, lakeRadius, angle);
                        if (point[0] > 0 && point[0] < continent.size && point[1] > 0 && point[1] < continent.size)
                        {
                            continent.heightMap[point[0], point[1]]--;
                        }
                    }
                    lakeRadius++;
                }

                WaterMass lake = new WaterMass();
                lake.x = center[0];
                lake.y = center[1];
                lake.radius = lakeRadius;
                lake.dir = dir;
                lake.depth = 1; //TODO: add dynamic depth

                waterMassList.Add(lake);

                continent.riversList[i] = new River();
                continent.riversList[i].points = waterMassList.Count;
                continent.riversList[i].waterPoints = new WaterMass[continent.riversList[i].points];
                int pos = 0;
                foreach (WaterMass w in waterMassList)
                {
                    continent.riversList[i].waterPoints[pos] = new WaterMass();
                    continent.riversList[i].waterPoints[pos].depth = w.depth;
                    continent.riversList[i].waterPoints[pos].dir = w.dir;
                    continent.riversList[i].waterPoints[pos].radius = w.radius;
                    continent.riversList[i].waterPoints[pos].x = w.x;
                    continent.riversList[i].waterPoints[pos].y = w.y;
                    pos++;
                }
            }

            //coastline
            //top:
            int seaLine = random.Next(5, 10);
            for (int i = 0; i < continent.size; i++)
            {
                seaLine = Math.Max(5, seaLine + random.Next(-1, 2));
                int it = seaLine;
                while (it >= 0)
                {
                    continent.heightMap[i, it]--;
                    it--;
                }
            }

            //bottom:
            seaLine = random.Next(5, 10);
            for (int i = 0; i < continent.size; i++)
            {
                seaLine = Math.Max(5, seaLine + random.Next(-1, 2));
                int it = continent.size - seaLine;
                while (it < continent.size)
                {
                    continent.heightMap[i, it]--;
                    it++;
                }
            }

            //left:
            seaLine = random.Next(5, 10);
            for (int i = 0; i < continent.size; i++)
            {
                seaLine = Math.Max(5, seaLine + random.Next(-1, 2));
                int it = seaLine;
                while (it >= 0)
                {
                    continent.heightMap[it, i]--;
                    it--;
                }
            }

            //right:
            seaLine = random.Next(5, 10);
            for (int i = 0; i < continent.size; i++)
            {
                seaLine = Math.Max(5, seaLine + random.Next(-1, 2));
                int it = continent.size - seaLine;
                while (it < continent.size)
                {
                    continent.heightMap[it, i]--;
                    it++;
                }
            }
        }
Пример #6
0
        public void generateTerrainMap(Continent continent)
        {
            continent.terrainMap = new int[continent.size, continent.size];

            //generate terrain map from the other 2 + river areas

            for (int i = 0; i < continent.size; i++)
            {
                for (int j = 0; j < continent.size; j++)
                {
                    continent.terrainMap[i, j] = Math.Max(-1, (int)(7 * PerlinNoise(i, j)));
                }
            }
        }
Пример #7
0
        public void generateTemperatureMap(Continent continent)
        {
            continent.temperatureMap = new float[continent.size, continent.size];

            //generate temperature map
            r1 = random.Next(1000, 10000);
            r2 = random.Next(100000, 1000000);
            r3 = random.Next(1000000000, 2000000000);

            float minTemp = (float)random.Next(Common.MIN_TEMPERATURE, Common.MIN_TEMPERATURE + 20);

            for (int i = 0; i < continent.size; i++)
            {
                float temp = minTemp;
                for (int j = 0; j < continent.size; j++)
                {
                    continent.temperatureMap[i, j] = temp;
                    temp += (float)(random.Next(0, 10) * 0.1);
                }
            }
        }