Add wangset test

This commit is contained in:
Daniel Cronqvist 2024-08-13 22:34:51 +02:00
parent 3645f8c2a2
commit 292dc9b1b9
11 changed files with 260 additions and 12 deletions

View file

@ -38,6 +38,7 @@ public static partial class TestData
["Serialization/TestData/Map/map_with_external_tileset/map-with-external-tileset", (string f) => TestData.MapWithExternalTileset(f), Array.Empty<CustomTypeDefinition>()], ["Serialization/TestData/Map/map_with_external_tileset/map-with-external-tileset", (string f) => TestData.MapWithExternalTileset(f), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_with_flippingflags/map-with-flippingflags", (string f) => TestData.MapWithFlippingFlags(f), Array.Empty<CustomTypeDefinition>()], ["Serialization/TestData/Map/map_with_flippingflags/map-with-flippingflags", (string f) => TestData.MapWithFlippingFlags(f), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_external_tileset_multi/map-external-tileset-multi", (string f) => TestData.MapExternalTilesetMulti(f), Array.Empty<CustomTypeDefinition>()], ["Serialization/TestData/Map/map_external_tileset_multi/map-external-tileset-multi", (string f) => TestData.MapExternalTilesetMulti(f), Array.Empty<CustomTypeDefinition>()],
["Serialization/TestData/Map/map_external_tileset_wangset/map-external-tileset-wangset", (string f) => TestData.MapExternalTilesetWangset(f), Array.Empty<CustomTypeDefinition>()],
]; ];
private static CustomTypeDefinition[] typedefs = [ private static CustomTypeDefinition[] typedefs = [

View file

@ -0,0 +1,92 @@
using System.Globalization;
namespace DotTiled.Tests;
public partial class TestData
{
public static Map MapExternalTilesetWangset(string fileExt) => new Map
{
Class = "",
Orientation = MapOrientation.Orthogonal,
Width = 5,
Height = 5,
TileWidth = 24,
TileHeight = 24,
Infinite = false,
HexSideLength = null,
StaggerAxis = null,
StaggerIndex = null,
ParallaxOriginX = 0,
ParallaxOriginY = 0,
RenderOrder = RenderOrder.RightDown,
CompressionLevel = -1,
BackgroundColor = Color.Parse("#00000000", CultureInfo.InvariantCulture),
Version = "1.10",
TiledVersion = "1.11.0",
NextLayerID = 2,
NextObjectID = 1,
Tilesets = [
new Tileset
{
Version = "1.10",
TiledVersion = "1.11.0",
FirstGID = 1,
Name = "tileset",
TileWidth = 24,
TileHeight = 24,
TileCount = 48,
Columns = 10,
Source = $"wangset-tileset.{(fileExt == "tmx" ? "tsx" : "tsj")}",
Transformations = new Transformations
{
HFlip = true,
VFlip = true,
Rotate = false,
PreferUntransformed = false
},
Grid = new Grid
{
Orientation = GridOrientation.Orthogonal,
Width = 32,
Height = 32
},
Image = new Image
{
Format = ImageFormat.Png,
Source = "tileset.png",
Width = 256,
Height = 96,
}
}
],
Layers = [
new TileLayer
{
ID = 1,
Name = "Tile Layer 1",
Width = 5,
Height = 5,
Data = new Data
{
Encoding = DataEncoding.Csv,
Chunks = null,
Compression = null,
GlobalTileIDs = [
2, 2, 12, 11, 0,
1, 12, 1, 11, 0,
2, 1, 0, 1, 0,
12, 11, 12, 2, 0,
0, 0, 0, 0, 0
],
FlippingFlags = [
FlippingFlags.FlippedHorizontally, FlippingFlags.None, FlippingFlags.FlippedHorizontally, FlippingFlags.FlippedHorizontally, FlippingFlags.None,
FlippingFlags.FlippedVertically, FlippingFlags.None, FlippingFlags.None, FlippingFlags.FlippedVertically | FlippingFlags.FlippedHorizontally, FlippingFlags.None,
FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.FlippedVertically | FlippingFlags.FlippedHorizontally, FlippingFlags.None,
FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.FlippedHorizontally, FlippingFlags.None,
FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None, FlippingFlags.None
]
}
}
]
};
}

View file

@ -0,0 +1,36 @@
{ "compressionlevel":-1,
"height":5,
"infinite":false,
"layers":[
{
"data":[2147483650, 2, 2147483660, 2147483659, 0,
1073741825, 12, 1, 3221225483, 0,
2, 1, 0, 3221225473, 0,
12, 11, 12, 2147483650, 0,
0, 0, 0, 0, 0],
"height":5,
"id":1,
"name":"Tile Layer 1",
"opacity":1,
"type":"tilelayer",
"visible":true,
"width":5,
"x":0,
"y":0
}],
"nextlayerid":2,
"nextobjectid":1,
"orientation":"orthogonal",
"renderorder":"right-down",
"tiledversion":"1.11.0",
"tileheight":24,
"tilesets":[
{
"firstgid":1,
"source":"wangset-tileset.tsj"
}],
"tilewidth":24,
"type":"map",
"version":"1.10",
"width":5
}

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="5" height="5" tilewidth="24" tileheight="24" infinite="0" nextlayerid="2" nextobjectid="1">
<tileset firstgid="1" source="wangset-tileset.tsx"/>
<layer id="1" name="Tile Layer 1" width="5" height="5">
<data encoding="csv">
2147483650,2,2147483660,2147483659,0,
1073741825,12,1,3221225483,0,
2,1,0,3221225473,0,
12,11,12,2147483650,0,
0,0,0,0,0
</data>
</layer>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,69 @@
{ "columns":10,
"grid":
{
"height":32,
"orientation":"orthogonal",
"width":32
},
"image":"tileset.png",
"imageheight":96,
"imagewidth":256,
"margin":0,
"name":"tileset",
"spacing":0,
"tilecount":48,
"tiledversion":"1.11.0",
"tileheight":24,
"tilewidth":24,
"transformations":
{
"hflip":true,
"preferuntransformed":false,
"rotate":false,
"vflip":true
},
"type":"tileset",
"version":"1.10",
"wangsets":[
{
"colors":[
{
"color":"#ff0000",
"name":"Water",
"probability":1,
"tile":0
},
{
"color":"#00ff00",
"name":"Grass",
"probability":1,
"tile":-1
},
{
"color":"#0000ff",
"name":"Stone",
"probability":1,
"tile":29
}],
"name":"test-terrain",
"tile":-1,
"type":"mixed",
"wangtiles":[
{
"tileid":0,
"wangid":[1, 1, 0, 0, 0, 1, 1, 1]
},
{
"tileid":1,
"wangid":[1, 1, 1, 1, 0, 0, 0, 1]
},
{
"tileid":10,
"wangid":[0, 0, 0, 1, 1, 1, 1, 1]
},
{
"tileid":11,
"wangid":[0, 1, 1, 1, 1, 1, 0, 0]
}]
}]
}

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.10" tiledversion="1.11.0" name="tileset" tilewidth="24" tileheight="24" tilecount="48" columns="10">
<grid orientation="orthogonal" width="32" height="32"/>
<transformations hflip="1" vflip="1" rotate="0" preferuntransformed="0"/>
<image source="tileset.png" width="256" height="96"/>
<wangsets>
<wangset name="test-terrain" type="mixed" tile="-1">
<wangcolor name="Water" color="#ff0000" tile="0" probability="1"/>
<wangcolor name="Grass" color="#00ff00" tile="-1" probability="1"/>
<wangcolor name="Stone" color="#0000ff" tile="29" probability="1"/>
<wangtile tileid="0" wangid="1,1,0,0,0,1,1,1"/>
<wangtile tileid="1" wangid="1,1,1,1,0,0,0,1"/>
<wangtile tileid="10" wangid="0,0,0,1,1,1,1,1"/>
<wangtile tileid="11" wangid="0,1,1,1,1,1,0,0"/>
</wangset>
</wangsets>
</tileset>

View file

@ -8,7 +8,7 @@ public class WangColor
public required string Name { get; set; } public required string Name { get; set; }
public string Class { get; set; } = ""; public string Class { get; set; } = "";
public required Color Color { get; set; } public required Color Color { get; set; }
public required uint Tile { get; set; } public required int Tile { get; set; }
public float Probability { get; set; } = 0f; public float Probability { get; set; } = 0f;
// Elements // Elements

View file

@ -7,7 +7,7 @@ public class Wangset
// Attributes // Attributes
public required string Name { get; set; } public required string Name { get; set; }
public string Class { get; set; } = ""; public string Class { get; set; } = "";
public required uint Tile { get; set; } public required int Tile { get; set; }
// Elements // Elements
// At most one of // At most one of

View file

@ -64,7 +64,8 @@ internal partial class Tmj
var transparentColor = element.GetOptionalPropertyParseable<Color?>("transparentcolor", s => Color.Parse(s, CultureInfo.InvariantCulture), null); var transparentColor = element.GetOptionalPropertyParseable<Color?>("transparentcolor", s => Color.Parse(s, CultureInfo.InvariantCulture), null);
var type = element.GetOptionalProperty<string?>("type", null); var type = element.GetOptionalProperty<string?>("type", null);
var version = element.GetOptionalProperty<string?>("version", null); var version = element.GetOptionalProperty<string?>("version", null);
//var wangsets = element.GetOptionalPropertyCustom<List<Wangset>?>("wangsets", ReadWangSets, null); var transformations = element.GetOptionalPropertyCustom<Transformations?>("transformations", ReadTransformations, null);
var wangsets = element.GetOptionalPropertyCustom<List<Wangset>?>("wangsets", el => el.GetValueAsList<Wangset>(e => ReadWangset(e, customTypeDefinitions)), null);
if (source is not null) if (source is not null)
{ {
@ -108,7 +109,24 @@ internal partial class Tmj
Tiles = tiles, Tiles = tiles,
TileWidth = tileWidth, TileWidth = tileWidth,
Version = version, Version = version,
//Wangsets = wangsets Wangsets = wangsets,
Transformations = transformations
};
}
internal static Transformations ReadTransformations(JsonElement element)
{
var hFlip = element.GetOptionalProperty<bool>("hflip", false);
var vFlip = element.GetOptionalProperty<bool>("vflip", false);
var rotate = element.GetOptionalProperty<bool>("rotate", false);
var preferUntransformed = element.GetOptionalProperty<bool>("preferuntransformed", false);
return new Transformations
{
HFlip = hFlip,
VFlip = vFlip,
Rotate = rotate,
PreferUntransformed = preferUntransformed
}; };
} }
@ -208,7 +226,7 @@ internal partial class Tmj
var colors = element.GetOptionalPropertyCustom<List<WangColor>>("colors", e => e.GetValueAsList<WangColor>(el => ReadWangColor(el, customTypeDefinitions)), []); var colors = element.GetOptionalPropertyCustom<List<WangColor>>("colors", e => e.GetValueAsList<WangColor>(el => ReadWangColor(el, customTypeDefinitions)), []);
var name = element.GetRequiredProperty<string>("name"); var name = element.GetRequiredProperty<string>("name");
var properties = element.GetOptionalPropertyCustom<Dictionary<string, IProperty>?>("properties", e => ReadProperties(e, customTypeDefinitions), null); var properties = element.GetOptionalPropertyCustom<Dictionary<string, IProperty>?>("properties", e => ReadProperties(e, customTypeDefinitions), null);
var tile = element.GetOptionalProperty<uint>("tile", 0); var tile = element.GetOptionalProperty<int>("tile", 0);
var type = element.GetOptionalProperty<string>("type", ""); var type = element.GetOptionalProperty<string>("type", "");
var wangTiles = element.GetOptionalPropertyCustom<List<WangTile>>("wangtiles", e => e.GetValueAsList<WangTile>(ReadWangTile), []); var wangTiles = element.GetOptionalPropertyCustom<List<WangTile>>("wangtiles", e => e.GetValueAsList<WangTile>(ReadWangTile), []);
@ -232,7 +250,7 @@ internal partial class Tmj
var name = element.GetRequiredProperty<string>("name"); var name = element.GetRequiredProperty<string>("name");
var probability = element.GetOptionalProperty<float>("probability", 1.0f); var probability = element.GetOptionalProperty<float>("probability", 1.0f);
var properties = element.GetOptionalPropertyCustom<Dictionary<string, IProperty>?>("properties", e => ReadProperties(e, customTypeDefinitions), null); var properties = element.GetOptionalPropertyCustom<Dictionary<string, IProperty>?>("properties", e => ReadProperties(e, customTypeDefinitions), null);
var tile = element.GetOptionalProperty<uint>("tile", 0); var tile = element.GetOptionalProperty<int>("tile", 0);
return new WangColor return new WangColor
{ {

View file

@ -193,10 +193,10 @@ internal partial class Tmx
internal static Transformations ReadTransformations(XmlReader reader) internal static Transformations ReadTransformations(XmlReader reader)
{ {
// Attributes // Attributes
var hFlip = reader.GetOptionalAttributeParseable<bool>("hflip") ?? false; var hFlip = (reader.GetOptionalAttributeParseable<uint>("hflip") ?? 0) == 1;
var vFlip = reader.GetOptionalAttributeParseable<bool>("vflip") ?? false; var vFlip = (reader.GetOptionalAttributeParseable<uint>("vflip") ?? 0) == 1;
var rotate = reader.GetOptionalAttributeParseable<bool>("rotate") ?? false; var rotate = (reader.GetOptionalAttributeParseable<uint>("rotate") ?? 0) == 1;
var preferUntransformed = reader.GetOptionalAttributeParseable<bool>("preferuntransformed") ?? false; var preferUntransformed = (reader.GetOptionalAttributeParseable<uint>("preferuntransformed") ?? 0) == 1;
reader.ReadStartElement("transformations"); reader.ReadStartElement("transformations");
return new Transformations { HFlip = hFlip, VFlip = vFlip, Rotate = rotate, PreferUntransformed = preferUntransformed }; return new Transformations { HFlip = hFlip, VFlip = vFlip, Rotate = rotate, PreferUntransformed = preferUntransformed };
@ -266,7 +266,7 @@ internal partial class Tmx
// Attributes // Attributes
var name = reader.GetRequiredAttribute("name"); var name = reader.GetRequiredAttribute("name");
var @class = reader.GetOptionalAttribute("class") ?? ""; var @class = reader.GetOptionalAttribute("class") ?? "";
var tile = reader.GetRequiredAttributeParseable<uint>("tile"); var tile = reader.GetRequiredAttributeParseable<int>("tile");
// Elements // Elements
Dictionary<string, IProperty>? properties = null; Dictionary<string, IProperty>? properties = null;
@ -303,7 +303,7 @@ internal partial class Tmx
var name = reader.GetRequiredAttribute("name"); var name = reader.GetRequiredAttribute("name");
var @class = reader.GetOptionalAttribute("class") ?? ""; var @class = reader.GetOptionalAttribute("class") ?? "";
var color = reader.GetRequiredAttributeParseable<Color>("color"); var color = reader.GetRequiredAttributeParseable<Color>("color");
var tile = reader.GetRequiredAttributeParseable<uint>("tile"); var tile = reader.GetRequiredAttributeParseable<int>("tile");
var probability = reader.GetOptionalAttributeParseable<float>("probability") ?? 0f; var probability = reader.GetOptionalAttributeParseable<float>("probability") ?? 0f;
// Elements // Elements
@ -339,6 +339,8 @@ internal partial class Tmx
return indices; return indices;
}); });
reader.ReadStartElement("wangtile");
return new WangTile return new WangTile
{ {
TileID = tileID, TileID = tileID,