using DominionBase.Enums; using DominionBase.Players; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Renaissance { public class Canal : Project { public Canal() : base(Source.Renaissance, 7, Traits.ModifyCost) { } public override void TearDown(IGame game) { foreach (var tsp in PurchasedPlayers) { tsp.TurnStarted -= Player_TurnStarted; tsp.TurnEnded -= Player_TurnEnded; } base.TearDown(game); } public override void Bought(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.Bought(player); var tsp = PurchasedPlayers.Find(p => p == player); if (tsp != null) { tsp.TurnStarted -= Player_TurnStarted; tsp.TurnEnded -= Player_TurnEnded; } else { PurchasedPlayers.Add(player); var tsea = new TurnStartedEventArgs(player); Player_Action(player, ref tsea); } player.TurnStarted += Player_TurnStarted; player.TurnEnded += Player_TurnEnded; } private void Player_TurnStarted(object sender, TurnStartedEventArgs e) { var key = ToString(); if (e.HandledBy.Contains(key)) return; if (!e.Resolvers.ContainsKey(key)) e.Resolvers[key] = new TurnStartedResolver(e.Player, this, $"Resolve {this}", Player_Action, true); } private void Player_TurnEnded(object sender, TurnEndedEventArgs e) { ((IPlayer)sender)._Game.CostCompute -= Player_Turn; } internal void Player_Action(IPlayer player, ref TurnStartedEventArgs e) { player._Game.CostCompute += Player_Turn; player._Game.SendMessage(player, this, 1); e.HandledBy.Add(ToString()); } private void Player_Turn(object sender, CostComputeEventArgs e) { if (e.Card is ICard || e.Card is ISupply) e.Cost.Coin -= 1; } } }