private IEnumerable <DiseaseSymptom> RolledSymptoms() { var symptomCount = _dice.Roll(3, 5); var rolledSymptoms = _dice.RollFromList(DiseaseSymptoms.Symptoms, symptomCount); return(rolledSymptoms); }
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); } } }
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()); }
/// <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); } }
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()); }
private IGraphNode SelectRandomEnumerableImpl(IEnumerable <IGraphNode> mapNodes) { var list = mapNodes.ToList(); var node = _dice.RollFromList(list); return(node); }
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)); }
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); }
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); }
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); } }