using DominionBase.Enums; using DominionBase.Players; using System.Collections.Generic; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Renaissance { public class RoadNetwork : Project { private readonly Dictionary> purchasedPlayers = new Dictionary>(); public RoadNetwork() : base(Source.Renaissance, 5, Traits.AffectOthers | Traits.ReactToGain | Traits.PlusCard) { } public override void TearDown(IGame game) { foreach (var player in purchasedPlayers) player.Key.CardGained -= Player_CardGained; base.TearDown(game); } public override void Bought(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.Bought(player); PurchasedPlayers.Add(player); var others = player._Game.GetPlayersStartingWithEnumerator(player); others.MoveNext(); while (others.MoveNext()) { if (!purchasedPlayers.ContainsKey(others.Current)) { purchasedPlayers[others.Current] = new List(); others.Current.CardGained += Player_CardGained; } purchasedPlayers[others.Current].Add(player); } } private void Player_CardGained(object sender, CardGainEventArgs e) { var gainPlayer = sender as IPlayer; if (e.HandledBy.Contains(TypeClass.RoadNetwork) || !e.Card.Category.HasFlag(Categories.Victory) || !purchasedPlayers.ContainsKey(gainPlayer) ) return; foreach (var player in purchasedPlayers[gainPlayer]) player.ReceiveBenefit(this, new CardBenefit { Cards = 1 }); e.HandledBy.Add(TypeClass.RoadNetwork); } } }