mirror of
https://github.com/dcronqvist/DotTiled.git
synced 2025-02-05 08:52:50 +02:00
Added same CustomTypeDefinition stuff to Tmx
This commit is contained in:
parent
e9cf6e01f6
commit
bb74d3ccee
9 changed files with 213 additions and 66 deletions
|
@ -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<string, Template> 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();
|
||||
|
|
|
@ -8,7 +8,11 @@ namespace DotTiled;
|
|||
|
||||
internal partial class Tmx
|
||||
{
|
||||
internal static Map ReadMap(XmlReader reader, Func<string, Tileset> externalTilesetResolver, Func<string, Template> externalTemplateResolver)
|
||||
internal static Map ReadMap(
|
||||
XmlReader reader,
|
||||
Func<string, Tileset> externalTilesetResolver,
|
||||
Func<string, Template> externalTemplateResolver,
|
||||
IReadOnlyCollection<CustomTypeDefinition> 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
|
||||
});
|
||||
|
||||
|
|
|
@ -9,7 +9,10 @@ namespace DotTiled;
|
|||
|
||||
internal partial class Tmx
|
||||
{
|
||||
internal static ObjectLayer ReadObjectLayer(XmlReader reader, Func<string, Template> externalTemplateResolver)
|
||||
internal static ObjectLayer ReadObjectLayer(
|
||||
XmlReader reader,
|
||||
Func<string, Template> externalTemplateResolver,
|
||||
IReadOnlyCollection<CustomTypeDefinition> customTypeDefinitions)
|
||||
{
|
||||
// Attributes
|
||||
var id = reader.GetRequiredAttributeParseable<uint>("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<string, Template> externalTemplateResolver)
|
||||
internal static Object ReadObject(
|
||||
XmlReader reader,
|
||||
Func<string, Template> externalTemplateResolver,
|
||||
IReadOnlyCollection<CustomTypeDefinition> 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<string, Tileset> externalTilesetResolver, Func<string, Template> externalTemplateResolver)
|
||||
internal static Template ReadTemplate(
|
||||
XmlReader reader,
|
||||
Func<string, Tileset> externalTilesetResolver,
|
||||
Func<string, Template> externalTemplateResolver,
|
||||
IReadOnlyCollection<CustomTypeDefinition> 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
|
||||
});
|
||||
|
||||
|
|
|
@ -6,7 +6,9 @@ namespace DotTiled;
|
|||
|
||||
internal partial class Tmx
|
||||
{
|
||||
internal static Dictionary<string, IProperty> ReadProperties(XmlReader reader)
|
||||
internal static Dictionary<string, IProperty> ReadProperties(
|
||||
XmlReader reader,
|
||||
IReadOnlyCollection<CustomTypeDefinition> customTypeDefinitions)
|
||||
{
|
||||
return reader.ReadList("properties", "property", (r) =>
|
||||
{
|
||||
|
@ -33,22 +35,38 @@ internal partial class Tmx
|
|||
PropertyType.Color => new ColorProperty { Name = name, Value = r.GetRequiredAttributeParseable<Color>("value") },
|
||||
PropertyType.File => new FileProperty { Name = name, Value = r.GetRequiredAttribute("value") },
|
||||
PropertyType.Object => new ObjectProperty { Name = name, Value = r.GetRequiredAttributeParseable<uint>("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<CustomTypeDefinition> 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<string, IProperty> CreateInstanceOfCustomClass(CustomClassDefinition customClassDefinition)
|
||||
{
|
||||
return customClassDefinition.Members.ToDictionary(m => m.Name, m => m.Clone());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<CustomTypeDefinition> customTypeDefinitions)
|
||||
{
|
||||
var id = reader.GetRequiredAttributeParseable<uint>("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<CustomTypeDefinition> customTypeDefinitions)
|
||||
{
|
||||
var id = reader.GetRequiredAttributeParseable<uint>("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<string, Template> externalTemplateResolver)
|
||||
internal static Group ReadGroup(
|
||||
XmlReader reader,
|
||||
Func<string, Template> externalTemplateResolver,
|
||||
IReadOnlyCollection<CustomTypeDefinition> customTypeDefinitions)
|
||||
{
|
||||
var id = reader.GetRequiredAttributeParseable<uint>("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
|
||||
});
|
||||
|
||||
|
|
|
@ -8,7 +8,11 @@ namespace DotTiled;
|
|||
|
||||
internal partial class Tmx
|
||||
{
|
||||
internal static Tileset ReadTileset(XmlReader reader, Func<string, Tileset>? externalTilesetResolver, Func<string, Template> externalTemplateResolver)
|
||||
internal static Tileset ReadTileset(
|
||||
XmlReader reader,
|
||||
Func<string, Tileset>? externalTilesetResolver,
|
||||
Func<string, Template> externalTemplateResolver,
|
||||
IReadOnlyCollection<CustomTypeDefinition> 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<string, Template> externalTemplateResolver)
|
||||
internal static Tile ReadTile(
|
||||
XmlReader reader,
|
||||
Func<string, Template> externalTemplateResolver,
|
||||
IReadOnlyCollection<CustomTypeDefinition> customTypeDefinitions)
|
||||
{
|
||||
// Attributes
|
||||
var id = reader.GetRequiredAttributeParseable<uint>("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<Frame>("animation", "frame", (ar) =>
|
||||
{
|
||||
var tileID = ar.GetRequiredAttributeParseable<uint>("tileid");
|
||||
|
@ -245,12 +252,16 @@ internal partial class Tmx
|
|||
};
|
||||
}
|
||||
|
||||
internal static List<Wangset> ReadWangsets(XmlReader reader)
|
||||
internal static List<Wangset> ReadWangsets(
|
||||
XmlReader reader,
|
||||
IReadOnlyCollection<CustomTypeDefinition> customTypeDefinitions)
|
||||
{
|
||||
return reader.ReadList<Wangset>("wangsets", "wangset", ReadWangset);
|
||||
return reader.ReadList<Wangset>("wangsets", "wangset", r => ReadWangset(r, customTypeDefinitions));
|
||||
}
|
||||
|
||||
internal static Wangset ReadWangset(XmlReader reader)
|
||||
internal static Wangset ReadWangset(
|
||||
XmlReader reader,
|
||||
IReadOnlyCollection<CustomTypeDefinition> 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<CustomTypeDefinition> 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
|
||||
});
|
||||
|
||||
|
|
|
@ -13,11 +13,18 @@ public class TmxMapReader : IMapReader
|
|||
private readonly XmlReader _reader;
|
||||
private bool disposedValue;
|
||||
|
||||
public TmxMapReader(XmlReader reader, Func<string, Tileset> externalTilesetResolver, Func<string, Template> externalTemplateResolver)
|
||||
private readonly IReadOnlyCollection<CustomTypeDefinition> _customTypeDefinitions;
|
||||
|
||||
public TmxMapReader(
|
||||
XmlReader reader,
|
||||
Func<string, Tileset> externalTilesetResolver,
|
||||
Func<string, Template> externalTemplateResolver,
|
||||
IReadOnlyCollection<CustomTypeDefinition> 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)
|
||||
|
|
|
@ -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<string, Template> externalTemplateResolver)
|
||||
private readonly IReadOnlyCollection<CustomTypeDefinition> _customTypeDefinitions;
|
||||
|
||||
public TsxTilesetReader(
|
||||
XmlReader reader,
|
||||
Func<string, Template> externalTemplateResolver,
|
||||
IReadOnlyCollection<CustomTypeDefinition> 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)
|
||||
{
|
||||
|
|
|
@ -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<string, Tileset> externalTilesetResolver, Func<string, Template> externalTemplateResolver)
|
||||
private readonly IReadOnlyCollection<CustomTypeDefinition> _customTypeDefinitions;
|
||||
|
||||
public TxTemplateReader(
|
||||
XmlReader reader,
|
||||
Func<string, Tileset> externalTilesetResolver,
|
||||
Func<string, Template> externalTemplateResolver,
|
||||
IReadOnlyCollection<CustomTypeDefinition> 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)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue