using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Menagerie { public class BlackCat : Card { public BlackCat() : base(Categories.Action | Categories.Attack | Categories.Reaction, Source.Menagerie, Location.Kingdom, Traits.NetCardDraw | Traits.PlusCard | Traits.PlusCurses | Traits.ReactToGain | Traits.Terminal) { BaseCost = new Cost(2); Benefit.Cards = 2; } 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; } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); // If it's not our turn, Curse everyone else if (player._Game.ActivePlayer != player) { var enumerator = player._Game.GetPlayersStartingWithEnumerator(player); enumerator.MoveNext(); while (enumerator.MoveNext()) { var attackee = enumerator.Current; // Skip if the attack is blocked (Moat, Lighthouse, etc.) if (IsAttackBlocked[attackee]) continue; attackee.Gain(player._Game.Table.Curse, this); } } } public override void AddedTo(DeckLocation location, IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.AddedTo(location, player); if (location == DeckLocation.Hand) { var enumerator = player._Game.GetPlayersStartingWithEnumerator(player); while (enumerator.MoveNext()) { enumerator.Current.CardGained -= Player_CardGained; if (enumerator.Current != player) enumerator.Current.CardGained += Player_CardGained; } } } private void Player_CardGained(object sender, CardGainEventArgs e) { var player = sender as IPlayer; var key = Type.ToString(); // Already been cancelled -- don't need to process this one if (e.Cancelled || e.Resolvers.ContainsKey(key) || player == Owner || !e.Card.Category.HasFlag(Categories.Victory) || e.HandledBy.Contains(this)) return; // This needs to be "Owner" & not "sender"/"player" because it's in reaction to // someone else gaining the Victory card e.Resolvers[key] = new CardGainResolver(Owner, this, "PlayCard", Resource.PlayCard.Replace("{card}", PhysicalCard.ToString()), Player_Action, false); } internal void Player_Action(IPlayer player, ref CardGainEventArgs e) { if (player.Hand.Contains(PhysicalCard)) { player.Actions++; player.PlayCard(PhysicalCard, DeckLocation.InPlay); e.HandledBy.Add(this); } } public override void RemovedFrom(DeckLocation location, IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.RemovedFrom(location, player); foreach (var otherPlayer in player._Game.Players) otherPlayer.CardGained -= Player_CardGained; } } }