Add trigger from building improvements and trigger conditional for building improvements (#10644)

* Add trigger from building improvements and trigger conditional for building improvements

* Classic case of the forgotten import

* Fix improvement triggerables saying they aren't allowed and move the trigger to its own function

* include the tile in the civ trigger

* Update core/src/com/unciv/models/ruleset/unique/UniqueType.kt

---------

Co-authored-by: Yair Morgenstern <yairm210@hotmail.com>
This commit is contained in:
SeventhM
2023-12-03 12:16:31 -08:00
committed by GitHub
parent c142d1508c
commit f8315de414
6 changed files with 36 additions and 7 deletions

View File

@ -170,7 +170,7 @@ class UnitTurnManager(val unit: MapUnit) {
UncivGame.Current.settings.addCompletedTutorialTask("Construct an improvement") UncivGame.Current.settings.addCompletedTutorialTask("Construct an improvement")
val improvementInProgress = tile.improvementInProgress ?: return val improvementInProgress = tile.improvementInProgress ?: return
tile.changeImprovement(improvementInProgress, unit.civ) tile.changeImprovement(improvementInProgress, unit.civ, unit)
tile.improvementInProgress = null tile.improvementInProgress = null
tile.getCity()?.updateCitizens = true tile.getCity()?.updateCitizens = true

View File

@ -306,8 +306,8 @@ open class Tile : IsPartOfGameInfoSerialization {
fun removeImprovement() = fun removeImprovement() =
improvementFunctions.changeImprovement(null) improvementFunctions.changeImprovement(null)
fun changeImprovement(improvementStr: String, civToHandleCompletion:Civilization? = null) = fun changeImprovement(improvementStr: String, civToHandleCompletion: Civilization? = null, unit: MapUnit? = null) =
improvementFunctions.changeImprovement(improvementStr, civToHandleCompletion) improvementFunctions.changeImprovement(improvementStr, civToHandleCompletion, unit)
// function handling when adding a road to the tile // function handling when adding a road to the tile
fun addRoad(roadType: RoadStatus, creatingCivInfo: Civilization?) { fun addRoad(roadType: RoadStatus, creatingCivInfo: Civilization?) {

View File

@ -6,8 +6,10 @@ import com.unciv.logic.civilization.LocationAction
import com.unciv.logic.civilization.NotificationCategory import com.unciv.logic.civilization.NotificationCategory
import com.unciv.logic.civilization.NotificationIcon import com.unciv.logic.civilization.NotificationIcon
import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers
import com.unciv.logic.map.mapunit.MapUnit
import com.unciv.models.ruleset.tile.TileImprovement import com.unciv.models.ruleset.tile.TileImprovement
import com.unciv.models.ruleset.unique.StateForConditionals import com.unciv.models.ruleset.unique.StateForConditionals
import com.unciv.models.ruleset.unique.UniqueTriggerActivation
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
@ -187,7 +189,7 @@ class TileInfoImprovementFunctions(val tile: Tile) {
fun changeImprovement(improvementName: String?, fun changeImprovement(improvementName: String?,
/** For road assignment and taking over tiles - DO NOT pass when simulating improvement effects! */ /** For road assignment and taking over tiles - DO NOT pass when simulating improvement effects! */
civToActivateBroaderEffects:Civilization? = null) { civToActivateBroaderEffects: Civilization? = null, unit: MapUnit? = null) {
val improvementObject = tile.ruleset.tileImprovements[improvementName] val improvementObject = tile.ruleset.tileImprovements[improvementName]
when { when {
@ -223,6 +225,9 @@ class TileInfoImprovementFunctions(val tile: Tile) {
) )
takeOverTilesAround(civToActivateBroaderEffects, tile) takeOverTilesAround(civToActivateBroaderEffects, tile)
if (civToActivateBroaderEffects != null && improvementObject != null)
triggerImprovementUniques(improvementObject, civToActivateBroaderEffects, unit)
val city = tile.owningCity val city = tile.owningCity
if (city != null) { if (city != null) {
city.cityStats.update() city.cityStats.update()
@ -233,6 +238,29 @@ class TileInfoImprovementFunctions(val tile: Tile) {
} }
} }
private fun triggerImprovementUniques(
improvement: TileImprovement,
civ: Civilization,
unit: MapUnit? = null
) {
for (unique in improvement.uniqueObjects.filter { !it.hasTriggerConditional() })
if (unit != null) {
UniqueTriggerActivation.triggerUnitwideUnique(unique, unit)
}
else UniqueTriggerActivation.triggerCivwideUnique(unique, civ, tile = tile)
if (unit != null){
for (unique in unit.getTriggeredUniques(UniqueType.TriggerUponBuildingImprovement)
.filter { improvement.matchesFilter(it.params[0]) })
UniqueTriggerActivation.triggerUnitwideUnique(unique, unit)
}
for (unique in civ.getMatchingUniques(
UniqueType.TriggerUponBuildingImprovement, StateForConditionals(civInfo = civ, unit = unit))
.filter { improvement.matchesFilter(it.params[0]) })
UniqueTriggerActivation.triggerCivwideUnique(unique, civ, tile = tile)
}
private fun adtivateRemovalImprovement( private fun adtivateRemovalImprovement(
improvementName: String, improvementName: String,
civToActivateBroaderEffects: Civilization? civToActivateBroaderEffects: Civilization?

View File

@ -48,7 +48,7 @@ enum class UniqueTarget(
// Tile-specific // Tile-specific
Terrain, Terrain,
Improvement, Improvement(inheritsFrom = Triggerable),
Resource(inheritsFrom = Global), Resource(inheritsFrom = Global),
Ruins(inheritsFrom = UnitTriggerable), Ruins(inheritsFrom = UnitTriggerable),

View File

@ -756,6 +756,7 @@ enum class UniqueType(
/** Can be placed upon both units and as global */ /** Can be placed upon both units and as global */
TriggerUponConqueringCity("upon conquering a city", UniqueTarget.TriggerCondition, UniqueTarget.UnitTriggerCondition), TriggerUponConqueringCity("upon conquering a city", UniqueTarget.TriggerCondition, UniqueTarget.UnitTriggerCondition),
TriggerUponFoundingCity("upon founding a city", UniqueTarget.TriggerCondition), TriggerUponFoundingCity("upon founding a city", UniqueTarget.TriggerCondition),
TriggerUponBuildingImprovement("upon building a [improvementFilter] improvement", UniqueTarget.TriggerCondition, UniqueTarget.UnitTriggerCondition),
TriggerUponDiscoveringNaturalWonder("upon discovering a Natural Wonder", UniqueTarget.TriggerCondition), TriggerUponDiscoveringNaturalWonder("upon discovering a Natural Wonder", UniqueTarget.TriggerCondition),
TriggerUponConstructingBuilding("upon constructing [buildingFilter]", UniqueTarget.TriggerCondition), TriggerUponConstructingBuilding("upon constructing [buildingFilter]", UniqueTarget.TriggerCondition),
// We have a separate trigger to include the cityFilter, since '[in all cities]' can be read '*only* if it's in all cities' // We have a separate trigger to include the cityFilter, since '[in all cities]' can be read '*only* if it's in all cities'

View File

@ -40,7 +40,7 @@ object UnitActionsFromUniques {
return UnitAction(UnitActionType.Create, "Create [$improvementName]", return UnitAction(UnitActionType.Create, "Create [$improvementName]",
action = { action = {
tile.changeImprovement(improvementName, unit.civ) tile.changeImprovement(improvementName, unit.civ, unit)
unit.destroy() // Modders may wish for a nondestructive way, but that should be another Unique unit.destroy() // Modders may wish for a nondestructive way, but that should be another Unique
}.takeIf { unit.currentMovement > 0 }) }.takeIf { unit.currentMovement > 0 })
} }
@ -255,7 +255,7 @@ object UnitActionsFromUniques {
), ),
action = { action = {
val unitTile = unit.getTile() val unitTile = unit.getTile()
unitTile.changeImprovement(improvementName, unit.civ) unitTile.changeImprovement(improvementName, unit.civ, unit)
// without this the world screen won't show the improvement because it isn't the 'last seen improvement' // without this the world screen won't show the improvement because it isn't the 'last seen improvement'
unit.civ.cache.updateViewableTiles() unit.civ.cache.updateViewableTiles()