Exemplo n.º 1
0
        public static IStar Generate(int number = 1, IStar primary = null)
        {
            IStar output;

            if (number == 1)
            {
                output = new Star();
                output.Classification  = StellarClassificationGenerator.Generate(false);
                output.LuminosityClass = StellarLuminosityClassGenerator.Generate(output.Classification);
                output.DecimalNotation = StellarDecimalNotationGenerator.Generate(output.Classification, output.LuminosityClass);
                output.Mass            = StellarMassGenerator.Generate(output.Classification, output.DecimalNotation, output.LuminosityClass);
                output.Luminosity      = StellarLuminosityGenerator.Generate(output.Classification, output.DecimalNotation, output.LuminosityClass);
                output.Diameter        = StellarRadiusGenerator.Generate(output.Classification, output.DecimalNotation, output.LuminosityClass) * 2;
            }
            else
            {
                output = new CompanionStar();

                output.Classification  = StellarClassificationGenerator.Generate(true);
                output.LuminosityClass = StellarLuminosityClassGenerator.Generate(output.Classification, primary.LuminosityClass);
                output.DecimalNotation = StellarDecimalNotationGenerator.Generate(output.Classification, output.LuminosityClass);
                output.Mass            = StellarMassGenerator.Generate(output.Classification, output.DecimalNotation, output.LuminosityClass);
                output.Luminosity      = StellarLuminosityGenerator.Generate(output.Classification, output.DecimalNotation, output.LuminosityClass);
                output.Diameter        = StellarRadiusGenerator.Generate(output.Classification, output.DecimalNotation, output.LuminosityClass) * 2;

                var companion = (CompanionStar)output;
                companion.OrbitNumber = CompanionStarOrbitGenerator.Generate();

                if (primary.OrbitingBodies.ContainsKey(companion.OrbitNumber))
                {
                    companion.OrbitNumber += 1;
                    primary.OrbitingBodies.Add(companion.OrbitNumber, companion);
                }
            }

            return(output);
        }
Exemplo n.º 2
0
        public static List <Orbit> Generate(StellarSystem stellarSystem, int starToGenerate = 1)
        {
            Star primaryStar = (Star)stellarSystem.Stars[0];

            CompanionStar secondaryStar = null;

            if (stellarSystem.Stars.Count > 1)
            {
                secondaryStar = (CompanionStar)stellarSystem.Stars[1];
            }

            CompanionStar tertiaryStar = null;

            if (stellarSystem.Stars.Count > 2)
            {
                tertiaryStar = (CompanionStar)stellarSystem.Stars[2];
            }

            IStar currentStar = stellarSystem.Stars[starToGenerate - 1];

            List <Orbit> output = new List <Orbit>();

            int habitableZone = -2;

            for (short i = 0; i < SystemConstants.MaxOrbits; i++)
            {
                Distance orbitalDistance;

                if (currentStar == primaryStar ||
                    currentStar == tertiaryStar)              //All tertiary stars are put at far orbit
                {
                    orbitalDistance = OrbitRangeGenerator.Generate(i);
                }
                else
                {
                    orbitalDistance = CompanionStarOrbitalDistanceGenerator.Generate(primaryStar, secondaryStar, i);
                }

                Orbit o = new Orbit
                {
                    OrbitalDistance = orbitalDistance,
                    OccupiedType    = null,
                    OrbitType       = OrbitTypeGenerator.Generate(orbitalDistance, primaryStar.Luminosity, 0)
                };

                if (o.OrbitType == OrbitTypes.Habitable)
                {
                    habitableZone = i;
                }

                if (o.OrbitType == OrbitTypes.Outer &&
                    habitableZone == -2)
                {
                    habitableZone = i - 1;
                }

                output.Add(o);
            }

            if (habitableZone == -2)
            {
                habitableZone = 10;
            }

            currentStar.HabitableZone = (short)habitableZone;

            int numberOfOrbits = NumberOfOrbitsGenerator.Generate(currentStar.Classification, currentStar.LuminosityClass);

            int emptyOrbits = NumberOfEmptyOrbitsGenerator.Generate(currentStar.Classification);

            RandomOrbitAssignment.Assign(output, emptyOrbits, OccupiedTypes.Empty, -2);

            int capturedPlanets = NumberOfCapturedPlanetsGenerator.Generate(currentStar.Classification);

            RandomOrbitAssignment.Assign(output, capturedPlanets, OccupiedTypes.CapturedPlanet);

            int gasGiants = NumberOfGasGiantsGenerator.Generate(currentStar.Classification);

            RandomOrbitAssignment.Assign(output, gasGiants, OccupiedTypes.GasGiant, -3 + habitableZone);

            int planetoids = NumberOfPlanetoidsGenerator.Generate();

            //Note Slight deviation from source.
            RandomOrbitAssignment.Assign(output, planetoids, OccupiedTypes.Planetoid, -1);

            //Clear out orbits in excess of Number of Orbits, but keep captured planets
            for (int i = 0; i < SystemConstants.MaxOrbits; i++)
            {
                Orbit o = output[i];

                if (i > numberOfOrbits)
                {
                    if (o.OccupiedType != OccupiedTypes.CapturedPlanet)
                    {
                        o.OccupiedType = null;
                    }
                }
                else
                {
                    if (o.OccupiedType == OccupiedTypes.Empty)
                    {
                        o.OccupiedType = null;
                    }
                }
            }

            if (secondaryStar != null &&
                currentStar == primaryStar)
            {
                secondaryStar.OrbitNumber = CompanionStarOrbitGenerator.Generate();

                if (secondaryStar.OrbitNumber < 99)
                {
                    if (secondaryStar.OrbitNumber > 2)
                    {
                        for (int i = secondaryStar.OrbitNumber / 2; i < secondaryStar.OrbitNumber; i++)
                        {
                            Orbit o = output[i];
                            o.OrbitType    = OrbitTypes.Star;
                            o.OccupiedType = null;
                        }
                    }
                    else
                    {
                        Orbit o = output[secondaryStar.OrbitNumber];
                        o.OccupiedType = OccupiedTypes.Star;
                        o.OrbitType    = OrbitTypes.Star;

                        o = output[secondaryStar.OrbitNumber + 1];
                        o.OccupiedType = null;
                        o.OrbitType    = OrbitTypes.Star;
                    }

                    secondaryStar.OrbitalDistance = output[secondaryStar.OrbitNumber].OrbitalDistance;

                    stellarSystem.CombinedLuminosity += SystemConstants.HabitNum /
                                                        Math.Sqrt(secondaryStar.OrbitalDistance.ToAstronomicalUnits().Value);
                }
                else
                {
                    //No impact on luminosity
                    secondaryStar.OrbitalDistance = FarOrbitDistanceGenerator.Generate();
                }

                secondaryStar.OrbitalPeriod     = OrbitalPeriodGenerator.Generate(primaryStar, secondaryStar);
                secondaryStar.OrbitEccentricity = OrbitalEccentricityGenerator.Generate();
                secondaryStar.AxialTilt         = AxialTiltGenerator.Generate();
                secondaryStar.AxialTiltEffect   = TiltEffectGenerator.Generate(secondaryStar.AxialTilt);
            }

            //Third stars a pushed to a far orbit
            //No impact on luminosity
            if (tertiaryStar != null &&
                currentStar == primaryStar)
            {
                if (secondaryStar.OrbitNumber == 99)
                {
                    tertiaryStar.OrbitNumber = 100;
                }
                else
                {
                    tertiaryStar.OrbitNumber = 99;
                }

                tertiaryStar.OrbitalDistance   = FarOrbitDistanceGenerator.Generate();
                tertiaryStar.OrbitalPeriod     = OrbitalPeriodGenerator.Generate(primaryStar, tertiaryStar);
                tertiaryStar.OrbitEccentricity = OrbitalEccentricityGenerator.Generate();
                tertiaryStar.AxialTilt         = AxialTiltGenerator.Generate();
                tertiaryStar.AxialTiltEffect   = TiltEffectGenerator.Generate(tertiaryStar.AxialTilt);
            }

            return(output);
        }