public static void GenerateLevel(string LoadPath)
        {
            N8Level Level = new N8Level(LoadPath);

            N8Block ControlPoint = Level.blocks.GenerateBlock("letter.period", "Moon Control Point");
            ControlPoint.position.Z = 2000;
            //Load it as chibi, if available
            ControlPoint.Special = 2;
            Random rand = new Random();

            for (int i = 0; i < 50; i++)
            {
                N8Block moonblock = Level.blocks.GenerateBlock("simple.white.land.mega", "Moon");
                moonblock.position.Z = 1000;
                moonblock.rotation = rand.NextQuaternion();
                ControlPoint.AttachToMe(moonblock);
            }

            string SavePath = Path.GetDirectoryName(LoadPath) + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(LoadPath) + "_moon.ncd";
            MinorModifiers.OrderLoading(Level, new Vector3D(0,0,1));
            Utilities.Save(SavePath, Level);
        }
        public static N8Level GetCrossroads()
        {
            N8Level Level = new N8Level(); //MaxProtectTest.GetProxyBubble();
            MinorModifiers.AddCrossroads(Level);
            Random rand = new Random();

            int NumBlocks = 349 - (Level.blocks.Tronics.Count + Level.blocks.Blocks.Count);
            Console.WriteLine(NumBlocks);
            Console.ReadLine();
            for (int i = 0; i < NumBlocks; i++)
            {
                string color = colors[i % colors.Length];
                //string color = "black";
                N8Block CurrentBlock = Level.blocks.GenerateBlock("simple." + color + ".block", names[rand.Next(names.Length)]);
                //Keep it out of the crossroads
                CurrentBlock.position = rand.NextVector(new Vector3D(2000, 2000, -1000), new Vector3D(300, 300, 2000));

                //And flop it around the quadrants randomly
                if (rand.Next(0, 2) == 0)
                {
                    CurrentBlock.position.X *= -1;
                }
                if (rand.Next(0, 2) == 0)
                {
                    CurrentBlock.position.Y *= -1;
                }

                CurrentBlock.rotation = rand.NextQuaternion();
            }
            MinorModifiers.OrderLoadingCylindrical(Level);
            return Level;
        }
        public static N8Level GetBlockOctopus()
        {
            N8Level Level = new N8Level();
            Random rand = new Random();
            int NumBlocks = 349;
            Vector3D diag1 = new Vector3D(1, 1, 0);
            diag1.Normalize();
            Vector3D diag2 = new Vector3D(1, -1, 0);
            diag2.Normalize();
            Vector3D plusX = new Vector3D(1, 0, 0);
            Vector3D plusY = new Vector3D(0, 1, 0);
            //Max distance for a diagonal is Sqrt(4000^2 + 4000^2) ~= 5656, and add an extra two just to make sure it reaches the edges
            int DiagMin = -5658 / 2;
            int DiagMax = 5658 / 2;
            int StraightMin = -2000;
            int StraightMax = 2000;
            for (int i = 0; i < NumBlocks; i++)
            {

                string color = colors[i % colors.Length];
                N8Block CurrentBlock = Level.blocks.GenerateBlock("simple." + color + ".block", names[rand.Next(names.Length)]);

                if (rand.Next(0, 2) == 0)
                {
                    int dmag = rand.Next(DiagMin, DiagMax);
                    if (rand.Next(0, 2) == 0)
                    {

                        CurrentBlock.position = diag1 * dmag;
                    }
                    else
                    {
                        CurrentBlock.position = diag2 * dmag;
                    }
                }
                else
                {
                    int smag = rand.Next(StraightMin, StraightMax);
                    if (rand.Next(0, 2) == 0)
                    {

                        CurrentBlock.position = plusX * smag;
                    }
                    else
                    {
                        CurrentBlock.position = plusY * smag;
                    }
                }

                CurrentBlock.rotation = rand.NextQuaternion();
            }

            //And now make it come up in the center - blocks closer to 0,0,0 get more of a boost.
            int MaxHeight = 300;
            foreach (N8Block b in Level.blocks.Blocks)
            {
                b.position.Z = Math.Round(Math.Min(100 / b.position.Length * MaxHeight, 600));
            }

            MinorModifiers.OrderLoadingCylindrical(Level);

            return Level;
        }
        public static N8Level GetBlockRoad(bool diagonal = false)
        {
            N8Level Level = new N8Level();
            Random rand = new Random();
            int NumBlocks = 349;
            if (diagonal)
            {
                Vector3D diag1 = new Vector3D(1, 1, 0);
                diag1.Normalize();
                Vector3D diag2 = new Vector3D(1, -1, 0);
                diag2.Normalize();
                //Max distance for a diagonal is Sqrt(4000^2 + 4000^2) ~= 5656, and add an extra two just to make sure it reaches the edges
                int Min = -5658 / 2;
                int Max = 5658 / 2;
                for (int i = 0; i < NumBlocks; i++)
                {
                    int mag = rand.Next(Min, Max);
                    string color = colors[i % colors.Length];
                    N8Block CurrentBlock = Level.blocks.GenerateBlock("simple." + color + ".block", names[rand.Next(names.Length)]);

                    if (rand.Next(0, 2) == 0)
                    {
                        CurrentBlock.position = diag1 * mag;
                    }
                    else
                    {
                        CurrentBlock.position = diag2 * mag;
                    }

                    CurrentBlock.rotation = rand.NextQuaternion();
                }
            }
            else
            {
                for (int i = 0; i < NumBlocks; i++)
                {
                    string color = colors[i % colors.Length];
                    N8Block CurrentBlock = Level.blocks.GenerateBlock("simple." + color + ".block", names[rand.Next(names.Length)]);
                    //Either put them in the x-coord area or the y-coord area (yes this means the center will be better covered)
                    if (rand.Next(0, 2) == 0)
                    {
                        CurrentBlock.position = rand.NextVector(new Vector3D(-100, 2000, 0), new Vector3D(100, -2000, 0));
                    }
                    else
                    {
                        CurrentBlock.position = rand.NextVector(new Vector3D(2000, -100, 0), new Vector3D(-2000, 100, 0));
                    }
                    CurrentBlock.rotation = rand.NextQuaternion();
                }
            }

            MinorModifiers.OrderLoading(Level, new Vector3D(1, 1, 0));

            return Level;
        }