using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Nocturne { public class BlessedVillage : Fate { private readonly List _takenBoons = new List(); private IPlayer _turnStartedPlayer; public BlessedVillage() : base(Categories.Action, Location.Kingdom, Traits.PlusAction | Traits.PlusCard | Traits.PlusMultipleActions | Traits.ReactToGain) { BaseCost = new Cost(4); Benefit.Cards = 1; Benefit.Actions = 2; } public override void SetupCard(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.SetupCard(game); foreach (var player in game.Players) player.CardGained += Player_CardGained; } public override void TearDown(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.TearDown(game); foreach (var player in game.Players) player.CardGained -= Player_CardGained; } private void Player_CardGained(object sender, CardGainEventArgs e) { var player = sender as IPlayer; var key = TypeClass.BlessedVillage.ToString(); // This is not the card you are looking for if (e.Card != this || e.Resolvers.ContainsKey(key) || e.HandledBy.Contains(this)) return; e.Resolvers[key] = new CardGainResolver(player, this, "TakeBoon", Resource.TakeBoon, Player_GainBlessedVillage, true); } internal void Player_GainBlessedVillage(IPlayer player, ref CardGainEventArgs e) { var supply = (IBoonSupply)player._Game.Table.SpecialPiles[TypeClass.Boons]; var boon = player.TakeBoon(supply); if (boon != null) { var choice = new Choice($"Do you want to receive {boon.Name} now or at the start of your next turn?", this, boon, new List { Resource.Now, Resource.NextTurn }, player); var result = player.MakeChoice(choice); if (result.Options[0] == Resource.Now) ReceiveBoon(player, boon); else if (result.Options[0] == Resource.NextTurn) { player.TurnStarted -= Player_TurnStarted; _turnStartedPlayer = player; _turnStartedPlayer.TurnStarted += Player_TurnStarted; _takenBoons.Add(boon); } } e.HandledBy.Add(this); } private void Player_TurnStarted(object sender, TurnStartedEventArgs e) { var key = ToString(); if (!_takenBoons.Any()) return; if (!e.Resolvers.ContainsKey(key)) e.Resolvers[key] = new TurnStartedResolver(e.Player, this, $"Receive {_takenBoons.First().Name}", Player_Action, true); } internal void Player_Action(IPlayer player, ref TurnStartedEventArgs e) { ReceiveBoon(e.Player, _takenBoons.First()); e.Player.TurnStarted -= Player_TurnStarted; _turnStartedPlayer = null; if (!_takenBoons.Any()) e.HandledBy.Add(this); } private void ReceiveBoon(IPlayer player, IBoon boon) { var supply = (IBoonSupply)player._Game.Table.SpecialPiles[TypeClass.Boons]; if (boon.Receive(player)) player.ReturnBoon(supply, boon); if (_takenBoons.Contains(boon)) _takenBoons.Remove(boon); } } }