private IEffect ValidSpecialCase(IGamePlayer player, SpecialCaseType specialCase, Age age) { IEffect result = null; if (specialCase == SpecialCaseType.None) { return(result); } var effects = player.GetNonResourceEffects().Where(e => (int)specialCase == (int)e.Type).ToList(); foreach (var e in effects) { switch (specialCase) { //This is the only special case so far and it only works for building structure case SpecialCaseType.PlayCardForFreeOncePerAge: if (e.Info == null || (e.Info is Age && ((Age)e.Info) != age)) { result = e; continue; } break; default: break; } } return(result); }
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); }
public void InitializeTurnData() { this.SelectedCard = null; this.ChosenAction = TurnAction.SellCard; this.specialCaseToUse = SpecialCaseType.None; this.resourcesToBorrow.Clear(); this.AdditionalInfo = null; this.CoinsLeft = this.Coins; this.tempResources.Clear(); }
/// <summary> /// Buys the selected card. /// </summary> /// <param name="card">The selected card.</param> /// <param name="player">Player buying the card.</param> /// <param name="age">The age that is being played.</param> /// <param name="specialCase">The user wants to use a special case card.</param> /// <returns></returns> private bool BuyCard(IStructureCard card, ITurnPlayer player, Age age, SpecialCaseType specialCase = SpecialCaseType.None) { bool result = TryBuyCard(card, player, age, specialCase); if (result) { LoggerHelper.Debug("Card can be bought"); unitOfWork.AddEvent(new AddCardEvent(player, card)); } return(result); }
private bool UseSpecialCase(IGamePlayer player, SpecialCaseType specialCase, Age age) { bool result = false; var effect = ValidSpecialCase(player, specialCase, age); if (effect != null) { unitOfWork.AddEvent(new EffectInfoEvent(effect, age)); result = true; } return(result); }
public AdvanceToNextSpecialCaseCard(SpecialCaseType type, CardType cardType) { Type = type; deck = cardType; }