mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
- More precise ChangeTargetsEffect replacement deduction for the purpose of DividedAsYouChoose
This commit is contained in:
@@ -82,7 +82,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
|
|||||||
GameObject newTarget = Iterables.getFirst(getDefinedCardsOrTargeted(sa), null);
|
GameObject newTarget = Iterables.getFirst(getDefinedCardsOrTargeted(sa), null);
|
||||||
if (replaceIn.getSpellAbility(true).canTarget(newTarget)) {
|
if (replaceIn.getSpellAbility(true).canTarget(newTarget)) {
|
||||||
newTargetBlock.add(newTarget);
|
newTargetBlock.add(newTarget);
|
||||||
replaceIn.updateTarget(newTargetBlock);
|
replaceIn.updateTarget(newTargetBlock, oldTarget, newTarget);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
replaceIn.updateTarget(oldTargetBlock);
|
replaceIn.updateTarget(oldTargetBlock);
|
||||||
@@ -97,7 +97,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
|
|||||||
List<GameEntity> candidates = changingTgtSA.getTargetRestrictions().getAllCandidates(changingTgtSA, true);
|
List<GameEntity> candidates = changingTgtSA.getTargetRestrictions().getAllCandidates(changingTgtSA, true);
|
||||||
GameEntity choice = Aggregates.random(candidates);
|
GameEntity choice = Aggregates.random(candidates);
|
||||||
changingTgtSA.getTargets().add(choice);
|
changingTgtSA.getTargets().add(choice);
|
||||||
changingTgtSI.updateTarget(changingTgtSA.getTargets());
|
changingTgtSI.updateTarget(changingTgtSA.getTargets(), null, choice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (sa.hasParam("DefinedMagnet")){
|
else if (sa.hasParam("DefinedMagnet")){
|
||||||
@@ -105,7 +105,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
|
|||||||
if (newTarget != null && changingTgtSA.canTarget(newTarget)) {
|
if (newTarget != null && changingTgtSA.canTarget(newTarget)) {
|
||||||
changingTgtSA.resetTargets();
|
changingTgtSA.resetTargets();
|
||||||
changingTgtSA.getTargets().add(newTarget);
|
changingTgtSA.getTargets().add(newTarget);
|
||||||
changingTgtSI.updateTarget(changingTgtSA.getTargets());
|
changingTgtSI.updateTarget(changingTgtSA.getTargets(), null, newTarget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
import forge.game.GameObject;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -285,6 +286,10 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void updateTarget(TargetChoices target) {
|
public void updateTarget(TargetChoices target) {
|
||||||
|
updateTarget(target, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateTarget(TargetChoices target, GameObject oldTarget, GameObject newTarget) {
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
tc = target;
|
tc = target;
|
||||||
ability.setTargets(tc);
|
ability.setTargets(tc);
|
||||||
@@ -298,18 +303,30 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView {
|
|||||||
Object toRemove = null;
|
Object toRemove = null;
|
||||||
Object toAdd = null;
|
Object toAdd = null;
|
||||||
HashMap<Object,Integer> map = ability.getTargetRestrictions().getDividedMap();
|
HashMap<Object,Integer> map = ability.getTargetRestrictions().getDividedMap();
|
||||||
// detect which target has changed
|
|
||||||
for (Object obj : map.keySet()) {
|
if (oldTarget != null) {
|
||||||
if (!target.getTargets().contains(obj)) {
|
toRemove = oldTarget;
|
||||||
toRemove = obj;
|
} else {
|
||||||
break;
|
// 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 (newTarget != null) {
|
||||||
if (!map.containsKey(newTgts)) {
|
toAdd = newTarget;
|
||||||
toAdd = newTgts;
|
} else {
|
||||||
break;
|
// 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user