chore(purity): resource modifiers

This commit is contained in:
yairm210 2025-07-23 00:12:13 +03:00
parent 11de0ae4a3
commit 8e59f9a8f9
5 changed files with 13 additions and 22 deletions

View File

@ -48,20 +48,13 @@ allprojects {
apply(plugin = "io.github.yairm210.purity-plugin")
configure<yairm210.purity.PurityConfiguration>{
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(
)

View File

@ -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<String, Float>) = CityResources.getResourcesGeneratedByCity(this, civResourceModifiers)
fun getResourcesGeneratedByCity(civResourceModifiers: Map<String, Float>) = CityResources.getResourcesGeneratedByCity(this, civResourceModifiers)
fun getAvailableResourceAmount(resourceName: String) = CityResources.getAvailableResourceAmount(this, resourceName)
@Readonly fun isGrowing() = foodForNextTurn() > 0

View File

@ -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<String, Float>): ResourceSupplyList {
fun getResourcesGeneratedByCity(city: City, resourceModifiers: Map<String, Float>): 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<String, Float>): ResourceSupplyList {
private fun getResourcesGeneratedByCityNotIncludingBuildings(city: City, resourceModifers: Map<String, Float>): 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<String, Float>) {
private fun addCityResourcesGeneratedFromUniqueBuildings(city: City, cityResources: ResourceSupplyList, resourceModifer: Map<String, Float>) {
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<String, Float>, cityResources: ResourceSupplyList) {
private fun addResourcesFromTiles(city: City, resourceModifer: Map<String, Float>, 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<String, Float>) {
private fun addResourceFromUniqueImprovedTiles(city: City, cityResources: ResourceSupplyList, resourceModifer: Map<String, Float>) {
for (tileInfo in city.getTiles().filter { it.getUnpillagedImprovement() != null }) {
val gameContext = GameContext(city.civ, city, tile = tileInfo)
val tileImprovement = tileInfo.getUnpillagedTileImprovement()

View File

@ -494,12 +494,9 @@ class Civilization : IsPartOfGameInfoSerialization {
}
/** Gets modifiers for ALL resources */
fun getResourceModifiers(): HashMap<String, Float> {
val resourceModifers = HashMap<String, Float>()
for (resource in gameInfo.ruleset.tileResources.values)
resourceModifers[resource.name] = getResourceModifier(resource)
return resourceModifers
}
@Readonly
fun getResourceModifiers(): Map<String, Float> =
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

View File

@ -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