Merge pull request #65 from rl-starbound/support-legacy-starbound

Add support for pre-1.0 Tiled JSON formats
This commit is contained in:
Darren Eberly
2023-01-16 11:05:59 -05:00
committed by GitHub
3 changed files with 29 additions and 15 deletions

View File

@@ -27,7 +27,7 @@ def parse(raw_properties: List[RawProperty]) -> Properties:
"""Parse a list of `RawProperty` objects into `Properties`.
Args:
raw_properties: The list of `RawProperty` objects to parse.
raw_properties: The list or dict of `RawProperty` objects to parse. The dict type is supported for parsing legacy Tiled dungeon files.
Returns:
Properties: The parsed `Property` objects.
@@ -36,13 +36,17 @@ def parse(raw_properties: List[RawProperty]) -> Properties:
final: Properties = {}
value: Property
for raw_property in raw_properties:
if raw_property["type"] == "file":
value = Path(cast(str, raw_property["value"]))
elif raw_property["type"] == "color":
value = parse_color(cast(str, raw_property["value"]))
else:
value = raw_property["value"]
final[raw_property["name"]] = value
if isinstance(raw_properties, dict):
for name, value in raw_properties.items():
final[name] = value
else:
for raw_property in raw_properties:
if raw_property["type"] == "file":
value = Path(cast(str, raw_property["value"]))
elif raw_property["type"] == "color":
value = parse_color(cast(str, raw_property["value"]))
else:
value = raw_property["value"]
final[raw_property["name"]] = value
return final

View File

@@ -112,14 +112,14 @@ def parse(file: Path) -> TiledMap:
# `map` is a built-in function
map_ = TiledMap(
map_file=file,
infinite=raw_tiled_map["infinite"],
infinite=raw_tiled_map.get("infinite", False),
layers=[parse_layer(layer_, parent_dir) for layer_ in raw_tiled_map["layers"]],
map_size=Size(raw_tiled_map["width"], raw_tiled_map["height"]),
next_layer_id=raw_tiled_map["nextlayerid"],
next_layer_id=raw_tiled_map.get("nextlayerid"),
next_object_id=raw_tiled_map["nextobjectid"],
orientation=raw_tiled_map["orientation"],
render_order=raw_tiled_map["renderorder"],
tiled_version=raw_tiled_map["tiledversion"],
tiled_version=raw_tiled_map.get("tiledversion", ""),
tile_size=Size(raw_tiled_map["tilewidth"], raw_tiled_map["tileheight"]),
tilesets=tilesets,
version=version,

View File

@@ -249,7 +249,7 @@ def parse(
tile_count=raw_tileset["tilecount"],
tile_width=raw_tileset["tilewidth"],
tile_height=raw_tileset["tileheight"],
columns=raw_tileset["columns"],
columns=raw_tileset.get("columns", 1),
spacing=raw_tileset["spacing"],
margin=raw_tileset["margin"],
firstgid=firstgid,
@@ -304,8 +304,18 @@ def parse(
if raw_tileset.get("tiles") is not None:
tiles = {}
for raw_tile in raw_tileset["tiles"]:
tiles[raw_tile["id"]] = _parse_tile(raw_tile, external_path=external_path)
if isinstance(raw_tileset["tiles"], dict):
for raw_tile_id, raw_tile in raw_tileset["tiles"].items():
assert raw_tile.get("id") is None
raw_tile["id"] = int(raw_tile_id)
tiles[raw_tile["id"]] = _parse_tile(
raw_tile, external_path=external_path
)
else:
for raw_tile in raw_tileset["tiles"]:
tiles[raw_tile["id"]] = _parse_tile(
raw_tile, external_path=external_path
)
tileset.tiles = tiles
if raw_tileset.get("wangsets") is not None: