diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 72d58c91372..a8de2c51e0f 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -597,7 +597,10 @@ public class CardProperty { return false; } } else if (property.startsWith("BottomLibrary")) { - final CardCollection cards = new CardCollection(card.getOwner().getCardsIn(ZoneType.Library)); + CardCollection cards = new CardCollection(card.getOwner().getCardsIn(ZoneType.Library)); + if (property.startsWith("BottomLibrary_")) { + cards = CardLists.getValidCards(cards, property.substring(14), sourceController, source, spellAbility); + } Collections.reverse(cards); if (cards.isEmpty() || !card.equals(cards.get(0))) { return false; diff --git a/forge-gui/res/cardsfolder/a/arcums_whistle.txt b/forge-gui/res/cardsfolder/a/arcums_whistle.txt index 033a7ee72b3..3387f8f8751 100644 --- a/forge-gui/res/cardsfolder/a/arcums_whistle.txt +++ b/forge-gui/res/cardsfolder/a/arcums_whistle.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Animate | Cost$ 3 T | ActivationPhases$ Upkeep->BeginCombat | ActivationFirstCombat$ True | ValidTgts$ Creature.nonWall+ActivePlayerCtrl+notFirstTurnControlled | TgtPrompt$ Select target non-Wall creature the active player has controlled continuously since the beginning of the turn | IsCurse$ True | staticAbilities$ MustAttack | UnlessCost$ X | UnlessPayer$ TargetedController | UnlessResolveSubs$ WhenNotPaid | SubAbility$ DestroyPacifist | SpellDescription$ Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That player may pay {X}, where X is that creature's mana value. If they don't pay, the creature attacks this turn if able, and at the beginning of the next end step, destroy it if it didn't attack this turn. Activate only before attackers are declared. SVar:MustAttack:Mode$ MustAttack | ValidCreature$ Card.Self | Description$ This creature attacks this turn if able. -SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigDestroy | RememberObjects$ ParentTarget | TriggerDescription$ At the beginning of the end step, destroy that creature if it didn't attack this turn. +SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigDestroy | RememberObjects$ ParentTarget | TriggerDescription$ At the beginning of the next end step, destroy that creature if it didn't attack this turn. SVar:TrigDestroy:DB$ Destroy | Defined$ DelayTriggerRemembered | ConditionDefined$ DelayTriggerRemembered | ConditionPresent$ Creature.notAttackedThisTurn | ConditionCompare$ GE1 SVar:X:Targeted$CardManaCost AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/n/nettling_imp.txt b/forge-gui/res/cardsfolder/n/nettling_imp.txt index 2d451c7f8c8..cb83ee4640e 100644 --- a/forge-gui/res/cardsfolder/n/nettling_imp.txt +++ b/forge-gui/res/cardsfolder/n/nettling_imp.txt @@ -4,7 +4,7 @@ Types:Creature Imp PT:1/1 A:AB$ Animate | Cost$ T | ValidTgts$ Creature.nonWall+ActivePlayerCtrl+notFirstTurnControlled | TgtPrompt$ Select target non-Wall creature the active player has controlled continuously since the beginning of the turn | ActivationPhases$ Upkeep->BeginCombat | ActivationFirstCombat$ True | OpponentTurn$ True | staticAbilities$ MustAttack | SubAbility$ DestroyPacifist | SpellDescription$ Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That creature attacks this turn if able. Destroy it at the beginning of the next end step if it didn't attack this turn. Activate only during an opponent's turn, before attackers are declared. SVar:MustAttack:Mode$ MustAttack | ValidCreature$ Card.Self | Description$ This creature attacks this turn if able. -SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | RememberObjects$ ParentTarget | Execute$ TrigDestroy | TriggerDescription$ At the beginning of the end step, destroy that creature if it didn't attack this turn. +SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | RememberObjects$ ParentTarget | Execute$ TrigDestroy | TriggerDescription$ At the beginning of the next end step, destroy that creature if it didn't attack this turn. SVar:TrigDestroy:DB$ Destroy | Defined$ DelayTriggerRemembered | ConditionDefined$ DelayTriggerRemembered | ConditionPresent$ Creature.notAttackedThisTurn | ConditionCompare$ GE1 AI:RemoveDeck:All Oracle:{T}: Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That creature attacks this turn if able. Destroy it at the beginning of the next end step if it didn't attack this turn. Activate only during an opponent's turn, before attackers are declared. diff --git a/forge-gui/res/cardsfolder/n/norritt.txt b/forge-gui/res/cardsfolder/n/norritt.txt index 61aec2a86f4..f5ac365ec4d 100644 --- a/forge-gui/res/cardsfolder/n/norritt.txt +++ b/forge-gui/res/cardsfolder/n/norritt.txt @@ -5,7 +5,7 @@ PT:1/1 A:AB$ Untap | Cost$ T | ValidTgts$ Creature.Blue | TgtPrompt$ Select target blue creature | SpellDescription$ Untap target blue creature. A:AB$ Pump | Cost$ T | ValidTgts$ Creature.nonWall+ActivePlayerCtrl+notFirstTurnControlled | TgtPrompt$ Select target non-Wall creature the active player has controlled continuously since the beginning of the turn | ActivationPhases$ Upkeep->BeginCombat | ActivationFirstCombat$ True | staticAbilities$ MustAttack | SubAbility$ DestroyPacifist | SpellDescription$ Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That creature attacks this turn if able. Destroy it at the beginning of the next end step if it didn't attack this turn. Activate only before attackers are declared. SVar:MustAttack:Mode$ MustAttack | ValidCreature$ Card.Self | Description$ This creature attacks this turn if able. -SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigDestroy | RememberObjects$ ParentTarget | TriggerDescription$ At the beginning of the end step, destroy that creature if it didn't attack this turn. +SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigDestroy | RememberObjects$ ParentTarget | TriggerDescription$ At the beginning of the next end step, destroy that creature if it didn't attack this turn. SVar:TrigDestroy:DB$ Destroy | Defined$ DelayTriggerRemembered | ConditionDefined$ DelayTriggerRemembered | ConditionPresent$ Creature.notAttackedThisTurn | ConditionCompare$ GE1 AI:RemoveDeck:All DeckHints:Color$Blue diff --git a/forge-gui/res/cardsfolder/p/planeswalkers_mischief.txt b/forge-gui/res/cardsfolder/p/planeswalkers_mischief.txt index 717e2a2f126..c13b2ed65ac 100644 --- a/forge-gui/res/cardsfolder/p/planeswalkers_mischief.txt +++ b/forge-gui/res/cardsfolder/p/planeswalkers_mischief.txt @@ -1,16 +1,12 @@ Name:Planeswalker's Mischief ManaCost:2 U Types:Enchantment -A:AB$ Reveal | Cost$ 3 U | Random$ True | RememberRevealed$ True | ValidTgts$ Opponent | TgtPrompt$ Select target opponent to reveal a card | SorcerySpeed$ True | SubAbility$ DBChangeZone | SpellDescription$ Target opponent reveals a card at random from their hand. If it's an instant or sorcery card, exile it. You may cast it without paying its mana cost for as long as it remains exiled. At the beginning of the next end step, if you haven't cast it, return it to its owner's hand. Activate only as a sorcery. -SVar:DBChangeZone:DB$ ChangeZoneAll | ChangeType$ Instant.IsRemembered,Sorcery.IsRemembered | Origin$ Hand | Destination$ Exile | SubAbility$ DBForgetOther -SVar:DBForgetOther:DB$ Cleanup | ClearRemembered$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ MischiefPlay | Triggers$ TrigEOT,TrigChangesZone | RememberObjects$ Remembered | Duration$ Permanent | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup +A:AB$ Reveal | Cost$ 3 U | Random$ True | RememberRevealed$ True | ValidTgts$ Opponent | SorcerySpeed$ True | SubAbility$ DBChangeZone | SpellDescription$ Target opponent reveals a card at random from their hand. If it's an instant or sorcery card, exile it. You may cast it without paying its mana cost for as long as it remains exiled. At the beginning of the next end step, if you haven't cast it, return it to its owner's hand. Activate only as a sorcery. +SVar:DBChangeZone:DB$ ChangeZoneAll | ChangeType$ Instant.IsRemembered,Sorcery.IsRemembered | Origin$ Hand | Destination$ Exile | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | StaticAbilities$ MischiefPlay | ExileOnMoved$ Exile | RememberObjects$ Remembered | Duration$ Permanent | SubAbility$ DBDelayedTrigger +SVar:DBDelayedTrigger:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ MischiefReturn | IsPresent$ Card.IsRemembered | PresentZone$ Exile | RememberObjects$ Remembered | SubAbility$ DBCleanup | TriggerDescription$ At the beginning of the next end step, if that card is still exiled, put it into your graveyard and create a Treasure token. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:MischiefPlay:Mode$ Continuous | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | Affected$ Card.IsRemembered+OppOwn | AffectedZone$ Exile | Description$ You may cast a card without paying its mana cost as long as it remains exiled. -SVar:TrigEOT:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ MischiefReturn | TriggerDescription$ At the beginning of the next end step, if you haven't cast it, return it to its owner's hand. -SVar:MischiefReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Hand -SVar:TrigChangesZone:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ MischiefCleanup -SVar:MischiefCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:X:Count$ValidExile Instant.IsRemembered,Sorcery.IsRemembered +SVar:MischiefPlay:Mode$ Continuous | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ You may cast the exiled instant or sorcery card without paying its mana cost for as long as it remains exiled. +SVar:MischiefReturn:DB$ ChangeZone | Defined$ RememberedLKI | Origin$ Exile | Destination$ Hand SVar:NonStackingEffect:True Oracle:{3}{U}: Target opponent reveals a card at random from their hand. If it's an instant or sorcery card, exile it. You may cast it without paying its mana cost for as long as it remains exiled. At the beginning of the next end step, if you haven't cast it, return it to its owner's hand. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/p/psychic_theft.txt b/forge-gui/res/cardsfolder/p/psychic_theft.txt index 218f70789b1..51cc52ebee2 100644 --- a/forge-gui/res/cardsfolder/p/psychic_theft.txt +++ b/forge-gui/res/cardsfolder/p/psychic_theft.txt @@ -1,18 +1,11 @@ Name:Psychic Theft ManaCost:1 U Types:Sorcery -A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Player | Origin$ Hand | Destination$ Exile | ChangeType$ Instant,Sorcery | IsCurse$ True | Chooser$ You | ChangeNum$ 1 | RememberChanged$ True | SubAbility$ TheftEffect | SpellDescription$ Target player reveals their hand. You choose an instant or sorcery card from it and exile that card. You may cast that card for as long as it remains exiled. At the beginning of the next end step, if you haven't cast the card, return it to its owner's hand. | StackDescription$ SpellDescription -SVar:TheftEffect:DB$ Effect | StaticAbilities$ STThieving | Duration$ Permanent | RememberObjects$ Remembered | Triggers$ TrigReturn,TrigCast | SubAbility$ DBResetSVar -# Even though the Effect is "Permanent", it's not really permanent -SVar:DBResetSVar:DB$ StoreSVar | SVar$ ActivePsychic | Type$ Number | Expression$ 1 | SubAbility$ DBCleanup +A:SP$ ChangeZone | ValidTgts$ Player | Origin$ Hand | Destination$ Exile | ChangeType$ Instant,Sorcery | Mandatory$ True | IsCurse$ True | Chooser$ You | ChangeNum$ 1 | RememberChanged$ True | SubAbility$ TheftEffect | SpellDescription$ Target player reveals their hand. You choose an instant or sorcery card from it and exile that card. | StackDescription$ SpellDescription +SVar:TheftEffect:DB$ Effect | StaticAbilities$ STThieving | Duration$ Permanent | RememberObjects$ Remembered | ExileOnMoved$ Exile | SubAbility$ DBDelayedTrigger | SpellDescription$ You may cast that card for as long as it remains exiled. At the beginning of the next end step, if you haven't cast the card, return it to its owner's hand. +SVar:DBDelayedTrigger:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | IsPresent$ Card.IsRemembered | PresentZone$ Exile | RememberObjects$ Remembered | SubAbility$ DBCleanup | TriggerDescription$ At the beginning of the next end step, if you haven't cast the card, return it to its owner's hand. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:ActivePsychic:Number$1 -SVar:STThieving:Mode$ Continuous | Affected$ Card.IsRemembered+OppOwn | MayPlay$ True | EffectZone$ Command | AffectedZone$ Exile | CheckSVar$ ActivePsychic | Description$ You may cast that card for as long as it remains exiled. -# Return the card as a normal trigger -SVar:TrigReturn:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | TriggerZones$ Command | Execute$ DBReturn | TriggerDescription$ At the beginning of the next end step, if you haven't cast the card, return it to its owner's hand. -SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Hand | SubAbility$ RemoveEffect -SVar:RemoveEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -# Remove Effect when the card is played -SVar:TrigCast:Mode$ SpellCast | ValidCard$ Card.IsRemembered | Static$ True | TriggerZones$ Command | Execute$ RemoveEffect +SVar:STThieving:Mode$ Continuous | Affected$ Card.IsRemembered+nonLand | MayPlay$ True | EffectZone$ Command | AffectedZone$ Exile | Description$ You may cast that card for as long as it remains exiled. +SVar:TrigReturn:DB$ ChangeZone | Defined$ RememberedLKI | Origin$ Exile | Destination$ Hand AI:RemoveDeck:All Oracle:Target player reveals their hand. You choose an instant or sorcery card from it and exile that card. You may cast that card for as long as it remains exiled. At the beginning of the next end step, if you haven't cast the card, return it to its owner's hand. diff --git a/forge-gui/res/cardsfolder/upcoming/bank_job.txt b/forge-gui/res/cardsfolder/upcoming/bank_job.txt new file mode 100644 index 00000000000..41faf44a4ac --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bank_job.txt @@ -0,0 +1,13 @@ +Name:Bank Job +ManaCost:1 B R +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, exile the bottom creature card of your library. You may cast that card this turn. At the beginning of the next end step, if that card is still exiled, put it into your graveyard and create a Treasure token. +SVar:TrigExile:DB$ ChangeZoneAll | ChangeType$ Card.YouOwn+BottomLibrary_Creature | Origin$ Library | Destination$ Exile | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | StaticAbilities$ MayCast | RememberObjects$ Remembered | ExileOnMoved$ Exile | SubAbility$ DBDelayedTrigger +SVar:MayCast:Mode$ Continuous | Affected$ Card.IsRemembered+nonLand | MayPlay$ True | EffectZone$ Command | AffectedZone$ Exile | Description$ You may cast that card this turn. +SVar:DBDelayedTrigger:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigGrave | IsPresent$ Card.IsTriggerRemembered | PresentZone$ Exile | RememberObjects$ Remembered | SubAbility$ DBCleanup | TriggerDescription$ At the beginning of the next end step, if that card is still exiled, put it into your graveyard and create a Treasure token. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigGrave:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Exile | Destination$ Graveyard | SubAbility$ DBTreasure +SVar:DBTreasure:DB$ Token | TokenScript$ c_a_treasure_sac +DeckHas:Ability$Sacrifice|Token & Type$Treasure|Artifact +Oracle:At the beginning of your upkeep, exile the bottom creature card of your library. You may cast that card this turn. At the beginning of the next end step, if that card is still exiled, put it into your graveyard and create a Treasure token.