diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 3972fa472bc..eafafadcba2 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -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 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) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java index 2220c8a99c2..b0f3733a555 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java @@ -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 itr; + if (sequential) { + itr = revealed.iterator(); + } else { + itr = found.iterator(); } - final Iterator 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 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 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 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); } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 8e03c1e71a9..db4a81782cf 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -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 { land.setController(this, 0); if (land.isFaceDown()) { land.turnFaceUp(null); + if (cause instanceof LandAbility) { + land.changeToState(cause.getCardStateName()); + } } Map runParams = AbilityKey.mapFromCard(land); diff --git a/forge-gui/res/cardsfolder/a/auspicious_ancestor.txt b/forge-gui/res/cardsfolder/a/auspicious_ancestor.txt index ffd9b979587..9b8ab78502b 100644 --- a/forge-gui/res/cardsfolder/a/auspicious_ancestor.txt +++ b/forge-gui/res/cardsfolder/a/auspicious_ancestor.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/a/auspicious_starrix.txt b/forge-gui/res/cardsfolder/a/auspicious_starrix.txt index a8a2aabe61f..60f7fad9da5 100644 --- a/forge-gui/res/cardsfolder/a/auspicious_starrix.txt +++ b/forge-gui/res/cardsfolder/a/auspicious_starrix.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/c/codie_vociferous_codex.txt b/forge-gui/res/cardsfolder/c/codie_vociferous_codex.txt index 16d7f68579c..c0f51820106 100644 --- a/forge-gui/res/cardsfolder/c/codie_vociferous_codex.txt +++ b/forge-gui/res/cardsfolder/c/codie_vociferous_codex.txt @@ -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 diff --git a/forge-gui/res/cardsfolder/d/dance_pathetic_marionette.txt b/forge-gui/res/cardsfolder/d/dance_pathetic_marionette.txt index b2ec00fd1be..f0098531901 100644 --- a/forge-gui/res/cardsfolder/d/dance_pathetic_marionette.txt +++ b/forge-gui/res/cardsfolder/d/dance_pathetic_marionette.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/d/demonlord_belzenlok.txt b/forge-gui/res/cardsfolder/d/demonlord_belzenlok.txt index 2d10c8125c9..d13429d952e 100644 --- a/forge-gui/res/cardsfolder/d/demonlord_belzenlok.txt +++ b/forge-gui/res/cardsfolder/d/demonlord_belzenlok.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/e/empty_the_laboratory.txt b/forge-gui/res/cardsfolder/e/empty_the_laboratory.txt index 08aa3265c47..ba11b7c47d1 100644 --- a/forge-gui/res/cardsfolder/e/empty_the_laboratory.txt +++ b/forge-gui/res/cardsfolder/e/empty_the_laboratory.txt @@ -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 diff --git a/forge-gui/res/cardsfolder/f/foster.txt b/forge-gui/res/cardsfolder/f/foster.txt index 0cbd0b7aae9..5851cdff7db 100644 --- a/forge-gui/res/cardsfolder/f/foster.txt +++ b/forge-gui/res/cardsfolder/f/foster.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/g/goblin_machinist.txt b/forge-gui/res/cardsfolder/g/goblin_machinist.txt index b13cda24176..0f8a143da5b 100644 --- a/forge-gui/res/cardsfolder/g/goblin_machinist.txt +++ b/forge-gui/res/cardsfolder/g/goblin_machinist.txt @@ -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 diff --git a/forge-gui/res/cardsfolder/i/invasion_of_alara_awaken_the_maelstrom.txt b/forge-gui/res/cardsfolder/i/invasion_of_alara_awaken_the_maelstrom.txt index 3df2fffc272..067fd4cc40a 100644 --- a/forge-gui/res/cardsfolder/i/invasion_of_alara_awaken_the_maelstrom.txt +++ b/forge-gui/res/cardsfolder/i/invasion_of_alara_awaken_the_maelstrom.txt @@ -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 diff --git a/forge-gui/res/cardsfolder/n/neera_wild_mage.txt b/forge-gui/res/cardsfolder/n/neera_wild_mage.txt index d7023157b93..397c5e1e738 100644 --- a/forge-gui/res/cardsfolder/n/neera_wild_mage.txt +++ b/forge-gui/res/cardsfolder/n/neera_wild_mage.txt @@ -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 diff --git a/forge-gui/res/cardsfolder/u/underdark_beholder.txt b/forge-gui/res/cardsfolder/u/underdark_beholder.txt index 8570bb413e0..e31cb3df542 100644 --- a/forge-gui/res/cardsfolder/u/underdark_beholder.txt +++ b/forge-gui/res/cardsfolder/u/underdark_beholder.txt @@ -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 diff --git a/forge-gui/res/cardsfolder/v/venture_forth.txt b/forge-gui/res/cardsfolder/v/venture_forth.txt index 95915ebbbda..e648949f524 100644 --- a/forge-gui/res/cardsfolder/v/venture_forth.txt +++ b/forge-gui/res/cardsfolder/v/venture_forth.txt @@ -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.) diff --git a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java index f2e94dfcdfc..786ce59eaa7 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java +++ b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java @@ -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.