diff --git a/OpenRA.Game/FieldLoader.cs b/OpenRA.Game/FieldLoader.cs index 72d9e778e3..77b13c683e 100644 --- a/OpenRA.Game/FieldLoader.cs +++ b/OpenRA.Game/FieldLoader.cs @@ -160,6 +160,12 @@ namespace OpenRA public static object GetValue(string fieldName, Type fieldType, string value, MemberInfo field) { + return GetValue(fieldName, fieldType, new MiniYaml(value), field); + } + + public static object GetValue(string fieldName, Type fieldType, MiniYaml yaml, MemberInfo field) + { + var value = yaml.Value; if (value != null) value = value.Trim(); if (fieldType == typeof(int)) @@ -436,6 +442,21 @@ namespace OpenRA addMethod.Invoke(set, new[] { GetValue(fieldName, fieldType.GetGenericArguments()[0], parts[i].Trim(), field) }); return set; } + else if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Dictionary<,>)) + { + var dict = Activator.CreateInstance(fieldType); + var arguments = fieldType.GetGenericArguments(); + var addMethod = fieldType.GetMethod("Add", arguments); + + foreach (var node in yaml.Nodes) + { + var key = GetValue(fieldName, arguments[0], node.Key, field); + var val = GetValue(fieldName, arguments[1], node.Value, field); + addMethod.Invoke(dict, new[] { key, val }); + } + + return dict; + } else if (fieldType == typeof(Size)) { if (value != null) @@ -583,7 +604,7 @@ namespace OpenRA var loader = sa.GetLoader(type); if (loader == null && sa.FromYamlKey) - loader = (yaml) => GetValue(yamlName, field.FieldType, yaml.Value, field); + loader = yaml => GetValue(yamlName, field.FieldType, yaml, field); var fli = new FieldLoadInfo(field, sa, yamlName, loader); ret.Add(fli);