Generalized tile conditionals (#6110)

Tiles can come from either
A. attackedTile
B. unit tile
C. City tile

All tile conditionals now work for all tile sources
This commit is contained in:
Yair Morgenstern 2022-02-06 14:05:59 +02:00 committed by GitHub
parent f40ca8469f
commit 5e29b1321b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -75,7 +75,10 @@ class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val s
): Boolean { ): Boolean {
fun ruleset() = state.civInfo!!.gameInfo.ruleSet fun ruleset() = state.civInfo!!.gameInfo.ruleSet
val relevantUnitTile by lazy { state.attackedTile ?: state.unit?.getTile() } val relevantTile by lazy { state.attackedTile
?: state.unit?.getTile()
?: state.cityInfo?.getCenterTile()
}
val relevantUnit by lazy { val relevantUnit by lazy {
if (state.ourCombatant != null && state.ourCombatant is MapUnitCombatant) state.ourCombatant.unit if (state.ourCombatant != null && state.ourCombatant is MapUnitCombatant) state.ourCombatant.unit
else state.unit else state.unit
@ -129,27 +132,27 @@ class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val s
state.ourCombatant != null && state.ourCombatant.getHealth() < condition.params[0].toInt() state.ourCombatant != null && state.ourCombatant.getHealth() < condition.params[0].toInt()
UniqueType.ConditionalInTiles -> UniqueType.ConditionalInTiles ->
relevantUnitTile?.matchesFilter(condition.params[0], state.civInfo) == true relevantTile?.matchesFilter(condition.params[0], state.civInfo) == true
UniqueType.ConditionalFightingInTiles -> UniqueType.ConditionalFightingInTiles ->
state.attackedTile?.matchesFilter(condition.params[0], state.civInfo) == true state.attackedTile?.matchesFilter(condition.params[0], state.civInfo) == true
UniqueType.ConditionalInTilesAnd -> UniqueType.ConditionalInTilesAnd ->
relevantUnitTile!=null && relevantUnitTile!!.matchesFilter(condition.params[0], state.civInfo) relevantTile!=null && relevantTile!!.matchesFilter(condition.params[0], state.civInfo)
&& relevantUnitTile!!.matchesFilter(condition.params[1], state.civInfo) && relevantTile!!.matchesFilter(condition.params[1], state.civInfo)
UniqueType.ConditionalVsLargerCiv -> { UniqueType.ConditionalVsLargerCiv -> {
val yourCities = state.civInfo?.cities?.size ?: 1 val yourCities = state.civInfo?.cities?.size ?: 1
val theirCities = state.theirCombatant?.getCivInfo()?.cities?.size ?: 0 val theirCities = state.theirCombatant?.getCivInfo()?.cities?.size ?: 0
yourCities < theirCities yourCities < theirCities
} }
UniqueType.ConditionalForeignContinent -> UniqueType.ConditionalForeignContinent ->
state.civInfo != null && state.unit != null state.civInfo != null && relevantTile != null
&& (state.civInfo.cities.isEmpty() && (state.civInfo.cities.isEmpty()
|| state.civInfo.getCapital().getCenterTile().getContinent() || state.civInfo.getCapital().getCenterTile().getContinent()
!= state.unit.getTile().getContinent() != relevantTile!!.getContinent()
) )
UniqueType.ConditionalAdjacentUnit -> UniqueType.ConditionalAdjacentUnit ->
state.civInfo != null state.civInfo != null
&& relevantUnit != null && relevantUnit != null
&& relevantUnitTile!!.neighbors.any { && relevantTile!!.neighbors.any {
it.militaryUnit != null it.militaryUnit != null
&& it.militaryUnit != relevantUnit && it.militaryUnit != relevantUnit
&& it.militaryUnit!!.civInfo == state.civInfo && it.militaryUnit!!.civInfo == state.civInfo
@ -157,13 +160,13 @@ class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val s
} }
UniqueType.ConditionalNeighborTiles -> UniqueType.ConditionalNeighborTiles ->
state.cityInfo != null && relevantTile != null &&
state.cityInfo.getCenterTile().neighbors.count { relevantTile!!.neighbors.count {
it.matchesFilter(condition.params[2], state.civInfo) it.matchesFilter(condition.params[2], state.civInfo)
} in (condition.params[0].toInt())..(condition.params[1].toInt()) } in (condition.params[0].toInt())..(condition.params[1].toInt())
UniqueType.ConditionalNeighborTilesAnd -> UniqueType.ConditionalNeighborTilesAnd ->
state.cityInfo != null relevantTile != null
&& state.cityInfo.getCenterTile().neighbors.count { && relevantTile!!.neighbors.count {
it.matchesFilter(condition.params[2], state.civInfo) it.matchesFilter(condition.params[2], state.civInfo)
&& it.matchesFilter(condition.params[3], state.civInfo) && it.matchesFilter(condition.params[3], state.civInfo)
} in (condition.params[0].toInt())..(condition.params[1].toInt()) } in (condition.params[0].toInt())..(condition.params[1].toInt())