mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-10 07:48:31 +07:00
Fix free buildings triggering from conditionals in incorrect places (#10532)
* ignore trigger condtional uniques * Have UniqueTriggerActivation only add the buildings of its unique * (minor optimization) move where we find the free building * Once again I forget about imports
This commit is contained in:
@ -97,6 +97,7 @@ class CivConstructions : IsPartOfGameInfoSerialization {
|
|||||||
|
|
||||||
private fun addFreeStatsBuildings() {
|
private fun addFreeStatsBuildings() {
|
||||||
val statUniquesData = civInfo.getMatchingUniques(UniqueType.FreeStatBuildings)
|
val statUniquesData = civInfo.getMatchingUniques(UniqueType.FreeStatBuildings)
|
||||||
|
.filter { !it.hasTriggerConditional() }
|
||||||
.groupBy { it.params[0] }
|
.groupBy { it.params[0] }
|
||||||
.mapKeys { Stat.valueOf(it.key) }
|
.mapKeys { Stat.valueOf(it.key) }
|
||||||
.mapValues { unique -> unique.value.sumOf { it.params[1].toInt() } }
|
.mapValues { unique -> unique.value.sumOf { it.params[1].toInt() } }
|
||||||
@ -106,7 +107,7 @@ class CivConstructions : IsPartOfGameInfoSerialization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addFreeStatBuildings(stat: Stat, amount: Int) {
|
fun addFreeStatBuildings(stat: Stat, amount: Int) {
|
||||||
for (city in civInfo.cities.take(amount)) {
|
for (city in civInfo.cities.take(amount)) {
|
||||||
if (freeStatBuildingsProvided.contains(stat.name, city.id)) continue
|
if (freeStatBuildingsProvided.contains(stat.name, city.id)) continue
|
||||||
val building = city.cityConstructions.cheapestStatBuilding(stat)
|
val building = city.cityConstructions.cheapestStatBuilding(stat)
|
||||||
@ -120,6 +121,7 @@ class CivConstructions : IsPartOfGameInfoSerialization {
|
|||||||
|
|
||||||
private fun addFreeSpecificBuildings() {
|
private fun addFreeSpecificBuildings() {
|
||||||
val buildingsUniquesData = civInfo.getMatchingUniques(UniqueType.FreeSpecificBuildings)
|
val buildingsUniquesData = civInfo.getMatchingUniques(UniqueType.FreeSpecificBuildings)
|
||||||
|
.filter { !it.hasTriggerConditional() }
|
||||||
.groupBy { it.params[0] }
|
.groupBy { it.params[0] }
|
||||||
.mapValues { unique -> unique.value.sumOf { it.params[1].toInt() } }
|
.mapValues { unique -> unique.value.sumOf { it.params[1].toInt() } }
|
||||||
|
|
||||||
@ -129,7 +131,7 @@ class CivConstructions : IsPartOfGameInfoSerialization {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addFreeBuildings(building: Building, amount: Int) {
|
fun addFreeBuildings(building: Building, amount: Int) {
|
||||||
for (city in civInfo.cities.take(amount)) {
|
for (city in civInfo.cities.take(amount)) {
|
||||||
if (freeSpecificBuildingsProvided.contains(building.name, city.id)
|
if (freeSpecificBuildingsProvided.contains(building.name, city.id)
|
||||||
|| city.cityConstructions.containsBuildingOrEquivalent(building.name)) continue
|
|| city.cityConstructions.containsBuildingOrEquivalent(building.name)) continue
|
||||||
@ -149,7 +151,8 @@ class CivConstructions : IsPartOfGameInfoSerialization {
|
|||||||
for (city in civInfo.cities) {
|
for (city in civInfo.cities) {
|
||||||
val freeBuildingsFromCity = city.getMatchingLocalOnlyUniques(UniqueType.GainFreeBuildings, StateForConditionals.IgnoreConditionals)
|
val freeBuildingsFromCity = city.getMatchingLocalOnlyUniques(UniqueType.GainFreeBuildings, StateForConditionals.IgnoreConditionals)
|
||||||
val freeBuildingUniques = (freeBuildingsFromCiv + freeBuildingsFromCity)
|
val freeBuildingUniques = (freeBuildingsFromCiv + freeBuildingsFromCity)
|
||||||
.filter { city.matchesFilter(it.params[1]) && it.conditionalsApply(StateForConditionals(city.civ, city)) }
|
.filter { city.matchesFilter(it.params[1]) && it.conditionalsApply(StateForConditionals(city.civ, city))
|
||||||
|
&& !it.hasTriggerConditional() }
|
||||||
for (unique in freeBuildingUniques) {
|
for (unique in freeBuildingUniques) {
|
||||||
val freeBuilding = city.civ.getEquivalentBuilding(unique.params[0])
|
val freeBuilding = city.civ.getEquivalentBuilding(unique.params[0])
|
||||||
city.cityConstructions.freeBuildingsProvidedFromThisCity.addToMapOfSets(city.id, freeBuilding.name)
|
city.cityConstructions.freeBuildingsProvidedFromThisCity.addToMapOfSets(city.id, freeBuilding.name)
|
||||||
|
@ -20,6 +20,7 @@ import com.unciv.models.stats.Stat
|
|||||||
import com.unciv.models.stats.Stats
|
import com.unciv.models.stats.Stats
|
||||||
import com.unciv.models.translations.fillPlaceholders
|
import com.unciv.models.translations.fillPlaceholders
|
||||||
import com.unciv.models.translations.hasPlaceholderParameters
|
import com.unciv.models.translations.hasPlaceholderParameters
|
||||||
|
import com.unciv.ui.components.extensions.addToMapOfSets
|
||||||
import com.unciv.ui.components.MayaCalendar
|
import com.unciv.ui.components.MayaCalendar
|
||||||
import com.unciv.ui.screens.worldscreen.unit.actions.UnitActionsUpgrade
|
import com.unciv.ui.screens.worldscreen.unit.actions.UnitActionsUpgrade
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
@ -664,10 +665,28 @@ object UniqueTriggerActivation {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
UniqueType.FreeStatBuildings, UniqueType.FreeSpecificBuildings,
|
|
||||||
UniqueType.GainFreeBuildings -> {
|
UniqueType.GainFreeBuildings -> {
|
||||||
civInfo.civConstructions.tryAddFreeBuildings()
|
val freeBuilding = civInfo.getEquivalentBuilding(unique.params[0])
|
||||||
return true // not fully correct
|
val applicableCities =
|
||||||
|
if (unique.params[1] == "in this city") sequenceOf(city!!)
|
||||||
|
else civInfo.cities.asSequence().filter { it.matchesFilter(unique.params[1]) }
|
||||||
|
for (applicableCity in applicableCities) {
|
||||||
|
applicableCity.cityConstructions.freeBuildingsProvidedFromThisCity.addToMapOfSets(applicableCity.id, freeBuilding.name)
|
||||||
|
|
||||||
|
if (applicableCity.cityConstructions.containsBuildingOrEquivalent(freeBuilding.name)) continue
|
||||||
|
applicableCity.cityConstructions.constructionComplete(freeBuilding)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
UniqueType.FreeStatBuildings -> {
|
||||||
|
val stat = Stat.safeValueOf(unique.params[0]) ?: return false
|
||||||
|
civInfo.civConstructions.addFreeStatBuildings(stat, unique.params[1].toInt())
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
UniqueType.FreeSpecificBuildings ->{
|
||||||
|
val building = ruleSet.buildings[unique.params[0]] ?: return false
|
||||||
|
civInfo.civConstructions.addFreeBuildings(building, unique.params[1].toInt())
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
UniqueType.RemoveBuilding -> {
|
UniqueType.RemoveBuilding -> {
|
||||||
|
Reference in New Issue
Block a user