From fba908f454a0e0ae1af7cf5247b5586ba8c4e001 Mon Sep 17 00:00:00 2001 From: KatDevsGames Date: Tue, 19 Sep 2023 21:27:44 -0500 Subject: [PATCH] add support for class (nested) properties --- .../Tiled/ContentWriterExtensions.cs | 8 ++++- .../ContentReaderExtensions.cs | 20 ++++++++++++ .../Serialization/TiledMapPropertyContent.cs | 7 +++- .../TiledMapProperties.cs | 10 ++++-- .../TiledMapPropertyValue.cs | 32 +++++++++++++++++++ .../MonoGame.Extended.Tiled/TiledMapReader.cs | 18 ++--------- .../TiledMapTilesetReader.cs | 22 +++---------- 7 files changed, 81 insertions(+), 36 deletions(-) create mode 100644 src/cs/MonoGame.Extended.Tiled/ContentReaderExtensions.cs create mode 100644 src/cs/MonoGame.Extended.Tiled/TiledMapPropertyValue.cs diff --git a/src/cs/MonoGame.Extended.Content.Pipeline/Tiled/ContentWriterExtensions.cs b/src/cs/MonoGame.Extended.Content.Pipeline/Tiled/ContentWriterExtensions.cs index 2b3ae142..28ded173 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 @@ namespace MonoGame.Extended.Content.Pipeline.Tiled // 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 00000000..86f1b6be --- /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 647a7f3e..10cdfc15 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 @@ namespace MonoGame.Extended.Tiled.Serialization [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 @@ namespace MonoGame.Extended.Tiled.Serialization 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 912de714..651ae5da 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 00000000..d7a08931 --- /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 3dd63cd3..580eddc3 100644 --- a/src/cs/MonoGame.Extended.Tiled/TiledMapReader.cs +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapReader.cs @@ -16,24 +16,12 @@ namespace MonoGame.Extended.Tiled 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 @@ namespace MonoGame.Extended.Tiled var parallaxFactor = new Vector2(parallaxX, parallaxY); var properties = new TiledMapProperties(); - ReadProperties(reader, properties); + reader.ReadTiledMapProperties(properties); TiledMapLayer layer; @@ -154,7 +142,7 @@ namespace MonoGame.Extended.Tiled 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 8ce0bb34..bd900c43 100644 --- a/src/cs/MonoGame.Extended.Tiled/TiledMapTilesetReader.cs +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapTilesetReader.cs @@ -38,12 +38,12 @@ namespace MonoGame.Extended.Tiled new TiledMapTilesetTile(localTileIdentifier, type, objects)) : ReadTiledMapTilesetTile(reader, tileset, objects => new TiledMapTilesetAnimatedTile(localTileIdentifier, ReadTiledMapTilesetAnimationFrames(reader, tileset, animationFramesCount), type, objects)); - - ReadProperties(reader, tilesetTile.Properties); + + reader.ReadTiledMapProperties(tilesetTile.Properties); tileset.Tiles.Add(tilesetTile); } - - ReadProperties(reader, tileset.Properties); + + reader.ReadTiledMapProperties(tileset.Properties); return tileset; } @@ -88,7 +88,7 @@ namespace MonoGame.Extended.Tiled var properties = new TiledMapProperties(); const float opacity = 1.0f; - ReadProperties(reader, properties); + reader.ReadTiledMapProperties(properties); TiledMapObject mapObject; @@ -134,17 +134,5 @@ namespace MonoGame.Extended.Tiled 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; - } - } } }