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