diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 01b6d8f5983..4cb497625ad 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -17,28 +17,17 @@ */ package forge.ai; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; - import forge.card.ColorSet; import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardCollectionView; -import forge.game.card.CardFactoryUtil; -import forge.game.card.CardLists; -import forge.game.card.CardPredicates; -import forge.game.card.CounterType; +import forge.game.card.*; import forge.game.cost.CostPart; import forge.game.mana.ManaCostBeingPaid; import forge.game.phase.PhaseHandler; @@ -49,6 +38,10 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Aggregates; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + /** * Special logic for individual cards * @@ -367,7 +360,23 @@ public class SpecialCardAi { return (aiGraveyardPower - aiBattlefieldPower) > (oppGraveyardPower - oppBattlefieldPower); } } - + + // Mairsil, the Pretender + public static class MairsilThePretender { + // Scan the fetch list for a card with at least one activated ability. + // TODO: can be improved to a full consider(sa, ai) logic which would scan the graveyard first and hand last + public static Card considerCardFromList(CardCollection fetchList) { + for (Card c : CardLists.filter(fetchList, Predicates.or(CardPredicates.Presets.ARTIFACTS, CardPredicates.Presets.CREATURES))) { + for (SpellAbility ab : c.getSpellAbilities()) { + if (ab.isAbility() && !ab.isTrigger()) { + return c; + } + } + } + return null; + } + } + // Necropotence public static class Necropotence { public static boolean consider(Player ai, 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 46a88fa2eca..6b8d70e4613 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -1319,6 +1319,8 @@ public class ChangeZoneAi extends SpellAbilityAi { } } else if ("WorstCard".equals(logic)) { return ComputerUtilCard.getWorstAI(fetchList); + } else if ("Mairsil".equals(logic)) { + return SpecialCardAi.MairsilThePretender.considerCardFromList(fetchList); } } if (fetchList.isEmpty()) { diff --git a/forge-gui/res/cardsfolder/upcoming/mairsil_the_pretender.txt b/forge-gui/res/cardsfolder/upcoming/mairsil_the_pretender.txt index 98faef43f5b..82a4abd0507 100644 --- a/forge-gui/res/cardsfolder/upcoming/mairsil_the_pretender.txt +++ b/forge-gui/res/cardsfolder/upcoming/mairsil_the_pretender.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Human Wizard PT:4/4 S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Card.YouOwn+inZoneExile+counters_GE1_CAGE | GainsAbilitiesOfZones$ Exile | GainsAbilitiesLimitPerTurn$ 1 | Description$ CARDNAME has all activated abilities of all cards you own in exile with cage counters on them. You may activate each of these abilities only once each turn. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may exile an artifact or creature card from your hand or graveyard and put a cage counter on it. -SVar:TrigExile:DB$ ChangeZone | Origin$ Hand,Graveyard | Destination$ Exile | ChangeType$ Artifact.YouCtrl,Creature.YouCtrl | SubAbility$ DBCounter | RememberChanged$ True | ChangeNum$ 1 +SVar:TrigExile:DB$ ChangeZone | Origin$ Hand,Graveyard | Destination$ Exile | ChangeType$ Artifact.YouCtrl,Creature.YouCtrl | SubAbility$ DBCounter | RememberChanged$ True | ChangeNum$ 1 | AILogic$ Mairsil SVar:DBCounter:DB$ PutCounter | CounterType$ CAGE | CounterNum$ 1 | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/mairsil_the_pretender.jpg