mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 11:18:01 +00:00
Revert change that prevented a spell moving on the stack until after prerequisites were met
This commit is contained in:
@@ -18,6 +18,7 @@
|
|||||||
package forge.game.spellability;
|
package forge.game.spellability;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
@@ -31,6 +32,7 @@ import forge.game.cost.CostPartMana;
|
|||||||
import forge.game.cost.CostPayment;
|
import forge.game.cost.CostPayment;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.player.PlayerController;
|
import forge.game.player.PlayerController;
|
||||||
|
import forge.game.zone.Zone;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@@ -52,6 +54,17 @@ public class HumanPlaySpellAbility {
|
|||||||
public final void playAbility(boolean mayChooseTargets, boolean isFree, boolean skipStack) {
|
public final void playAbility(boolean mayChooseTargets, boolean isFree, boolean skipStack) {
|
||||||
final Game game = ability.getActivatingPlayer().getGame();
|
final Game game = ability.getActivatingPlayer().getGame();
|
||||||
|
|
||||||
|
// used to rollback
|
||||||
|
Zone fromZone = null;
|
||||||
|
int zonePosition = 0;
|
||||||
|
|
||||||
|
final Card c = this.ability.getSourceCard();
|
||||||
|
if (this.ability instanceof Spell && !c.isCopiedSpell()) {
|
||||||
|
fromZone = game.getZoneOf(c);
|
||||||
|
zonePosition = fromZone.getCards().indexOf(c);
|
||||||
|
this.ability.setSourceCard(game.getAction().moveToStack(c));
|
||||||
|
}
|
||||||
|
|
||||||
// freeze Stack. No abilities should go onto the stack while I'm filling requirements.
|
// freeze Stack. No abilities should go onto the stack while I'm filling requirements.
|
||||||
game.getStack().freezeStack();
|
game.getStack().freezeStack();
|
||||||
|
|
||||||
@@ -64,10 +77,10 @@ public class HumanPlaySpellAbility {
|
|||||||
|
|
||||||
if (!prerequisitesMet) {
|
if (!prerequisitesMet) {
|
||||||
if (!ability.isTrigger()) {
|
if (!ability.isTrigger()) {
|
||||||
rollbackAbility();
|
rollbackAbility(fromZone, zonePosition);
|
||||||
if (ability.isMadness()) {
|
if (ability.isMadness()) {
|
||||||
// if a player failed to play madness cost, move the card to graveyard
|
// if a player failed to play madness cost, move the card to graveyard
|
||||||
game.getAction().moveToGraveyard(ability.getSourceCard());
|
game.getAction().moveToGraveyard(c);
|
||||||
ability.setMadness(false);
|
ability.setMadness(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -131,10 +144,15 @@ public class HumanPlaySpellAbility {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rollbackAbility() {
|
private void rollbackAbility(Zone fromZone, int zonePosition) {
|
||||||
// cancel ability during target choosing
|
// cancel ability during target choosing
|
||||||
final Game game = ability.getActivatingPlayer().getGame();
|
final Game game = ability.getActivatingPlayer().getGame();
|
||||||
|
|
||||||
|
if (fromZone != null) { // and not a copy
|
||||||
|
// add back to where it came from
|
||||||
|
game.getAction().moveTo(fromZone, ability.getSourceCard(), zonePosition >= 0 ? Integer.valueOf(zonePosition) : null);
|
||||||
|
}
|
||||||
|
|
||||||
clearTargets(ability);
|
clearTargets(ability);
|
||||||
|
|
||||||
this.ability.resetOnceResolved();
|
this.ability.resetOnceResolved();
|
||||||
|
|||||||
Reference in New Issue
Block a user