diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 21e10ee577e..f697eedb083 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -662,7 +662,8 @@ public class AiController { if (sa instanceof SpellPermanent) { return canPlayFromEffectAI((SpellPermanent)sa, false, true); } - if (sa.usesTargeting()) { + if (sa.usesTargeting() + && sa.getTargets().getNumTargeted() < sa.getTargetRestrictions().getMinTargets(sa.getHostCard(), sa)) { if (!sa.getTargetRestrictions().hasCandidates(sa, true)) { return AiPlayDecision.TargetingFailed; } diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 2a8748678e4..a8a76f42294 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -1109,6 +1109,23 @@ public class SpecialCardAi { } } + // The Scarab God + public static class TheScarabGod { + public static boolean consider(final Player ai, final SpellAbility sa) { + Card bestOppCreat = ComputerUtilCard.getBestAI(CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES)); + Card worstOwnCreat = ComputerUtilCard.getWorstAI(CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), CardPredicates.Presets.CREATURES)); + + sa.resetTargets(); + if (bestOppCreat != null) { + sa.getTargets().add(bestOppCreat); + } else if (worstOwnCreat != null) { + sa.getTargets().add(worstOwnCreat); + } + + return sa.getTargets().getNumTargeted() > 0; + } + } + // Timetwister public static class Timetwister { public static boolean consider(final Player ai, final SpellAbility sa) { 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 9b54724b59d..2eb6f30a6f2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -94,6 +94,8 @@ public class ChangeZoneAi extends SpellAbilityAi { return this.doSameNameLogic(aiPlayer, sa); } else if (aiLogic.equals("ReanimateAll")) { return SpecialCardAi.LivingDeath.consider(aiPlayer, sa); + } else if (aiLogic.equals("TheScarabGod")) { + return SpecialCardAi.TheScarabGod.consider(aiPlayer, sa); } else if (aiLogic.equals("Intuition")) { // This logic only fills the multiple cards array, the decision to play is made // separately in hiddenOriginCanPlayAI later. diff --git a/forge-gui/res/cardsfolder/t/the_scarab_god.txt b/forge-gui/res/cardsfolder/t/the_scarab_god.txt index ab631c68455..a5e8b917b74 100644 --- a/forge-gui/res/cardsfolder/t/the_scarab_god.txt +++ b/forge-gui/res/cardsfolder/t/the_scarab_god.txt @@ -5,7 +5,7 @@ PT:5/5 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ At the beginning of your upkeep, each opponent loses X life and you scry X, where X is the number of Zombies you control. SVar:TrigDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ X | References$ X | SubAbility$ DBScry SVar:DBScry:DB$Scry | ScryNum$ X | References$ X -A:AB$ ChangeZone | Cost$ 2 U B | RememberLKI$ True | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | ChangeNum$ 1 | SubAbility$ DBCopy | SpellDescription$ Exile target creature card from a graveyard. Create a token that's a copy of it, except it's a 4/4 black Zombie. +A:AB$ ChangeZone | Cost$ 2 U B | RememberLKI$ True | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | ChangeNum$ 1 | SubAbility$ DBCopy | AILogic$ TheScarabGod | SpellDescription$ Exile target creature card from a graveyard. Create a token that's a copy of it, except it's a 4/4 black Zombie. SVar:DBCopy:DB$ CopyPermanent | Defined$ Remembered | SetPower$ 4 | SetToughness$ 4 | SetColor$ Black | SetCreatureTypes$ Zombie | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | TriggerController$ TriggeredCardController | Execute$ TrigDelay | TriggerDescription$ When CARDNAME dies, return it to its owner's hand at the beginning of the next end step.