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);
}
}
}