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); } } }