public static IOrbitingBody Generate( Distance orbitalDistance, short orbitNumber, string occupiedType, string orbitType, IStar parentStar, double combinedLuminosity) { var p = new Planet(); p.Size = SystemBodySizeGenerator.Generate(orbitNumber, parentStar.Classification); p.Diameter = PlanetDiameterGenerator.Generate(occupiedType, p.Size); p.Density = DensityGenerator.Generate(orbitType); p.Mass = PlanetMassGenerator.Generate(p.Diameter, p.Density); p.OrbitNumber = orbitNumber; p.OrbitalDistance = orbitalDistance; p.OrbitalPeriod = OrbitalPeriodGenerator.Generate(parentStar, p); p.OrbitEccentricity = OrbitalEccentricityGenerator.Generate(); p.OrbitFactor = OrbitFactorGenerator.Generate(p); p.RotationPeriod = RotationPeriodGenerator.Generate(parentStar.Mass, p.OrbitalDistance); p.AxialTilt = AxialTiltGenerator.Generate(); p.AxialTiltEffect = TiltEffectGenerator.Generate(p.AxialTilt); p.Atmosphere = AtmosphereGenerator.Generate(orbitType, p.Size); p.AtmosphereCode = AtmosphereCodeGenerator.Generate(p.Atmosphere); p.Hydrographics = HydrographicsGenerator.Generate(orbitType, p.Atmosphere, p.Size); p.MaxPopulation = MaxPopulationGenerator.Generate(orbitNumber, orbitType, p.Size, p.Atmosphere, p.Hydrographics, parentStar.HabitableZone); p.EnergyAbsorptionFactor = EnergyAbsorptionGenerator.Generate(orbitType, p.Hydrographics, p.AtmosphereCode); p.GreenhouseFactor = GreenhouseTables.GreenHouse[p.Atmosphere]; if (SystemConstants.UseGaiaFactor && p.MaxPopulation > 5) { p.EnergyAbsorptionFactor = GaiaFactorGenerator.Generate(combinedLuminosity, p.OrbitFactor, p.GreenhouseFactor, p.EnergyAbsorptionFactor); } p.MeanTemperature = MeanTemperatureGenerator.Generate(combinedLuminosity, p.OrbitFactor, p.EnergyAbsorptionFactor, p.GreenhouseFactor); p.Seasons = SeasonsGenerator.Generate(p.Size, p.AxialTilt, p.AxialTiltEffect, p.OrbitFactor, p.MeanTemperature, combinedLuminosity, p.OrbitalDistance, p.RotationPeriod, p.Atmosphere); SatellitesGenerator.Generate(parentStar, p, combinedLuminosity); return(p); }
public static IOrbitingBody Generate(IStar parentStar, IStellarOrbitingBody parentBody, double combinedLuminosity) { Moon moon = new Moon(); //Body Details moon.Size = SatelliteSizeGenerator.Generate(parentBody.Size); moon.Density = DensityGenerator.Generate(parentBody.OrbitType); moon.Diameter = PlanetDiameterGenerator.Generate(OccupiedTypes.World, moon.Size); moon.Mass = PlanetMassGenerator.Generate(moon.Diameter, moon.Density); //Orbital moon.OrbitalDistance = SatelliteOrbitDistanceGenerator.Generate(parentBody); moon.OrbitalPeriod = OrbitalPeriodGenerator.Generate(parentBody, moon); moon.OrbitFactor = OrbitFactorGenerator.Generate(parentBody); moon.OrbitEccentricity = OrbitalEccentricityGenerator.Generate(); moon.RotationPeriod = (4 * (DieRoll.Roll2D6() - 2)) + 5; moon.AxialTilt = AxialTiltGenerator.Generate(); moon.AxialTiltEffect = TiltEffectGenerator.Generate(moon.AxialTilt); //Environmental moon.Atmosphere = AtmosphereGenerator.Generate(parentBody.OrbitType, parentBody.Size); moon.AtmosphereCode = AtmosphereCodeGenerator.Generate(moon.Atmosphere); moon.Hydrographics = HydrographicsGenerator.Generate(parentBody.OrbitType, moon.Size, moon.Atmosphere); moon.MaxPopulation = MaxPopulationGenerator.Generate(parentBody.OrbitNumber, parentBody.OrbitType, moon.Size, moon.Atmosphere, moon.Hydrographics, parentStar.HabitableZone); moon.EnergyAbsorptionFactor = EnergyAbsorptionGenerator.Generate(parentBody.OrbitType, moon.Hydrographics, moon.AtmosphereCode); moon.GreenhouseFactor = GreenhouseTables.GreenHouse[moon.Atmosphere]; if (SystemConstants.UseGaiaFactor && moon.MaxPopulation > 5) { moon.EnergyAbsorptionFactor = GaiaFactorGenerator.Generate(combinedLuminosity, moon.OrbitFactor, moon.GreenhouseFactor, moon.EnergyAbsorptionFactor); } moon.MeanTemperature = MeanTemperatureGenerator.Generate(combinedLuminosity, moon.OrbitFactor, moon.EnergyAbsorptionFactor, moon.GreenhouseFactor); moon.Seasons = SeasonsGenerator.Generate(moon.Size, moon.AxialTilt, moon.AxialTiltEffect, moon.OrbitFactor, moon.MeanTemperature, combinedLuminosity, moon.OrbitalDistance, moon.RotationPeriod, moon.Atmosphere); return(moon); }
public static GasGiant Generate(Distance orbitalDistance, short orbitNumber, string occupiedType, string orbitType, IStar parentStar, double combinedLuminosity) { int size; var gasGiant = new GasGiant { OrbitalDistance = orbitalDistance, Density = PlanetDensities.Low }; if (DieRoll.Roll1D6() < 3) { //Small size = -1; gasGiant.Description = "Small"; } else { //Large size = -2; gasGiant.Description = "Large"; } gasGiant.Diameter = PlanetDiameterGenerator.Generate(occupiedType, size); gasGiant.Mass = PlanetMassGenerator.Generate(gasGiant.Diameter, gasGiant.Density); gasGiant.OrbitNumber = orbitNumber; gasGiant.OrbitalDistance = orbitalDistance; gasGiant.OrbitEccentricity = OrbitalEccentricityGenerator.Generate(); gasGiant.OrbitalPeriod = OrbitalPeriodGenerator.Generate(parentStar, gasGiant); gasGiant.RotationPeriod = RotationPeriodGenerator.Generate(parentStar.Mass, gasGiant.OrbitalDistance); gasGiant.AxialTilt = AxialTiltGenerator.Generate(); gasGiant.AxialTiltEffect = TiltEffectGenerator.Generate(gasGiant.AxialTilt); SatellitesGenerator.Generate(parentStar, gasGiant, combinedLuminosity); return(gasGiant); }
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); }