private void writeCoords(systemElement elem)
 {
     if (showText && TextBox != null)
     {
         TextBox.Text += elem.x + " - " + elem.y + " Typ  " + elem.type + Environment.NewLine;
     }
 }
        private systemElement createDummyElement(int _circleNo, int _childOf)
        {
            systemElement newElement = new systemElement();

            newElement.circleNo = _circleNo;
            newElement.childOf  = _childOf;
            return(newElement);
        }
        private systemElement createElement(int _circleNo, int _childOf)
        {
            systemElement newElement = new systemElement();

            newElement.circleNo = _circleNo;
            newElement.childOf  = _childOf;
            newElement.id       = elementId;
            elementId++;
            systemElements.Add(newElement);
            return(newElement);
        }
        public systemElement createFromDummyElement(systemElement _dummy)
        {
            systemElement newElement = new systemElement();

            newElement.circleNo = _dummy.circleNo;
            newElement.childOf  = _dummy.childOf;
            newElement.x        = _dummy.x;
            newElement.y        = _dummy.y;
            newElement.id       = elementId;
            elementId++;
            systemElements.Add(newElement);
            return(newElement);
        }
        public static bool GoodDistance(systemElement tempStar, systemElement tempStar2, int minDistance)
        {
            //int tempDistance = Distance2D(tempStar.x, tempStar.y, tempStar2.x, tempStar2.y);
            int tempDistance = Math.Max(Math.Abs(tempStar.x - tempStar2.x), Math.Abs(tempStar.y - tempStar2.y));//  tempStar.y, tempStar2.x, tempStar2.y);

            if (tempDistance < minDistance)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }
        //active version:
        //number of asteroid circles, planets and else is calculated before the elements are generated
        // 1 : 5 - 13
        // 2 : 5 - 14, danach per Zufall, aber nicht zu nah an dem ersten...
        // 3 : 5 - 15, danach per Zufall, aber nicht zu nah an dem ersten...
        //check if a circle and the next two circles are not asteroidic

        //
        private void createPlanetCircle(int _circleNo, int type)
        {
            if (_circleNo > 10)
            {
                return;
            }

            systemElement planet = createElement(_circleNo, 0);

            while (true)
            {
                int angle = randomGenerator.Next(360);
                planet.x = (int)(centerX + (_circleNo + 2) * Math.Cos(angle));
                planet.y = (int)(centerX + (_circleNo + 2) * Math.Sin(angle));

                neighbouringStars.Clear();
                neighbouringStars.Add(systemElements[planet.id - 1]);
                if (planet.id > 1)
                {
                    neighbouringStars.Add(systemElements[planet.id - 2]);
                }

                //if (planet.id > 3) neighbouringStars.Add(systemElements[planet.id - 3]);

                //if (planet.id > 6) neighbouringStars.Add(systemElements[planet.id - 3]);

                if (systemElements.Any(e => e.id != planet.id && e.x == planet.x && e.y == planet.y))
                {
                    continue;
                }

                if (planet.checkAgainstNeighbours(neighbouringStars, _circleNo))
                {
                    break;
                }
            }
            planet.type = type;
            writeCoords(planet);
            if (planet.type != 32)
            {
                PlanetsCount++;                    //Gas giants are not counted
            }
            if (planet.type == 25 || planet.type == 26 || planet.type == 24)
            {
                HabitablePlanetsCount++;
            }
        }
        private void createAsteroidCircle(int _circleNo, asteroidCircleTypes _type)
        {
            int           degrees  = 0;
            double        angle    = Math.PI * degrees / 180.0;
            int           x_last   = 0;
            int           y_last   = 0;
            asteroidTypes lastType = 0;

            while (degrees < 360)
            {
                angle = Math.PI * degrees / 180.0;
                int x_new = (int)(centerX + (_circleNo + 2) * Math.Cos(angle));
                int y_new = (int)(centerX + (_circleNo + 2) * Math.Sin(angle));
                if (x_new != x_last || y_new != y_last)
                {
                    x_last = x_new;
                    y_last = y_new;

                    lastType = typeDetector.getAsteroidType(lastType, _type);
                    if (lastType != asteroidTypes.None)
                    {
                        if (!systemElements.Any(e => e.x == x_new && e.y == y_new))
                        {
                            systemElement asteroid = createElement(_circleNo, 0);
                            asteroid.x    = x_new;
                            asteroid.y    = y_new;
                            asteroid.type = typeDetector.asteroidObjectId(lastType);
                            if (x_last == centerX || y_last == centerX)
                            {
                                writeCoords(asteroid);
                            }
                        }
                    }
                }
                degrees += 3;
            }
        }
        private void createSun(sunTypes _type)
        {
            systemElement sun = createElement(-1, -1);

            sun.x    = centerX - 1; //11, since coords go from 0->23, and the sun is not a point but two whole coords (11-13)
            sun.y    = centerX - 1;
            sun.size = 2;

            switch (_type)
            {
            case sunTypes.WhiteGiant:
                sun.type = 45;
                break;

            case sunTypes.YellowGiant:
                sun.type = 45;
                break;

            case sunTypes.OrangeGiant:
                sun.type = 45;
                break;

            case sunTypes.RedGiant:
                sun.type = 50;
                break;

            case sunTypes.MSWhite:
                sun.type = 45;
                break;

            case sunTypes.MSBlue:
                sun.type = 45;
                break;

            case sunTypes.MSYellow:
                sun.type = 59;
                break;

            case sunTypes.MSOrange:
                sun.type = 55;
                break;

            case sunTypes.MSRed:
                sun.type = 50;
                break;

            case sunTypes.WhiteDwarfStar:
                sun.type = 45;
                break;

            default:
                sun.type = 55;
                break;
            }

            //sun.type = (randomGenerator.Next(0, 3) * 10) + 45;
            //45	Blauer Riese
            //50	Roter Riese
            //55	Oranger Riese

            writeCoords(sun);
        }
        private void createMoons()
        {
            for (int i = 0; i < systemElements.Count; i++)
            {
                if (systemElements[i].circleNo < 2)
                {
                    continue;                                 //innermost circle has no moons
                }
                if (systemElements[i].type == 10 || systemElements[i].type == 11)
                {
                    continue;                                                               //no asteroid has moons
                }
                if (systemElements[i].childOf > 0)
                {
                    continue;                                   //moons themselves do not have moons
                }
                int numberOfMoons = randomGenerator.Next(0, 3); //up to two moons
                int firstMoonX    = -10;
                int firstMoonY    = -10;
                for (int j = 0; j < numberOfMoons; j++)
                {
                    int newX = systemElements[i].x;
                    int newY = systemElements[i].y;

                    systemElement dummymoon  = createDummyElement(systemElements[i].circleNo, systemElements[i].id);
                    bool          skip       = false;
                    int           retryCount = 0;
                    while (true)
                    {
                        retryCount++;
                        if (retryCount == 100)
                        {
                            skip = true;
                            break;
                        }

                        newX = randomGenerator.Next(-1, 2) + systemElements[i].x;
                        newY = randomGenerator.Next(-1, 2) + systemElements[i].y;
                        if (newX == systemElements[i].x && newY == systemElements[i].y)
                        {
                            continue;                                                             //moon has to be on a diefferent position than its planet
                        }
                        if (newX == firstMoonX && newY == firstMoonY)
                        {
                            continue;                                           //moon has to be on a diefferent position than its sibling-moon (values are set by the first moon
                        }
                        //todo: check that moon is not on same field as asteroid...
                        systemElement coordCheck = findSystemElementsWithCoords(newX, newY);
                        if (coordCheck != null)
                        {
                            continue;
                        }

                        dummymoon.x = newX;
                        dummymoon.y = newY;
                        neighbouringStars.Clear();
                        for (int z = 0; z < systemElements.Count; z++)
                        {
                            if (systemElements[z].type == 10 || systemElements[z].type == 11 || // no asteroids to check
                                systemElements[z].id == systemElements[i].id ||           //not the own motherplanet to check
                                systemElements[z].childOf == systemElements[i].id)        //not the sibling to check
                            {
                                continue;
                            }

                            neighbouringStars.Add(systemElements[z]);
                        }

                        if (dummymoon.checkAgainstNeighbours(neighbouringStars, 2))
                        {
                            break;
                        }
                    }
                    if (skip)
                    {
                        continue;
                    }

                    systemElement moon = createFromDummyElement(dummymoon);
                    firstMoonX = moon.x;
                    firstMoonY = moon.y;
                    moon.type  = typeDetector.getMoonType(systemElements[i].circleNo);
                    writeCoords(moon);
                }
            }
        }