From 986f95b46b54a255ae26b2bce39aee8f309fa869 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Jun 2017 07:11:56 +0000 Subject: [PATCH] - Attempting to fix Suspend by making it exempt from the canPlay() check in HumanPlay. - Better place for IsCastFromPlayEffect SVar assignment + cleanup - Adding some previously missed card fixes from Marek. --- .../game/ability/effects/PlayEffect.java | 2 ++ .../src/main/java/forge/game/card/Card.java | 1 + .../java/forge/game/spellability/Spell.java | 1 + .../res/cardsfolder/a/armorcraft_judge.txt | 2 +- forge-gui/res/cardsfolder/c/chrome_mox.txt | 6 ++--- .../res/cardsfolder/d/deepwater_hypnotist.txt | 6 ++--- .../res/cardsfolder/d/dukhara_scavenger.txt | 2 +- .../cardsfolder/k/kaervek_the_merciless.txt | 4 +-- forge-gui/res/cardsfolder/k/kavu_climber.txt | 4 +-- .../cardsfolder/o/odric_lunarch_marshal.txt | 2 +- .../res/cardsfolder/w/witherscale_wurm.txt | 26 +++++++++---------- .../src/main/java/forge/player/HumanPlay.java | 11 +++++++- .../forge/player/PlayerControllerHuman.java | 1 - 13 files changed, 40 insertions(+), 28 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 2b2283dc2db..2714c1ea4b7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -238,6 +238,8 @@ public class PlayEffect extends SpellAbilityEffect { addReplaceGraveyardEffect(tgtCard, sa, sa.getParam("ReplaceGraveyard")); } + tgtSA.setSVar("IsCastFromPlayEffect", "True"); + if (controller.getController().playSaFromPlayEffect(tgtSA)) { if (remember) { source.addRemembered(tgtSA.getHostCard()); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 8295e969a8f..851d23f7e82 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -7110,6 +7110,7 @@ public class Card extends GameEntity implements Comparable { // to be restored to their original value if a card changes zones removeSVar("PayX"); // Temporary AI X announcement variable + removeSVar("IsCastFromPlayEffect"); // Temporary SVar indicating that the spell is cast indirectly via AF Play setSunburstValue(0); // Sunburst } } diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index e0aacd8fd22..d985ff114f6 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -108,6 +108,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable || activator.hasKeyword("You may cast nonland cards as though they had flash.") || card.hasStartOfKeyword("You may cast CARDNAME as though it had flash.") || this.hasSVar("IsCastFromPlayEffect") + || card.wasSuspendCast() || (card.isFaceDown() && !card.getZone().is(ZoneType.Battlefield) && card.getState(CardStateName.Original).getType().isInstant()))) { return false; } diff --git a/forge-gui/res/cardsfolder/a/armorcraft_judge.txt b/forge-gui/res/cardsfolder/a/armorcraft_judge.txt index 2413c627770..4c635cbcbc0 100644 --- a/forge-gui/res/cardsfolder/a/armorcraft_judge.txt +++ b/forge-gui/res/cardsfolder/a/armorcraft_judge.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Creature Elf Artificer PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card for each creature you control with a +1/+1 counter on it. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ X | References$ X +SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ X | References$ X SVar:X:Count$Valid Creature.YouCtrl+counters_GE1_P1P1 DeckHints:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/armorcraft_judge.jpg diff --git a/forge-gui/res/cardsfolder/c/chrome_mox.txt b/forge-gui/res/cardsfolder/c/chrome_mox.txt index 12bb798b0c1..78a2e931296 100644 --- a/forge-gui/res/cardsfolder/c/chrome_mox.txt +++ b/forge-gui/res/cardsfolder/c/chrome_mox.txt @@ -1,12 +1,12 @@ Name:Chrome Mox ManaCost:0 Types:Artifact -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | OptionalDecider$ You | Execute$ TrigExile | TriggerDescription$ Imprint — When CARDNAME enters the battlefield, you may exile a nonartifact, nonland card from your hand. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Imprint$ True | Origin$ Hand | Destination$ Exile | ChangeType$ Card.nonArtifact+nonLand | ChangeNum$ 1 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | OptionalDecider$ You | Execute$ TrigExile | TriggerDescription$ Imprint — When CARDNAME enters the battlefield, you may exile a nonartifact, nonland card from your hand. +SVar:TrigExile:DB$ChangeZone | Imprint$ True | Origin$ Hand | Destination$ Exile | ChangeType$ Card.nonArtifact+nonLand | ChangeNum$ 1 A:AB$ ManaReflected | Cost$ T | Valid$ Defined.Imprinted | ColorOrType$ Color | ReflectProperty$ Is | SpellDescription$ Add one mana of any of the exiled card's colors to your mana pool. T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/chrome_mox.jpg -Oracle:Imprint — When Chrome Mox enters the battlefield, you may exile a nonartifact, nonland card from your hand.\n{T}: Add one mana of any of the exiled card's colors to your mana pool. +Oracle:Imprint — When Chrome Mox enters the battlefield, you may exile a nonartifact, nonland card from your hand.\n{T}: Add one mana of any of the exiled card's colors to your mana pool. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/deepwater_hypnotist.txt b/forge-gui/res/cardsfolder/d/deepwater_hypnotist.txt index c03f83a27f6..7a86ab02a04 100644 --- a/forge-gui/res/cardsfolder/d/deepwater_hypnotist.txt +++ b/forge-gui/res/cardsfolder/d/deepwater_hypnotist.txt @@ -2,7 +2,7 @@ Name:Deepwater Hypnotist ManaCost:1 U Types:Creature Merfolk Wizard PT:2/1 -T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Inspired — Whenever CARDNAME becomes untapped, target creature an opponent controls gets -3/-0 until end of turn. -SVar:TrigPump:AB$ Pump | Cost$ 0 | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumAtt$ -3 | IsCurse$ True +T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Inspired — Whenever CARDNAME becomes untapped, target creature an opponent controls gets -3/-0 until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumAtt$ -3 | IsCurse$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/deepwater_hypnotist.jpg -Oracle:Inspired — Whenever Deepwater Hypnotist becomes untapped, target creature an opponent controls gets -3/-0 until end of turn. +Oracle:Inspired — Whenever Deepwater Hypnotist becomes untapped, target creature an opponent controls gets -3/-0 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/dukhara_scavenger.txt b/forge-gui/res/cardsfolder/d/dukhara_scavenger.txt index 219ae122519..dcca4812893 100644 --- a/forge-gui/res/cardsfolder/d/dukhara_scavenger.txt +++ b/forge-gui/res/cardsfolder/d/dukhara_scavenger.txt @@ -3,6 +3,6 @@ ManaCost:5 B Types:Creature Crocodile PT:4/6 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put target artifact or creature card from your graveyard on top of your library. -SVar:TrigChange:AB$ ChangeZone | Cost$ 0 | TgtPrompt$ Choose target artifact or creature card in your graveyard | ValidTgts$ Artifact,Creature | TargetsWithDefinedController$ TriggeredCardController | Origin$ Graveyard | Destination$ Library +SVar:TrigChange:DB$ ChangeZone | TgtPrompt$ Choose target artifact or creature card in your graveyard | ValidTgts$ Artifact,Creature | TargetsWithDefinedController$ TriggeredCardController | Origin$ Graveyard | Destination$ Library SVar:Picture:http://www.wizards.com/global/images/magic/general/dukhara_scavenger.jpg Oracle:When Dukhara Scavenger enters the battlefield, you may put target artifact or creature card from your graveyard on top of your library. diff --git a/forge-gui/res/cardsfolder/k/kaervek_the_merciless.txt b/forge-gui/res/cardsfolder/k/kaervek_the_merciless.txt index d176d4b65f4..44800083277 100644 --- a/forge-gui/res/cardsfolder/k/kaervek_the_merciless.txt +++ b/forge-gui/res/cardsfolder/k/kaervek_the_merciless.txt @@ -3,7 +3,7 @@ ManaCost:5 B R Types:Legendary Creature Human Shaman PT:5/4 T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever an opponent casts a spell, CARDNAME deals damage to target creature or player equal to that spell's converted mana cost. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ X | References$ X +SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ X | References$ X SVar:X:TriggerCount$CastSACMC SVar:Picture:http://www.wizards.com/global/images/magic/general/kaervek_the_merciless.jpg -Oracle:Whenever an opponent casts a spell, Kaervek the Merciless deals damage to target creature or player equal to that spell's converted mana cost. +Oracle:Whenever an opponent casts a spell, Kaervek the Merciless deals damage to target creature or player equal to that spell's converted mana cost. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/k/kavu_climber.txt b/forge-gui/res/cardsfolder/k/kavu_climber.txt index 2f29441dba4..827693ed6b5 100644 --- a/forge-gui/res/cardsfolder/k/kavu_climber.txt +++ b/forge-gui/res/cardsfolder/k/kavu_climber.txt @@ -3,6 +3,6 @@ ManaCost:3 G G Types:Creature Kavu PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 +SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83175.jpg -Oracle:When Kavu Climber enters the battlefield, draw a card. +Oracle:When Kavu Climber enters the battlefield, draw a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/o/odric_lunarch_marshal.txt b/forge-gui/res/cardsfolder/o/odric_lunarch_marshal.txt index 3fcf5529a4f..9c27cc5ae83 100644 --- a/forge-gui/res/cardsfolder/o/odric_lunarch_marshal.txt +++ b/forge-gui/res/cardsfolder/o/odric_lunarch_marshal.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Legendary Creature Human Soldier PT:3/3 T:Mode$ Phase | Phase$ BeginCombat | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ At the beginning of each combat, creatures you control gain first strike until end of turn if a creature you control has first strike. The same is true for flying, deathtouch, double strike, haste, hexproof, indestructible, lifelink, menace, reach, skulk, trample, and vigilance. -SVar:TrigPump:AB$ PumpAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | KW$ First Strike & Flying & Deathtouch & Double Strike & Haste & Hexproof & Indestructible & Lifelink & Menace & Reach & Skulk & Trample & Vigilance | SharedKeywordsZone$ Battlefield | SharedRestrictions$ Creature.YouCtrl +SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ First Strike & Flying & Deathtouch & Double Strike & Haste & Hexproof & Indestructible & Lifelink & Menace & Reach & Skulk & Trample & Vigilance | SharedKeywordsZone$ Battlefield | SharedRestrictions$ Creature.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/odric_lunarch_marshal.jpg Oracle:At the beginning of each combat, creatures you control gain first strike until end of turn if a creature you control has first strike. The same is true for flying, deathtouch, double strike, haste, hexproof, indestructible, lifelink, menace, reach, skulk, trample, and vigilance. diff --git a/forge-gui/res/cardsfolder/w/witherscale_wurm.txt b/forge-gui/res/cardsfolder/w/witherscale_wurm.txt index 123f34d16da..1eef3981963 100644 --- a/forge-gui/res/cardsfolder/w/witherscale_wurm.txt +++ b/forge-gui/res/cardsfolder/w/witherscale_wurm.txt @@ -1,13 +1,13 @@ -Name:Witherscale Wurm -ManaCost:4 G G -Types:Creature Wurm -PT:9/9 -T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ TrigPumpAttacker | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, that creature gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) -T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigPumpBlocker | Secondary$ True | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, that creature gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigRemoveCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, remove all -1/-1 counters from it. -SVar:TrigPumpAttacker:AB$ Pump | Cost$ 0 | Defined$ TriggeredAttacker | KW$ Wither -SVar:TrigPumpBlocker:AB$ Pump | Cost$ 0 | Defined$ TriggeredBlocker | KW$ Wither -SVar:TrigRemoveCounter:AB$ RemoveCounter | Cost$ 0 | CounterType$ M1M1 | CounterNum$ All | References$ All -SVar:All:Count$CardCounters.M1M1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/witherscale_wurm.jpg -Oracle:Whenever Witherscale Wurm blocks or becomes blocked by a creature, that creature gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.)\nWhenever Witherscale Wurm deals damage to an opponent, remove all -1/-1 counters from it. +Name:Witherscale Wurm +ManaCost:4 G G +Types:Creature Wurm +PT:9/9 +T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ TrigPumpAttacker | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, that creature gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) +T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigPumpBlocker | Secondary$ True | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, that creature gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigRemoveCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, remove all -1/-1 counters from it. +SVar:TrigPumpAttacker:DB$ Pump | Defined$ TriggeredAttacker | KW$ Wither +SVar:TrigPumpBlocker:DB$ Pump | Defined$ TriggeredBlocker | KW$ Wither +SVar:TrigRemoveCounter:DB$ RemoveCounter | CounterType$ M1M1 | CounterNum$ All | References$ All +SVar:All:Count$CardCounters.M1M1 +SVar:Picture:http://www.wizards.com/global/images/magic/general/witherscale_wurm.jpg +Oracle:Whenever Witherscale Wurm blocks or becomes blocked by a creature, that creature gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.)\nWhenever Witherscale Wurm deals damage to an opponent, remove all -1/-1 counters from it. \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 51a7241a160..4f382016ee1 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -84,7 +84,16 @@ public class HumanPlay { // extra play check if (sa.isSpell() && !sa.canPlay()) { - return false; + // Exceptional cases where canPlay should not run + boolean exemptFromCheck = false; + if (source.hasSuspend() && p.getGame().isCardExiled(source) && source.getCounters(CounterType.TIME) == 0) { + // A card is about to ETB from Suspend + exemptFromCheck = true; + } + + if (!exemptFromCheck) { + return false; + } } if (flippedToCast && !castFaceDown) { diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index f3c9c2c947b..0d33f3278d1 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1506,7 +1506,6 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public boolean playSaFromPlayEffect(final SpellAbility tgtSA) { - tgtSA.setSVar("IsCastFromPlayEffect", "True"); return HumanPlay.playSpellAbility(this, player, tgtSA); }