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());
        }
Esempio n. 2
0
        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>()),
                }));
            }
        }
Esempio n. 4
0
        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)));
            }
        }