using DominionBase.Enums; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Nocturne { public class Skulk : Doom { public Skulk() : base(Categories.Action | Categories.Attack, Location.Kingdom, Traits.AffectOthers | Traits.Gainer | Traits.PlusBuy | Traits.ReactToGain | Traits.Terminal) { BaseCost = new Cost(4); Benefit.Buys = 1; } 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, Players.CardGainEventArgs e) { var player = sender as IPlayer; var key = TypeClass.Skulk.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 Players.CardGainResolver(player, this, "GainGold", "Gain a Gold", Player_GainSkulk, true); } internal void Player_GainSkulk(IPlayer player, ref Players.CardGainEventArgs e) { player.Gain(player._Game.Table.Gold, this); e.HandledBy.Add(this); } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var hexPile = (IHexSupply)player._Game.Table.SpecialPiles[TypeClass.Hexes]; var hexTurnedOver = hexPile.TurnOverNext(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; if (hexTurnedOver) ((IHex)hexPile.TopDiscard).Receive(attackee); } } } }