diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 8a38809d09c..33e2e690150 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -376,7 +376,7 @@ public class ComputerUtilMana { } final String typeRes = cost.getSourceRestriction(); - if (StringUtils.isNotBlank(typeRes) && !paymentChoice.getHostCard().getType().hasStringType(typeRes)) { + if (StringUtils.isNotBlank(typeRes) && !paymentChoice.getHostCard().isValid(typeRes, null, null, null)) { continue; } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 2953ded9ede..f25274df46a 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2,6 +2,7 @@ package forge.game.ability; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; @@ -2381,7 +2382,14 @@ public class AbilityUtils { if (sq[0].contains("CombatDamage")) { isCombat = true; } - return doXMath(game.getDamageDoneThisTurn(isCombat, false, props[1], props[2], c, player, ctb).size(), expr, c, ctb); + int num; + List dmgInstances = game.getDamageDoneThisTurn(isCombat, false, props[1], props[2], c, player, ctb); + if (sq[0].contains("Max")) { + num = Collections.max(dmgInstances); + } else { + num = dmgInstances.size(); + } + return doXMath(num, expr, c, ctb); } if (sq[0].equals("YourTurns")) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 1a8dcd5ba02..02fe83baf18 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -923,7 +923,7 @@ public class CardFactoryUtil { StringBuilder trigReturn = new StringBuilder(); trigReturn.append("Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self"); - trigReturn.append(" | Secondary$ True | TriggerDescription$ When this permanent leaves the battlefield, return the exiled card to the battlefield under its owner’s control."); + trigReturn.append(" | Secondary$ True | TriggerDescription$ When this permanent leaves the battlefield, return the exiled card to the battlefield under its owner's control."); StringBuilder ab = new StringBuilder(); ab.append("DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True "); diff --git a/forge-game/src/main/java/forge/game/cost/CostPayment.java b/forge-game/src/main/java/forge/game/cost/CostPayment.java index ac6b5d6bf3f..5ead44c7add 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPayment.java +++ b/forge-game/src/main/java/forge/game/cost/CostPayment.java @@ -313,7 +313,7 @@ public class CostPayment extends ManaConversionMatrix { continue; } - if (StringUtils.isNotBlank(restriction) && !thisMana.getSourceCard().getType().hasStringType(restriction)) { + if (StringUtils.isNotBlank(restriction) && !thisMana.getSourceCard().isValid(restriction, null, null, null)) { continue; } diff --git a/forge-game/src/main/java/forge/game/mana/ManaPool.java b/forge-game/src/main/java/forge/game/mana/ManaPool.java index a9aa3bc2c93..b798edf06c6 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -218,7 +218,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { continue; } - if (StringUtils.isNotBlank(restriction) && !mana.getSourceCard().getType().hasStringType(restriction)) { + if (StringUtils.isNotBlank(restriction) && !mana.getSourceCard().isValid(restriction, null, null, null)) { continue; } diff --git a/forge-gui/res/cardsfolder/a/ancestral_katana.txt b/forge-gui/res/cardsfolder/a/ancestral_katana.txt index 00a3fec4c51..f15644f2b2d 100644 --- a/forge-gui/res/cardsfolder/a/ancestral_katana.txt +++ b/forge-gui/res/cardsfolder/a/ancestral_katana.txt @@ -2,8 +2,8 @@ Name:Ancestral Katana ManaCost:1 W Types:Artifact Equipment T:Mode$ Attacks | ValidCard$ Samurai.YouCtrl,Warrior.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigImmediateTrig | TriggerDescription$ Whenever a Samurai or Warrior you control attacks alone, you may pay {1}. When you do, attach CARDNAME to it. -SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ 1 | Execute$ TrigAttach | RememberObjects$ TriggeredAttacker | TriggerDescription$ When you do, attach CARDNAME to it. -SVar:TrigAttach:DB$ Attach | Defined$ DelayTriggerRemembered +SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ 1 | Execute$ TrigAttach | RememberObjects$ TriggeredAttackerLKICopy | TriggerDescription$ When you do, attach CARDNAME to it. +SVar:TrigAttach:DB$ Attach | Defined$ DelayTriggerRememberedLKI S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 1 | Description$ Equipped creature gets +2/+1. K:Equip:3 DeckHints:Type$Samurai|Warrior diff --git a/forge-gui/res/cardsfolder/a/anointer_of_valor.txt b/forge-gui/res/cardsfolder/a/anointer_of_valor.txt index 41a96096b55..d51fa252b45 100644 --- a/forge-gui/res/cardsfolder/a/anointer_of_valor.txt +++ b/forge-gui/res/cardsfolder/a/anointer_of_valor.txt @@ -4,7 +4,7 @@ Types:Creature Angel PT:3/5 K:Flying T:Mode$ Attacks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigImmediateTrig | TriggerDescription$ Whenever a creature attacks, you may pay {3}. When you do, put a +1/+1 counter on that creature. -SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ 3 | Execute$ TrigCounter | RememberObjects$ TriggeredAttacker | SpellDescription$ Whenever a creature attacks, you may pay {3}. When you do, put a +1/+1 counter on that creature. +SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ 3 | Execute$ TrigCounter | RememberObjects$ TriggeredAttackerLKICopy | SpellDescription$ Whenever a creature attacks, you may pay {3}. When you do, put a +1/+1 counter on that creature. SVar:TrigCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | Defined$ DelayTriggerRememberedLKI DeckHas:Ability$Counters Oracle:Flying\nWhenever a creature attacks, you may pay {3}. When you do, put a +1/+1 counter on that creature. diff --git a/forge-gui/res/cardsfolder/b/bad_moon.txt b/forge-gui/res/cardsfolder/b/bad_moon.txt index a6ee5850cbe..49ca3ec33f5 100644 --- a/forge-gui/res/cardsfolder/b/bad_moon.txt +++ b/forge-gui/res/cardsfolder/b/bad_moon.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Creature.Black | AddPower$ 1 | AddToughness$ 1 | Description$ Black creatures get +1/+1. SVar:PlayMain1:TRUE SVar:NeedsToPlayVar:CountOpps LTCountMe -SVar:CountOpp:Count$Valid Creature.OppCtrl+Black/LimitMax.5 +SVar:CountOpps:Count$Valid Creature.OppCtrl+Black/LimitMax.5 SVar:CountMe:Count$Valid Creature.YouCtrl+Black Oracle:Black creatures get +1/+1. diff --git a/forge-gui/res/cardsfolder/c/crusade.txt b/forge-gui/res/cardsfolder/c/crusade.txt index 60943a2f82c..5ff2d75fa23 100644 --- a/forge-gui/res/cardsfolder/c/crusade.txt +++ b/forge-gui/res/cardsfolder/c/crusade.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Creature.White | AddPower$ 1 | AddToughness$ 1 | Description$ White creatures get +1/+1. SVar:PlayMain1:TRUE SVar:NeedsToPlayVar:CountOpps LTCountMe -SVar:CountOpp:Count$Valid Creature.OppCtrl+White/LimitMax.5 +SVar:CountOpps:Count$Valid Creature.OppCtrl+White/LimitMax.5 SVar:CountMe:Count$Valid Creature.YouCtrl+White Oracle:White creatures get +1/+1. diff --git a/forge-gui/res/cardsfolder/c/cycle_of_life.txt b/forge-gui/res/cardsfolder/c/cycle_of_life.txt index 8116ccce69c..8edb0ab608d 100644 --- a/forge-gui/res/cardsfolder/c/cycle_of_life.txt +++ b/forge-gui/res/cardsfolder/c/cycle_of_life.txt @@ -3,5 +3,5 @@ ManaCost:1 G G Types:Enchantment A:AB$ Animate | Cost$ Return<1/CARDNAME> | ValidTgts$ Creature.wasCastByYou+ThisTurnCast | TgtPrompt$ Select target creature you cast this turn | Power$ 0 | Toughness$ 1 | Duration$ UntilYourNextUpkeep | SubAbility$ DelTrig | SpellDescription$ Target creature you cast this turn has base power and toughness 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | RememberObjects$ Targeted | Execute$ TrigGrowth | TriggerDescription$ Put a +1/+1 counter on that creature. -SVar:TrigGrowth:DB$ PutCounter | Defined$ DelayTriggerRemembered | CounterType$ P1P1 | CounterNum$ 1 +SVar:TrigGrowth:DB$ PutCounter | Defined$ DelayTriggerRememberedLKI | CounterType$ P1P1 | CounterNum$ 1 Oracle:Return Cycle of Life to its owner's hand: Target creature you cast this turn has base power and toughness 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature. diff --git a/forge-gui/res/cardsfolder/h/hogaak_arisen_necropolis.txt b/forge-gui/res/cardsfolder/h/hogaak_arisen_necropolis.txt index 4ca00fc1f9e..1894f8f6e0e 100644 --- a/forge-gui/res/cardsfolder/h/hogaak_arisen_necropolis.txt +++ b/forge-gui/res/cardsfolder/h/hogaak_arisen_necropolis.txt @@ -5,6 +5,7 @@ PT:8/8 K:Convoke K:Delve K:Trample +Text:You can't spend mana to cast this spell. A:SP$ PermanentCreature | Cost$ Mana<5 BG BG\Delve,Convoke> SVar:AltCost:Cost$ Mana<5 BG BG\Delve,Convoke> | ActivationZone$ Graveyard | Description$ You may cast CARDNAME from your graveyard. Oracle:You can't spend mana to cast this spell.\nConvoke, delve (Each creature you tap while casting this spell pays for {1} or one mana of that creature's color. Each card you exile from your graveyard pays for {1}.)\nYou may cast Hogaak, Arisen Necropolis from your graveyard.\nTrample diff --git a/forge-gui/res/cardsfolder/i/impact_resonance.txt b/forge-gui/res/cardsfolder/i/impact_resonance.txt index 6a6c29e3778..73841174dca 100644 --- a/forge-gui/res/cardsfolder/i/impact_resonance.txt +++ b/forge-gui/res/cardsfolder/i/impact_resonance.txt @@ -1,13 +1,8 @@ Name:Impact Resonance ManaCost:1 R Types:Instant -T:Mode$ TurnBegin | Execute$ ResetDamage | Static$ True -SVar:ResetDamage:DB$ StoreSVar | SVar$ X | Type$ Number | Expression$ 0 -T:Mode$ DamageDone | ValidTarget$ Player,Permanent | Execute$ StoreDamage | Static$ True -SVar:StoreDamage:DB$ StoreSVar | SVar$ X | Type$ Calculate | Expression$ Y | ConditionCheckSVar$ Y | ConditionSVarCompare$ GTX A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature | TargetMin$ MinTgts | TargetMax$ MaxTgts | NumDmg$ X | DividedAsYouChoose$ X | SpellDescription$ CARDNAME deals X damage divided as you choose among any number of target creatures, where X is the greatest amount of damage dealt by a source to a permanent or player this turn. -SVar:X:Number$0 -SVar:Y:TriggerCount$DamageAmount +SVar:X:Count$MaxDamageThisTurn Card Permanent,Player SVar:MinTgts:SVar$X/LimitMax.1 SVar:MaxTgts:Count$Valid Creature Oracle:Impact Resonance deals X damage divided as you choose among any number of target creatures, where X is the greatest amount of damage dealt by a source to a permanent or player this turn. diff --git a/forge-gui/res/cardsfolder/i/imperiosaur.txt b/forge-gui/res/cardsfolder/i/imperiosaur.txt index c4a14d22e5e..27b21bb2e0b 100644 --- a/forge-gui/res/cardsfolder/i/imperiosaur.txt +++ b/forge-gui/res/cardsfolder/i/imperiosaur.txt @@ -3,5 +3,5 @@ ManaCost:2 G G Types:Creature Dinosaur PT:5/5 Text:Spend only mana produced by basic lands to cast this spell. -A:SP$ PermanentCreature | Cost$ Mana<2 G G\Basic> +A:SP$ PermanentCreature | Cost$ Mana<2 G G\Land.Basic> Oracle:Spend only mana produced by basic lands to cast this spell. diff --git a/forge-gui/res/cardsfolder/j/jugan_defends_the_temple_remnant_of_the_rising_star.txt b/forge-gui/res/cardsfolder/j/jugan_defends_the_temple_remnant_of_the_rising_star.txt index f1d2a688ab2..8b95e2c8a9b 100644 --- a/forge-gui/res/cardsfolder/j/jugan_defends_the_temple_remnant_of_the_rising_star.txt +++ b/forge-gui/res/cardsfolder/j/jugan_defends_the_temple_remnant_of_the_rising_star.txt @@ -21,8 +21,8 @@ Types:Enchantment Creature Dragon Spirit PT:2/2 K:Flying T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigImmediateTrig | TriggerDescription$ Whenever another creature enters the battlefield under your control, you may pay {X}. When you do, put X +1/+1 counters on that creature. -SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ X | Execute$ TrigPutCounter | RememberObjects$ TriggeredCard | AILogic$ MaxX | TriggerDescription$ When you do, put X +1/+1 counters on that creature. -SVar:TrigPutCounter:DB$ PutCounter | Defined$ DelayTriggerRemembered | CounterType$ P1P1 | CounterNum$ X +SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ X | Execute$ TrigPutCounter | RememberObjects$ TriggeredCardLKICopy | AILogic$ MaxX | TriggerDescription$ When you do, put X +1/+1 counters on that creature. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ DelayTriggerRememberedLKI | CounterType$ P1P1 | CounterNum$ X S:Mode$ Continuous | IsPresent$ Creature.modified+YouCtrl | PresentCompare$ GE5 | Affected$ Card.Self | AddPower$ 5 | AddToughness$ 5 | AddKeyword$ Trample | Description$ As long as you control five or more modified creatures, CARDNAME gets +5/+5 and has trample. SVar:X:Count$xPaid Oracle:Flying\nWhenever another creature enters the battlefield under your control, you may pay {X}. When you do, put X +1/+1 counters on that creature.\nAs long as you control five or more modified creatures, Remnant of the Rising Star gets +5/+5 and has trample. (Equipment, Auras you control, and counters are modifications.) diff --git a/forge-gui/res/cardsfolder/k/karma.txt b/forge-gui/res/cardsfolder/k/karma.txt index 6fef2a63e55..33a5bb636af 100644 --- a/forge-gui/res/cardsfolder/k/karma.txt +++ b/forge-gui/res/cardsfolder/k/karma.txt @@ -6,6 +6,6 @@ SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X SVar:X:Count$Valid Swamp.ActivePlayerCtrl AI:RemoveDeck:Random SVar:NeedsToPlayVar:CountOpps GTCountMe -SVar:CountOpp:Count$Valid Swamp.OppCtrl/LimitMax.5 +SVar:CountOpps:Count$Valid Swamp.OppCtrl/LimitMax.5 SVar:CountMe:Count$Valid Swamp.YouCtrl Oracle:At the beginning of each player's upkeep, Karma deals damage to that player equal to the number of Swamps they control. diff --git a/forge-gui/res/cardsfolder/m/meekstone.txt b/forge-gui/res/cardsfolder/m/meekstone.txt index ad8f3a4bc73..e42e44d8546 100644 --- a/forge-gui/res/cardsfolder/m/meekstone.txt +++ b/forge-gui/res/cardsfolder/m/meekstone.txt @@ -5,7 +5,7 @@ S:Mode$ Continuous | Affected$ Creature.powerGE3 | AddHiddenKeyword$ CARDNAME do SVar:NonStackingEffect:True AI:RemoveDeck:Random SVar:NeedsToPlayVar:CountOpps GTCountMe -SVar:CountOpp:Count$Valid Creature.OppCtrl+PowerGE3/LimitMax.5 +SVar:CountOpps:Count$Valid Creature.OppCtrl+PowerGE3/LimitMax.5 SVar:CountMe:Count$Valid Creature.YouCtrl+PowerGE3 DeckHints:Type$Enchantment|Artifact|Planeswalker & Type$Wall & Keyword$Defender Oracle:Creatures with power 3 or greater don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/s/sawtooth_ogre.txt b/forge-gui/res/cardsfolder/s/sawtooth_ogre.txt index 425a0f1c0e2..873ce7fe39f 100644 --- a/forge-gui/res/cardsfolder/s/sawtooth_ogre.txt +++ b/forge-gui/res/cardsfolder/s/sawtooth_ogre.txt @@ -4,7 +4,7 @@ Types:Creature Ogre PT:3/3 T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ DelTrigBlocked | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, Sawtooth Ogre deals 1 damage to that creature at end of combat. T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ DelTrigBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, Sawtooth Ogre deals 1 damage to that creature at end of combat. -SVar:DelTrigBlocked:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDamage | RememberObjects$ TriggeredAttacker | TriggerDescription$ CARDNAME deals 1 damage to blocked creature at end of combat. -SVar:DelTrigBlocker:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDamage | RememberObjects$ TriggeredBlocker | TriggerDescription$ CARDNAME deals 1 damage to blocking creature at end of combat. -SVar:TrigDamage:DB$ DealDamage | Defined$ DelayTriggerRemembered | NumDmg$ 1 +SVar:DelTrigBlocked:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDamage | RememberObjects$ TriggeredAttackerLKICopy | TriggerDescription$ CARDNAME deals 1 damage to blocked creature at end of combat. +SVar:DelTrigBlocker:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDamage | RememberObjects$ TriggeredBlockerLKICopy | TriggerDescription$ CARDNAME deals 1 damage to blocking creature at end of combat. +SVar:TrigDamage:DB$ DealDamage | Defined$ DelayTriggerRememberedLKI | NumDmg$ 1 Oracle:Whenever Sawtooth Ogre blocks or becomes blocked by a creature, Sawtooth Ogre deals 1 damage to that creature at end of combat. diff --git a/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt b/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt index 34335039130..46b452a71e7 100644 --- a/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt +++ b/forge-gui/res/cardsfolder/s/shirei_shizos_caretaker.txt @@ -3,8 +3,8 @@ ManaCost:4 B Types:Legendary Creature Spirit PT:2/2 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | ValidCard$ Creature.powerLE1+YouOwn | OptionalDecider$ You | Execute$ DelTrig | TriggerDescription$ Whenever a creature with power 1 or less is put into your graveyard from the battlefield, you may return that card to the battlefield at the beginning of the next end step if CARDNAME is still on the battlefield. -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigReturn | IsPresent$ Card.Self+StrictlySelf | PresentZone$ Battlefield | RememberObjects$ TriggeredNewCardLKICopy | TriggerDescription$ Return creature to the battlefield. -SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ DelayTriggerRememberedLKI | IsPresent$ Card.Self+StrictlySelf | PresentZone$ Battlefield +SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigReturn | IsPresent$ Card.StrictlySelf | PresentZone$ Battlefield | RememberObjects$ TriggeredNewCardLKICopy | TriggerDescription$ Return creature to the battlefield. +SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ DelayTriggerRememberedLKI | IsPresent$ Card.StrictlySelf | PresentZone$ Battlefield S:Mode$ Continuous | Affected$ Creature.YouCtrl+powerLE1+YouOwn | AddSVar$ Sac SVar:Sac:SVar:SacMe:3 Oracle:Whenever a creature with power 1 or less is put into your graveyard from the battlefield, you may return that card to the battlefield at the beginning of the next end step if Shirei, Shizo's Caretaker is still on the battlefield. diff --git a/forge-gui/res/cardsfolder/s/smoke.txt b/forge-gui/res/cardsfolder/s/smoke.txt index 4c120cfeb96..5daeb2b5d8e 100644 --- a/forge-gui/res/cardsfolder/s/smoke.txt +++ b/forge-gui/res/cardsfolder/s/smoke.txt @@ -5,7 +5,7 @@ S:Mode$ Continuous | Affected$ Player | AddKeyword$ UntapAdjust:Creature:1 | Des SVar:NonStackingEffect:True DeckHints:Type$Planeswalker|Artifact|Enchantment SVar:NeedsToPlayVar:CountOpps GTCountMe -SVar:CountOpp:Count$Valid Creature.OppCtrl/LimitMax.5 +SVar:CountOpps:Count$Valid Creature.OppCtrl/LimitMax.5 SVar:CountMe:Count$Valid Creature.YouCtrl AI:RemoveDeck:Random Oracle:Players can't untap more than one creature during their untap steps. diff --git a/forge-gui/res/cardsfolder/s/spell_queller.txt b/forge-gui/res/cardsfolder/s/spell_queller.txt index b688e5a5475..4bffb892c17 100644 --- a/forge-gui/res/cardsfolder/s/spell_queller.txt +++ b/forge-gui/res/cardsfolder/s/spell_queller.txt @@ -7,8 +7,8 @@ K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target spell with mana value 4 or less. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigPlay | TriggerDescription$ When Spell Queller leaves the battlefield, the exiled card's owner may cast that card without paying its mana cost. SVar:TrigExile:DB$ ChangeZone | TargetType$ Spell | ValidTgts$ Card.cmcLE4 | TgtZone$ Stack | Origin$ Stack | Fizzle$ True | Mandatory$ True | Destination$ Exile | IsCurse$ True | TgtPrompt$ Choose target spell with mana value 4 or less | RememberChanged$ True -SVar:TrigPlay:DB$ Play | Defined$ Remembered.ExiledWithSource | Controller$ RememberedOwner | WithoutManaCost$ True | Optional$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup -T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | ValidSA$ Spell | Execute$ DBForget +SVar:TrigPlay:DB$ Play | Defined$ Remembered.ExiledWithSource | Controller$ RememberedOwner | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup +T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount diff --git a/forge-gui/res/cardsfolder/t/teferis_veil.txt b/forge-gui/res/cardsfolder/t/teferis_veil.txt index b216cc2fb9a..03433c094c6 100644 --- a/forge-gui/res/cardsfolder/t/teferis_veil.txt +++ b/forge-gui/res/cardsfolder/t/teferis_veil.txt @@ -2,8 +2,8 @@ Name:Teferi's Veil ManaCost:1 U Types:Enchantment T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ DelayedTrig | TriggerDescription$ Whenever a creature you control attacks, it phases out at end of combat. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.) -SVar:DelayedTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigPhase | RememberObjects$ TriggeredAttacker | TriggerDescription$ Attacking creatures you control phase out at end of combat. -SVar:TrigPhase:DB$ Phases | Defined$ DelayTriggerRemembered +SVar:DelayedTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigPhase | RememberObjects$ TriggeredAttackerLKICopy | TriggerDescription$ Attacking creatures you control phase out at end of combat. +SVar:TrigPhase:DB$ Phases | Defined$ DelayTriggerRememberedLKI AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:PlayMain1:TRUE diff --git a/forge-gui/res/cardsfolder/t/tolarian_entrancer.txt b/forge-gui/res/cardsfolder/t/tolarian_entrancer.txt index 7fd3e85180f..ae74b37d260 100644 --- a/forge-gui/res/cardsfolder/t/tolarian_entrancer.txt +++ b/forge-gui/res/cardsfolder/t/tolarian_entrancer.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Human Wizard PT:1/1 T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ DelTrig | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, gain control of that creature at end of combat. -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigGainControl | RememberObjects$ TriggeredBlocker | TriggerDescription$ Gain control of blocking creature. -SVar:TrigGainControl:DB$ GainControl | Defined$ DelayTriggerRemembered | NewController$ You +SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigGainControl | RememberObjects$ TriggeredBlockerLKICopy | TriggerDescription$ Gain control of blocking creature. +SVar:TrigGainControl:DB$ GainControl | Defined$ DelayTriggerRememberedLKI | NewController$ You SVar:HasAttackEffect:Blocked Oracle:Whenever Tolarian Entrancer becomes blocked by a creature, gain control of that creature at end of combat. diff --git a/forge-gui/res/cardsfolder/w/wall_of_dust.txt b/forge-gui/res/cardsfolder/w/wall_of_dust.txt index 2932042cf80..8349b441dee 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_dust.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_dust.txt @@ -4,6 +4,6 @@ Types:Creature Wall PT:1/4 K:Defender T:Mode$ AttackerBlocked | ValidBlocker$ Card.Self | Execute$ DelTrig | TriggerDescription$ Whenever CARDNAME blocks a creature, that creature can't attack during its controller's next turn. -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep-> | ValidPlayer$ Player.controlsCard.IsTriggerRemembered | UpcomingTurn$ True | Static$ True | Execute$ TrigPump | RememberObjects$ TriggeredAttacker | TriggerDescription$ Creatures blocked by CARDNAME can't attack this turn. -SVar:TrigPump:DB$ Pump | IsCurse$ True | Defined$ DelayTriggerRemembered | KW$ HIDDEN CARDNAME can't attack. +SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep-> | ValidPlayer$ Player.controlsCard.IsTriggerRemembered | UpcomingTurn$ True | Static$ True | Execute$ TrigPump | RememberObjects$ TriggeredAttackerLKICopy | TriggerDescription$ Creatures blocked by CARDNAME can't attack this turn. +SVar:TrigPump:DB$ Pump | IsCurse$ True | Defined$ DelayTriggerRememberedLKI | KW$ HIDDEN CARDNAME can't attack. Oracle:Defender (This creature can't attack.)\nWhenever Wall of Dust blocks a creature, that creature can't attack during its controller's next turn. diff --git a/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java index 3a27c05e1d6..c5666ad05e7 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java @@ -234,12 +234,13 @@ public abstract class InputPayMana extends InputSyncronizedBase { } final SpellAbility chosen; + final String typeRes = manaCost.getSourceRestriction(); + if (chosenAbility == null) { HashMap abilitiesMap = new HashMap<>(); // you can't remove unneeded abilities inside a for (am:abilities) loop :( - final String typeRes = manaCost.getSourceRestriction(); - if (StringUtils.isNotBlank(typeRes) && !card.getType().hasStringType(typeRes)) { + if (StringUtils.isNotBlank(typeRes) && !card.isValid(typeRes, player, card, null)) { return false; } @@ -353,6 +354,11 @@ public abstract class InputPayMana extends InputSyncronizedBase { restrictionsMet = false; break; } + + if (StringUtils.isNotBlank(typeRes) && !card.isValid(typeRes, player, card, null)) { + restrictionsMet = false; + break; + } } if (restrictionsMet) { diff --git a/forge-gui/src/main/java/forge/player/TargetSelection.java b/forge-gui/src/main/java/forge/player/TargetSelection.java index 4176041288f..27e418c6cc3 100644 --- a/forge-gui/src/main/java/forge/player/TargetSelection.java +++ b/forge-gui/src/main/java/forge/player/TargetSelection.java @@ -92,7 +92,7 @@ public class TargetSelection { final boolean hasEnoughTargets = minTargets == 0 || numTargeted >= minTargets; final boolean hasAllTargets = numTargeted == maxTargets && maxTargets > 0; - if (maxTargets == 0) { return true; } + if (maxTargets == 0 && minTargets == 0) { return true; } // if not enough targets chosen, cancel Ability if (this.bTargetingDone && !hasEnoughTargets) {