using System; using System.Collections.Generic; using System.Diagnostics; namespace PKHeX.Core; /// /// Batch Editing instruction /// /// /// Can be a filter (skip), or a modification instruction (modify) /// /// /// /// public sealed class StringInstruction { public string PropertyName { get; } public string PropertyValue { get; private set; } /// True if ==, false if != public bool Evaluator { get; private init; } public StringInstruction(string name, string value) { PropertyName = name; PropertyValue = value; } public void SetScreenedValue(string[] arr) { int index = Array.IndexOf(arr, PropertyValue); PropertyValue = index > -1 ? index.ToString() : PropertyValue; } public static readonly IReadOnlyList Prefixes = new[] { Apply, Require, Exclude }; private const char Exclude = '!'; private const char Require = '='; private const char Apply = '.'; private const char SplitRange = ','; /// /// Character which divides a property and a value. /// /// /// Example: /// =Species=1 /// The second = is the split. /// public const char SplitInstruction = '='; // Extra Functionality private int RandomMinimum, RandomMaximum; public bool Random { get; private set; } public int RandomValue => Util.Rand.Next(RandomMinimum, RandomMaximum + 1); public void SetRandRange(string pv) { string str = pv[1..]; var split = str.Split(SplitRange); int.TryParse(split[0], out RandomMinimum); int.TryParse(split[1], out RandomMaximum); if (RandomMinimum == RandomMaximum) { PropertyValue = RandomMinimum.ToString(); Debug.WriteLine($"{PropertyName} randomization range Min/Max same?"); } else { Random = true; } } public static IEnumerable GetFilters(IEnumerable lines) { foreach (var line in lines) { if (line.Length is 0 || line[0] is not (Exclude or Require)) continue; const int start = 1; var splitIndex = line.IndexOf(SplitInstruction, start); if (splitIndex == -1) continue; var noExtra = line.IndexOf(SplitInstruction, splitIndex + 1); if (noExtra != -1) continue; var name = line.AsSpan(start, splitIndex - start); if (name.IsWhiteSpace()) continue; bool eval = line[0] == Require; var value = line[(splitIndex + 1)..]; yield return new StringInstruction(name.ToString(), value) { Evaluator = eval }; } } public static IEnumerable GetInstructions(IEnumerable lines) { foreach (var line in lines) { if (line.Length is 0 || line[0] is not Apply) continue; const int start = 1; var splitIndex = line.IndexOf(SplitInstruction, start); if (splitIndex == -1) continue; var noExtra = line.IndexOf(SplitInstruction, splitIndex + 1); if (noExtra != -1) continue; var name = line.AsSpan(start, splitIndex - start); if (name.IsWhiteSpace()) continue; var value = line[(splitIndex + 1)..]; yield return new StringInstruction(name.ToString(), value); } } }