mirror of
https://github.com/correl/mage.git
synced 2025-03-07 20:53:18 -10:00
Only fire one Targetted event per target
This specifically addresses changing the target of a spell or ability on the stack. Fixes https://github.com/magefree/mage/issues/6158
This commit is contained in:
parent
a8d8f4e621
commit
b6af571779
4 changed files with 22 additions and 50 deletions
|
@ -78,7 +78,7 @@ public class CopySpellTest extends CardTestPlayerBase {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void BonecrusherGiantChangeTargetsTo() {
|
||||
public void BonecrusherGiantChangeTargets() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Bonecrusher Giant");
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Grizzly Bears");
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Savannah Lions");
|
||||
|
@ -100,45 +100,6 @@ public class CopySpellTest extends CardTestPlayerBase {
|
|||
assertLife(playerA, 18);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void BonecrusherGiantChangeTargetsFrom() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Bonecrusher Giant");
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Grizzly Bears");
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Savannah Lions");
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Plains");
|
||||
addCard(Zone.HAND, playerA, "Barkshell Blessing");
|
||||
|
||||
castSpell(1, PhaseStep.UPKEEP, playerA, "Barkshell Blessing");
|
||||
setChoice(playerA, "Yes");
|
||||
setChoice(playerA, "Yes");
|
||||
addTarget(playerA, "Bonecrusher Giant");
|
||||
addTarget(playerA, "Grizzly Bears");
|
||||
|
||||
setStopAt(1, PhaseStep.PRECOMBAT_MAIN);
|
||||
execute();
|
||||
|
||||
assertPowerToughness(playerA, "Bonecrusher Giant", 6, 5);
|
||||
assertPowerToughness(playerA, "Grizzly Bears", 4, 4);
|
||||
assertPowerToughness(playerA, "Savannah Lions", 2, 1);
|
||||
assertLife(playerA, 18);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void BonecrusherGiantControl() {
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Bonecrusher Giant");
|
||||
addCard(Zone.BATTLEFIELD, playerA, "Plains");
|
||||
addCard(Zone.HAND, playerA, "Barkshell Blessing");
|
||||
|
||||
castSpell(1, PhaseStep.UPKEEP, playerA, "Barkshell Blessing");
|
||||
addTarget(playerA, "Bonecrusher Giant");
|
||||
|
||||
setStopAt(1, PhaseStep.PRECOMBAT_MAIN);
|
||||
execute();
|
||||
|
||||
assertPowerToughness(playerA, "Bonecrusher Giant", 6, 5);
|
||||
assertLife(playerA, 18);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reported bug: "Silverfur Partisan and fellow wolves did not trigger off
|
||||
* of copies of Strength of Arms made by Zada, Hedron Grinder. Not sure
|
||||
|
|
|
@ -151,6 +151,7 @@ public abstract class StackObjImpl implements StackObject {
|
|||
*/
|
||||
private Target chooseNewTarget(Player targetController, Ability ability, Mode mode, Target target, boolean forceChange, FilterPermanent filterNewTarget, Game game) {
|
||||
Target newTarget = target.copy();
|
||||
newTarget.setEventReporting(false);
|
||||
if (!targetController.getId().equals(getControllerId())) {
|
||||
newTarget.setTargetController(targetController.getId()); // target controller for the change is different from spell controller
|
||||
newTarget.setAbilityController(getControllerId());
|
||||
|
@ -199,6 +200,7 @@ public abstract class StackObjImpl implements StackObject {
|
|||
} else {
|
||||
// build a target definition with exactly one possible target to select that replaces old target
|
||||
Target tempTarget = target.copy();
|
||||
tempTarget.setEventReporting(false);
|
||||
if (target instanceof TargetAmount) {
|
||||
((TargetAmount) tempTarget).setAmountDefinition(StaticValue.get(target.getTargetAmount(targetId)));
|
||||
}
|
||||
|
@ -215,7 +217,7 @@ public abstract class StackObjImpl implements StackObject {
|
|||
if (!tempTarget.chooseTarget(outcome, getControllerId(), ability, game)) {
|
||||
if (targetController.chooseUse(Outcome.Benefit, "No target object selected. Reset to original target?", ability, game)) {
|
||||
// use previous target no target was selected
|
||||
newTarget.addTarget(targetId, target.getTargetAmount(targetId), ability, game, false);
|
||||
newTarget.addTarget(targetId, target.getTargetAmount(targetId), ability, game, true);
|
||||
} else {
|
||||
again = true;
|
||||
}
|
||||
|
@ -225,12 +227,12 @@ public abstract class StackObjImpl implements StackObject {
|
|||
if (targetController.isHuman()) {
|
||||
if (targetController.chooseUse(Outcome.Benefit, "This target was already selected from origin spell. Reset to original target?", ability, game)) {
|
||||
// use previous target no target was selected
|
||||
newTarget.addTarget(targetId, target.getTargetAmount(targetId), ability, game, false);
|
||||
newTarget.addTarget(targetId, target.getTargetAmount(targetId), ability, game, true);
|
||||
} else {
|
||||
again = true;
|
||||
}
|
||||
} else {
|
||||
newTarget.addTarget(targetId, target.getTargetAmount(targetId), ability, game, false);
|
||||
newTarget.addTarget(targetId, target.getTargetAmount(targetId), ability, game, true);
|
||||
}
|
||||
} else if (!target.canTarget(getControllerId(), tempTarget.getFirstTarget(), ability, game)) {
|
||||
if (targetController.isHuman()) {
|
||||
|
@ -238,7 +240,7 @@ public abstract class StackObjImpl implements StackObject {
|
|||
again = true;
|
||||
} else {
|
||||
// keep the old
|
||||
newTarget.addTarget(targetId, target.getTargetAmount(targetId), ability, game, false);
|
||||
newTarget.addTarget(targetId, target.getTargetAmount(targetId), ability, game, true);
|
||||
}
|
||||
} else if (newTarget.getFirstTarget() != null && filterNewTarget != null) {
|
||||
Permanent newTargetPermanent = game.getPermanent(newTarget.getFirstTarget());
|
||||
|
@ -248,14 +250,14 @@ public abstract class StackObjImpl implements StackObject {
|
|||
}
|
||||
} else {
|
||||
// valid target was selected, add it to the new target definition
|
||||
newTarget.addTarget(tempTarget.getFirstTarget(), target.getTargetAmount(targetId), ability, game, false);
|
||||
newTarget.addTarget(tempTarget.getFirstTarget(), target.getTargetAmount(targetId), ability, game, true);
|
||||
}
|
||||
}
|
||||
} while (again && targetController.canRespond());
|
||||
}
|
||||
} // keep the target
|
||||
else {
|
||||
newTarget.addTarget(targetId, target.getTargetAmount(targetId), ability, game, false);
|
||||
newTarget.addTarget(targetId, target.getTargetAmount(targetId), ability, game, true);
|
||||
}
|
||||
}
|
||||
return newTarget;
|
||||
|
|
|
@ -136,4 +136,6 @@ public interface Target extends Serializable {
|
|||
void setTargetAmount(UUID targetId, int amount, Game game);
|
||||
|
||||
Target withChooseHint(String chooseHint);
|
||||
|
||||
void setEventReporting(boolean shouldReport);
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ public abstract class TargetImpl implements Target {
|
|||
|
||||
protected int targetTag; // can be set if other target check is needed (AnotherTargetPredicate)
|
||||
protected String chooseHint = null; // UI choose hints after target name
|
||||
protected boolean shouldReportEvents = true;
|
||||
|
||||
@Override
|
||||
public abstract TargetImpl copy();
|
||||
|
@ -65,6 +66,7 @@ public abstract class TargetImpl implements Target {
|
|||
this.abilityController = target.abilityController;
|
||||
this.targetTag = target.targetTag;
|
||||
this.chooseHint = target.chooseHint;
|
||||
this.shouldReportEvents = target.shouldReportEvents;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -213,12 +215,12 @@ public abstract class TargetImpl implements Target {
|
|||
//20100423 - 113.3
|
||||
if (getMaxNumberOfTargets() == 0 || targets.size() < getMaxNumberOfTargets()) {
|
||||
if (!targets.containsKey(id)) {
|
||||
if (source != null && !skipEvent) {
|
||||
if (source != null && !skipEvent && shouldReportEvents) {
|
||||
if (!game.replaceEvent(GameEvent.getEvent(EventType.TARGET, id, source.getSourceId(), source.getControllerId()))) {
|
||||
targets.put(id, 0);
|
||||
rememberZoneChangeCounter(id, game);
|
||||
chosen = targets.size() >= getNumberOfTargets();
|
||||
if (!skipEvent) {
|
||||
if (!skipEvent && shouldReportEvents) {
|
||||
game.addSimultaneousEvent(GameEvent.getEvent(EventType.TARGETED, id, source.getSourceId(), source.getControllerId()));
|
||||
}
|
||||
}
|
||||
|
@ -251,12 +253,12 @@ public abstract class TargetImpl implements Target {
|
|||
if (targets.containsKey(id)) {
|
||||
amount += targets.get(id);
|
||||
}
|
||||
if (source != null && !skipEvent) {
|
||||
if (source != null && !skipEvent && shouldReportEvents) {
|
||||
if (!game.replaceEvent(GameEvent.getEvent(EventType.TARGET, id, source.getSourceId(), source.getControllerId()))) {
|
||||
targets.put(id, amount);
|
||||
rememberZoneChangeCounter(id, game);
|
||||
chosen = targets.size() >= getNumberOfTargets();
|
||||
if (!skipEvent) {
|
||||
if (!skipEvent && shouldReportEvents) {
|
||||
game.fireEvent(GameEvent.getEvent(EventType.TARGETED, id, source.getSourceId(), source.getControllerId()));
|
||||
}
|
||||
}
|
||||
|
@ -551,4 +553,9 @@ public abstract class TargetImpl implements Target {
|
|||
this.chooseHint = chooseHint;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEventReporting(boolean shouldReport) {
|
||||
this.shouldReportEvents = shouldReport;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue