|
|
@@ -67,14 +67,8 @@ AttackPossibility AttackPossibility::evaluate(const BattleAttackInfo & attackInf
|
|
|
auto defender = attackInfo.defender;
|
|
|
const std::string cachingStringBlocksRetaliation = "type_BLOCKS_RETALIATION";
|
|
|
static const auto selectorBlocksRetaliation = Selector::type(Bonus::BLOCKS_RETALIATION);
|
|
|
+ const auto attackerSide = getCbc()->playerToSide(getCbc()->battleGetOwner(attacker));
|
|
|
const bool counterAttacksBlocked = attacker->hasBonus(selectorBlocksRetaliation, cachingStringBlocksRetaliation);
|
|
|
- const bool mindControlled = [&](const battle::Unit *attacker) -> bool
|
|
|
- {
|
|
|
- auto actualSide = getCbc()->playerToSide(getCbc()->battleGetOwner(attacker));
|
|
|
- if (actualSide && actualSide.get() != attacker->unitSide())
|
|
|
- return true;
|
|
|
- return false;
|
|
|
- } (attacker);
|
|
|
|
|
|
AttackPossibility bestAp(hex, BattleHex::INVALID, attackInfo);
|
|
|
|
|
|
@@ -153,10 +147,14 @@ AttackPossibility AttackPossibility::evaluate(const BattleAttackInfo & attackInf
|
|
|
defenderState->afterAttack(attackInfo.shooting, true);
|
|
|
}
|
|
|
|
|
|
- bool isEnemy = state->battleMatchOwner(attacker, u) && !mindControlled;
|
|
|
+ bool isEnemy = state->battleMatchOwner(attacker, u);
|
|
|
+
|
|
|
+ // this includes enemy units as well as attacker units under enemy's mind control
|
|
|
if(isEnemy)
|
|
|
ap.damageDealt += damageDealt;
|
|
|
- else // friendly fire
|
|
|
+
|
|
|
+ // damaging attacker's units (even those under enemy's mind control) is considered friendly fire
|
|
|
+ if(attackerSide == u->unitSide())
|
|
|
ap.collateralDamage += damageDealt;
|
|
|
|
|
|
if(u->unitId() == defender->unitId() ||
|