using DominionBase.Enums; using System; using System.Collections.Generic; using System.Windows.Media; namespace Dominion.NET_WPF.Caching { public static class BrushRepository { private static readonly Dictionary, Brush> BGBrushCache = new Dictionary, Brush>(); private static readonly Dictionary, Brush> OutcomeBrushCache = new Dictionary, Brush>(); private static float GetAverageColor(Brush brush) { if ((SolidColorBrush)brush == null) return 0.5f; var c = ((SolidColorBrush)brush).Color; return (c.ScR + c.ScG + c.ScB) / 3; } public static Brush GetForegroundBrush(Categories category, bool isTrim = false, Brush backgroundBrush = null) { if (category.HasFlag(Categories.Attack) && isTrim) return Brushes.Firebrick; if (category.HasFlag(Categories.Curse) && isTrim) return Brushes.Snow; if (category.HasFlag(Categories.Night) && (!isTrim || GetAverageColor(backgroundBrush) < 0.25)) return Brushes.Snow; //if (category.HasFlag(DominionBase.Cards.Category.Event)) // return new SolidColorBrush(Color.FromRgb(226, 226, 226)); return Brushes.Black; } private static List GetBackgroundColors(Categories category, bool isTrim) { var actionOverride = false; var colors = new List(); if (category.HasFlag(Categories.Shelter)) colors.Add(Color.FromRgb(232, 98, 87)); if (category.HasFlag(Categories.Duration)) { colors.Add(Color.FromRgb(248, 119, 35)); actionOverride = true; } if (category.HasFlag(Categories.Treasure)) colors.Add(Color.FromRgb(247, 214, 98)); if (category.HasFlag(Categories.Reserve)) { colors.Add(Color.FromRgb(203, 180, 136)); actionOverride = true; } if (category.HasFlag(Categories.Victory)) colors.Add(Color.FromRgb(144, 238, 144)); if (category.HasFlag(Categories.Reaction)) { colors.Add(Color.FromRgb(64, 103, 224)); actionOverride = true; } if (category.HasFlag(Categories.Ruins)) { colors.Add(Color.FromRgb(162, 123, 23)); actionOverride = true; } if (category.HasFlag(Categories.Curse)) colors.Add(Color.FromRgb(129, 0, 127)); if (category.HasFlag(Categories.Event)) colors.Add(Color.FromRgb(226, 226, 226)); if (category.HasFlag(Categories.Landmark)) colors.Add(Color.FromRgb(82, 174, 123)); if (category.HasFlag(Categories.Boon)) colors.Add(Color.FromRgb(240, 248, 97)); if (category.HasFlag(Categories.State)) colors.Add(Color.FromRgb(226, 226, 226)); if (category.HasFlag(Categories.Hex)) colors.Add(Color.FromRgb(160, 69, 252)); if (category.HasFlag(Categories.Artifact)) colors.Add(Color.FromRgb(233, 186, 114)); if (category.HasFlag(Categories.Project)) colors.Add(Color.FromRgb(240, 172, 159)); if (category.HasFlag(Categories.Way)) colors.Add(Color.FromRgb(152, 217, 245)); if (colors.Count <= 1 && !actionOverride && category.HasFlag(Categories.Action)) { var value = isTrim ? (byte)255 : (byte)226; colors.Insert(0, Color.FromRgb(value, value, value)); } if ((!isTrim || colors.Count == 0) && category.HasFlag(Categories.Night)) { colors.Clear(); colors.Add(Color.FromRgb(35, 35, 35)); } return colors; } public static Brush GetOutcomeBrush(DominionBase.ChoiceOutcome outcome, bool isTrim = false) { var key = new Tuple(outcome, isTrim); if (!OutcomeBrushCache.ContainsKey(key)) { switch (outcome) { case DominionBase.ChoiceOutcome.Discard: OutcomeBrushCache[key] = new SolidColorBrush(isTrim ? Color.FromArgb(255, 147, 129, 54) : Color.FromArgb(255, 255, 248, 217) ); break; case DominionBase.ChoiceOutcome.Gain: OutcomeBrushCache[key] = new SolidColorBrush(isTrim ? Color.FromArgb(255, 8, 126, 8) : Color.FromArgb(255, 206, 255, 206) ); break; case DominionBase.ChoiceOutcome.Select: OutcomeBrushCache[key] = isTrim ? Brushes.Black : Brushes.Transparent; break; case DominionBase.ChoiceOutcome.Trash: OutcomeBrushCache[key] = new SolidColorBrush(isTrim ? Color.FromArgb(255, 141, 38, 38) : Color.FromArgb(255, 244, 191, 191) ); break; } } if (OutcomeBrushCache[key].CanFreeze) OutcomeBrushCache[key].Freeze(); return OutcomeBrushCache[key]; } public static Brush GetBackgroundBrush(Categories category, bool isTrim = false) { var key = new Tuple(category, isTrim); if (!BGBrushCache.ContainsKey(key)) { var colors = GetBackgroundColors(category, isTrim); switch (colors.Count) { case 0: BGBrushCache[key] = Brushes.Transparent; break; case 1: BGBrushCache[key] = new SolidColorBrush(colors[0]); break; case 2: var gs1 = new GradientStop(colors[0], 0.0); var gs2 = new GradientStop(colors[0], 0.35); var gs3 = new GradientStop(colors[1], 0.65); var gs4 = new GradientStop(colors[1], 1.0); BGBrushCache[key] = new LinearGradientBrush(new GradientStopCollection() { gs1, gs2, gs3, gs4 }, 90.0); break; default: #if DEBUG throw new NotImplementedException(); #else BGBrushCache[key] = Brushes.Transparent; break; #endif } } if (BGBrushCache[key].CanFreeze) BGBrushCache[key].Freeze(); return BGBrushCache[key]; } } }