예제 #1
0
        private IEnumerable <DiseaseSymptom> RolledSymptoms()
        {
            var symptomCount = _dice.Roll(3, 5);

            var rolledSymptoms = _dice.RollFromList(DiseaseSymptoms.Symptoms, symptomCount);

            return(rolledSymptoms);
        }
예제 #2
0
        public void RollAndCreateUnityGroupIntoSector(ISector sector)
        {
            if (Globe is null)
            {
                return;
            }

            if (sector.ActorManager.Items.Any())
            {
                return;
            }

            // Interventionists spawns first.
            // If globe has no interventionists then spawn they.
            // Next randomly spawns interventionists or militia.
            var interventionistsCount = Globe.SectorNodes.Select(x => x.Sector)
                                        .Where(x => x != null)
                                        .Select(x => x !)
                                        .SelectMany(x => x.ActorManager.Items)
                                        .Where(x => x.Person.Fraction == Fractions.InterventionistFraction)
                                        .Count();

            if (interventionistsCount <= 0)
            {
                var count = _dice.Roll(2, 5);
                for (var i = 0; i < count; i++)
                {
                    var person    = _personFactory.Create("human-person", Fractions.InterventionistFraction);
                    var nodes     = sector.Map.Nodes.ToArray();
                    var startNode = _dice.RollFromList(nodes);

                    var actor = new Actor(person, _actorTaskSource, startNode);
                    sector.ActorManager.Add(actor);
                }
            }
            else
            {
                var faction = _dice.RollFromList(new[]
                {
                    Fractions.InterventionistFraction,
                    Fractions.MilitiaFraction,
                    Fractions.TroublemakerFraction
                });

                var count = _dice.Roll(2, 5);
                for (var i = 0; i < count; i++)
                {
                    var person    = _personFactory.Create("human-person", faction);
                    var nodes     = sector.Map.Nodes.ToArray();
                    var startNode = _dice.RollFromList(nodes);

                    var actor = new Actor(person, _actorTaskSource, startNode);
                    sector.ActorManager.Add(actor);
                }
            }
        }
예제 #3
0
        public IPerk[] Generate()
        {
            var allBuildInPerks = _schemeService.GetSchemes <IPerkScheme>().Where(x => x.IsBuildIn).ToArray();

            var maxPerkCount = Math.Min(allBuildInPerks.Length, START_TRAIT_MAX_COUNT);
            var minPerkCount = Math.Min(maxPerkCount, START_TRAIT_MIN_COUNT);

            var startPerkCount = _dice.Roll(minPerkCount, maxPerkCount);

            var traitList           = new List <IPerk>();
            var openTraitSchemeList = new List <IPerkScheme>(allBuildInPerks);

            for (var i = 0; i < startPerkCount; i++)
            {
                var rolledTraitScheme = _dice.RollFromList(openTraitSchemeList);
                openTraitSchemeList.Remove(rolledTraitScheme);

                var traitPerk = new Perk
                {
                    Scheme = rolledTraitScheme
                };

                traitList.Add(traitPerk);
            }

            return(traitList.ToArray());
        }
        public IPerk[] Generate()
        {
            //TODO Mark *-immunity traits as test.
            var allBuildInPerks = _schemeService.GetSchemes <IPerkScheme>()
                                  .Where(x => x.IsBuildIn && x.Sid != "thrist-immunity" && x.Sid != "hunger-immunity").ToArray();

            var maxPerkCount = Math.Min(allBuildInPerks.Length, START_TRAIT_MAX_COUNT);
            var minPerkCount = Math.Min(maxPerkCount, START_TRAIT_MIN_COUNT);

            var startPerkCount = _dice.Roll(minPerkCount, maxPerkCount);

            var traitList           = new List <IPerk>();
            var openTraitSchemeList = new List <IPerkScheme>(allBuildInPerks);

            for (var i = 0; i < startPerkCount; i++)
            {
                var rolledTraitScheme = _dice.RollFromList(openTraitSchemeList);
                openTraitSchemeList.Remove(rolledTraitScheme);

                var traitPerk = new Perk(rolledTraitScheme);

                traitList.Add(traitPerk);
            }

            return(traitList.ToArray());
        }
예제 #5
0
        /// <summary>
        /// Выбирает случайное значение из списка.
        /// </summary>
        /// <typeparam name="T"> Тип элементов списка. </typeparam>
        /// <param name="dice"> Кость, на основе которой делать случайный выбор. </param>
        /// <param name="list"> Список элементов, из которого выбирать элемент. </param>
        /// <param name="count">Количество выбранных значений. </param>
        /// <returns> Случайный элемент из списка. </returns>
        public static IEnumerable <T> RollFromList <T>(this IDice dice, IList <T> list, int count)
        {
            if (dice is null)
            {
                throw new ArgumentNullException(nameof(dice));
            }

            if (list is null)
            {
                throw new ArgumentNullException(nameof(list));
            }

            if (list.Count < count)
            {
                throw new ArgumentException("Требуемое количество должно быть не меньше размера списка.", nameof(count));
            }

            var openList = new List <T>(list);

            for (var i = 0; i < count; i++)
            {
                var rolledItem = dice.RollFromList(openList);

                yield return(rolledItem);

                openList.Remove(rolledItem);
            }
        }
예제 #6
0
        private bool TryRollInteriorCoord(OffsetCoords[] openCoords,
                                          IEnumerable <OffsetCoords> passableRegionCoords,
                                          bool checkPass,
                                          out OffsetCoords rolledCoords)
        {
            var supposedRolledCoords = _dice.RollFromList(openCoords);

            if (!checkPass)
            {
                rolledCoords = supposedRolledCoords;
                return(true);
            }

            // Проверяем, что элемент декора не перекрывает проход.
            var isNotBlockPass = CheckMapPassable(passableRegionCoords, supposedRolledCoords);

            if (!isNotBlockPass)
            {
                rolledCoords = supposedRolledCoords;
                return(false);
            }

            rolledCoords = supposedRolledCoords;
            return(true);
        }
        /// <summary>
        /// Случайный выбор координат для размещения элемента интерьера.
        /// </summary>
        /// <param name="regionDraftCoords"> Координаты региона, среди которых можно выбирать позиции элементов интерьера. </param>
        /// <returns> Возвращает набор метаданных об элементах интерьера. </returns>
        public InteriorObjectMeta[] RollInteriorObjects(OffsetCoords[] regionDraftCoords)
        {
            var availableCoords = GetAvailableCoords(regionDraftCoords);
            var openCoords      = new List <OffsetCoords>(availableCoords);

            if (!openCoords.Any())
            {
                return(new InteriorObjectMeta[0]);
            }

            var count = openCoords.Count / 4;

            var rolledCoordsList = new List <InteriorObjectMeta>();

            for (var i = 0; i < count; i++)
            {
                var rolledCoords = _dice.RollFromList(openCoords.ToArray());
                var interior     = new InteriorObjectMeta(rolledCoords);
                rolledCoordsList.Add(interior);

                openCoords.Remove(rolledCoords);

                if (!openCoords.Any())
                {
                    break;
                }
            }

            return(rolledCoordsList.ToArray());
        }
예제 #8
0
        private IGraphNode SelectRandomEnumerableImpl(IEnumerable <IGraphNode> mapNodes)
        {
            var list = mapNodes.ToList();
            var node = _dice.RollFromList(list);

            return(node);
        }
예제 #9
0
        public ILocationScheme Roll()
        {
            var locationSchemeSids = new[]
            {
                "rat-hole",
                "rat-kingdom",
                "demon-dungeon",
                "demon-lair",
                "crypt",
                "elder-place",
                "genomass-cave"
            };

            var rolledLocationSchemeSid = _dice.RollFromList(locationSchemeSids);
            var rolledLocationScheme    = _schemeService.GetScheme <ILocationScheme>(rolledLocationSchemeSid);

            return(rolledLocationScheme);
        }
        public PropContainerPurpose RollPurpose(IResourceDepositData resourceDepositData)
        {
            if (resourceDepositData is null)
            {
                throw new ArgumentNullException(nameof(resourceDepositData));
            }

            var purposeList = new List <PropContainerPurpose>(100);

            foreach (var resourceDepositDataItem in resourceDepositData.Items)
            {
                var count   = (int)Math.Round(resourceDepositDataItem.Share * 100);
                var purpose = GetPurposeByResourceType(resourceDepositDataItem.ResourceType);
                for (var i = 0; i < count; i++)
                {
                    purposeList.Add(purpose);
                }
            }

            if (purposeList.Count < 100)
            {
                var diff = 100 - purposeList.Count;
                var everywherePurpose = new[]
                { PropContainerPurpose.Puddle, PropContainerPurpose.Pit, PropContainerPurpose.TrashHeap };
                var diffShare = (int)Math.Ceiling(diff / 2f);
                foreach (var purpose in everywherePurpose)
                {
                    for (var i = 0; i < diffShare; i++)
                    {
                        purposeList.Add(purpose);
                    }
                }
            }
            else
            {
                purposeList.Add(PropContainerPurpose.TrashHeap);
                purposeList.Add(PropContainerPurpose.Puddle);
                purposeList.Add(PropContainerPurpose.Pit);
            }

            return(_dice.RollFromList(purposeList));
        }
예제 #11
0
        public ILocationScheme Roll()
        {
            var globeNodeMeatSchemeSids   = Enumerable.Range(1, 2).Select(x => "globe-node-meat").ToArray();
            var globeNodeWaterSchemeSids  = Enumerable.Range(1, 2).Select(x => "globe-node-water").ToArray();
            var globeNodeMedkitSchemeSids = Enumerable.Range(1, 2).Select(x => "globe-node-medkit").ToArray();

            var dungeonSchemeSids = new[]
            {
                "dungeon",
                "elder-temple"
            };

            var totalLocationSchemeSids = globeNodeMeatSchemeSids.Concat(globeNodeWaterSchemeSids)
                                          .Concat(globeNodeMedkitSchemeSids).Concat(dungeonSchemeSids).ToArray();

            var rolledLocationSchemeSid = _dice.RollFromList(totalLocationSchemeSids);
            var rolledLocationScheme    = _schemeService.GetScheme <ILocationScheme>(rolledLocationSchemeSid);

            return(rolledLocationScheme);
        }
        public IEnumerable <IPerson> RollInfectedMonsters(IEnumerable <IPerson> monsters, float diseasePower)
        {
            if (!monsters.Any())
            {
                return(Array.Empty <IPerson>());
            }

            var currentMonsterCount = monsters.Count();
            var infectedCount       = (int)Math.Ceiling(currentMonsterCount * diseasePower);

            var openList   = new List <IPerson>(monsters);
            var resultList = new List <IPerson>();

            for (var i = 0; i < infectedCount; i++)
            {
                var rolledMonster = _dice.RollFromList(openList);
                resultList.Add(rolledMonster);
                openList.Remove(rolledMonster);
            }

            return(resultList);
        }
예제 #13
0
        public ILocationScheme Roll()
        {
            var openSchemeSids = Enumerable.Range(1, 20).Select(x => "globe-node").ToArray();

            var dungeonSchemeSids = new[]
            {
                "rat-hole",
                "rat-kingdom",
                "demon-dungeon",
                "demon-lair",
                "crypt",
                "elder-place",
                "genomass-cave"
            };

            var totalLocationSchemeSids = openSchemeSids.Concat(dungeonSchemeSids).ToArray();

            var rolledLocationSchemeSid = _dice.RollFromList(totalLocationSchemeSids);
            var rolledLocationScheme    = _schemeService.GetScheme <ILocationScheme>(rolledLocationSchemeSid);

            return(rolledLocationScheme);
        }
예제 #14
0
        public IDisease Create()
        {
            var roll = _dice.RollD6();

            if (roll <= 1)
            {
                var nameGenerationAttempt = 0;
                do
                {
                    var primaryName = _dice.RollFromList(DiseaseNames.Primary);

                    ILocalizedString prefix = null;

                    var rollPrefix = _dice.RollD6();
                    if (rollPrefix >= 4)
                    {
                        prefix = _dice.RollFromList(DiseaseNames.PrimaryPreffix);
                    }

                    ILocalizedString secondary = null;
                    var rollSecondary          = _dice.RollD6();
                    if (rollSecondary >= 4)
                    {
                        secondary = _dice.RollFromList(DiseaseNames.Secondary);
                    }

                    ILocalizedString subject = null;
                    var rollSubject          = _dice.RollD6();
                    if (rollSubject >= 6)
                    {
                        subject = _dice.RollFromList(DiseaseNames.Subject);
                    }

                    var diseaseName = new DiseaseName(primaryName, prefix, secondary, subject);

                    // Проверяем, была ли уже такая болезнь.

                    var isDuplicate = CheckDuplicates(diseaseName);
                    if (isDuplicate)
                    {
                        nameGenerationAttempt++;
                        continue;
                    }

                    var rolledSymptoms = RolledSymptoms();

                    var progressSpeed = RollDiseaseProgressSpeed();

                    var disease = new Disease(diseaseName, rolledSymptoms, progressSpeed);

                    _usedDiseases.Add(diseaseName);

                    return(disease);
                } while (nameGenerationAttempt < 10);

                // Не удалось сгенерировать уникальное имя. Значит вообще не генерируем болезнь.
                return(null);
            }
            else
            {
                return(null);
            }
        }