using DominionBase.Currencies; using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using DominionBase.Properties; using System.Collections.Generic; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Renaissance { public class Inventor : Card { private IPlayer _turnEndedPlayer; private TurnEndedEventHandler _turnEndedEventHandler; private readonly List _costComputeEventHandlers = new List(); public Inventor() : base(Categories.Action, Source.Renaissance, Location.Kingdom, Traits.Gainer | Traits.ModifyCost | Traits.Terminal) { BaseCost = new Cost(4); } public override void TearDown(IGame game) { base.TearDown(game); if (_turnEndedEventHandler != null && _turnEndedPlayer != null) Player_TurnEnded(_turnEndedPlayer, new TurnEndedEventArgs(_turnEndedPlayer)); _turnEndedEventHandler = null; } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var gainableSupplies = new SupplyCollection(player._Game.Table.TableEntities.FindAll(supply => supply.CanGain() && supply.CurrentCost <= new Coin(4))); var choice = new Choice(Resource.GainUpTo4, this, gainableSupplies, ChoiceOutcome.Gain, player, false); var result = player.MakeChoice(choice); if (result.Supply != null) player.Gain(result.Supply, this); if (_turnEndedEventHandler == null) { _turnEndedPlayer = player; _turnEndedEventHandler = new TurnEndedEventHandler(Player_TurnEnded); player.TurnEnded += _turnEndedEventHandler; } _costComputeEventHandlers.Add(new CostComputeEventHandler(Player_InventorPlayed)); player._Game.CostCompute += _costComputeEventHandlers[_costComputeEventHandlers.Count - 1]; player._Game.SendMessage(player, this, 1); } private void Player_InventorPlayed(object sender, CostComputeEventArgs e) { if (e.Card is ICard || e.Card is ISupply) e.Cost.Coin -= 1; } private void Player_TurnEnded(object sender, TurnEndedEventArgs e) { var player = sender as IPlayer; if (_turnEndedEventHandler != null && _turnEndedPlayer != null) _turnEndedPlayer.TurnEnded -= _turnEndedEventHandler; _turnEndedPlayer = null; _turnEndedEventHandler = null; foreach (var cceh in _costComputeEventHandlers) player._Game.CostCompute -= cceh; _costComputeEventHandlers.Clear(); } } }