From bb74d3cceef64a5a51e83004c64c56ac82c3d5b7 Mon Sep 17 00:00:00 2001 From: Daniel Cronqvist Date: Sat, 10 Aug 2024 21:36:13 +0200 Subject: [PATCH] Added same CustomTypeDefinition stuff to Tmx --- .../Serialization/Tmx/TmxMapReaderTests.cs | 97 ++++++++++++++++--- DotTiled/Serialization/Tmx/Tmx.Map.cs | 18 ++-- DotTiled/Serialization/Tmx/Tmx.ObjectLayer.cs | 26 +++-- DotTiled/Serialization/Tmx/Tmx.Properties.cs | 32 ++++-- DotTiled/Serialization/Tmx/Tmx.TileLayer.cs | 28 ++++-- DotTiled/Serialization/Tmx/Tmx.Tileset.cs | 41 +++++--- DotTiled/Serialization/Tmx/TmxMapReader.cs | 11 ++- .../Serialization/Tmx/TsxTilesetReader.cs | 14 ++- .../Serialization/Tmx/TxTemplateReader.cs | 12 ++- 9 files changed, 213 insertions(+), 66 deletions(-) diff --git a/DotTiled.Tests/Serialization/Tmx/TmxMapReaderTests.cs b/DotTiled.Tests/Serialization/Tmx/TmxMapReaderTests.cs index 7c25d1b..3556893 100644 --- a/DotTiled.Tests/Serialization/Tmx/TmxMapReaderTests.cs +++ b/DotTiled.Tests/Serialization/Tmx/TmxMapReaderTests.cs @@ -15,7 +15,7 @@ public partial class TmxMapReaderTests // Act Action act = () => { - using var _ = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver); + using var _ = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver, []); }; // Assert @@ -34,7 +34,7 @@ public partial class TmxMapReaderTests // Act Action act = () => { - using var _ = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver); + using var _ = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver, []); }; // Assert @@ -53,7 +53,7 @@ public partial class TmxMapReaderTests // Act Action act = () => { - using var _ = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver); + using var _ = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver, []); }; // Assert @@ -70,7 +70,7 @@ public partial class TmxMapReaderTests Func externalTemplateResolver = (_) => new Template { Object = new RectangleObject { } }; // Act - using var tmxMapReader = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver); + using var tmxMapReader = new TmxMapReader(xmlReader, externalTilesetResolver, externalTemplateResolver, []); // Assert Assert.NotNull(tmxMapReader); @@ -91,20 +91,55 @@ public partial class TmxMapReaderTests public void TmxMapReaderReadMap_ValidXmlNoExternalTilesets_ReturnsMapThatEqualsExpected(string testDataFile, Map expectedMap) { // Arrange + CustomTypeDefinition[] customTypeDefinitions = [ + new CustomClassDefinition + { + Name = "TestClass", + ID = 1, + UseAs = CustomClassUseAs.Property, + Members = [ + new StringProperty + { + Name = "Name", + Value = "" + }, + new FloatProperty + { + Name = "Amount", + Value = 0f + } + ] + }, + new CustomClassDefinition + { + Name = "Test", + ID = 2, + UseAs = CustomClassUseAs.All, + Members = [ + new ClassProperty + { + Name = "Yep", + PropertyType = "TestClass", + Properties = [] + } + ] + } + ]; + using var reader = TestData.GetXmlReaderFor(testDataFile); - static Template ResolveTemplate(string source) + Template ResolveTemplate(string source) { using var xmlTemplateReader = TestData.GetXmlReaderFor($"Serialization.TestData.Template.{source}"); - using var templateReader = new TxTemplateReader(xmlTemplateReader, ResolveTileset, ResolveTemplate); + using var templateReader = new TxTemplateReader(xmlTemplateReader, ResolveTileset, ResolveTemplate, customTypeDefinitions); return templateReader.ReadTemplate(); } - static Tileset ResolveTileset(string source) + Tileset ResolveTileset(string source) { using var xmlTilesetReader = TestData.GetXmlReaderFor($"Serialization.TestData.Tileset.{source}"); - using var tilesetReader = new TsxTilesetReader(xmlTilesetReader, ResolveTemplate); + using var tilesetReader = new TsxTilesetReader(xmlTilesetReader, ResolveTemplate, customTypeDefinitions); return tilesetReader.ReadTileset(); } - using var mapReader = new TmxMapReader(reader, ResolveTileset, ResolveTemplate); + using var mapReader = new TmxMapReader(reader, ResolveTileset, ResolveTemplate, customTypeDefinitions); // Act var map = mapReader.ReadMap(); @@ -125,20 +160,54 @@ public partial class TmxMapReaderTests public void TmxMapReaderReadMap_ValidXmlExternalTilesetsAndTemplates_ReturnsMapThatEqualsExpected(string testDataFile, Map expectedMap) { // Arrange + CustomTypeDefinition[] customTypeDefinitions = [ + new CustomClassDefinition + { + Name = "TestClass", + ID = 1, + UseAs = CustomClassUseAs.Property, + Members = [ + new StringProperty + { + Name = "Name", + Value = "" + }, + new FloatProperty + { + Name = "Amount", + Value = 0f + } + ] + }, + new CustomClassDefinition + { + Name = "Test", + ID = 2, + UseAs = CustomClassUseAs.All, + Members = [ + new ClassProperty + { + Name = "Yep", + PropertyType = "TestClass", + Properties = [] + } + ] + } + ]; using var reader = TestData.GetXmlReaderFor(testDataFile); - static Template ResolveTemplate(string source) + Template ResolveTemplate(string source) { using var xmlTemplateReader = TestData.GetXmlReaderFor($"Serialization.TestData.Template.{source}"); - using var templateReader = new TxTemplateReader(xmlTemplateReader, ResolveTileset, ResolveTemplate); + using var templateReader = new TxTemplateReader(xmlTemplateReader, ResolveTileset, ResolveTemplate, customTypeDefinitions); return templateReader.ReadTemplate(); } - static Tileset ResolveTileset(string source) + Tileset ResolveTileset(string source) { using var xmlTilesetReader = TestData.GetXmlReaderFor($"Serialization.TestData.Tileset.{source}"); - using var tilesetReader = new TsxTilesetReader(xmlTilesetReader, ResolveTemplate); + using var tilesetReader = new TsxTilesetReader(xmlTilesetReader, ResolveTemplate, customTypeDefinitions); return tilesetReader.ReadTileset(); } - using var mapReader = new TmxMapReader(reader, ResolveTileset, ResolveTemplate); + using var mapReader = new TmxMapReader(reader, ResolveTileset, ResolveTemplate, customTypeDefinitions); // Act var map = mapReader.ReadMap(); diff --git a/DotTiled/Serialization/Tmx/Tmx.Map.cs b/DotTiled/Serialization/Tmx/Tmx.Map.cs index d43d0b1..bb7f1ae 100644 --- a/DotTiled/Serialization/Tmx/Tmx.Map.cs +++ b/DotTiled/Serialization/Tmx/Tmx.Map.cs @@ -8,7 +8,11 @@ namespace DotTiled; internal partial class Tmx { - internal static Map ReadMap(XmlReader reader, Func externalTilesetResolver, Func externalTemplateResolver) + internal static Map ReadMap( + XmlReader reader, + Func externalTilesetResolver, + Func externalTemplateResolver, + IReadOnlyCollection customTypeDefinitions) { // Attributes var version = reader.GetRequiredAttribute("version"); @@ -64,12 +68,12 @@ internal partial class Tmx reader.ProcessChildren("map", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r), "Properties"), - "tileset" => () => tilesets.Add(ReadTileset(r, externalTilesetResolver, externalTemplateResolver)), - "layer" => () => layers.Add(ReadTileLayer(r, dataUsesChunks: infinite)), - "objectgroup" => () => layers.Add(ReadObjectLayer(r, externalTemplateResolver)), - "imagelayer" => () => layers.Add(ReadImageLayer(r)), - "group" => () => layers.Add(ReadGroup(r, externalTemplateResolver)), + "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r, customTypeDefinitions), "Properties"), + "tileset" => () => tilesets.Add(ReadTileset(r, externalTilesetResolver, externalTemplateResolver, customTypeDefinitions)), + "layer" => () => layers.Add(ReadTileLayer(r, infinite, customTypeDefinitions)), + "objectgroup" => () => layers.Add(ReadObjectLayer(r, externalTemplateResolver, customTypeDefinitions)), + "imagelayer" => () => layers.Add(ReadImageLayer(r, customTypeDefinitions)), + "group" => () => layers.Add(ReadGroup(r, externalTemplateResolver, customTypeDefinitions)), _ => r.Skip }); diff --git a/DotTiled/Serialization/Tmx/Tmx.ObjectLayer.cs b/DotTiled/Serialization/Tmx/Tmx.ObjectLayer.cs index 2c52429..4fb0ce6 100644 --- a/DotTiled/Serialization/Tmx/Tmx.ObjectLayer.cs +++ b/DotTiled/Serialization/Tmx/Tmx.ObjectLayer.cs @@ -9,7 +9,10 @@ namespace DotTiled; internal partial class Tmx { - internal static ObjectLayer ReadObjectLayer(XmlReader reader, Func externalTemplateResolver) + internal static ObjectLayer ReadObjectLayer( + XmlReader reader, + Func externalTemplateResolver, + IReadOnlyCollection customTypeDefinitions) { // Attributes var id = reader.GetRequiredAttributeParseable("id"); @@ -40,8 +43,8 @@ internal partial class Tmx reader.ProcessChildren("objectgroup", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r), "Properties"), - "object" => () => objects.Add(ReadObject(r, externalTemplateResolver)), + "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r, customTypeDefinitions), "Properties"), + "object" => () => objects.Add(ReadObject(r, externalTemplateResolver, customTypeDefinitions)), _ => r.Skip }); @@ -68,7 +71,10 @@ internal partial class Tmx }; } - internal static Object ReadObject(XmlReader reader, Func externalTemplateResolver) + internal static Object ReadObject( + XmlReader reader, + Func externalTemplateResolver, + IReadOnlyCollection customTypeDefinitions) { // Attributes var template = reader.GetOptionalAttribute("template"); @@ -122,7 +128,7 @@ internal partial class Tmx reader.ProcessChildren("object", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnceUsingCounter(ref properties, MergeProperties(properties, ReadProperties(r)), "Properties", ref propertiesCounter), + "properties" => () => Helpers.SetAtMostOnceUsingCounter(ref properties, MergeProperties(properties, ReadProperties(r, customTypeDefinitions)), "Properties", ref propertiesCounter), "ellipse" => () => Helpers.SetAtMostOnce(ref obj, ReadEllipseObject(r), "Object marker"), "point" => () => Helpers.SetAtMostOnce(ref obj, ReadPointObject(r), "Object marker"), "polygon" => () => Helpers.SetAtMostOnce(ref obj, ReadPolygonObject(r), "Object marker"), @@ -280,7 +286,11 @@ internal partial class Tmx }; } - internal static Template ReadTemplate(XmlReader reader, Func externalTilesetResolver, Func externalTemplateResolver) + internal static Template ReadTemplate( + XmlReader reader, + Func externalTilesetResolver, + Func externalTemplateResolver, + IReadOnlyCollection customTypeDefinitions) { // No attributes @@ -292,8 +302,8 @@ internal partial class Tmx reader.ProcessChildren("template", (r, elementName) => elementName switch { - "tileset" => () => Helpers.SetAtMostOnce(ref tileset, ReadTileset(r, externalTilesetResolver, externalTemplateResolver), "Tileset"), - "object" => () => Helpers.SetAtMostOnce(ref obj, ReadObject(r, externalTemplateResolver), "Object"), + "tileset" => () => Helpers.SetAtMostOnce(ref tileset, ReadTileset(r, externalTilesetResolver, externalTemplateResolver, customTypeDefinitions), "Tileset"), + "object" => () => Helpers.SetAtMostOnce(ref obj, ReadObject(r, externalTemplateResolver, customTypeDefinitions), "Object"), _ => r.Skip }); diff --git a/DotTiled/Serialization/Tmx/Tmx.Properties.cs b/DotTiled/Serialization/Tmx/Tmx.Properties.cs index 5609a85..0de4adf 100644 --- a/DotTiled/Serialization/Tmx/Tmx.Properties.cs +++ b/DotTiled/Serialization/Tmx/Tmx.Properties.cs @@ -6,7 +6,9 @@ namespace DotTiled; internal partial class Tmx { - internal static Dictionary ReadProperties(XmlReader reader) + internal static Dictionary ReadProperties( + XmlReader reader, + IReadOnlyCollection customTypeDefinitions) { return reader.ReadList("properties", "property", (r) => { @@ -33,22 +35,38 @@ internal partial class Tmx PropertyType.Color => new ColorProperty { Name = name, Value = r.GetRequiredAttributeParseable("value") }, PropertyType.File => new FileProperty { Name = name, Value = r.GetRequiredAttribute("value") }, PropertyType.Object => new ObjectProperty { Name = name, Value = r.GetRequiredAttributeParseable("value") }, - PropertyType.Class => ReadClassProperty(r), + PropertyType.Class => ReadClassProperty(r, customTypeDefinitions), _ => throw new XmlException("Invalid property type") }; return (name, property); }).ToDictionary(x => x.name, x => x.property); } - internal static ClassProperty ReadClassProperty(XmlReader reader) + internal static ClassProperty ReadClassProperty( + XmlReader reader, + IReadOnlyCollection customTypeDefinitions) { var name = reader.GetRequiredAttribute("name"); var propertyType = reader.GetRequiredAttribute("propertytype"); - reader.ReadStartElement("property"); - var properties = ReadProperties(reader); - reader.ReadEndElement(); + var customTypeDef = customTypeDefinitions.FirstOrDefault(ctd => ctd.Name == propertyType); + if (customTypeDef is CustomClassDefinition ccd) + { + reader.ReadStartElement("property"); + var propsInType = CreateInstanceOfCustomClass(ccd); + var props = ReadProperties(reader, customTypeDefinitions); - return new ClassProperty { Name = name, PropertyType = propertyType, Properties = properties }; + var mergedProps = MergeProperties(propsInType, props); + + reader.ReadEndElement(); + return new ClassProperty { Name = name, PropertyType = propertyType, Properties = mergedProps }; + } + + throw new XmlException($"Unkonwn custom class definition: {propertyType}"); + } + + internal static Dictionary CreateInstanceOfCustomClass(CustomClassDefinition customClassDefinition) + { + return customClassDefinition.Members.ToDictionary(m => m.Name, m => m.Clone()); } } diff --git a/DotTiled/Serialization/Tmx/Tmx.TileLayer.cs b/DotTiled/Serialization/Tmx/Tmx.TileLayer.cs index e162542..78096e3 100644 --- a/DotTiled/Serialization/Tmx/Tmx.TileLayer.cs +++ b/DotTiled/Serialization/Tmx/Tmx.TileLayer.cs @@ -7,7 +7,10 @@ namespace DotTiled; internal partial class Tmx { - internal static TileLayer ReadTileLayer(XmlReader reader, bool dataUsesChunks) + internal static TileLayer ReadTileLayer( + XmlReader reader, + bool dataUsesChunks, + IReadOnlyCollection customTypeDefinitions) { var id = reader.GetRequiredAttributeParseable("id"); var name = reader.GetOptionalAttribute("name") ?? ""; @@ -30,7 +33,7 @@ internal partial class Tmx reader.ProcessChildren("layer", (r, elementName) => elementName switch { "data" => () => Helpers.SetAtMostOnce(ref data, ReadData(r, dataUsesChunks), "Data"), - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r), "Properties"), + "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r, customTypeDefinitions), "Properties"), _ => r.Skip }); @@ -55,7 +58,9 @@ internal partial class Tmx }; } - internal static ImageLayer ReadImageLayer(XmlReader reader) + internal static ImageLayer ReadImageLayer( + XmlReader reader, + IReadOnlyCollection customTypeDefinitions) { var id = reader.GetRequiredAttributeParseable("id"); var name = reader.GetOptionalAttribute("name") ?? ""; @@ -78,7 +83,7 @@ internal partial class Tmx reader.ProcessChildren("imagelayer", (r, elementName) => elementName switch { "image" => () => Helpers.SetAtMostOnce(ref image, ReadImage(r), "Image"), - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r), "Properties"), + "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r, customTypeDefinitions), "Properties"), _ => r.Skip }); @@ -103,7 +108,10 @@ internal partial class Tmx }; } - internal static Group ReadGroup(XmlReader reader, Func externalTemplateResolver) + internal static Group ReadGroup( + XmlReader reader, + Func externalTemplateResolver, + IReadOnlyCollection customTypeDefinitions) { var id = reader.GetRequiredAttributeParseable("id"); var name = reader.GetOptionalAttribute("name") ?? ""; @@ -121,11 +129,11 @@ internal partial class Tmx reader.ProcessChildren("group", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r), "Properties"), - "layer" => () => layers.Add(ReadTileLayer(r, dataUsesChunks: false)), - "objectgroup" => () => layers.Add(ReadObjectLayer(r, externalTemplateResolver)), - "imagelayer" => () => layers.Add(ReadImageLayer(r)), - "group" => () => layers.Add(ReadGroup(r, externalTemplateResolver)), + "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r, customTypeDefinitions), "Properties"), + "layer" => () => layers.Add(ReadTileLayer(r, false, customTypeDefinitions)), + "objectgroup" => () => layers.Add(ReadObjectLayer(r, externalTemplateResolver, customTypeDefinitions)), + "imagelayer" => () => layers.Add(ReadImageLayer(r, customTypeDefinitions)), + "group" => () => layers.Add(ReadGroup(r, externalTemplateResolver, customTypeDefinitions)), _ => r.Skip }); diff --git a/DotTiled/Serialization/Tmx/Tmx.Tileset.cs b/DotTiled/Serialization/Tmx/Tmx.Tileset.cs index 3c2a3a8..3885dac 100644 --- a/DotTiled/Serialization/Tmx/Tmx.Tileset.cs +++ b/DotTiled/Serialization/Tmx/Tmx.Tileset.cs @@ -8,7 +8,11 @@ namespace DotTiled; internal partial class Tmx { - internal static Tileset ReadTileset(XmlReader reader, Func? externalTilesetResolver, Func externalTemplateResolver) + internal static Tileset ReadTileset( + XmlReader reader, + Func? externalTilesetResolver, + Func externalTemplateResolver, + IReadOnlyCollection customTypeDefinitions) { // Attributes var version = reader.GetOptionalAttribute("version"); @@ -64,10 +68,10 @@ internal partial class Tmx "image" => () => Helpers.SetAtMostOnce(ref image, ReadImage(r), "Image"), "tileoffset" => () => Helpers.SetAtMostOnce(ref tileOffset, ReadTileOffset(r), "TileOffset"), "grid" => () => Helpers.SetAtMostOnce(ref grid, ReadGrid(r), "Grid"), - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r), "Properties"), - "wangsets" => () => Helpers.SetAtMostOnce(ref wangsets, ReadWangsets(r), "Wangsets"), + "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r, customTypeDefinitions), "Properties"), + "wangsets" => () => Helpers.SetAtMostOnce(ref wangsets, ReadWangsets(r, customTypeDefinitions), "Wangsets"), "transformations" => () => Helpers.SetAtMostOnce(ref transformations, ReadTransformations(r), "Transformations"), - "tile" => () => tiles.Add(ReadTile(r, externalTemplateResolver)), + "tile" => () => tiles.Add(ReadTile(r, externalTemplateResolver, customTypeDefinitions)), _ => r.Skip }); @@ -198,7 +202,10 @@ internal partial class Tmx return new Transformations { HFlip = hFlip, VFlip = vFlip, Rotate = rotate, PreferUntransformed = preferUntransformed }; } - internal static Tile ReadTile(XmlReader reader, Func externalTemplateResolver) + internal static Tile ReadTile( + XmlReader reader, + Func externalTemplateResolver, + IReadOnlyCollection customTypeDefinitions) { // Attributes var id = reader.GetRequiredAttributeParseable("id"); @@ -217,9 +224,9 @@ internal partial class Tmx reader.ProcessChildren("tile", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r), "Properties"), + "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r, customTypeDefinitions), "Properties"), "image" => () => Helpers.SetAtMostOnce(ref image, ReadImage(r), "Image"), - "objectgroup" => () => Helpers.SetAtMostOnce(ref objectLayer, ReadObjectLayer(r, externalTemplateResolver), "ObjectLayer"), + "objectgroup" => () => Helpers.SetAtMostOnce(ref objectLayer, ReadObjectLayer(r, externalTemplateResolver, customTypeDefinitions), "ObjectLayer"), "animation" => () => Helpers.SetAtMostOnce(ref animation, r.ReadList("animation", "frame", (ar) => { var tileID = ar.GetRequiredAttributeParseable("tileid"); @@ -245,12 +252,16 @@ internal partial class Tmx }; } - internal static List ReadWangsets(XmlReader reader) + internal static List ReadWangsets( + XmlReader reader, + IReadOnlyCollection customTypeDefinitions) { - return reader.ReadList("wangsets", "wangset", ReadWangset); + return reader.ReadList("wangsets", "wangset", r => ReadWangset(r, customTypeDefinitions)); } - internal static Wangset ReadWangset(XmlReader reader) + internal static Wangset ReadWangset( + XmlReader reader, + IReadOnlyCollection customTypeDefinitions) { // Attributes var name = reader.GetRequiredAttribute("name"); @@ -264,8 +275,8 @@ internal partial class Tmx reader.ProcessChildren("wangset", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r), "Properties"), - "wangcolor" => () => wangColors.Add(ReadWangColor(r)), + "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r, customTypeDefinitions), "Properties"), + "wangcolor" => () => wangColors.Add(ReadWangColor(r, customTypeDefinitions)), "wangtile" => () => wangTiles.Add(ReadWangTile(r)), _ => r.Skip }); @@ -284,7 +295,9 @@ internal partial class Tmx }; } - internal static WangColor ReadWangColor(XmlReader reader) + internal static WangColor ReadWangColor( + XmlReader reader, + IReadOnlyCollection customTypeDefinitions) { // Attributes var name = reader.GetRequiredAttribute("name"); @@ -298,7 +311,7 @@ internal partial class Tmx reader.ProcessChildren("wangcolor", (r, elementName) => elementName switch { - "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r), "Properties"), + "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r, customTypeDefinitions), "Properties"), _ => r.Skip }); diff --git a/DotTiled/Serialization/Tmx/TmxMapReader.cs b/DotTiled/Serialization/Tmx/TmxMapReader.cs index d7e631a..02388bb 100644 --- a/DotTiled/Serialization/Tmx/TmxMapReader.cs +++ b/DotTiled/Serialization/Tmx/TmxMapReader.cs @@ -13,11 +13,18 @@ public class TmxMapReader : IMapReader private readonly XmlReader _reader; private bool disposedValue; - public TmxMapReader(XmlReader reader, Func externalTilesetResolver, Func externalTemplateResolver) + private readonly IReadOnlyCollection _customTypeDefinitions; + + public TmxMapReader( + XmlReader reader, + Func externalTilesetResolver, + Func externalTemplateResolver, + IReadOnlyCollection customTypeDefinitions) { _reader = reader ?? throw new ArgumentNullException(nameof(reader)); _externalTilesetResolver = externalTilesetResolver ?? throw new ArgumentNullException(nameof(externalTilesetResolver)); _externalTemplateResolver = externalTemplateResolver ?? throw new ArgumentNullException(nameof(externalTemplateResolver)); + _customTypeDefinitions = customTypeDefinitions ?? throw new ArgumentNullException(nameof(customTypeDefinitions)); // Prepare reader _reader.MoveToContent(); @@ -25,7 +32,7 @@ public class TmxMapReader : IMapReader public Map ReadMap() { - return Tmx.ReadMap(_reader, _externalTilesetResolver, _externalTemplateResolver); + return Tmx.ReadMap(_reader, _externalTilesetResolver, _externalTemplateResolver, _customTypeDefinitions); } protected virtual void Dispose(bool disposing) diff --git a/DotTiled/Serialization/Tmx/TsxTilesetReader.cs b/DotTiled/Serialization/Tmx/TsxTilesetReader.cs index c089129..dba516b 100644 --- a/DotTiled/Serialization/Tmx/TsxTilesetReader.cs +++ b/DotTiled/Serialization/Tmx/TsxTilesetReader.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Xml; namespace DotTiled; @@ -11,13 +12,22 @@ public class TsxTilesetReader : ITilesetReader private readonly XmlReader _reader; private bool disposedValue; - public TsxTilesetReader(XmlReader reader, Func externalTemplateResolver) + private readonly IReadOnlyCollection _customTypeDefinitions; + + public TsxTilesetReader( + XmlReader reader, + Func externalTemplateResolver, + IReadOnlyCollection customTypeDefinitions) { _reader = reader ?? throw new ArgumentNullException(nameof(reader)); _externalTemplateResolver = externalTemplateResolver ?? throw new ArgumentNullException(nameof(externalTemplateResolver)); + _customTypeDefinitions = customTypeDefinitions ?? throw new ArgumentNullException(nameof(customTypeDefinitions)); + + // Prepare reader + _reader.MoveToContent(); } - public Tileset ReadTileset() => Tmx.ReadTileset(_reader, null, _externalTemplateResolver); + public Tileset ReadTileset() => Tmx.ReadTileset(_reader, null, _externalTemplateResolver, _customTypeDefinitions); protected virtual void Dispose(bool disposing) { diff --git a/DotTiled/Serialization/Tmx/TxTemplateReader.cs b/DotTiled/Serialization/Tmx/TxTemplateReader.cs index 24b95f4..eba6299 100644 --- a/DotTiled/Serialization/Tmx/TxTemplateReader.cs +++ b/DotTiled/Serialization/Tmx/TxTemplateReader.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Xml; namespace DotTiled; @@ -12,17 +13,24 @@ public class TxTemplateReader : ITemplateReader private readonly XmlReader _reader; private bool disposedValue; - public TxTemplateReader(XmlReader reader, Func externalTilesetResolver, Func externalTemplateResolver) + private readonly IReadOnlyCollection _customTypeDefinitions; + + public TxTemplateReader( + XmlReader reader, + Func externalTilesetResolver, + Func externalTemplateResolver, + IReadOnlyCollection customTypeDefinitions) { _reader = reader ?? throw new ArgumentNullException(nameof(reader)); _externalTilesetResolver = externalTilesetResolver ?? throw new ArgumentNullException(nameof(externalTilesetResolver)); _externalTemplateResolver = externalTemplateResolver ?? throw new ArgumentNullException(nameof(externalTemplateResolver)); + _customTypeDefinitions = customTypeDefinitions ?? throw new ArgumentNullException(nameof(customTypeDefinitions)); // Prepare reader _reader.MoveToContent(); } - public Template ReadTemplate() => Tmx.ReadTemplate(_reader, _externalTilesetResolver, _externalTemplateResolver); + public Template ReadTemplate() => Tmx.ReadTemplate(_reader, _externalTilesetResolver, _externalTemplateResolver, _customTypeDefinitions); protected virtual void Dispose(bool disposing) {