Merge pull request #3561 from tool4ever/digUntil

DigUntil is sequential
This commit is contained in:
kevlahnota
2023-07-30 06:05:07 +08:00
committed by GitHub
16 changed files with 63 additions and 63 deletions

View File

@@ -1767,18 +1767,11 @@ public class ComputerUtil {
// Lethal Damage => prevent damage/regeneration/bounce/shroud
if (threatApi == ApiType.DealDamage || threatApi == ApiType.DamageAll) {
// If PredictDamage is >= Lethal Damage
final int dmg = AbilityUtils.calculateAmount(source,
topStack.getParam("NumDmg"), topStack);
final int dmg = AbilityUtils.calculateAmount(source, topStack.getParam("NumDmg"), topStack);
final SpellAbility sub = topStack.getSubAbility();
boolean noRegen = false;
if (sub != null && sub.getApi() == ApiType.Pump) {
final List<String> keywords = sub.hasParam("KW") ? Arrays.asList(sub.getParam("KW").split(" & ")) : new ArrayList<>();
for (String kw : keywords) {
if (kw.contains("can't be regenerated")) {
noRegen = true;
break;
}
}
if (sub != null && sub.getApi() == ApiType.Effect && sub.hasParam("AILogic") && sub.getParam("AILogic").equals("CantRegenerate")) {
noRegen = true;
}
for (final Object o : objects) {
if (o instanceof Card) {

View File

@@ -128,6 +128,7 @@ public class DigUntilEffect extends SpellAbilityEffect {
boolean shuffle = sa.hasParam("Shuffle");
final boolean optional = sa.hasParam("Optional");
final boolean optionalFound = sa.hasParam("OptionalFoundMove");
boolean sequential = digSite == ZoneType.Library && revealedDest.equals(foundDest);
CardZoneTable table = new CardZoneTable();
boolean combatChanged = false;
@@ -179,19 +180,24 @@ public class DigUntilEffect extends SpellAbilityEffect {
}
if (foundDest != null) {
// Allow ordering of found cards
if (foundDest.isKnown() && found.size() >= 2 && !foundDest.equals(ZoneType.Exile)) {
found = (CardCollection)p.getController().orderMoveToZoneList(found, foundDest, sa);
// is it "change zone until" or "reveal until"?
final Iterator<Card> itr;
if (sequential) {
itr = revealed.iterator();
} else {
itr = found.iterator();
}
final Iterator<Card> itr = found.iterator();
while (itr.hasNext()) {
final Card c = itr.next();
final ZoneType origin = c.getZone().getZoneType();
if (optionalFound && !p.getController().confirmAction(sa, null,
Localizer.getInstance().getMessage("lblDoYouWantPutCardToZone", foundDest.getTranslatedName()), null)) {
itr.remove();
continue;
}
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
moveParams.put(AbilityKey.LastStateBattlefield, lastStateBattlefield);
moveParams.put(AbilityKey.LastStateGraveyard, lastStateGraveyard);
@@ -207,16 +213,19 @@ public class DigUntilEffect extends SpellAbilityEffect {
if (addToCombat(c, c.getController(), sa, "Attacking", "Blocking")) {
combatChanged = true;
}
} else if (sa.hasParam("NoMoveFound") && foundDest.equals(ZoneType.Library)) {
} else if (sa.hasParam("NoMoveFound")) {
//Don't do anything
} else {
m = game.getAction().moveTo(foundDest, c, foundLibPos, sa, moveParams);
}
revealed.remove(c);
if (m != null && !origin.equals(m.getZone().getZoneType())) {
table.put(origin, m.getZone().getZoneType(), m);
CardZoneTable trigList = new CardZoneTable();
trigList.put(origin, m.getZone().getZoneType(), m);
trigList.triggerChangesZoneAll(game, sa);
}
}
revealed.removeAll(found);
}
if (sa.hasParam("RememberRevealed")) {
@@ -225,46 +234,35 @@ public class DigUntilEffect extends SpellAbilityEffect {
if (sa.hasParam("ImprintRevealed")) {
host.addImprintedCards(revealed);
}
if (sa.hasParam("RevealRandomOrder")) {
Collections.shuffle(revealed, MyRandom.getRandom());
}
if (sa.hasParam("NoMoveRevealed")) {
if (sa.hasParam("NoMoveRevealed") || sequential) {
//don't do anything
} else if (sa.hasParam("NoneFoundDestination") && found.size() < untilAmount) {
// Allow ordering the revealed cards
if (noneFoundDest.isKnown() && revealed.size() >= 2) {
revealed = (CardCollection)p.getController().orderMoveToZoneList(revealed, noneFoundDest, sa);
}
if (noneFoundDest == ZoneType.Library && !shuffle
&& !sa.hasParam("RevealRandomOrder") && revealed.size() >= 2) {
revealed = (CardCollection)p.getController().orderMoveToZoneList(revealed, noneFoundDest, sa);
}
final Iterator<Card> itr = revealed.iterator();
while (itr.hasNext()) {
final Card c = itr.next();
final ZoneType origin = c.getZone().getZoneType();
final Card m = game.getAction().moveTo(noneFoundDest, c, noneFoundLibPos, sa);
if (m != null && !origin.equals(m.getZone().getZoneType())) {
table.put(origin, m.getZone().getZoneType(), m);
}
}
} else {
// Allow ordering the rest of the revealed cards
if (revealedDest.isKnown() && revealed.size() >= 2 && !sa.hasParam("SkipReorder")) {
revealed = (CardCollection)p.getController().orderMoveToZoneList(revealed, revealedDest, sa);
ZoneType finalDest = revealedDest;
int finalPos = revealedLibPos;
if (sa.hasParam("NoneFoundDestination") && found.size() < untilAmount) {
finalDest = noneFoundDest;
finalPos = noneFoundLibPos;
}
if (revealedDest == ZoneType.Library && !shuffle
// Allow ordering the rest of the revealed cards
if (finalDest.isKnown() && revealed.size() >= 2) {
revealed = (CardCollection)p.getController().orderMoveToZoneList(revealed, finalDest, sa);
}
if (finalDest == ZoneType.Library && !shuffle
&& !sa.hasParam("RevealRandomOrder") && revealed.size() >= 2) {
revealed = (CardCollection)p.getController().orderMoveToZoneList(revealed, revealedDest, sa);
revealed = (CardCollection)p.getController().orderMoveToZoneList(revealed, finalDest, sa);
}
final Iterator<Card> itr = revealed.iterator();
while (itr.hasNext()) {
final Card c = itr.next();
final ZoneType origin = c.getZone().getZoneType();
final Card m = game.getAction().moveTo(revealedDest, c, revealedLibPos, sa);
final Card m = game.getAction().moveTo(finalDest, c, finalPos, sa);
if (m != null && !origin.equals(m.getZone().getZoneType())) {
table.put(origin, m.getZone().getZoneType(), m);
}

View File

@@ -35,6 +35,8 @@ import java.util.SortedSet;
import forge.game.event.*;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.LandAbility;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
@@ -1700,6 +1702,9 @@ public class Player extends GameEntity implements Comparable<Player> {
land.setController(this, 0);
if (land.isFaceDown()) {
land.turnFaceUp(null);
if (cause instanceof LandAbility) {
land.changeToState(cause.getCardStateName());
}
}
Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(land);

View File

@@ -5,5 +5,5 @@ PT:2/3
T:Mode$ SpellCast | ValidCard$ Card.White | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a white spell, you may pay {1}. If you do, gain 1 life.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigGrave | TriggerDescription$ When CARDNAME dies, you gain 3 life.
SVar:TrigGrave:DB$ GainLife | Defined$ TriggeredCardController | LifeAmount$ 3
SVar:TrigGainLife:AB$GainLife | Cost$ 1 | LifeAmount$ 1
SVar:TrigGainLife:AB$ GainLife | Cost$ 1 | LifeAmount$ 1
Oracle:When Auspicious Ancestor dies, you gain 3 life.\nWhenever a player casts a white spell, you may pay {1}. If you do, you gain 1 life.

View File

@@ -4,6 +4,8 @@ Types:Creature Elk Beast
PT:6/6
K:Mutate:5 G
T:Mode$ Mutates | ValidCard$ Card.Self | Execute$ TrigDigUntil | TriggerDescription$ Whenever this creature mutates, exile cards from the top of your library until you exile X permanent cards, where X is the number of times this creature has mutated. Put those permanent cards onto the battlefield.
SVar:TrigDigUntil:DB$ DigUntil | Amount$ X | Defined$ You | Valid$ Permanent | ValidDescription$ permanent | RevealedDestination$ Exile | FoundDestination$ Battlefield
SVar:TrigDigUntil:DB$ DigUntil | Amount$ X | Defined$ You | Valid$ Permanent | ValidDescription$ permanent | RevealedDestination$ Exile | FoundDestination$ Exile | RememberFound$ True | SubAbility$ DBToPlay
SVar:DBToPlay:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$TimesMutated
Oracle:Mutate {5}{G} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.)\nWhenever this creature mutates, exile cards from the top of your library until you exile X permanent cards, where X is the number of times this creature has mutated. Put those permanent cards onto the battlefield.

View File

@@ -5,7 +5,7 @@ PT:1/4
S:Mode$ CantBeCast | ValidCard$ Permanent | Caster$ You | Description$ You can't cast permanent spells.
A:AB$ Mana | Cost$ 4 T | Produced$ W U B R G | SubAbility$ DBTrigger | SpellDescription$ Add {W}{U}{B}{R}{G}. When you cast your next spell this turn, exile cards from the top of your library until you exile an instant or sorcery card with lesser mana value. Until end of turn, you may cast that card without paying its mana cost. Put each other card exiled this way on the bottom of your library in a random order.
SVar:DBTrigger:DB$ DelayedTrigger | Mode$ SpellCast | ValidActivatingPlayer$ You | ThisTurn$ True | Execute$ DBDig | TriggerDescription$ When you cast your next spell this turn, exile cards from the top of your library until you exile an instant or sorcery card with lesser mana value. Until end of turn, you may cast that card without paying its mana cost. Put each other card exiled this way on the bottom of your library in a random order.
SVar:DBDig:DB$ DigUntil | Defined$ You | Valid$ Instant.cmcLTX,Sorcery.cmcLTX | FoundDestination$ Exile | RevealedDestination$ Exile | RememberRevealed$ True | ImprintFound$ True | SkipReorder$ True | SubAbility$ DBEffect
SVar:DBDig:DB$ DigUntil | Defined$ You | Valid$ Instant.cmcLTX,Sorcery.cmcLTX | FoundDestination$ Exile | RevealedDestination$ Exile | RememberRevealed$ True | ImprintFound$ True | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | StaticAbilities$ MayPlay | RememberObjects$ Imprinted | ForgetOnMoved$ Exile | SubAbility$ DBRestRandomOrder
SVar:MayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | AffectedZone$ Exile | Description$ Until end of turn, you may cast that card without paying its mana cost.
SVar:DBRestRandomOrder:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Exile | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBCleanup

View File

@@ -2,9 +2,9 @@ Name:Dance, Pathetic Marionette
ManaCost:no cost
Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ LibraryDance | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each opponent reveals cards from the top of their library until they reveal a creature card. Choose one of the revealed creature cards and put it onto the battlefield under your control. Put all other cards revealed this way into their owners' graveyards.
SVar:LibraryDance:DB$ DigUntil | Defined$ Player.Opponent | Valid$ Creature | ValidDescription$ creature | RememberFound$ True | NoMoveFound$ True | FoundDestination$ Library | FoundLibraryPosition$ 0 | RevealedDestination$ Graveyard | SubAbility$ MakeItChoose
SVar:MakeItChoose:DB$ ChooseCard | Choices$ Card.IsRemembered | ChoiceZone$ Library | Mandatory$ True | Amount$ 1 | SubAbility$ MakeItDance
SVar:LibraryDance:DB$ DigUntil | Defined$ Player.Opponent | Valid$ Creature | ValidDescription$ creature | RememberRevealed$ True | ImprintFound$ True | NoMoveRevealed$ True | SubAbility$ MakeItChoose
SVar:MakeItChoose:DB$ ChooseCard | Choices$ Card.IsImprinted | ChoiceZone$ Library | Mandatory$ True | Amount$ 1 | SubAbility$ MakeItDance
SVar:MakeItDance:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Library | Destination$ Battlefield | Mandatory$ True | GainControl$ True | ForgetChanged$ True | SubAbility$ TakeOutTheTrash
SVar:TakeOutTheTrash:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
Oracle:When you set this scheme in motion, each opponent reveals cards from the top of their library until they reveal a creature card. Choose one of the revealed creature cards and put it onto the battlefield under your control. Put all other cards revealed this way into their owners' graveyards.

View File

@@ -5,8 +5,10 @@ PT:6/6
K:Flying
K:Trample
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRepeat | TriggerDescription$ When CARDNAME enters the battlefield, exile cards from the top of your library until you exile a nonland card, then put that card into your hand. If the card's mana value is 4 or greater, repeat this process. CARDNAME deals 1 damage to you for each card put into your hand this way.
SVar:TrigRepeat:DB$ Repeat | RepeatSubAbility$ DBCleanup | RepeatDefined$ Remembered | RepeatPresent$ Card.cmcGE4 | RepeatCompare$ EQ1
SVar:TrigRepeat:DB$ Repeat | RepeatSubAbility$ DBCleanup | RepeatDefined$ Remembered | RepeatPresent$ Card.cmcGE4 | RepeatCompare$ EQ1 | SubAbility$ DBDealDamage
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBDigUntil
SVar:DBDigUntil:DB$ DigUntil | Valid$ Card.nonLand | ValidDescription$ nonland | FoundDestination$ Hand | RevealedDestination$ Exile | RememberFound$ True | SubAbility$ DBDealDamage
SVar:DBDealDamage:DB$ DealDamage | NumDmg$ 1 | Defined$ You
SVar:DBDigUntil:DB$ DigUntil | Valid$ Card.nonLand | ValidDescription$ nonland | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | ImprintFound$ True | SubAbility$ DBToHand
SVar:DBToHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Hand
SVar:DBDealDamage:DB$ DealDamage | NumDmg$ Imprinted$Amount | Defined$ You | SubAbility$ DBCleanup2
SVar:DBCleanup2:DB$ Cleanup | ClearImprinted$ True | ClearRemembered$ True
Oracle:Flying, trample\nWhen Demonlord Belzenlok enters the battlefield, exile cards from the top of your library until you exile a nonland card, then put that card into your hand. If the card's mana value is 4 or greater, repeat this process. Demonlord Belzenlok deals 1 damage to you for each card put into your hand this way.

View File

@@ -2,9 +2,8 @@ Name:Empty the Laboratory
ManaCost:X U U
Types:Sorcery
A:SP$ Sacrifice | Defined$ You | Amount$ X | SacValid$ Zombie | RememberSacrificed$ True | SubAbility$ DBDigUntil | StackDescription$ SpellDescription | SpellDescription$ Sacrifice X Zombies, then reveal cards from the top of your library until you reveal a number of Zombie creature cards equal to the number of Zombies sacrificed this way. Put those cards onto the battlefield and the rest on the bottom of your library in a random order.
SVar:DBDigUntil:DB$ DigUntil | Amount$ Y | Valid$ Creature.Zombie | FoundDestination$ Library | NoMoveFound$ True | ImprintFound$ True | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | SubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | Defined$ Imprinted | Origin$ Library | Destination$ Battlefield | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
SVar:DBDigUntil:DB$ DigUntil | Amount$ Y | Valid$ Creature.Zombie | FoundDestination$ Battlefield | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$xPaid
SVar:Y:Remembered$Amount
DeckHas:Ability$Sacrifice

View File

@@ -2,5 +2,5 @@ Name:Foster
ManaCost:2 G G
Types:Enchantment
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ Whenever a creature you control dies, you may pay {1}. If you do, reveal cards from the top of your library until you reveal a creature card. Put that card into your hand and the rest into your graveyard.
SVar:TrigDig:AB$DigUntil | Cost$ 1 | Valid$ Creature | ValidDescription$ creature | FoundDestination$ Hand | RevealedDestination$ Graveyard
SVar:TrigDig:AB$ DigUntil | Cost$ 1 | Valid$ Creature | ValidDescription$ creature | FoundDestination$ Hand | RevealedDestination$ Graveyard
Oracle:Whenever a creature you control dies, you may pay {1}. If you do, reveal cards from the top of your library until you reveal a creature card. Put that card into your hand and the rest into your graveyard.

View File

@@ -2,7 +2,7 @@ Name:Goblin Machinist
ManaCost:4 R
Types:Creature Goblin
PT:0/5
A:AB$ DigUntil | Cost$ 2 R | Valid$ Card.nonLand | ValidDescription$ nonland | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | FoundDestination$ Library | FoundLibraryPosition$ -1 | RememberFound$ True | SubAbility$ DBPump | SpellDescription$ Reveal cards from the top of your library until you reveal a nonland card. CARDNAME gets +X/+0 until end of turn, where X is that card's mana value. Put the revealed cards on the bottom of your library in any order.
A:AB$ DigUntil | Cost$ 2 R | Valid$ Card.nonLand | ValidDescription$ nonland | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RememberFound$ True | SubAbility$ DBPump | SpellDescription$ Reveal cards from the top of your library until you reveal a nonland card. CARDNAME gets +X/+0 until end of turn, where X is that card's mana value. Put the revealed cards on the bottom of your library in any order.
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ RCX | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:RCX:Remembered$CardManaCost

View File

@@ -3,7 +3,7 @@ ManaCost:W U B R G
Types:Battle Siege
Defense:7
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, exile cards from the top of your library until you exile two nonland cards with mana value 4 or less. You may cast one of those two cards without paying its mana cost. Put one of them into your hand. Then put the other cards exiled this way on the bottom of your library in a random order.
SVar:TrigDig:DB$ DigUntil | Defined$ You | Valid$ Card.nonLand+cmcLE4 | Amount$ 2 | FoundDestination$ Exile | RevealedDestination$ Exile | RememberRevealed$ True | ImprintFound$ True | SkipReorder$ True | SubAbility$ DBPlay
SVar:TrigDig:DB$ DigUntil | Defined$ You | Valid$ Card.nonLand+cmcLE4 | Amount$ 2 | FoundDestination$ Exile | RevealedDestination$ Exile | RememberRevealed$ True | ImprintFound$ True | SubAbility$ DBPlay
SVar:DBPlay:DB$ Play | Valid$ Card.IsImprinted | ValidSA$ Spell | ValidZone$ Exile | WithoutManaCost$ True | Controller$ You | Optional$ True | Amount$ 1 | SubAbility$ DBPutHand
SVar:DBPutHand:DB$ ChangeZone | ChangeType$ Card.IsImprinted | Mandatory$ True | Hidden$ True | Chooser$ You | ChangeNum$ 1 | Origin$ Exile | Destination$ Hand | SubAbility$ DBRestRandomOrder
SVar:DBRestRandomOrder:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Exile | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBCleanup

View File

@@ -4,7 +4,7 @@ Types:Legendary Creature Human Elf Shaman
PT:2/7
T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | Execute$ TrigPutBottom | TriggerZones$ Battlefield | ActivationLimit$ 1 | OptionalDecider$ You | TriggerDescription$ Whenever you cast a spell, you may put it on the bottom of its owner's library. If you do, reveal cards from the top of your library until you reveal a nonland card. You may cast that card without paying its mana cost. Then put all revealed cards not cast this way on the bottom of your library in a random order. This ability triggers only once each turn.
SVar:TrigPutBottom:DB$ ChangeZone | Origin$ Stack | Destination$ Library | LibraryPosition$ -1 | Defined$ TriggeredCard | Fizzle$ True | RememberChanged$ True | SubAbility$ DBDig
SVar:DBDig:DB$ DigUntil | Valid$ Card.nonLand | ForgetOtherRemembered$ True | ImprintFound$ True | RememberFound$ True | RememberRevealed$ True | NoMoveFound$ True | NoMoveRevealed$ True | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBPlay
SVar:DBDig:DB$ DigUntil | Valid$ Card.nonLand | ForgetOtherRemembered$ True | ImprintFound$ True | RememberFound$ True | RememberRevealed$ True | NoMoveRevealed$ True | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBPlay
SVar:DBPlay:DB$ Play | Defined$ Imprinted | ValidZone$ Library | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True | ForgetPlayed$ True | SubAbility$ DBBottom
SVar:DBBottom:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True

View File

@@ -11,7 +11,7 @@ SVar:X:ReplaceCount$DamageAmount
SVar:Y:Count$RememberedSize
SVar:Z:Count$CardCounters.EYESTALK
T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ Whenever CARDNAME attacks, reveal cards from the top of your library until you reveal an instant, sorcery, or enchantment card with converted mana cost less than the number of eyestalk counters on CARDNAME. You may cast it without paying its mana cost. Shuffle your library.
SVar:TrigDig:DB$ DigUntil | Defined$ You | Amount$ 1 | Valid$ Card.Instant+cmcLEZ,Card.Sorcery+cmcLEZ,Card.Enchantment+cmcLEZ | NoMoveFound$ True | NoMoveRevealed$ True | RememberFound$ True | SubAbility$ CascadeCast
SVar:TrigDig:DB$ DigUntil | Defined$ You | Amount$ 1 | Valid$ Card.Instant+cmcLEZ,Card.Sorcery+cmcLEZ,Card.Enchantment+cmcLEZ | NoMoveRevealed$ True | RememberFound$ True | SubAbility$ CascadeCast
SVar:CascadeCast:DB$ Play | ValidSA$ Spell | Defined$ Remembered | WithoutManaCost$ True | Optional$ True | SubAbility$ Shuffle
SVar:Shuffle:DB$ Shuffle | SubAbility$ DBCleanup
SVar:HasAttackEffect:TRUE

View File

@@ -2,8 +2,9 @@ Name:Venture Forth
ManaCost:3 G
Types:Sorcery
K:Suspend:3:1 G
A:SP$ DigUntil | Defined$ You | Valid$ Permanent.Land | ValidDescription$ land | FoundDestination$ Battlefield | RevealedDestination$ Exile | RememberRevealed$ True | SubAbility$ DBRestRandomOrder | SpellDescription$ Exile cards from the top of your library until you exile a land card. Put that card onto the battlefield and the rest on the bottom of your library in a random order.
A:SP$ DigUntil | Defined$ You | Valid$ Permanent.Land | ValidDescription$ land | FoundDestination$ Exile | RevealedDestination$ Exile | ImprintFound$ True | RememberRevealed$ True | SubAbility$ DBToPlay | SpellDescription$ Exile cards from the top of your library until you exile a land card. Put that card onto the battlefield and the rest on the bottom of your library in a random order.
SVar:DBToPlay:DB$ ChangeZone | Defined$ Imprinted | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBRestRandomOrder
SVar:DBRestRandomOrder:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Exile | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBExileSelf
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | SubAbility$ DBExileSelf
SVar:DBExileSelf:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | WithCountersType$ TIME | WithCountersAmount$ 3 | SpellDescription$ Exile CARDNAME with three time counters on it.
Oracle:Exile cards from the top of your library until you exile a land card. Put that card onto the battlefield and the rest on the bottom of your library in a random order. Exile Venture Forth with three time counters on it.\nSuspend 3—{1}{G} (Rather than cast this card from your hand, you may pay {1}{G} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.)

View File

@@ -378,7 +378,7 @@ public final class CardScriptParser {
"RememberedController", "RememberedOwner", "ImprintedController",
"ImprintedOwner", "EnchantedController", "EnchantedOwner",
"EnchantedPlayer", "AttackingPlayer", "DefendingPlayer",
"ChosenPlayer", "ChosenAndYou", "SourceController", "CardOwner",
"ChosenPlayer", "SourceController", "CardOwner",
"ActivePlayer", "You", "Opponent");
/**
* Defined starting strings for players.