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