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();
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 /// <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);
        }
Ejemplo n.º 5
0
        /// <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));
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 8
0
        /// <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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        /// <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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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));
        }
Ejemplo n.º 14
0
        /// <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();
 }
Ejemplo n.º 16
0
    private MapLocation GetNodeViewModel(GlobeRegionNode targetNode)
    {
        var locationViewModel = _locationNodeViewModels.Single(x => x.Node == targetNode);

        return(locationViewModel);
    }
Ejemplo n.º 17
0
        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
            };
        }
Ejemplo n.º 18
0
    private void MoveGroupViewModel(GlobeRegionNode targetNode)
    {
        var selectedNodeViewModel = GetNodeViewModel(targetNode);

        _groupViewModel.CurrentLocation = selectedNodeViewModel;
    }
Ejemplo n.º 19
0
        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);
            }
        }
Ejemplo n.º 20
0
        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);
        }
Ejemplo n.º 21
0
        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);
        }
Ejemplo n.º 22
0
        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);
        }