diff --git a/res/cardsfolder/m/mass_mutiny.txt b/res/cardsfolder/m/mass_mutiny.txt index 3ca8925f3a6..8a204e33e2e 100644 --- a/res/cardsfolder/m/mass_mutiny.txt +++ b/res/cardsfolder/m/mass_mutiny.txt @@ -2,7 +2,8 @@ Name:Mass Mutiny ManaCost:3 R R Types:Sorcery Text:no text -A:SP$ GainControl | Cost$ 3 R R | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature opponent controls. | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ For each opponent, gain control of up to one target creature that player controls until end of turn. Untap those creatures. They gain haste until end of turn. +A:SP$ GainControl | Cost$ 3 R R | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls to gain control of. | TargetMin$ 0 | TargetMax$ OneEach | References$ OneEach | TargetsWithDifferentControllers$ True | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ For each opponent, gain control of up to one target creature that player controls until end of turn. Untap those creatures. They gain haste until end of turn. +SVar:OneEach:PlayerCountOpponents$Amount SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/mass_mutiny.jpg SetInfo:PC2|Rare|http://magiccards.info/scans/en/pc2/48.jpg diff --git a/src/main/java/forge/CardLists.java b/src/main/java/forge/CardLists.java index b6cb635aea8..2d4b3eace17 100644 --- a/src/main/java/forge/CardLists.java +++ b/src/main/java/forge/CardLists.java @@ -275,6 +275,9 @@ public class CardLists { return CardLists.filter(cardList, CardPredicates.isController(player)); } + public static List filterControlledBy(Iterable cardList, List player) { + return CardLists.filter(cardList, CardPredicates.hasListController(player)); + } public static List getValidCards(Iterable cardList, String[] restrictions, Player sourceController, Card source) { return CardLists.filter(cardList, CardPredicates.restriction(restrictions, sourceController, source)); diff --git a/src/main/java/forge/CardPredicates.java b/src/main/java/forge/CardPredicates.java index 837bc084247..0a2d27c0ac7 100644 --- a/src/main/java/forge/CardPredicates.java +++ b/src/main/java/forge/CardPredicates.java @@ -17,6 +17,8 @@ */ package forge; +import java.util.List; + import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; @@ -47,6 +49,14 @@ public final class CardPredicates { } }; } + public static final Predicate hasListController(final List pList) { + return new Predicate() { + @Override + public boolean apply(final Card c) { + return pList.contains((Player) c.getController()); + } + }; + } public static final Predicate isOwner(final Player p) { return new Predicate() { @Override diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactory.java b/src/main/java/forge/card/abilityfactory/AbilityFactory.java index 664b4c9678d..ceb8bdc2fff 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactory.java @@ -212,6 +212,9 @@ public class AbilityFactory { if (mapParams.containsKey("TargetsWithDefinedController")) { abTgt.setDefinedController(mapParams.get("TargetsWithDefinedController")); } + if (mapParams.containsKey("TargetsWithDifferentControllers")) { + abTgt.setDifferentControllers(true); + } } // *********************************** diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 56a5377f01e..f372b629e84 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -1795,8 +1795,7 @@ public class CardFactoryUtil { return CardFactoryUtil.doXMath(n, m, source); } - // count valid cards in any specified zone/s - System.out.println("Passed string: " + s); + // count valid cards in any specified zone/s if (l[0].startsWith("Valid") && !l[0].contains("Valid ")) { String[] lparts = l[0].split(" ", 2); final List vZone = ZoneType.listValueOf(lparts[0].split("Valid")[1]); diff --git a/src/main/java/forge/card/spellability/Target.java b/src/main/java/forge/card/spellability/Target.java index c0afa57f919..265af2ebd75 100644 --- a/src/main/java/forge/card/spellability/Target.java +++ b/src/main/java/forge/card/spellability/Target.java @@ -45,6 +45,7 @@ public class Target { private boolean uniqueTargets = false; private boolean singleZone = false; private boolean differentZone = false; + private boolean differentControllers = false; private boolean withoutSameCreatureType = false; private String definedController = null; private TargetChoices choice = null; @@ -811,6 +812,20 @@ public class Target { this.differentZone = different; } + /** + * @return the differentControllers + */ + public boolean isDifferentControllers() { + return differentControllers; + } + + /** + * @param different the differentControllers to set + */ + public void setDifferentControllers(boolean different) { + this.differentControllers = different; + } + /** * @return the definedController */ diff --git a/src/main/java/forge/card/spellability/TargetSelection.java b/src/main/java/forge/card/spellability/TargetSelection.java index 17ec95f1306..4d0c0edeee7 100644 --- a/src/main/java/forge/card/spellability/TargetSelection.java +++ b/src/main/java/forge/card/spellability/TargetSelection.java @@ -295,6 +295,14 @@ public class TargetSelection { if (tgt.isDifferentZone() && !targeted.isEmpty()) { choices = CardLists.filterControlledBy(choices, targeted.get(0).getController().getOpponent()); } + // If all cards must have different controllers + if (tgt.isDifferentControllers() && !targeted.isEmpty()) { + final List availableControllers = new ArrayList(Singletons.getModel().getGame().getPlayers()); + for (int i = 0; i < targeted.size(); i++) { + availableControllers.remove(targeted.get(i).getController()); + } + choices = CardLists.filterControlledBy(choices, availableControllers); + } // If the cards can't share a creature type if (tgt.isWithoutSameCreatureType() && !targeted.isEmpty()) { final Card card = targeted.get(0);