using DominionBase.Enums; using DominionBase.Players; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Renaissance { public class FlagBearer : Card { public FlagBearer() : base(Categories.Action, Source.Renaissance, Location.Kingdom, Traits.PlusCoin | Traits.ReactToGain | Traits.ReactToTrashing | Traits.Terminal) { BaseCost = new Cost(4); Benefit.Currency.Coin.Value = 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; player.Trashed += Player_Trashed; } } 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; player.Trashed -= Player_Trashed; } } private void Player_CardGained(object sender, CardGainEventArgs e) { var player = sender as IPlayer; var key = Type.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, "TakeFlag", "Take the Flag", Player_GainFlagBearer, true); } private void Player_Trashed(object sender, TrashEventArgs e) { // Already being processed or been handled -- don't need to process this one if (e.Resolvers.ContainsKey(Type) || e.HandledBy.Contains(this)) return; if (e.TrashedCards.Contains(PhysicalCard)) e.Resolvers[Type] = new TrashResolver(e.CurrentPlayer, this, "Take the Flag", Player_TrashFlagBearer, true); } internal void Player_GainFlagBearer(IPlayer player, ref CardGainEventArgs e) { GainOrTrashBenefit(player); e.HandledBy.Add(this); } internal void Player_TrashFlagBearer(IPlayer player, ref TrashEventArgs e) { GainOrTrashBenefit(player); e.HandledBy.Add(this); } private void GainOrTrashBenefit(IPlayer player) { player.Take(TypeClass.Flag); } } }