using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Menagerie { public class Livery : Card { private int _numberOfTriggers = 0; public Livery() : base(Categories.Action, Source.Menagerie, Location.Kingdom, Traits.Gainer | Traits.IncludesExtraPiles | Traits.PlusCoin | Traits.ReactToGain | Traits.Terminal) { BaseCost = new Cost(5); Benefit.Currency.Coin.Value = 3; } public override void SetupSupply(IGame game, ISupply supply) { Contract.Requires(game != null, "game cannot be null"); base.SetupSupply(game, supply); Horse.SetupSupply(game); } public override void TearDown(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.TearDown(game); foreach (var player in game.Players) Player_TurnEnded(player, new TurnEndedEventArgs(player)); } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); _numberOfTriggers++; player.CardGained += Player_CardGained; if (_numberOfTriggers == 1) player.TurnEnded += Player_TurnEnded; } private void Player_CardGained(object sender, Players.CardGainEventArgs e) { var player = sender as IPlayer; var key = Type.ToString(); var o = ModifiedBy; while (o != null) { key += $".{o.Type}"; o = o.ModifiedBy; } using (var cost = new Cost(4)) // This is not the card you are looking for if (!(player._Game.ComputeCost(e.Card) >= cost) || e.Cancelled || e.Resolvers.ContainsKey(key) || player != Owner // Already handled all the triggers for this card that we should || e.HandledBy.Count(hb => hb == this) >= _numberOfTriggers ) return; e.Resolvers[key] = new CardGainResolver(player, this, "GainHorse", Resource.GainHorse, Player_GainHorse, true); } internal void Player_GainHorse(IPlayer player, ref Players.CardGainEventArgs e) { player.Gain((ISupply)player._Game.Table.SpecialPiles[TypeClass.Horse], this); e.HandledBy.Add(this); } private void Player_TurnEnded(object sender, TurnEndedEventArgs e) { for (var i = 0; i < _numberOfTriggers; i++) e.Player.CardGained -= Player_CardGained; e.Player.TurnEnded -= Player_TurnEnded; _numberOfTriggers = 0; } public override void PerformEndgameCalculations(IPlayer player, PointsCollection collection) { Contract.Requires(player != null, "player cannot be null"); Player_TurnEnded(player, new TurnEndedEventArgs(player)); } } }