Resolved #8899 - Modding: 'upon being defeated' now applies to destroyed civilians as well

This commit is contained in:
Yair Morgenstern
2023-03-15 18:34:13 +02:00
parent 2e3f131169
commit 855a818a84

View File

@ -158,12 +158,6 @@ object Battle {
UniqueTriggerActivation.triggerUnitwideUnique(unique, ourUnit.unit) UniqueTriggerActivation.triggerUnitwideUnique(unique, ourUnit.unit)
} }
fun triggerDefeatUniques(ourUnit: MapUnitCombatant, enemy: ICombatant){
val stateForConditionals = StateForConditionals(civInfo = ourUnit.getCivInfo(),
ourCombatant = ourUnit, theirCombatant=enemy, tile = attackedTile)
for (unique in ourUnit.unit.getTriggeredUniques(UniqueType.TriggerUponDefeat, stateForConditionals))
UniqueTriggerActivation.triggerUnitwideUnique(unique, ourUnit.unit)
}
// Add culture when defeating a barbarian when Honor policy is adopted, gold from enemy killed when honor is complete // Add culture when defeating a barbarian when Honor policy is adopted, gold from enemy killed when honor is complete
// or any enemy military unit with Sacrificial captives unique (can be either attacker or defender!) // or any enemy military unit with Sacrificial captives unique (can be either attacker or defender!)
@ -172,14 +166,14 @@ object Battle {
tryHealAfterKilling(attacker) tryHealAfterKilling(attacker)
if (attacker is MapUnitCombatant) triggerVictoryUniques(attacker, defender) if (attacker is MapUnitCombatant) triggerVictoryUniques(attacker, defender)
triggerDefeatUniques(defender, attacker) triggerDefeatUniques(defender, attacker, attackedTile)
} else if (attacker.isDefeated() && attacker is MapUnitCombatant && !attacker.unit.isCivilian()) { } else if (attacker.isDefeated() && attacker is MapUnitCombatant && !attacker.unit.isCivilian()) {
tryEarnFromKilling(defender, attacker) tryEarnFromKilling(defender, attacker)
tryHealAfterKilling(defender) tryHealAfterKilling(defender)
if (defender is MapUnitCombatant) triggerVictoryUniques(defender, attacker) if (defender is MapUnitCombatant) triggerVictoryUniques(defender, attacker)
triggerDefeatUniques(attacker, defender) triggerDefeatUniques(attacker, defender, attackedTile)
} }
if (attacker is MapUnitCombatant) { if (attacker is MapUnitCombatant) {
@ -199,6 +193,13 @@ object Battle {
if (!isAlreadyDefeatedCity) postBattleAddXp(attacker, defender) if (!isAlreadyDefeatedCity) postBattleAddXp(attacker, defender)
} }
private fun triggerDefeatUniques(ourUnit: MapUnitCombatant, enemy: ICombatant, attackedTile: Tile){
val stateForConditionals = StateForConditionals(civInfo = ourUnit.getCivInfo(),
ourCombatant = ourUnit, theirCombatant=enemy, tile = attackedTile)
for (unique in ourUnit.unit.getTriggeredUniques(UniqueType.TriggerUponDefeat, stateForConditionals))
UniqueTriggerActivation.triggerUnitwideUnique(unique, ourUnit.unit)
}
private fun tryEarnFromKilling(civUnit: ICombatant, defeatedUnit: MapUnitCombatant) { private fun tryEarnFromKilling(civUnit: ICombatant, defeatedUnit: MapUnitCombatant) {
val unitStr = max(defeatedUnit.unit.baseUnit.strength, defeatedUnit.unit.baseUnit.rangedStrength) val unitStr = max(defeatedUnit.unit.baseUnit.strength, defeatedUnit.unit.baseUnit.rangedStrength)
val unitCost = defeatedUnit.unit.baseUnit.cost val unitCost = defeatedUnit.unit.baseUnit.cost
@ -654,18 +655,31 @@ object Battle {
&& attacker.getCivInfo().playerType == PlayerType.Human // Only humans get the choice && attacker.getCivInfo().playerType == PlayerType.Human // Only humans get the choice
-> { -> {
capturedUnit.capturedBy(attacker.getCivInfo()) capturedUnit.capturedBy(attacker.getCivInfo())
attacker.getCivInfo().popupAlerts.add(PopupAlert(AlertType.RecapturedCivilian, capturedUnitTile.position.toString())) attacker.getCivInfo().popupAlerts.add(
PopupAlert(
AlertType.RecapturedCivilian,
capturedUnitTile.position.toString()
)
)
} }
else -> captureOrConvertToWorker(capturedUnit, attacker.getCivInfo()) else -> captureOrConvertToWorker(capturedUnit, attacker.getCivInfo())
} }
if (!wasDestroyedInstead) if (!wasDestroyedInstead)
defenderCiv.addNotification("An enemy [" + attacker.getName() + "] has captured our [" + defender.getName() + "]", defenderCiv.addNotification(
defender.getTile().position, NotificationCategory.War, attacker.getName(), NotificationIcon.War, defender.getName()) "An enemy [${attacker.getName()}] has captured our [${defender.getName()}]",
else defender.getTile().position, NotificationCategory.War, attacker.getName(),
defenderCiv.addNotification("An enemy [" + attacker.getName() + "] has destroyed our [" + defender.getName() + "]", NotificationIcon.War, defender.getName()
defender.getTile().position, NotificationCategory.War, attacker.getName(), NotificationIcon.War, defender.getName()) )
else {
defenderCiv.addNotification(
"An enemy [${attacker.getName()}] has destroyed our [${defender.getName()}]",
defender.getTile().position, NotificationCategory.War, attacker.getName(),
NotificationIcon.War, defender.getName()
)
triggerDefeatUniques(defender, attacker, capturedUnitTile)
}
if (checkDefeat) if (checkDefeat)
destroyIfDefeated(defenderCiv, attacker.getCivInfo()) destroyIfDefeated(defenderCiv, attacker.getCivInfo())