Exemple #1
0
        /// <summary>
        ///     Determines RVM, and geologic values for a satelite
        /// </summary>
        /// <param name="s">The satelite</param>
        /// <param name="ourBag">Ddice object</param>
        /// <param name="sysAge">System Age</param>
        /// <param name="isGasGiantMoon">Is this a moon of a gas giant?</param>
        private static void DetermineGeologicValues( Satellite s, Dice ourBag, double sysAge, bool isGasGiantMoon )
        {
            //volcanic set first.
            var addVal = s.Gravity / sysAge * 40;

            if (s.MajorMoons.Count == 1)
            {
                addVal = addVal + 5;
            }
            if (s.MajorMoons.Count == 2)
            {
                addVal = addVal + 10;
            }

            if (s.SatelliteType == Satellite.SubtypeSulfur)
            {
                addVal = addVal + 60;
            }
            if (isGasGiantMoon)
            {
                addVal = addVal + 5;
            }

            var roll = ourBag.GurpsRoll();

            addVal = addVal + roll;

            if (addVal <= 16.5)
            {
                s.VolActivity = Satellite.GeologicNone;
            }
            if (addVal > 16.5 && addVal <= 20.5)
            {
                s.VolActivity = Satellite.GeologicLight;
            }
            if (addVal > 20.5 && addVal <= 26.5)
            {
                s.VolActivity = Satellite.GeologicModerate;
            }
            if (addVal > 26.5 && addVal <= 70.5)
            {
                s.VolActivity = Satellite.GeologicHeavy;
            }
            if (addVal > 70.5)
            {
                s.VolActivity = Satellite.GeologicExtreme;
            }

            roll = ourBag.GurpsRoll();
            if (s.VolActivity == Satellite.GeologicHeavy && s.SatelliteType == Satellite.SubtypeGarden && roll <= 8)
            {
                roll = ourBag.Rng(6);
                if (roll <= 3)
                {
                    s.AddAtmCategory(Satellite.AtmMargPollutants);
                }
                if (roll >= 4)
                {
                    s.AddAtmCategory(Satellite.AtmMargSulfur);
                }
            }

            roll = ourBag.GurpsRoll();
            if (s.VolActivity == Satellite.GeologicExtreme && s.SatelliteType == Satellite.SubtypeGarden && roll <= 14)
            {
                roll = ourBag.Rng(6);
                if (roll <= 3)
                {
                    s.AddAtmCategory(Satellite.AtmMargPollutants);
                }
                if (roll >= 4)
                {
                    s.AddAtmCategory(Satellite.AtmMargSulfur);
                }
            }

            //tectonic next
            roll = ourBag.GurpsRoll();

            //negative mods
            if (Math.Abs(s.HydCoverage) < 0)
            {
                roll = roll - 4;
            }
            if (s.HydCoverage > 0 && s.HydCoverage < .5)
            {
                roll = roll - 2;
            }
            if (s.VolActivity == Satellite.GeologicNone)
            {
                roll = roll - 8;
            }
            if (s.VolActivity == Satellite.GeologicLight)
            {
                roll = roll - 4;
            }

            //postive mods
            if (s.VolActivity == Satellite.GeologicHeavy)
            {
                roll = roll + 4;
            }
            if (s.VolActivity == Satellite.GeologicExtreme)
            {
                roll = roll + 8;
            }
            if (s.MajorMoons.Count == 1)
            {
                roll = roll + 2;
            }
            if (s.MajorMoons.Count > 1)
            {
                roll = roll + 4;
            }

            //nullers.
            if (s.SatelliteSize == Satellite.SizeTiny)
            {
                roll = 0;
            }
            if (s.SatelliteSize == Satellite.SizeSmall)
            {
                roll = 0;
            }

            if (roll <= 6.5)
            {
                s.TecActivity = Satellite.GeologicNone;
            }
            if (roll > 6.5 && roll <= 10.5)
            {
                s.TecActivity = Satellite.GeologicLight;
            }
            if (roll > 10.5 && roll <= 14.5)
            {
                s.TecActivity = Satellite.GeologicModerate;
            }
            if (roll > 14.5 && roll <= 18.5)
            {
                s.TecActivity = Satellite.GeologicHeavy;
            }
            if (roll > 18.5)
            {
                s.TecActivity = Satellite.GeologicExtreme;
            }

            //update RVM
            if ((bool) !OptionCont.HighRvmVal)
            {
                roll = ourBag.GurpsRoll();
            }
            if (OptionCont.HighRvmVal != null && (bool) OptionCont.HighRvmVal)
            {
                roll = ourBag.Rng(1, 6, 10);
            }

            if (s.VolActivity == Satellite.GeologicNone)
            {
                roll = roll - 2;
            }
            if (s.VolActivity == Satellite.GeologicLight)
            {
                roll = roll - 1;
            }
            if (s.VolActivity == Satellite.GeologicHeavy)
            {
                roll = roll + 1;
            }
            if (s.VolActivity == Satellite.GeologicExtreme)
            {
                roll = roll + 2;
            }

            if (s.BaseType == Satellite.BasetypeAsteroidbelt)
            {
                if (s.SatelliteSize == Satellite.SizeTiny)
                {
                    roll = roll - 1;
                }
                if (s.SatelliteSize == Satellite.SizeMedium)
                {
                    roll = roll + 2;
                }
                if (s.SatelliteSize == Satellite.SizeLarge)
                {
                    roll = roll + 4;
                }
            }

            //set stable activity here:
            if (OptionCont.StableActivity != null && ( (bool) OptionCont.StableActivity && s.SatelliteSize >= Satellite.SizeSmall && ( s.BaseType == Satellite.BasetypeMoon || s.BaseType == Satellite.BasetypeTerrestial ) ))
            {
                s.VolActivity = Satellite.GeologicModerate;
                s.TecActivity = Satellite.GeologicModerate;
            }

            s.PopulateRvm(roll);
        }
Exemple #2
0
        /// <summary>
        ///     Updates a satellite for tidal lock
        /// </summary>
        /// <param name="s">The satelite </param>
        /// <param name="ourBag">Our Ddice object</param>
        private static void UpdateTidalLock( Satellite s, Dice ourBag )
        {
            var atmDesc = s.GetAtmCategory();

            if (atmDesc == Satellite.AtmPresNone || atmDesc == Satellite.AtmPresTrace)
            {
                s.UpdateAtmPres(0.00);
                s.HydCoverage = 0.0;
                s.DayFaceMod = 1.2;
                s.NightFaceMod = .1;
            }

            if (atmDesc == Satellite.AtmPresVerythin)
            {
                s.UpdateAtmPres(0.01);
                s.HydCoverage = 0.0;
                s.DayFaceMod = 1.2;
                s.NightFaceMod = .1;
            }

            if (atmDesc == Satellite.AtmPresThin)
            {
                s.UpdateAtmPres(ourBag.RollRange(.01, .49));

                s.HydCoverage = s.HydCoverage - .5;
                if (s.HydCoverage < 0)
                {
                    s.HydCoverage = 0.0;
                }

                s.DayFaceMod = 1.16;
                s.NightFaceMod = .67;
            }

            if (atmDesc == Satellite.AtmPresStandard)
            {
                s.HydCoverage = s.HydCoverage - .25;
                if (s.HydCoverage < 0)
                {
                    s.HydCoverage = 0.0;
                }

                s.DayFaceMod = 1.12;
                s.NightFaceMod = .80;
            }

            if (atmDesc == Satellite.AtmPresDense)
            {
                s.HydCoverage = s.HydCoverage - .1;
                if (s.HydCoverage < 0)
                {
                    s.HydCoverage = 0.0;
                }
                s.DayFaceMod = 1.09;
                s.NightFaceMod = .88;
            }

            if (atmDesc == Satellite.AtmPresVerydense)
            {
                s.DayFaceMod = 1.05;
                s.NightFaceMod = .95;
            }

            if (atmDesc != Satellite.AtmPresSuperdense)
            {
                return;
            }
            s.DayFaceMod = 1.0;
            s.NightFaceMod = 1.0;
        }
Exemple #3
0
 /// <summary>
 ///     Rolls the gas giant size and updates it.
 /// </summary>
 /// <param name="s">The gas gaint we are editing</param>
 /// <param name="roll">The Ddice roll</param>
 public static void UpdateGasGiantSize( Satellite s, int roll )
 {
     if (roll <= 10)
     {
         s.UpdateSize(Satellite.SizeSmall);
     }
     if (roll >= 11 && roll <= 16)
     {
         s.UpdateSize(Satellite.SizeMedium);
     }
     if (roll >= 17)
     {
         s.UpdateSize(Satellite.SizeLarge);
     }
 }
        public StarSystem CreateNewSystem()
        {
            OurSystem.SysName = LibStarGen.GenRandomSysName(OptionCont.SysNamePrefix, VelvetBag);
            OurSystem.SysAge = LibStarGen.GenSystemAge(VelvetBag);
            LibStarGen.CreateStars(VelvetBag, OurSystem);
            //---------------------
            //generate the planets!
            var totalOrbCount = 0; //total orbital count

            //first off, master loop.
            foreach (var star in OurSystem.SysStars)
            {
                //draw up forbidden zones.
                if (!star.TestInitlizationZones())
                {
                    star.InitalizeZonesOfInterest();
                }
                for (var i = 1; i < OurSystem.SysStars.Count; i++)
                {
                    Range temp;
                    if (OurSystem.SysStars[i].ParentId == star.SelfId)
                    {
                        temp = new Range(OurSystem.SysStars[i].GetInnerForbiddenZone(), OurSystem.SysStars[i].GetOuterForbiddenZone());
                        star.CreateForbiddenZone(temp, star.SelfId, OurSystem.SysStars[i].SelfId);
                    }
                    if (OurSystem.SysStars[i].SelfId != star.SelfId)
                    {
                        continue;
                    }
                    temp = new Range(OurSystem.SysStars[i].GetInnerForbiddenZone(), OurSystem.SysStars[i].GetOuterForbiddenZone());
                    star.CreateForbiddenZone(temp, star.ParentId, star.SelfId);
                }

                star.SortForbidden();
                star.CreateCleanZones();
                //gas giant flag
                //                LibStarGen.gasGiantFlag(this.OurSystem.sysStars[currStar], VelvetBag.gurpsRoll());

                var placeHolder = new Satellite(0, 0, 0, 0);
                int ownership;
                if (star.GasGiantFlag != Star.GasgiantNone)
                {
                    double rangeAvail = 0, lowerBound = 0, diffRange = 0;
                    var spawnRange = new Range(0, 1);

                    //get range availability and spawn range

                    //CONVENTIONAL
                    if (star.GasGiantFlag == Star.GasgiantConventional)
                    {
                        rangeAvail = star.CheckConRange();
                        lowerBound = Star.SnowLine(star.InitLumin) * 1;
                        diffRange = Star.SnowLine(star.InitLumin) * 1.5 - lowerBound;
                        spawnRange = star.GetConventionalRange();
                    }

                    //ECCENTRIC
                    if (star.GasGiantFlag == Star.GasgiantEccentric)
                    {
                        rangeAvail = star.CheckEccRange();
                        lowerBound = Star.SnowLine(star.InitLumin) * .125;
                        diffRange = Star.SnowLine(star.InitLumin) * .75 - lowerBound;
                        spawnRange = star.GetEccentricRange();
                    }

                    //EPISTELLAR
                    if (star.GasGiantFlag == Star.GasgiantEpistellar)
                    {
                        rangeAvail = star.CheckEpiRange();
                        lowerBound = Star.InnerRadius(star.InitLumin, star.InitMass) * .1;
                        diffRange = Star.InnerRadius(star.InitLumin, star.InitMass) * 1.8 - lowerBound;
                        spawnRange = star.GetEpistellarRange();
                    }

                    int roll;
                    double orbit;
                    if (rangeAvail >= .25)
                    {
                        do
                        {
                            orbit = VelvetBag.RollRange(lowerBound, diffRange);
                        }
                        while (!star.VerifyCleanOrbit(orbit));

                        ownership = star.GetOwnership(orbit);

                        if (star.GasGiantFlag == Star.GasgiantEpistellar)
                        {
                            ownership = star.SelfId;
                        }

                        placeHolder = new Satellite(ownership, 0, orbit, 0, Satellite.BasetypeGasgiant);

                        roll = VelvetBag.GurpsRoll() + 4;
                        LibStarGen.UpdateGasGiantSize(placeHolder, roll);
                    }

                    if (rangeAvail >= .005 && rangeAvail < .25)
                    {
                        orbit = star.PickInRange(spawnRange);
                        ownership = star.GetOwnership(orbit);
                        if (star.GasGiantFlag == Star.GasgiantEpistellar)
                        {
                            ownership = star.SelfId;
                        }

                        placeHolder = new Satellite(ownership, 0, orbit, 0, Satellite.BasetypeGasgiant);

                        roll = VelvetBag.GurpsRoll() + 4;
                        LibStarGen.UpdateGasGiantSize(placeHolder, roll);
                    }
                }

                //now we've determined our placeholdr, let's start working on our orbitals.

                double currOrbit = Star.InnerRadius(star.InitLumin, star.InitMass), nextOrbit;
                const double distance = .15;

                //now we have our placeholder.
                if (Math.Abs(placeHolder.OrbitalRadius) > 0)
                {
                    star.AddSatellite(placeHolder);
                    currOrbit = placeHolder.OrbitalRadius;
                }

                if (star.GasGiantFlag != Star.GasgiantEpistellar && Math.Abs(placeHolder.OrbitalRadius) > 0)
                {
                    //we're moving left.
                    //LEFT RIGHT LEFT
                    //.. sorry about that
                    var innerRadius = Star.InnerRadius(star.InitLumin, star.InitMass);
                    do
                    {
                        //as we're moving left, divide.
                        nextOrbit = currOrbit / LibStarGen.GetOrbitalRatio(VelvetBag);

                        if (nextOrbit > currOrbit - distance)
                        {
                            nextOrbit = currOrbit - distance;
                        }

                        if (star.VerifyCleanOrbit(nextOrbit) && star.WithinCreationRange(nextOrbit))
                        {
                            ownership = star.GetOwnership(nextOrbit);
                            star.AddSatellite(new Satellite(ownership, 0, nextOrbit, 0));
                        }

                        currOrbit = nextOrbit;

                        //now let's check on
                    }
                    while (currOrbit > innerRadius);
                }

                //MOVE RIGHT!
                //now we have our placeholder.
                if (star.GasGiantFlag == Star.GasgiantEpistellar || Math.Abs(placeHolder.OrbitalRadius) < 0)
                {
                    var outerRadius = Star.OuterRadius(star.InitMass);
                    do
                    {
                        //as we're moving right, multiply.
                        nextOrbit = currOrbit * LibStarGen.GetOrbitalRatio(VelvetBag);

                        if (nextOrbit < currOrbit + distance)
                        {
                            nextOrbit = currOrbit + distance;
                        }

                        if (star.VerifyCleanOrbit(nextOrbit) && star.WithinCreationRange(nextOrbit))
                        {
                            ownership = star.GetOwnership(nextOrbit);
                            star.AddSatellite(new Satellite(ownership, 0, nextOrbit, 0));
                        }

                        currOrbit = nextOrbit;

                        if (currOrbit < 0)
                        {
                            currOrbit = outerRadius + 10;
                        }
                        //now let's check on
                    }
                    while (currOrbit < outerRadius);
                }

                //if a clean zone has 0 planets, add one.
                foreach (var c in star.ZonesOfInterest.FormationZones.Where(c => !star.CleanZoneHasOrbits(c)))
                {
                    nextOrbit = star.PickInRange(c.GetRange());
                    ownership = star.GetOwnership(nextOrbit);
                    star.AddSatellite(new Satellite(ownership, 0, nextOrbit, 0));
                }

                //sort orbitals
                star.SortOrbitals();
                star.GiveOrbitalsOrder(ref totalOrbCount);

                //now we get orbital contents, then fill in details
                LibStarGen.PopulateOrbits(star, VelvetBag);

                //set any star with all empty orbits to have one planet
                if (OptionCont.EnsureOneOrbit != null && ( !star.IsAllEmptyOrbits() || !(bool) OptionCont.EnsureOneOrbit ))
                {
                    continue;
                }
                var newPlanet = VelvetBag.Rng(1, star.SysPlanets.Count, -1);
                star.SysPlanets[newPlanet].UpdateTypeSize(Satellite.BasetypeTerrestial, Satellite.SizeMedium);
            }

            foreach (var star in OurSystem.SysStars)
            {
                var distChart = LibStarGen.GenDistChart(OurSystem.SysStars);
                foreach (var sat in star.SysPlanets)
                {
                    sat.UpdateBlackBodyTemp(distChart, OurSystem.SysStars);
                }
                LibStarGen.CreatePlanets(OurSystem, star.SysPlanets, VelvetBag);
            }
            //-----------------------
            return OurSystem;
        }
Exemple #5
0
        /// <summary>
        ///     The copy constructor
        /// </summary>
        /// <param name="s">The satelite object we are copying</param>
        public Satellite( Satellite s )
            : base(s.ParentId, s.SelfId)
        {
            // .. it's a copy constructor.
            InitiateLists();
            UpdateType(s.SatelliteType);
            UpdateSize(s.SatelliteSize);

            foreach (var m in s.InnerMoonlets)
            {
                InnerMoonlets.Add(new Moonlet(m));
            }

            foreach (var m in s.OuterMoonlets)
            {
                OuterMoonlets.Add(new Moonlet(m));
            }

            foreach (var m in s.MajorMoons)
            {
                MajorMoons.Add(new Satellite(m));
            }

            OrbitalCycle = s.OrbitalCycle;
            Diameter = s.Diameter;
            Mass = s.Mass;
            Density = s.Density;
            AxialTilt = s.AxialTilt;
            SiderealPeriod = s.SiderealPeriod;
            RotationalPeriod = s.RotationalPeriod;
            RetrogradeMotion = s.RetrogradeMotion;

            foreach (var atmType in s.AtmCate)
            {
                AtmCate.Add(atmType);
            }

            foreach (var kvp in s.TideForce)
            {
                TideForce.Add(kvp.Key, kvp.Value);
            }

            VolActivity = s.VolActivity;
            TecActivity = s.TecActivity;
            MasterOrderId = s.MasterOrderId;

            SurfaceTemp = s.SurfaceTemp;
            DayFaceMod = s.DayFaceMod;
            NightFaceMod = s.NightFaceMod;

            HydCoverage = s.HydCoverage;
            AtmMass = s.AtmMass;
            AtmPres = s.AtmPres;
            Rvm = s.Rvm;
            IsResonant = s.IsResonant;
        }
        /// <summary>
        ///     Sends the completed status and begins generating the planets
        /// </summary>
        /// <param name="sender">Sender object</param>
        /// <param name="e">EventArgs object</param>
        private void btnGenPlanets_Click( object sender, EventArgs e )
        {
            //save options
            OptionCont.MoreConGasGiantChances = ChkConGasGiant.IsChecked != null && (bool) ChkConGasGiant.IsChecked;
            OptionCont.NoOceanOnlyGarden = OnlyGarden.IsChecked != null && (bool) OnlyGarden.IsChecked;
            OptionCont.MoreAccurateO2Catastrophe = ChkMoreAccurateO2Catastrophe.IsChecked != null && (bool) ChkMoreAccurateO2Catastrophe.IsChecked;
            OptionCont.StableActivity = FrcStableActivity.IsChecked != null && (bool) FrcStableActivity.IsChecked;
            OptionCont.NoMarginalAtm = NoMarginAtm.IsChecked != null && (bool) NoMarginAtm.IsChecked;
            OptionCont.HighRvmVal = HighRvm.IsChecked != null && (bool) HighRvm.IsChecked;
            OptionCont.OverrideHabitability = ChkHigherHabitability.IsChecked != null && (bool) ChkHigherHabitability.IsChecked;
            OptionCont.IgnoreLunarTidesOnGardenWorlds = IgnoreTides.IsChecked != null && (bool) IgnoreTides.IsChecked;
            OptionCont.RerollAxialTiltOver45 = ChkKeepAxialTiltUnder45.IsChecked != null && (bool) ChkKeepAxialTiltUnder45.IsChecked;
            OptionCont.AlwaysDisplayTidalData = ChkDisplayTidalData.IsChecked != null && (bool) ChkDisplayTidalData.IsChecked;
            OptionCont.ExpandAsteroidBelt = ChkExpandAsteroidBelt.IsChecked != null && (bool) ChkExpandAsteroidBelt.IsChecked;

            if (OverrideMoons.IsChecked == true)
            {
                OptionCont.SetNumberOfMoonsOverGarden(int.Parse(NumMoons.Text));
            }
            if (OverridePressure.IsChecked == true)
            {
                OptionCont.SetAtmPressure = double.Parse(NumAtmPressure.Text);
            }
            if (ChkOverrideTilt.IsChecked == true)
            {
                OptionCont.SetAxialTilt(int.Parse(NumTilt.Text));
            }

            //set the moon option.
            if (BookHigh.IsChecked == true)
            {
                OptionCont.MoonOrbitFlag = OptionCont.MoonBookhigh;
            }
            if (BookMoon.IsChecked == true)
            {
                OptionCont.MoonOrbitFlag = OptionCont.MoonBook;
            }
            if (ExtendHigh.IsChecked == true)
            {
                OptionCont.MoonOrbitFlag = OptionCont.MoonExpandhigh;
            }
            if (ExtendNorm.IsChecked == true)
            {
                OptionCont.MoonOrbitFlag = OptionCont.MoonExpand;
            }

            //generate the planets!
            var totalOrbCount = 0; //total orbital count

            //first off, master loop.
            foreach (var star in OurSystem.SysStars)
            {
                if (!star.TestInitlizationZones())
                {
                    star.InitalizeZonesOfInterest();
                }
                for (var i = 1; i < OurSystem.SysStars.Count; i++)
                {
                    Range temp;
                    if (OurSystem.SysStars[i].ParentId == star.SelfId)
                    {
                        temp = new Range(OurSystem.SysStars[i].GetInnerForbiddenZone(), OurSystem.SysStars[i].GetOuterForbiddenZone());
                        star.CreateForbiddenZone(temp, star.SelfId, OurSystem.SysStars[i].SelfId);
                    }
                    if (OurSystem.SysStars[i].SelfId != star.SelfId)
                    {
                        continue;
                    }
                    temp = new Range(OurSystem.SysStars[i].GetInnerForbiddenZone(), OurSystem.SysStars[i].GetOuterForbiddenZone());
                    star.CreateForbiddenZone(temp, star.ParentId, star.SelfId);
                }

                star.SortForbidden();
                star.CreateCleanZones();
                var placeHolder = new Satellite(0, 0, 0, 0);
                int ownership;
                if (star.GasGiantFlag != Star.GasgiantNone)
                {
                    double rangeAvail = 0, lowerBound = 0, diffRange = 0;
                    var spawnRange = new Range(0, 1);

                    //get range availability and spawn range

                    //CONVENTIONAL
                    if (star.GasGiantFlag == Star.GasgiantConventional)
                    {
                        rangeAvail = star.CheckConRange();
                        lowerBound = Star.SnowLine(star.InitLumin) * 1;
                        diffRange = Star.SnowLine(star.InitLumin) * 1.5 - lowerBound;
                        spawnRange = star.GetConventionalRange();
                    }

                    //ECCENTRIC
                    if (star.GasGiantFlag == Star.GasgiantEccentric)
                    {
                        rangeAvail = star.CheckEccRange();
                        lowerBound = Star.SnowLine(star.InitLumin) * .125;
                        diffRange = Star.SnowLine(star.InitLumin) * .75 - lowerBound;
                        spawnRange = star.GetEccentricRange();
                    }

                    //EPISTELLAR
                    if (star.GasGiantFlag == Star.GasgiantEpistellar)
                    {
                        rangeAvail = star.CheckEpiRange();
                        lowerBound = Star.InnerRadius(star.InitLumin, star.InitMass) * .1;
                        diffRange = Star.InnerRadius(star.InitLumin, star.InitMass) * 1.8 - lowerBound;
                        spawnRange = star.GetEpistellarRange();
                    }

                    int roll;
                    double orbit;
                    if (rangeAvail >= .25)
                    {
                        do
                        {
                            orbit = VelvetBag.RollRange(lowerBound, diffRange);
                        }
                        while (!star.VerifyCleanOrbit(orbit));

                        ownership = star.GetOwnership(orbit);

                        if (star.GasGiantFlag == Star.GasgiantEpistellar)
                        {
                            ownership = star.SelfId;
                        }

                        placeHolder = new Satellite(ownership, 0, orbit, 0, Satellite.BasetypeGasgiant);

                        roll = VelvetBag.GurpsRoll() + 4;
                        LibStarGen.UpdateGasGiantSize(placeHolder, roll);
                    }

                    if (rangeAvail >= .005 && rangeAvail < .25)
                    {
                        orbit = star.PickInRange(spawnRange);
                        ownership = star.GetOwnership(orbit);
                        if (star.GasGiantFlag == Star.GasgiantEpistellar)
                        {
                            ownership = star.SelfId;
                        }

                        placeHolder = new Satellite(ownership, 0, orbit, 0, Satellite.BasetypeGasgiant);

                        roll = VelvetBag.GurpsRoll() + 4;
                        LibStarGen.UpdateGasGiantSize(placeHolder, roll);
                    }
                }

                //now we've determined our placeholdr, let's start working on our orbitals.

                double currOrbit = Star.InnerRadius(star.InitLumin, star.InitMass), nextOrbit;
                const double distance = .15;

                //now we have our placeholder.
                if (Math.Abs(placeHolder.OrbitalRadius) > 0)
                {
                    star.AddSatellite(placeHolder);
                    currOrbit = placeHolder.OrbitalRadius;
                }

                if (star.GasGiantFlag != Star.GasgiantEpistellar && Math.Abs(placeHolder.OrbitalRadius) > 0)
                {
                    //we're moving left.
                    //LEFT RIGHT LEFT
                    //.. sorry about that
                    var innerRadius = Star.InnerRadius(star.InitLumin, star.InitMass);
                    do
                    {
                        //as we're moving left, divide.
                        nextOrbit = currOrbit / LibStarGen.GetOrbitalRatio(VelvetBag);

                        if (nextOrbit > currOrbit - distance)
                        {
                            nextOrbit = currOrbit - distance;
                        }

                        if (star.VerifyCleanOrbit(nextOrbit) && star.WithinCreationRange(nextOrbit))
                        {
                            ownership = star.GetOwnership(nextOrbit);
                            star.AddSatellite(new Satellite(ownership, 0, nextOrbit, 0));
                        }

                        currOrbit = nextOrbit;

                        //now let's check on
                    }
                    while (currOrbit > innerRadius);
                }

                //MOVE RIGHT!
                //now we have our placeholder.
                if (star.GasGiantFlag == Star.GasgiantEpistellar || Math.Abs(placeHolder.OrbitalRadius) < 0)
                {
                    var outerRadius = Star.OuterRadius(star.InitMass);
                    do
                    {
                        //as we're moving right, multiply.
                        nextOrbit = currOrbit * LibStarGen.GetOrbitalRatio(VelvetBag);

                        if (nextOrbit < currOrbit + distance)
                        {
                            nextOrbit = currOrbit + distance;
                        }

                        if (star.VerifyCleanOrbit(nextOrbit) && star.WithinCreationRange(nextOrbit))
                        {
                            ownership = star.GetOwnership(nextOrbit);
                            star.AddSatellite(new Satellite(ownership, 0, nextOrbit, 0));
                        }

                        currOrbit = nextOrbit;

                        if (currOrbit < 0)
                        {
                            currOrbit = outerRadius + 10;
                        }
                        //now let's check on
                    }
                    while (currOrbit < outerRadius);
                }

                //if a clean zone has 0 planets, add one.
                foreach (var c in star.ZonesOfInterest.FormationZones)
                {
                    if (!star.CleanZoneHasOrbits(c))
                    {
                        nextOrbit = star.PickInRange(c.GetRange());
                        ownership = star.GetOwnership(nextOrbit);
                        star.AddSatellite(new Satellite(ownership, 0, nextOrbit, 0));
                    }
                }

                //sort orbitals
                star.SortOrbitals();
                star.GiveOrbitalsOrder(ref totalOrbCount);

                //now we get orbital contents, then fill in details
                LibStarGen.PopulateOrbits(star, VelvetBag);

                //set any star with all empty orbits to have one planet
                if (!star.IsAllEmptyOrbits() || !(bool) OptionCont.EnsureOneOrbit)
                {
                    continue;
                }
                var newPlanet = VelvetBag.Rng(1, star.SysPlanets.Count, -1);
                star.SysPlanets[newPlanet].UpdateTypeSize(Satellite.BasetypeTerrestial, Satellite.SizeMedium);
            }

            foreach (var star in OurSystem.SysStars)
            {
                var distChart = LibStarGen.GenDistChart(OurSystem.SysStars);
                foreach (var sat in star.SysPlanets)
                {
                    sat.UpdateBlackBodyTemp(distChart, OurSystem.SysStars);
                }
                LibStarGen.CreatePlanets(OurSystem, star.SysPlanets, VelvetBag);
            }

            OParent.CreatePlanetsFinished = true;
            Close(); //close the form
        }
Exemple #7
0
 public virtual void AddSatellite( Satellite s )
 {
     SysPlanets.Add(s);
 }