Ejemplo n.º 1
0
        private bool TryBuyCard(IStructureCard card, ITurnPlayer player, Age age, SpecialCaseType specialCase)
        {
            if (CanGetForFree(card))
            {
                LoggerHelper.Debug("Card is free.");
                return(true);
            }
            if (HasDemandedCard(card, player.Cards))
            {
                LoggerHelper.Debug("Player can build for free because of previous card");
                return(true);
            }
            if (UseSpecialCase(player, specialCase, age))
            {
                LoggerHelper.DebugFormat("Player can play card for free, because of {0}", specialCase);
                return(true);
            }

            var coins     = card.ResourceCosts.Count(r => r == ResourceType.Coin);
            var resources = card.ResourceCosts.Where(r => r != ResourceType.Coin);

            LoggerHelper.DebugFormat("Structure card costs {0} coins and {1} resources", coins, resources.Count());
            if (player.CoinsLeft >= coins && !player.CheckResourceAvailability(resources.ToList(), false).Any())
            {
                if (coins > 0)
                {
                    unitOfWork.AddEvent(new PayCoinEvent(player, coins));
                }
                return(true);
            }

            return(false);
        }
Ejemplo n.º 2
0
        private void CheckResourcesToBorrow(IStructureCard card, ITurnPlayer player)
        {
            IList <ResourceType> missingResources = new List <ResourceType>();

            if ((player.ChosenAction == TurnAction.BuyCard && (CanGetForFree(card) || HasDemandedCard(card, player.Cards))) || ValidSpecialCase(player, player.SpecialCaseToUse, age) != null)
            {
                return;
            }

            IList <ResourceType> resourcesToCheck = new List <ResourceType>();

            if (player.ChosenAction == TurnAction.BuildWonderStage && player.Wonder.NextStage != null)
            {
                foreach (var c in player.Wonder.NextStage.Costs)
                {
                    resourcesToCheck.Add(c);
                }
            }
            if (player.ChosenAction == TurnAction.BuyCard)
            {
                foreach (var c in card.ResourceCosts)
                {
                    resourcesToCheck.Add(c);
                }
            }
            //Remove predefined resources to borrow
            foreach (var r in player.ResourcesToBorrow)
            {
                var index = resourcesToCheck.IndexOf(r.ResourceType);
                if (index >= 0)
                {
                    resourcesToCheck.RemoveAt(index);
                }
            }
            missingResources = player.CheckResourceAvailability(resourcesToCheck.Where(r => r != ResourceType.Coin).ToList(), false);

            if (missingResources.Any())
            {
                LoggerHelper.DebugFormat("Will need to borrow {0} resources that were not set.", missingResources.Count);
            }
            //Add the rest of the needed resources to list
            foreach (var r in missingResources)
            {
                player.ResourcesToBorrow.Add(new BorrowResourceData
                {
                    ChosenNeighbor = PlayerDirection.None,
                    ResourceType   = r
                });
            }
        }
Ejemplo n.º 3
0
        private bool TryBuildStage(ITurnPlayer player)
        {
            if (player.Wonder.NextStage == null)
            {
                return(false);
            }
            var costs     = player.Wonder.NextStage.Costs;
            var coins     = costs.Count(r => r == ResourceType.Coin);
            var resources = costs.Where(r => r != ResourceType.Coin);

            if (player.CoinsLeft >= coins && !player.CheckResourceAvailability(resources.ToList(), false).Any())
            {
                if (coins > 0)
                {
                    unitOfWork.AddEvent(new PayCoinEvent(player, coins));
                }
                return(true);
            }
            return(false);
        }
Ejemplo n.º 4
0
        static void BorrowResources(ITurnPlayer player)
        {
            var resources = new List <ResourceType>();

            if (player.ChosenAction == TurnAction.BuyCard)
            {
                resources.AddRange(player.SelectedCard.ResourceCosts.Where(r => r != ResourceType.Coin));
            }
            if (player.ChosenAction == TurnAction.BuildWonderStage)
            {
                resources.AddRange(player.Wonder.NextStage.Costs.Where(r => r != ResourceType.Coin));
            }

            if (resources.Any() && player.CheckResourceAvailability(resources, false).Any())
            {
                int index;
                while (true)
                {
                    var oneForFreeCard = player.GetNonResourceEffects().FirstOrDefault(e => e.Type == EffectType.PlayCardForFreeOncePerAge);
                    Console.WriteLine("You need to borrow resources, select which neighbor: 1 (from LEFT), 2 (from RIGHT), 3 (SKIP)"
                                      + (oneForFreeCard != null && player.ChosenAction == TurnAction.BuyCard && (oneForFreeCard.Info == null || (Age)oneForFreeCard.Info != manager.CurrentAge) ? ", 4 (PLAY FOR FREE)" : ""));
                    var neighborSide = Console.ReadLine();
                    if (!int.TryParse(neighborSide, out index) || index == 3 || index > 4 || index < 1)
                    {
                        break;
                    }

                    if (index == 4)
                    {
                        player.SpecialCaseToUse = SpecialCaseType.PlayCardForFreeOncePerAge;
                        break;
                    }

                    var neighbor = index == 1 ? PlayerDirection.ToTheLeft : PlayerDirection.ToTheRight;
                    Console.WriteLine("Type the resource numbers you want to borrow from " + (index == 1 ? "LEFT" : "RIGHT") + " separated by comma (,)");
                    Console.WriteLine("1 (CLAY), 2 (ORE), 3 (STONE), 4 (WOOD), 5 (GLASS), 6 (LOOM), 7 (PAPYRUS)");
                    var borrow = Console.ReadLine();
                    foreach (var s in borrow.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries))
                    {
                        if (!int.TryParse(s, out index) || index > 7 || index < 1)
                        {
                            continue;
                        }
                        #region Translate Resource
                        var res = ResourceType.Coin;
                        switch (index)
                        {
                        case 1:
                            res = ResourceType.Clay;
                            break;

                        case 2:
                            res = ResourceType.Ore;
                            break;

                        case 3:
                            res = ResourceType.Stone;
                            break;

                        case 4:
                            res = ResourceType.Wood;
                            break;

                        case 5:
                            res = ResourceType.Glass;
                            break;

                        case 6:
                            res = ResourceType.Loom;
                            break;

                        case 7:
                            res = ResourceType.Papyrus;
                            break;

                        default:
                            break;
                        }
                        #endregion
                        player.ResourcesToBorrow.Add(new BorrowResourceData {
                            ChosenNeighbor = neighbor, ResourceType = res
                        });
                    }
                    Console.WriteLine();
                }
                Console.WriteLine();
            }
        }