mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 11:48:02 +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);
|
||||
}
|
||||
|
||||
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) {
|
||||
String trig = "Mode$ Countered | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Static$ True";
|
||||
String effect = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile";
|
||||
|
||||
@@ -227,6 +227,8 @@ public class EffectEffect extends SpellAbilityEffect {
|
||||
addForgetOnCastTrigger(eff);
|
||||
} else if (sa.hasParam("ExileOnMoved")) {
|
||||
addExileOnMovedTrigger(eff, sa.getParam("ExileOnMoved"));
|
||||
} else if (sa.hasParam("ExileOnCast")) {
|
||||
addExileOnCastTrigger(eff);
|
||||
}
|
||||
if (sa.hasParam("ForgetOnPhasedIn")) {
|
||||
addForgetOnPhasedInTrigger(eff);
|
||||
|
||||
@@ -3855,7 +3855,7 @@ public class CardFactoryUtil {
|
||||
|
||||
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);
|
||||
|
||||
StringBuilder sbPlay = new StringBuilder();
|
||||
|
||||
@@ -20,6 +20,7 @@ package forge.game.zone;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
import forge.card.CardStateName;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardCollectionView;
|
||||
import forge.game.card.CardLists;
|
||||
@@ -63,7 +64,7 @@ public class PlayerZone extends Zone {
|
||||
boolean graveyardCastable = c.hasKeyword(Keyword.FLASHBACK) ||
|
||||
c.hasKeyword(Keyword.RETRACE) || c.hasKeyword(Keyword.JUMP_START) || c.hasKeyword(Keyword.ESCAPE) ||
|
||||
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()) {
|
||||
final ZoneType restrictZone = sa.getRestrictions().getZone();
|
||||
|
||||
@@ -92,6 +93,15 @@ public class PlayerZone extends Zone {
|
||||
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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user