Skip to content

Commit fec4064

Browse files
committed
Initial object template implementation
1 parent e5caf6d commit fec4064

File tree

4 files changed

+35
-17
lines changed

4 files changed

+35
-17
lines changed

pytiled_parser/layer.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,9 @@ def _cast_tile_layer(raw_layer: RawLayer) -> TileLayer:
402402
return tile_layer
403403

404404

405-
def _cast_object_layer(raw_layer: RawLayer) -> ObjectLayer:
405+
def _cast_object_layer(
406+
raw_layer: RawLayer, parent_dir: Optional[Path] = None
407+
) -> ObjectLayer:
406408
"""Cast the raw_layer to an ObjectLayer.
407409
408410
Args:
@@ -413,7 +415,7 @@ def _cast_object_layer(raw_layer: RawLayer) -> ObjectLayer:
413415

414416
tiled_objects = []
415417
for tiled_object_ in raw_layer["objects"]:
416-
tiled_objects.append(tiled_object.cast(tiled_object_))
418+
tiled_objects.append(tiled_object.cast(tiled_object_, parent_dir))
417419

418420
return ObjectLayer(
419421
tiled_objects=tiled_objects,
@@ -441,7 +443,9 @@ def _cast_image_layer(raw_layer: RawLayer) -> ImageLayer:
441443
return image_layer
442444

443445

444-
def _cast_group_layer(raw_layer: RawLayer) -> LayerGroup:
446+
def _cast_group_layer(
447+
raw_layer: RawLayer, parent_dir: Optional[Path] = None
448+
) -> LayerGroup:
445449
"""Cast the raw_layer to a LayerGroup.
446450
447451
Args:
@@ -454,7 +458,7 @@ def _cast_group_layer(raw_layer: RawLayer) -> LayerGroup:
454458
layers = []
455459

456460
for layer in raw_layer["layers"]:
457-
layers.append(cast(layer))
461+
layers.append(cast(layer, parent_dir))
458462

459463
return LayerGroup(layers=layers, **_get_common_attributes(raw_layer).__dict__)
460464

@@ -477,7 +481,7 @@ def _get_caster(type_: str) -> Callable[[RawLayer], Layer]:
477481
return casters[type_]
478482

479483

480-
def cast(raw_layer: RawLayer) -> Layer:
484+
def cast(raw_layer: RawLayer, parent_dir: Optional[Path] = None) -> Layer:
481485
"""Cast a raw Tiled layer into a pytiled_parser type.
482486
483487
This function will determine the type of layer and cast accordingly.
@@ -490,4 +494,10 @@ def cast(raw_layer: RawLayer) -> Layer:
490494
"""
491495
caster = _get_caster(raw_layer["type"])
492496

493-
return caster(raw_layer)
497+
if (
498+
caster.__name__ == "_cast_object_layer"
499+
or caster.__name__ == "_cast_group_layer"
500+
):
501+
return caster(raw_layer, parent_dir)
502+
else:
503+
return caster(raw_layer)

pytiled_parser/template.py

Lines changed: 0 additions & 8 deletions
This file was deleted.

pytiled_parser/tiled_map.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ def parse_map(file: Path) -> TiledMap:
148148
map_ = TiledMap(
149149
map_file=file,
150150
infinite=raw_tiled_map["infinite"],
151-
layers=[layer.cast(layer_) for layer_ in raw_tiled_map["layers"]],
151+
layers=[layer.cast(layer_, parent_dir) for layer_ in raw_tiled_map["layers"]],
152152
map_size=Size(raw_tiled_map["width"], raw_tiled_map["height"]),
153153
next_layer_id=raw_tiled_map["nextlayerid"],
154154
next_object_id=raw_tiled_map["nextobjectid"],

pytiled_parser/tiled_object.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# pylint: disable=too-few-public-methods
2-
2+
import json
3+
from pathlib import Path
34
from typing import Callable, Dict, List, Optional, Union
45

56
import attr
@@ -174,6 +175,7 @@ class RawTiledObject(TypedDict):
174175

175176
id: int
176177
gid: int
178+
template: str
177179
x: float
178180
y: float
179181
width: float
@@ -390,7 +392,9 @@ def _get_caster(
390392
return _cast_rectangle
391393

392394

393-
def cast(raw_tiled_object: RawTiledObject) -> TiledObject:
395+
def cast(
396+
raw_tiled_object: RawTiledObject, parent_dir: Optional[Path] = None
397+
) -> TiledObject:
394398
"""Cast the raw tiled object into a pytiled_parser type
395399
396400
Args:
@@ -399,6 +403,18 @@ def cast(raw_tiled_object: RawTiledObject) -> TiledObject:
399403
Returns:
400404
TiledObject: a properly typed Tiled object.
401405
"""
406+
if raw_tiled_object.get("template"):
407+
if not parent_dir:
408+
raise RuntimeError(
409+
"A parent directory must be specified when using object templates"
410+
)
411+
template_path = Path(parent_dir / raw_tiled_object["template"])
412+
with open(template_path) as raw_template_file:
413+
loaded_template = json.load(raw_template_file)["object"]
414+
for key in loaded_template:
415+
if key != "id":
416+
raw_tiled_object[key] = loaded_template[key] # type: ignore
417+
402418
caster = _get_caster(raw_tiled_object)
403419

404420
tiled_object = caster(raw_tiled_object)

0 commit comments

Comments
 (0)