mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 19:58:00 +00:00
fix Adventure cards in exile lose "may be cast" when rewinding casting
- closes #2176
This commit is contained in:
@@ -400,6 +400,15 @@ public abstract class SpellAbilityEffect {
|
|||||||
addedTrigger.setIntrinsic(true);
|
addedTrigger.setIntrinsic(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static void addExileOnCastTrigger(final Card card) {
|
||||||
|
String trig = "Mode$ SpellCast | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Static$ True";
|
||||||
|
String effect = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile";
|
||||||
|
final Trigger parsedTrigger = TriggerHandler.parseTrigger(trig, card, true);
|
||||||
|
parsedTrigger.setOverridingAbility(AbilityFactory.getAbility(effect, card));
|
||||||
|
final Trigger addedTrigger = card.addTrigger(parsedTrigger);
|
||||||
|
addedTrigger.setIntrinsic(true);
|
||||||
|
}
|
||||||
|
|
||||||
protected static void addExileOnCounteredTrigger(final Card card) {
|
protected static void addExileOnCounteredTrigger(final Card card) {
|
||||||
String trig = "Mode$ Countered | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Static$ True";
|
String trig = "Mode$ Countered | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Static$ True";
|
||||||
String effect = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile";
|
String effect = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile";
|
||||||
|
|||||||
@@ -227,6 +227,8 @@ public class EffectEffect extends SpellAbilityEffect {
|
|||||||
addForgetOnCastTrigger(eff);
|
addForgetOnCastTrigger(eff);
|
||||||
} else if (sa.hasParam("ExileOnMoved")) {
|
} else if (sa.hasParam("ExileOnMoved")) {
|
||||||
addExileOnMovedTrigger(eff, sa.getParam("ExileOnMoved"));
|
addExileOnMovedTrigger(eff, sa.getParam("ExileOnMoved"));
|
||||||
|
} else if (sa.hasParam("ExileOnCast")) {
|
||||||
|
addExileOnCastTrigger(eff);
|
||||||
}
|
}
|
||||||
if (sa.hasParam("ForgetOnPhasedIn")) {
|
if (sa.hasParam("ForgetOnPhasedIn")) {
|
||||||
addForgetOnPhasedInTrigger(eff);
|
addForgetOnPhasedInTrigger(eff);
|
||||||
|
|||||||
@@ -3855,7 +3855,7 @@ public class CardFactoryUtil {
|
|||||||
|
|
||||||
SpellAbility saExile = AbilityFactory.getAbility(abExile, card);
|
SpellAbility saExile = AbilityFactory.getAbility(abExile, card);
|
||||||
|
|
||||||
String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ExileOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.nonCopiedSpell";
|
String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ExileOnCast$ True | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.nonCopiedSpell";
|
||||||
AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card);
|
AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card);
|
||||||
|
|
||||||
StringBuilder sbPlay = new StringBuilder();
|
StringBuilder sbPlay = new StringBuilder();
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ package forge.game.zone;
|
|||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
|
import forge.card.CardStateName;
|
||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
import forge.game.card.CardCollectionView;
|
import forge.game.card.CardCollectionView;
|
||||||
import forge.game.card.CardLists;
|
import forge.game.card.CardLists;
|
||||||
@@ -63,7 +64,7 @@ public class PlayerZone extends Zone {
|
|||||||
boolean graveyardCastable = c.hasKeyword(Keyword.FLASHBACK) ||
|
boolean graveyardCastable = c.hasKeyword(Keyword.FLASHBACK) ||
|
||||||
c.hasKeyword(Keyword.RETRACE) || c.hasKeyword(Keyword.JUMP_START) || c.hasKeyword(Keyword.ESCAPE) ||
|
c.hasKeyword(Keyword.RETRACE) || c.hasKeyword(Keyword.JUMP_START) || c.hasKeyword(Keyword.ESCAPE) ||
|
||||||
c.hasKeyword(Keyword.DISTURB);
|
c.hasKeyword(Keyword.DISTURB);
|
||||||
boolean exileCastable = (c.isAdventureCard() || c.isForetold()) && c.isInZone(ZoneType.Exile);
|
boolean exileCastable = c.isForetold() || isOnAdventure(c);
|
||||||
for (final SpellAbility sa : c.getSpellAbilities()) {
|
for (final SpellAbility sa : c.getSpellAbilities()) {
|
||||||
final ZoneType restrictZone = sa.getRestrictions().getZone();
|
final ZoneType restrictZone = sa.getRestrictions().getZone();
|
||||||
|
|
||||||
@@ -92,6 +93,15 @@ public class PlayerZone extends Zone {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private boolean isOnAdventure(Card c) {
|
||||||
|
if (!c.isAdventureCard())
|
||||||
|
return false;
|
||||||
|
if (c.getExiledWith() == null)
|
||||||
|
return false;
|
||||||
|
if (!CardStateName.Adventure.equals(c.getExiledWith().getCurrentStateName()))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private final Player player;
|
private final Player player;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user