diff --git a/src/DotTiled/Serialization/Tmj/TmjReaderBase.Group.cs b/src/DotTiled/Serialization/Tmj/TmjReaderBase.Group.cs index 9548f1c..0df3c10 100644 --- a/src/DotTiled/Serialization/Tmj/TmjReaderBase.Group.cs +++ b/src/DotTiled/Serialization/Tmj/TmjReaderBase.Group.cs @@ -17,7 +17,7 @@ public abstract partial class TmjReaderBase var offsetY = element.GetOptionalProperty("offsety").GetValueOr(0.0f); var parallaxX = element.GetOptionalProperty("parallaxx").GetValueOr(1.0f); var parallaxY = element.GetOptionalProperty("parallaxy").GetValueOr(1.0f); - var properties = element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([]); + var properties = ResolveAndMergeProperties(@class, element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([])); var layers = element.GetOptionalPropertyCustom>("layers", e => e.GetValueAsList(ReadLayer)).GetValueOr([]); return new Group diff --git a/src/DotTiled/Serialization/Tmj/TmjReaderBase.ImageLayer.cs b/src/DotTiled/Serialization/Tmj/TmjReaderBase.ImageLayer.cs index 7034663..3d59779 100644 --- a/src/DotTiled/Serialization/Tmj/TmjReaderBase.ImageLayer.cs +++ b/src/DotTiled/Serialization/Tmj/TmjReaderBase.ImageLayer.cs @@ -16,7 +16,7 @@ public abstract partial class TmjReaderBase var offsetY = element.GetOptionalProperty("offsety").GetValueOr(0.0f); var parallaxX = element.GetOptionalProperty("parallaxx").GetValueOr(1.0f); var parallaxY = element.GetOptionalProperty("parallaxy").GetValueOr(1.0f); - var properties = element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([]); + var properties = ResolveAndMergeProperties(@class, element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([])); var image = element.GetRequiredProperty("image"); var repeatX = element.GetOptionalProperty("repeatx").GetValueOr(false); diff --git a/src/DotTiled/Serialization/Tmj/TmjReaderBase.ObjectLayer.cs b/src/DotTiled/Serialization/Tmj/TmjReaderBase.ObjectLayer.cs index 0456157..f90d986 100644 --- a/src/DotTiled/Serialization/Tmj/TmjReaderBase.ObjectLayer.cs +++ b/src/DotTiled/Serialization/Tmj/TmjReaderBase.ObjectLayer.cs @@ -19,7 +19,7 @@ public abstract partial class TmjReaderBase var offsetY = element.GetOptionalProperty("offsety").GetValueOr(0.0f); var parallaxX = element.GetOptionalProperty("parallaxx").GetValueOr(1.0f); var parallaxY = element.GetOptionalProperty("parallaxy").GetValueOr(1.0f); - var properties = element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([]); + var properties = ResolveAndMergeProperties(@class, element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([])); var x = element.GetOptionalProperty("x").GetValueOr(0); var y = element.GetOptionalProperty("y").GetValueOr(0); diff --git a/src/DotTiled/Serialization/Tmj/TmjReaderBase.TileLayer.cs b/src/DotTiled/Serialization/Tmj/TmjReaderBase.TileLayer.cs index 7c8791a..f33840d 100644 --- a/src/DotTiled/Serialization/Tmj/TmjReaderBase.TileLayer.cs +++ b/src/DotTiled/Serialization/Tmj/TmjReaderBase.TileLayer.cs @@ -30,7 +30,7 @@ public abstract partial class TmjReaderBase var opacity = element.GetOptionalProperty("opacity").GetValueOr(1.0f); var parallaxx = element.GetOptionalProperty("parallaxx").GetValueOr(1.0f); var parallaxy = element.GetOptionalProperty("parallaxy").GetValueOr(1.0f); - var properties = element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([]); + var properties = ResolveAndMergeProperties(@class, element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([])); var repeatX = element.GetOptionalProperty("repeatx").GetValueOr(false); var repeatY = element.GetOptionalProperty("repeaty").GetValueOr(false); var startX = element.GetOptionalProperty("startx").GetValueOr(0); diff --git a/src/DotTiled/Serialization/Tmj/TmjReaderBase.Tileset.cs b/src/DotTiled/Serialization/Tmj/TmjReaderBase.Tileset.cs index ea91acf..9263fa9 100644 --- a/src/DotTiled/Serialization/Tmj/TmjReaderBase.Tileset.cs +++ b/src/DotTiled/Serialization/Tmj/TmjReaderBase.Tileset.cs @@ -40,7 +40,7 @@ public abstract partial class TmjReaderBase "bottomright" => ObjectAlignment.BottomRight, _ => throw new JsonException($"Unknown object alignment '{s}'") }).GetValueOr(ObjectAlignment.Unspecified); - var properties = element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([]); + var properties = ResolveAndMergeProperties(@class, element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([])); var source = element.GetOptionalProperty("source"); var spacing = element.GetOptionalProperty("spacing"); var tileCount = element.GetOptionalProperty("tilecount"); @@ -166,8 +166,8 @@ public abstract partial class TmjReaderBase var height = e.GetOptionalProperty("height").GetValueOr(imageHeight.GetValueOr(0)); var objectGroup = e.GetOptionalPropertyCustom("objectgroup", e => ReadObjectLayer(e)); var probability = e.GetOptionalProperty("probability").GetValueOr(0.0f); - var properties = e.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([]); var type = e.GetOptionalProperty("type").GetValueOr(""); + var properties = ResolveAndMergeProperties(type, e.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([])); Optional imageModel = image.HasValue ? new Image { @@ -207,17 +207,17 @@ public abstract partial class TmjReaderBase internal Wangset ReadWangset(JsonElement element) { - var @clalss = element.GetOptionalProperty("class").GetValueOr(""); + var @class = element.GetOptionalProperty("class").GetValueOr(""); var colors = element.GetOptionalPropertyCustom>("colors", e => e.GetValueAsList(el => ReadWangColor(el))).GetValueOr([]); var name = element.GetRequiredProperty("name"); - var properties = element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([]); + var properties = ResolveAndMergeProperties(@class, element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([])); var tile = element.GetOptionalProperty("tile").GetValueOr(0); var type = element.GetOptionalProperty("type").GetValueOr(""); var wangTiles = element.GetOptionalPropertyCustom>("wangtiles", e => e.GetValueAsList(ReadWangTile)).GetValueOr([]); return new Wangset { - Class = @clalss, + Class = @class, WangColors = colors, Name = name, Properties = properties, @@ -232,7 +232,7 @@ public abstract partial class TmjReaderBase var color = element.GetRequiredPropertyParseable("color"); var name = element.GetRequiredProperty("name"); var probability = element.GetOptionalProperty("probability").GetValueOr(1.0f); - var properties = element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([]); + var properties = ResolveAndMergeProperties(@class, element.GetOptionalPropertyCustom("properties", ReadProperties).GetValueOr([])); var tile = element.GetOptionalProperty("tile").GetValueOr(0); return new WangColor diff --git a/src/DotTiled/Serialization/Tmx/TmxReaderBase.ObjectLayer.cs b/src/DotTiled/Serialization/Tmx/TmxReaderBase.ObjectLayer.cs index 67cd69a..85c669c 100644 --- a/src/DotTiled/Serialization/Tmx/TmxReaderBase.ObjectLayer.cs +++ b/src/DotTiled/Serialization/Tmx/TmxReaderBase.ObjectLayer.cs @@ -34,12 +34,13 @@ public abstract partial class TmxReaderBase }).GetValueOr(DrawOrder.TopDown); // Elements - List properties = null; + var propertiesCounter = 0; + List properties = Helpers.ResolveClassProperties(@class, _customTypeResolver); List objects = []; _reader.ProcessChildren("objectgroup", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(), "Properties"), + "properties" => () => Helpers.SetAtMostOnceUsingCounter(ref properties, Helpers.MergeProperties(properties, ReadProperties()).ToList(), "Properties", ref propertiesCounter), "object" => () => objects.Add(ReadObject()), _ => r.Skip }); @@ -101,7 +102,7 @@ public abstract partial class TmxReaderBase // Elements DotTiled.Object foundObject = null; int propertiesCounter = 0; - List properties = propertiesDefault; + List properties = Helpers.ResolveClassProperties(type, _customTypeResolver) ?? propertiesDefault; _reader.ProcessChildren("object", (r, elementName) => elementName switch { diff --git a/src/DotTiled/Serialization/Tmx/TmxReaderBase.TileLayer.cs b/src/DotTiled/Serialization/Tmx/TmxReaderBase.TileLayer.cs index d3a7106..974215b 100644 --- a/src/DotTiled/Serialization/Tmx/TmxReaderBase.TileLayer.cs +++ b/src/DotTiled/Serialization/Tmx/TmxReaderBase.TileLayer.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; namespace DotTiled.Serialization.Tmx; @@ -21,13 +22,14 @@ public abstract partial class TmxReaderBase var parallaxX = _reader.GetOptionalAttributeParseable("parallaxx").GetValueOr(1.0f); var parallaxY = _reader.GetOptionalAttributeParseable("parallaxy").GetValueOr(1.0f); - List properties = null; + var propertiesCounter = 0; + List properties = Helpers.ResolveClassProperties(@class, _customTypeResolver); Data data = null; _reader.ProcessChildren("layer", (r, elementName) => elementName switch { "data" => () => Helpers.SetAtMostOnce(ref data, ReadData(dataUsesChunks), "Data"), - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(), "Properties"), + "properties" => () => Helpers.SetAtMostOnceUsingCounter(ref properties, Helpers.MergeProperties(properties, ReadProperties()).ToList(), "Properties", ref propertiesCounter), _ => r.Skip }); @@ -69,13 +71,14 @@ public abstract partial class TmxReaderBase var repeatX = _reader.GetOptionalAttributeParseable("repeatx").GetValueOr(0) == 1; var repeatY = _reader.GetOptionalAttributeParseable("repeaty").GetValueOr(0) == 1; - List properties = null; + var propertiesCounter = 0; + List properties = Helpers.ResolveClassProperties(@class, _customTypeResolver); Image image = null; _reader.ProcessChildren("imagelayer", (r, elementName) => elementName switch { "image" => () => Helpers.SetAtMostOnce(ref image, ReadImage(), "Image"), - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(), "Properties"), + "properties" => () => Helpers.SetAtMostOnceUsingCounter(ref properties, Helpers.MergeProperties(properties, ReadProperties()).ToList(), "Properties", ref propertiesCounter), _ => r.Skip }); @@ -113,12 +116,13 @@ public abstract partial class TmxReaderBase var parallaxX = _reader.GetOptionalAttributeParseable("parallaxx").GetValueOr(1f); var parallaxY = _reader.GetOptionalAttributeParseable("parallaxy").GetValueOr(1f); - List properties = null; + var propertiesCounter = 0; + List properties = Helpers.ResolveClassProperties(@class, _customTypeResolver); List layers = []; _reader.ProcessChildren("group", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(), "Properties"), + "properties" => () => Helpers.SetAtMostOnceUsingCounter(ref properties, Helpers.MergeProperties(properties, ReadProperties()).ToList(), "Properties", ref propertiesCounter), "layer" => () => layers.Add(ReadTileLayer(false)), "objectgroup" => () => layers.Add(ReadObjectLayer()), "imagelayer" => () => layers.Add(ReadImageLayer()), diff --git a/src/DotTiled/Serialization/Tmx/TmxReaderBase.Tileset.cs b/src/DotTiled/Serialization/Tmx/TmxReaderBase.Tileset.cs index 971e6fd..2fc2540 100644 --- a/src/DotTiled/Serialization/Tmx/TmxReaderBase.Tileset.cs +++ b/src/DotTiled/Serialization/Tmx/TmxReaderBase.Tileset.cs @@ -68,7 +68,8 @@ public abstract partial class TmxReaderBase Image image = null; TileOffset tileOffset = null; Grid grid = null; - List properties = null; + var propertiesCounter = 0; + List properties = Helpers.ResolveClassProperties(@class, _customTypeResolver); List wangsets = null; Transformations transformations = null; List tiles = []; @@ -78,7 +79,7 @@ public abstract partial class TmxReaderBase "image" => () => Helpers.SetAtMostOnce(ref image, ReadImage(), "Image"), "tileoffset" => () => Helpers.SetAtMostOnce(ref tileOffset, ReadTileOffset(), "TileOffset"), "grid" => () => Helpers.SetAtMostOnce(ref grid, ReadGrid(), "Grid"), - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(), "Properties"), + "properties" => () => Helpers.SetAtMostOnceUsingCounter(ref properties, Helpers.MergeProperties(properties, ReadProperties()).ToList(), "Properties", ref propertiesCounter), "wangsets" => () => Helpers.SetAtMostOnce(ref wangsets, ReadWangsets(), "Wangsets"), "transformations" => () => Helpers.SetAtMostOnce(ref transformations, ReadTransformations(), "Transformations"), "tile" => () => tiles.Add(ReadTile()), @@ -197,14 +198,15 @@ public abstract partial class TmxReaderBase var height = _reader.GetOptionalAttributeParseable("height"); // Elements - List properties = null; + var propertiesCounter = 0; + List properties = Helpers.ResolveClassProperties(type, _customTypeResolver); Image image = null; ObjectLayer objectLayer = null; List animation = null; _reader.ProcessChildren("tile", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(), "Properties"), + "properties" => () => Helpers.SetAtMostOnceUsingCounter(ref properties, Helpers.MergeProperties(properties, ReadProperties()).ToList(), "Properties", ref propertiesCounter), "image" => () => Helpers.SetAtMostOnce(ref image, ReadImage(), "Image"), "objectgroup" => () => Helpers.SetAtMostOnce(ref objectLayer, ReadObjectLayer(), "ObjectLayer"), "animation" => () => Helpers.SetAtMostOnce(ref animation, r.ReadList("animation", "frame", (ar) => @@ -243,13 +245,14 @@ public abstract partial class TmxReaderBase var tile = _reader.GetRequiredAttributeParseable("tile"); // Elements - List properties = null; + var propertiesCounter = 0; + List properties = Helpers.ResolveClassProperties(@class, _customTypeResolver); List wangColors = []; List wangTiles = []; _reader.ProcessChildren("wangset", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(), "Properties"), + "properties" => () => Helpers.SetAtMostOnceUsingCounter(ref properties, Helpers.MergeProperties(properties, ReadProperties()).ToList(), "Properties", ref propertiesCounter), "wangcolor" => () => wangColors.Add(ReadWangColor()), "wangtile" => () => wangTiles.Add(ReadWangTile()), _ => r.Skip @@ -279,11 +282,12 @@ public abstract partial class TmxReaderBase var probability = _reader.GetOptionalAttributeParseable("probability").GetValueOr(0f); // Elements - List properties = null; + var propertiesCounter = 0; + List properties = Helpers.ResolveClassProperties(@class, _customTypeResolver); _reader.ProcessChildren("wangcolor", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(), "Properties"), + "properties" => () => Helpers.SetAtMostOnceUsingCounter(ref properties, Helpers.MergeProperties(properties, ReadProperties()).ToList(), "Properties", ref propertiesCounter), _ => r.Skip });