From ad202355b206baf642517545fdba96cac62a2ca4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 29 Jun 2020 22:18:05 +0300 Subject: [PATCH] - Improve Maze's End AI. --- .../src/main/java/forge/ai/SpecialCardAi.java | 31 +++++++++++++++++++ .../java/forge/ai/ability/ChangeZoneAi.java | 4 +++ forge-gui/res/cardsfolder/m/mazes_end.txt | 2 +- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 5ed62460108..81ccf909daa 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -756,6 +756,37 @@ public class SpecialCardAi { } } + // Maze's End + public static class MazesEnd { + public static boolean consider(final Player ai, final SpellAbility sa) { + PhaseHandler ph = ai.getGame().getPhaseHandler(); + CardCollection availableGates = CardLists.filter(ai.getCardsIn(ZoneType.Library), CardPredicates.isType("Gate")); + + return ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == ai && !availableGates.isEmpty(); + } + + public static Card considerCardToGet(final Player ai, final SpellAbility sa) + { + CardCollection currentGates = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.isType("Gate")); + CardCollection availableGates = CardLists.filter(ai.getCardsIn(ZoneType.Library), CardPredicates.isType("Gate")); + + if (availableGates.isEmpty()) + return null; // shouldn't get here + + for (Card gate : availableGates) + { + if (CardLists.filter(currentGates, CardPredicates.nameEquals(gate.getName())).isEmpty()) + { + // Diversify our mana base + return gate; + } + } + + // Fetch a random gate if we already have all types + return Aggregates.random(availableGates); + } + } + // Mairsil, the Pretender public static class MairsilThePretender { // Scan the fetch list for a card with at least one activated ability. diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index 2894660612a..ae40beebfaf 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -128,6 +128,8 @@ public class ChangeZoneAi extends SpellAbilityAi { // This logic only fills the multiple cards array, the decision to play is made // separately in hiddenOriginCanPlayAI later. multipleCardsToChoose = SpecialCardAi.Intuition.considerMultiple(aiPlayer, sa); + } else if (aiLogic.equals("MazesEnd")) { + return SpecialCardAi.MazesEnd.consider(aiPlayer, sa); } } if (isHidden(sa)) { @@ -1491,6 +1493,8 @@ public class ChangeZoneAi extends SpellAbilityAi { return SpecialCardAi.MairsilThePretender.considerCardFromList(fetchList); } else if ("SurvivalOfTheFittest".equals(logic)) { return SpecialCardAi.SurvivalOfTheFittest.considerCardToGet(decider, sa); + } else if ("MazesEnd".equals(logic)) { + return SpecialCardAi.MazesEnd.considerCardToGet(decider, sa); } else if ("Intuition".equals(logic)) { if (!multipleCardsToChoose.isEmpty()) { Card choice = multipleCardsToChoose.get(0); diff --git a/forge-gui/res/cardsfolder/m/mazes_end.txt b/forge-gui/res/cardsfolder/m/mazes_end.txt index 609f13ab3ac..2669f52a0ff 100644 --- a/forge-gui/res/cardsfolder/m/mazes_end.txt +++ b/forge-gui/res/cardsfolder/m/mazes_end.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. -A:AB$ ChangeZone | Cost$ 3 T Return<1/CARDNAME> | ChangeType$ Gate | ChangeNum$ 1 | Origin$ Library | Destination$ Battlefield | SubAbility$ DBWin | SpellDescription$ Search your library for a Gate card, put it onto the battlefield, then shuffle your library. If you control ten or more Gates with different names, you win the game. +A:AB$ ChangeZone | Cost$ 3 T Return<1/CARDNAME> | ChangeType$ Gate | ChangeNum$ 1 | Origin$ Library | Destination$ Battlefield | AILogic$ MazesEnd | SubAbility$ DBWin | SpellDescription$ Search your library for a Gate card, put it onto the battlefield, then shuffle your library. If you control ten or more Gates with different names, you win the game. SVar:DBWin:DB$ WinsGame | Defined$ You | ConditionCheckSVar$ MazeGate | ConditionSVarCompare$ GE10 | References$ MazeGate SVar:MazeGate:Count$DifferentCardNames_Gate.YouCtrl+inZoneBattlefield AI:RemoveDeck:Random