From ae4e7c252ac867c499a072c59493a7484daf1ae2 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 28 Jan 2017 14:11:22 +0000 Subject: [PATCH] - More precise ChangeTargetsEffect replacement deduction for the purpose of DividedAsYouChoose --- .../ability/effects/ChangeTargetsEffect.java | 6 +-- .../SpellAbilityStackInstance.java | 37 ++++++++++++++----- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java index 8c340cc626b..f019ef12ee5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java @@ -82,7 +82,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect { GameObject newTarget = Iterables.getFirst(getDefinedCardsOrTargeted(sa), null); if (replaceIn.getSpellAbility(true).canTarget(newTarget)) { newTargetBlock.add(newTarget); - replaceIn.updateTarget(newTargetBlock); + replaceIn.updateTarget(newTargetBlock, oldTarget, newTarget); } else { replaceIn.updateTarget(oldTargetBlock); @@ -97,7 +97,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect { List candidates = changingTgtSA.getTargetRestrictions().getAllCandidates(changingTgtSA, true); GameEntity choice = Aggregates.random(candidates); changingTgtSA.getTargets().add(choice); - changingTgtSI.updateTarget(changingTgtSA.getTargets()); + changingTgtSI.updateTarget(changingTgtSA.getTargets(), null, choice); } } else if (sa.hasParam("DefinedMagnet")){ @@ -105,7 +105,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect { if (newTarget != null && changingTgtSA.canTarget(newTarget)) { changingTgtSA.resetTargets(); changingTgtSA.getTargets().add(newTarget); - changingTgtSI.updateTarget(changingTgtSA.getTargets()); + changingTgtSI.updateTarget(changingTgtSA.getTargets(), null, newTarget); } } else { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index d85be098e0e..b26c764888e 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -32,6 +32,7 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import forge.game.GameObject; import java.util.ArrayList; import java.util.HashMap; @@ -285,6 +286,10 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { } public void updateTarget(TargetChoices target) { + updateTarget(target, null, null); + } + + public void updateTarget(TargetChoices target, GameObject oldTarget, GameObject newTarget) { if (target != null) { tc = target; ability.setTargets(tc); @@ -298,18 +303,30 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView { Object toRemove = null; Object toAdd = null; HashMap map = ability.getTargetRestrictions().getDividedMap(); - // detect which target has changed - for (Object obj : map.keySet()) { - if (!target.getTargets().contains(obj)) { - toRemove = obj; - break; + + if (oldTarget != null) { + toRemove = oldTarget; + } else { + // try to deduce which target has been replaced + // (this may be imprecise, updateTarget should specify old target if possible) + for (Object obj : map.keySet()) { + if (!target.getTargets().contains((GameObject)obj)) { + toRemove = obj; + break; + } } } - // detect a new target - for (Object newTgts : target.getTargets()) { - if (!map.containsKey(newTgts)) { - toAdd = newTgts; - break; + + if (newTarget != null) { + toAdd = newTarget; + } else { + // try to deduce which target was added + // (this may be imprecise, updateTarget should specify new target if possible) + for (Object newTgts : target.getTargets()) { + if (!map.containsKey(newTgts)) { + toAdd = newTgts; + break; + } } }