Great general unique accepts conditionals - @SpacedOutChicken #3242

This commit is contained in:
Yair Morgenstern
2023-01-21 23:10:37 +02:00
parent bb62f245c7
commit 1276036c64
2 changed files with 11 additions and 4 deletions

View File

@ -72,7 +72,7 @@ object BattleDamage {
if (civResources[resource]!! < 0 && !civInfo.isBarbarian())
modifiers["Missing resource"] = -25 //todo ModConstants
val (greatGeneralName, greatGeneralBonus) = GreatGeneralImplementation.getGreatGeneralBonus(combatant.unit)
val (greatGeneralName, greatGeneralBonus) = GreatGeneralImplementation.getGreatGeneralBonus(combatant, enemy, combatAction)
if (greatGeneralBonus != 0)
modifiers[greatGeneralName] = greatGeneralBonus

View File

@ -3,6 +3,7 @@ package com.unciv.logic.battle
import com.unciv.logic.automation.unit.SpecificUnitAutomation
import com.unciv.logic.map.mapunit.MapUnit
import com.unciv.logic.map.tile.TileInfo
import com.unciv.models.ruleset.unique.StateForConditionals
import com.unciv.models.ruleset.unique.Unique
import com.unciv.models.ruleset.unique.UniqueType
@ -25,15 +26,21 @@ object GreatGeneralImplementation {
*
* @return A pair of unit's name and bonus (percentage) as Int (typically 15), or 0 if no applicable Great General equivalents found
*/
fun getGreatGeneralBonus(unit: MapUnit): Pair<String, Int> {
val civInfo = unit.civInfo
fun getGreatGeneralBonus(
ourUnitCombatant: MapUnitCombatant,
enemy: ICombatant,
combatAction: CombatAction
): Pair<String, Int> {
val unit = ourUnitCombatant.unit
val civInfo = ourUnitCombatant.unit.civInfo
val allGenerals = civInfo.units.getCivUnits()
.filter { it.hasStrengthBonusInRadiusUnique }
if (allGenerals.none()) return Pair("", 0)
val greatGeneral = allGenerals
.flatMap { general ->
general.getMatchingUniques(UniqueType.StrengthBonusInRadius)
general.getMatchingUniques(UniqueType.StrengthBonusInRadius,
StateForConditionals(unit.civInfo, ourCombatant = ourUnitCombatant, theirCombatant = enemy, combatAction = combatAction))
.map { GeneralBonusData(general, it) }
}.filter {
// Support the border case when a mod unit has several