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);
        }