using DominionBase; using DominionBase.Cards; using DominionBase.Enums; using DominionBase.Interfaces; using DominionBase.Players; using DominionBase.Utilities; using System.Collections.Generic; using System.Collections.Specialized; using System.Windows.Controls; namespace Dominion.NET_WPF { /// /// Interaction logic for ShuffleablePileControl.xaml /// public partial class ShuffleablePileControl : UserControl { private CardSize _cardSize = CardSize.Text; private IShuffleablePile _cardPile = null; private const int GlowSize = 20; private string _pileName = "Pile Name"; private Player _player; private PhaseEnum _playerPhase = PhaseEnum.Action; private PlayerMode _playerMode = PlayerMode.Waiting; private bool _isClickable; public ShuffleablePileControl() { InitializeComponent(); CardSize = CardSize.Medium; IsClickable = false; var gs = GlowSize/2d; //wpCardCollections.Margin = new Thickness(gs, gs, gs, 0); //wpCardCollections2.Margin = new Thickness(gs, gs, gs, 0); } public ITableable ClickedCard { get; } = null; public bool IsClickable { get { return _isClickable; } set { _isClickable = value; cscDrawPile.IsClickable = cscDiscardPile.IsClickable = value; //foreach (var csc in wpCardCollections.Children.OfType()) // csc.IsClickable = value; //foreach (var csc in wpCardCollections2.Children.OfType()) // csc.IsClickable = value; } } public CardSize CardSize { get { return _cardSize; } set { _cardSize = value; UpdateCardDisplay(); } } public IShuffleablePile Pile { get { return _cardPile; } set { _cardPile = value; UpdateCardDisplay(); } } public string PileName { get { return _pileName; } set { _pileName = value; UpdateCardDisplay(); } } public void UpdateCardDisplay() { //wpCardCollections.Children.Clear(); //wpCardCollections2.Children.Clear(); //wpToolTipCards.Children.Clear(); nPileName.Content = PileName; var drawPile = new List(); if (Pile?.DrawCount == 0) drawPile.Add(new DominionBase.Cards.Universal.Blank()); else for (int i=0; i< Pile?.DrawCount; i++) drawPile.Add(Pile.CardBack == CardBack.Red ? (Card)new DominionBase.Cards.Universal.DummyRed() : new DominionBase.Cards.Universal.Dummy()); cscDrawPile.CardCollection = drawPile; cscDiscardPile.CardCollection = new List { Pile?.TopDiscard ?? new DominionBase.Cards.Universal.Blank() }; if (false) //CardSize == CardSize.Full && _cardPile != null && _cardPile.DrawCount > 0) { // Not sure what this is used for currently //foreach (var card in _cardPile) //{ // var ttd = new ToolTipIDisplayable // { // Card = card, // Margin = new Thickness(3) // }; // wpToolTipCards.Children.Add(ttd); //} } else { if (_cardPile != null && _cardPile.DrawCount > 0) { lCount.Visibility = System.Windows.Visibility.Visible; lCount.Content = $"({StringUtility.Plural("Card", _cardPile.DrawCount, true)})"; } else { lCount.Visibility = System.Windows.Visibility.Collapsed; } //var currentWrapPanel = wpCardCollections; //foreach (var cardStack in GenerateCardStacks()) //{ // var csc = new Controls.CardStackControl { // MinWidth = MinStackWidth, // Foreground = Foreground, // CardSize = CardSize, // ExactCount = ExactCount, // IsCardsVisible = IsCardsVisible, // Player = Player, // Phase = Phase, // PlayerMode = PlayerMode, // PileVisibility = PileVisibility, // CardCollection = cardStack // }; // if (TokenDict != null && TokenDict.ContainsKey(cardStack[0])) // csc.Tokens = TokenDict[cardStack[0]]; // if (IsVPsVisible && ( // cardStack[0].Category.HasFlag(Category.Victory) // || cardStack[0].Category.HasFlag(Category.Curse) // || cardStack[0].Category.HasFlag(Category.Landmark) // )) // csc.CountVPs(Pile); // else // csc.HideVPs(); // if (SplitAt != null && csc.CardCollection.Any() && SplitAt(csc.CardCollection.First())) // currentWrapPanel = wpCardCollections2; // currentWrapPanel.Children.Add(csc); //} } InvalidateVisual(); } public Player Player { private get { return _player; } set { _player = value; cscDrawPile.Player = cscDiscardPile.Player = value; //foreach (var csc in wpCardCollections.Children.OfType()) // csc.Player = value; } } public PhaseEnum Phase { private get { return _playerPhase; } set { _playerPhase = value; cscDrawPile.Phase = cscDiscardPile.Phase = value; // foreach (var csc in wpCardCollections.Children.OfType()) //csc.Phase = value; } } public PlayerMode PlayerMode { private get { return _playerMode; } set { _playerMode = value; cscDrawPile.PlayerMode = cscDiscardPile.PlayerMode = value; // foreach (var csc in wpCardCollections.Children.OfType()) //csc.PlayerMode = value; } } private IEnumerable GenerateCardStacks() { var cardStacks2 = new OrderedDictionary(); var cardStacks = new List(); //if (Pile == null || PileCount == 0) //{ // if (DisplayEmptyPile) // cardStacks.Add(new DisplayableCollection() { new DominionBase.Cards.Universal.Blank() }); // return cardStacks; //} //int count; //switch (PileVisibility) //{ // case DominionBase.Piles.Visibility.All: // IEnumerable copy = new DisplayableCollection(Pile); // if (IsDisplaySorted) // { // copy = copy.OrderBy(c => c.Name).ThenByDescending(c => (c as IPoints)?.GetVictoryPoints(Player, Pile.OfType()) ?? 0); // } // foreach (var card in copy) // { // var key1 = IsCardsVisible ? (card.IsStackable ? card.Type.ToString() : card.UniqueId.ToString()) : string.Empty; // var vps = IsCardsVisible && card.IsStackable && card is IPoints ? ((IPoints)card).GetVictoryPoints(Player, Pile.OfType()) : 0; // var key = new Tuple(key1, vps); // if (!cardStacks2.Contains(key)) // cardStacks2[key] = new DisplayableCollection(); // ((DisplayableCollection)cardStacks2[key]).AddRange(card.Stack()); // } // cardStacks.AddRange(cardStacks2.Values.OfType()); // break; // case DominionBase.Piles.Visibility.Top: // if (PileCount > 0) // { // cardStacks.Add(new DisplayableCollection()); // count = PileCount - 1; // if (!ExactCount && count > 1) // { // var variance = Gaussian.NextGaussian(); // count = count + (int)(variance * (count / 4.0)); // } // for (var index = 0; index < count; index++) // cardStacks[0].Add(DominionBase.Cards.Universal.Utility.GenerateCardBack(CardBack.Standard)); // var card = Pile.First() as Card; // if (card != null) // cardStacks[0].Add(card); // } // break; // case DominionBase.Piles.Visibility.None: // if (PileCount > 0) // { // cardStacks.Add(new DisplayableCollection()); // count = PileCount; // if (!ExactCount && count > 1) // { // var variance = Gaussian.NextGaussian(); // count = count + (int)(variance * (count / 4.0)); // } // for (var index = 0; index < count; index++) // cardStacks[0].Add(DominionBase.Cards.Universal.Utility.GenerateCardBack(CardBack.Standard)); // } // break; //} return cardStacks; } internal Control FindGameObject(IGameObject gameObject) { return cscDiscardPile.FindGameObject(gameObject); //return wpCardCollections.Children.OfType().Select(csc => csc.FindGameObject(gameObject)).FirstOrDefault(fe => fe != null); } } }