diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 508b3fd4453..695bb7c6755 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -199,6 +199,10 @@ public class AiAttackController { if ((attacker.getNetToughness() + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, null, combat, true)) <= 0) { return false; } + + if ("TRUE".equals(attacker.getSVar("HasAttackEffect"))) { + return true; + } final Player opp = this.defendingOpponent; if (ComputerUtilCombat.damageIfUnblocked(attacker, opp, combat, true) > 0) { @@ -918,7 +922,8 @@ public class AiAttackController { } boolean hasAttackEffect = attacker.getSVar("HasAttackEffect").equals("TRUE") || attacker.hasStartOfKeyword("Annihilator"); // is there a gain in attacking even when the blocker is not killed (Lifelink, Wither,...) - boolean hasCombatEffect = attacker.getSVar("HasCombatEffect").equals("TRUE"); + boolean hasCombatEffect = attacker.getSVar("HasCombatEffect").equals("TRUE") + || "Blocked".equals(attacker.getSVar("HasAttackEffect")); if (!hasCombatEffect) { for (String keyword : attacker.getKeywords()) { if (keyword.equals("Wither") || keyword.equals("Infect") || keyword.equals("Lifelink")) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index a1dc546178f..1c4cc84b580 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -1762,6 +1762,10 @@ public class ComputerUtilCombat { } } } + + if (attacker.getName().equals("Elven Warhounds")) { + return true; + } int flankingMagnitude = 0; if (attacker.hasKeyword("Flanking") && !blocker.hasKeyword("Flanking")) { diff --git a/forge-gui/res/cardsfolder/a/alley_grifters.txt b/forge-gui/res/cardsfolder/a/alley_grifters.txt index dc218e057ad..0cd26f0b0da 100644 --- a/forge-gui/res/cardsfolder/a/alley_grifters.txt +++ b/forge-gui/res/cardsfolder/a/alley_grifters.txt @@ -3,6 +3,7 @@ ManaCost:1 B B Types:Creature Human Mercenary PT:2/2 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ DefendingPlayer | NumCards$ 1 | Mode$ TgtChoose +SVar:TrigDiscard:AB$ Discard | Cost$ 0 | Defined$ DefendingPlayer | NumCards$ 1 | Mode$ TgtChoose +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/alley_grifters.jpg Oracle:Whenever Alley Grifters becomes blocked, defending player discards a card. diff --git a/forge-gui/res/cardsfolder/c/chambered_nautilus.txt b/forge-gui/res/cardsfolder/c/chambered_nautilus.txt index 507a265023d..d4a39afeb56 100644 --- a/forge-gui/res/cardsfolder/c/chambered_nautilus.txt +++ b/forge-gui/res/cardsfolder/c/chambered_nautilus.txt @@ -3,6 +3,7 @@ ManaCost:2 U Types:Creature Nautilus Beast PT:2/2 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 +SVar:TrigDraw:AB$ Draw | Cost$ 0 | Defined$ You | NumCards$ 1 +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/chambered_nautilus.jpg Oracle:Whenever Chambered Nautilus becomes blocked, you may draw a card. diff --git a/forge-gui/res/cardsfolder/c/corrupt_court_official.txt b/forge-gui/res/cardsfolder/c/corrupt_court_official.txt index e1244369aa2..a74a8385acb 100644 --- a/forge-gui/res/cardsfolder/c/corrupt_court_official.txt +++ b/forge-gui/res/cardsfolder/c/corrupt_court_official.txt @@ -4,5 +4,6 @@ Types:Creature Human Advisor PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target opponent discards a card. SVar:TrigDiscard:AB$ Discard | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | NumCards$ 1 | Mode$ TgtChoose +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupt_court_official.jpg Oracle:When Corrupt Court Official enters the battlefield, target opponent discards a card. diff --git a/forge-gui/res/cardsfolder/d/deepwood_tantiv.txt b/forge-gui/res/cardsfolder/d/deepwood_tantiv.txt index 9d2a298d3aa..7cabe713ebc 100644 --- a/forge-gui/res/cardsfolder/d/deepwood_tantiv.txt +++ b/forge-gui/res/cardsfolder/d/deepwood_tantiv.txt @@ -3,6 +3,7 @@ ManaCost:4 G Types:Creature Beast PT:2/4 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigGain | TriggerDescription$ Whenever CARDNAME becomes blocked, you gain 2 life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 +SVar:TrigGain:AB$ GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/deepwood_tantiv.jpg Oracle:Whenever Deepwood Tantiv becomes blocked, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/d/drelnoch.txt b/forge-gui/res/cardsfolder/d/drelnoch.txt index 787f2a147a4..cc6bc73c95e 100644 --- a/forge-gui/res/cardsfolder/d/drelnoch.txt +++ b/forge-gui/res/cardsfolder/d/drelnoch.txt @@ -3,6 +3,7 @@ ManaCost:4 U Types:Creature Yeti Mutant PT:3/3 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw two cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 2 +SVar:TrigDraw:AB$ Draw | Cost$ 0 | Defined$ You | NumCards$ 2 +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/drelnoch.jpg Oracle:Whenever Drelnoch becomes blocked, you may draw two cards. diff --git a/forge-gui/res/cardsfolder/k/karplusan_wolverine.txt b/forge-gui/res/cardsfolder/k/karplusan_wolverine.txt index 844a9cdba69..437f625c464 100644 --- a/forge-gui/res/cardsfolder/k/karplusan_wolverine.txt +++ b/forge-gui/res/cardsfolder/k/karplusan_wolverine.txt @@ -3,6 +3,7 @@ ManaCost:R Types:Snow Creature Wolverine Beast PT:1/1 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME becomes blocked, you may have it deal 1 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 1 +SVar:TrigDealDamage:AB$ DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 1 +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/karplusan_wolverine.jpg Oracle:Whenever Karplusan Wolverine becomes blocked, you may have it deal 1 damage to target creature or player. diff --git a/forge-gui/res/cardsfolder/q/quagmire_lamprey.txt b/forge-gui/res/cardsfolder/q/quagmire_lamprey.txt index 3d4f14f2317..ee4778c1e9e 100644 --- a/forge-gui/res/cardsfolder/q/quagmire_lamprey.txt +++ b/forge-gui/res/cardsfolder/q/quagmire_lamprey.txt @@ -4,5 +4,6 @@ Types:Creature Fish PT:1/1 T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, put a -1/-1 counter on that creature. SVar:TrigPutCounter:AB$ PutCounter | Cost$ 0 | Defined$ TriggeredBlocker | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/quagmire_lamprey.jpg Oracle:Whenever Quagmire Lamprey becomes blocked by a creature, put a -1/-1 counter on that creature. diff --git a/forge-gui/res/cardsfolder/r/rust_scarab.txt b/forge-gui/res/cardsfolder/r/rust_scarab.txt index 1c229d84bc7..6063166151e 100644 --- a/forge-gui/res/cardsfolder/r/rust_scarab.txt +++ b/forge-gui/res/cardsfolder/r/rust_scarab.txt @@ -4,5 +4,6 @@ Types:Creature Insect PT:4/5 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME becomes blocked, you may destroy target artifact or enchantment defending player controls. SVar:TrigDestroy:AB$ Destroy | Cost$ 0 | ValidTgts$ Artifact.DefenderCtrl,Enchantment.DefenderCtrl | TgtPrompt$ Select target artifact or enchantment defending player control +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/rust_scarab.jpg Oracle:Whenever Rust Scarab becomes blocked, you may destroy target artifact or enchantment defending player controls. diff --git a/forge-gui/res/cardsfolder/s/sacred_prey.txt b/forge-gui/res/cardsfolder/s/sacred_prey.txt index 9dc6e399ffc..53b773f966f 100644 --- a/forge-gui/res/cardsfolder/s/sacred_prey.txt +++ b/forge-gui/res/cardsfolder/s/sacred_prey.txt @@ -3,6 +3,7 @@ ManaCost:G Types:Creature Horse PT:1/1 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigGain | TriggerDescription$ Whenever CARDNAME becomes blocked, you gain 1 life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 +SVar:TrigGain:AB$ GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/sacred_prey.jpg Oracle:Whenever Sacred Prey becomes blocked, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/s/saprazzan_heir.txt b/forge-gui/res/cardsfolder/s/saprazzan_heir.txt index 006f18a633f..6919a962544 100644 --- a/forge-gui/res/cardsfolder/s/saprazzan_heir.txt +++ b/forge-gui/res/cardsfolder/s/saprazzan_heir.txt @@ -3,6 +3,7 @@ ManaCost:1 U Types:Creature Merfolk PT:1/1 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw three cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 3 +SVar:TrigDraw:AB$ Draw | Cost$ 0 | Defined$ You | NumCards$ 3 +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_heir.jpg Oracle:Whenever Saprazzan Heir becomes blocked, you may draw three cards. diff --git a/forge-gui/res/cardsfolder/s/slate_street_ruffian.txt b/forge-gui/res/cardsfolder/s/slate_street_ruffian.txt index 3e1bc1bfa56..7a0db023ea2 100644 --- a/forge-gui/res/cardsfolder/s/slate_street_ruffian.txt +++ b/forge-gui/res/cardsfolder/s/slate_street_ruffian.txt @@ -3,6 +3,7 @@ ManaCost:2 B Types:Creature Human Warrior PT:2/2 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ DefendingPlayer | NumCards$ 1 | Mode$ TgtChoose +SVar:TrigDiscard:AB$ Discard | Cost$ 0 | Defined$ DefendingPlayer | NumCards$ 1 | Mode$ TgtChoose +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/slate_street_ruffian.jpg Oracle:Whenever Slate Street Ruffian becomes blocked, defending player discards a card. diff --git a/forge-gui/res/cardsfolder/s/slith_strider.txt b/forge-gui/res/cardsfolder/s/slith_strider.txt index c62d262fbc1..337ce9ee85b 100644 --- a/forge-gui/res/cardsfolder/s/slith_strider.txt +++ b/forge-gui/res/cardsfolder/s/slith_strider.txt @@ -3,8 +3,9 @@ ManaCost:1 U U Types:Creature Slith PT:1/1 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 +SVar:TrigDraw:AB$ Draw | Cost$ 0 | Defined$ You | NumCards$ 1 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put a +1/+1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:TrigPutCounter:AB$ PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/slith_strider.jpg Oracle:Whenever Slith Strider becomes blocked, draw a card.\nWhenever Slith Strider deals combat damage to a player, put a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/t/the_wretched.txt b/forge-gui/res/cardsfolder/t/the_wretched.txt index ddd17a0bb00..0ee2191e4bc 100644 --- a/forge-gui/res/cardsfolder/t/the_wretched.txt +++ b/forge-gui/res/cardsfolder/t/the_wretched.txt @@ -4,5 +4,6 @@ Types:Creature Demon PT:2/5 T:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ You | Execute$ TrigGainControl | TriggerZones$ Battlefield | TriggerDescription$ At end of combat, gain control of all creatures blocking CARDNAME for as long as you control CARDNAME. SVar:TrigGainControl:AB$ GainControl | Cost$ 0 | AllValid$ Card.blockingSource | LoseControl$ LoseControl,LeavesPlay +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/the_wretched.jpg Oracle:At end of combat, gain control of all creatures blocking The Wretched for as long as you control The Wretched. diff --git a/forge-gui/res/cardsfolder/t/thresher_beast.txt b/forge-gui/res/cardsfolder/t/thresher_beast.txt index acb6da6fc81..f5f9a0fe3b5 100644 --- a/forge-gui/res/cardsfolder/t/thresher_beast.txt +++ b/forge-gui/res/cardsfolder/t/thresher_beast.txt @@ -4,5 +4,6 @@ Types:Creature Beast PT:4/4 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player sacrifices a land. SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | SacValid$ Land | Defined$ DefendingPlayer | ChangeNum$ 1 +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/thresher_beast.jpg Oracle:Whenever Thresher Beast becomes blocked, defending player sacrifices a land. diff --git a/forge-gui/res/cardsfolder/t/tolarian_entrancer.txt b/forge-gui/res/cardsfolder/t/tolarian_entrancer.txt index 91c381696fa..c144bd9a6d0 100644 --- a/forge-gui/res/cardsfolder/t/tolarian_entrancer.txt +++ b/forge-gui/res/cardsfolder/t/tolarian_entrancer.txt @@ -5,5 +5,6 @@ PT:1/1 T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, gain control of that creature at end of combat. SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigGainControl | TriggerDescription$ Gain control of blocking creature. SVar:TrigGainControl:AB$ GainControl | Cost$ 0 | Defined$ TriggeredBlocker | NewController$ TriggeredAttackerController +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/tolarian_entrancer.jpg 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/v/vedalken_ghoul.txt b/forge-gui/res/cardsfolder/v/vedalken_ghoul.txt index 75f7741795d..b6074d2f24a 100644 --- a/forge-gui/res/cardsfolder/v/vedalken_ghoul.txt +++ b/forge-gui/res/cardsfolder/v/vedalken_ghoul.txt @@ -3,6 +3,7 @@ ManaCost:U B Types:Creature Vedalken Zombie PT:1/1 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDrain | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player loses 4 life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | Defined$ DefendingPlayer | LifeAmount$ 4 +SVar:TrigDrain:AB$ LoseLife | Cost$ 0 | Defined$ DefendingPlayer | LifeAmount$ 4 +SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_ghoul.jpg Oracle:Whenever Vedalken Ghoul becomes blocked, defending player loses 4 life.