public override bool Place(Point origin, StructureMap structures) { int height = (int)((float)GenBase._random.Next(60, 100) * _heightScale); int height2 = (int)((float)GenBase._random.Next(60, 100) * _heightScale); int random = _singleDunesWidth.GetRandom(GenBase._random); int random2 = _singleDunesWidth.GetRandom(GenBase._random); DunesDescription description = DunesDescription.CreateFromPlacement(new Point(origin.X - random / 2 + 30, origin.Y), random, height); DunesDescription description2 = DunesDescription.CreateFromPlacement(new Point(origin.X + random2 / 2 - 30, origin.Y), random2, height2); PlaceSingle(description, structures); PlaceSingle(description2, structures); return(true); }
private static void PlaceHill(int startX, int endX, float scale, DunesDescription description) { Point startPoint = new Point(startX, description.Surface[startX]); Point endPoint = new Point(endX, description.Surface[endX]); Point point = new Point((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2 - (int)(35f * scale)); int num = (endPoint.X - point.X) / 4; int minValue = (endPoint.X - point.X) / 16; if (description.WindDirection == WindDirection.Left) { point.X -= WorldGen.genRand.Next(minValue, num + 1); } else { point.X += WorldGen.genRand.Next(minValue, num + 1); } Point point2 = new Point(0, (int)(scale * 12f)); Point point3 = new Point(point2.X / -2, point2.Y / -2); PlaceCurvedLine(startPoint, point, (description.WindDirection != 0) ? point3 : point2, description); PlaceCurvedLine(point, endPoint, (description.WindDirection == WindDirection.Left) ? point3 : point2, description); }
private void PlaceSingle(DunesDescription description, StructureMap structures) { int num = GenBase._random.Next(3) + 8; for (int i = 0; i < num - 1; i++) { int num2 = (int)(2f / (float)num * (float)description.Area.Width); int num3 = (int)((float)i / (float)num * (float)description.Area.Width + (float)description.Area.Left) + num2 * 2 / 5; num3 += GenBase._random.Next(-5, 6); float num4 = (float)i / (float)(num - 2); float num5 = 1f - Math.Abs(num4 - 0.5f) * 2f; PlaceHill(num3 - num2 / 2, num3 + num2 / 2, (num5 * 0.3f + 0.2f) * _heightScale, description); } int num6 = GenBase._random.Next(2) + 1; for (int j = 0; j < num6; j++) { int num7 = description.Area.Width / 2; int x = description.Area.Center.X; x += GenBase._random.Next(-10, 11); PlaceHill(x - num7 / 2, x + num7 / 2, 0.8f * _heightScale, description); } structures.AddStructure(description.Area, 20); }
private static void PlaceCurvedLine(Point startPoint, Point endPoint, Point anchorOffset, DunesDescription description) { Point p = new Point((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2); p.X += anchorOffset.X; p.Y += anchorOffset.Y; Vector2 value = startPoint.ToVector2(); Vector2 value2 = endPoint.ToVector2(); Vector2 vector = p.ToVector2(); float num = 0.5f / (value2.X - value.X); Point b = new Point(-1, -1); for (float num2 = 0f; num2 <= 1f; num2 += num) { Vector2 value3 = Vector2.Lerp(value, vector, num2); Vector2 value4 = Vector2.Lerp(vector, value2, num2); Point point = Vector2.Lerp(value3, value4, num2).ToPoint(); if (point == b) { continue; } b = point; int num3 = description.Area.Width / 2 - Math.Abs(point.X - description.Area.Center.X); int num4 = description.Surface[point.X] + (int)(Math.Sqrt(num3) * 3.0); for (int i = point.Y - 10; i < point.Y; i++) { if (GenBase._tiles[point.X, i].active() && GenBase._tiles[point.X, i].type != 53) { GenBase._tiles[point.X, i].ClearEverything(); } } for (int j = point.Y; j < num4; j++) { GenBase._tiles[point.X, j].ResetToType(53); Tile.SmoothSlope(point.X, j); } } }