public void Generate() { Debug.Assert(Systems.Count <= 0, "Universe already created"); //Create a galaxy Galaxy g = new Galaxy() { Position = Vector2.Zero }; //Add solar systems for (int i = 0; i < total * total; i++) { int posX = ((i % total) * apart) + Game.random.Next(-deviation, deviation); int posY = ((i / total) * apart) + Game.random.Next(-deviation, deviation); //Add system if (i == 0) { g.Children.Add(new SolarSystem() { Name = PlanetNamer.NamePlanet(), Position = Vector2.Zero, }); } else { Vector2 Position = new Vector2(posX, posY); g.Children.Add(new SolarSystem() { Name = PlanetNamer.NamePlanet(), Position = Position, }); } //Planets per system int totalPlanets = Game.random.Deviation(3, 11, 7); //Loop through planets to be made for (int planet = 0; planet < totalPlanets; planet++) { //First object is always a sun if (planet == 0) { //Choose a type of sun PlanetarySubType SubType = SunType.GetRandom(); //Add and set it up g.Children[i].Children.Add(new PlanetaryObject(g.Children[i].Name, planet, g.Children[i], PlanetaryType.Sun, SubType) { Diameter = Game.random.Deviation((SubType as SunType).MinDiameter, (SubType as SunType).MaxDiameter, (SubType as SunType).AvgDiameter), Color = ((SunType)SubType).Colors[Game.random.Next(0, ((SunType)SubType).Colors.Length)], OuterRadius = 0, Position = g.Children[i].Position, Angle = 0, }); } //Others are planets else { //Choose type of planet PlanetarySubType SubType = PlanetType.GetRandom((float)planet / (float)totalPlanets); //Choose diameter int Diameter = (int)MathHelper.Clamp(((float)(planet - 1) / (float)totalPlanets <= .5f ? (int)(((float)(planet - 1) / (float)totalPlanets) * (100f * 2)) + 156 : (int)((1f - ((float)(planet) / ((float)totalPlanets - 1))) * (100f * 2)) + 156) + Game.random.Next(-30, 30), 156, 256); //Choose 'outer radius', the ring float OuterRadius = 0; if (planet == 1) //First planet in system { OuterRadius = (g.Children[i].Children[0].Diameter) + Diameter + Game.random.Next(120, 220); } else { OuterRadius = g.Children[i].Children[planet - 1].OuterRadius + (g.Children[i].Children[planet - 1].Diameter) + Game.random.Next(0, 65); } //Add and set it up g.Children[i].Children.Add(new PlanetaryObject(g.Children[i].Name, planet, g.Children[i], PlanetaryType.Planet, SubType) { Diameter = Diameter, Color = Color.Lerp(((PlanetType)SubType).Colors[Game.random.Next(0, ((PlanetType)SubType).Colors.Length)], ((PlanetType)SubType).Colors[Game.random.Next(0, ((PlanetType)SubType).Colors.Length)], (float)Game.random.NextDouble()), OuterRadius = OuterRadius, Angle = Game.random.Next(0, 360), }); g.Children[i].Radius = OuterRadius; } } } Systems.Add(g); HomePlanet = g.Children[(g.Children.Count / 2) + (total / 2)].Children[1]; TotalSize = total; }
static SunType() { SunTypes = new List <SunType>(); OMainSequence = new SunType("Main Sequence Star (O)") { Abundance = .02f, Colors = new Color[] { new Color(0, 220, 255) }, MinDiameter = 590, MaxDiameter = 730, AvgDiameter = 660, }; BMainSequence = new SunType("Main Sequence Star (B)") { Abundance = .05f, Colors = new Color[] { new Color(45, 180, 255) }, MinDiameter = 550, MaxDiameter = 680, AvgDiameter = 630, }; AMainSequence = new SunType("Main Sequence Star (A)") { Abundance = .05f, Colors = new Color[] { new Color(140, 200, 255) }, MinDiameter = 530, MaxDiameter = 660, AvgDiameter = 590, }; FMainSequence = new SunType("Main Sequence Star (F)") { Abundance = .06f, Colors = new Color[] { new Color(255, 235, 165) }, MinDiameter = 500, MaxDiameter = 650, AvgDiameter = 570, }; GMainSequence = new SunType("Main Sequence Star (G)") { Abundance = .08f, Colors = new Color[] { new Color(255, 255, 135), new Color(255, 230, 135) }, MinDiameter = 490, MaxDiameter = 640, AvgDiameter = 580, }; KMainSequence = new SunType("Main Sequence Star (K)") { Abundance = .14f, Colors = new Color[] { new Color(255, 182, 63), new Color(255, 192, 68) }, MinDiameter = 470, MaxDiameter = 630, AvgDiameter = 550, }; MMainSequence = new SunType("Main Sequence Star (M)") { Abundance = .42f, Colors = new Color[] { new Color(255, 145, 0), new Color(255, 120, 5), new Color(255, 165, 0), new Color(255, 155, 20), }, MinDiameter = 460, MaxDiameter = 610, AvgDiameter = 520, }; RedGiant = new SunType("Red Giant") { Abundance = .12f, Colors = new Color[] { new Color(255, 52, 0), new Color(255, 100, 20) }, MinDiameter = 630, MaxDiameter = 760, AvgDiameter = 710, }; SuperGiant = new SunType("Super Giant") { Abundance = .07f, Colors = new Color[] { new Color(255, 70, 30), new Color(255, 150, 60) }, MinDiameter = 680, MaxDiameter = 768, AvgDiameter = 750, }; WhiteDwarf = new SunType("White Dwarf") { Abundance = .06f, Colors = new Color[] { new Color(250, 255, 255), new Color(245, 253, 255) }, MinDiameter = 90, MaxDiameter = 200, AvgDiameter = 140 }; SunTypes = SunTypes.OrderBy(x => x.Abundance).ToList(); Chances = new List <SunType>(); foreach (SunType st in SunTypes) { for (int i = 0; i < st.Abundance * 100; i++) { Chances.Add(st); } } }