Пример #1
0
        private static void PlaceClusters(DesertDescription description, ClusterGroup clusters)
        {
            Rectangle hive = description.Hive;

            hive.Inflate(20, 20);
            PostPlacementEffect[,] array = new PostPlacementEffect[hive.Width, hive.Height];
            PlaceClustersArea(description, clusters, hive, array, Point.Zero);
            for (int i = hive.Left; i < hive.Right; i++)
            {
                for (int j = hive.Top; j < hive.Bottom; j++)
                {
                    PostPlacementEffect postPlacementEffect = array[i - hive.Left, j - hive.Top];
                    if (postPlacementEffect.HasFlag(PostPlacementEffect.Smooth))
                    {
                        Tile.SmoothSlope(i, j, applyToNeighbors: false);
                    }
                }
            }
        }
Пример #2
0
        private static void PlaceClustersArea(DesertDescription description, ClusterGroup clusters, Rectangle area, PostPlacementEffect[,] postEffectMap, Point postEffectMapOffset)
        {
            FastRandom fastRandom = new FastRandom(Main.ActiveWorldFileData.Seed).WithModifier(57005uL);
            Vector2    value      = new Vector2(description.Hive.Width, description.Hive.Height);
            Vector2    value2     = new Vector2(clusters.Width, clusters.Height);
            Vector2    value3     = description.BlockScale / 2f;

            for (int i = area.Left; i < area.Right; i++)
            {
                for (int j = area.Top; j < area.Bottom; j++)
                {
                    if (!WorldGen.InWorld(i, j, 1))
                    {
                        continue;
                    }
                    float  num  = 0f;
                    int    num2 = -1;
                    float  num3 = 0f;
                    ushort type = 53;
                    if (fastRandom.Next(3) == 0)
                    {
                        type = 397;
                    }
                    int     num4   = i - description.Hive.X;
                    int     num5   = j - description.Hive.Y;
                    Vector2 value4 = (new Vector2(num4, num5) - value3) / value * value2;
                    for (int k = 0; k < clusters.Count; k++)
                    {
                        Cluster cluster = clusters[k];
                        if (Math.Abs(cluster[0].Position.X - value4.X) > 10f || Math.Abs(cluster[0].Position.Y - value4.Y) > 10f)
                        {
                            continue;
                        }
                        float num6 = 0f;
                        foreach (Block item in cluster)
                        {
                            num6 += 1f / Vector2.DistanceSquared(item.Position, value4);
                        }
                        if (num6 > num)
                        {
                            if (num > num3)
                            {
                                num3 = num;
                            }
                            num  = num6;
                            num2 = k;
                        }
                        else if (num6 > num3)
                        {
                            num3 = num6;
                        }
                    }
                    float num7 = num + num3;
                    Tile  tile = Main.tile[i, j];
                    bool  flag = ((new Vector2(num4, num5) - value3) / value * 2f - Vector2.One).Length() >= 0.8f;
                    PostPlacementEffect postPlacementEffect = PostPlacementEffect.None;
                    if (num7 > 3.5f)
                    {
                        postPlacementEffect = PostPlacementEffect.Smooth;
                        tile.ClearEverything();
                        tile.wall = 187;
                        if (num2 % 15 == 2)
                        {
                            tile.ResetToType(404);
                        }
                    }
                    else if (num7 > 1.8f)
                    {
                        tile.wall = 187;
                        if ((double)j < Main.worldSurface)
                        {
                            tile.liquid = 0;
                        }
                        else
                        {
                            tile.lava(lava: true);
                        }
                        if (!flag || tile.active())
                        {
                            tile.ResetToType(396);
                            postPlacementEffect = PostPlacementEffect.Smooth;
                        }
                    }
                    else if (num7 > 0.7f || !flag)
                    {
                        tile.wall   = 216;
                        tile.liquid = 0;
                        if (!flag || tile.active())
                        {
                            tile.ResetToType(type);
                            postPlacementEffect = PostPlacementEffect.Smooth;
                        }
                    }
                    else if (num7 > 0.25f)
                    {
                        FastRandom fastRandom2 = fastRandom.WithModifier(num4, num5);
                        float      num8        = (num7 - 0.25f) / 0.45f;
                        if (fastRandom2.NextFloat() < num8)
                        {
                            tile.wall = 187;
                            if ((double)j < Main.worldSurface)
                            {
                                tile.liquid = 0;
                            }
                            else
                            {
                                tile.lava(lava: true);
                            }
                            if (tile.active())
                            {
                                tile.ResetToType(type);
                                postPlacementEffect = PostPlacementEffect.Smooth;
                            }
                        }
                    }
                    postEffectMap[i - area.X + postEffectMapOffset.X, j - area.Y + postEffectMapOffset.Y] = postPlacementEffect;
                }
            }
        }