예제 #1
0
        public override int GenerateLandLayer(WorldGenerator worldGenerator, ILandChunk landChunk, IntRect area, int seed, int minAltitude, int maxAltitude)
        {
            ALandLayerGenerator groundLandLayerGenerator = worldGenerator.Generators["defaultGround"];

            ALandLayerGenerator altitudeLandLayerGenerator = worldGenerator.Generators["altitude"];

            ALandLayerGenerator cliffLandLayerGenerator = worldGenerator.Generators["cliff"];

            ALandLayerGenerator elementLandLayerGenerator = worldGenerator.Generators["element"];

            bool isThereSandElement = false;

            Random random = new Random(seed);

            for (int i = 0; i < area.Height; i++)
            {
                for (int j = 0; j < area.Width; j++)
                {
                    int altitude = altitudeLandLayerGenerator.GetComputedPowerAt(j, i);

                    int altitudeOffset = cliffLandLayerGenerator.GetComputedPowerAt(j, i);

                    int elementIndex = random.Next(0, 8);

                    int power = this.GetElementPower(elementLandLayerGenerator.GetComputedPowerAt(j, i));

                    LandType landType = (LandType)groundLandLayerGenerator.GetComputedPowerAt(j, i);

                    if (landType == LandType.SAND)
                    {
                        if (power >= 8 && random.Next(0, 3) > 0 && altitudeOffset == 0)
                        {
                            float trueAltitude = altitudeLandLayerGenerator.GetPowerAt(new SFML.System.Vector2f(area.Left + j, area.Top + i));

                            if ((elementIndex == 1 || elementIndex == 3) &&
                                trueAltitude > 0.6 && random.Next(0, 4) > 0)
                            {
                                elementIndex -= 1;
                            }

                            GroundElementLandObject groundElement = new GroundElementLandObject(area.Left + j, area.Top + i, altitude, landType, elementIndex);

                            LandCase landCase = landChunk.GetLandCase(i, j, altitude);

                            landCase.LandOverGround = groundElement;

                            isThereSandElement = true;
                        }
                    }
                }
            }

            if (isThereSandElement)
            {
                landChunk.AddTypeInChunk(typeof(GroundElementLandObject));
            }

            return(random.Next());
        }
예제 #2
0
        private int NeedToFillSandAt(
            WorldGenerator worldGenerator,
            IntRect area,
            int i, int j)
        {
            ALandLayerGenerator altitudeLandLayerGenerator = worldGenerator.Generators["altitude"];

            bool[,] subAreaBool = new bool[3, 3];
            int[,] subAreaInt   = new int[3, 3];

            int maxValue = int.MinValue;
            int minValue = int.MaxValue;

            for (int y = -1; y < 2; y++)
            {
                for (int x = -1; x < 2; x++)
                {
                    double preAltitude = altitudeLandLayerGenerator.GetPowerAt(new Vector2f(area.Left + j + x, area.Top + i + y));

                    int altitude = (int)Math.Round(preAltitude);

                    maxValue = Math.Max(maxValue, altitude);

                    minValue = Math.Min(minValue, altitude);

                    subAreaInt[y + 1, x + 1] = altitude;
                }
            }

            bool needToFill = false;

            if (subAreaInt[1, 1] != maxValue)
            {
                for (int y = 0; y < 3; y++)
                {
                    for (int x = 0; x < 3; x++)
                    {
                        if (subAreaInt[y, x] != maxValue)
                        {
                            subAreaBool[y, x] = false;
                        }
                        else
                        {
                            subAreaBool[y, x] = true;
                        }
                    }
                }

                needToFill = ALandLayerGenerator.NeedToFill(ref subAreaBool);
            }

            if (needToFill)
            {
                return(maxValue);
            }
            return(subAreaInt[1, 1]);
        }