public async Task CreateSectorAsync(int mapSize) { var mapFactory = (FuncMapFactory)Container.GetInstance <IMapFactory>(); mapFactory.SetFunc(async() => { var map = await SquareMapFactory.CreateAsync(mapSize); return(map); }); var sectorManager = Container.GetInstance <ISectorManager>(); var sectorGenerator = Container.GetInstance <ISectorGenerator>(); var humanPlayer = Container.GetInstance <HumanPlayer>(); var locationScheme = new TestLocationScheme { SectorLevels = new ISectorSubScheme[] { new TestSectorSubScheme { RegularMonsterSids = new[] { "rat" }, } } }; var globeNode = new GlobeRegionNode(0, 0, locationScheme); humanPlayer.GlobeNode = globeNode; await sectorManager.CreateSectorAsync(); }
public void GetCenterLocationNodeTest(int gridSize, int expectedCenterX, int expectedCenterY) { // ARRANGE var locationSchemeMock = new Mock <ILocationScheme>(); var locationScheme = locationSchemeMock.Object; var nodes = new GlobeRegionNode[gridSize * gridSize]; for (var i = 0; i < gridSize; i++) { for (var j = 0; j < gridSize; j++) { nodes[i * gridSize + j] = new GlobeRegionNode(i, j, locationScheme); } } // ACT var factCenter = GlobeHelper.GetCenterLocationNode(nodes); // ASSERT var expectedCenter = nodes.Single(node => node.OffsetX == expectedCenterX && node.OffsetY == expectedCenterY); factCenter.Should().Be(expectedCenter); }
/// <summary>Засчитывает посещение места на глобальной карте.</summary> /// <param name="regionNode">Узел провинции, которая считается посещённым местом.</param> public void CountPlace(GlobeRegionNode regionNode) { if (!Places.Contains(regionNode)) { Places.Add(regionNode); BaseScores += PLACE_SCORES; } }
/// <summary> /// Создаёт сектор фрагмента дикого окружения. /// </summary> /// <param name="globe">Объект мира.</param> /// <param name="globeNode">Узел провинции, на основе которого генерируется сектор.</param> /// <returns> /// Возвращает созданный сектор. /// </returns> /// <remarks> /// Нужно будет передавать параметры окружения и количество /// и характеристики монстров. /// </remarks> public async Task <ISector> GenerateWildAsync(Globe globe, GlobeRegionNode globeNode) { var map = await SquareMapFactory.CreateAsync(10); var sector = _sectorFactory.Create(map); return(sector); }
/// <summary> /// Создание /// </summary> /// <param name="globe">Объект игрового мира, для которого создаётся локация.</param> /// <param name="cell">Провинция игрового мира из указанного выше <see cref="Globe" />, /// для которого создаётся локация.</param> /// <returns> /// Возвращает граф локация для провинции. /// </returns> public Task <GlobeRegion> GenerateRegionAsync(Globe globe, TerrainCell cell) { var locationSchemeSids = new[] { "rat-hole", "rat-kingdom", "demon-dungeon", "demon-lair", "crypt", "elder-place", "genomass-cave" }; var region = new GlobeRegion(LocationBaseSize); for (var x = 0; x < LocationBaseSize; x++) { for (var y = 0; y < LocationBaseSize; y++) { //var hasNodeRoll = _dice.Roll(6); //if (hasNodeRoll <= 2) //{ // continue; //} var hasDundeonRoll = _dice.Roll(100); if (hasDundeonRoll > 90) { var locationSidIndex = _dice.Roll(0, locationSchemeSids.Length - 1); var locationSid = locationSchemeSids[locationSidIndex]; var locationScheme = _schemeService.GetScheme <ILocationScheme>(locationSid); var node = new GlobeRegionNode(x, y, locationScheme); region.AddNode(node); } else { var hasCityRoll = _dice.Roll(100); if (hasCityRoll > 90) { var locationScheme = _schemeService.GetScheme <ILocationScheme>("city"); var node = new GlobeRegionNode(x, y, locationScheme) { IsTown = true }; region.AddNode(node); } else { var locationScheme = _schemeService.GetScheme <ILocationScheme>("forest"); var node = new GlobeRegionNode(x, y, locationScheme); region.AddNode(node); } } } } return(Task.FromResult(region)); }
private void AddNodeIfBorder(GlobeRegion region, int x, int y) { var locationScheme = _schemeService.GetScheme <ILocationScheme>(WILD_SCHEME_SID); var borderNode = new GlobeRegionNode(x, y, locationScheme) { IsBorder = true }; region.AddNode(borderNode); }
public async System.Threading.Tasks.Task CreateAsync() { var sectorManager = _container.GetInstance <ISectorManager>(); var playerState = _container.GetInstance <ISectorUiState>(); var schemeService = _container.GetInstance <ISchemeService>(); var humanPlayer = _container.GetInstance <HumanPlayer>(); var actorManager = _container.GetInstance <IActorManager>(); var humanActorTaskSource = _container.GetInstance <IHumanActorTaskSource>(); var sectorGenerator = _container.GetInstance <ISectorGenerator>(); var locationScheme = new TestLocationScheme { SectorLevels = new ISectorSubScheme[] { new TestSectorSubScheme { RegularMonsterSids = new[] { "rat" }, RareMonsterSids = new[] { "rat" }, ChampionMonsterSids = new[] { "rat" }, RegionCount = 20, RegionSize = 20, IsStart = true, ChestDropTableSids = new[] { "survival", "default" }, RegionChestCountRatio = 9, TotalChestCount = 20 } } }; var globeNode = new GlobeRegionNode(0, 0, locationScheme); humanPlayer.GlobeNode = globeNode; await sectorManager.CreateSectorAsync(); var personScheme = schemeService.GetScheme <IPersonScheme>("human-person"); var playerActorStartNode = sectorManager.CurrentSector.Map.Regions .SingleOrDefault(x => x.IsStart).Nodes .First(); var playerActorVm = CreateHumanActorVm(humanPlayer, personScheme, actorManager, playerActorStartNode); //Лучше централизовать переключение текущего актёра только в playerState playerState.ActiveActor = playerActorVm; humanActorTaskSource.SwitchActor(playerState.ActiveActor.Actor); }
/// <summary> /// Создаёт сектор фрагмента дикого окружения. /// </summary> /// <param name="globe">Объект мира.</param> /// <param name="globeNode">Узел провинции, на основе которого генерируется сектор.</param> /// <returns> /// Возвращает созданный сектор. /// </returns> /// <remarks> /// Нужно будет передавать параметры окружения и количество /// и характеристики монстров. /// </remarks> public async Task <ISector> GenerateWildAsync(Globe globe, GlobeRegionNode globeNode) { var map = await WildMapFactory.CreateAsync(30); var sector = _sectorFactory.Create(map); if (globeNode.MonsterState != null) { _monsterGenerator.CreateMonsters(sector, _botPlayer, new[] { map.Regions[1] }, globeNode.MonsterState.MonsterPersons); } return(sector); }
public static GlobeRegionNodeStorageData Create(GlobeRegionNode globeRegionNode) { var storageData = new GlobeRegionNodeStorageData(); storageData.Coords = new OffsetCoords(globeRegionNode.OffsetX, globeRegionNode.OffsetY); storageData.SchemeSid = globeRegionNode.Scheme.Sid; storageData.IsHome = globeRegionNode.IsHome; storageData.IsTown = globeRegionNode.IsTown; storageData.IsBorder = globeRegionNode.IsBorder; storageData.IsStart = globeRegionNode.IsStart; storageData.MonsterState = new GlobeRegionNodeMonsterStateStorageData { }; storageData.Observed = globeRegionNode.ObservedState; return(storageData); }
/// <summary> /// Создаёт сектор квартала города. /// </summary> /// <param name="globe">Объект мира.</param> /// <param name="globeNode">Узел провинции, на основе которого генерируется сектор.</param> /// <returns> /// Возвращает созданный сектор. /// </returns> /// <remarks> /// Нужно будет передавать параметры зданий, наличие персонажей и станков для крафта. /// Вместо общей информации об узле. /// </remarks> public async Task <ISector> GenerateTownQuarterAsync(Globe globe, GlobeRegionNode globeNode) { var map = await SquareMapFactory.CreateAsync(10); var sector = _sectorFactory.Create(map); var traderDropTable = _schemeService.GetScheme <IDropTableScheme>("trader"); var trader = new Trader(traderDropTable, map.Nodes.ElementAt(10), _dropResolver); _traderManager.Add(trader); map.HoldNode(trader.Node, trader); map.Transitions.Add(map.Nodes.Last(), RoomTransition.CreateGlobalExit()); return(sector); }
public GlobeRegion Restore(ISchemeService schemeService) { var globeNode = new GlobeRegion(20); foreach (var storedNode in Nodes) { var scheme = schemeService.GetScheme <ILocationScheme>(storedNode.SchemeSid); var node = new GlobeRegionNode(storedNode.Coords.X, storedNode.Coords.Y, scheme) { IsBorder = storedNode.IsBorder, IsHome = storedNode.IsHome, IsStart = storedNode.IsStart, IsTown = storedNode.IsTown, ObservedState = storedNode.Observed }; globeNode.AddNode(node); } return(globeNode); }
public async Task CreateSectorAsync(int mapSize) { var mapFactory = (FuncMapFactory)Container.GetInstance <IMapFactory>(); mapFactory.SetFunc(() => { ISectorMap map = new SectorGraphMap <HexNode, HexMapNodeDistanceCalculator>(); MapFiller.FillSquareMap(map, mapSize); var mapRegion = new MapRegion(1, map.Nodes.ToArray()) { IsStart = true, IsOut = true, ExitNodes = new[] { map.Nodes.Last() } }; map.Regions.Add(mapRegion); return(Task.FromResult(map)); }); var sectorManager = Container.GetInstance <ISectorManager>(); var humanPlayer = Container.GetInstance <HumanPlayer>(); var locationScheme = new TestLocationScheme { SectorLevels = new ISectorSubScheme[] { new TestSectorSubScheme { RegularMonsterSids = new[] { "rat" }, } } }; var globeNode = new GlobeRegionNode(0, 0, locationScheme); humanPlayer.GlobeNode = globeNode; await sectorManager.CreateSectorAsync(); }
public static IEnumerable <GlobeRegionNode> GetNeighborBorderNodes(GlobeRegionNode currentTerrainNode, TerrainCell currentTerrainCell, IEnumerable <GlobeRegionNode> targetRegionBorderNodes, TerrainCell targetNeighborTerrainCell) { if (targetRegionBorderNodes == null) { throw new ArgumentNullException(nameof(targetRegionBorderNodes)); } if (currentTerrainCell == null) { throw new ArgumentNullException(nameof(currentTerrainCell)); } if (targetNeighborTerrainCell == null) { throw new ArgumentNullException(nameof(targetNeighborTerrainCell)); } const int REGION_SIZE = 20; var regionNodeOffsetX = targetNeighborTerrainCell.Coords.X - currentTerrainCell.Coords.X; var regionNodeOffsetY = targetNeighborTerrainCell.Coords.Y - currentTerrainCell.Coords.Y; var targetRegionBorderNodeOffsetCoords = targetRegionBorderNodes.Select(node => new { RegionOffsetCoords = new OffsetCoords( regionNodeOffsetX >= 0 ? node.OffsetX + regionNodeOffsetX * REGION_SIZE : -(REGION_SIZE - node.OffsetX), regionNodeOffsetY >= 0 ? node.OffsetY + regionNodeOffsetY * REGION_SIZE : -(REGION_SIZE - node.OffsetY) ), Node = node }); var transitionNodeCoords = targetRegionBorderNodeOffsetCoords.Where(coords => HexHelper.ConvertToCube(coords.RegionOffsetCoords.X, coords.RegionOffsetCoords.Y) .DistanceTo(currentTerrainNode.CubeCoords) <= 1); return(transitionNodeCoords.Select(x => x.Node)); }
/// <summary> /// Создаёт сектор квартала города. /// </summary> /// <param name="globe">Объект мира.</param> /// <param name="globeNode">Узел провинции, на основе которого генерируется сектор.</param> /// <returns> /// Возвращает созданный сектор. /// </returns> /// <remarks> /// Нужно будет передавать параметры зданий, наличие персонажей и станков для крафта. /// Вместо общей информации об узле. /// </remarks> public async Task <ISector> GenerateTownQuarterAsync(Globe globe, GlobeRegionNode globeNode) { var townScheme = new TownSectorScheme { RegionCount = 10, RegionSize = 10 }; var mapFactory = _mapFactorySelector.GetMapFactory(townScheme); var map = await mapFactory.CreateAsync(townScheme); var sector = _sectorFactory.Create(map); _citizenGenerator.CreateCitizens(sector, _botPlayer, sector.Map.Regions); //TODO Выходы нужно генерировать в карте, аналогично подземельям. map.Transitions.Add(map.Nodes.Last(), RoomTransition.CreateGlobalExit()); return(sector); }
public Task <ISector> GenerateWildAsync(Globe globe, GlobeRegionNode globeNode) { throw new System.NotImplementedException(); }
private MapLocation GetNodeViewModel(GlobeRegionNode targetNode) { var locationViewModel = _locationNodeViewModels.Single(x => x.Node == targetNode); return(locationViewModel); }
public void IterationSetup() { var serviceCollection = new ServiceCollection(); // инстанцируем явно, чтобы обеспечить одинаковый рандом для всех запусков тестов. serviceCollection.AddSingleton <IDice>(factory => new Dice(123)); serviceCollection.AddSingleton <IDecisionSource, DecisionSource>(); serviceCollection.AddSingleton <IRoomGeneratorRandomSource, RoomGeneratorRandomSource>(); serviceCollection.AddSingleton <ISchemeService, SchemeService>(); serviceCollection.AddSingleton <ISchemeServiceHandlerFactory, SchemeServiceHandlerFactory>(); serviceCollection.AddSingleton <IPropFactory, PropFactory>(); serviceCollection.AddSingleton <IDropResolver, DropResolver>(); serviceCollection.AddSingleton <IDropResolverRandomSource, DropResolverRandomSource>(); serviceCollection.AddSingleton <IPerkResolver, PerkResolver>(); serviceCollection.AddSingleton <ISurvivalRandomSource, SurvivalRandomSource>(); serviceCollection.AddSingleton <IChestGenerator, ChestGenerator>(); serviceCollection.AddSingleton <IChestGeneratorRandomSource, ChestGeneratorRandomSource>(); serviceCollection.AddSingleton <IMonsterGenerator, MonsterGenerator>(); serviceCollection.AddSingleton <IMonsterGeneratorRandomSource, MonsterGeneratorRandomSource>(); serviceCollection.AddSingleton <ICitizenGenerator, CitizenGenerator>(); serviceCollection.AddSingleton <ICitizenGeneratorRandomSource, CitizenGeneratorRandomSource>(); serviceCollection.AddSingleton <ISectorFactory, SectorFactory>(); serviceCollection.AddSingleton <IEquipmentDurableService, EquipmentDurableService>(); serviceCollection.AddSingleton <IEquipmentDurableServiceRandomSource, EquipmentDurableServiceRandomSource>(); serviceCollection.AddSingleton <HumanPlayer>(); serviceCollection.AddSingleton <IBotPlayer, BotPlayer>(); serviceCollection.AddSingleton <ISchemeLocator>(factory => CreateSchemeLocator()); serviceCollection.AddSingleton <IGameLoop, GameLoop>(); serviceCollection.AddSingleton <ICommandManager, QueueCommandManager>(); serviceCollection.AddSingleton <ISectorUiState, SectorUiState>(); serviceCollection.AddSingleton <IActorManager, ActorManager>(); serviceCollection.AddSingleton <IPropContainerManager, PropContainerManager>(); serviceCollection.AddSingleton <IHumanActorTaskSource, HumanActorTaskSource>(); serviceCollection.AddSingleton <MonsterBotActorTaskSource>(); serviceCollection.AddSingleton <ISectorGenerator, SectorGenerator>(); serviceCollection.AddSingleton <IRoomGenerator, RoomGenerator>(); serviceCollection.AddSingleton <IRoomGeneratorRandomSource, RoomGeneratorRandomSource>(); serviceCollection.AddSingleton <IMapFactory, RoomMapFactory>(); serviceCollection.AddSingleton <ITacticalActUsageService, TacticalActUsageService>(); serviceCollection.AddSingleton <ITacticalActUsageRandomSource, TacticalActUsageRandomSource>(); serviceCollection.AddSingleton <ISectorManager, SectorManager>(); serviceCollection.AddSingleton <IWorldManager, WorldManager>(); // Специализированные сервисы для Ui. serviceCollection.AddSingleton <IInventoryState, InventoryState>(); // Комманды актёра. serviceCollection.AddSingleton <MoveCommand>(); serviceCollection.AddSingleton <AttackCommand>(); serviceCollection.AddSingleton <OpenContainerCommand>(); serviceCollection.AddSingleton <NextTurnCommand>(); serviceCollection.AddSingleton <UseSelfCommand>(); // Комадны для UI. serviceCollection.AddSingleton <ShowContainerModalCommand>(); serviceCollection.AddSingleton <ShowInventoryModalCommand>(); serviceCollection.AddSingleton <ShowPerksModalCommand>(); // Специализированные команды для Ui. serviceCollection.AddSingleton <EquipCommand>(); serviceCollection.AddSingleton <PropTransferCommand>(); _serviceProvider = serviceCollection.BuildServiceProvider(); var sectorManager = _serviceProvider.GetService <ISectorManager>(); var playerState = _serviceProvider.GetService <ISectorUiState>(); var moveCommand = _serviceProvider.GetService <MoveCommand>(); var schemeService = _serviceProvider.GetService <ISchemeService>(); var humanPlayer = _serviceProvider.GetService <HumanPlayer>(); var actorManager = _serviceProvider.GetService <IActorManager>(); var humanActorTaskSource = _serviceProvider.GetService <IHumanActorTaskSource>(); var commandManger = _serviceProvider.GetService <ICommandManager>(); var sectorGenerator = _serviceProvider.GetService <ISectorGenerator>(); var locationScheme = new TestLocationScheme { SectorLevels = new ISectorSubScheme[] { new TestSectorSubScheme { RegularMonsterSids = new[] { "rat" }, RegionMonsterCount = 0, RegionCount = 20, RegionSize = 20, IsStart = true, ChestDropTableSids = new[] { "survival", "default" }, RegionChestCountRatio = 9, TotalChestCount = 0 } } }; var globeNode = new GlobeRegionNode(0, 0, locationScheme); humanPlayer.GlobeNode = globeNode; sectorManager.CreateSectorAsync().Wait(); var personScheme = schemeService.GetScheme <IPersonScheme>("human-person"); var playerActorStartNode = sectorManager.CurrentSector.Map.Regions .SingleOrDefault(x => x.IsStart).Nodes .First(); var playerActorVm = CreateHumanActorVm(humanPlayer, personScheme, actorManager, playerActorStartNode); //Лучше централизовать переключение текущего актёра только в playerState // Эта строка не нужна для LightInject. // Он сам внедряет зависимости свойств. Опасная вещь. // DI корки так не делает. playerState.TaskSource = humanActorTaskSource; playerState.ActiveActor = playerActorVm; humanActorTaskSource.SwitchActor(playerState.ActiveActor.Actor); // Эта строка не нужна для LightInject. // Он сам внедряет зависимости свойств. Опасная вещь. // DI корки так не делает. var gameLoop = _serviceProvider.GetService <IGameLoop>(); var monsterTaskSource = _serviceProvider.GetService <MonsterBotActorTaskSource>(); gameLoop.ActorTaskSources = new IActorTaskSource[] { humanActorTaskSource, monsterTaskSource }; }
private void MoveGroupViewModel(GlobeRegionNode targetNode) { var selectedNodeViewModel = GetNodeViewModel(targetNode); _groupViewModel.CurrentLocation = selectedNodeViewModel; }
private void ValidateRegion(GlobeRegion region, GlobeRegionDraftValue[,] regionDraft, int x, int y) { // Определяем, является ли узел граничным. На граничных узлах ничего не создаём. // Потому что это может вызвать трудности при переходах между провинциями. // Например, игрок при переходе сразу может попасть в данж или город. // Не отлажен механиз перехода, если часть узлов соседней провинции отсутствует. var isBorder = x == 0 || x == LocationBaseSize - 1 || y == 0 || y == LocationBaseSize - 1; if (isBorder) { AddNodeIfBorder(region, x, y); return; } var currentPatternValue = regionDraft[x, y]; GlobeRegionNode node = null; if (currentPatternValue == null || currentPatternValue.Value.HasFlag(GlobeRegionDraftValueType.Wild)) { // Это означает, что сюда не был применен ни один шаблон или // Дикий сектор был указан явно одним из шаблонов. // Значит генерируем просто дикий сектор. var locationScheme = _schemeService.GetScheme <ILocationScheme>(WILD_SCHEME_SID); node = new GlobeRegionNode(x, y, locationScheme); } else if (currentPatternValue.IsStart) { var locationScheme = _schemeService.GetScheme <ILocationScheme>(WILD_SCHEME_SID); node = new GlobeRegionNode(x, y, locationScheme) { IsStart = true }; } else if (currentPatternValue.IsHome) { var locationScheme = _schemeService.GetScheme <ILocationScheme>(CITY_SCHEME_SID); node = new GlobeRegionNode(x, y, locationScheme) { IsTown = true, IsHome = true }; } else if (currentPatternValue.Value.HasFlag(GlobeRegionDraftValueType.Town)) { var locationScheme = _schemeService.GetScheme <ILocationScheme>(CITY_SCHEME_SID); node = new GlobeRegionNode(x, y, locationScheme) { IsTown = true }; } else if (currentPatternValue.Value.HasFlag(GlobeRegionDraftValueType.Dungeon)) { var locationSchemeSids = new[] { "rat-hole", "rat-kingdom", "demon-dungeon", "demon-lair", "crypt", "elder-place", "genomass-cave" }; var locationSidIndex = _dice.Roll(0, locationSchemeSids.Length - 1); var locationSid = locationSchemeSids[locationSidIndex]; var locationScheme = _schemeService.GetScheme <ILocationScheme>(locationSid); node = new GlobeRegionNode(x, y, locationScheme); } else { Debug.Assert(true, "При генерации провинции должны все исходы быть предусмотрены."); } if (node != null) { region.AddNode(node); } }
public void IterationSetup() { _container = new ServiceContainer(); // инстанцируем явно, чтобы обеспечить одинаковый рандом для всех запусков тестов. _container.Register <IDice>(factory => new LinearDice(123), new PerContainerLifetime()); _container.Register <IDecisionSource, DecisionSource>(new PerContainerLifetime()); _container.Register <IRoomGeneratorRandomSource, RoomGeneratorRandomSource>(new PerContainerLifetime()); _container.Register <ISchemeService, SchemeService>(new PerContainerLifetime()); _container.Register <ISchemeServiceHandlerFactory, SchemeServiceHandlerFactory>(new PerContainerLifetime()); _container.Register <IPropFactory, PropFactory>(new PerContainerLifetime()); _container.Register <IDropResolver, DropResolver>(new PerContainerLifetime()); _container.Register <IDropResolverRandomSource, DropResolverRandomSource>(new PerContainerLifetime()); _container.Register <IPerkResolver, PerkResolver>(new PerContainerLifetime()); _container.Register <ISurvivalRandomSource, SurvivalRandomSource>(new PerContainerLifetime()); _container.Register <IChestGenerator, ChestGenerator>(new PerContainerLifetime()); _container.Register <IChestGeneratorRandomSource, ChestGeneratorRandomSource>(new PerContainerLifetime()); _container.Register <IMonsterGenerator, MonsterGenerator>(new PerContainerLifetime()); _container.Register <IMonsterGeneratorRandomSource, MonsterGeneratorRandomSource>(new PerContainerLifetime()); _container.Register <ICitizenGenerator, CitizenGenerator>(new PerContainerLifetime()); _container.Register <ICitizenGeneratorRandomSource, CitizenGeneratorRandomSource>(new PerContainerLifetime()); _container.Register <ISectorFactory, SectorFactory>(new PerContainerLifetime()); _container.Register <IEquipmentDurableService, EquipmentDurableService>(new PerContainerLifetime()); _container.Register <IEquipmentDurableServiceRandomSource, EquipmentDurableServiceRandomSource>(new PerContainerLifetime()); _container.Register <HumanPlayer>(new PerContainerLifetime()); _container.Register <IBotPlayer, BotPlayer>(new PerContainerLifetime()); _container.Register <ISchemeLocator>(factory => CreateSchemeLocator(), new PerContainerLifetime()); _container.Register <IGameLoop, GameLoop>(new PerContainerLifetime()); _container.Register <ICommandManager, QueueCommandManager>(new PerContainerLifetime()); _container.Register <ISectorUiState, SectorUiState>(new PerContainerLifetime()); _container.Register <IActorManager, ActorManager>(new PerContainerLifetime()); _container.Register <IPropContainerManager, PropContainerManager>(new PerContainerLifetime()); _container.Register <IHumanActorTaskSource, HumanActorTaskSource>(new PerContainerLifetime()); _container.Register <MonsterBotActorTaskSource>(lifetime: new PerContainerLifetime()); _container.Register <ISectorGenerator, SectorGenerator>(new PerContainerLifetime()); _container.Register <IRoomGenerator, RoomGenerator>(new PerContainerLifetime()); _container.Register <IRoomGeneratorRandomSource, RoomGeneratorRandomSource>(new PerContainerLifetime()); _container.Register <IMapFactory, RoomMapFactory>(new PerContainerLifetime()); _container.Register <IMapFactorySelector, LightInjectSwitchMapFactorySelector>(new PerContainerLifetime()); _container.Register <ITacticalActUsageService, TacticalActUsageService>(new PerContainerLifetime()); _container.Register <ITacticalActUsageRandomSource, TacticalActUsageRandomSource>(new PerContainerLifetime()); _container.Register <ISectorManager, SectorManager>(new PerContainerLifetime()); _container.Register <IWorldManager, WorldManager>(new PerContainerLifetime()); // Специализированные сервисы для Ui. _container.Register <IInventoryState, InventoryState>(new PerContainerLifetime()); // Комманды актёра. _container.Register <MoveCommand>(lifetime: new PerContainerLifetime()); var sectorManager = _container.GetInstance <ISectorManager>(); var playerState = _container.GetInstance <ISectorUiState>(); var schemeService = _container.GetInstance <ISchemeService>(); var humanPlayer = _container.GetInstance <HumanPlayer>(); var actorManager = _container.GetInstance <IActorManager>(); var humanActorTaskSource = _container.GetInstance <IHumanActorTaskSource>(); var locationScheme = new TestLocationScheme { SectorLevels = new ISectorSubScheme[] { new TestSectorSubScheme { RegularMonsterSids = new[] { "rat" }, RegionMonsterCount = 0, RegionCount = 20, RegionSize = 20, IsStart = true, ChestDropTableSids = new[] { "survival", "default" }, RegionChestCountRatio = 9, TotalChestCount = 0 } } }; var globeNode = new GlobeRegionNode(0, 0, locationScheme); humanPlayer.GlobeNode = globeNode; sectorManager.CreateSectorAsync().Wait(); var personScheme = schemeService.GetScheme <IPersonScheme>("human-person"); var playerActorStartNode = sectorManager.CurrentSector.Map.Regions .SingleOrDefault(x => x.IsStart).Nodes .First(); var playerActorVm = CreateHumanActorVm(humanPlayer, personScheme, actorManager, playerActorStartNode); //Лучше централизовать переключение текущего актёра только в playerState playerState.ActiveActor = playerActorVm; humanActorTaskSource.SwitchActor(playerState.ActiveActor.Actor); }
public async System.Threading.Tasks.Task IterationSetupAsync() { _container = new ServiceContainer(); // инстанцируем явно, чтобы обеспечить одинаковый рандом для всех запусков тестов. _container.Register <IDice>(factory => new Dice(123), new PerContainerLifetime()); _container.Register <IDecisionSource, DecisionSource>(new PerContainerLifetime()); _container.Register <IRoomGeneratorRandomSource, RoomGeneratorRandomSource>(new PerContainerLifetime()); _container.Register <ISchemeService, SchemeService>(new PerContainerLifetime()); _container.Register <ISchemeServiceHandlerFactory, SchemeServiceHandlerFactory>(new PerContainerLifetime()); _container.Register <IPropFactory, PropFactory>(new PerContainerLifetime()); _container.Register <IDropResolver, DropResolver>(new PerContainerLifetime()); _container.Register <IDropResolverRandomSource, DropResolverRandomSource>(new PerContainerLifetime()); _container.Register <IPerkResolver, PerkResolver>(new PerContainerLifetime()); _container.Register <ISurvivalRandomSource, SurvivalRandomSource>(new PerContainerLifetime()); _container.Register <IChestGenerator, ChestGenerator>(new PerContainerLifetime()); _container.Register <IChestGeneratorRandomSource, ChestGeneratorRandomSource>(new PerContainerLifetime()); _container.Register <IMonsterGenerator, MonsterGenerator>(new PerContainerLifetime()); _container.Register <IMonsterGeneratorRandomSource, MonsterGeneratorRandomSource>(new PerContainerLifetime()); _container.Register <ISectorFactory, SectorFactory>(new PerContainerLifetime()); _container.Register <HumanPlayer>(new PerContainerLifetime()); _container.Register <IBotPlayer, BotPlayer>(new PerContainerLifetime()); _container.Register <ISchemeLocator>(factory => CreateSchemeLocator(), new PerContainerLifetime()); _container.Register <IGameLoop, GameLoop>(new PerContainerLifetime()); _container.Register <ICommandManager, QueueCommandManager>(new PerContainerLifetime()); _container.Register <ISectorUiState, SectorUiState>(new PerContainerLifetime()); _container.Register <IActorManager, ActorManager>(new PerContainerLifetime()); _container.Register <IPropContainerManager, PropContainerManager>(new PerContainerLifetime()); _container.Register <ITraderManager, TraderManager>(new PerContainerLifetime()); _container.Register <IHumanActorTaskSource, HumanActorTaskSource>(new PerContainerLifetime()); _container.Register <IActorTaskSource, MonsterActorTaskSource>(serviceName: "monster", lifetime: new PerContainerLifetime()); _container.Register <ISectorGenerator, SectorGenerator>(new PerContainerLifetime()); _container.Register <IRoomGenerator, RoomGenerator>(new PerContainerLifetime()); _container.Register <IRoomGeneratorRandomSource, RoomGeneratorRandomSource>(new PerContainerLifetime()); _container.Register <IMapFactory, RoomMapFactory>(new PerContainerLifetime()); _container.Register <ITacticalActUsageService, TacticalActUsageService>(new PerContainerLifetime()); _container.Register <ITacticalActUsageRandomSource, TacticalActUsageRandomSource>(new PerContainerLifetime()); _container.Register <ISectorManager, SectorManager>(new PerContainerLifetime()); _container.Register <IWorldManager, WorldManager>(new PerContainerLifetime()); // Специализированные сервисы для Ui. _container.Register <IInventoryState, InventoryState>(new PerContainerLifetime()); // Комманды актёра. _container.Register <ICommand, MoveCommand>(serviceName: "move-command", lifetime: new PerContainerLifetime()); _container.Register <ICommand, AttackCommand>(serviceName: "attack-command", lifetime: new PerContainerLifetime()); _container.Register <ICommand, OpenContainerCommand>(serviceName: "open-container-command", lifetime: new PerContainerLifetime()); _container.Register <ICommand, NextTurnCommand>(serviceName: "next-turn-command", lifetime: new PerContainerLifetime()); _container.Register <ICommand, UseSelfCommand>(serviceName: "use-self-command", lifetime: new PerContainerLifetime()); // Комадны для UI. _container.Register <ICommand, ShowContainerModalCommand>(serviceName: "show-container-modal-command", lifetime: new PerContainerLifetime()); _container.Register <ICommand, ShowInventoryModalCommand>(serviceName: "show-inventory-command", lifetime: new PerContainerLifetime()); _container.Register <ICommand, ShowPerksModalCommand>(serviceName: "show-perks-command", lifetime: new PerContainerLifetime()); // Специализированные команды для Ui. _container.Register <ICommand, EquipCommand>(serviceName: "show-container-modal-command"); _container.Register <ICommand, PropTransferCommand>(serviceName: "show-container-modal-command"); var sectorManager = _container.GetInstance <ISectorManager>(); var playerState = _container.GetInstance <ISectorUiState>(); var moveCommand = _container.GetInstance <ICommand>("move-command"); var schemeService = _container.GetInstance <ISchemeService>(); var humanPlayer = _container.GetInstance <HumanPlayer>(); var actorManager = _container.GetInstance <IActorManager>(); var humanActorTaskSource = _container.GetInstance <IHumanActorTaskSource>(); var commandManger = _container.GetInstance <ICommandManager>(); var sectorGenerator = _container.GetInstance <ISectorGenerator>(); var locationScheme = new TestLocationScheme { SectorLevels = new ISectorSubScheme[] { new TestSectorSubScheme { RegularMonsterSids = new[] { "rat" }, RegionCount = 20, RegionSize = 20, IsStart = true, ChestDropTableSids = new[] { "survival", "default" }, RegionChestCountRatio = 9, TotalChestCount = 20 } } }; var globeNode = new GlobeRegionNode(0, 0, locationScheme); humanPlayer.GlobeNode = globeNode; await sectorManager.CreateSectorAsync(); var personScheme = schemeService.GetScheme <IPersonScheme>("human-person"); var playerActorStartNode = sectorManager.CurrentSector.Map.Regions .SingleOrDefault(x => x.IsStart).Nodes .First(); var playerActorVm = CreateHumanActorVm(humanPlayer, personScheme, actorManager, playerActorStartNode); //Лучше централизовать переключение текущего актёра только в playerState playerState.ActiveActor = playerActorVm; humanActorTaskSource.SwitchActor(playerState.ActiveActor.Actor); }
public async System.Threading.Tasks.Task MoveCommandTestAsync() { var sectorManager = _container.GetInstance <ISectorManager>(); var playerState = _container.GetInstance <ISectorUiState>(); var moveCommand = _container.GetInstance <ICommand>("move-command"); var schemeService = _container.GetInstance <ISchemeService>(); var humanPlayer = _container.GetInstance <HumanPlayer>(); var actorManager = _container.GetInstance <IActorManager>(); var humanActorTaskSource = _container.GetInstance <IHumanActorTaskSource>(); var commandManger = _container.GetInstance <ICommandManager>(); var sectorGenerator = _container.GetInstance <ISectorGenerator>(); var locationScheme = new TestLocationScheme { SectorLevels = new ISectorSubScheme[] { new TestSectorSubScheme { RegularMonsterSids = new[] { "rat" }, RegionCount = 20, RegionSize = 20, IsStart = true, ChestDropTableSids = new[] { "default" }, RegionChestCountRatio = 9 } } }; var globeNode = new GlobeRegionNode(0, 0, locationScheme); humanPlayer.GlobeNode = globeNode; await sectorManager.CreateSectorAsync(); var personScheme = schemeService.GetScheme <IPersonScheme>("human-person"); var playerActorStartNode = sectorManager.CurrentSector.Map.Regions .SingleOrDefault(x => x.IsStart).Nodes .First(); var playerActorVm = CreateHumanActorVm(humanPlayer, personScheme, actorManager, playerActorStartNode); //Лучше централизовать переключение текущего актёра только в playerState playerState.ActiveActor = playerActorVm; humanActorTaskSource.SwitchActor(playerState.ActiveActor.Actor); var currentActorNode = (HexNode)playerState.ActiveActor.Actor.Node; var nextNodes = HexNodeHelper.GetSpatialNeighbors(currentActorNode, sectorManager.CurrentSector.Map.Nodes.Cast <HexNode>()); var moveTargetNode = nextNodes.First(); var nodeViewModel = new TestNodeViewModel { Node = moveTargetNode }; playerState.HoverViewModel = nodeViewModel; playerState.SelectedViewModel = nodeViewModel; commandManger.Push(moveCommand); ICommand command = null; do { command = commandManger.Pop(); try { command?.Execute(); } catch (Exception exception) { throw new InvalidOperationException($"Не удалось выполнить команду {command}.", exception); } } while (command != null); }