using DominionBase.Enums; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; namespace DominionBase.Cards { public class Preset { private readonly List _Cards = new List(); public string Name { get; set; } = string.Empty; public string Sources { get { var sources = new List(Cards.Select(c => c.Source)); foreach (var cards in CardCards.Values) sources.AddRange(cards.Select(c => c.Source)); return string.Join(", ", sources.Distinct().OrderBy(s => s)); } } public IList Cards => _Cards; public SerializableDictionary> CardCards { get; } = new SerializableDictionary>(); public ColonyPlatinumSelected ColonyPlatinumSelected { get; internal set; } = ColonyPlatinumSelected.Unknown; public ShelterSelected ShelterSelected { get; internal set; } = ShelterSelected.Unknown; public Preset() { } public Preset(string name) { Name = name; } public override string ToString() { var sources = new List(Cards.Select(c => c.Source)); foreach (var cards in CardCards.Values) sources.AddRange(cards.Select(c => c.Source)); return $"{Name} - {string.Join(", ", sources.Distinct().OrderBy(s => s))}"; } } public class PresetCollection : List { private static string Filename => Path.Combine(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName), "presets.txt"); public static PresetCollection Parse() { var presets = new PresetCollection(); var allCards = CardCollection.GetAllCards(c => c.Location == Location.Kingdom || c.Location == Location.LandscapeCard); try { using (var sr = new StreamReader(Filename)) { Preset currentPreset = null; while (!sr.EndOfStream) { var line = sr.ReadLine().Trim(); if (string.IsNullOrWhiteSpace(line) || line.StartsWith("#", StringComparison.InvariantCulture)) continue; if (line.EndsWith(":", StringComparison.InvariantCulture)) { currentPreset = new Preset(line.Substring(0, line.LastIndexOf(':'))); presets.Add(currentPreset); continue; } if (line.Contains(":")) { var special = line.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); var specialKeyCard = allCards.SingleOrDefault(c => c.SpecialPresetKey == special[0].Trim()); var specialCardName = special[1].Trim(); specialKeyCard?.CheckSetup(currentPreset, specialCardName, allCards.SingleOrDefault(c => c.Name == specialCardName)); } if (line == "Use Platinum/Colony") { currentPreset.ColonyPlatinumSelected = ColonyPlatinumSelected.Yes; continue; } if (line == "Use Shelters") { currentPreset.ShelterSelected = ShelterSelected.Yes; continue; } var foundCard = allCards.SingleOrDefault(c => c.Name == line); if (foundCard != null) currentPreset.Cards.Add(foundCard); } sr.Close(); } } catch { // ignored } return presets; } } }