mirror of
https://github.com/dcronqvist/DotTiled.git
synced 2025-02-05 08:52:50 +02:00
Add wangset test
This commit is contained in:
parent
3645f8c2a2
commit
292dc9b1b9
11 changed files with 260 additions and 12 deletions
|
@ -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 = [
|
||||||
|
|
|
@ -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
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
|
@ -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 |
|
@ -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]
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
}
|
|
@ -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>
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Reference in a new issue