using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;
using DominionBase;
using DominionBase.Enums;
using DominionBase.Piles;
using DominionBase.Players;
using DominionBase.Utilities;
namespace Dominion.NET_WPF.Controls
{
///
/// Interaction logic for ucPlayerDisplay.xaml
///
public partial class UcPlayerDisplay : UserControl
{
private IPlayer _player;
private bool _isActive;
private readonly Color _colorFocus = Colors.Transparent;
private ImageBrush _backgroundFocus;
private Brush _foregroundFocus;
private static readonly List Playermats = new List {
DominionBase.Cards.Seaside.TypeClass.IslandMat,
DominionBase.Cards.Seaside.TypeClass.NativeVillageMat,
DominionBase.Cards.Promotional.TypeClass.PrinceSetAside,
DominionBase.Cards.Promotional.TypeClass.SummonSetAside,
DominionBase.Cards.Adventures.TypeClass.InheritanceSetAside,
DominionBase.Cards.Adventures.TypeClass.SaveSetAside,
DominionBase.Cards.Adventures.TypeClass.TavernMat,
DominionBase.Cards.Menagerie.TypeClass.DelaySetAside,
DominionBase.Cards.Menagerie.TypeClass.ReapSetAside,
DominionBase.Cards.Menagerie.TypeClass.WayOfTheMouseSetAside,
DominionBase.Cards.Menagerie.TypeClass.WayOfTheTurtleSetAside,
DominionBase.Cards.Menagerie.TypeClass.Exile,
};
[Bindable(true)]
public bool DisplayVictoryPoints
{
get { return (bool)GetValue(DisplayVictoryPointsProperty); }
set
{
SetValue(DisplayVictoryPointsProperty, value);
UpdateVictoryPoints();
}
}
public static readonly DependencyProperty DisplayVictoryPointsProperty =
DependencyProperty.Register("DisplayVictoryPoints", typeof(bool), typeof(UcPlayerDisplay));
[Bindable(true)]
public Brush HighlightBrush
{
get { return (Brush)GetValue(HighlightBrushProperty); }
set { SetValue(HighlightBrushProperty, value); }
}
public static readonly DependencyProperty HighlightBrushProperty =
DependencyProperty.Register("HighlightBrush", typeof(Brush), typeof(UcPlayerDisplay));
public Color ColorFocus
{
get { return _colorFocus; }
set
{
var hlsValue = HlsColor.RgbToHls(value);
var colorBorder = HlsColor.HlsToRgb(hlsValue.H, hlsValue.L * 0.25, hlsValue.S * 1.05, hlsValue.A);
if (Math.Abs(hlsValue.A) < 0.001)
colorBorder = HlsColor.HlsToRgb(0d, hlsValue.L * 0.25, 0d, 1d);
HighlightBrush = new SolidColorBrush(colorBorder);
var cPlayer = HlsColor.HlsToRgb(hlsValue.H, hlsValue.L * 1.125, hlsValue.S * 0.95, hlsValue.A);
var gsc = new GradientStopCollection
{
new GradientStop(value, 0),
new GradientStop(cPlayer, 0.1),
new GradientStop(cPlayer, 0.9),
new GradientStop(value, 1)
};
gsc.Freeze();
Background = new LinearGradientBrush(gsc, 0);
var db = new DrawingBrush();
var gd = new GeometryDrawing(
new SolidColorBrush(cPlayer),
null,
new RectangleGeometry(new Rect(0, 0, 100, 100))
);
var gg = new GeometryGroup();
gg.Children.Add(new RectangleGeometry(new Rect(0, 0, 50, 50)));
gg.Children.Add(new RectangleGeometry(new Rect(50, 50, 50, 50)));
var lgb = new LinearGradientBrush();
lgb.GradientStops.Add(new GradientStop(value, 0.0));
lgb.GradientStops.Add(new GradientStop(cPlayer, 1.0));
var gd2 = new GeometryDrawing(new SolidColorBrush(value), null, gg);
var dg = new DrawingGroup();
dg.Children.Add(gd);
dg.Children.Add(gd2);
db.Drawing = dg;
db.ViewportUnits = BrushMappingMode.Absolute;
db.Viewport = new Rect(0, 0, 20, 20);
db.TileMode = TileMode.Tile;
gPlayerArea.Fill = db;
//this.Background = new SolidColorBrush(HLSColor.HlsToRgb(hlsValue.H, Math.Min(1d, hlsValue.L * 1.125), hlsValue.S * 0.95, hlsValue.A));
dpStuff.Background = new SolidColorBrush(HlsColor.HlsToRgb((hlsValue.H + 10) % 360, hlsValue.L * 0.8, hlsValue.S, hlsValue.A));
lPhaseText.Background = lPhase.Background = new SolidColorBrush(HlsColor.HlsToRgb(hlsValue.H, hlsValue.L * 0.95, hlsValue.S, hlsValue.A));
}
}
public ImageBrush BackgroundFocus
{
get { return _backgroundFocus; }
set
{
if (value == null)
{
_backgroundFocus = null;
gPlayerArea.Fill = _backgroundFocus;
}
else
{
_backgroundFocus = value; //.Clone();
_backgroundFocus.Stretch = Stretch.Fill;
_backgroundFocus.TileMode = TileMode.Tile;
_backgroundFocus.ViewportUnits = BrushMappingMode.Absolute;
_backgroundFocus.Viewport = new Rect(0, 0, _backgroundFocus.ImageSource.Height / 2, _backgroundFocus.ImageSource.Width / 2);
gPlayerArea.Fill = _backgroundFocus;
gCardTakens.Fill = _backgroundFocus;
}
}
}
public Brush ForegroundFocus
{
get { return _foregroundFocus; }
set
{
_foregroundFocus = value;
cardDiscard.Foreground = cardDeck.Foreground = cardHand.Foreground = cardInPlay.Foreground = cardSetAside.Foreground = cardRevealed.Foreground = cardPrivate.Foreground = boonTaken.Foreground = cardStates.Foreground = value;
// This might not be needed??
foreach (var ccc in dpMatsandPiles.Children.OfType())
ccc.Foreground = value;
foreach (var cmc in dpMatsandPiles.Children.OfType())
cmc.Foreground = value;
}
}
public IPlayer Player
{
get { return _player; }
set
{
if (_player != null)
{
_player.PhaseChangedFinished -= Player_PhaseChangedEvent;
_player.PlayerModeChanged -= Player_PlayerModeChangedEvent;
_player.TurnStarted -= Player_TurnStarted;
_player.TurnEnded -= Player_TurnEnded;
_player.PlayerMats.CardMatsChanged -= PlayerMats_DecksChanged;
_player.TokenPiles.TokenCollectionsChanged -= TokenPiles_TokenCollectionsChanged;
}
_player = value;
cardDiscard.Player = cardDeck.Player = cardHand.Player = cardInPlay.Player = cardSetAside.Player = cardRevealed.Player = cardPrivate.Player = cardEndgame.Player = boonTaken.Player = cardStates.Player = _player;
if (_player != null)
{
_player.PhaseChangedFinished += Player_PhaseChangedEvent;
_player.PlayerModeChanged += Player_PlayerModeChangedEvent;
_player.TurnStarted += Player_TurnStarted;
_player.TurnEnded += Player_TurnEnded;
_player.PlayerMats.CardMatsChanged += PlayerMats_DecksChanged;
_player.TokenPiles.TokenCollectionsChanged += TokenPiles_TokenCollectionsChanged;
// Fire off each event to get things rolling
Player_PhaseChangedEvent(null, new PhaseChangedEventArgs(_player, _player.Phase));
Player_PlayerModeChangedEvent(null, new PlayerModeChangedEventArgs(_player, _player.PlayerMode));
foreach (var cardMat in _player.PlayerMats.Values)
PlayerMats_DecksChanged(null, new CardMatsChangedEventArgs(cardMat, CardMatsChangedEventArgs.Operation.Reset));
foreach (var tokenPile in _player.TokenPiles.Values)
TokenPiles_TokenCollectionsChanged(null, new TokenCollectionsChangedEventArgs(tokenPile, TokenCollectionsChangedEventArgs.Operation.Reset));
}
// Force reset of IsActive
IsActive = IsActive;
}
}
public void TearDown()
{
IsActive = false;
Player = null;
}
internal Control FindGameObject(IGameObject gameObject)
{
var fe = cardDeck.FindGameObject(gameObject);
if (fe != null) return fe;
fe = cardDiscard.FindGameObject(gameObject);
if (fe != null) return fe;
fe = cardHand.FindGameObject(gameObject);
if (fe != null) return fe;
fe = cardRevealed.FindGameObject(gameObject);
if (fe != null) return fe;
fe = cardPrivate.FindGameObject(gameObject);
if (fe != null) return fe;
fe = cardInPlay.FindGameObject(gameObject);
if (fe != null) return fe;
fe = cardSetAside.FindGameObject(gameObject);
if (fe != null) return fe;
// This might not be needed??
foreach (var mat in dpMatsandPiles.Children.OfType())
{
fe = mat.FindGameObject(gameObject);
if (fe != null) return fe;
}
foreach (var mat in dpMatsandPiles.Children.OfType())
{
fe = mat.FindGameObject(gameObject);
if (fe != null) return fe;
}
fe = boonTaken.FindGameObject(gameObject);
if (fe != null) return fe;
fe = cardStates.FindGameObject(gameObject);
if (fe != null) return fe;
return null;
}
private void UpdateVictoryPoints()
{
if (DisplayVictoryPoints)
{
lVictoryPoints.Content = Player.CountVictoryPoints();
bVictoryPointsDivider.Visibility =
lVictoryPointsTitle.Visibility = lVictoryPoints.Visibility = System.Windows.Visibility.Visible;
}
else
{
bVictoryPointsDivider.Visibility =
lVictoryPointsTitle.Visibility = lVictoryPoints.Visibility = System.Windows.Visibility.Collapsed;
lVictoryPoints.Content = "?";
}
}
private void TokenPiles_TokenCollectionsChanged(object sender, TokenCollectionsChangedEventArgs e)
{
if (Dispatcher.CheckAccess())
{
Token token;
if (e.TokenCollection.Any())
token = e.TokenCollection[0];
else if (e.AddedTokens.Any())
token = e.AddedTokens[0];
else if (e.RemovedTokens.Any())
token = e.RemovedTokens[0];
else
return;
var tokenType = token.GetType();
string tokenName = $"l{tokenType.Name}";
var lTokenValue = dpTokens.Children.OfType