mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 03:38:01 +00:00
AiAttackController: add check for GlobalAttackRestrictions used for getting MaxAttack,
when it can only attack with one creature, it should pick the strongest one. also moved MustAttack parts a bit. that fixes AI using the Attack Rule of Silent Arbiter correctly
This commit is contained in:
@@ -35,6 +35,7 @@ import forge.game.card.CardLists;
|
|||||||
import forge.game.card.CounterType;
|
import forge.game.card.CounterType;
|
||||||
import forge.game.combat.Combat;
|
import forge.game.combat.Combat;
|
||||||
import forge.game.combat.CombatUtil;
|
import forge.game.combat.CombatUtil;
|
||||||
|
import forge.game.combat.GlobalAttackRestrictions;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.trigger.Trigger;
|
import forge.game.trigger.Trigger;
|
||||||
@@ -524,12 +525,29 @@ public class AiAttackController {
|
|||||||
// Determine who will be attacked
|
// Determine who will be attacked
|
||||||
GameEntity defender = this.chooseDefender(combat, bAssault);
|
GameEntity defender = this.chooseDefender(combat, bAssault);
|
||||||
List<Card> attackersLeft = new ArrayList<Card>(this.attackers);
|
List<Card> attackersLeft = new ArrayList<Card>(this.attackers);
|
||||||
|
|
||||||
|
// TODO probably use AttackConstraints instead of only GlobalAttackRestrictions?
|
||||||
|
GlobalAttackRestrictions restrict = GlobalAttackRestrictions.getGlobalRestrictions(ai, combat.getDefenders());
|
||||||
|
final int attackMax = restrict.getMax();
|
||||||
|
|
||||||
|
if (attackMax == 0) {
|
||||||
|
// can't attack anymore
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Attackers that don't really have a choice
|
// Attackers that don't really have a choice
|
||||||
for (final Card attacker : this.attackers) {
|
for (final Card attacker : this.attackers) {
|
||||||
if (!CombatUtil.canAttack(attacker, defender)) {
|
if (!CombatUtil.canAttack(attacker, defender)) {
|
||||||
|
attackersLeft.remove(attacker);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
boolean mustAttack = false;
|
boolean mustAttack = false;
|
||||||
|
if (attacker.getSVar("MustAttack").equals("True")) {
|
||||||
|
mustAttack = true;
|
||||||
|
} else if (attacker.getSVar("EndOfTurnLeavePlay").equals("True")
|
||||||
|
&& isEffectiveAttacker(ai, attacker, combat)) {
|
||||||
|
mustAttack = true;
|
||||||
|
} else {
|
||||||
for (String s : attacker.getKeywords()) {
|
for (String s : attacker.getKeywords()) {
|
||||||
if (s.equals("CARDNAME attacks each turn if able.")
|
if (s.equals("CARDNAME attacks each turn if able.")
|
||||||
|| s.startsWith("CARDNAME attacks specific player each combat if able")
|
|| s.startsWith("CARDNAME attacks specific player each combat if able")
|
||||||
@@ -537,14 +555,9 @@ public class AiAttackController {
|
|||||||
mustAttack = true;
|
mustAttack = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (attacker.getSVar("EndOfTurnLeavePlay").equals("True")
|
|
||||||
&& isEffectiveAttacker(ai, attacker, combat)) {
|
|
||||||
mustAttack = true;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mustAttack || attacker.getController().getMustAttackEntity() != null
|
if (mustAttack || attacker.getController().getMustAttackEntity() != null) {
|
||||||
|| attacker.getSVar("MustAttack").equals("True")) {
|
|
||||||
combat.addAttacker(attacker, defender);
|
combat.addAttacker(attacker, defender);
|
||||||
attackersLeft.remove(attacker);
|
attackersLeft.remove(attacker);
|
||||||
}
|
}
|
||||||
@@ -557,10 +570,15 @@ public class AiAttackController {
|
|||||||
System.out.println("Assault");
|
System.out.println("Assault");
|
||||||
CardLists.sortByPowerDesc(attackersLeft);
|
CardLists.sortByPowerDesc(attackersLeft);
|
||||||
for (Card attacker : attackersLeft) {
|
for (Card attacker : attackersLeft) {
|
||||||
|
// reached max, breakup
|
||||||
|
if (attackMax != -1 && combat.getAttackers().size() >= attackMax)
|
||||||
|
return;
|
||||||
|
|
||||||
if (CombatUtil.canAttack(attacker, defender) && this.isEffectiveAttacker(ai, attacker, combat)) {
|
if (CombatUtil.canAttack(attacker, defender) && this.isEffectiveAttacker(ai, attacker, combat)) {
|
||||||
combat.addAttacker(attacker, defender);
|
combat.addAttacker(attacker, defender);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// no more creatures to attack
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -611,6 +629,23 @@ public class AiAttackController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (attackMax != -1) {
|
||||||
|
// should attack with only max if able.
|
||||||
|
CardLists.sortByPowerDesc(this.attackers);
|
||||||
|
this.aiAggression = 6;
|
||||||
|
for (Card attacker : this.attackers) {
|
||||||
|
// reached max, breakup
|
||||||
|
if (attackMax != -1 && combat.getAttackers().size() >= attackMax)
|
||||||
|
break;
|
||||||
|
if (CombatUtil.canAttack(attacker, defender) && this.shouldAttack(ai, attacker, this.blockers, combat)) {
|
||||||
|
combat.addAttacker(attacker, defender);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// no more creatures to attack
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// *******************
|
// *******************
|
||||||
// Evaluate the creature forces
|
// Evaluate the creature forces
|
||||||
// *******************
|
// *******************
|
||||||
|
|||||||
Reference in New Issue
Block a user