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