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