From 8e59f9a8f9b57b6b77c3643752e108cf342eea93 Mon Sep 17 00:00:00 2001 From: yairm210 Date: Wed, 23 Jul 2025 00:12:13 +0300 Subject: [PATCH] chore(purity): resource modifiers --- build.gradle.kts | 9 +-------- core/src/com/unciv/logic/city/City.kt | 3 +-- core/src/com/unciv/logic/city/CityResources.kt | 11 +++++------ core/src/com/unciv/logic/civilization/Civilization.kt | 10 ++++------ .../src/com/unciv/models/ruleset/tile/TileResource.kt | 2 ++ 5 files changed, 13 insertions(+), 22 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 1b805f2dfb..3c7815a680 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -48,20 +48,13 @@ allprojects { apply(plugin = "io.github.yairm210.purity-plugin") configure{ wellKnownPureFunctions = setOf( - "com.unciv.logic.civilization.diplomacy.RelationshipLevel.compareTo", - "kotlin.math.max", - "kotlin.math.min", - "kotlin.math.abs", + "kotlin.to", "kotlin.internal.ir.noWhenBranchMatchedException", ) wellKnownReadonlyFunctions = setOf( // Looks like the Collection.contains is not considered overridden :thunk: "com.badlogic.gdx.math.Vector2.len", "com.badlogic.gdx.math.Vector2.cpy", - "java.util.AbstractCollection.contains", - "java.util.AbstractCollection.isEmpty", - "java.util.AbstractCollection.iterator", - "java.util.AbstractList.get", ) wellKnownPureClasses = setOf( ) diff --git a/core/src/com/unciv/logic/city/City.kt b/core/src/com/unciv/logic/city/City.kt index 1956f11757..9845a180f5 100644 --- a/core/src/com/unciv/logic/city/City.kt +++ b/core/src/com/unciv/logic/city/City.kt @@ -28,7 +28,6 @@ import com.unciv.models.stats.GameResource import com.unciv.models.stats.INamed import com.unciv.models.stats.Stat import com.unciv.models.stats.SubStat -import yairm210.purity.annotations.LocalState import yairm210.purity.annotations.Readonly import java.util.UUID import kotlin.math.roundToInt @@ -210,7 +209,7 @@ class City : IsPartOfGameInfoSerialization, INamed { @Readonly fun getRuleset() = civ.gameInfo.ruleset - fun getResourcesGeneratedByCity(civResourceModifiers: HashMap) = CityResources.getResourcesGeneratedByCity(this, civResourceModifiers) + fun getResourcesGeneratedByCity(civResourceModifiers: Map) = CityResources.getResourcesGeneratedByCity(this, civResourceModifiers) fun getAvailableResourceAmount(resourceName: String) = CityResources.getAvailableResourceAmount(this, resourceName) @Readonly fun isGrowing() = foodForNextTurn() > 0 diff --git a/core/src/com/unciv/logic/city/CityResources.kt b/core/src/com/unciv/logic/city/CityResources.kt index 0bfa6f5b1e..979ae67cd3 100644 --- a/core/src/com/unciv/logic/city/CityResources.kt +++ b/core/src/com/unciv/logic/city/CityResources.kt @@ -5,12 +5,11 @@ import com.unciv.models.ruleset.tile.ResourceSupplyList import com.unciv.models.ruleset.tile.ResourceType import com.unciv.models.ruleset.unique.GameContext import com.unciv.models.ruleset.unique.UniqueType -import yairm210.purity.annotations.Readonly object CityResources { /** Returns ALL resources, city-wide and civ-wide */ - fun getResourcesGeneratedByCity(city: City, resourceModifiers: HashMap): ResourceSupplyList { + fun getResourcesGeneratedByCity(city: City, resourceModifiers: Map): ResourceSupplyList { val cityResources = getResourcesGeneratedByCityNotIncludingBuildings(city, resourceModifiers) addCityResourcesGeneratedFromUniqueBuildings(city, cityResources, resourceModifiers) return cityResources @@ -35,7 +34,7 @@ object CityResources { } - private fun getResourcesGeneratedByCityNotIncludingBuildings(city: City, resourceModifers: HashMap): ResourceSupplyList { + private fun getResourcesGeneratedByCityNotIncludingBuildings(city: City, resourceModifers: Map): ResourceSupplyList { val cityResources = ResourceSupplyList() addResourcesFromTiles(city, resourceModifers, cityResources) @@ -54,7 +53,7 @@ object CityResources { return cityResources } - private fun addCityResourcesGeneratedFromUniqueBuildings(city: City, cityResources: ResourceSupplyList, resourceModifer: HashMap) { + private fun addCityResourcesGeneratedFromUniqueBuildings(city: City, cityResources: ResourceSupplyList, resourceModifer: Map) { for (unique in city.getMatchingUniques(UniqueType.ProvidesResources, city.state, false)) { // E.G "Provides [1] [Iron]" val resource = city.getRuleset().tileResources[unique.params[1]] ?: continue @@ -75,7 +74,7 @@ object CityResources { return getCityResourcesAvailableToCity(city).asSequence().filter { it.resource == resource }.sumOf { it.amount } } - private fun addResourcesFromTiles(city: City, resourceModifer: HashMap, cityResources: ResourceSupplyList) { + private fun addResourcesFromTiles(city: City, resourceModifer: Map, cityResources: ResourceSupplyList) { for (tileInfo in city.getTiles().filter { it.resource != null }) { val resource = tileInfo.tileResource val amount = getTileResourceAmount(city, tileInfo) * resourceModifer[resource.name]!! @@ -83,7 +82,7 @@ object CityResources { } } - private fun addResourceFromUniqueImprovedTiles(city: City, cityResources: ResourceSupplyList, resourceModifer: HashMap) { + private fun addResourceFromUniqueImprovedTiles(city: City, cityResources: ResourceSupplyList, resourceModifer: Map) { for (tileInfo in city.getTiles().filter { it.getUnpillagedImprovement() != null }) { val gameContext = GameContext(city.civ, city, tile = tileInfo) val tileImprovement = tileInfo.getUnpillagedTileImprovement() diff --git a/core/src/com/unciv/logic/civilization/Civilization.kt b/core/src/com/unciv/logic/civilization/Civilization.kt index 2a46fd4ec5..b33be04519 100644 --- a/core/src/com/unciv/logic/civilization/Civilization.kt +++ b/core/src/com/unciv/logic/civilization/Civilization.kt @@ -494,12 +494,9 @@ class Civilization : IsPartOfGameInfoSerialization { } /** Gets modifiers for ALL resources */ - fun getResourceModifiers(): HashMap { - val resourceModifers = HashMap() - for (resource in gameInfo.ruleset.tileResources.values) - resourceModifers[resource.name] = getResourceModifier(resource) - return resourceModifers - } + @Readonly + fun getResourceModifiers(): Map = + gameInfo.ruleset.tileResources.values.associate { it.name to getResourceModifier(it) } /** * Returns the resource production modifier as a multiplier. @@ -509,6 +506,7 @@ class Civilization : IsPartOfGameInfoSerialization { * @param resource The resource for which to calculate the modifier. * @return The production modifier as a multiplier. */ + @Readonly fun getResourceModifier(resource: TileResource): Float { var finalModifier = 1f diff --git a/core/src/com/unciv/models/ruleset/tile/TileResource.kt b/core/src/com/unciv/models/ruleset/tile/TileResource.kt index 321bf22e92..303b22286b 100644 --- a/core/src/com/unciv/models/ruleset/tile/TileResource.kt +++ b/core/src/com/unciv/models/ruleset/tile/TileResource.kt @@ -197,6 +197,7 @@ class TileResource : RulesetStatsObject(), GameResource { return null } + @Readonly fun matchesFilter(filter: String, state: GameContext? = null): Boolean = MultiFilter.multiFilter(filter, { matchesSingleFilter(filter) || @@ -204,6 +205,7 @@ class TileResource : RulesetStatsObject(), GameResource { state == null && hasTagUnique(filter) }) + @Readonly fun matchesSingleFilter(filter: String) = when (filter) { name -> true "any" -> true