From 30e4fbdc74481e5a738a0624989e71db6ae2026b Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 7 Jan 2017 17:27:23 +0000 Subject: [PATCH] - Added rudimentary AI logic for Timetwister and promoted it to AI playable. - This completes the project to get the basic AI logic for the remaining Power Nine cards. --- .../src/main/java/forge/ai/SpecialCardAi.java | 25 +++++++++++++++++++ .../forge/ai/ability/ChangeZoneAllAi.java | 5 ++++ forge-gui/res/cardsfolder/t/timetwister.txt | 3 +-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 00a5b2b4e0e..db2e205a98e 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -233,6 +233,31 @@ public class SpecialCardAi { return false; // haven't found anything to play with the excess generated mana } } + + // Timetwister + public static class Timetwister { + public static boolean consider(Player ai, SpellAbility sa) { + final int aiHandSize = ai.getCardsIn(ZoneType.Hand).size(); + int maxOppHandSize = 0; + + final int HAND_SIZE_THRESHOLD = 3; + + for (Player p : ai.getOpponents()) { + int handSize = p.getCardsIn(ZoneType.Hand).size(); + if (handSize > maxOppHandSize) { + maxOppHandSize = handSize; + } + } + + if (aiHandSize < HAND_SIZE_THRESHOLD || maxOppHandSize - aiHandSize > HAND_SIZE_THRESHOLD) { + // use in case we're getting low on cards or if we're significantly behind our opponent in cards in hand + return true; + } + + return false; + } + } + // Yawgmoth's Bargain public static class YawgmothsBargain { public static boolean consider(Player ai, SpellAbility sa) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java index e5cf5bbed61..cf4c0519253 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java @@ -11,6 +11,7 @@ import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilCombat; import forge.ai.ComputerUtilCost; +import forge.ai.SpecialCardAi; import forge.ai.SpellAbilityAi; import forge.game.Game; import forge.game.ability.AbilityUtils; @@ -70,6 +71,10 @@ public class ChangeZoneAllAi extends SpellAbilityAi { CardCollectionView computerType = ai.getCardsIn(origin); computerType = AbilityUtils.filterListByType(computerType, sa.getParam("ChangeType"), sa); + if (source.getName().equals("Timetwister")) { + return SpecialCardAi.Timetwister.consider(ai, sa); + } + // Ugin AI: always try to sweep before considering +1 if (source.getName().equals("Ugin, the Spirit Dragon")) { final int loyalty = source.getCounters(CounterType.LOYALTY); diff --git a/forge-gui/res/cardsfolder/t/timetwister.txt b/forge-gui/res/cardsfolder/t/timetwister.txt index b685c82164b..c1cd7c14c9c 100644 --- a/forge-gui/res/cardsfolder/t/timetwister.txt +++ b/forge-gui/res/cardsfolder/t/timetwister.txt @@ -1,8 +1,7 @@ Name:Timetwister ManaCost:2 U Types:Sorcery -A:SP$ ChangeZoneAll | Cost$ 2 U | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | SpellDescription$ Each player shuffles his or her graveyard and hand into his or her library, then draws seven cards. +A:SP$ ChangeZoneAll | Cost$ 2 U | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | AILogic$ TimeTwister | SpellDescription$ Each player shuffles his or her graveyard and hand into his or her library, then draws seven cards. SVar:DBDraw:DB$ Draw | NumCards$ 7 | Defined$ Player -SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/timetwister.jpg Oracle:Each player shuffles his or her hand and graveyard into his or her library, then draws seven cards. (Then put Timetwister into its owner's graveyard.)