using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Renaissance { public class SinisterPlot : Project { public SinisterPlot() : base(Source.Renaissance, 4, Traits.PlusCard, projectMarker: TypeClass.SinisterPlotMarker) { } public override void TearDown(IGame game) { foreach (var tsp in PurchasedPlayers) tsp.TurnStarted -= Player_TurnStarted; 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; else PurchasedPlayers.Add(player); player.TurnStarted += Player_TurnStarted; } private void Player_TurnStarted(object sender, TurnStartedEventArgs e) { if (e.HandledBy.Contains(Type)) return; var key = ToString(); if (!e.Resolvers.ContainsKey(key)) e.Resolvers[key] = new TurnStartedResolver(e.Player, this, $"Resolve {this}", Player_Action, true); } internal void Player_Action(IPlayer player, ref TurnStartedEventArgs e) { var token = Tokens.OfType().FirstOrDefault(spm => spm.Owner == player); // I don't think this should ever happen if (token == null) AddToken(new SinisterPlotMarker(player)); var tokenCount = token.TokenCount; var addTokenOption = $"Add token to {this}"; var choice = new Choice(Resource.ChooseOne, this, this, new List { addTokenOption, $"+{tokenCount}Card and remove all tokens" }, player); var result = player.MakeChoice(choice); if (result.Options.Contains(addTokenOption)) { token.TokenCount++; player._Game.SendMessage(player, this, "AddToken", tokenCount); } else { token.TokenCount = 0; player._Game.SendMessage(player, this, "RemoveAllTokens"); player.ReceiveBenefit(this, new CardBenefit { Cards = tokenCount }); } RefreshToken(token); e.HandledBy.Add(Type); } } }