From 037f30ebe92a61f09fa6ab62e66f12a90c425cd5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 14 Sep 2014 06:06:35 +0000 Subject: [PATCH] - Prevent the Reckless AI (with MOVE_EQUIPMENT_TO_BETTER_CREATURES=true) from randomly moving equipment back and forth between two creatures with similar evaluation. - Some code reorganization related to AI card memory. --- .../src/main/java/forge/ai/AiAttackController.java | 1 - forge-ai/src/main/java/forge/ai/AiCardMemory.java | 12 ++++++++++++ forge-ai/src/main/java/forge/ai/AiController.java | 6 ++++++ .../src/main/java/forge/ai/ability/AttachAi.java | 8 ++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 2dfa80957f5..6373a36fadb 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -615,7 +615,6 @@ public class AiAttackController { attackersLeft.remove(attacker); } } - aiMemory.clearRememberedAttackers(); // avoid "leaking" remembered cards over to the next turn // Exalted if (combat.getAttackers().isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/AiCardMemory.java b/forge-ai/src/main/java/forge/ai/AiCardMemory.java index 0ef60a2d692..43b51d6a02a 100644 --- a/forge-ai/src/main/java/forge/ai/AiCardMemory.java +++ b/forge-ai/src/main/java/forge/ai/AiCardMemory.java @@ -42,6 +42,7 @@ public class AiCardMemory { private HashSet memMandatoryAttackers = new HashSet(); private HashSet memHeldManaSources = new HashSet(); + private HashSet memMovedEquipment = new HashSet(); //private HashSet memRevealedCards = new HashSet(); /** @@ -52,6 +53,7 @@ public class AiCardMemory { public enum MemorySet { MANDATORY_ATTACKERS, HELD_MANA_SOURCES, + MOVED_EQUIPMENT, //REVEALED_CARDS // stub, not linked to AI code yet } @@ -61,6 +63,8 @@ public class AiCardMemory { return memMandatoryAttackers; case HELD_MANA_SOURCES: return memHeldManaSources; + case MOVED_EQUIPMENT: + return memMovedEquipment; //case REVEALED_CARDS: // return memRevealedCards; default: @@ -232,6 +236,13 @@ public class AiCardMemory { getMemorySet(MemorySet.HELD_MANA_SOURCES).clear(); } + /** + * Clears the "remembered moved equipment" memory set stored in this card memory for the given player. + */ + public void clearRememberedMovedEquipment() { + getMemorySet(MemorySet.MOVED_EQUIPMENT).clear(); + } + /** * Clears the "remembered revealed cards" memory set stored in this card memory for the given player. */ @@ -245,6 +256,7 @@ public class AiCardMemory { public void clearAllRemembered() { clearRememberedAttackers(); clearRememberedManaSources(); + clearRememberedMovedEquipment(); //clearRememberedRevealedCards(); } } \ No newline at end of file diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index a168744f555..0ae5f1608f0 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1145,6 +1145,12 @@ public class AiController { public SpellAbility choooseSpellAbilityToPlay() { final PhaseType phase = game.getPhaseHandler().getPhase(); + if (phase == PhaseType.END_OF_TURN) { + // for the next turn, make sure the decision to play SAs won't be affected by previously remembered decisions + // TODO: if the card memory is ever used for anything that should be remembered for more than a turn, make sure it's not cleared here. + getCardMemory().clearAllRemembered(); + } + if (game.getStack().isEmpty() && phase.isMain()) { Log.debug("Computer " + phase.nameForUi); List landsWannaPlay = getLandsToPlay(); diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index e113c6c4b2c..9bbfc3dd09f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -1044,6 +1044,14 @@ public class AttachAi extends SpellAbilityAi { aic.reserveManaSourcesForMain2(futureSpell); } } + + // avoid randomly moving the equipment back and forth between several creatures in one turn + aic.getCardMemory().rememberCard(attachSource.getEquippingCard(), AiCardMemory.MemorySet.MOVED_EQUIPMENT); + if (aic.getCardMemory().isRememberedCard(c, AiCardMemory.MemorySet.MOVED_EQUIPMENT)) { + return null; + } else { + aic.getCardMemory().rememberCard(c, AiCardMemory.MemorySet.MOVED_EQUIPMENT); + } } if ((c == null) && mandatory) {