From ac97e4c600ee21cfa4ba2303c8500dbe7d01a28d Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 14 May 2018 17:36:41 -0400 Subject: [PATCH] fixed Sagas being sacrificed before their trigger has left the stack --- .../java/mage/abilities/common/SagaAbility.java | 17 ++++++++++++----- Mage/src/main/java/mage/game/GameImpl.java | 17 +++++++++++++---- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/common/SagaAbility.java b/Mage/src/main/java/mage/abilities/common/SagaAbility.java index 3c71708bc12..3e377d3f438 100644 --- a/Mage/src/main/java/mage/abilities/common/SagaAbility.java +++ b/Mage/src/main/java/mage/abilities/common/SagaAbility.java @@ -28,6 +28,7 @@ package mage.abilities.common; import mage.abilities.Ability; +import mage.abilities.TriggeredAbility; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.Effects; @@ -127,6 +128,10 @@ public class SagaAbility extends SimpleStaticAbility { } return false; } + + public static boolean isChapterAbility(TriggeredAbility ability) { + return ability instanceof ChapterTriggeredAbility; + } } class ChapterTriggeredAbility extends TriggeredAbilityImpl { @@ -134,8 +139,9 @@ class ChapterTriggeredAbility extends TriggeredAbilityImpl { SagaChapter chapterFrom, chapterTo; public ChapterTriggeredAbility(Effect effect, SagaChapter chapterFrom, SagaChapter chapterTo) { - super(Zone.BATTLEFIELD, effect, false); + super(Zone.ALL, effect, false); this.chapterFrom = chapterFrom; + this.chapterTo = chapterTo; } public ChapterTriggeredAbility(final ChapterTriggeredAbility ability) { @@ -153,12 +159,13 @@ class ChapterTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { if (event.getTargetId().equals(getSourceId()) && event.getData().equals(CounterType.LORE.getName())) { int amountAdded = event.getAmount(); + int loreCounters = amountAdded; Permanent sourceSaga = game.getPermanentOrLKIBattlefield(getSourceId()); - if (sourceSaga != null) { - int loreCounters = sourceSaga.getCounters(game).getCount(CounterType.LORE); - return loreCounters - amountAdded < chapterFrom.getNumber() - && chapterFrom.getNumber() <= loreCounters; + if (sourceSaga != null) { // If it's entering the battlefield, it won't be found so we assume it had no counters + loreCounters = sourceSaga.getCounters(game).getCount(CounterType.LORE); } + return loreCounters - amountAdded < chapterFrom.getNumber() + && chapterFrom.getNumber() <= loreCounters; } return false; } diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index bd5e17cc79c..e8b31da5aa0 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -2031,21 +2031,30 @@ public abstract class GameImpl implements Game, Serializable { } } } - // Remove Saga enchantment if last chapter is reached and chapter ability has left the stack + // 704.5s If the number of lore counters on a Saga permanent is greater than or equal to its final chapter number + // and it isn’t the source of a chapter ability that has triggered but not yet left the stack, that Saga’s controller sacrifices it. if (perm.hasSubtype(SubType.SAGA, this)) { for (Ability sagaAbility : perm.getAbilities()) { if (sagaAbility instanceof SagaAbility) { int maxChapter = ((SagaAbility) sagaAbility).getMaxChapter().getNumber(); if (maxChapter <= perm.getCounters(this).getCount(CounterType.LORE)) { - boolean noChapterAbilityOnStack = true; + boolean noChapterAbilityTriggeredOrOnStack = true; // Check chapter abilities on stack for (StackObject stackObject : getStack()) { if (stackObject.getSourceId().equals(perm.getId()) && SagaAbility.isChapterAbility(stackObject)) { - noChapterAbilityOnStack = false; + noChapterAbilityTriggeredOrOnStack = false; break; } } - if (noChapterAbilityOnStack) { + if (noChapterAbilityTriggeredOrOnStack) { + for (TriggeredAbility trigger : state.getTriggered(perm.getControllerId())) { + if (SagaAbility.isChapterAbility(trigger) && trigger.getSourceId().equals(perm.getId())) { + noChapterAbilityTriggeredOrOnStack = false; + break; + } + } + } + if (noChapterAbilityTriggeredOrOnStack) { // After the last chapter ability has left the stack, you'll sacrifice the Saga perm.sacrifice(perm.getId(), this); somethingHappened = true;