//TODO: Store in file
        static public LayoutDescriptionEx GenerateDefault()
        {
            LineDescription[] courseLD = new LineDescription[16];
            LineDescription[] secretLD = new LineDescription[16];

            int[]    linesForSecrets = { 0, 1, 2, 3, 9, 5, 6, 7, 13, 14, 15, 11 };
            string[] namesForSecrets = { "--", "B1", "B2", "B3", "Sl", "MC", "WC", "VC", "S1", "S2", "S3", "OW" };

            courseLD[0] = new LineDescription("Main Courses", true, 0, 0);
            for (int course = 1; course <= 15; course++)
            {
                string drawString = course.ToString("D2");
                courseLD[course] = new LineDescription(drawString, false, 255, course + 3);
            }

            for (int course = 1; course <= 10; course++) //Secret course
            {
                secretLD[linesForSecrets[course]] = new LineDescription(namesForSecrets[course], false, 255, course + 18);
            }
            secretLD[linesForSecrets[11]] = new LineDescription(namesForSecrets[11], false, 255, 0);

            secretLD[0]  = new LineDescription("Bowser Courses", true, 0, 0);
            secretLD[4]  = new LineDescription("Cap Levels", true, 0, 0);
            secretLD[8]  = new LineDescription("Slide", true, 0, 0);
            secretLD[10] = new LineDescription("Overworld Stars", true, 0, 0);
            secretLD[12] = new LineDescription("Secret Stars", true, 0, 0);

            return(new LayoutDescriptionEx(courseLD, secretLD, new Bitmap("images/gold_star.png"), "182"));
        }
        public byte[] SerializeExternal()
        {
            Trim();
            MemoryStream ms = new MemoryStream();

            for (int i = 0; i < courseDescription.Length; i++)
            {
                LineDescription lind = courseDescription[i];
                if (lind == null)
                {
                    continue;
                }
                byte[] data = lind.Serialize(0); //control&2==0 -> course
                ms.Write(data, 0, data.Length);
            }

            for (int i = 0; i < secretDescription.Length; i++)
            {
                LineDescription lind = secretDescription[i];
                if (lind == null)
                {
                    continue;
                }
                byte[] data = lind.Serialize(2); //control&2!=0 -> secret
                ms.Write(data, 0, data.Length);
            }

            return(ms.ToArray());
        }
        public void RecountStars()
        {
            int stars = 0;

            for (int i = 0; i < courseDescription.Length; i++)
            {
                LineDescription lind = courseDescription[i];
                if (lind == null || lind.isTextOnly)
                {
                    continue;
                }
                stars += MemoryManager.countStars((byte)(lind.starMask >> 1), 7);
            }

            for (int i = 0; i < secretDescription.Length; i++)
            {
                LineDescription lind = secretDescription[i];
                if (lind == null || lind.isTextOnly)
                {
                    continue;
                }
                stars += MemoryManager.countStars((byte)(lind.starMask >> 1), 7);
            }

            starAmount = stars.ToString();
        }
        static public LayoutDescription DeserializeExternal(byte[] data, Bitmap img)
        {
            LineDescription[] courseLD = new LineDescription[16];
            LineDescription[] secretLD = new LineDescription[16];

            int courseCounter = 0;
            int secretCounter = 0;

            BinaryReader ms    = new BinaryReader(new MemoryStream(data));
            int          stars = 0;

            while (ms.BaseStream.Position != ms.BaseStream.Length)
            {
                bool            isSecret;
                LineDescription lind = LineDescription.Deserialize(ms, out isSecret);
                if (!lind.isTextOnly)
                {
                    int a = lind.starMask;
                    do
                    {
                        a = a << 1;
                        if ((a & 0x80) != 0)
                        {
                            stars++;
                        }
                    } while (a != 0);
                }

                if (isSecret)
                {
                    if (secretCounter == 16)
                    {
                        break;
                    }
                    secretLD[secretCounter++] = lind;
                }
                else
                {
                    if (courseCounter == 16)
                    {
                        break;
                    }
                    courseLD[courseCounter++] = lind;
                }
            }

            return(new LayoutDescription(courseLD, secretLD, stars.ToString()));
        }
        public void Trim()
        {
            for (int i = courseDescription.Length - 1; i >= 0; i--)
            {
                LineDescription lind = courseDescription[i];
                if (lind == null)
                {
                    continue;
                }
                if (lind.isTextOnly)
                {
                    if (lind.text != "")
                    {
                        break;
                    }
                    else
                    {
                        courseDescription[i] = null;
                    }
                }
                else
                {
                    if (lind.text != "" || lind.starMask != 0)
                    {
                        break;
                    }
                    else
                    {
                        courseDescription[i] = null;
                    }
                }
            }

            for (int i = secretDescription.Length - 1; i >= 0; i--)
            {
                LineDescription lind = secretDescription[i];
                if (lind == null)
                {
                    continue;
                }
                if (lind.isTextOnly)
                {
                    if (lind.text != "")
                    {
                        break;
                    }
                    else
                    {
                        secretDescription[i] = null;
                    }
                }
                else
                {
                    if (lind.text != "" || lind.starMask != 0)
                    {
                        break;
                    }
                    else
                    {
                        secretDescription[i] = null;
                    }
                }
            }
        }