using System; using System.Collections.Generic; using System.Linq; using System.Text; using FarseerPhysics.Dynamics; using FarseerPhysics.Common; using FarseerPhysics.SamplesFramework; using FarseerPhysics.Factories; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework; using System.Xml; using System.Xml.Serialization; namespace Axios.Engine.Glee2D { /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// // // NEEDED FOR SERIALIZATION. YOU SHOULDN'T CHANGE ANYTHING BELOW! // /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// public class CustomProperty { public string name; public object value; public Type type; public string description; public CustomProperty() { } public CustomProperty(string n, object v, Type t, string d) { name = n; value = v; type = t; description = d; } public CustomProperty clone() { CustomProperty result = new CustomProperty(name, value, type, description); return result; } } public class SerializableDictionary : Dictionary, IXmlSerializable { public SerializableDictionary() : base() { } public SerializableDictionary(SerializableDictionary copyfrom) : base(copyfrom) { string[] keyscopy = new string[Keys.Count]; Keys.CopyTo(keyscopy, 0); foreach (string key in keyscopy) { this[key] = this[key].clone(); } } public System.Xml.Schema.XmlSchema GetSchema() { return null; } public void ReadXml(System.Xml.XmlReader reader) { bool wasEmpty = reader.IsEmptyElement; reader.Read(); if (wasEmpty) return; while (reader.NodeType != System.Xml.XmlNodeType.EndElement) { CustomProperty cp = new CustomProperty(); cp.name = reader.GetAttribute("Name"); cp.description = reader.GetAttribute("Description"); string type = reader.GetAttribute("Type"); if (type == "string") cp.type = typeof(string); if (type == "bool") cp.type = typeof(bool); if (type == "Vector2") cp.type = typeof(Vector2); if (type == "Color") cp.type = typeof(Color); if (type == "Item") cp.type = typeof(Item); if (cp.type == typeof(Item)) { cp.value = reader.ReadInnerXml(); this.Add(cp.name, cp); } else { reader.ReadStartElement("Property"); XmlSerializer valueSerializer = new XmlSerializer(cp.type); object obj = valueSerializer.Deserialize(reader); #if WINDOWS cp.value = Convert.ChangeType(obj, cp.type); #elif WINDOWS_PHONE || XBOX360 cp.value = Convert.ChangeType(obj, cp.type, null); #endif this.Add(cp.name, cp); reader.ReadEndElement(); } reader.MoveToContent(); } reader.ReadEndElement(); } public void WriteXml(System.Xml.XmlWriter writer) { foreach (String key in this.Keys) { writer.WriteStartElement("Property"); writer.WriteAttributeString("Name", this[key].name); if (this[key].type == typeof(string)) writer.WriteAttributeString("Type", "string"); if (this[key].type == typeof(bool)) writer.WriteAttributeString("Type", "bool"); if (this[key].type == typeof(Vector2)) writer.WriteAttributeString("Type", "Vector2"); if (this[key].type == typeof(Color)) writer.WriteAttributeString("Type", "Color"); if (this[key].type == typeof(Item)) writer.WriteAttributeString("Type", "Item"); writer.WriteAttributeString("Description", this[key].description); if (this[key].type == typeof(Item)) { Item item = (Item)this[key].value; if (item != null) writer.WriteString(item.Name); else writer.WriteString("$null$"); } else { XmlSerializer valueSerializer = new XmlSerializer(this[key].type); valueSerializer.Serialize(writer, this[key].value); } writer.WriteEndElement(); } } /// /// Must be called after all Items have been deserialized. /// Restores the Item references in CustomProperties of type Item. /// public void RestoreItemAssociations(Level level) { foreach (CustomProperty cp in Values) { if (cp.type == typeof(Item)) cp.value = level.getItemByName((string)cp.value); } } } }