diff --git a/pytiled_parser/wang_set.py b/pytiled_parser/wang_set.py new file mode 100644 index 0000000..04ef559 --- /dev/null +++ b/pytiled_parser/wang_set.py @@ -0,0 +1,57 @@ +from typing import List, NamedTuple, Optional + +import attr +from typing_extensions import TypedDict + +from . import properties as properties_ +from .common_types import Color, OrderedPair + + +class WangTile(NamedTuple): + + id: int + dflip: bool = False + hflip: bool = False + vflip: bool = False + wang_ids: List[int] = [] + + +class WangColor(NamedTuple): + + color: Color + name: str + probability: float + tile: int + + +class WangSet(NamedTuple): + + cornercolors: List[WangColor] + edgecolors: List[WangColor] + name: str + tile: int + wang_tiles: List[WangTile] + properties: Optional[properties_.Properties] = None + + +class RawWangTile(TypedDict): + """ The keys and their types that appear in a Wang Tile JSON Object.""" + + tileid: int + dflip: bool + hflip: bool + vflip: bool + wangid: List[int] + + +class RawWangColor(TypedDict): + """ The keys and their types that appear in a Wang Color JSON Object.""" + + color: str + name: str + probability: float + tile: int + + +class RawWangSet(TypedDict): + """ The keys and their types that appear in a Wang Set JSON Object.""" diff --git a/tests/test_data/images/walkways.png b/tests/test_data/images/walkways.png new file mode 100644 index 0000000..e9cfbe7 Binary files /dev/null and b/tests/test_data/images/walkways.png differ diff --git a/tests/test_data/tilesets/wangsets/map.json b/tests/test_data/tilesets/wangsets/map.json new file mode 100644 index 0000000..d2fe741 --- /dev/null +++ b/tests/test_data/tilesets/wangsets/map.json @@ -0,0 +1,32 @@ +{ "compressionlevel":-1, + "height":20, + "infinite":false, + "layers":[ + { + "data":[35, 1, 57, 49, 48, 67, 75, 7, 61, 52, 70, 44, 81, 55, 59, 63, 10, 68, 63, 81, 22, 23, 72, 60, 61, 52, 79, 26, 72, 60, 53, 54, 54, 72, 60, 34, 22, 77, 60, 52, 59, 64, 75, 70, 61, 71, 78, 71, 46, 29, 30, 35, 33, 53, 63, 42, 35, 9, 69, 58, 55, 74, 5, 9, 28, 2, 77, 54, 55, 39, 25, 25, 26, 63, 63, 78, 25, 26, 54, 72, 65, 50, 45, 27, 24, 26, 1, 66, 61, 7, 70, 62, 72, 33, 34, 52, 70, 70, 70, 8, 48, 34, 7, 62, 60, 67, 23, 54, 64, 23, 46, 32, 73, 21, 25, 70, 80, 78, 7, 43, 71, 42, 13, 56, 66, 7, 31, 59, 6, 62, 63, 18, 46, 30, 31, 48, 80, 54, 42, 53, 79, 7, 16, 62, 54, 19, 11, 59, 42, 35, 36, 42, 61, 16, 43, 71, 51, 34, 4, 59, 76, 41, 37, 30, 61, 70, 13, 57, 80, 18, 15, 53, 36, 42, 52, 7, 70, 25, 13, 29, 79, 53, 6, 44, 64, 77, 42, 70, 80, 24, 22, 68, 24, 52, 70, 26, 54, 55, 39, 26, 54, 60, 17, 1, 5, 6, 80, 51, 76, 56, 65, 75, 34, 58, 5, 28, 56, 59, 51, 70, 61, 67, 14, 18, 24, 16, 49, 59, 81, 36, 9, 51, 26, 69, 40, 20, 32, 64, 66, 52, 33, 76, 21, 22, 68, 19, 59, 55, 50, 10, 21, 70, 70, 8, 51, 71, 18, 54, 78, 70, 42, 8, 60, 70, 4, 30, 31, 30, 31, 38, 32, 54, 46, 38, 57, 80, 24, 70, 53, 1, 53, 24, 58, 48, 43, 17, 18, 24, 43, 52, 22, 59, 33, 80, 63, 54, 33, 49, 59, 15, 35, 72, 33, 67, 75, 17, 42, 35, 1, 29, 68, 72, 42, 52, 61, 61, 26, 63, 36, 45, 45, 54, 42, 53, 73, 23, 73, 21, 44, 42, 76, 48, 76, 57, 62, 60, 70, 58, 23, 78, 48, 67, 75, 61, 79, 61, 52, 61, 79, 53, 54, 55, 75, 70, 34, 70, 7, 58, 66, 52, 33, 53, 51, 61, 8, 72, 60, 31, 74, 57, 70, 67, 3, 79, 22, 47, 12, 62, 51, 31, 43, 58, 68, 63, 15, 76, 65, 23, 54, 63, 6, 8, 19, 74, 57, 62, 24, 35, 60, 43], + "height":20, + "id":1, + "name":"Tile Layer 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":20, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.3.5", + "tileheight":32, + "tilesets":[ + { + "firstgid":1, + "source":"tileset.json" + }], + "tilewidth":32, + "type":"map", + "version":1.2, + "width":20 +} \ No newline at end of file diff --git a/tests/test_data/tilesets/wangsets/tileset.json b/tests/test_data/tilesets/wangsets/tileset.json new file mode 100644 index 0000000..76ab027 --- /dev/null +++ b/tests/test_data/tilesets/wangsets/tileset.json @@ -0,0 +1,607 @@ +{ "columns":9, + "image":"..\/..\/images\/walkways.png", + "imageheight":288, + "imagewidth":288, + "margin":0, + "name":"tileset", + "spacing":0, + "tilecount":81, + "tiledversion":"1.3.5", + "tileheight":32, + "tilewidth":32, + "type":"tileset", + "version":1.2, + "wangsets":[ + { + "cornercolors":[], + "edgecolors":[ + { + "color":"#ff0000", + "name":"Path", + "probability":1, + "tile":-1 + }, + { + "color":"#00ff00", + "name":"Grass", + "probability":0.75, + "tile":-1 + }, + { + "color":"#0000ff", + "name":"WalkWay", + "probability":0.5, + "tile":-1 + }], + "name":"My Wang Set", + "tile":-1, + "wangtiles":[ + { + "dflip":false, + "hflip":false, + "tileid":0, + "vflip":false, + "wangid":[2, 0, 3, 0, 3, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":1, + "vflip":false, + "wangid":[2, 0, 3, 0, 3, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":2, + "vflip":false, + "wangid":[2, 0, 1, 0, 3, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":3, + "vflip":false, + "wangid":[2, 0, 3, 0, 3, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":4, + "vflip":false, + "wangid":[2, 0, 2, 0, 3, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":5, + "vflip":false, + "wangid":[2, 0, 1, 0, 3, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":6, + "vflip":false, + "wangid":[2, 0, 1, 0, 3, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":7, + "vflip":false, + "wangid":[2, 0, 2, 0, 3, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":8, + "vflip":false, + "wangid":[2, 0, 2, 0, 3, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":9, + "vflip":false, + "wangid":[3, 0, 3, 0, 3, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":10, + "vflip":false, + "wangid":[3, 0, 3, 0, 3, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":11, + "vflip":false, + "wangid":[3, 0, 1, 0, 3, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":12, + "vflip":false, + "wangid":[3, 0, 3, 0, 3, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":13, + "vflip":false, + "wangid":[3, 0, 2, 0, 3, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":14, + "vflip":false, + "wangid":[3, 0, 1, 0, 3, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":15, + "vflip":false, + "wangid":[3, 0, 1, 0, 3, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":16, + "vflip":false, + "wangid":[3, 0, 2, 0, 3, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":17, + "vflip":false, + "wangid":[3, 0, 2, 0, 3, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":18, + "vflip":false, + "wangid":[3, 0, 3, 0, 1, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":19, + "vflip":false, + "wangid":[3, 0, 3, 0, 1, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":20, + "vflip":false, + "wangid":[3, 0, 1, 0, 1, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":21, + "vflip":false, + "wangid":[3, 0, 3, 0, 1, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":22, + "vflip":false, + "wangid":[3, 0, 2, 0, 1, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":23, + "vflip":false, + "wangid":[3, 0, 1, 0, 1, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":24, + "vflip":false, + "wangid":[3, 0, 1, 0, 1, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":25, + "vflip":false, + "wangid":[3, 0, 2, 0, 1, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":26, + "vflip":false, + "wangid":[3, 0, 2, 0, 1, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":27, + "vflip":false, + "wangid":[1, 0, 3, 0, 3, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":28, + "vflip":false, + "wangid":[1, 0, 3, 0, 3, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":29, + "vflip":false, + "wangid":[1, 0, 1, 0, 3, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":30, + "vflip":false, + "wangid":[1, 0, 3, 0, 3, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":31, + "vflip":false, + "wangid":[1, 0, 2, 0, 3, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":32, + "vflip":false, + "wangid":[1, 0, 1, 0, 3, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":33, + "vflip":false, + "wangid":[1, 0, 1, 0, 3, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":34, + "vflip":false, + "wangid":[1, 0, 2, 0, 3, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":35, + "vflip":false, + "wangid":[1, 0, 2, 0, 3, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":36, + "vflip":false, + "wangid":[3, 0, 3, 0, 2, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":37, + "vflip":false, + "wangid":[3, 0, 3, 0, 2, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":38, + "vflip":false, + "wangid":[3, 0, 1, 0, 2, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":39, + "vflip":false, + "wangid":[3, 0, 3, 0, 2, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":40, + "vflip":false, + "wangid":[3, 0, 2, 0, 2, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":41, + "vflip":false, + "wangid":[3, 0, 1, 0, 2, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":42, + "vflip":false, + "wangid":[3, 0, 1, 0, 2, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":43, + "vflip":false, + "wangid":[3, 0, 2, 0, 2, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":44, + "vflip":false, + "wangid":[3, 0, 2, 0, 2, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":45, + "vflip":false, + "wangid":[2, 0, 3, 0, 1, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":46, + "vflip":false, + "wangid":[2, 0, 3, 0, 1, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":47, + "vflip":false, + "wangid":[2, 0, 1, 0, 1, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":48, + "vflip":false, + "wangid":[2, 0, 3, 0, 1, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":49, + "vflip":false, + "wangid":[2, 0, 2, 0, 1, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":50, + "vflip":false, + "wangid":[2, 0, 1, 0, 1, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":51, + "vflip":false, + "wangid":[2, 0, 1, 0, 1, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":52, + "vflip":false, + "wangid":[2, 0, 2, 0, 1, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":53, + "vflip":false, + "wangid":[2, 0, 2, 0, 1, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":54, + "vflip":false, + "wangid":[1, 0, 3, 0, 1, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":55, + "vflip":false, + "wangid":[1, 0, 3, 0, 1, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":56, + "vflip":false, + "wangid":[1, 0, 1, 0, 1, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":57, + "vflip":false, + "wangid":[1, 0, 3, 0, 1, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":58, + "vflip":false, + "wangid":[1, 0, 2, 0, 1, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":59, + "vflip":false, + "wangid":[1, 0, 1, 0, 1, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":60, + "vflip":false, + "wangid":[1, 0, 1, 0, 1, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":61, + "vflip":false, + "wangid":[1, 0, 2, 0, 1, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":62, + "vflip":false, + "wangid":[1, 0, 2, 0, 1, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":63, + "vflip":false, + "wangid":[1, 0, 3, 0, 2, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":64, + "vflip":false, + "wangid":[1, 0, 3, 0, 2, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":65, + "vflip":false, + "wangid":[1, 0, 1, 0, 2, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":66, + "vflip":false, + "wangid":[1, 0, 3, 0, 2, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":67, + "vflip":false, + "wangid":[1, 0, 2, 0, 2, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":68, + "vflip":false, + "wangid":[1, 0, 1, 0, 2, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":69, + "vflip":false, + "wangid":[1, 0, 1, 0, 2, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":70, + "vflip":false, + "wangid":[1, 0, 2, 0, 2, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":71, + "vflip":false, + "wangid":[1, 0, 2, 0, 2, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":72, + "vflip":false, + "wangid":[2, 0, 3, 0, 2, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":73, + "vflip":false, + "wangid":[2, 0, 3, 0, 2, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":74, + "vflip":false, + "wangid":[2, 0, 1, 0, 2, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":75, + "vflip":false, + "wangid":[2, 0, 3, 0, 2, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":76, + "vflip":false, + "wangid":[2, 0, 2, 0, 2, 0, 3, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":77, + "vflip":false, + "wangid":[2, 0, 1, 0, 2, 0, 2, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":78, + "vflip":false, + "wangid":[2, 0, 1, 0, 2, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":79, + "vflip":false, + "wangid":[2, 0, 2, 0, 2, 0, 1, 0] + }, + { + "dflip":false, + "hflip":false, + "tileid":80, + "vflip":false, + "wangid":[2, 0, 2, 0, 2, 0, 2, 0] + }] + }] +} \ No newline at end of file