예제 #1
0
        /// <summary>
        /// Генерирует колекцию <see cref="Star"/> системы
        /// </summary>
        /// <param name="name">
        /// Имя звездной системы, в которой находятся генерируемые звезды
        /// </param>
        /// <returns>
        /// <see cref="List{T}"/>, содержащий <see cref="Star"/>
        /// </returns>
        private static List <Star> GenerateSystemStars(string name)
        {
            List <Star> stars            = new List <Star>();
            int         starsCount       = 0;
            int         probabilityIndex = HelperRandomFunctions.GetRandomInt(1, maxPercents + 1);

            if (probabilityIndex < 70)
            {
                starsCount = 1;
            }
            else if (probabilityIndex < 100)
            {
                starsCount = 2;
            }
            else
            {
                starsCount = 3;
            }

            for (int index = 0; index < starsCount; index++)
            {
                stars.Add(StarFactory.GenerateStar($"{name} Star #{index + 1}"));
            }

            return(stars);
        }
예제 #2
0
        public Resources GenerateResources()
        {
            double hydrogen     = HelperRandomFunctions.GetRandomDouble() * 1E22;
            double commonMetals = HelperRandomFunctions.GetRandomDouble() * 1E24;
            double rareElements = HelperRandomFunctions.GetRandomDouble() * 1E20;

            return(new Resources(hydrogen, commonMetals, rareElements));
        }
예제 #3
0
        /// <summary>
        /// Генерирует газовые планеты системы
        /// </summary>
        /// <param name="systemName">
        /// Имя звездной системы, в которой находятся генерируемые планеты
        /// </param>
        /// <param name="planetCount">
        /// Счетчик планет системы
        /// </param>
        private static List <Planet> GetGasGiantPlanets(string systemName, ref int planetCount)
        {
            int           gasGiantCount = HelperRandomFunctions.GetRandomInt(minGasGiantCount, maxGasGiantCount + 1);
            List <Planet> planets       = new List <Planet>();

            for (int index = 0; index < gasGiantCount; index++)
            {
                planets.Add(PlanetFactory.GetPlanet(GetPlanetName(systemName, planetCount),
                                                    new PlanetType(TemperatureClass.Cold, VolatilesClass.Airless, SubstancesClass.Jupiter)));
                planetCount++;
            }

            return(planets);
        }
예제 #4
0
파일: Discovery.cs 프로젝트: vind113/4X
        public static IList <StarSystem> TryToFindNewStarSystems(int discoveredSystemsCount)
        {
            if (discoveredSystemsCount <= 0 || discoveredSystemsCount > 1_000_000)
            {
                throw new ArgumentOutOfRangeException("discoveredSystems count must be greater than zero");
            }

            IList <StarSystem> generatedSystems = new List <StarSystem>();

            if (HelperRandomFunctions.ProbableBool(DiscoveryProbability))
            {
                generatedSystems = DiscoverNewStarSystem(discoveredSystemsCount);
            }

            return(generatedSystems);
        }
예제 #5
0
파일: StarFactory.cs 프로젝트: vind113/4X
        /// <summary>
        ///     Сгенерировать звезду с заданым именем
        /// </summary>
        /// <param name="name">
        ///     Имя звезды
        /// </param>
        /// <returns>
        ///     Возвращает экземпляр класса <see cref="Star"/>
        /// </returns>
        public static Star GenerateStar(string name)
        {
            int             radius = 0;
            LuminosityClass luminosityClass;

            double starFraction = HelperRandomFunctions.GetRandomDouble();

            if (starFraction < 0.0003)
            {
                radius          = HelperRandomFunctions.GetRandomInt(4_620_000, 10_000_000);
                luminosityClass = LuminosityClass.O;
            }
            else if (starFraction < 0.0013)
            {
                radius          = HelperRandomFunctions.GetRandomInt(1_260_000, 4_620_000);
                luminosityClass = LuminosityClass.B;
            }
            else if (starFraction < 0.006)
            {
                radius          = HelperRandomFunctions.GetRandomInt(805_000, 1_260_000);
                luminosityClass = LuminosityClass.A;
            }
            else if (starFraction < 0.03)
            {
                radius          = HelperRandomFunctions.GetRandomInt(728_000, 805_000);
                luminosityClass = LuminosityClass.F;
            }
            //реальное соотношение 0.076
            else if (starFraction < 0.3)
            {
                radius          = HelperRandomFunctions.GetRandomInt(672_000, 728_000);
                luminosityClass = LuminosityClass.G;
            }
            //реальное соотношение 0.12
            else if (starFraction < 0.4)
            {
                radius          = HelperRandomFunctions.GetRandomInt(490_000, 672_000);
                luminosityClass = LuminosityClass.K;
            }
            else
            {
                radius          = HelperRandomFunctions.GetRandomInt(360_000, 490_000);
                luminosityClass = LuminosityClass.M;
            }

            return(new Star(name, radius, luminosityClass));
        }
예제 #6
0
파일: Discovery.cs 프로젝트: vind113/4X
        private static IList <StarSystem> DiscoverNewStarSystem(int discoveredSystemsCount)
        {
            IList <StarSystem> generatedSystems = new List <StarSystem>();

            int maxSystemsToGenerate = (int)(Math.Sqrt(discoveredSystemsCount));
            int systemsToGenerate    = HelperRandomFunctions.GetRandomInt(1, maxSystemsToGenerate + 1);

            for (int index = 0; index < systemsToGenerate; index++)
            {
                StarSystem generatedSystem =
                    StarSystemFactory.GetStarSystem($"System {discoveredSystemsCount + 1} #{index}");

                generatedSystems.Add(generatedSystem);
            }

            return(generatedSystems);
        }
예제 #7
0
        /// <summary>
        /// Генерирует безжизненные планеты системы
        /// </summary>
        /// <param name="nameTemplate">
        /// Имя звездной системы, в которой находятся генерируемые планеты
        /// </param>
        /// <param name="planetCount">
        /// Счетчик планет системы
        /// </param>
        /// <param name="stars">
        /// Коллекция <see cref="Star"/> системы
        /// </param>
        private static List <Planet> GetBarrenPlanets(string systemName, ref int planetCount, List <Star> stars)
        {
            int barrenCount = HelperRandomFunctions.GetRandomInt(minBarrenCount, maxBarrenCount + 1);

            LuminosityClass systemStarClass = stars[0].LumClass;
            List <Planet>   planets         = new List <Planet>();

            TemperatureClass planetTemperature;

            if (systemStarClass == LuminosityClass.M ||
                systemStarClass == LuminosityClass.K)
            {
                planetTemperature = TemperatureClass.Warm;
            }
            else
            {
                planetTemperature = TemperatureClass.Hot;
            }

            if (HelperRandomFunctions.PercentProbableBool(20) && barrenCount >= 1)
            {
                planets.Add(PlanetFactory.GetPlanet(GetPlanetName(systemName, planetCount),
                                                    new PlanetType(planetTemperature, VolatilesClass.Airless, SubstancesClass.Ferria)));

                planetCount++;
                barrenCount--;

                if (HelperRandomFunctions.PercentProbableBool(20) && barrenCount >= 1)
                {
                    planets.Add(PlanetFactory.GetPlanet(GetPlanetName(systemName, planetCount),
                                                        new PlanetType(planetTemperature, VolatilesClass.Airless, SubstancesClass.Ferria)));

                    planetCount++;
                    barrenCount--;
                }
            }

            for (int index = 0; index < barrenCount; index++)
            {
                planets.Add(PlanetFactory.GetPlanet(GetPlanetName(systemName, planetCount),
                                                    new PlanetType(planetTemperature, VolatilesClass.Airless, SubstancesClass.Terra)));
                planetCount++;
            }

            return(planets);
        }
예제 #8
0
파일: PlanetFactory.cs 프로젝트: vind113/4X
        private static double GasGiantRadiusGeneration()
        {
            double radius;

            if (HelperRandomFunctions.PercentProbableBool(10))
            {
                radius = (double)HelperRandomFunctions.GetRandomInt(bigGasPlanetMinRadius, bigGasPlanetMaxRadius);
            }
            else if (HelperRandomFunctions.PercentProbableBool(20))
            {
                radius = (double)HelperRandomFunctions.GetRandomInt(mediumGasPlanetMinRadius, bigGasPlanetMinRadius);
            }
            else
            {
                radius = (double)HelperRandomFunctions.GetRandomInt(smallGasPlanetMinRadius, mediumGasPlanetMinRadius);
            }
            return(radius);
        }
예제 #9
0
파일: PlanetFactory.cs 프로젝트: vind113/4X
        private static double RockyPlanetRadiusGeneration()
        {
            double radius;

            if (HelperRandomFunctions.PercentProbableBool(8))
            {
                radius = (double)HelperRandomFunctions.GetRandomInt(bigPlanetMinRadius, bigPlanetMaxRadius);
            }
            else if (HelperRandomFunctions.PercentProbableBool(15))
            {
                radius = (double)HelperRandomFunctions.GetRandomInt(mediumPlanetMinRadius, bigPlanetMinRadius);
            }
            else
            {
                radius = (double)HelperRandomFunctions.GetRandomInt(smallPlanetMinRadius, mediumPlanetMinRadius);
            }

            return(radius);
        }
예제 #10
0
        /// <summary>
        /// Генерирует обитаемые планеты системы
        /// </summary>
        /// <param name="systemName">
        /// Имя звездной системы, в которой находятся генерируемые планеты
        /// </param>
        /// <param name="planetCount">
        /// Счетчик планет системы
        /// </param>
        /// <param name="stars">
        /// Коллекция <see cref="Star"/> системы
        /// </param>
        private static List <Planet> GetHabitablePlanets(string systemName, ref int planetCount, List <Star> stars)
        {
            LuminosityClass systemStarClass = stars[0].LumClass;
            List <Planet>   planets         = new List <Planet>();

            if (systemStarClass == LuminosityClass.G ||
                systemStarClass == LuminosityClass.K ||
                systemStarClass == LuminosityClass.F)
            {
                int habitablePlanetCount = HelperRandomFunctions.GetRandomInt(minHabitableCount, maxHabitableCount + 1);
                for (int index = 0; index < habitablePlanetCount; index++)
                {
                    planets.Add(GetHabitablePlanet(GetPlanetName(systemName, planetCount), planetCount, systemStarClass));
                    planetCount++;
                }
            }

            return(planets);
        }
예제 #11
0
        /// <summary>
        /// Генерирует одну обитаемую планету
        /// </summary>
        /// <param name="systemName">
        /// Имя звездной системы, в которой находятся генерируемые планеты
        /// </param>
        private static HabitablePlanet GetHabitablePlanet(string planetName, int planetCount, LuminosityClass mainStarClass)
        {
            int probabilityIndex = HelperRandomFunctions.GetRandomInt(1, maxPercents + 1);

            PlanetType planetType;

            if (probabilityIndex >= 80)
            {
                planetType = new PlanetType(TemperatureClass.Temperate, VolatilesClass.Marine, SubstancesClass.Terra);
            }
            else if (probabilityIndex >= 60)
            {
                planetType = new PlanetType(TemperatureClass.Cool, VolatilesClass.Marine, SubstancesClass.Terra);
            }
            else
            {
                planetType = new PlanetType(TemperatureClass.Cool, VolatilesClass.Desertic, SubstancesClass.Terra);
            }

            return(PlanetFactory.GetHabitablePlanet(planetName, planetType));
        }
예제 #12
0
 private static double GetRandomResourceMultiplier()
 {
     return(HelperRandomFunctions.GetRandomDouble() * 2);
 }