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 Wish : Card { public const int BaseCount = 12; public Wish() : base(Categories.Action, Source.Nocturne, Location.Special, Traits.PlusAction | Traits.Gainer) { BaseCost = new Cost(0, special: true); Benefit.Actions = 1; } public static void SetupSupply(IGame game) { Contract.Requires(game != null, "game cannot be null"); if (!game.Table.SpecialPiles.ContainsKey(TypeClass.Wish)) { var supply = new Supply(game, game.Players, TypeClass.Wish, BaseCount); supply.FullSetup(); game.Table.SpecialPiles.Add(TypeClass.Wish, supply); } } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var thisCard = player.InPlayAndSetAside.Contains(PhysicalCard) ? player.RetrieveCardFrom(DeckLocation.InPlayAndSetAside, PhysicalCard) : null; if (thisCard != null) { var returnSupply = player._Game.Table.FindSupplyPileByType(thisCard.BaseType, true); player.Lose(thisCard); returnSupply.AddTo(thisCard); player._Game.SendMessage(player, this, "Return", thisCard); var gainableSupplies = new SupplyCollection(player._Game.Table.TableEntities.FindAll(supply => supply.CanGain() && supply.CurrentCost <= new Coin(6))); var choice = new Choice(Resource.GainUpTo6, this, gainableSupplies, ChoiceOutcome.Gain, player, false); var result = player.MakeChoice(choice); if (result.Supply != null) player.Gain(result.Supply, this, DeckLocation.Hand); } } } }