public static MainViewModel FromXML(XElement xml) { MainViewModel mvm = new MainViewModel(); XElement statusEffects = xml.Element("StatusEffects"); if (statusEffects != null) { foreach (var a in statusEffects.Elements("StatusEffect")) { mvm.StatusEffects.Add(StatusEffect.FromXML(a)); } } XElement zones = xml.Element("Zones"); if (zones != null) { mvm.Zones = new ObservableCollection <Zone>(from a in zones.Elements("Zone") select Zone.FromXML(a)); } //Link the exits. foreach (var sourceZone in mvm.Zones) { foreach (var sourceRoom in sourceZone.Rooms) { foreach (var exit in sourceRoom.Exits) { foreach (var destZone in mvm.Zones) { if (exit.ZoneID == destZone.ZoneId) { foreach (var destRoom in destZone.Rooms) { if (exit.RoomID == destRoom.RoomID) { exit.ZoneLink = destZone; exit.RoomLink = destRoom; } } } } } } } XElement interactables = xml.Element("Interactables"); if (interactables != null) { mvm.Interactables = new ObservableCollection <Interactable>(from a in interactables.Elements("Interactable") select Interactable.FromXML(a)); } XElement variables = xml.Element("Variables"); if (variables != null) { mvm.Variables = new ObservableCollection <Variable>(from a in variables.Elements("Variable") select Variable.FromXML(a)); } XElement arrays = xml.Element("Arrays"); if (arrays != null) { mvm.Arrays = new ObservableCollection <VarArray>(); mvm.Arrays = new ObservableCollection <VarArray>(from a in arrays.Elements("Array") select VarArray.FromXML(a)); } else { mvm.Arrays = new ObservableCollection <VarArray>(); } mvm.InteractableGroups.Clear(); mvm.RecalculateInteractableGroups(); XElement itemClasses = xml.Element("ItemClasses"); mvm.ItemClasses = new ObservableCollection <ItemClass>(); if (itemClasses != null) { foreach (var a in itemClasses.Elements("ItemClass")) { mvm.ItemClasses.Add(ItemClass.FromXML(a)); } } XElement settings = xml.Element("PlayerSettings"); if (settings != null) { mvm.Settings = PlayerSettings.FromXML(settings); } XElement items = xml.Element("Items"); mvm.Items = new ObservableCollection <Item>(); if (items != null) { foreach (var a in items.Elements("Item")) { mvm.Items.Add(Item.FromXml(a)); } } XElement commonEvents = xml.Element("CommonEvents"); if (commonEvents != null) { foreach (var a in commonEvents.Elements("CommonEvent")) { mvm.CommonEvents.Add(CommonEvent.FromXML(a)); } } XElement conversations = xml.Element("Conversations"); if (conversations != null) { foreach (var a in conversations.Elements("Conversation")) { mvm.Conversations.Add(Conversation.FromXML(a)); } } //Resolve all interactable references //foreach (var a in mvm.InteractableRefStack) //{ // var guid = a.Value; // var list = a.Key; // var interactable = mvm.Interactables.Where(i => i.InteractableID == guid).FirstOrDefault(); //} return(mvm); }