diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java index 613ac42186d..8c8b4584068 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java @@ -9,6 +9,7 @@ import forge.game.card.Card; import forge.game.card.CardFactory; import forge.game.card.CardLists; import forge.game.player.Player; +import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.util.Lang; @@ -106,6 +107,11 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { for (GameEntity o : candidates) { SpellAbility copy = CardFactory.copySpellAbilityAndSrcCard(card, chosenSA.getHostCard(), chosenSA, true); copy.resetFirstTarget(o, targetedSA); + AbilitySub subAb = copy.getSubAbility(); + while (subAb != null) { + subAb.resetFirstTarget(o, targetedSA); + subAb = subAb.getSubAbility(); + } copies.add(copy); } } else {// Precursor Golem, Ink-Treader Nephilim @@ -123,6 +129,11 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { for (Card c : valid) { SpellAbility copy = CardFactory.copySpellAbilityAndSrcCard(card, chosenSA.getHostCard(), chosenSA, true); copy.resetFirstTarget(c, targetedSA); + AbilitySub subAb = copy.getSubAbility(); + while (subAb != null) { + subAb.resetFirstTarget(c, targetedSA); + subAb = subAb.getSubAbility(); + } copies.add(copy); } } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index c23a26244f2..155204db4b0 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1115,15 +1115,15 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } if (tgt.isSingleTarget()) { - int totalTargets = 0; - for(TargetChoices tc : topSA.getAllTargetChoices()) { - totalTargets += tc.getNumTargeted(); - if (totalTargets > 1) { + Set targets = new HashSet<>(); + for (TargetChoices tc : topSA.getAllTargetChoices()) { + targets.addAll(tc.getTargets()); + if (targets.size() > 1) { // As soon as we get more than one, bail out return false; } } - if (totalTargets != 1) { + if (targets.size() != 1) { // Make sure that there actually is one target return false; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index 323feca6228..14ed36c367c 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -36,6 +36,8 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Iterables; import java.util.ArrayList; +import java.util.Set; +import java.util.HashSet; import java.util.List; import java.util.Map; @@ -385,8 +387,19 @@ public class SpellAbilityCondition extends SpellAbilityVariables { if (this.targetsSingleTarget()) { final TargetChoices matchTgt = sa.getTargets(); if (matchTgt == null || matchTgt.getFirstTargetedSpell() == null - || matchTgt.getFirstTargetedSpell().getTargets() == null - || matchTgt.getFirstTargetedSpell().getTargets().getNumTargeted() != 1) { + || matchTgt.getFirstTargetedSpell().getTargets() == null) { + return false; + + } + + Set targets = new HashSet<>(); + for (TargetChoices tc : sa.getAllTargetChoices()) { + targets.addAll(tc.getTargets()); + if (targets.size() > 1) { + return false; + } + } + if (targets.size() != 1) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java index afd5f0276fd..d041bdc9bb3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java @@ -20,6 +20,8 @@ package forge.game.trigger; import java.util.List; import forge.game.Game; +import forge.game.GameObject; +import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.card.CardUtil; @@ -31,6 +33,8 @@ import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.TargetChoices; import forge.game.zone.ZoneType; import forge.util.Expressions; +import java.util.HashSet; +import java.util.Set; /** *

@@ -68,7 +72,7 @@ public class TriggerSpellAbilityCast extends Trigger { } final Card cast = spellAbility.getHostCard(); final Game game = cast.getGame(); - final SpellAbilityStackInstance si = game.getStack().getInstanceFromSpellAbility(spellAbility); + SpellAbilityStackInstance si = game.getStack().getInstanceFromSpellAbility(spellAbility); if (this.getMode() == TriggerType.SpellCast) { if (!spellAbility.isSpell()) { @@ -174,11 +178,14 @@ public class TriggerSpellAbilityCast extends Trigger { } if (this.mapParams.containsKey("IsSingleTarget")) { - int numTargeted = 0; + Set targets = new HashSet<>(); for (TargetChoices tc : spellAbility.getAllTargetChoices()) { - numTargeted += tc.getNumTargeted(); + targets.addAll(tc.getTargets()); + if (targets.size() > 1) { + return false; + } } - if (numTargeted != 1) { + if (targets.size() != 1) { return false; } }