From 5304f74a81d533817148a25e2cd0d7a3ecf07d32 Mon Sep 17 00:00:00 2001 From: Hello-Liar <80651389+Hello-Liar@users.noreply.github.com> Date: Sun, 25 Oct 2026 20:11:25 -0700 Subject: [PATCH 1/2] Parse TMX object-reference properties as integer IDs Assisted-by: Codex:GPT-6 --- pytiled_parser/parsers/tmx/properties.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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": From ee83b4dda395c10c486cc4e7d7079a7be83d0930 Mon Sep 17 00:00:00 2001 From: Hello-Liar <80651389+Hello-Liar@users.noreply.github.com> Date: Sun, 25 Oct 2026 20:11:52 -0700 Subject: [PATCH 2/2] Test numeric TMX object references and real map lookups Assisted-by: Codex:GPT-6 --- tests/test_properties_tmx.py | 54 ++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/test_properties_tmx.py 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