Пример #1
1
        public void GenerateStringTypeTests()
        {
            FastRandom fr = new FastRandom();
            CharacterType[] types = new CharacterType[] { CharacterType.LowerCase, CharacterType.UpperCase, CharacterType.Numeric };
            Func<char, bool>[] actions = new Func<char, bool>[] { Char.IsLower, Char.IsUpper, Char.IsNumber };
            for(int i = 0; i < types.Length; i++)
            {
                for(int j = 0; j < 1000; j++)
                {
                    var s = fr.NextString(5, types[i]);
                    Assert.Equal(5, s.Length);
                    foreach(var c in s)
                    {
                        Assert.True(actions[i](c));
                    }
                }
            }
            {
                var s = fr.NextString(5, CharacterType.Special);
                Assert.Equal(5, s.Length);
                foreach(var c in s)
                {
                    Assert.True(FastRandom.SpecialCharacters.Contains(c));
                }
            }

        }
Пример #2
0
 public Desert(short x, short z, FastRandom rnd)
     : base(x, z, rnd)
 {
     CreateChunk();
     base.CreateChunk();
     base.CreateOres();
     base.CreateLakes(DefaultHeigth - 1);
     CreateHills();
     CreateCacti();
 }
Пример #3
0
 public void GenerateNumberTest()
 {
     var min = 5; var max = 10;
     FastRandom fr = new FastRandom();
     for(int i = 0; i < 10000; i++)
     {
         var v = fr.Next(min, max);
         if(v < min || v >= max) Assert.True(false, v.ToString());
     }
 }
Пример #4
0
        /**
         * @param seed
         */
        public PerlinNoise(long seed)
        {
            FastRandom rand = new FastRandom(seed);
            _noisePermutations = new int[512];
            _noiseTable = new int[256];

            for (int i = 0; i < 256; i++)
            _noiseTable[i] = i;

            for (int i = 0; i < 256; i++) {
            int j = rand.randomInt() % 256;

            j = (j < 0) ? -j : j;

            int swap = _noiseTable[i];
            _noiseTable[i] = _noiseTable[j];
            _noiseTable[j] = swap;
            }

            for (int i = 0; i < 256; i++)
            _noisePermutations[i] = _noisePermutations[i + 256] = _noiseTable[i];
        }
Пример #5
0
        public Biome(short x, short z, FastRandom rnd)
            : base(x, z)
        {
            X_Start = x * 10 * 64;
            Z_Start = z * 10 * 64;

            X_End = (x + 1) * 10 * 64;
            Z_End = (z + 1) * 10 * 64;

            RandomGenerator = rnd;

            DefaultHeigth = 64;//Has to be a multiple of 2's 4's 8's 16's
            base.IsAir = new bool[Depth / 16];
            int i = 0;
            for (; i < DefaultHeigth / 16; i++)
            {
                IsAir[i] = false;
            }
            for (; i < Depth / 16; i++)
            {
                IsAir[i] = true;
            }
        }
Пример #6
0
        private void InitGen()
        {
            if (GenInit)
                return;

            GenInit = true;

            _Gen1 = new PerlinNoise(_Seed);
            _Gen2 = new PerlinNoise(_Seed + 1);
            _Gen3 = new PerlinNoise(_Seed + 2);
            _Gen4 = new PerlinNoise(_Seed + 3);
            _Gen5 = new PerlinNoise(_Seed + 4);
            _Gen6 = new PerlinNoise(_Seed + 5);
            _FastRandom = new FastRandom(_Seed);
        }
        private Boolean[,] GoGenerate(FastRandom r, int width, int height)
        {
            int x = 1;
            int y = 1;

            var map = new Boolean[width, height];

            //The length of this array is just enough to fit the longest path possible
            int[] stackjex = new int[width * height / 4];
            int[] stackjey = new int[width * height / 4];

            int pointertje = 0;

            stackjex[pointertje] = x;
            stackjey[pointertje] = y;
            pointertje++;

            map[x, y] = true;
            //pixelChangedCallback.Invoke(x, y, currentStep, totSteps);

            MazePoint[] targets = new MazePoint[4];

            //form.drawPixel(x, y, brushThisUses);
            while (pointertje > 0)
            {
                x = stackjex[pointertje - 1];
                y = stackjey[pointertje - 1];

                int targetCount = 0;
                if (x - 2 > 0 && !map[x - 2, y])
                {
                    targets[targetCount].X = x - 2;
                    targets[targetCount].Y = y;
                    targetCount++;
                }
                if (x + 2 < width - 1 && !map[x + 2, y])
                {
                    targets[targetCount].X = x + 2;
                    targets[targetCount].Y = y;
                    targetCount++;
                }
                if (y - 2 > 0 && !map[x, y - 2])
                {
                    targets[targetCount].X = x;
                    targets[targetCount].Y = y - 2;
                    targetCount++;
                }
                if (y + 2 < height - 1 && !map[x, y + 2])
                {
                    targets[targetCount].X = x;
                    targets[targetCount].Y = y + 2;
                    targetCount++;
                }

                //Thread.Sleep(1000);

                if (targetCount > 0)
                {
                    var target = targets[r.Next(targetCount)];
                    stackjex[pointertje] = target.X;
                    stackjey[pointertje] = target.Y;
                    pointertje++;

                    map[target.X, target.Y] = true;

                    if (target.X < x)
                    {
                        map[x - 1, y] = true;
                        //pixelChangedCallback.Invoke(x - 1, y, currentStep, totSteps);
                        //form.drawPixel(x - 1, y, brushThisUses);
                    }
                    else if (target.X > x)
                    {
                        map[x + 1, y] = true;
                        //pixelChangedCallback.Invoke(x + 1, y, currentStep, totSteps);
                        //form.drawPixel(x + 1, y, brushThisUses);
                    }
                    else if (target.Y < y)
                    {
                        map[x, y - 1] = true;
                        //pixelChangedCallback.Invoke(x, y - 1, currentStep, totSteps);
                        //form.drawPixel(x, y - 1, brushThisUses);
                    }
                    else if (target.Y > y)
                    {
                        map[x, y + 1] = true;
                        //pixelChangedCallback.Invoke(x, y + 1, currentStep, totSteps);
                        //form.drawPixel(x, y + 1, brushThisUses);
                    }
                    //pixelChangedCallback.Invoke(target.X, target.Y, currentStep, totSteps);
                    //form.drawPixel(target.X, target.Y, brushThisUses);
                }
                else
                {
                    pointertje--;
                }

            }

            return map;
        }
        private Boolean[,] GoGenerate(FastRandom r, int width, int height)
        {
            int x = 1;
            int y = 1;

            var map = new Boolean[width, height];

            List<int> stackjex = new List<int>(10000);
            List<int> stackjey = new List<int>(10000);

            int pointertje = 0;

            stackjex.Add(x);
            stackjey.Add(y);
            pointertje++;

            map[x, y] = true;
            //pixelChangedCallback.Invoke(x, y, currentStep, totSteps);

            MazePoint[] targets = new MazePoint[4];

            //form.drawPixel(x, y, brushThisUses);
            while (pointertje > 0)
            {
                x = stackjex[pointertje - 1];
                y = stackjey[pointertje - 1];

                int targetCount = 0;
                if (x - 2 > 0 && !map[x - 2, y])
                {
                    targets[targetCount].X = x - 2;
                    targets[targetCount].Y = y;
                    targetCount++;
                }
                if (x + 2 < width - 1 && !map[x + 2, y])
                {
                    targets[targetCount].X = x + 2;
                    targets[targetCount].Y = y;
                    targetCount++;
                }
                if (y - 2 > 0 && !map[x, y - 2])
                {
                    targets[targetCount].X = x;
                    targets[targetCount].Y = y - 2;
                    targetCount++;
                }
                if (y + 2 < height - 1 && !map[x, y + 2])
                {
                    targets[targetCount].X = x;
                    targets[targetCount].Y = y + 2;
                    targetCount++;
                }

                //Thread.Sleep(1000);

                if (targetCount > 0)
                {
                    var target = targets[r.Next(targetCount)];
                    if (pointertje == stackjex.Count)
                    {
                        stackjex.Add(target.X);
                        stackjey.Add(target.Y);
                    }
                    else
                    {
                        stackjex[pointertje] = target.X;
                        stackjey[pointertje] = target.Y;
                    }
                    pointertje++;

                    map[target.X, target.Y] = true;

                    if (target.X < x)
                    {
                        map[x - 1, y] = true;
                        //pixelChangedCallback.Invoke(x - 1, y, currentStep, totSteps);
                        //form.drawPixel(x - 1, y, brushThisUses);
                    }
                    else if (target.X > x)
                    {
                        map[x + 1, y] = true;
                        //pixelChangedCallback.Invoke(x + 1, y, currentStep, totSteps);
                        //form.drawPixel(x + 1, y, brushThisUses);
                    }
                    else if (target.Y < y)
                    {
                        map[x, y - 1] = true;
                        //pixelChangedCallback.Invoke(x, y - 1, currentStep, totSteps);
                        //form.drawPixel(x, y - 1, brushThisUses);
                    }
                    else if (target.Y > y)
                    {
                        map[x, y + 1] = true;
                        //pixelChangedCallback.Invoke(x, y + 1, currentStep, totSteps);
                        //form.drawPixel(x, y + 1, brushThisUses);
                    }
                    //pixelChangedCallback.Invoke(target.X, target.Y, currentStep, totSteps);
                    //form.drawPixel(target.X, target.Y, brushThisUses);
                }
                else
                {
                    pointertje--;
                }
            }

            return map;
        }
Пример #9
0
        static void getBounds2D(int[,] bounds, int tolerance, int[,] seed, uint xx, uint yy, int depth, int min, int max)
        {
            int[,] data = new int[3, 3];
            int[,] seeds = new int[3, 3];
            data[0, 0] = bounds[0, 0];
            data[2, 0] = bounds[1, 0];
            data[0, 2] = bounds[0, 1];
            data[2, 2] = bounds[1, 1];
            seeds[0, 0] = seed[0, 0];
            seeds[2, 0] = seed[1, 0];
            seeds[0, 2] = seed[0, 1];
            seeds[2, 2] = seed[1, 1];
            FastRandom r = new FastRandom();

            r.Reinitialise(seeds[2, 0] + depth);
            r.Next();
            r.Next();
            int l = seeds[2, 1] = r.Next();
            l = toggleMode((data[2, 0] + data[2, 2]) / 2, l, tolerance, min, max);
            data[2, 1] = l;

            r.Reinitialise(seeds[0, 2] + depth);
            r.Next();
            int u = seeds[1, 2] = r.Next();
            u = toggleMode((data[0, 2] + data[2, 2]) / 2, u, tolerance, min, max);
            data[1, 2] = u;

            r.Reinitialise(seeds[0, 0] + depth);
            int ul = data[0, 0];
            int ur = data[2, 0];
            int dl = data[0, 2];
            int dr = data[2, 2];
            int m = seeds[1, 1] = r.Next();
            u = seeds[1, 0] = r.Next();
            l = seeds[0, 1] = r.Next();
            m = toggleMode((ul + ur + dl + dr) / 4, m, tolerance, min, max);
            u = toggleMode((ul + ur) / 2, u, tolerance, min, max);
            l = toggleMode((ul + dl) / 2, l, tolerance, min, max);
            data[1, 1] = m;
            data[1, 0] = u;
            data[0, 1] = l;

            bounds[0, 0] = data[xx, yy];
            bounds[1, 0] = data[xx + 1, yy];
            bounds[0, 1] = data[xx, yy + 1];
            bounds[1, 1] = data[xx + 1, yy + 1];
            seed[0, 0] = seeds[xx, yy];
            seed[1, 0] = seeds[xx + 1, yy];
            seed[0, 1] = seeds[xx, yy + 1];
            seed[1, 1] = seeds[xx + 1, yy + 1];
            return;
        }
Пример #10
0
        static int[, ,] getFrame3D(int[, ,] buffer, int x, int y, int z, int d, int seed, int tolerance)
        {
            int[, ,] seeds = new int[2, 2, 2];
            int[, ,] e = new int[2, 2, 2];
            FastRandom random = new FastRandom(seed);
            for (int xx = 0; xx < 2; xx++)
                for (int yy = 0; yy < 2; yy++)
                    for (int zz = 0; zz < 2; zz++)
                    {
                        seeds[xx, yy, zz] = random.Next() + xx + 2 * yy + 4 * zz;
                        e[xx, yy, zz] = buffer[x + 2 * xx * d, y + 2 * yy * d, z + 2 * zz * d];
                    }
            Func<int, int> delta = i => i + (random.Next() % tolerance) - (tolerance / 2);
            //center cube
            buffer[x + d, y + d, z + d] = delta((
                e[0, 0, 0] +
                e[0, 0, 1] +
                e[0, 1, 0] +
                e[0, 1, 1] +
                e[1, 0, 0] +
                e[1, 0, 1] +
                e[1, 1, 0] +
                e[1, 1, 1]) / 8);
            //center face
            buffer[x, y + d, z + d] = delta((
                e[0, 0, 0] +
                e[0, 0, 1] +
                e[0, 1, 0] +
                e[0, 1, 1]) / 4);
            buffer[x + 2 * d, y + d, z + d] = delta((
                e[1, 0, 0] +
                e[1, 0, 1] +
                e[1, 1, 0] +
                e[1, 1, 1]) / 4);
            buffer[x + d, y, z + d] = delta((
                e[0, 0, 0] +
                e[0, 0, 1] +
                e[1, 0, 0] +
                e[1, 0, 1]) / 4);
            buffer[x + d, y + 2 * d, z + d] = delta((
                e[0, 1, 0] +
                e[0, 1, 1] +
                e[1, 1, 0] +
                e[1, 1, 1]) / 4);
            buffer[x + d, y + d, z] = delta((
                e[0, 0, 0] +
                e[0, 1, 0] +
                e[1, 0, 0] +
                e[1, 1, 0]) / 4);
            buffer[x + d, y + d, z + 2 * d] = delta((
                e[0, 0, 1] +
                e[0, 1, 1] +
                e[1, 0, 1] +
                e[1, 1, 1]) / 4);
            //center line
            buffer[x, y, z + d] = delta((e[0, 0, 0] + e[0, 0, 1]) / 2);
            buffer[x + 2 * d, y, z + d] = delta((e[1, 0, 0] + e[1, 0, 1]) / 2);
            buffer[x, y + 2 * d, z + d] = delta((e[0, 1, 0] + e[0, 1, 1]) / 2);
            buffer[x + 2 * d, y + 2 * d, z + d] = delta((e[1, 1, 0] + e[1, 1, 1]) / 2);

            buffer[x, y + d, z] = delta((e[0, 0, 0] + e[0, 1, 0]) / 2);
            buffer[x + 2 * d, y + d, z] = delta((e[1, 0, 0] + e[1, 1, 0]) / 2);
            buffer[x, y + d, z + 2 * d] = delta((e[0, 0, 1] + e[0, 1, 1]) / 2);
            buffer[x + 2 * d, y + d, z + 2 * d] = delta((e[1, 0, 1] + e[1, 1, 1]) / 2);

            buffer[x + d, y, z] = delta((e[0, 0, 0] + e[1, 0, 0]) / 2);
            buffer[x + d, y + 2 * d, z] = delta((e[0, 1, 0] + e[1, 1, 0]) / 2);
            buffer[x + d, y, z + 2 * d] = delta((e[0, 0, 1] + e[1, 0, 1]) / 2);
            buffer[x + d, y + 2 * d, z + 2 * d] = delta((e[0, 1, 1] + e[1, 1, 1]) / 2);

            return seeds;
        }
Пример #11
0
        static int[,] getData2D(int[,] bounds, int depth, int tolerance, int[,] seed, int sizeExp, int min, int max)
        {
            int totalSize, segmentSize, count = 1;
            totalSize = segmentSize = 1 << depth;
            int[,] data = new int[totalSize + 1, totalSize + 1];
            int[,] seeds = new int[totalSize + 1, totalSize + 1];
            data[0, 0] = bounds[0, 0];
            data[totalSize, 0] = bounds[1, 0];
            data[0, totalSize] = bounds[0, 1];
            data[totalSize, totalSize] = bounds[1, 1];
            seeds[0, 0] = seed[0, 0];
            seeds[totalSize, 0] = seed[1, 0];
            seeds[0, totalSize] = seed[0, 1];
            seeds[totalSize, totalSize] = seed[1, 1];
            FastRandom r = new FastRandom();
            while (segmentSize != 1)
            {
                for (int y = 0; y < count; y++)
                {
                    r.Reinitialise(seeds[totalSize, y * segmentSize] + sizeExp);

                    int ul = data[totalSize, y * segmentSize];
                    int dl = data[totalSize, (y + 1) * segmentSize];

                    r.Next();
                    r.Next();
                    int l = seeds[totalSize, y * segmentSize + segmentSize / 2] = r.Next();
                    l = toggleMode((ul + dl) / 2, l, tolerance, min, max);
                    data[totalSize, y * segmentSize + segmentSize / 2] = l;
                }
                for (int x = 0; x < count; x++)
                {
                    r.Reinitialise(seeds[x * segmentSize, totalSize] + sizeExp);

                    int ul = data[x * segmentSize, totalSize];
                    int ur = data[(x + 1) * segmentSize, totalSize];

                    r.Next();
                    int u = seeds[x * segmentSize + segmentSize / 2, totalSize] = r.Next();
                    u =  toggleMode((ul + ur) / 2 ,u, tolerance, min, max);
                    data[x * segmentSize + segmentSize / 2, totalSize] = u;
                }

                for (int y = 0; y < count; y++)
                    for (int x = 0; x < count; x++)
                    {
                        r.Reinitialise(seeds[x * segmentSize, y * segmentSize] + sizeExp);

                        int ul = data[x * segmentSize, y * segmentSize];
                        int ur = data[(x + 1) * segmentSize, y * segmentSize];
                        int dl = data[x * segmentSize, (y + 1) * segmentSize];
                        int dr = data[(x + 1) * segmentSize, (y + 1) * segmentSize];

                        int m = seeds[x * segmentSize + segmentSize / 2, y * segmentSize + segmentSize / 2] = r.Next();
                        int u = seeds[x * segmentSize + segmentSize / 2, y * segmentSize] = r.Next();
                        int l = seeds[x * segmentSize, y * segmentSize + segmentSize / 2] = r.Next();
                        m = toggleMode((ul + ur + dl + dr) / 4, m, tolerance, min, max);
                        u = toggleMode((ul + ur) / 2, u, tolerance, min, max);
                        l = toggleMode((ul + dl) / 2, l, tolerance, min, max);
                        data[x * segmentSize + segmentSize / 2, y * segmentSize + segmentSize / 2] = m;
                        data[x * segmentSize + segmentSize / 2, y * segmentSize] = u;
                        data[x * segmentSize, y * segmentSize + segmentSize / 2] = l;
                    }
                tolerance = getTolerance(tolerance);
                segmentSize /= 2;
                count *= 2;
                sizeExp--;
            }
            return data;
        }