using DominionBase.Enums; using DominionBase.Players; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Nocturne { public class Envious : State { private PhaseChangingEventHandler _phaseChangingEventHandler = null; private TurnEndedEventHandler _turnEndedEventHandler; private CardPlayedEventHandler _cardPlayedEventHandler = null; public Envious() : base(Source.Nocturne, Traits.None) { } public override void TakenBy(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.TakenBy(player); _phaseChangingEventHandler = new PhaseChangingEventHandler(Player_PhaseChanging); player.PhaseChanging += _phaseChangingEventHandler; } public override void ReturnedBy(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.ReturnedBy(player); if (_phaseChangingEventHandler != null) player.PhaseChanging -= _phaseChangingEventHandler; } private void Player_PhaseChanging(object sender, PhaseChangingEventArgs e) { var player = sender as IPlayer; if (e.NewPhase != PhaseEnum.BuyTreasure || e.HandledBy.Contains(TypeClass.Envious)) return; e.Resolvers[TypeClass.Envious] = new PhaseChangingResolver(this, "Resolve Envious", Player_SetupSilverGoldRestrictions, true); } internal void Player_SetupSilverGoldRestrictions(IPlayer player, ref PhaseChangingEventArgs e) { player.Return(Type); _cardPlayedEventHandler = new CardPlayedEventHandler(Player_CardPlayed); player.CardPlayed += _cardPlayedEventHandler; if (_turnEndedEventHandler != null) player.TurnEnded -= _turnEndedEventHandler; _turnEndedEventHandler = new TurnEndedEventHandler(Player_TurnEnded); player.TurnEnded += _turnEndedEventHandler; e.HandledBy.Add(TypeClass.Envious); } public override void TearDown(IGame game) { Contract.Requires(game != null, "game cannot be null"); if (_cardPlayedEventHandler != null) foreach (var player in game.Players) player.CardPlayed -= _cardPlayedEventHandler; _cardPlayedEventHandler = null; if (_phaseChangingEventHandler != null) foreach (var player in game.Players) player.PhaseChanging -= _phaseChangingEventHandler; _phaseChangingEventHandler = null; if (_turnEndedEventHandler != null) foreach (var player in game.Players) player.TurnEnded -= _turnEndedEventHandler; _turnEndedEventHandler = null; base.TearDown(game); } private void Player_CardPlayed(object sender, CardPlayedEventArgs e) { // Not quite the same as "Silver and Gold make 1 coin this turn", but it should be accurate enough // (Famous last words) // TODO -- this should be converted to use BenefitReceiving event instead of CardPlayed var negativeCost = 0; foreach (var card in e.Cards) { if (card is Universal.Silver) negativeCost -= 1; else if (card is Universal.Gold) negativeCost -= 2; } e.Player.ReceiveBenefit(this, new CardBenefit { Currency = new Currency(negativeCost) }); } private void Player_TurnEnded(object sender, TurnEndedEventArgs e) { var player = sender as IPlayer; if (_cardPlayedEventHandler != null) player.CardPlayed -= _cardPlayedEventHandler; _cardPlayedEventHandler = null; if (_phaseChangingEventHandler != null) player.PhaseChanging -= _phaseChangingEventHandler; _phaseChangingEventHandler = null; if (_turnEndedEventHandler != null) player.TurnEnded -= _turnEndedEventHandler; _turnEndedEventHandler = null; } } }