using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace Mapper { public class Pathfinder_Name : Pathfinder { public Pathfinder_Name(NameTypes t, params string[] Names) : base() { nt = t; _names = Names; if((t & NameTypes.Regex) != NameTypes.None) { _regexString = new Regex[Names.Length]; for(int i = 0; i < Names.Length; i++) { if(string.IsNullOrEmpty(Names[i])) continue; try { _regexString[i] = new Regex(Names[i], (t & NameTypes.CaseInsensitive) != NameTypes.None ? RegexOptions.IgnoreCase : RegexOptions.None); } catch { // User entered invalid regex pattern } } } else if((t & NameTypes.CaseInsensitive) != NameTypes.None) { for(int i = 0; i < _names.Length; i++) _names[i] = _names[i].ToLower(); } } private readonly Regex[] _regexString; private readonly string[] _names; private readonly NameTypes nt; public override bool IsTargetRoom(Room r) { if(string.IsNullOrEmpty(r.Name)) return false; if((nt & NameTypes.Regex) != NameTypes.None) { foreach(Regex x in _regexString) { if(x == null) continue; if(x.Match(r.Name).Success) return true; } } else { string rname = r.Name; if((nt & NameTypes.CaseInsensitive) != NameTypes.None) rname = rname.ToLower(); foreach(string x in _names) { if((nt & NameTypes.Partial) != NameTypes.None) { if(rname.Contains(x)) return true; } else if(rname == x) return true; } } return false; } } [Flags] public enum NameTypes { /// /// Exact name search. Room name must match what you entered and case sensitive. /// None = 0, /// /// Room name must contain the string you entered. This setting is ignored if you set regex option. /// Partial = 1, /// /// Room name vs. what you entered is not case sensitive. /// CaseInsensitive = 2, /// /// You entered a regex string which must match room name. /// Regex = 4, } }