From 41fb3d14cbb55fa1fa2d8277bc9fac7ea0837764 Mon Sep 17 00:00:00 2001 From: "Alex W. Jackson" Date: Tue, 20 Sep 2022 21:05:01 -0400 Subject: [PATCH] Fix #8484 and fix #9541 (#9542) --- .../main/java/mage/abilities/AbilityImpl.java | 20 +++++------------- .../java/mage/abilities/SpellAbility.java | 18 ++++++++++++++++ .../mage/abilities/keyword/SpliceAbility.java | 21 +++++-------------- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/AbilityImpl.java b/Mage/src/main/java/mage/abilities/AbilityImpl.java index bfc5fe7434..04df2b976a 100644 --- a/Mage/src/main/java/mage/abilities/AbilityImpl.java +++ b/Mage/src/main/java/mage/abilities/AbilityImpl.java @@ -947,22 +947,12 @@ public abstract class AbilityImpl implements Ability { @Override public boolean canChooseTarget(Game game, UUID playerId) { - if (this instanceof SpellAbility) { - if (SpellAbilityType.SPLIT_FUSED.equals(((SpellAbility) this).getSpellAbilityType())) { - Card card = game.getCard(getSourceId()); - if (card != null) { - return canChooseTargetAbility(((SplitCard) card).getLeftHalfCard().getSpellAbility(), game, playerId) - && canChooseTargetAbility(((SplitCard) card).getRightHalfCard().getSpellAbility(), game, playerId); - } - return false; - } - } - return canChooseTargetAbility(this, game, playerId); + return canChooseTargetAbility(this, getModes(), game, playerId); } - private static boolean canChooseTargetAbility(Ability ability, Game game, UUID controllerId) { + protected static boolean canChooseTargetAbility(Ability ability, Modes modes, Game game, UUID controllerId) { int found = 0; - for (Mode mode : ability.getModes().values()) { + for (Mode mode : modes.values()) { boolean validTargets = true; for (Target target : mode.getTargets()) { UUID abilityControllerId = controllerId; @@ -977,10 +967,10 @@ public abstract class AbilityImpl implements Ability { if (validTargets) { found++; - if (ability.getModes().isEachModeMoreThanOnce()) { + if (modes.isEachModeMoreThanOnce()) { return true; } - if (found >= ability.getModes().getMinModes()) { + if (found >= modes.getMinModes()) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/SpellAbility.java b/Mage/src/main/java/mage/abilities/SpellAbility.java index 96c18cc532..52a238abfb 100644 --- a/Mage/src/main/java/mage/abilities/SpellAbility.java +++ b/Mage/src/main/java/mage/abilities/SpellAbility.java @@ -55,6 +55,24 @@ public class SpellAbility extends ActivatedAbilityImpl { this.cardName = ability.cardName; } + @Override + public boolean canChooseTarget(Game game, UUID playerId) { + if (SpellAbilityType.SPLIT_FUSED.equals(getSpellAbilityType())) { + Card card = game.getCard(getSourceId()); + if (card == null) { + return false; + } + SpellAbility left = ((SplitCard) card).getLeftHalfCard().getSpellAbility(); + SpellAbility right = ((SplitCard) card).getRightHalfCard().getSpellAbility(); + return canChooseTargetAbility(left, left.getModes(), game, playerId) && canChooseTargetAbility(right, right.getModes(), game, playerId); + } + return super.canChooseTarget(game, playerId); + } + + public boolean canSpliceOnto(Ability abilityToModify, Game game) { + return canChooseTargetAbility(abilityToModify, getModes(), game, abilityToModify.getControllerId()); + } + /* * 7/5/19 - jgray1206 - Moved null != game.getContinuesEffects()... into this method instead of having it in * canActivate. There are abilities that directly use this method that should know when spells diff --git a/Mage/src/main/java/mage/abilities/keyword/SpliceAbility.java b/Mage/src/main/java/mage/abilities/keyword/SpliceAbility.java index 4cf224c77d..ee43ffcd4b 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SpliceAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SpliceAbility.java @@ -1,7 +1,6 @@ package mage.abilities.keyword; import java.util.Iterator; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.common.SimpleStaticAbility; @@ -188,23 +187,13 @@ class SpliceCardEffectImpl extends ContinuousEffectImpl implements SpliceCardEff @Override public boolean applies(Ability abilityToModify, Ability source, Game game) { - MageObject object = game.getObject(abilityToModify.getSourceId()); - if (object != null && filter.match(object, game)) { - return spliceSpellCanBeActivated(source, game); + if (!filter.match(game.getObject(abilityToModify.getSourceId()), game)) { + return false; } - return false; - } - - private boolean spliceSpellCanBeActivated(Ability source, Game game) { - // check if spell can be activated (protection problem not solved because effect will be used from the base spell?) Card card = game.getCard(source.getSourceId()); - if (card != null) { - if (card.getManaCost().isEmpty()) { // e.g. Evermind - return card.getSpellAbility().spellCanBeActivatedRegularlyNow(source.getControllerId(), game); - } else { - return card.getSpellAbility().canActivate(source.getControllerId(), game).canActivate(); - } + if (card == null) { + return false; } - return false; + return card.getSpellAbility().canSpliceOnto(abilityToModify, game); } }