private Option LoadOption(int index) { TraceErrors(); if (disposed) throw new ObjectDisposedException("Unitsync has already been released."); var option = new Option { Name = NativeMethods.GetOptionName(index), Key = NativeMethods.GetOptionKey(index), Description = NativeMethods.GetOptionDesc(index), Type = (OptionType)NativeMethods.GetOptionType(index), Scope = NativeMethods.GetOptionScope(index), Section = NativeMethods.GetOptionSection(index), }; switch (option.Type) { case OptionType.Bool: option.Default = NativeMethods.GetOptionBoolDef(index).ToString(); break; case OptionType.Number: option.Default = NativeMethods.GetOptionNumberDef(index).ToString(CultureInfo.InvariantCulture); option.Min = NativeMethods.GetOptionNumberMin(index); option.Max = NativeMethods.GetOptionNumberMax(index); option.Step = NativeMethods.GetOptionNumberStep(index); break; case OptionType.String: option.Default = NativeMethods.GetOptionStringDef(index); option.StrMaxLen = NativeMethods.GetOptionStringMaxLen(index); break; case OptionType.List: option.Default = NativeMethods.GetOptionListDef(index); var listCount = NativeMethods.GetOptionListCount(index); for (var i = 0; i < listCount; i++) { var optl = LoadListOption(index, i); option.ListOptions.Add(optl); } break; case OptionType.Section: break; default: return null; } TraceErrors(); return option; }
/// <summary> /// Read options from EngineOptions.lua or ModOptions.lua /// </summary> public static void ReadOptionsTable(String filePath, ref Mod modInfo) { if (!File.Exists(filePath)) { return; } var allOptions = new List<Option>(); using (FileStream fileStream = File.OpenRead(filePath)) using (var stream = new StreamReader(fileStream)) { var allText = stream.ReadToEnd(); int offset =0; var config = new TableReaderConfig(); var table = TableReader.ParseTable(config,0,allText,filePath,out offset); foreach (var kvp in table) { var anOption = new Option(); bool isBoolOption = false; foreach(var kvp2 in (kvp.Value as Dictionary<String,Object>)) { var value = (kvp2.Value as String); float numbers; //uncomment to take a peek on what it read!: //System.Diagnostics.Trace.TraceWarning("key: " + kvp2.Key + " value:" + value); switch(kvp2.Key) { case "key": anOption.Key = value; break; case "name": anOption.Name = value; break; case "desc": anOption.Description = value; break; case "type": switch(value) { case "bool": anOption.Type = OptionType.Bool; isBoolOption = true; break; case "list": anOption.Type = OptionType.List; break; case "number": anOption.Type = OptionType.Number; break; case "string": anOption.Type = OptionType.String; break; case "section": anOption.Type = OptionType.Section; continue; default: anOption.Type = OptionType.Undefined; break; } break; case "def": anOption.Default = value; if (isBoolOption) { if (value=="false") anOption.Default = "0"; else anOption.Default = "1"; } break; case "min": float.TryParse(value,NumberStyles.Float,CultureInfo.InvariantCulture,out numbers); anOption.Min = numbers; break; case "max": float.TryParse(value,NumberStyles.Float,CultureInfo.InvariantCulture,out numbers); anOption.Max = numbers; break; case "step": float.TryParse(value,NumberStyles.Float,CultureInfo.InvariantCulture,out numbers); anOption.Step = numbers; break; case "maxlen": float.TryParse(value,NumberStyles.Float,CultureInfo.InvariantCulture,out numbers); anOption.StrMaxLen = numbers; break; case "items": var listOptions = new List<ListOption>(); foreach(var kvp3 in (kvp2.Value as Dictionary<String,Object>)) { var listOption = new ListOption(); foreach(var kvp4 in (kvp3.Value as Dictionary<String,Object>)) { var value2 = (kvp4.Value as String); switch(kvp4.Key) { case "key": listOption.Key = value2; break; case "name": listOption.Name = value2; break; case "desc": listOption.Description = value2; break; } } if (listOption.Key!=null) listOptions.Add(listOption); } anOption.ListOptions = listOptions; break; case "scope": anOption.Scope = value; break; case "section": anOption.Section = value; break; } } if (anOption.Key!=null) allOptions.Add(anOption); } } if (modInfo.Options!=null) modInfo.Options = modInfo.Options.ToList().Concat(allOptions).ToArray(); else modInfo.Options = allOptions.ToArray(); }