using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Nocturne { public class GhostTown : Card { private IPlayer _turnStartedPlayer; public GhostTown() : base(Categories.Night | Categories.Duration, Source.Nocturne, Location.Kingdom, Traits.PlusAction | Traits.PlusCard | Traits.ReactToGain) { BaseCost = new Cost(3); DurationBenefit.Cards = 1; DurationBenefit.Actions = 1; } public override void SetupCard(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.SetupCard(game); foreach (var player in game.Players) player.CardGained += Player_CardGained; } public override void TearDown(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.TearDown(game); foreach (var player in game.Players) player.CardGained -= Player_CardGained; if (_turnStartedPlayer != null) _turnStartedPlayer.TurnStarted -= Player_TurnStarted; _turnStartedPlayer = null; } private void Player_CardGained(object sender, Players.CardGainEventArgs e) { var player = sender as IPlayer; var key = TypeClass.GhostTown.ToString(); // This is not the card you are looking for if (e.Card != this || e.Resolvers.ContainsKey(key) || e.HandledBy.Contains(this)) return; e.Resolvers[key] = new CardGainResolver(player, this, "PutIntoHand", $"Put {PhysicalCard} into your hand", Player_GainGhostTown, true); } internal void Player_GainGhostTown(IPlayer player, ref Players.CardGainEventArgs e) { e.Cancelled = true; e.IsLostTrackOf = true; e.Location = DeckLocation.Hand; e.HandledBy.Add(this); } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); CanCleanUpPlayed.Add(false); _turnStartedPlayer = player; _turnStartedPlayer.TurnStarted += Player_TurnStarted; } private void Player_TurnStarted(object sender, TurnStartedEventArgs e) { var key = ToString(); if (!e.Resolvers.ContainsKey(key)) e.Resolvers[key] = new TurnStartedResolver(e.Player, this, Resource.ResolveCard.Replace("{card}", PhysicalCard.ToString()), Player_Action, true); } internal void Player_Action(IPlayer player, ref TurnStartedEventArgs e) { ResolveDuration(e.Player); CanCleanUpPlayed.Remove(false); e.Player.TurnStarted -= Player_TurnStarted; _turnStartedPlayer = null; } } }