public IEnumerable <WormholeEndpoints> Generate(Random rng, StarPositions starPositions) { var maxGraph = new Graph <Vector2D>(); var starIndex = new Dictionary <Vertex <Vector2D>, int>(); var homeNodes = new List <Vertex <Vector2D> >(); Vertex <Vector2D> stareaterMain = null; for (int i = 0; i < starPositions.Stars.Length; i++) { var vertex = maxGraph.MakeVertex(new Vector2D(starPositions.Stars[i].X, starPositions.Stars[i].Y)); starIndex[vertex] = i; if (starPositions.HomeSystems.Contains(i)) { homeNodes.Add(vertex); } if (i == starPositions.StareaterMain) { stareaterMain = vertex; } } foreach (var edge in genMaxEdges(maxGraph.Vertices.ToList())) { maxGraph.AddEdge(edge); } this.removeOutliers(maxGraph); var treeEdges = new HashSet <Edge <Vector2D> >(genMinEdges(maxGraph, homeNodes, stareaterMain)); return(genFinal(maxGraph, treeEdges).Select(e => new WormholeEndpoints(starIndex[e.FirstEnd], starIndex[e.SecondEnd])).ToList()); }
private void getPositions() { List <Position> positions = Ephemeris.Geocentric[During.ReferenceTime]; StarPositions.Clear(); foreach (PlanetId id in Planet.All.Keys) { foreach (Position pos in positions) { if (pos.Owner.Id != id) { continue; } StarPositions.Add(id, pos); break; } if (!StarPositions.ContainsKey(id)) { StarPositions.Add(id, Ephemeris.Geocentric[During.ReferenceTime, id]); } } }
public IEnumerable <StarSystem> Generate(Random rng, StarPositions starPositions, IEnumerable <BodyTraitType> planetTraits) { int colorI = 0; var namer = new StarNamer(starPositions.Stars.Length); //UNDONE(later): Picks star types cyclicaly //TODO(later): Randomize star type distribution //TODO(later): Star size and radiation distribution foreach (var position in starPositions.Stars) { var star = new StarData(starTypes[colorI++ % starTypes.Length].Hue, 1, namer.NextName(), position, new List <BodyTraitType>()); yield return(new StarSystem( star, new Planet[] { new Planet(star, 1, PlanetType.Rock, 100, planetTraits.Take(1).ToList()), new Planet(star, 2, PlanetType.Asteriod, 100, new List <BodyTraitType>()), new Planet(star, 3, PlanetType.GasGiant, 100, new List <BodyTraitType>()), })); } }
public IEnumerable <StarSystemBuilder> Generate(Random rng, SystemEvaluator evaluator, StarPositions starPositions) { var namer = new StarNamer(starPositions.Stars.Count, new Random()); var uninhabitedStars = starPositions.Stars.Where((x, i) => !starPositions.HomeSystems.Contains(i)); var homeStars = new HashSet <Vector2D>(starPositions.HomeSystems.Select(i => starPositions.Stars[i])); var potentials = new Dictionary <Vector2D, double>(); var starts = new Dictionary <Vector2D, double>(); var climate = this.climateLevels[this.climateParameter.Value]; var potential = this.potentialLevels[this.potentialParameter.Value]; foreach (var home in homeStars) { potentials[home] = potential.HomesystemPotentialScore; starts[home] = Math.Min(climate.HomesystemStartScore, potentials[home]); } var undistributed = new HashSet <Vector2D>(uninhabitedStars); var weightSum = potential.Ranges.Sum(x => x.Weight); foreach (var range in potential.Ranges) { var count = (int)Math.Round(range.Weight * undistributed.Count() / weightSum); foreach (var star in spreadPoints(rng, undistributed, count)) { potentials[star] = Methods.Lerp(rng.NextDouble(), range.Min, range.Max); undistributed.Remove(star); } weightSum -= range.Weight; } undistributed = new HashSet <Vector2D>(uninhabitedStars); weightSum = climate.Ranges.Sum(x => x.Weight); foreach (var range in climate.Ranges) { var undistributedCandidates = new HashSet <Vector2D>(undistributed.Where(x => potentials[x] >= range.Min)); var count = Math.Min( (int)Math.Round(range.Weight * undistributed.Count / weightSum), undistributedCandidates.Count ); foreach (var star in spreadPoints(rng, undistributedCandidates, count)) { starts[star] = Methods.Lerp(rng.NextDouble(), range.Min, range.Max); undistributed.Remove(star); } weightSum -= range.Weight; } //TODO(v0.8): Star size and trait distribution foreach (var position in starPositions.Stars) { yield return(generateSystem(namer, position, rng, evaluator, starts[position], potentials[position], homeStars.Contains(position))); } }