diff --git a/pytiled_parser/parsers/tmx/properties.py b/pytiled_parser/parsers/tmx/properties.py index 57731d25..bf74197b 100644 --- a/pytiled_parser/parsers/tmx/properties.py +++ b/pytiled_parser/parsers/tmx/properties.py @@ -1,7 +1,7 @@ import xml.etree.ElementTree as etree from pathlib import Path -from pytiled_parser.properties import Properties, Property, ClassProperty +from pytiled_parser.properties import ClassProperty, Properties, Property from pytiled_parser.util import parse_color @@ -14,7 +14,9 @@ def parse(raw_properties: etree.Element) -> Properties: if type_ == "class": children_nodes = raw_property.find("./properties") x = ClassProperty( - raw_property.attrib["propertytype"], parse(children_nodes) if children_nodes is not None else {}) + raw_property.attrib["propertytype"], + parse(children_nodes) if children_nodes is not None else {}, + ) final[raw_property.attrib["name"]] = x continue @@ -26,6 +28,8 @@ def parse(raw_properties: etree.Element) -> Properties: value = Path(value_) elif type_ == "color": value = parse_color(value_) + elif type_ == "object": + value = int(value_) elif type_ == "int": value = round(float(value_)) elif type_ == "float": diff --git a/tests/test_properties_tmx.py b/tests/test_properties_tmx.py new file mode 100644 index 00000000..13912a36 --- /dev/null +++ b/tests/test_properties_tmx.py @@ -0,0 +1,54 @@ +import xml.etree.ElementTree as etree + +import pytest + +from pytiled_parser import parse_map +from pytiled_parser.layer import ObjectLayer +from pytiled_parser.parsers.json.properties import parse as parse_json +from pytiled_parser.parsers.tmx.properties import parse as parse_tmx +from pytiled_parser.properties import ClassProperty + + +@pytest.mark.parametrize("object_id", [0, 1, 42, 2147483647]) +def test_object_reference_ids(object_id): + properties = etree.fromstring( + '' + ) + parsed = parse_tmx(properties) + raw_property = {"name": "target", "type": "object", "value": object_id} + expected = parse_json([raw_property]) + assert parsed == expected + assert type(parsed["target"]) is int + + +def test_object_reference_in_class(): + properties = etree.fromstring( + '' + '' + "" + ) + parsed = parse_tmx(properties)["spawn"] + assert isinstance(parsed, ClassProperty) + assert parsed.propertytype == "Spawn" + assert parsed["target"] == 42 + + +def test_map_object_reference_lookup(tmp_path): + map_file = tmp_path / "objects.tmx" + map_file.write_text( + '' + '' + '' + '' + '', + encoding="utf-8", + ) + layer = parse_map(map_file).layers[0] + assert isinstance(layer, ObjectLayer) + source, target = layer.tiled_objects + objects_by_id = {obj.id: obj for obj in layer.tiled_objects} + assert objects_by_id[source.properties["target"]] is target + assert source.properties["unset"] == 0