mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
- Respect global attack constraints.
This commit is contained in:
@@ -519,6 +519,10 @@ public class AiAttackController {
|
|||||||
// filter out anything that can't legally attack or is already declared as an attacker
|
// filter out anything that can't legally attack or is already declared as an attacker
|
||||||
bandingCreatures = CardLists.filter(bandingCreatures, card -> CombatUtil.canAttack(card) && !combat.isAttacking(card));
|
bandingCreatures = CardLists.filter(bandingCreatures, card -> CombatUtil.canAttack(card) && !combat.isAttacking(card));
|
||||||
|
|
||||||
|
// respect global attack constraints
|
||||||
|
GlobalAttackRestrictions restrict = GlobalAttackRestrictions.getGlobalRestrictions(ai, combat.getDefenders());
|
||||||
|
int attackMax = restrict.getMax();
|
||||||
|
|
||||||
if (!bandingCreatures.isEmpty()) {
|
if (!bandingCreatures.isEmpty()) {
|
||||||
List<String> evasionKeywords = Arrays.asList("Flying", "Horsemanship", "Shadow", "Plainswalk", "Islandwalk",
|
List<String> evasionKeywords = Arrays.asList("Flying", "Horsemanship", "Shadow", "Plainswalk", "Islandwalk",
|
||||||
"Forestwalk", "Mountainwalk", "Swampwalk", "Protection from white", "Protection from black",
|
"Forestwalk", "Mountainwalk", "Swampwalk", "Protection from white", "Protection from black",
|
||||||
@@ -530,27 +534,30 @@ public class AiAttackController {
|
|||||||
Card bestAttacker = ComputerUtilCard.getBestCreatureAI(attackers);
|
Card bestAttacker = ComputerUtilCard.getBestCreatureAI(attackers);
|
||||||
Card bestAttackerNoEvasion = ComputerUtilCard.getBestCreatureAI(CardLists.filter(attackers, card -> !card.hasAnyKeyword(evasionKeywords)));
|
Card bestAttackerNoEvasion = ComputerUtilCard.getBestCreatureAI(CardLists.filter(attackers, card -> !card.hasAnyKeyword(evasionKeywords)));
|
||||||
for (Card c : bandingCreatures) {
|
for (Card c : bandingCreatures) {
|
||||||
|
Card bestBand = null;
|
||||||
|
|
||||||
if (c.hasKeyword("Bands with Other Legendary Creatures")) {
|
if (c.hasKeyword("Bands with Other Legendary Creatures")) {
|
||||||
Card bestLegendary = ComputerUtilCard.getBestCreatureAI(CardLists.getType(attackers, "Legendary"));
|
bestBand = ComputerUtilCard.getBestCreatureAI(CardLists.getType(attackers, "Legendary"));
|
||||||
if (bestLegendary != null) {
|
|
||||||
combat.addAttacker(c, combat.getDefenderByAttacker(bestLegendary), combat.getBandOfAttacker(bestLegendary));
|
|
||||||
}
|
|
||||||
} else if (c.hasKeyword("Bands with Other Dinosaurs")) {
|
} else if (c.hasKeyword("Bands with Other Dinosaurs")) {
|
||||||
Card bestDinosaur = ComputerUtilCard.getBestCreatureAI(CardLists.getType(attackers, "Dinosaur"));
|
bestBand = ComputerUtilCard.getBestCreatureAI(CardLists.getType(attackers, "Dinosaur"));
|
||||||
if (bestDinosaur != null) {
|
|
||||||
combat.addAttacker(c, combat.getDefenderByAttacker(bestDinosaur), combat.getBandOfAttacker(bestDinosaur));
|
|
||||||
}
|
|
||||||
} else if (c.hasKeyword("Bands with Other Creatures named Wolves of the Hunt")) {
|
} else if (c.hasKeyword("Bands with Other Creatures named Wolves of the Hunt")) {
|
||||||
Card bestWOTH = ComputerUtilCard.getBestCreatureAI(CardLists.filter(attackers, CardPredicates.nameEquals("Wolves of the Hunt")));
|
bestBand = ComputerUtilCard.getBestCreatureAI(CardLists.filter(attackers, CardPredicates.nameEquals("Wolves of the Hunt")));
|
||||||
if (bestWOTH != null) {
|
|
||||||
combat.addAttacker(c, combat.getDefenderByAttacker(bestWOTH), combat.getBandOfAttacker(bestWOTH));
|
|
||||||
}
|
|
||||||
} else if (!c.hasAnyKeyword(evasionKeywords) && bestAttacker.hasAnyKeyword(evasionKeywords)) {
|
} else if (!c.hasAnyKeyword(evasionKeywords) && bestAttacker.hasAnyKeyword(evasionKeywords)) {
|
||||||
if (bestAttackerNoEvasion != null) {
|
bestBand = bestAttackerNoEvasion;
|
||||||
combat.addAttacker(c, combat.getDefenderByAttacker(bestAttackerNoEvasion), combat.getBandOfAttacker(bestAttackerNoEvasion));
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
combat.addAttacker(c, combat.getDefenderByAttacker(bestAttacker), combat.getBandOfAttacker(bestAttacker));
|
bestBand = bestAttacker;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bestBand != null) {
|
||||||
|
GameEntity defender = combat.getDefenderByAttacker(bestBand);
|
||||||
|
if (attackMax == -1) {
|
||||||
|
// check with the local limitations vs. the chosen defender
|
||||||
|
attackMax = restrict.getDefenderMax().get(defender) == null ? -1 : restrict.getDefenderMax().get(defender);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attackMax == -1 || attackMax > combat.getAttackers().size()) {
|
||||||
|
combat.addAttacker(c, defender, combat.getBandOfAttacker(bestBand));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user