using System; using System.Collections.Generic; using System.Diagnostics.Contracts; namespace DominionBase.Cards { public class CardMovement { public Card Card { get; } public Players.DeckLocation CurrentLocation { get; } public Players.DeckLocation Destination { get; set; } public Piles.DeckPosition DestinationDeckPosition { get; set; } = Piles.DeckPosition.Automatic; public CardMovement(Card card, Players.DeckLocation currentLocation, Players.DeckLocation destination) { Card = card; CurrentLocation = currentLocation; Destination = destination; } public override string ToString() { return $"Moving {Card}: {CurrentLocation} -> {Destination} ({DestinationDeckPosition})"; } } public class CardMovementCollection : List { public CardMovementCollection() { } public CardMovementCollection(int capacity) : base(capacity) { } public CardMovementCollection(IEnumerable collection) : base(collection) { } public CardMovementCollection(Piles.CardPile pile, Players.DeckLocation currentLocation, Players.DeckLocation destination) { AddRange(pile, c => true, currentLocation, destination); } public CardMovementCollection(Piles.CardPile pile, Predicate predicate, Players.DeckLocation currentLocation, Players.DeckLocation destination) { AddRange(pile, predicate, currentLocation, destination); } public void AddRange(Piles.CardPile pile, Players.DeckLocation currentLocation, Players.DeckLocation destination) { AddRange(pile, c => true, currentLocation, destination); } public void AddRange(Piles.CardPile pile, Predicate predicate, Players.DeckLocation currentLocation, Players.DeckLocation destination) { Contract.Requires(pile != null, "pile cannot be null"); foreach (var card in pile[predicate]) Add(new CardMovement(card, currentLocation, destination)); } public bool Contains(Card card) { return Exists(cm => cm.Card == card); } public CardMovement this[Card card] { get { return Find(cm => cm.Card == card); } } public void MoveToEnd(Card card) { if (!Contains(card)) throw new KeyNotFoundException($"Cannot find card {card}"); var cm = this[card]; Remove(cm); Add(cm); } } }