Exemple #1
0
        public IBuilding SelectBuildingToBuild(bool isHasPrivilage, PlayerStatus status, MainBoardStatus board,
            IEnumerable<PlayerStatus> opponents)
        {
            var allBuildings = board.Buildings.Where(x => x.Value > 0);
            var param = new BuilderParameters();
                status.Board.Buildings.OfType<BuildingBase<BuilderParameters>>()
                    .ToList()
                    .ForEach(x => x.DoAction(ref param));
            var discount = status.Board.Quarries.Count(x => x.IsActive);

            var availableBuldings =
                allBuildings.Where(x => x.Key.Cost - Math.Min(discount, x.Key.Discount) <= status.Doubloons).ToArray();

            var building = availableBuldings[new Random().Next(availableBuldings.Count() - 1)];

            return building.Key;
        }
        public bool DoSelectBuildingToBuild(IBuilding building, bool isHasPrivilage)
        {
            if (building == null)
            {
                return true;
            }

            var buildingToBuild =
                _mainBoardController.Status.Buildings.Single(x => x.Key.GetType() == building.GetType());
            var totalDiscount = _playerStatus.Board.Quarries.Count(x => x.CurrentColonistsCount > 0);
            var realCost = buildingToBuild.Key.Cost - totalDiscount - (isHasPrivilage ? 1 : 0);

            if (buildingToBuild.Value > 0 && realCost <= _playerStatus.Doubloons && _playerStatus.Board.CanBuildBuilding(buildingToBuild.Key.Size))
            {
                _playerStatus.Board.BuildBuilding(buildingToBuild.Key);
                _mainBoardController.Status.Buildings[buildingToBuild.Key]--;

                _mainBoardController.ReceiveDoubloons(_playerStatus.PayDoubloons(realCost));

                var param = new BuilderParameters();
                _playerStatus.Board.Buildings.OfType<BuildingBase<BuilderParameters>>()
                    .Where(x => x.IsActive)
                    .ToList()
                    .ForEach(x => x.DoAction(ref param));

                if (param.TakeAdditionalColonist)
                {
                    _mainBoardController.Status.Colonists.Move(buildingToBuild.Key);
                }

                return true;
            }

            return false;
        }
        private void DoBuilderAction(IPlayerConnection connection, bool isHasPrivilage, PlayerStatus status,
            MainBoardStatus board, List<PlayerStatus> opponents, PlayerController controller)
        {
            var isSuccessfull = false;
            IBuilding selectedBuilding = null;
            while (!isSuccessfull)
            {
                var building = connection.SelectBuildingToBuild(isHasPrivilage, status, board,
                    opponents);

                isSuccessfull = controller.DoSelectBuildingToBuild(building, isHasPrivilage);
                if (isSuccessfull && building != null)
                {
                    selectedBuilding = status.Board.Buildings.Single(x => x.GetType() == building.GetType());
                }
            }

            if (selectedBuilding == null)
            {
                return;
            }

            var param = new BuilderParameters();
            status.Board.Buildings.OfType<BuildingBase<BuilderParameters>>().Where(x=>x.IsActive).ToList().ForEach(x=>x.DoAction(ref param));

            if (param.TakeAdditionalColonist && board.Colonists.CurrentColonistsCount > 0)
            {
                var isTakeAdditionalColonist = connection.IsTakeAdditionalColonist(isHasPrivilage, status, board,
                    opponents);

                if (isTakeAdditionalColonist)
                {
                    board.Colonists.Move(selectedBuilding);
                }
            }
        }