diff --git a/src/cs/MonoGame.Extended.Content.Pipeline/Tiled/ContentWriterExtensions.cs b/src/cs/MonoGame.Extended.Content.Pipeline/Tiled/ContentWriterExtensions.cs index 2b3ae1421..28ded1733 100644 --- a/src/cs/MonoGame.Extended.Content.Pipeline/Tiled/ContentWriterExtensions.cs +++ b/src/cs/MonoGame.Extended.Content.Pipeline/Tiled/ContentWriterExtensions.cs @@ -9,11 +9,17 @@ public static class ContentWriterExtensions // ReSharper disable once SuggestBaseTypeForParameter public static void WriteTiledMapProperties(this ContentWriter writer, IReadOnlyCollection value) { + if (value == null) + { + writer.Write(0); + return; + } writer.Write(value.Count); foreach (var property in value) { writer.Write(property.Name); - writer.Write(property.Value); + writer.Write(property.Value ?? string.Empty); + WriteTiledMapProperties(writer, property.Properties); } } } diff --git a/src/cs/MonoGame.Extended.Tiled/ContentReaderExtensions.cs b/src/cs/MonoGame.Extended.Tiled/ContentReaderExtensions.cs new file mode 100644 index 000000000..86f1b6be9 --- /dev/null +++ b/src/cs/MonoGame.Extended.Tiled/ContentReaderExtensions.cs @@ -0,0 +1,20 @@ +using Microsoft.Xna.Framework.Content; + +namespace MonoGame.Extended.Tiled +{ + public static class ContentReaderExtensions + { + public static void ReadTiledMapProperties(this ContentReader reader, TiledMapProperties properties) + { + var count = reader.ReadInt32(); + + for (var i = 0; i < count; i++) + { + var key = reader.ReadString(); + var value = new TiledMapPropertyValue(reader.ReadString()); + ReadTiledMapProperties(reader, value.Properties); + properties[key] = value; + } + } + } +} diff --git a/src/cs/MonoGame.Extended.Tiled/Serialization/TiledMapPropertyContent.cs b/src/cs/MonoGame.Extended.Tiled/Serialization/TiledMapPropertyContent.cs index 647a7f3e8..10cdfc15c 100644 --- a/src/cs/MonoGame.Extended.Tiled/Serialization/TiledMapPropertyContent.cs +++ b/src/cs/MonoGame.Extended.Tiled/Serialization/TiledMapPropertyContent.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Xml.Serialization; namespace MonoGame.Extended.Tiled.Serialization @@ -13,6 +14,10 @@ public class TiledMapPropertyContent [XmlText] public string ValueBody { get; set; } + [XmlArray("properties")] + [XmlArrayItem("property")] + public List Properties { get; set; } + public string Value => ValueAttribute ?? ValueBody; public override string ToString() @@ -20,4 +25,4 @@ public override string ToString() return $"{Name}: {Value}"; } } -} \ No newline at end of file +} diff --git a/src/cs/MonoGame.Extended.Tiled/TiledMapProperties.cs b/src/cs/MonoGame.Extended.Tiled/TiledMapProperties.cs index 912de7142..651ae5dab 100644 --- a/src/cs/MonoGame.Extended.Tiled/TiledMapProperties.cs +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapProperties.cs @@ -2,7 +2,13 @@ namespace MonoGame.Extended.Tiled { - public class TiledMapProperties : Dictionary + public class TiledMapProperties : Dictionary { + public bool TryGetValue(string key, out string value) + { + bool result = TryGetValue(key, out TiledMapPropertyValue tmpVal); + value = result ? null : tmpVal.Value; + return result; + } } -} \ No newline at end of file +} diff --git a/src/cs/MonoGame.Extended.Tiled/TiledMapPropertyValue.cs b/src/cs/MonoGame.Extended.Tiled/TiledMapPropertyValue.cs new file mode 100644 index 000000000..d7a089318 --- /dev/null +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapPropertyValue.cs @@ -0,0 +1,32 @@ +namespace MonoGame.Extended.Tiled; + +public class TiledMapPropertyValue +{ + public string Value { get; } + + public TiledMapProperties Properties; + + public TiledMapPropertyValue() + { + Value = string.Empty; + Properties = new(); + } + + public TiledMapPropertyValue(string value) + { + Value = value; + Properties = new(); + } + + public TiledMapPropertyValue(TiledMapProperties properties) + { + Value = string.Empty; + Properties = properties; + } + + public override string ToString() => Value; + + //public static implicit operator TiledMapPropertyValue(string value) => new(value); + public static implicit operator string(TiledMapPropertyValue value) => value.Value; + public static implicit operator TiledMapProperties(TiledMapPropertyValue value) => value.Properties; +} diff --git a/src/cs/MonoGame.Extended.Tiled/TiledMapReader.cs b/src/cs/MonoGame.Extended.Tiled/TiledMapReader.cs index 3dd63cd3f..580eddc32 100644 --- a/src/cs/MonoGame.Extended.Tiled/TiledMapReader.cs +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapReader.cs @@ -16,24 +16,12 @@ protected override TiledMap Read(ContentReader reader, TiledMap existingInstance return existingInstance; var map = ReadTiledMap(reader); - ReadProperties(reader, map.Properties); + reader.ReadTiledMapProperties(map.Properties); ReadTilesets(reader, map); ReadLayers(reader, map); return map; } - private static void ReadProperties(ContentReader reader, TiledMapProperties properties) - { - var count = reader.ReadInt32(); - - for (var i = 0; i < count; i++) - { - var key = reader.ReadString(); - var value = reader.ReadString(); - properties[key] = value; - } - } - private static TiledMap ReadTiledMap(ContentReader reader) { var name = reader.AssetName; @@ -98,7 +86,7 @@ private static TiledMapLayer ReadLayer(ContentReader reader, TiledMap map) var parallaxFactor = new Vector2(parallaxX, parallaxY); var properties = new TiledMapProperties(); - ReadProperties(reader, properties); + reader.ReadTiledMapProperties(properties); TiledMapLayer layer; @@ -154,7 +142,7 @@ private static TiledMapObject ReadTiledMapObject(ContentReader reader, TiledMap var properties = new TiledMapProperties(); const float opacity = 1.0f; - ReadProperties(reader, properties); + reader.ReadTiledMapProperties(properties); TiledMapObject mapObject; diff --git a/src/cs/MonoGame.Extended.Tiled/TiledMapTilesetReader.cs b/src/cs/MonoGame.Extended.Tiled/TiledMapTilesetReader.cs index 9dee3735b..3fb0972c7 100644 --- a/src/cs/MonoGame.Extended.Tiled/TiledMapTilesetReader.cs +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapTilesetReader.cs @@ -31,7 +31,7 @@ public static TiledMapTileset ReadTileset(ContentReader reader) for (var tileIndex = 0; tileIndex < explicitTileCount; tileIndex++) ReadTile(reader, tileset); - ReadProperties(reader, tileset.Properties); + reader.ReadTiledMapProperties(tileset.Properties); return tileset; } @@ -53,7 +53,7 @@ private static void ReadTile(ContentReader reader, TiledMapTileset tileset) : new TiledMapTilesetAnimatedTile(localTileIdentifier, ReadTiledMapTilesetAnimationFrames(reader, tileset, animationFramesCount), type, objects, texture); - ReadProperties(reader, tilesetTile.Properties); + reader.ReadTiledMapProperties(tilesetTile.Properties); tileset.Tiles.Add(tilesetTile); } @@ -99,7 +99,7 @@ private static TiledMapObject ReadTiledMapObject(ContentReader reader, TiledMapT var properties = new TiledMapProperties(); const float opacity = 1.0f; - ReadProperties(reader, properties); + reader.ReadTiledMapProperties(properties); TiledMapObject mapObject; @@ -145,17 +145,5 @@ private static Point2[] ReadPoints(ContentReader reader) return points; } - - private static void ReadProperties(ContentReader reader, TiledMapProperties properties) - { - var count = reader.ReadInt32(); - - for (var i = 0; i < count; i++) - { - var key = reader.ReadString(); - var value = reader.ReadString(); - properties[key] = value; - } - } } }