/// <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; } }