/// <summary> /// Parser for .definition files, constructor parses all .definition files in Definitions folder /// </summary> public DefinitionParser(Regex searchPattern) { instance = this; DirectoryInfo d = new DirectoryInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "Definitions"); FileInfo[] filesPresent = d.GetFiles("*.definition", SearchOption.AllDirectories).Where(path => searchPattern.IsMatch(path.Name)).ToArray(); if (filesPresent.Length == 0) { throw new CustomException("Your program is missing voice recognition strings! Either redownload, or create your own *.definition text file."); } List <int> Mob_indexes = new List <int>(); List <DefinitionParserData> definitions = new List <DefinitionParserData>(); for (int i = 0; i < filesPresent.Length; i++) { if (filesPresent[i].Name.StartsWith("Mob_")) { Mob_indexes.Add(i); continue; } using (StreamReader s = filesPresent[i].OpenText()) { DefinitionParserData data = new DefinitionParserData(filesPresent[i].Name.Split('.')[0], ParseHeader(s), ParseEntries(s)); data.ConstructGrammar(); definitions.Add(data); } } getDefinitions = definitions.ToArray(); if (Mob_indexes.Count != 0) { getMobDefinitions = new MobParserData().Parse(d); for (int i = 0; i < getMobDefinitions.Length; i++) { for (int j = 0; j < getDefinitions.Length; j++) { if (getMobDefinitions[i].ID == "Mob_" + getDefinitions[j].ID) { getDefinitions[j].hasEnemyCompanionGrammar = true; } } } } }
/// <summary> /// Parses all mob files that exists in current folder /// </summary> public MobParserData[] Parse(DirectoryInfo dir) { List <MobParserData> dataList = new List <MobParserData>(); List <Enemy> mobs = new List <Enemy>(); FileInfo[] mobFiles = dir.GetFiles("Mob_*.definition"); for (int i = 0; i < mobFiles.Length; i++) { using (StreamReader sr = mobFiles[i].OpenText()) { MobParserData data = new MobParserData() { ID = mobFiles[i].Name.Split('.')[0], }; while (!sr.EndOfStream) { string line = sr.ReadLine(); if (string.IsNullOrWhiteSpace(line) || line.StartsWith("#")) { continue; } string[] split = line.Split(','); string[] same = split[0].Split('/'); for (int j = 0; j < same.Length; j++) { same[j] = same[j].Trim(' '); } for (int k = 0; k < split.Length; k++) { split[k] = split[k].Trim(' '); } Enemy parsed = new Enemy(same[0], same.Where(a => a != same[0]).ToArray(), ushort.Parse(split[1]), GetAsociatedDrops(same[0]), ParseClass(split[2])); mobs.Add(parsed); } data.enemies = mobs.ToArray(); data.grammar = ConstructGrammar(data.enemies); dataList.Add(data); } } return(dataList.ToArray()); }