public static void Look <K, V>(ref Dictionary <K, V> dict, string label, LookMode keyLookMode, LookMode valueLookMode, ref List <K> keysWorkingList, ref List <V> valuesWorkingList) where K : new() { if (Scribe.EnterNode(label)) { try { if (Scribe.mode == LoadSaveMode.Saving || Scribe.mode == LoadSaveMode.LoadingVars) { keysWorkingList = new List <K>(); valuesWorkingList = new List <V>(); } if (Scribe.mode == LoadSaveMode.Saving) { foreach (KeyValuePair <K, V> item in dict) { keysWorkingList.Add(item.Key); valuesWorkingList.Add(item.Value); } } Scribe_Collections.Look <K>(ref keysWorkingList, "keys", keyLookMode, new object[0]); Scribe_Collections.Look <V>(ref valuesWorkingList, "values", valueLookMode, new object[0]); if (Scribe.mode == LoadSaveMode.Saving) { if (keysWorkingList != null) { keysWorkingList.Clear(); keysWorkingList = null; } if (valuesWorkingList != null) { valuesWorkingList.Clear(); valuesWorkingList = null; } } bool flag = keyLookMode == LookMode.Reference || valueLookMode == LookMode.Reference; if (flag && Scribe.mode == LoadSaveMode.ResolvingCrossRefs) { goto IL_0118; } if (!flag && Scribe.mode == LoadSaveMode.LoadingVars) { goto IL_0118; } goto IL_0279; IL_0118: dict.Clear(); if (keysWorkingList == null) { Log.Error("Cannot fill dictionary because there are no keys."); } else if (valuesWorkingList == null) { Log.Error("Cannot fill dictionary because there are no values."); } else { if (keysWorkingList.Count != valuesWorkingList.Count) { Log.Error("Keys count does not match the values count while loading a dictionary (maybe keys and values were resolved during different passes?). Some elements will be skipped. keys=" + keysWorkingList.Count + ", values=" + valuesWorkingList.Count); } int num = Math.Min(keysWorkingList.Count, valuesWorkingList.Count); for (int i = 0; i < num; i++) { if (keysWorkingList[i] == null) { Log.Error("Null key while loading dictionary of " + typeof(K) + " and " + typeof(V) + "."); } else { try { dict.Add(keysWorkingList[i], valuesWorkingList[i]); } catch (Exception ex) { Log.Error("Exception in LookDictionary(node=" + label + "): " + ex); } } } } goto IL_0279; IL_0279: if (Scribe.mode == LoadSaveMode.PostLoadInit) { if (keysWorkingList != null) { keysWorkingList.Clear(); keysWorkingList = null; } if (valuesWorkingList != null) { valuesWorkingList.Clear(); valuesWorkingList = null; } } } finally { Scribe.ExitNode(); } } else if (Scribe.mode == LoadSaveMode.LoadingVars) { dict = null; } }
public static void Look <T>(ref List <T> list, bool saveDestroyedThings, string label, LookMode lookMode = LookMode.Undefined, params object[] ctorArgs) { if (lookMode == LookMode.Undefined && !Scribe_Universal.TryResolveLookMode(typeof(T), out lookMode)) { Log.Error(string.Concat("LookList call with a list of ", typeof(T), " must have lookMode set explicitly.")); } else if (Scribe.EnterNode(label)) { try { if (Scribe.mode == LoadSaveMode.Saving) { if (list == null) { Scribe.saver.WriteAttribute("IsNull", "True"); return; } foreach (T item8 in list) { switch (lookMode) { case LookMode.Value: { T value5 = item8; Scribe_Values.Look(ref value5, "li", default(T), forceSave: true); break; } case LookMode.LocalTargetInfo: { LocalTargetInfo value4 = (LocalTargetInfo)(object)item8; Scribe_TargetInfo.Look(ref value4, saveDestroyedThings, "li"); break; } case LookMode.TargetInfo: { TargetInfo value3 = (TargetInfo)(object)item8; Scribe_TargetInfo.Look(ref value3, saveDestroyedThings, "li"); break; } case LookMode.GlobalTargetInfo: { GlobalTargetInfo value2 = (GlobalTargetInfo)(object)item8; Scribe_TargetInfo.Look(ref value2, saveDestroyedThings, "li"); break; } case LookMode.Def: { Def value = (Def)(object)item8; Scribe_Defs.Look(ref value, "li"); break; } case LookMode.BodyPart: { BodyPartRecord part = (BodyPartRecord)(object)item8; Scribe_BodyParts.Look(ref part, "li"); break; } case LookMode.Deep: { T target = item8; Scribe_Deep.Look(ref target, saveDestroyedThings, "li", ctorArgs); break; } case LookMode.Reference: { ILoadReferenceable refee = (ILoadReferenceable)(object)item8; Scribe_References.Look(ref refee, "li", saveDestroyedThings); break; } } } } else if (Scribe.mode == LoadSaveMode.LoadingVars) { XmlNode curXmlParent = Scribe.loader.curXmlParent; XmlAttribute xmlAttribute = curXmlParent.Attributes["IsNull"]; if (xmlAttribute != null && xmlAttribute.Value.ToLower() == "true") { if (lookMode == LookMode.Reference) { Scribe.loader.crossRefs.loadIDs.RegisterLoadIDListReadFromXml(null, null); } list = null; return; } switch (lookMode) { case LookMode.Value: list = new List <T>(curXmlParent.ChildNodes.Count); foreach (XmlNode childNode in curXmlParent.ChildNodes) { T item = ScribeExtractor.ValueFromNode(childNode, default(T)); list.Add(item); } break; case LookMode.Deep: list = new List <T>(curXmlParent.ChildNodes.Count); foreach (XmlNode childNode2 in curXmlParent.ChildNodes) { T item7 = ScribeExtractor.SaveableFromNode <T>(childNode2, ctorArgs); list.Add(item7); } break; case LookMode.Def: list = new List <T>(curXmlParent.ChildNodes.Count); foreach (XmlNode childNode3 in curXmlParent.ChildNodes) { T item6 = ScribeExtractor.DefFromNodeUnsafe <T>(childNode3); list.Add(item6); } break; case LookMode.BodyPart: { list = new List <T>(curXmlParent.ChildNodes.Count); int num4 = 0; foreach (XmlNode childNode4 in curXmlParent.ChildNodes) { T item5 = (T)(object)ScribeExtractor.BodyPartFromNode(childNode4, num4.ToString(), null); list.Add(item5); num4++; } break; } case LookMode.LocalTargetInfo: { list = new List <T>(curXmlParent.ChildNodes.Count); int num3 = 0; foreach (XmlNode childNode5 in curXmlParent.ChildNodes) { T item4 = (T)(object)ScribeExtractor.LocalTargetInfoFromNode(childNode5, num3.ToString(), LocalTargetInfo.Invalid); list.Add(item4); num3++; } break; } case LookMode.TargetInfo: { list = new List <T>(curXmlParent.ChildNodes.Count); int num2 = 0; foreach (XmlNode childNode6 in curXmlParent.ChildNodes) { T item3 = (T)(object)ScribeExtractor.TargetInfoFromNode(childNode6, num2.ToString(), TargetInfo.Invalid); list.Add(item3); num2++; } break; } case LookMode.GlobalTargetInfo: { list = new List <T>(curXmlParent.ChildNodes.Count); int num = 0; foreach (XmlNode childNode7 in curXmlParent.ChildNodes) { T item2 = (T)(object)ScribeExtractor.GlobalTargetInfoFromNode(childNode7, num.ToString(), GlobalTargetInfo.Invalid); list.Add(item2); num++; } break; } case LookMode.Reference: { List <string> list2 = new List <string>(curXmlParent.ChildNodes.Count); foreach (XmlNode childNode8 in curXmlParent.ChildNodes) { list2.Add(childNode8.InnerText); } Scribe.loader.crossRefs.loadIDs.RegisterLoadIDListReadFromXml(list2, ""); break; } } } else { if (Scribe.mode != LoadSaveMode.ResolvingCrossRefs) { return; } switch (lookMode) { case LookMode.Reference: list = Scribe.loader.crossRefs.TakeResolvedRefList <T>(""); break; case LookMode.LocalTargetInfo: if (list != null) { for (int j = 0; j < list.Count; j++) { list[j] = (T)(object)ScribeExtractor.ResolveLocalTargetInfo((LocalTargetInfo)(object)list[j], j.ToString()); } } break; case LookMode.TargetInfo: if (list != null) { for (int k = 0; k < list.Count; k++) { list[k] = (T)(object)ScribeExtractor.ResolveTargetInfo((TargetInfo)(object)list[k], k.ToString()); } } break; case LookMode.GlobalTargetInfo: if (list != null) { for (int i = 0; i < list.Count; i++) { list[i] = (T)(object)ScribeExtractor.ResolveGlobalTargetInfo((GlobalTargetInfo)(object)list[i], i.ToString()); } } break; } return; } } finally { Scribe.ExitNode(); } } else if (Scribe.mode == LoadSaveMode.LoadingVars) { if (lookMode == LookMode.Reference) { Scribe.loader.crossRefs.loadIDs.RegisterLoadIDListReadFromXml(null, label); } list = null; } }
public static void Look <K, V>(ref Dictionary <K, V> dict, string label, LookMode keyLookMode = LookMode.Undefined, LookMode valueLookMode = LookMode.Undefined) { if (Scribe.mode == LoadSaveMode.LoadingVars) { bool flag = keyLookMode == LookMode.Reference; bool flag2 = valueLookMode == LookMode.Reference; if (flag != flag2) { Log.Error("You need to provide working lists for the keys and values in order to be able to load such dictionary. label=" + label); } } List <K> keysWorkingList = null; List <V> valuesWorkingList = null; Look(ref dict, label, keyLookMode, valueLookMode, ref keysWorkingList, ref valuesWorkingList); }
public ThingOwner(IThingHolder owner, bool oneStackOnly, LookMode contentsLookMode = LookMode.Deep) : this(owner) { this.maxStacks = ((!oneStackOnly) ? 999999 : 1); this.contentsLookMode = contentsLookMode; }
public static void Look <T>(ref HashSet <T> valueHashSet, bool saveDestroyedThings, string label, LookMode lookMode = LookMode.Undefined) { List <T> list = null; if (Scribe.mode == LoadSaveMode.Saving) { if (valueHashSet != null) { list = new List <T>(); foreach (T item in valueHashSet) { list.Add(item); } } } Scribe_Collections.Look <T>(ref list, saveDestroyedThings, label, lookMode, new object[0]); if ((lookMode == LookMode.Reference && Scribe.mode == LoadSaveMode.ResolvingCrossRefs) || (lookMode != LookMode.Reference && Scribe.mode == LoadSaveMode.LoadingVars)) { if (list == null) { valueHashSet = null; } else { valueHashSet = new HashSet <T>(); for (int i = 0; i < list.Count; i++) { valueHashSet.Add(list[i]); } } } }
public static void Look <T>(ref List <T> list, string label, LookMode lookMode = LookMode.Undefined, params object[] ctorArgs) { Look(ref list, saveDestroyedThings: false, label, lookMode, ctorArgs); }
public static void Look <T>(ref List <T> list, bool saveDestroyedThings, string label, LookMode lookMode = LookMode.Undefined, params object[] ctorArgs) { if (lookMode == LookMode.Undefined) { if (ParseHelper.HandlesType(typeof(T))) { lookMode = LookMode.Value; } else if (typeof(T) == typeof(LocalTargetInfo)) { lookMode = LookMode.LocalTargetInfo; } else if (typeof(T) == typeof(TargetInfo)) { lookMode = LookMode.TargetInfo; } else if (typeof(T) == typeof(GlobalTargetInfo)) { lookMode = LookMode.GlobalTargetInfo; } else if (typeof(Def).IsAssignableFrom(typeof(T))) { lookMode = LookMode.Def; } else if (typeof(T) == typeof(BodyPartRecord)) { lookMode = LookMode.BodyPart; } else { if (!typeof(IExposable).IsAssignableFrom(typeof(T)) || typeof(ILoadReferenceable).IsAssignableFrom(typeof(T))) { Log.Error("LookList call with a list of " + typeof(T) + " must have lookMode set explicitly.", false); return; } lookMode = LookMode.Deep; } } if (Scribe.EnterNode(label)) { try { if (Scribe.mode == LoadSaveMode.Saving) { if (list == null) { Scribe.saver.WriteAttribute("IsNull", "True"); } else { foreach (T current in list) { if (lookMode == LookMode.Value) { T t = current; Scribe_Values.Look <T>(ref t, "li", default(T), true); } else if (lookMode == LookMode.LocalTargetInfo) { LocalTargetInfo localTargetInfo = (LocalTargetInfo)((object)current); Scribe_TargetInfo.Look(ref localTargetInfo, saveDestroyedThings, "li"); } else if (lookMode == LookMode.TargetInfo) { TargetInfo targetInfo = (TargetInfo)((object)current); Scribe_TargetInfo.Look(ref targetInfo, saveDestroyedThings, "li"); } else if (lookMode == LookMode.GlobalTargetInfo) { GlobalTargetInfo globalTargetInfo = (GlobalTargetInfo)((object)current); Scribe_TargetInfo.Look(ref globalTargetInfo, saveDestroyedThings, "li"); } else if (lookMode == LookMode.Def) { Def def = (Def)((object)current); Scribe_Defs.Look <Def>(ref def, "li"); } else if (lookMode == LookMode.BodyPart) { BodyPartRecord bodyPartRecord = (BodyPartRecord)((object)current); Scribe_BodyParts.Look(ref bodyPartRecord, "li", null); } else if (lookMode == LookMode.Deep) { T t2 = current; Scribe_Deep.Look <T>(ref t2, saveDestroyedThings, "li", ctorArgs); } else if (lookMode == LookMode.Reference) { ILoadReferenceable loadReferenceable = (ILoadReferenceable)((object)current); Scribe_References.Look <ILoadReferenceable>(ref loadReferenceable, "li", saveDestroyedThings); } } } } else if (Scribe.mode == LoadSaveMode.LoadingVars) { XmlNode curXmlParent = Scribe.loader.curXmlParent; XmlAttribute xmlAttribute = curXmlParent.Attributes["IsNull"]; if (xmlAttribute != null && xmlAttribute.Value.ToLower() == "true") { list = null; } else if (lookMode == LookMode.Value) { list = new List <T>(curXmlParent.ChildNodes.Count); foreach (XmlNode subNode in curXmlParent.ChildNodes) { T item = ScribeExtractor.ValueFromNode <T>(subNode, default(T)); list.Add(item); } } else if (lookMode == LookMode.Deep) { list = new List <T>(curXmlParent.ChildNodes.Count); foreach (XmlNode subNode2 in curXmlParent.ChildNodes) { T item2 = ScribeExtractor.SaveableFromNode <T>(subNode2, ctorArgs); list.Add(item2); } } else if (lookMode == LookMode.Def) { list = new List <T>(curXmlParent.ChildNodes.Count); foreach (XmlNode subNode3 in curXmlParent.ChildNodes) { T item3 = ScribeExtractor.DefFromNodeUnsafe <T>(subNode3); list.Add(item3); } } else if (lookMode == LookMode.BodyPart) { list = new List <T>(curXmlParent.ChildNodes.Count); int num = 0; foreach (XmlNode node in curXmlParent.ChildNodes) { T item4 = (T)((object)ScribeExtractor.BodyPartFromNode(node, num.ToString(), null)); list.Add(item4); num++; } } else if (lookMode == LookMode.LocalTargetInfo) { list = new List <T>(curXmlParent.ChildNodes.Count); int num2 = 0; foreach (XmlNode node2 in curXmlParent.ChildNodes) { LocalTargetInfo localTargetInfo2 = ScribeExtractor.LocalTargetInfoFromNode(node2, num2.ToString(), LocalTargetInfo.Invalid); T item5 = (T)((object)localTargetInfo2); list.Add(item5); num2++; } } else if (lookMode == LookMode.TargetInfo) { list = new List <T>(curXmlParent.ChildNodes.Count); int num3 = 0; foreach (XmlNode node3 in curXmlParent.ChildNodes) { TargetInfo targetInfo2 = ScribeExtractor.TargetInfoFromNode(node3, num3.ToString(), TargetInfo.Invalid); T item6 = (T)((object)targetInfo2); list.Add(item6); num3++; } } else if (lookMode == LookMode.GlobalTargetInfo) { list = new List <T>(curXmlParent.ChildNodes.Count); int num4 = 0; foreach (XmlNode node4 in curXmlParent.ChildNodes) { GlobalTargetInfo globalTargetInfo2 = ScribeExtractor.GlobalTargetInfoFromNode(node4, num4.ToString(), GlobalTargetInfo.Invalid); T item7 = (T)((object)globalTargetInfo2); list.Add(item7); num4++; } } else if (lookMode == LookMode.Reference) { List <string> list2 = new List <string>(curXmlParent.ChildNodes.Count); foreach (XmlNode xmlNode in curXmlParent.ChildNodes) { list2.Add(xmlNode.InnerText); } Scribe.loader.crossRefs.loadIDs.RegisterLoadIDListReadFromXml(list2, string.Empty); } } else if (Scribe.mode == LoadSaveMode.ResolvingCrossRefs) { if (lookMode == LookMode.Reference) { list = Scribe.loader.crossRefs.TakeResolvedRefList <T>(string.Empty); } else if (lookMode == LookMode.LocalTargetInfo) { if (list != null) { for (int i = 0; i < list.Count; i++) { list[i] = (T)((object)ScribeExtractor.ResolveLocalTargetInfo((LocalTargetInfo)((object)list[i]), i.ToString())); } } } else if (lookMode == LookMode.TargetInfo) { if (list != null) { for (int j = 0; j < list.Count; j++) { list[j] = (T)((object)ScribeExtractor.ResolveTargetInfo((TargetInfo)((object)list[j]), j.ToString())); } } } else if (lookMode == LookMode.GlobalTargetInfo && list != null) { for (int k = 0; k < list.Count; k++) { list[k] = (T)((object)ScribeExtractor.ResolveGlobalTargetInfo((GlobalTargetInfo)((object)list[k]), k.ToString())); } } } } finally { Scribe.ExitNode(); } } else if (Scribe.mode == LoadSaveMode.LoadingVars) { if (lookMode == LookMode.Reference) { Scribe.loader.crossRefs.loadIDs.RegisterLoadIDListReadFromXml(null, label); } list = null; } }
public static void Look <T>(ref List <T> list, string label, LookMode lookMode = LookMode.Undefined, params object[] ctorArgs) { Scribe_Collections.Look <T>(ref list, false, label, lookMode, ctorArgs); }
/// <summary> /// Dictionary Look with value type keys /// </summary> public static void LookWithValueKey <K, V>(ref Dictionary <K, V> dict, string label, LookMode valueLookMode, params object[] valueCtorArgs) { List <V> list = null; LookWithValueKey(ref dict, label, valueLookMode, ref list, valueCtorArgs); }
/// <summary> /// Dictionary Look with value type keys /// </summary> public static void LookWithValueKey <K, V>(ref Dictionary <K, V> dict, string label, LookMode valueLookMode, ref List <V> valuesWorkingList, params object[] valueCtorArgs) { LookMode keyLookMode = LookMode.Value; List <K> keysWorkingList = null; if (Scribe.EnterNode(label)) { try { if (Scribe.mode == LoadSaveMode.Saving || Scribe.mode == LoadSaveMode.LoadingVars) { keysWorkingList = new List <K>(); valuesWorkingList = new List <V>(); } if (Scribe.mode == LoadSaveMode.Saving) { foreach (KeyValuePair <K, V> current in dict) { keysWorkingList.Add(current.Key); valuesWorkingList.Add(current.Value); } } Scribe_Collections.Look(ref keysWorkingList, "keys", keyLookMode); Scribe_Collections.Look(ref valuesWorkingList, "values", valueLookMode, valueCtorArgs); if (Scribe.mode == LoadSaveMode.Saving) { if (keysWorkingList != null) { keysWorkingList.Clear(); keysWorkingList = null; } if (valuesWorkingList != null) { valuesWorkingList.Clear(); valuesWorkingList = null; } } bool flag = keyLookMode == LookMode.Reference || valueLookMode == LookMode.Reference; if ((flag && Scribe.mode == LoadSaveMode.ResolvingCrossRefs) || (!flag && Scribe.mode == LoadSaveMode.LoadingVars)) { dict.Clear(); if (keysWorkingList == null) { Log.Error("Cannot fill dictionary because there are no keys."); } else if (valuesWorkingList == null) { Log.Error("Cannot fill dictionary because there are no values."); } else { if (keysWorkingList.Count != valuesWorkingList.Count) { Log.Error(string.Concat(new object[] { "Keys count does not match the values count while loading a dictionary (maybe keys and values were resolved during different passes?). Some elements will be skipped. keys=", keysWorkingList.Count, ", values=", valuesWorkingList.Count })); } int num = Math.Min(keysWorkingList.Count, valuesWorkingList.Count); for (int i = 0; i < num; i++) { if (keysWorkingList[i] == null) { Log.Error(string.Concat(new object[] { "Null key while loading dictionary of ", typeof(K), " and ", typeof(V), "." })); } else { try { dict.Add(keysWorkingList[i], valuesWorkingList[i]); } catch (Exception ex) { Log.Error(string.Concat(new object[] { "Exception in LookDictionary(node=", label, "): ", ex })); } } } } } if (Scribe.mode == LoadSaveMode.PostLoadInit) { if (keysWorkingList != null) { keysWorkingList.Clear(); keysWorkingList = null; } if (valuesWorkingList != null) { valuesWorkingList.Clear(); valuesWorkingList = null; } } } finally { Scribe.ExitNode(); } } else if (Scribe.mode == LoadSaveMode.LoadingVars) { dict = null; } }
public static void Look2 <T>(ref ThreadSafeLinkedList <T> list, bool saveDestroyedThings, string label, LookMode lookMode = LookMode.Undefined, params object[] ctorArgs) { Look(ref list, saveDestroyedThings: false, label, lookMode, ctorArgs); }
public ArmorRackInnerContainer(IThingHolder owner, bool oneStackOnly, LookMode contentsLookMode = LookMode.Deep) : base(owner, oneStackOnly, contentsLookMode) { }
public SaveableDefPair(VehicleDef def, FieldInfo field, string uniqueKey, K key, LookMode valueLookMode) : base(def, field) { this.key = key; defName = key.defName; this.uniqueKey = uniqueKey; this.valueLookMode = valueLookMode; keyType = typeof(K); }
public static void Look <T>(ref HashSet <T> valueHashSet, string label, LookMode lookMode = LookMode.Undefined) { Look(ref valueHashSet, saveDestroyedThings: false, label, lookMode); }
public ThingOwner(IThingHolder owner, bool oneStackOnly, LookMode contentsLookMode = LookMode.Deep) : base(owner, oneStackOnly, contentsLookMode) { }
public static void Look <T>(ref HashSet <T> valueHashSet, bool saveDestroyedThings, string label, LookMode lookMode = LookMode.Undefined) { List <T> list = null; if (Scribe.mode == LoadSaveMode.Saving && valueHashSet != null) { list = new List <T>(); foreach (T item in valueHashSet) { list.Add(item); } } Look(ref list, saveDestroyedThings, label, lookMode); if ((lookMode != LookMode.Reference || Scribe.mode != LoadSaveMode.ResolvingCrossRefs) && (lookMode == LookMode.Reference || Scribe.mode != LoadSaveMode.LoadingVars)) { return; } if (list == null) { valueHashSet = null; return; } valueHashSet = new HashSet <T>(); for (int i = 0; i < list.Count; i++) { valueHashSet.Add(list[i]); } }
private static void LookInternalDef <T>(ref T obj, string label, LookMode lookMode) where T : Def, new() { Scribe_Defs.Look(ref obj, label); }
public static void Look <T>(ref HashSet <T> valueHashSet, string label, LookMode lookMode = LookMode.Undefined) { Scribe_Collections.Look <T>(ref valueHashSet, false, label, lookMode); }
private static void LookInternalReference <T>(ref T obj, string label, LookMode lookMode) where T : ILoadReferenceable { Scribe_References.Look(ref obj, label); }
public void UpdateViewVelocity(Vector2 deltaLook) { // Set current Velocity of the Look-Motion currentLookMode = LookMode.Velocity; this.deltaLook = deltaLook; }
public static bool TryResolveLookMode(Type type, out LookMode lookMode, bool desperate = false, bool preferDeepIfDesperateAndAmbiguous = false) { if (type == null) { if (desperate) { lookMode = LookMode.Value; return(true); } lookMode = LookMode.Undefined; return(false); } if (type == typeof(object) && desperate) { lookMode = LookMode.Value; return(true); } if (ParseHelper.HandlesType(type)) { lookMode = LookMode.Value; return(true); } if (type == typeof(LocalTargetInfo)) { lookMode = LookMode.LocalTargetInfo; return(true); } if (type == typeof(TargetInfo)) { lookMode = LookMode.TargetInfo; return(true); } if (type == typeof(GlobalTargetInfo)) { lookMode = LookMode.GlobalTargetInfo; return(true); } if (typeof(Def).IsAssignableFrom(type)) { lookMode = LookMode.Def; return(true); } if (type == typeof(BodyPartRecord)) { lookMode = LookMode.BodyPart; return(true); } if (typeof(IExposable).IsAssignableFrom(type) && !typeof(ILoadReferenceable).IsAssignableFrom(type)) { lookMode = LookMode.Deep; return(true); } if (desperate && typeof(ILoadReferenceable).IsAssignableFrom(type)) { if (preferDeepIfDesperateAndAmbiguous) { lookMode = LookMode.Deep; } else { lookMode = LookMode.Reference; } return(true); } lookMode = LookMode.Undefined; return(false); }
public static void Look <T>(ref List <T> list, bool saveDestroyedThings, string label, LookMode lookMode = LookMode.Undefined, params object[] ctorArgs) { if (lookMode == LookMode.Undefined) { if (ParseHelper.HandlesType(typeof(T))) { lookMode = LookMode.Value; } else if (typeof(T) == typeof(LocalTargetInfo)) { lookMode = LookMode.LocalTargetInfo; } else if (typeof(T) == typeof(TargetInfo)) { lookMode = LookMode.TargetInfo; } else if (typeof(T) == typeof(GlobalTargetInfo)) { lookMode = LookMode.GlobalTargetInfo; } else if (typeof(Def).IsAssignableFrom(typeof(T))) { lookMode = LookMode.Def; } else if (typeof(T) == typeof(BodyPartRecord)) { lookMode = LookMode.BodyPart; } else { if (!typeof(IExposable).IsAssignableFrom(typeof(T)) || typeof(ILoadReferenceable).IsAssignableFrom(typeof(T))) { Log.Error("LookList call with a list of " + typeof(T) + " must have lookMode set explicitly."); return; } lookMode = LookMode.Deep; } } if (Scribe.EnterNode(label)) { try { if (Scribe.mode == LoadSaveMode.Saving) { if (list == null) { Scribe.saver.WriteAttribute("IsNull", "True"); } else { foreach (T item8 in list) { switch (lookMode) { case LookMode.Value: { T value5 = item8; Scribe_Values.Look(ref value5, "li", default(T), forceSave: true); break; } case LookMode.LocalTargetInfo: { LocalTargetInfo value4 = (LocalTargetInfo)(object)item8; Scribe_TargetInfo.Look(ref value4, saveDestroyedThings, "li"); break; } case LookMode.TargetInfo: { TargetInfo value3 = (TargetInfo)(object)item8; Scribe_TargetInfo.Look(ref value3, saveDestroyedThings, "li"); break; } case LookMode.GlobalTargetInfo: { GlobalTargetInfo value2 = (GlobalTargetInfo)(object)item8; Scribe_TargetInfo.Look(ref value2, saveDestroyedThings, "li"); break; } case LookMode.Def: { Def value = (Def)(object)item8; Scribe_Defs.Look(ref value, "li"); break; } case LookMode.BodyPart: { BodyPartRecord part = (BodyPartRecord)(object)item8; Scribe_BodyParts.Look(ref part, "li"); break; } case LookMode.Deep: { T target = item8; Scribe_Deep.Look(ref target, saveDestroyedThings, "li", ctorArgs); break; } case LookMode.Reference: { ILoadReferenceable refee = (ILoadReferenceable)(object)item8; Scribe_References.Look(ref refee, "li", saveDestroyedThings); break; } } } } } else if (Scribe.mode == LoadSaveMode.LoadingVars) { XmlNode curXmlParent = Scribe.loader.curXmlParent; XmlAttribute xmlAttribute = curXmlParent.Attributes["IsNull"]; if (xmlAttribute == null || !(xmlAttribute.Value.ToLower() == "true")) { switch (lookMode) { case LookMode.Value: { list = new List <T>(curXmlParent.ChildNodes.Count); IEnumerator enumerator3 = curXmlParent.ChildNodes.GetEnumerator(); try { while (enumerator3.MoveNext()) { XmlNode subNode = (XmlNode)enumerator3.Current; T item = ScribeExtractor.ValueFromNode(subNode, default(T)); list.Add(item); } } finally { IDisposable disposable2; if ((disposable2 = (enumerator3 as IDisposable)) != null) { disposable2.Dispose(); } } break; } case LookMode.Deep: { list = new List <T>(curXmlParent.ChildNodes.Count); IEnumerator enumerator9 = curXmlParent.ChildNodes.GetEnumerator(); try { while (enumerator9.MoveNext()) { XmlNode subNode3 = (XmlNode)enumerator9.Current; T item7 = ScribeExtractor.SaveableFromNode <T>(subNode3, ctorArgs); list.Add(item7); } } finally { IDisposable disposable8; if ((disposable8 = (enumerator9 as IDisposable)) != null) { disposable8.Dispose(); } } break; } case LookMode.Def: { list = new List <T>(curXmlParent.ChildNodes.Count); IEnumerator enumerator8 = curXmlParent.ChildNodes.GetEnumerator(); try { while (enumerator8.MoveNext()) { XmlNode subNode2 = (XmlNode)enumerator8.Current; T item6 = ScribeExtractor.DefFromNodeUnsafe <T>(subNode2); list.Add(item6); } } finally { IDisposable disposable7; if ((disposable7 = (enumerator8 as IDisposable)) != null) { disposable7.Dispose(); } } break; } case LookMode.BodyPart: { list = new List <T>(curXmlParent.ChildNodes.Count); int num4 = 0; IEnumerator enumerator7 = curXmlParent.ChildNodes.GetEnumerator(); try { while (enumerator7.MoveNext()) { XmlNode node4 = (XmlNode)enumerator7.Current; T item5 = (T)(object)ScribeExtractor.BodyPartFromNode(node4, num4.ToString(), null); list.Add(item5); num4++; } } finally { IDisposable disposable6; if ((disposable6 = (enumerator7 as IDisposable)) != null) { disposable6.Dispose(); } } break; } case LookMode.LocalTargetInfo: { list = new List <T>(curXmlParent.ChildNodes.Count); int num3 = 0; IEnumerator enumerator6 = curXmlParent.ChildNodes.GetEnumerator(); try { while (enumerator6.MoveNext()) { XmlNode node3 = (XmlNode)enumerator6.Current; LocalTargetInfo localTargetInfo = ScribeExtractor.LocalTargetInfoFromNode(node3, num3.ToString(), LocalTargetInfo.Invalid); T item4 = (T)(object)localTargetInfo; list.Add(item4); num3++; } } finally { IDisposable disposable5; if ((disposable5 = (enumerator6 as IDisposable)) != null) { disposable5.Dispose(); } } break; } case LookMode.TargetInfo: { list = new List <T>(curXmlParent.ChildNodes.Count); int num2 = 0; IEnumerator enumerator5 = curXmlParent.ChildNodes.GetEnumerator(); try { while (enumerator5.MoveNext()) { XmlNode node2 = (XmlNode)enumerator5.Current; TargetInfo targetInfo = ScribeExtractor.TargetInfoFromNode(node2, num2.ToString(), TargetInfo.Invalid); T item3 = (T)(object)targetInfo; list.Add(item3); num2++; } } finally { IDisposable disposable4; if ((disposable4 = (enumerator5 as IDisposable)) != null) { disposable4.Dispose(); } } break; } case LookMode.GlobalTargetInfo: { list = new List <T>(curXmlParent.ChildNodes.Count); int num = 0; IEnumerator enumerator4 = curXmlParent.ChildNodes.GetEnumerator(); try { while (enumerator4.MoveNext()) { XmlNode node = (XmlNode)enumerator4.Current; GlobalTargetInfo globalTargetInfo = ScribeExtractor.GlobalTargetInfoFromNode(node, num.ToString(), GlobalTargetInfo.Invalid); T item2 = (T)(object)globalTargetInfo; list.Add(item2); num++; } } finally { IDisposable disposable3; if ((disposable3 = (enumerator4 as IDisposable)) != null) { disposable3.Dispose(); } } break; } case LookMode.Reference: { List <string> list2 = new List <string>(curXmlParent.ChildNodes.Count); IEnumerator enumerator2 = curXmlParent.ChildNodes.GetEnumerator(); try { while (enumerator2.MoveNext()) { XmlNode xmlNode = (XmlNode)enumerator2.Current; list2.Add(xmlNode.InnerText); } } finally { IDisposable disposable; if ((disposable = (enumerator2 as IDisposable)) != null) { disposable.Dispose(); } } Scribe.loader.crossRefs.loadIDs.RegisterLoadIDListReadFromXml(list2, string.Empty); break; } } } else { list = null; } } else if (Scribe.mode == LoadSaveMode.ResolvingCrossRefs) { switch (lookMode) { case LookMode.Reference: list = Scribe.loader.crossRefs.TakeResolvedRefList <T>(string.Empty); break; case LookMode.LocalTargetInfo: if (list != null) { for (int j = 0; j < list.Count; j++) { list[j] = (T)(object)ScribeExtractor.ResolveLocalTargetInfo((LocalTargetInfo)(object)list[j], j.ToString()); } } break; case LookMode.TargetInfo: if (list != null) { for (int k = 0; k < list.Count; k++) { list[k] = (T)(object)ScribeExtractor.ResolveTargetInfo((TargetInfo)(object)list[k], k.ToString()); } } break; case LookMode.GlobalTargetInfo: if (list != null) { for (int i = 0; i < list.Count; i++) { list[i] = (T)(object)ScribeExtractor.ResolveGlobalTargetInfo((GlobalTargetInfo)(object)list[i], i.ToString()); } } break; } } } finally { Scribe.ExitNode(); } } else if (Scribe.mode == LoadSaveMode.LoadingVars) { if (lookMode == LookMode.Reference) { Scribe.loader.crossRefs.loadIDs.RegisterLoadIDListReadFromXml(null, label); } list = null; } }
public static void Look <K, V>(ref Dictionary <K, V> dict, string label, LookMode keyLookMode = LookMode.Undefined, LookMode valueLookMode = LookMode.Undefined) where K : new() { if (Scribe.mode == LoadSaveMode.LoadingVars) { bool flag = keyLookMode == LookMode.Reference; bool flag2 = valueLookMode == LookMode.Reference; if (flag != flag2) { Log.Error("You need to provide working lists for the keys and values in order to be able to load such dictionary."); return; } } List <K> list = null; List <V> list2 = null; Scribe_Collections.Look <K, V>(ref dict, label, keyLookMode, valueLookMode, ref list, ref list2); }
public static void Look <K, V>(ref Dictionary <K, V> dict, string label, LookMode keyLookMode, LookMode valueLookMode, ref List <K> keysWorkingList, ref List <V> valuesWorkingList) { if (Scribe.EnterNode(label)) { try { if (Scribe.mode == LoadSaveMode.Saving && dict == null) { Scribe.saver.WriteAttribute("IsNull", "True"); } else { if (Scribe.mode == LoadSaveMode.LoadingVars) { XmlAttribute xmlAttribute = Scribe.loader.curXmlParent.Attributes["IsNull"]; if (xmlAttribute != null && xmlAttribute.Value.ToLower() == "true") { dict = null; } else { dict = new Dictionary <K, V>(); } } if (Scribe.mode == LoadSaveMode.Saving || Scribe.mode == LoadSaveMode.LoadingVars) { keysWorkingList = new List <K>(); valuesWorkingList = new List <V>(); if (Scribe.mode == LoadSaveMode.Saving && dict != null) { foreach (KeyValuePair <K, V> item in dict) { keysWorkingList.Add(item.Key); valuesWorkingList.Add(item.Value); } } } Look(ref keysWorkingList, "keys", keyLookMode); Look(ref valuesWorkingList, "values", valueLookMode); if (Scribe.mode == LoadSaveMode.Saving) { if (keysWorkingList != null) { keysWorkingList.Clear(); keysWorkingList = null; } if (valuesWorkingList != null) { valuesWorkingList.Clear(); valuesWorkingList = null; } } bool flag = keyLookMode == LookMode.Reference || valueLookMode == LookMode.Reference; if (((flag && Scribe.mode == LoadSaveMode.ResolvingCrossRefs) || (!flag && Scribe.mode == LoadSaveMode.LoadingVars)) && dict != null) { if (keysWorkingList == null) { Log.Error("Cannot fill dictionary because there are no keys. label=" + label); } else if (valuesWorkingList == null) { Log.Error("Cannot fill dictionary because there are no values. label=" + label); } else { if (keysWorkingList.Count != valuesWorkingList.Count) { Log.Error("Keys count does not match the values count while loading a dictionary (maybe keys and values were resolved during different passes?). Some elements will be skipped. keys=" + keysWorkingList.Count + ", values=" + valuesWorkingList.Count + ", label=" + label); } int num = Math.Min(keysWorkingList.Count, valuesWorkingList.Count); for (int i = 0; i < num; i++) { if (keysWorkingList[i] == null) { Log.Error("Null key while loading dictionary of " + typeof(K) + " and " + typeof(V) + ". label=" + label); } else { try { dict.Add(keysWorkingList[i], valuesWorkingList[i]); } catch (OutOfMemoryException) { throw; } catch (Exception ex2) { Log.Error("Exception in LookDictionary(label=" + label + "): " + ex2); } } } } } if (Scribe.mode == LoadSaveMode.PostLoadInit) { if (keysWorkingList != null) { keysWorkingList.Clear(); keysWorkingList = null; } if (valuesWorkingList != null) { valuesWorkingList.Clear(); valuesWorkingList = null; } } } } finally { Scribe.ExitNode(); } } else if (Scribe.mode == LoadSaveMode.LoadingVars) { dict = null; } }
public static void LookList <T>(ref List <T> list, bool saveDestroyedThings, string label, LookMode lookMode = LookMode.Undefined, params object[] ctorArgs) { if (lookMode == LookMode.Undefined) { if (Helper_Parsing.HandlesType(typeof(T))) { lookMode = LookMode.Value; } else { lookMode = LookMode.Deep; } } if (Scribe.mode == LoadSaveMode.Saving) { if (list == null && lookMode == LookMode.Reference) { //Log.Warning(string.Concat(new object[] //{ // "Saving null list \"", // label, // "\" with look mode ", // lookMode, // ". This will cause bugs because null lists are not registered during loading so CrossRefResolver will break." //})); } Scribe.EnterNode(label); if (list == null) { Scribe.WriteAttribute("IsNull", "True"); } else { foreach (T current in list) { if (lookMode == LookMode.Value) { T t = current; Scribe_Values.LookValue <T>(ref t, "li", default(T), true); } else if (lookMode == LookMode.Deep) { T t2 = current; Scribe_Deep.LookDeep <T>(ref t2, "li", ctorArgs); } } } Scribe.ExitNode(); } else if (Scribe.mode == LoadSaveMode.LoadingVars) { if (Scribe.curParent == null) { //Log.Error("XmlHandling.curParent is null. I'm not sure why."); list = null; return; } XmlNode xmlNode = Scribe.curParent[label]; if (xmlNode == null) { list = null; return; } XmlAttribute xmlAttribute = xmlNode.Attributes["IsNull"]; if (xmlAttribute != null && xmlAttribute.Value.ToLower() == "true") { list = null; return; } if (lookMode == LookMode.Value) { list = new List <T>(xmlNode.ChildNodes.Count); foreach (XmlNode subNode in xmlNode.ChildNodes) { T item = ScribeExtractor.ValueFromNode <T>(subNode, default(T)); list.Add(item); } } else if (lookMode == LookMode.Deep) { list = new List <T>(xmlNode.ChildNodes.Count); foreach (XmlNode subNode2 in xmlNode.ChildNodes) { T item2 = ScribeExtractor.SaveableFromNode <T>(subNode2, ctorArgs); list.Add(item2); } } } }