From 5ab6cca22078afbea8e344d93f2da05280a642bb Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 2 Dec 2022 22:27:20 +0100 Subject: [PATCH] Extend logic --- .../java/forge/ai/AiAttackController.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 4dbb1730c7e..7e4a53a269e 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -96,7 +96,7 @@ public class AiAttackController { public AiAttackController(final Player ai, boolean nextTurn) { this.ai = ai; - defendingOpponent = choosePreferredDefenderPlayer(ai); + defendingOpponent = choosePreferredDefenderPlayer(ai, true); myList = ai.getCreaturesInPlay(); this.nextTurn = nextTurn; refreshCombatants(defendingOpponent); @@ -104,7 +104,7 @@ public class AiAttackController { public AiAttackController(final Player ai, Card attacker) { this.ai = ai; - defendingOpponent = choosePreferredDefenderPlayer(ai); + defendingOpponent = choosePreferredDefenderPlayer(ai, true); this.oppList = getOpponentCreatures(defendingOpponent); myList = ai.getCreaturesInPlay(); this.nextTurn = false; @@ -167,6 +167,9 @@ public class AiAttackController { * No strategy to secure a second place instead, since Forge has no variant for that */ public static Player choosePreferredDefenderPlayer(Player ai) { + return choosePreferredDefenderPlayer(ai, false); + } + public static Player choosePreferredDefenderPlayer(Player ai, boolean forCombatDmg) { Player defender = ai.getWeakestOpponent(); //Concentrate on opponent within easy kill range // TODO for multiplayer combat avoid players with cantLose or (if not playing infect) cantLoseForZeroOrLessLife and !canLoseLife @@ -174,10 +177,24 @@ public class AiAttackController { if (defender.getLife() > 8) { // TODO connect with evaluateBoardPosition and only fall back to random when no player is the biggest threat by a fair margin + List opps = Lists.newArrayList(ai.getOpponents()); + if (forCombatDmg) { + for (Player p : opps) { + if (p.isMonarch() && ai.canBecomeMonarch()) { + // just increase the odds for now instead of being fully predictable + // as it could lead to other too complex factors giving this reasoning negative impact + opps.add(p); + } + if (p.hasInitiative()) { + opps.add(p); + } + } + } + // TODO should we cache the random for each turn? some functions like shouldPumpCard base their decisions on the assumption who will be attacked //Otherwise choose a random opponent to ensure no ganging up on players - return Aggregates.random(ai.getOpponents()); + return Aggregates.random(opps); } return defender; }