2018-05-18 05:43:07 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
|
|
|
|
namespace PKHeX.Core
|
|
|
|
|
{
|
|
|
|
|
public class StringInstruction
|
|
|
|
|
{
|
2018-05-19 02:19:15 +00:00
|
|
|
|
public string PropertyName { get; private set; }
|
|
|
|
|
public string PropertyValue { get; private set; }
|
|
|
|
|
public bool Evaluator { get; private set; }
|
2018-07-29 20:27:48 +00:00
|
|
|
|
|
2018-05-18 05:43:07 +00:00
|
|
|
|
public void SetScreenedValue(string[] arr)
|
|
|
|
|
{
|
|
|
|
|
int index = Array.IndexOf(arr, PropertyValue);
|
|
|
|
|
PropertyValue = index > -1 ? index.ToString() : PropertyValue;
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-03 18:28:33 +00:00
|
|
|
|
public static readonly IReadOnlyList<char> Prefixes = new[] { Apply, Require, Exclude };
|
2018-05-19 02:19:15 +00:00
|
|
|
|
private const char Exclude = '!';
|
|
|
|
|
private const char Require = '=';
|
|
|
|
|
private const char Apply = '.';
|
|
|
|
|
private const char SplitRange = ',';
|
2018-09-29 20:08:53 +00:00
|
|
|
|
public const char SplitInstruction = '=';
|
2018-05-19 02:19:15 +00:00
|
|
|
|
|
2018-05-18 05:43:07 +00:00
|
|
|
|
// Extra Functionality
|
|
|
|
|
private int Min, Max;
|
|
|
|
|
public bool Random { get; private set; }
|
|
|
|
|
public int RandomValue => Util.Rand.Next(Min, Max + 1);
|
2018-05-19 02:19:15 +00:00
|
|
|
|
|
2018-05-18 05:43:07 +00:00
|
|
|
|
public void SetRandRange(string pv)
|
|
|
|
|
{
|
|
|
|
|
string str = pv.Substring(1);
|
2018-05-19 02:19:15 +00:00
|
|
|
|
var split = str.Split(SplitRange);
|
2018-05-18 05:43:07 +00:00
|
|
|
|
int.TryParse(split[0], out Min);
|
|
|
|
|
int.TryParse(split[1], out Max);
|
|
|
|
|
|
|
|
|
|
if (Min == Max)
|
|
|
|
|
{
|
|
|
|
|
PropertyValue = Min.ToString();
|
|
|
|
|
Debug.WriteLine(PropertyName + " randomization range Min/Max same?");
|
|
|
|
|
}
|
|
|
|
|
else
|
2018-07-29 20:27:48 +00:00
|
|
|
|
{
|
2018-05-18 05:43:07 +00:00
|
|
|
|
Random = true;
|
2018-07-29 20:27:48 +00:00
|
|
|
|
}
|
2018-05-18 05:43:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static IEnumerable<StringInstruction> GetFilters(IEnumerable<string> lines)
|
|
|
|
|
{
|
2018-05-19 02:19:15 +00:00
|
|
|
|
var raw = GetRelevantStrings(lines, Exclude, Require);
|
2018-05-18 05:43:07 +00:00
|
|
|
|
return from line in raw
|
2018-05-19 02:19:15 +00:00
|
|
|
|
let eval = line[0] == Require
|
|
|
|
|
let split = line.Substring(1).Split(SplitInstruction)
|
2018-05-18 05:43:07 +00:00
|
|
|
|
where split.Length == 2 && !string.IsNullOrWhiteSpace(split[0])
|
|
|
|
|
select new StringInstruction { PropertyName = split[0], PropertyValue = split[1], Evaluator = eval };
|
|
|
|
|
}
|
2018-07-29 20:27:48 +00:00
|
|
|
|
|
2018-05-18 05:43:07 +00:00
|
|
|
|
public static IEnumerable<StringInstruction> GetInstructions(IEnumerable<string> lines)
|
|
|
|
|
{
|
2018-05-19 02:19:15 +00:00
|
|
|
|
var raw = GetRelevantStrings(lines, Apply).Select(line => line.Substring(1));
|
2018-05-18 05:43:07 +00:00
|
|
|
|
return from line in raw
|
2018-05-19 02:19:15 +00:00
|
|
|
|
select line.Split(SplitInstruction) into split
|
2018-05-18 05:43:07 +00:00
|
|
|
|
where split.Length == 2
|
|
|
|
|
select new StringInstruction { PropertyName = split[0], PropertyValue = split[1] };
|
|
|
|
|
}
|
2018-07-29 20:27:48 +00:00
|
|
|
|
|
2018-05-18 05:43:07 +00:00
|
|
|
|
private static IEnumerable<string> GetRelevantStrings(IEnumerable<string> lines, params char[] pieces)
|
|
|
|
|
{
|
|
|
|
|
return lines.Where(line => !string.IsNullOrEmpty(line) && pieces.Any(z => z == line[0]));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|