From f0ad7581bc735f8f39b08037be6978036bd80258 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Thu, 13 Oct 2022 22:55:12 +0300 Subject: [PATCH] Resolved crash when mods make 2 techs require each other --- core/src/com/unciv/models/ruleset/Ruleset.kt | 5 +++- docs/Modders/uniques.md | 5 ++++ .../src/com/unciv/uniques/UniqueErrorTests.kt | 26 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/src/com/unciv/uniques/UniqueErrorTests.kt diff --git a/core/src/com/unciv/models/ruleset/Ruleset.kt b/core/src/com/unciv/models/ruleset/Ruleset.kt index 1b609533f5..1ce2448431 100644 --- a/core/src/com/unciv/models/ruleset/Ruleset.kt +++ b/core/src/com/unciv/models/ruleset/Ruleset.kt @@ -751,9 +751,9 @@ class Ruleset { ?: return emptySet() val techHashSet = HashSet() techHashSet += technology.prerequisites + prereqsHashMap[technologyName] = techHashSet for (prerequisite in technology.prerequisites) techHashSet += getPrereqTree(prerequisite) - prereqsHashMap[technologyName] = techHashSet return techHashSet } @@ -762,6 +762,9 @@ class Ruleset { lines.add("No need to add $prereq as a prerequisite of ${tech.name} - it is already implicit from the other prerequisites!", RulesetErrorSeverity.Warning) } + + if (getPrereqTree(prereq).contains(tech.name)) + lines += "Techs ${tech.name} and $prereq require each other!" } if (tech.era() !in eras) lines += "Unknown era ${tech.era()} referenced in column of tech ${tech.name}" diff --git a/docs/Modders/uniques.md b/docs/Modders/uniques.md index d99d75b085..302e4ceadd 100644 --- a/docs/Modders/uniques.md +++ b/docs/Modders/uniques.md @@ -1724,6 +1724,11 @@ Simple unique parameters are explained by mouseover. Complex parameters are expl Applicable to: Conditional +??? example "<upon discovering [tech]>" + Example: "<upon discovering [Agriculture]>" + + Applicable to: Conditional + ??? example "<after adopting [policy]>" Example: "<after adopting [Oligarchy]>" diff --git a/tests/src/com/unciv/uniques/UniqueErrorTests.kt b/tests/src/com/unciv/uniques/UniqueErrorTests.kt new file mode 100644 index 0000000000..94b8425674 --- /dev/null +++ b/tests/src/com/unciv/uniques/UniqueErrorTests.kt @@ -0,0 +1,26 @@ +package com.unciv.uniques + +import com.unciv.models.ruleset.RulesetCache +import com.unciv.testing.GdxTestRunner +import org.junit.Test +import org.junit.runner.RunWith + + +@RunWith(GdxTestRunner::class) +class UniqueErrorTests { + @Test + fun testCodependantTechs() { + RulesetCache.loadRulesets() + val ruleset = RulesetCache.getVanillaRuleset() + + // Create a prerequisite loop + val techWithPrerequisites = ruleset.technologies.values.first { it.prerequisites.isNotEmpty() } + val prereq = ruleset.technologies[techWithPrerequisites.prerequisites.first()]!! + prereq.prerequisites.add(techWithPrerequisites.name) + ruleset.modOptions.isBaseRuleset = true + + // Check mod links and ensure we don't get a crash, instead we get errors + val errors = ruleset.checkModLinks(false) + assert(errors.isNotOK()) + } +}