using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Effects; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Dominion.NET_WPF { /// /// Interaction logic for CardCollectionControl.xaml /// public partial class CardCollectionControl : UserControl { private IEnumerable _CardPile = null; private int _GlowSize = 20; private String _PileName = "Pile Name"; private DominionBase.Players.PhaseEnum _PlayerPhase = DominionBase.Players.PhaseEnum.Waiting; private DominionBase.Cards.Card _ClickedCard = null; private Boolean _IsClickable = false; public CardCollectionControl() { InitializeComponent(); this.CardSize = NET_WPF.CardSize.Medium; this.IsClickable = false; wpCardCollections.Margin = new Thickness(_GlowSize / 2, _GlowSize / 2, _GlowSize / 2, 0); } public DominionBase.Cards.Card ClickedCard { get { return _ClickedCard; } } public Boolean ExactCount { get; set; } public Boolean IsCardsVisible { get; set; } public Boolean IsClickable { get { return _IsClickable; } set { _IsClickable = value; foreach (Controls.CardStackControl csc in wpCardCollections.Children.OfType()) csc.IsClickable = value; } } public Boolean IsDisplaySorted { get; set;} public Boolean IsVPsVisible { get; set; } public CardSize CardSize { get; set; } public IEnumerable Pile { private get { return _CardPile; } set { _CardPile = value; UpdateCardDisplay(); } } public DominionBase.Piles.Visibility PileVisibility { get { if (this.Pile is DominionBase.Piles.Pile) return (this.Pile as DominionBase.Piles.Pile).Visibility; else return DominionBase.Piles.Visibility.All; } } private int PileCount { get { if (this.Pile is DominionBase.Piles.Pile) return (this.Pile as DominionBase.Piles.Pile).Count; else return this.Pile.Count(); } } private DominionBase.Cards.Card PileFirst { get { if (this.Pile is DominionBase.Piles.Pile) return (this.Pile as DominionBase.Piles.Pile).First(); else return this.Pile.First(); } } public String PileName { get { return _PileName; } set { _PileName = value; UpdateCardDisplay(); } } private void UpdateCardDisplay() { wpCardCollections.Children.Clear(); nPileName.Content = PileName; if (String.IsNullOrEmpty(this.PileName)) nPileName.Visibility = System.Windows.Visibility.Collapsed; else nPileName.Visibility = System.Windows.Visibility.Visible; if (ExactCount && this.Pile != null && this.PileCount > 0) { lCount.Visibility = System.Windows.Visibility.Visible; lCount.Content = String.Format("({0} Card{1})", this.PileCount, this.PileCount == 1 ? "" : "s"); } else { lCount.Visibility = System.Windows.Visibility.Collapsed; } foreach (DominionBase.Cards.CardCollection cardStack in GenerateCardStacks()) { Controls.CardStackControl csc = new Controls.CardStackControl(); csc.CardSize = this.CardSize; csc.ExactCount = this.ExactCount; csc.IsCardsVisible = this.IsCardsVisible; csc.Phase = this._PlayerPhase; csc.PileVisibility = this.PileVisibility; csc.CardCollection = cardStack; if (this.IsVPsVisible && ( (cardStack[0].Category & DominionBase.Cards.Category.Victory) == DominionBase.Cards.Category.Victory || (cardStack[0].Category & DominionBase.Cards.Category.Curse) == DominionBase.Cards.Category.Curse)) csc.CountVPs(this.Pile); else csc.HideVPs(); wpCardCollections.Children.Add(csc); } InvalidateVisual(); } public DominionBase.Players.PhaseEnum Phase { set { _PlayerPhase = value; foreach (Controls.CardStackControl csc in wpCardCollections.Children.OfType()) csc.Phase = value; } } private List GenerateCardStacks() { List cardStacks = new List(); if (this.Pile == null || this.PileCount == 0) return cardStacks; int count; switch (this.PileVisibility) { case DominionBase.Piles.Visibility.All: IEnumerable cards = this.Pile; if (this.IsDisplaySorted) cards = this.Pile.OrderBy(c => c.Name); foreach (DominionBase.Cards.Card card in cards) { Type cardT = IsCardsVisible ? card.CardType : typeof(object); if (cardStacks.Count == 0 || !card.IsStackable || (IsCardsVisible && cardStacks[cardStacks.Count - 1][0].CardType != cardT)) cardStacks.Add(new DominionBase.Cards.CardCollection()); cardStacks[cardStacks.Count - 1].AddRange(card.CardStack()); } break; case DominionBase.Piles.Visibility.Top: if (this.PileCount > 0) { cardStacks.Add(new DominionBase.Cards.CardCollection()); count = this.PileCount - 1; if (!this.ExactCount && count > 1) { Double variance = DominionBase.Utilities.Gaussian.NextGaussian(); count = count + (int)(variance * (count / 4.0)); } for (int index = 0; index < count; index++) cardStacks[0].Add(new DominionBase.Cards.Universal.Dummy()); cardStacks[0].Add(this.PileFirst); } break; case DominionBase.Piles.Visibility.None: if (this.PileCount > 0) { cardStacks.Add(new DominionBase.Cards.CardCollection()); count = this.PileCount; if (!this.ExactCount && count > 1) { Double variance = DominionBase.Utilities.Gaussian.NextGaussian(); count = count + (int)(variance * (count / 4.0)); } for (int index = 0; index < count; index++) cardStacks[0].Add(new DominionBase.Cards.Universal.Dummy()); } break; } return cardStacks; } } }