private IActor CreateMonster(MonsterPerson person, IMapNode startNode, IBotPlayer botPlayer) { var actor = new Actor(person, botPlayer, startNode); _actorManager.Add(actor); return(actor); }
public void CreateMonsters(ISector sector, IBotPlayer monsterPlayer, IEnumerable <MapRegion> monsterRegions, IEnumerable <MonsterPerson> monsterPersons) { if (sector == null) { throw new ArgumentNullException(nameof(sector)); } if (monsterPlayer == null) { throw new ArgumentNullException(nameof(monsterPlayer)); } if (monsterRegions == null) { throw new ArgumentNullException(nameof(monsterRegions)); } if (monsterPersons == null) { throw new ArgumentNullException(nameof(monsterPersons)); } var freeNodes = new List <IMapNode>(monsterRegions.SelectMany(x => x.Nodes)); foreach (var monsterPerson in monsterPersons) { var rollIndex = _generatorRandomSource.RollNodeIndex(freeNodes.Count); var monsterNode = freeNodes[rollIndex]; var monster = CreateMonster(monsterPerson, monsterNode, monsterPlayer); freeNodes.Remove(monster.Node); } }
private static SectorGenerator CreateGenerator(ISchemeService schemeService, IBotPlayer botPlayer, IMapFactory mapFactory) { var dropResolverMock = new Mock <IDropResolver>(); var dropResolver = dropResolverMock.Object; var actorManagerMock = new Mock <IActorManager>(); var actorManager = actorManagerMock.Object; var propContainerManagerMock = new Mock <IPropContainerManager>(); var propContainerManager = propContainerManagerMock.Object; var tradeManagerMock = new Mock <ITraderManager>(); var tradeManager = tradeManagerMock.Object; var chestGeneratorMock = new Mock <IChestGenerator>(); var chestGenerator = chestGeneratorMock.Object; var monsterGeneratorMock = new Mock <IMonsterGenerator>(); var monsterGenerator = monsterGeneratorMock.Object; var sectorFactoryMock = new Mock <ISectorFactory>(); var sectorFactory = sectorFactoryMock.Object; return(new SectorGenerator(mapFactory, sectorFactory, monsterGenerator, chestGenerator, botPlayer, schemeService, tradeManager, dropResolver)); }
public MonsterActorTaskSource(IBotPlayer player, IDecisionSource decisionSource, ITacticalActUsageService actService, ISectorManager sectorManager, IActorManager actorManager) : this((IPlayer)player, decisionSource, actService, sectorManager, actorManager) { }
private void CreateMonstersForRegion(ISector sector, IBotPlayer monsterPlayer, ISectorSubScheme sectorScheme, List <IActor> resultMonsterActors, MapRegion region, int[] rarityCounter) { var regionNodes = region.Nodes.OfType <HexNode>(); var staticObjectsNodes = sector.StaticObjectManager.Items.Select(x => x.Node); var availableMonsterNodes = regionNodes.Except(staticObjectsNodes); var freeNodes = new List <IGraphNode>(availableMonsterNodes); var monsterCount = _generatorRandomSource.RollRegionCount( sectorScheme.MinRegionMonsterCount, sectorScheme.RegionMonsterCount); for (var i = 0; i < monsterCount; i++) { // если в комнате все места заняты if (!freeNodes.Any()) { break; } var rollIndex = _generatorRandomSource.RollNodeIndex(freeNodes.Count); var monsterNode = freeNodes[rollIndex]; var monster = RollRarityAndCreateMonster(sector, monsterPlayer, sectorScheme, monsterNode, rarityCounter); freeNodes.Remove(monster.Node); resultMonsterActors.Add(monster); } }
private static ISectorGenerator CreateGenerator(IBotPlayer botPlayer, IMapFactory mapFactory) { var chestGeneratorMock = new Mock <IChestGenerator>(); var chestGenerator = chestGeneratorMock.Object; var monsterGeneratorMock = new Mock <IMonsterGenerator>(); var monsterGenerator = monsterGeneratorMock.Object; var sectorFactoryMock = new Mock <ISectorFactory>(); var sectorFactory = sectorFactoryMock.Object; var citizenGeneratorMock = new Mock <ICitizenGenerator>(); var citizenGenerator = citizenGeneratorMock.Object; var mapFactorySelectorMock = new Mock <IMapFactorySelector>(); mapFactorySelectorMock.Setup(x => x.GetMapFactory(It.IsAny <ISectorSubScheme>())) .Returns(mapFactory); var mapFactorySelector = mapFactorySelectorMock.Object; return(new SectorGenerator(mapFactorySelector, sectorFactory, monsterGenerator, chestGenerator, citizenGenerator, botPlayer)); }
private IActor CreateCitizen(Dialog dialog, IMapNode startNode, IBotPlayer botPlayer) { var person = new CitizenPerson(dialog); var actor = new Actor(person, botPlayer, startNode); _actorManager.Add(actor); return(actor); }
public void CreateCitizens(ISector sector, IBotPlayer botPlayer, IEnumerable <MapRegion> citizenRegions) { var map = sector.Map; foreach (var region in citizenRegions) { // 1 к 9, потому что это наиболее удобное соотношение // для размещения неподвижных блокирующих объектов // без преграждения выходов. var citizenCount = region.Nodes.Count() / 9f; var availableNodes = from node in region.Nodes where !map.Transitions.Keys.Contains(node) select node; var openNodes = new List <IMapNode>(availableNodes); for (var i = 0; i < citizenCount; i++) { //TODO Объединить этот блок с генератором сундуков, как дубликат // Выбрать из коллекции доступных узлов var rollIndex = _citizenGeneratorRandomSource.RollNodeIndex(openNodes.Count); var objectNode = MapRegionHelper.FindNonBlockedNode(openNodes[rollIndex], map, openNodes); if (objectNode == null) { // В этом случае будет сгенерировано на одного жителя меньше. // Узел, с которого не удаётся найти подходящий узел, удаляем, // Чтобы больше его не анализировать, т.к. всё равно будет такой же неудачный исход. openNodes.Remove(openNodes[rollIndex]); continue; } openNodes.Remove(objectNode); var traderDropTable = _schemeService.GetScheme <IDropTableScheme>("trader"); var rollCitizenType = _citizenGeneratorRandomSource.RollCitizenType(); switch (rollCitizenType) { case CitizenType.Unintresting: CreateCitizen(objectNode, botPlayer); break; case CitizenType.Trader: CreateCitizen(traderDropTable, objectNode, botPlayer); break; case CitizenType.QuestGiver: CreateCitizen(DialogFactory.Create(), objectNode, botPlayer); break; default: //TODO Завести тип исключения на генерацию персонажей мирных жителей. throw new System.Exception(); } } } }
private IActor CreateMonsterActor([NotNull] IBotPlayer player, [NotNull] IMonsterScheme monsterScheme, [NotNull] IMapNode startNode) { var monsterPerson = new MonsterPerson(monsterScheme); var actor = new Actor(monsterPerson, player, startNode); return(actor); }
/// <summary>Создаёт монстров в секторе по указанной схеме.</summary> /// <param name="sector">Целевой сектор.</param> /// <param name="monsterPlayer">Бот, управляющий монстрами. По сути, команда монстров.</param> /// <param name="monsterRegions">Регионы сектора, где могут быть монстры.</param> /// <param name="sectorScheme">Схема сектора. Отсюда берутся параметры генерации монстров.</param> public void CreateMonsters(ISector sector, IBotPlayer monsterPlayer, IEnumerable <MapRegion> monsterRegions, ISectorSubScheme sectorScheme) { var rarityCounter = new int[3]; var rarityMaxCounter = new[] { -1, 10, 1 }; foreach (var region in monsterRegions) { var freeNodes = new List <IMapNode>(region.Nodes); var monsterCount = _generatorRandomSource.RollRegionCount(sectorScheme.RegionMonsterCount); for (int i = 0; i < monsterCount; i++) { // если в комнате все места заняты if (!freeNodes.Any()) { break; } var currentRarity = GetMonsterRarity(rarityCounter, rarityMaxCounter); var availableSchemeSids = GetAvailableSchemeSids(sectorScheme, currentRarity); var availableMonsterSchemes = availableSchemeSids.Select(x => _schemeService.GetScheme <IMonsterScheme>(x)); var monsterScheme = _generatorRandomSource.RollMonsterScheme(availableMonsterSchemes); // первый монстр ходит по маршруту // остальные бродят произвольно if (i == 0) { // генерируем маршрут обхода var startPatrolNode = region.Nodes.First(); var endPatrolNode = region.Nodes.Last(); // генерируем моснтра var patrolRoute = new PatrolRoute(startPatrolNode, endPatrolNode); var monster = CreateMonster(monsterScheme, startPatrolNode, monsterPlayer); sector.PatrolRoutes[monster] = patrolRoute; freeNodes.Remove(monster.Node); } else { var rollIndex = _generatorRandomSource.RollNodeIndex(freeNodes.Count); var monsterNode = freeNodes[rollIndex]; var monster = CreateMonster(monsterScheme, monsterNode, monsterPlayer); freeNodes.Remove(monster.Node); } } } }
private IActor CreateMonsterActor([NotNull] IBotPlayer player, [NotNull] MonsterScheme monsterScheme, [NotNull] IMapNode startNode) { var schemeService = Container.GetInstance <ISchemeService>(); var monsterPerson = new MonsterPerson(monsterScheme); var actor = new Actor(monsterPerson, player, startNode); return(actor); }
public MonsterActorTaskSource(IBotPlayer player, IDecisionSource decisionSource, ITacticalActUsageService actService, ISector sector, IActorManager actorManager) { _logicDict = new Dictionary <IActor, IBotLogic>(); _player = player; _decisionSource = decisionSource; _actService = actService; _sector = sector; _actorManager = actorManager; }
private IActor RollRarityAndCreateMonster(ISector sector, IBotPlayer monsterPlayer, ISectorSubScheme sectorScheme, IGraphNode monsterNode, int[] rarityCounter) { var rarityMaxCounter = new[] { -1, 10, 1 }; var currentRarity = GetMonsterRarity(rarityCounter, rarityMaxCounter); var availableSchemeSids = GetAvailableSchemeSids(sectorScheme, currentRarity); var availableMonsterSchemes = availableSchemeSids.Select(x => _schemeService.GetScheme <IMonsterScheme>(x)); var monsterScheme = _generatorRandomSource.RollMonsterScheme(availableMonsterSchemes); var monster = CreateMonster(sector.ActorManager, monsterScheme, monsterNode, monsterPlayer); return(monster); }
/// <summary> /// Создаёт экземпляр <see cref="SectorGenerator"/>. /// </summary> /// <param name="mapFactorySelector"> Сервис для выбора фабрики для создания карты. </param> /// <param name="sectorFactory"> Фабрика сектора. </param> /// <param name="monsterGenerator"> Генератор монстров для подземелий. </param> /// <param name="chestGenerator"> Генератор сундуков для подземеоий </param> /// <param name="citizenGenerator"> Генератор жителей в городском квартале. </param> /// <param name="botPlayer"> Игрок, управляющий монстрами, мирными жителями. </param> public SectorGenerator( IMapFactorySelector mapFactorySelector, ISectorFactory sectorFactory, IMonsterGenerator monsterGenerator, IChestGenerator chestGenerator, ICitizenGenerator citizenGenerator , IBotPlayer botPlayer) { _mapFactorySelector = mapFactorySelector; _sectorFactory = sectorFactory; _monsterGenerator = monsterGenerator; _chestGenerator = chestGenerator; _botPlayer = botPlayer; _citizenGenerator = citizenGenerator; }
public SectorProceduralGenerator(IActorManager actorManager, IPropContainerManager propContainerManager, ISectorGeneratorRandomSource randomSource, IBotPlayer botPlayer, ISchemeService schemeService, IDropResolver dropResolver) { _actorManager = actorManager; _propContainerManager = propContainerManager; _randomSource = randomSource; _botPlayer = botPlayer; _schemeService = schemeService; _dropResolver = dropResolver; Log = new StringBuilder(); }
/// <summary> /// Создаёт экземпляр <see cref="SectorGenerator"/>. /// </summary> /// <param name="mapFactorySelector"> Сервис для выбора фабрики для создания карты. </param> /// <param name="sectorFactory"> Фабрика сектора. </param> /// <param name="monsterGenerator"> Генератор монстров для подземелий. </param> /// <param name="chestGenerator"> Генератор сундуков для подземеоий </param> /// <param name="botPlayer"> Игрок, управляющий монстрами, мирными жителями. </param> public SectorGenerator( IMapFactorySelector mapFactorySelector, ISectorFactory sectorFactory, IMonsterGenerator monsterGenerator, IStaticObstaclesGenerator staticObstaclesGenerator, IDiseaseGenerator diseaseGenerator, IBotPlayer botPlayer, IResourceMaterializationMap resourceMaterializationMap) { _mapFactorySelector = mapFactorySelector ?? throw new ArgumentNullException(nameof(mapFactorySelector)); _sectorFactory = sectorFactory ?? throw new ArgumentNullException(nameof(sectorFactory)); _monsterGenerator = monsterGenerator ?? throw new ArgumentNullException(nameof(monsterGenerator)); _staticObstaclesGenerator = staticObstaclesGenerator ?? throw new ArgumentNullException(nameof(staticObstaclesGenerator)); _diseaseGenerator = diseaseGenerator ?? throw new ArgumentNullException(nameof(diseaseGenerator)); _botPlayer = botPlayer ?? throw new ArgumentNullException(nameof(botPlayer)); _resourceMaterializationMap = resourceMaterializationMap ?? throw new ArgumentNullException(nameof(resourceMaterializationMap)); }
/// <summary> /// Создаёт экземпляр <see cref="SectorGenerator"/>. /// </summary> /// <param name="mapFactory"> Фабрика карты. Сейчас используется <see cref="RoomStyle.RoomMapFactory"/>. </param> /// <param name="sectorFactory"> Фабрика сектора. </param> /// <param name="monsterGenerator"> Генератор монстров для подземелий. </param> /// <param name="chestGenerator"> Генератор сундуков для подземеоий </param> /// <param name="monsterPlayer"> Игрок, управляющий монстрами. </param> /// <param name="schemeService"> Сервис схем. </param> /// <param name="traderManager"> Менеджер торговцев. Нужен для сектора. </param> /// <param name="dropResolver"> Служба работы с таблицами дропа. Нужна для создания торговцев. </param> public SectorGenerator( IMapFactory mapFactory, ISectorFactory sectorFactory, IMonsterGenerator monsterGenerator, IChestGenerator chestGenerator, IBotPlayer monsterPlayer, ISchemeService schemeService, ITraderManager traderManager,//TODO Вынести в отдельный генератор IDropResolver dropResolver ) { _mapFactory = mapFactory; _sectorFactory = sectorFactory; _monsterGenerator = monsterGenerator; _chestGenerator = chestGenerator; _monsterPlayer = monsterPlayer; _schemeService = schemeService; _traderManager = traderManager; _dropResolver = dropResolver; }
private static ISectorGenerator CreateGenerator(IBotPlayer botPlayer, IMapFactory mapFactory) { var staticObstaclesGeneratorMock = new Mock <IStaticObstaclesGenerator>(); var staticObstaclesGenerator = staticObstaclesGeneratorMock.Object; var monsterGeneratorMock = new Mock <IMonsterGenerator>(); var monsterGenerator = monsterGeneratorMock.Object; var sectorFactoryMock = new Mock <ISectorFactory>(); var sectorFactory = sectorFactoryMock.Object; var mapFactorySelectorMock = new Mock <IMapFactorySelector>(); mapFactorySelectorMock.Setup(x => x.GetMapFactory(It.IsAny <ISectorNode>())) .Returns(mapFactory); var mapFactorySelector = mapFactorySelectorMock.Object; var diseaseGeneratorMock = new Mock <IDiseaseGenerator>(); var diseaseGenerator = diseaseGeneratorMock.Object; var sectorMock = new Mock <ISector>(); var sector = sectorMock.Object; sectorFactoryMock.Setup(x => x.Create(It.IsAny <ISectorMap>(), It.IsAny <ILocationScheme>())) .Returns(sector); var resourceMaterializationMapMock = new Mock <IResourceMaterializationMap>(); resourceMaterializationMapMock.Setup(x => x.GetDepositData(It.IsAny <ISectorNode>())) .Returns(new Mock <IResourceDepositData>().Object); var sectorMaterializationService = resourceMaterializationMapMock.Object; return(new SectorGenerator(mapFactorySelector, sectorFactory, monsterGenerator, staticObstaclesGenerator, diseaseGenerator, botPlayer, sectorMaterializationService)); }
private static SectorProceduralGenerator CreateGenerator(ISectorGeneratorRandomSource randomSource, ISchemeService schemeService, IBotPlayer botPlayer) { var dropResolverMock = new Mock <IDropResolver>(); var dropResolver = dropResolverMock.Object; var actorManagerMock = new Mock <IActorManager>(); var actorManager = actorManagerMock.Object; var propContainerManagerMock = new Mock <IPropContainerManager>(); var propContainerManager = propContainerManagerMock.Object; return(new SectorProceduralGenerator( actorManager, propContainerManager, randomSource, botPlayer, schemeService, dropResolver)); }
/// <summary>Создаёт монстров в секторе по указанной схеме.</summary> /// <param name="sector">Целевой сектор.</param> /// <param name="monsterPlayer">Бот, управляющий монстрами. По сути, команда монстров.</param> /// <param name="monsterRegions">Регионы сектора, где могут быть монстры.</param> /// <param name="sectorScheme">Схема сектора. Отсюда берутся параметры генерации монстров.</param> public void CreateMonsters(ISector sector, IBotPlayer monsterPlayer, IEnumerable <MapRegion> monsterRegions, ISectorSubScheme sectorScheme) { if (sector is null) { throw new ArgumentNullException(nameof(sector)); } if (monsterPlayer is null) { throw new ArgumentNullException(nameof(monsterPlayer)); } if (monsterRegions is null) { throw new ArgumentNullException(nameof(monsterRegions)); } if (sectorScheme is null) { throw new ArgumentNullException(nameof(sectorScheme)); } var resultMonsterActors = new List <IActor>(); var rarityCounter = new int[3]; foreach (var region in monsterRegions) { CreateMonstersForRegion(sector, monsterPlayer, sectorScheme, resultMonsterActors, region, rarityCounter); } // Инфицируем монстров, если в секторе есть болезни. RollInfections(sector, resultMonsterActors); }
public MonsterBotActorTaskSource(IBotPlayer player) : base(player) { }
private IActor CreateCitizen(IDropTableScheme traderDropTable, IMapNode startNode, IBotPlayer botPlayer) { var person = new CitizenPerson(traderDropTable, _dropResolver); var actor = new Actor(person, botPlayer, startNode); _actorManager.Add(actor); return(actor); }
/// <summary>Создаёт монстров в секторе по указанной схеме.</summary> /// <param name="sector">Целевой сектор.</param> /// <param name="monsterPlayer">Бот, управляющий монстрами. По сути, команда монстров.</param> /// <param name="monsterRegions">Регионы сектора, где могут быть монстры.</param> /// <param name="sectorScheme">Схема сектора. Отсюда берутся параметры генерации монстров.</param> public void CreateMonsters(ISector sector, IBotPlayer monsterPlayer, IEnumerable <MapRegion> monsterRegions, ISectorSubScheme sectorScheme) { var rarityCounter = new int[3]; var rarityMaxCounter = new[] { -1, 10, 1 }; foreach (var region in monsterRegions) { var regionNodes = region.Nodes.OfType <HexNode>().Where(x => !x.IsObstacle); var containerNodes = _propContainerManager.Items.Select(x => x.Node); var availableMonsterNodes = regionNodes.Except(containerNodes); var freeNodes = new List <IMapNode>(availableMonsterNodes); var monsterCount = _generatorRandomSource.RollRegionCount( sectorScheme.MinRegionMonsterCount, sectorScheme.RegionMonsterCount); for (int i = 0; i < monsterCount; i++) { // если в комнате все места заняты if (!freeNodes.Any()) { break; } var currentRarity = GetMonsterRarity(rarityCounter, rarityMaxCounter); var availableSchemeSids = GetAvailableSchemeSids(sectorScheme, currentRarity); var availableMonsterSchemes = availableSchemeSids.Select(x => _schemeService.GetScheme <IMonsterScheme>(x)); var monsterScheme = _generatorRandomSource.RollMonsterScheme(availableMonsterSchemes); //TODO Восстановить патруллирование марштуров позже // первый монстр ходит по маршруту // остальные бродят произвольно //if (i == 0) //{ // // генерируем маршрут обхода // var startPatrolNode = region.Nodes.First(); // var endPatrolNode = region.Nodes.Last(); // // генерируем моснтра // var patrolRoute = new PatrolRoute(startPatrolNode, endPatrolNode); // var monster = CreateMonster(monsterScheme, startPatrolNode, monsterPlayer); // sector.PatrolRoutes[monster] = patrolRoute; // freeNodes.Remove(monster.Node); //} //else //{ var rollIndex = _generatorRandomSource.RollNodeIndex(freeNodes.Count); var monsterNode = freeNodes[rollIndex]; var monster = CreateMonster(monsterScheme, monsterNode, monsterPlayer); freeNodes.Remove(monster.Node); //} } } }
private IActor CreateMonster(IMonsterScheme monsterScheme, IMapNode startNode, IBotPlayer botPlayer) { var person = new MonsterPerson(monsterScheme); var actor = new Actor(person, botPlayer, startNode); _actorManager.Add(actor); return(actor); }
private static IActor CreateMonster(IActorManager actorManager, MonsterPerson person, IGraphNode startNode, IBotPlayer botPlayer) { var actor = new Actor(person, botPlayer, startNode); actorManager.Add(actor); return(actor); }
public MonsterBotActorTaskSource(IBotPlayer player, LogicStateTreePatterns logicStateTreePatterns) : base(player) { _logicStateTreePatterns = logicStateTreePatterns; }
private IActor CreateMonster(IActorManager actorManager, IMonsterScheme monsterScheme, IGraphNode startNode, IBotPlayer botPlayer) { var person = _monsterFactory.Create(monsterScheme); var actor = new Actor(person, botPlayer, startNode); actorManager.Add(actor); return(actor); }