/// <summary>
 /// This generates a random name for a star system
 /// </summary>
 /// <param name="prefix">The prefix for the generator</param>
 /// <param name="ourDice">Dice used in rolling</param>
 /// <returns>A random name for a star system</returns>
 public static string genRandomSysName(string prefix, Dice ourDice)
 {
     return (prefix + Math.Round(ourDice.rollRange(0, 1) * 1000000000, 0));
 }
        /// <summary>
        /// This places our stars around the primary, as well as creating the secondary stars if called for
        /// </summary>
        /// <param name="ourSystem">The star system to be added to.</param>
        /// <param name="velvetBag">Our dice object.</param>
        public static void placeOurStars(StarSystem ourSystem, Dice velvetBag)
        {
            int roll = 0;

                //initiate the variables we need to ensure distances are kept
                double minOrbitalDistance = 0.0, maxOrbitalDistance = 600.0, tempVal = 0.0;
                int starLimit = ourSystem.sysStars.Count;
                for (int i = 1; i < starLimit; i++)
                {
                    int modifiers = 0;
                    minOrbitalDistance = ourSystem.sysStars[i - 1].orbitalRadius;

                    //set the min and max conditions for the first star here.
                    if (ourSystem.sysStars[i].parentID == 0 || ourSystem.sysStars[i].parentID == Star.IS_PRIMARY)
                    {
                        //apply modifiers
                        if (ourSystem.sysStars[i].selfID == Star.IS_TRINARY) modifiers = modifiers + 6;
                        if (OptionCont.forceGardenFavorable && ourSystem.sysStars[i].parentID == Star.IS_PRIMARY) modifiers = modifiers + 4;

                        if (minOrbitalDistance == 600.0)
                        {
                            //in this situation, orbital 3 or so can't be safely placed because the range is 0.
                            // so we autogenerate it.
                            tempVal = velvetBag.rollRange(25, 25);
                            ourSystem.sysStars[i].orbitalSep = 5;
                            ourSystem.sysStars[ourSystem.star2index].orbitalRadius = ourSystem.sysStars[ourSystem.star2index].orbitalRadius - tempVal;
                            ourSystem.sysStars[i].orbitalRadius = 600 + tempVal;
                            ourSystem.sysStars[i].distFromPrimary = ourSystem.sysStars[i].orbitalRadius;
                            minOrbitalDistance = ourSystem.sysStars[i].orbitalRadius;
                        }
                        else
                        {
                            do
                            {
                                double lowerBound = 0.0;
                                double higherBound = 0.0;

                                //roll the dice and generate the orbital radius
                                do
                                {
                                    roll = velvetBag.gurpsRoll(modifiers);
                                    if (roll <= 6) ourSystem.sysStars[i].orbitalSep = Star.ORBSEP_VERYCLOSE;
                                    if (roll >= 7 && roll <= 9) ourSystem.sysStars[i].orbitalSep = Star.ORBSEP_CLOSE;
                                    if (roll >= 10 && roll <= 11) ourSystem.sysStars[i].orbitalSep = Star.ORBSEP_MODERATE;
                                    if (roll >= 12 && roll <= 14) ourSystem.sysStars[i].orbitalSep = Star.ORBSEP_WIDE;
                                    if (roll >= 15) ourSystem.sysStars[i].orbitalSep = Star.ORBSEP_DISTANT;
                                    tempVal = velvetBag.rng(2, 6) * libStarGen.getSepModifier(ourSystem.sysStars[i].orbitalSep);
                                } while (tempVal <= minOrbitalDistance);

                                //if (ourSystem.sysStars[i].selfID == 2) tempVal = this.velvetBag.six(1, 7) * ourSystem.sysStars[i].getSepModifier();
                                lowerBound = tempVal - .5 * libStarGen.getSepModifier(ourSystem.sysStars[i].orbitalSep);
                                higherBound = .5 * libStarGen.getSepModifier(ourSystem.sysStars[i].orbitalSep) + tempVal;

                                //set for constraints
                                if (lowerBound < minOrbitalDistance) lowerBound = minOrbitalDistance;
                                if (higherBound > maxOrbitalDistance) higherBound = maxOrbitalDistance;

                                ourSystem.sysStars[i].orbitalRadius = tempVal;
                                ourSystem.sysStars[i].distFromPrimary = ourSystem.sysStars[i].orbitalRadius;

                            } while (ourSystem.sysStars[i].orbitalRadius <= minOrbitalDistance);

                            //let's see if it has a subcompanion
                            if (ourSystem.sysStars[i].orbitalSep == Star.ORBSEP_DISTANT)
                            {
                                roll = velvetBag.gurpsRoll();
                                if (roll >= 11)
                                {
                                    //generate the subcompanion
                                    int order = 0;

                                    if (ourSystem.sysStars[i].selfID == Star.IS_SECONDARY) order = Star.IS_SECCOMP;
                                    if (ourSystem.sysStars[i].selfID == Star.IS_TRINARY) order = Star.IS_TRICOMP;

                                    //add the star
                                    ourSystem.addStar(order, ourSystem.sysStars[i].selfID, (i + 1));

                                    ourSystem.sysStars[starLimit].name = Star.genGenericName(ourSystem.sysName, (i + 1));

                                    //set the name, then generate the star
                                    ourSystem.sysStars[starLimit].parentName = ourSystem.sysStars[i].name;
                                    libStarGen.generateAStar(ourSystem.sysStars[starLimit], velvetBag, ourSystem.sysStars[i].currMass, ourSystem.sysName);
                                    starLimit++; //increment the total number of stars we have generated
                                }

                            }
                        }
                    }
                    else
                    {
                        minOrbitalDistance = 0;
                        maxOrbitalDistance = ourSystem.sysStars[ourSystem.getStellarParentID(ourSystem.sysStars[i].parentID)].orbitalRadius;
                        //roll for seperation
                        do
                        {
                            double lowerBound = 0.0;
                            double higherBound = 0.0;
                            //roll the dice

                            roll = velvetBag.gurpsRoll(-6);
                            if (roll <= 6) ourSystem.sysStars[i].orbitalSep = Star.ORBSEP_VERYCLOSE;
                            if (roll >= 7 && roll <= 9) ourSystem.sysStars[i].orbitalSep = Star.ORBSEP_CLOSE;
                            if (roll >= 10 && roll <= 11) ourSystem.sysStars[i].orbitalSep = Star.ORBSEP_MODERATE;
                            if (roll >= 12 && roll <= 14) ourSystem.sysStars[i].orbitalSep = Star.ORBSEP_WIDE;
                            if (roll >= 15) ourSystem.sysStars[i].orbitalSep = Star.ORBSEP_DISTANT;

                            //set the subcompanion orbital
                            tempVal = velvetBag.rng(2, 6) * libStarGen.getSepModifier(ourSystem.sysStars[i].orbitalSep);
                            lowerBound = tempVal - .5 * libStarGen.getSepModifier(ourSystem.sysStars[i].orbitalSep);
                            higherBound = .5 * libStarGen.getSepModifier(ourSystem.sysStars[i].orbitalSep) + tempVal;

                            if (higherBound > maxOrbitalDistance) higherBound = maxOrbitalDistance;

                            ourSystem.sysStars[i].orbitalRadius = tempVal;
                            ourSystem.sysStars[i].distFromPrimary = ourSystem.sysStars[i].orbitalRadius + maxOrbitalDistance;

                        } while (ourSystem.sysStars[i].orbitalRadius > maxOrbitalDistance);
                    }

                    libStarGen.calcEccentricity(velvetBag, ourSystem.sysStars[i]);

                    int parent = ourSystem.getStellarParentID(ourSystem.sysStars[i].parentID);
                    ourSystem.sysStars[i].orbitalPeriod = Star.calcOrbitalPeriod(ourSystem.sysStars[parent].currMass, ourSystem.sysStars[i].currMass, ourSystem.sysStars[i].orbitalRadius);
                }
        }
        /// <summary>
        /// Updates a satellite for tidal lock
        /// </summary>
        /// <param name="s">The satelite </param>
        /// <param name="ourBag">Our dice object</param>
        public static void updateTidalLock(Satellite s, Dice ourBag)
        {
            int atmDesc = s.getAtmCategory();

            if (atmDesc == Satellite.ATM_PRES_NONE || atmDesc == Satellite.ATM_PRES_TRACE)
            {
                s.updateAtmPres(0.00);
                s.hydCoverage = 0.0;
                s.dayFaceMod = 1.2;
                s.nightFaceMod = .1;
            }

            if (atmDesc == Satellite.ATM_PRES_VERYTHIN)
            {
                s.updateAtmPres(0.01);
                s.hydCoverage = 0.0;
                s.dayFaceMod = 1.2;
                s.nightFaceMod = .1;
            }

            if (atmDesc == Satellite.ATM_PRES_THIN)
            {
                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.ATM_PRES_STANDARD)
            {
                s.hydCoverage = s.hydCoverage - .25;
                if (s.hydCoverage < 0) s.hydCoverage = 0.0;

                s.dayFaceMod = 1.12;
                s.nightFaceMod = .80;
            }

            if (atmDesc == Satellite.ATM_PRES_DENSE)
            {
                s.hydCoverage = s.hydCoverage - .1;
                if (s.hydCoverage < 0) s.hydCoverage = 0.0;
                s.dayFaceMod = 1.09;
                s.nightFaceMod = .88;
            }

            if (atmDesc == Satellite.ATM_PRES_VERYDENSE)
            {
                s.dayFaceMod = 1.05;
                s.nightFaceMod = .95;
            }

            if (atmDesc == Satellite.ATM_PRES_SUPERDENSE)
            {
                s.dayFaceMod = 1.0;
                s.nightFaceMod = 1.0;
            }
        }