166 lines
5.6 KiB
C#
166 lines
5.6 KiB
C#
|
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<String, CustomProperty>, 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();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Must be called after all Items have been deserialized.
|
||
|
/// Restores the Item references in CustomProperties of type Item.
|
||
|
/// </summary>
|
||
|
public void RestoreItemAssociations(Level level)
|
||
|
{
|
||
|
foreach (CustomProperty cp in Values)
|
||
|
{
|
||
|
if (cp.type == typeof(Item)) cp.value = level.getItemByName((string)cp.value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|