feat(embedded tilesets): Updates to support tilesets embedded in maps

This commit is contained in:
Darren Eberly
2020-08-19 22:57:38 -04:00
parent 612bd52653
commit 3cd4e73d5f
2 changed files with 40 additions and 32 deletions

View File

@@ -59,7 +59,7 @@ class Map:
tiled_version: str
tile_size: Size
tilesets: TilesetDict
version: str
version: float
background_color: Optional[Color] = None
properties: Optional[Properties] = None
@@ -100,32 +100,11 @@ class _RawTiledMap(TypedDict):
tilesets: List[_RawTilesetMapping]
tilewidth: int
type: str
version: str
version: float
width: int
def _cast_raw_tilesets(raw_tilesets: List[_RawTilesetMapping]) -> TilesetDict:
""" Cast a list of raw tileset mappings to a Tileset dictionary.
Args:
raw_tilesets: the list of Tileset mappings to be cast into a TilesetDict
Returns:
TilesetDict: containing all tilesets by `firstgid`
"""
tilesets: TilesetDict = {}
for raw_tileset_mapping in raw_tilesets:
with open(Path(raw_tileset_mapping["source"])) as raw_tileset_file:
raw_tileset = typing_cast(RawTileSet, json.load(raw_tileset_file))
tilesets[raw_tileset_mapping["firstgid"]] = tileset.cast(raw_tileset)
return tilesets
def cast(raw_tiled_map: _RawTiledMap) -> Map:
def cast(file: Path) -> Map:
""" Cast the raw Tiled map into a pytiled_parser type
Args:
@@ -135,6 +114,28 @@ def cast(raw_tiled_map: _RawTiledMap) -> Map:
TileSet: a properly typed TileSet.
"""
with open(file) as map_file:
raw_tiled_map = json.load(map_file)
parent_dir = file.parent
raw_tilesets: List[Union[RawTileSet, _RawTilesetMapping]] = raw_tiled_map[
"tilesets"
]
tilesets: TilesetDict = {}
for raw_tileset in raw_tilesets:
if raw_tileset.get("source") is not None:
# Is an external Tileset
with open(parent_dir / raw_tileset["source"]) as raw_tileset_file:
tilesets[raw_tileset["firstgid"]] = tileset.cast(
json.load(raw_tileset_file)
)
else:
# Is an embedded Tileset
raw_tileset = typing_cast(RawTileSet, raw_tileset)
tilesets[raw_tileset["firstgid"]] = tileset.cast(raw_tileset)
# `map` is a built-in function
map_ = Map(
infinite=raw_tiled_map["infinite"],
@@ -146,7 +147,7 @@ def cast(raw_tiled_map: _RawTiledMap) -> Map:
render_order=raw_tiled_map["renderorder"],
tiled_version=raw_tiled_map["tiledversion"],
tile_size=Size(raw_tiled_map["tilewidth"], raw_tiled_map["tileheight"]),
tilesets=_cast_raw_tilesets(raw_tiled_map["tilesets"]),
tilesets=tilesets,
version=raw_tiled_map["version"],
)

View File

@@ -139,19 +139,20 @@ class TileSet:
"""
name: str
type: str
tile_width: int
tile_height: int
tile_count: int
columns: int
tiled_version: str
version: float
spacing: int = 0
margin: int = 0
type: Optional[str] = None
tiled_version: Optional[str] = None
version: Optional[float] = None
image: Optional[Path] = None
image_width: Optional[int] = None
image_height: Optional[int] = None
@@ -370,11 +371,17 @@ def cast(raw_tileset: RawTileSet) -> TileSet:
columns=raw_tileset["columns"],
spacing=raw_tileset["spacing"],
margin=raw_tileset["margin"],
version=raw_tileset["version"],
tiled_version=raw_tileset["tiledversion"],
type=raw_tileset["type"],
)
if raw_tileset.get("type") is not None:
tileset.type = raw_tileset["type"]
if raw_tileset.get("version") is not None:
tileset.version = raw_tileset["version"]
if raw_tileset.get("tiledversion") is not None:
tileset.tiled_version = raw_tileset["tiledversion"]
if raw_tileset.get("image") is not None:
tileset.image = Path(raw_tileset["image"])