diff --git a/pytiled_parser/map.py b/pytiled_parser/map.py index 2187b10..701a298 100644 --- a/pytiled_parser/map.py +++ b/pytiled_parser/map.py @@ -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"], ) diff --git a/pytiled_parser/tileset.py b/pytiled_parser/tileset.py index d2bf9a4..e7b211d 100644 --- a/pytiled_parser/tileset.py +++ b/pytiled_parser/tileset.py @@ -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"])