mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 20:58:03 +00:00
- AiBlockController: added a routine to try to block a Menace creature with two creatures that don't kill it but neither of which get killed as well.
This commit is contained in:
@@ -536,6 +536,50 @@ public class AiBlockController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
attackersLeft = (new ArrayList<>(currentAttackers));
|
attackersLeft = (new ArrayList<>(currentAttackers));
|
||||||
|
|
||||||
|
// Try to block a Menace attacker with two blockers, neither of which will die
|
||||||
|
for (final Card attacker : attackersLeft) {
|
||||||
|
if (!attacker.hasKeyword("Menace") && !attacker.hasStartOfKeyword("CantBeBlockedByAmount LT2")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockers = getPossibleBlockers(combat, attacker, blockersLeft, false);
|
||||||
|
List<Card> usableBlockers;
|
||||||
|
final List<Card> blockGang = new ArrayList<>();
|
||||||
|
int absorbedDamage; // The amount of damage needed to kill the first blocker
|
||||||
|
|
||||||
|
usableBlockers = CardLists.filter(blockers, new Predicate<Card>() {
|
||||||
|
@Override
|
||||||
|
public boolean apply(final Card c) {
|
||||||
|
return c.getNetToughness() > attacker.getNetCombatDamage();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (usableBlockers.size() < 2) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Card leader = ComputerUtilCard.getBestCreatureAI(usableBlockers);
|
||||||
|
blockGang.add(leader);
|
||||||
|
usableBlockers.remove(leader);
|
||||||
|
absorbedDamage = ComputerUtilCombat.getEnoughDamageToKill(leader, attacker.getNetCombatDamage(), attacker, true);
|
||||||
|
|
||||||
|
// consider a double block
|
||||||
|
for (final Card blocker : usableBlockers) {
|
||||||
|
final int absorbedDamage2 = ComputerUtilCombat.getEnoughDamageToKill(blocker, attacker.getNetCombatDamage(), attacker, true);
|
||||||
|
// only do it if neither blocking creature will die
|
||||||
|
if (absorbedDamage > attacker.getNetCombatDamage() && absorbedDamage2 > attacker.getNetCombatDamage()) {
|
||||||
|
currentAttackers.remove(attacker);
|
||||||
|
combat.addBlocker(attacker, blocker);
|
||||||
|
if (CombatUtil.canBlock(attacker, leader, combat)) {
|
||||||
|
combat.addBlocker(attacker, leader);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
attackersLeft = (new ArrayList<>(currentAttackers));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bad Trade Blocks (should only be made if life is in danger)
|
// Bad Trade Blocks (should only be made if life is in danger)
|
||||||
|
|||||||
Reference in New Issue
Block a user