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()); }
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]); }