private void ParseTechnoTypes(List <TechnoType> technos, IniDictionary ini, string type, string editorName) { uint tableIndex = 0; foreach (DictionaryEntry de in ini[type]) { string id = de.Value as string; if (ini.ContainsKey(id)) { OrderedDictionary section = ini[id]; string name = id; int cost = (section.Contains("Cost")) ? int.Parse(section["Cost"] as string) : 0; if (section.Contains(editorName)) { name = section[editorName] as string; } else if (section.Contains("Name")) { name = section["Name"] as string; } name = name + " [" + id + "]"; TechnoType tt = technos.SingleOrDefault(t => t.ID == id); if (tt == null) { tt = new TechnoType(id, name, cost, tableIndex++); technos.Add(tt); } else { logger.Add("Duplicate " + type + " [" + id + "] in rules!"); } } else { tableIndex++; } } }
private AITable <TeamType> LoadTeamTypes(IniDictionary ai, List <TeamTypeOption> teamTypeOptions) { HashSet <string> ids = new HashSet <string>(); List <TeamType> items = new List <TeamType>(); OrderedDictionary aiTeamTypes = ai["TeamTypes"] as OrderedDictionary; foreach (DictionaryEntry entry in aiTeamTypes) { string id = entry.Value as string; if (id == "") { continue; } if (ids.Contains(id) || iniIDs.Contains(id)) { if (iniIDs.Contains(id)) { logger.Add("Duplicate Team [" + id + "] found in other list(s)!"); } else { logger.Add("Duplicate Team [" + id + "] found!"); } continue; } if (!ai.ContainsKey(id)) { logger.Add("Listed Team [" + id + "] does not exist!"); continue; } OrderedDictionary section = ai[id]; TeamType tt = TeamType.Parse(id, section, teamTypeOptions); items.Add(tt); ids.Add(id); } iniIDs.UnionWith(ids); return(new AITable <TeamType>("TeamTypes", items)); }
private AITable <ScriptType> LoadScriptTypes(IniDictionary ai, List <IActionType> actionTypes) { HashSet <string> ids = new HashSet <string>(); List <ScriptType> items = new List <ScriptType>(); OrderedDictionary aiScriptTypes = ai["ScriptTypes"] as OrderedDictionary; foreach (DictionaryEntry entry in aiScriptTypes) { string id = entry.Value as string; if (id == "") { continue; } if (ids.Contains(id) || iniIDs.Contains(id)) { if (iniIDs.Contains(id)) { logger.Add("Duplicate Script [" + id + "] found in other list(s)!"); } else { logger.Add("Duplicate Script [" + id + "] found!"); } continue; } if (!ai.ContainsKey(id)) { logger.Add("Listed Script [" + id + "] does not exist!"); continue; } OrderedDictionary section = ai[id]; ScriptType tf = ScriptType.Parse(id, section, actionTypes, logger); items.Add(tf); ids.Add(id); } iniIDs.UnionWith(ids); return(new AITable <ScriptType>("ScriptTypes", items)); }
private AITable <TaskForce> LoadTaskForces(IniDictionary ai, List <TechnoType> technoTypes, List <AITypeListEntry> groupTypes) { HashSet <string> ids = new HashSet <string>(); List <TaskForce> items = new List <TaskForce>(); OrderedDictionary aiTaskForces = ai["TaskForces"] as OrderedDictionary; foreach (DictionaryEntry entry in aiTaskForces) { string id = entry.Value as string; if (id == "") { continue; } if (ids.Contains(id)) { logger.Add("Duplicate Task Force [" + id + "] found!"); continue; } if (!ai.ContainsKey(id)) { logger.Add("Listed Task Force [" + id + "] does not exist!"); continue; } OrderedDictionary section = ai[id]; TaskForce tf = TaskForce.Parse(id, section, unitTypes, groupTypes, logger); items.Add(tf); ids.Add(id); } iniIDs = new HashSet <string>(); iniIDs.UnionWith(ids); return(new AITable <TaskForce>("TaskForces", items)); }
/** * New parser reads .ini into dictionary. */ public static IniDictionary ParseToDictionary(StreamReader stream, string filename, Logger logger) { IniDictionary ini = new IniDictionary(); OrderedDictionary section = null; string key, val, line; int index; int linenr = 0; string sectionKey = ""; while ((line = stream.ReadLine()) != null) { linenr++; // strip off whitespaces and comments line = line.TrimStart(); if ((index = line.IndexOf(';')) != -1) { line = line.Substring(0, index).TrimEnd(); } // skip empty lines if (line.Length == 0) { continue; } // start of section else if (line[0] == '[') { if ((index = line.IndexOf(']')) == -1) { continue; } sectionKey = line.Substring(1, index - 1); section = new OrderedDictionary(); if (!ini.ContainsKey(sectionKey)) { ini.Add(sectionKey, section); } else { logger.Add("Duplicate section [" + sectionKey + "] in " + filename + "!"); } } // key=value pair else if (section != null) { if ((index = line.IndexOf('=')) == -1) { continue; } key = line.Substring(0, index).Trim(); val = line.Substring(index + 1).Trim(); if (section.Contains(key)) { logger.Add("Duplicate tag/index [" + sectionKey + "] => " + key + " in " + filename + "!"); } section[key] = val; } } return(ini); }
private void LoadData(string rulesPath, string aiPath) { IniDictionary rules = IniParser.ParseToDictionary(rulesPath, logger); IniDictionary ai = IniParser.ParseToDictionary(aiPath, logger); IniDictionary config; string appPath = ""; string configPath = ""; appPath = System.AppDomain.CurrentDomain.BaseDirectory; configPath = appPath + "config\\ts.ini"; // autodetect yr if (rules["General"].Contains("DominatorWarhead")) { configPath = appPath + "config\\yr.ini"; } // autodetect ra2 else if (rules["General"].Contains("PrismType")) { configPath = appPath + "config\\ra2.ini"; } config = IniParser.ParseToDictionary(configPath, logger); idCounter = ID_BASE; if (config.ContainsKey("General")) { if (config["General"].Contains("StartIndex")) { try { idCounter = uint.Parse(config["General"].GetString("StartIndex"), NumberStyles.AllowHexSpecifier); } catch (Exception) { idCounter = ID_BASE; } } string idPrefixTemp = ""; string idSuffixTemp = ""; idPrefix = ""; idSuffix = "-G"; if (config["General"].Contains("IDPrefix")) { idPrefixTemp = config["General"].GetString("IDPrefix"); } if (config["General"].Contains("IDSuffix")) { idSuffixTemp = config["General"].GetString("IDSuffix"); } if (!String.IsNullOrEmpty(idPrefixTemp)) { if (Regex.IsMatch(idPrefixTemp, @"^[a-zA-Z0-9_-]+$") && idPrefixTemp.Length < 16) { idPrefix = idPrefixTemp.ToUpper(); } } if (!String.IsNullOrEmpty(idSuffixTemp)) { if (Regex.IsMatch(idSuffixTemp, @"^[a-zA-Z0-9_-]+$")) { idSuffix = idSuffixTemp.ToUpper(); } } string unitMultiEntry = ""; if (config["General"].Contains("SameUnitMultiEntry")) { unitMultiEntry = config["General"].GetString("SameUnitMultiEntry"); } if (!String.IsNullOrEmpty(unitMultiEntry) && (unitMultiEntry.Equals("yes", StringComparison.InvariantCultureIgnoreCase) || unitMultiEntry.Equals("true", StringComparison.InvariantCultureIgnoreCase))) { sameUnitMultiEntry = true; } } if (ai.ContainsKey("Digest")) { digestString = ai["Digest"].GetString("1"); } else { digestString = config["General"].GetString("Digest"); } string sectionHouses = config["General"].GetString("Houses"); string editorName = config["General"].GetString("EditorName"); LoadTechnoTypes(rules, editorName); teamHouseTypes = LoadAITypeList(rules, sectionHouses); teamHouseTypes.Add(new AITypeListEntry(-1, "<none>")); teamHouseTypes.Sort(); triggerHouseTypes = LoadAITypeList(rules, sectionHouses); triggerHouseTypes.Add(new AITypeListEntry(-1, "<all>")); triggerHouseTypes.Sort(); scriptTypes = new AITable <ScriptType>("ScriptTypes", new List <ScriptType>()); teamTypes = new AITable <TeamType>("TeamTypes", new List <TeamType>()); actionTypes = LoadActionTypes(config); groupTypes = LoadAITypeList(config, "Group"); veterancyTypes = LoadAITypeList(config, "VeteranLevels"); mindControlTypes = LoadAITypeList(config, "MCDecisions"); sides = LoadAITypeList(config, "Sides"); conditionTypes = LoadAITypeList(config, "Conditions"); operatorTypes = LoadAITypeList(config, "Operators"); // TaskForces being 1st of the 4 types, ID duplicates accross ai(md).ini is not checked. taskForces = LoadTaskForces(ai, technoTypes, groupTypes); scriptTypes = LoadScriptTypes(ai, actionTypes); teamTypeOptions = LoadTeamTypeOptions(config); teamTypes = LoadTeamTypes(ai, teamTypeOptions); triggerTypeOptions = LoadTriggerTypeOptions(config); triggerTypes = LoadTriggerTypes(ai); }