fix Adventure cards in exile lose "may be cast" when rewinding casting

- closes #2176
This commit is contained in:
Anthony Calosa
2022-12-29 09:34:05 +08:00
parent 88308ecd5c
commit 21f9223981
4 changed files with 23 additions and 2 deletions

View File

@@ -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";

View File

@@ -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);

View File

@@ -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();

View File

@@ -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;