using DominionBase.Currencies; using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Nocturne { public class Vampire : Doom { public Vampire() : base(Categories.Night | Categories.Attack, Location.Kingdom, Traits.AffectOthers | Traits.Gainer | Traits.IncludesExtraPiles | Traits.Transformable) { BaseCost = new Cost(5); } public override void SetupSupply(IGame game, ISupply supply) { Contract.Requires(game != null, "game cannot be null"); base.SetupSupply(game, supply); Bat.SetupSupply(game); } 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); } var gainableSupplies = new SupplyCollection(player._Game.Table.TableEntities.FindAll(supply => supply.CanGain() && supply.CurrentCost <= new Coin(5) && supply.TopCard.Name != "Vampire")); var choice = new Choice(Resource.GainUpTo5, this, gainableSupplies, ChoiceOutcome.Gain, player, false); var result = player.MakeChoice(choice); if (result.Supply != null) player.Gain(result.Supply, this); var thisCard = player.InPlayAndSetAside.Contains(PhysicalCard) ? player.RetrieveCardFrom(DeckLocation.InPlayAndSetAside, PhysicalCard) : null; if (thisCard != null) { // Exchanging isn't a gain, so treat it specially var exchangeFromSupply = player._Game.Table.FindSupplyPileByType(thisCard.BaseType, true); player.Lose(thisCard); exchangeFromSupply.AddTo(thisCard); var exchangeToSupply = player._Game.Table.FindSupplyPileByType(TypeClass.Bat, true); var exchangeToCard = exchangeToSupply.Take(TypeClass.Bat); player.AddCardInto(DeckLocation.Discard, exchangeToCard); exchangeToCard.ReceivedBy(player); player._Game.SendMessage(player, this, thisCard, exchangeToCard); } } } }