diff --git a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt index cf6414b3db..a0512cb7b1 100644 --- a/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt +++ b/engine/src/main/kotlin/world/gregs/voidps/engine/data/definition/Tables.kt @@ -287,7 +287,7 @@ object Tables { val column = builder.readers[index] if (column is ColumnReader.ReaderClone) { val rowId = column.read(reader) - val clone = rows.firstOrNull { it.rowId == rowId }?.data + val clone = ids["$key.$rowId"]?.let { rows[it].data } requireNotNull(clone) { "Row '$rowId' to clone not found in table '$key' at ${reader.exception()}." } for (i in row.indices) { if (row[i] == null) { diff --git a/engine/src/test/kotlin/world/gregs/voidps/engine/data/definition/TablesTest.kt b/engine/src/test/kotlin/world/gregs/voidps/engine/data/definition/TablesTest.kt index fe73f19a25..c7d20e887a 100644 --- a/engine/src/test/kotlin/world/gregs/voidps/engine/data/definition/TablesTest.kt +++ b/engine/src/test/kotlin/world/gregs/voidps/engine/data/definition/TablesTest.kt @@ -133,6 +133,22 @@ class TablesTest { assertEquals("text", Tables.string("header.row_three.string_field")) } + @Test + fun `Clone resolves within own table when rowId collides across tables`() { + AnimationDefinitions.set(emptyArray(), emptyMap()) + GraphicDefinitions.set(emptyArray(), emptyMap()) + ItemDefinitions.set(emptyArray(), emptyMap()) + ObjectDefinitions.set(emptyArray(), emptyMap()) + NPCDefinitions.set(emptyArray(), emptyMap()) + VariableDefinitions.set(emptyMap(), emptyMap(), emptyMap()) + val other = TablesTest::class.java.getResource("test-table-clone-other.toml")!! + val main = TablesTest::class.java.getResource("test-table-clone-main.toml")!! + Tables.load(listOf(other.path, main.path)) + + assertEquals(1, Tables.int("main.cloned.int_field")) + assertEquals("main_text", Tables.string("main.cloned.string_field")) + } + private fun assertColumns(expected: List, definition: TableDefinition) { for ((i, field) in expected.withIndex()) { assertAnyEquals(field.default, definition.default[i], "$field index $i") diff --git a/engine/src/test/resources/world/gregs/voidps/engine/data/definition/test-table-clone-main.toml b/engine/src/test/resources/world/gregs/voidps/engine/data/definition/test-table-clone-main.toml new file mode 100644 index 0000000000..7321e66688 --- /dev/null +++ b/engine/src/test/resources/world/gregs/voidps/engine/data/definition/test-table-clone-main.toml @@ -0,0 +1,11 @@ +[main] +int_field = "int" +string_field = "string" +clone = "clone" + +[.row] +int_field = 1 +string_field = "main_text" + +[.cloned] +clone = "row" diff --git a/engine/src/test/resources/world/gregs/voidps/engine/data/definition/test-table-clone-other.toml b/engine/src/test/resources/world/gregs/voidps/engine/data/definition/test-table-clone-other.toml new file mode 100644 index 0000000000..a0821ae6f6 --- /dev/null +++ b/engine/src/test/resources/world/gregs/voidps/engine/data/definition/test-table-clone-other.toml @@ -0,0 +1,6 @@ +[other] +int_field = "int" +clone = "clone" + +[.row] +int_field = 99