From d7eff45cd1565636824a6db4d2686f59145873df Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Tue, 5 Jul 2022 14:23:40 -0400 Subject: [PATCH] GN3: Imaryll, Elfhame Elite (+ refactor another quasi-keyword -> static) (#1033) * AI stuff refactor keyword to check StaticAbilityAssignCombatDamageAsUnblocked * ComputerUtilCombat refactor keyword to check StaticAbilityAssignCombatDamageAsUnblocked * CreatureEvaluator refactor keyword to check StaticAbilityAssignCombatDamageAsUnblocked * Combat.java refactor keyword to check StaticAbilityAssignCombatDamageAsUnblocked * AnimateAllEffect.resolve support "staticAbilities" for garruk_savage_herald.txt * imaryll_elfhame_elite.txt * StaticAbilityAssignCombatDamageAsUnblocked.java * refactor old cards * AnimateAllEffect remove no longer needed * AiBlockController.makeGoodBlocks restore lost '!' --- .../java/forge/ai/AiAttackController.java | 3 +- .../main/java/forge/ai/AiBlockController.java | 11 +++-- .../java/forge/ai/ComputerUtilCombat.java | 7 ++- .../main/java/forge/ai/CreatureEvaluator.java | 4 +- .../ability/effects/AnimateAllEffect.java | 13 +++-- .../main/java/forge/game/combat/Combat.java | 6 ++- ...cAbilityAssignCombatDamageAsUnblocked.java | 47 +++++++++++++++++++ .../res/cardsfolder/d/deathcoil_wurm.txt | 2 +- .../cardsfolder/g/garruk_savage_herald.txt | 3 +- forge-gui/res/cardsfolder/g/gurzigost.txt | 3 +- .../res/cardsfolder/i/indomitable_might.txt | 5 +- forge-gui/res/cardsfolder/l/lone_wolf.txt | 2 +- forge-gui/res/cardsfolder/o/outmaneuver.txt | 3 +- .../res/cardsfolder/p/predatory_focus.txt | 4 +- .../res/cardsfolder/p/pride_of_lions.txt | 2 +- .../res/cardsfolder/p/proud_wildbonder.txt | 4 +- forge-gui/res/cardsfolder/r/rhox.txt | 4 +- .../cardsfolder/r/ruxa_patient_professor.txt | 2 +- .../res/cardsfolder/s/siege_behemoth.txt | 3 +- forge-gui/res/cardsfolder/s/spinebiter.txt | 2 +- .../res/cardsfolder/t/thorn_elemental.txt | 2 +- .../res/cardsfolder/t/tornado_elemental.txt | 2 +- .../upcoming/imaryll_elfhame_elite.txt | 11 +++++ forge-gui/res/cardsfolder/w/wolf_pack.txt | 2 +- 24 files changed, 109 insertions(+), 38 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/staticability/StaticAbilityAssignCombatDamageAsUnblocked.java create mode 100644 forge-gui/res/cardsfolder/upcoming/imaryll_elfhame_elite.txt diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 64424620d11..dfa47c071e7 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -20,6 +20,7 @@ package forge.ai; import java.util.ArrayList; import java.util.List; +import forge.game.staticability.StaticAbilityAssignCombatDamageAsUnblocked; import org.apache.commons.lang3.tuple.Pair; import com.google.common.base.Predicate; @@ -540,7 +541,7 @@ public class AiAttackController { for (Card attacker : categorizedAttackers) { if (!CombatUtil.canBeBlocked(attacker, accountedBlockers, null) - || attacker.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.")) { + || StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker)) { unblockedAttackers.add(attacker); } else { if (predictEvasion) { diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index de5ac94e04b..81e001f1c41 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -42,6 +42,7 @@ import forge.game.cost.Cost; import forge.game.keyword.Keyword; import forge.game.player.Player; import forge.game.spellability.SpellAbility; +import forge.game.staticability.StaticAbilityAssignCombatDamageAsUnblocked; import forge.game.staticability.StaticAbilityCantAttackBlock; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; @@ -204,7 +205,7 @@ public class AiBlockController { } blocker = ComputerUtilCard.getWorstCreatureAI(killingBlockers); // 2.Blockers that won't get destroyed - } else if (!attacker.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.") + } else if (!StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker) && !ComputerUtilCombat.attackerHasThreateningAfflict(attacker, ai)) { blocker = ComputerUtilCard.getWorstCreatureAI(safeBlockers); // check whether it's better to block a creature without trample to absorb more damage @@ -215,7 +216,7 @@ public class AiBlockController { || other.hasKeyword(Keyword.TRAMPLE) || ComputerUtilCombat.attackerHasThreateningAfflict(other, ai) || ComputerUtilCombat.canDestroyBlocker(ai, blocker, other, combat, false) - || other.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.")) { + || StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(other)) { continue; } @@ -668,7 +669,7 @@ public class AiBlockController { Card attacker = attackers.get(0); if (CombatUtil.getMinNumBlockersForAttacker(attacker, combat.getDefenderPlayerByAttacker(attacker)) > 1 - || attacker.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.") + || StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker) || ComputerUtilCombat.attackerHasThreateningAfflict(attacker, ai)) { attackers.remove(0); makeChumpBlocks(combat, attackers); @@ -689,7 +690,7 @@ public class AiBlockController { } if (other.getNetCombatDamage() >= damageAbsorbed && !other.hasKeyword(Keyword.TRAMPLE) - && !other.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.") + && !StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(other) && !ComputerUtilCombat.attackerHasThreateningAfflict(other, ai) && CombatUtil.canBlock(other, blocker, combat)) { combat.addBlocker(other, blocker); @@ -756,7 +757,7 @@ public class AiBlockController { for (final Card attacker : tramplingAttackers) { if (CombatUtil.getMinNumBlockersForAttacker(attacker, combat.getDefenderPlayerByAttacker(attacker)) > combat.getBlockers(attacker).size() - || attacker.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.") + || StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker) || attacker.hasKeyword("CARDNAME can't be blocked unless all creatures defending player controls block it.")) { continue; } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 5fd871ed612..15c0a89f1b9 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -48,6 +48,7 @@ import forge.game.replacement.ReplacementLayer; import forge.game.replacement.ReplacementType; import forge.game.spellability.SpellAbility; import forge.game.staticability.StaticAbility; +import forge.game.staticability.StaticAbilityAssignCombatDamageAsUnblocked; import forge.game.staticability.StaticAbilityMustAttack; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; @@ -325,8 +326,7 @@ public class ComputerUtilCombat { final List blockers = combat.getBlockers(attacker); if (blockers.size() == 0 - || attacker.hasKeyword("You may have CARDNAME assign its combat damage " - + "as though it weren't blocked.")) { + || StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker)) { unblocked.add(attacker); } else if (attacker.hasKeyword(Keyword.TRAMPLE) && getAttack(attacker) > totalShieldDamage(attacker, blockers)) { @@ -367,8 +367,7 @@ public class ComputerUtilCombat { final List blockers = combat.getBlockers(attacker); if (blockers.size() == 0 - || attacker.hasKeyword("You may have CARDNAME assign its combat damage" - + " as though it weren't blocked.")) { + || StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker)) { unblocked.add(attacker); } else if (attacker.hasKeyword(Keyword.TRAMPLE) && getAttack(attacker) > totalShieldDamage(attacker, blockers)) { diff --git a/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java b/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java index 00485a66921..a9a58304bd4 100644 --- a/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java +++ b/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java @@ -10,6 +10,7 @@ import forge.game.card.CounterEnumType; import forge.game.cost.CostPayEnergy; import forge.game.keyword.Keyword; import forge.game.spellability.SpellAbility; +import forge.game.staticability.StaticAbilityAssignCombatDamageAsUnblocked; import forge.game.staticability.StaticAbilityMustAttack; import java.util.List; @@ -62,7 +63,8 @@ public class CreatureEvaluator implements Function { if (c.hasKeyword("Unblockable")) { value += addValue(power * 10, "unblockable"); } else { - if (c.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.")) { + if (StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(c) + || StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(c, false)) { value += addValue(power * 6, "thorns"); } if (c.hasKeyword(Keyword.FEAR)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java index d79bb6d4502..815164b2521 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java @@ -4,7 +4,6 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -122,6 +121,12 @@ public class AnimateAllEffect extends AnimateEffectBase { sVars.addAll(Arrays.asList(sa.getParam("sVars").split(","))); } + // static abilities to add to the animated being + final List stAbs = Lists.newArrayList(); + if (sa.hasParam("staticAbilities")) { + stAbs.addAll(Arrays.asList(sa.getParam("staticAbilities").split(","))); + } + Map sVarsMap = Maps.newHashMap(); for (final String s : sVars) { sVarsMap.put(s, AbilityUtils.getSVar(sa, s)); @@ -140,10 +145,8 @@ public class AnimateAllEffect extends AnimateEffectBase { list = CardLists.getValidCards(list, valid, host.getController(), host, sa); for (final Card c : list) { - doAnimate(c, sa, power, toughness, types, removeTypes, finalColors, - keywords, removeKeywords, hiddenKeywords, - abilities, triggers, replacements, ImmutableList.of(), - timestamp); + doAnimate(c, sa, power, toughness, types, removeTypes, finalColors, keywords, removeKeywords, + hiddenKeywords, abilities, triggers, replacements, stAbs, timestamp); // give sVars if (!sVarsMap.isEmpty() ) { diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 57bc21386e7..119396cab27 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import forge.game.staticability.StaticAbilityAssignCombatDamageAsUnblocked; import org.apache.commons.lang3.tuple.Pair; import com.google.common.base.Function; @@ -797,10 +798,11 @@ public class Combat { final SpellAbility emptySA = new SpellAbility.EmptySa(attacker); boolean assignToPlayer = false; - if (attacker.hasKeyword("CARDNAME assigns its combat damage as though it weren't blocked.")) { + if (StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker, false)) { assignToPlayer = true; } - if (!assignToPlayer && attacker.getGame().getCombat().isBlocked(attacker) && attacker.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.")) { + if (!assignToPlayer && attacker.getGame().getCombat().isBlocked(attacker) + && StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker)) { assignToPlayer = assigningPlayer.getController().confirmAction(emptySA, PlayerActionConfirmMode.AlternativeDamageAssignment, Localizer.getInstance().getMessage("lblAssignCombatDamageWerentBlocked", CardTranslation.getTranslatedName(attacker.getName())), null); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityAssignCombatDamageAsUnblocked.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityAssignCombatDamageAsUnblocked.java new file mode 100644 index 00000000000..490da6e38b2 --- /dev/null +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityAssignCombatDamageAsUnblocked.java @@ -0,0 +1,47 @@ +package forge.game.staticability; + +import forge.game.Game; +import forge.game.card.Card; +import forge.game.zone.ZoneType; + +public class StaticAbilityAssignCombatDamageAsUnblocked { + + static String MODE = "AssignCombatDamageAsUnblocked"; + + public static boolean assignCombatDamageAsUnblocked(final Card card) { + return assignCombatDamageAsUnblocked(card, true); + } + + public static boolean assignCombatDamageAsUnblocked(final Card card, final boolean optional) { + final Game game = card.getGame(); + for (final Card ca : game.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) { + for (final StaticAbility stAb : ca.getStaticAbilities()) { + if (!stAb.getParam("Mode").equals(MODE) || stAb.isSuppressed() || !stAb.checkConditions()) { + continue; + } + + if (stAb.hasParam("Optional")) { + if (!optional) { + continue; + } + } else { + if (optional) { + continue; + } + } + + if (applyAssignCombatDamageAsUnblocked(stAb, card)) { + return true; + } + } + } + return false; + } + + public static boolean applyAssignCombatDamageAsUnblocked(final StaticAbility stAb, final Card card) { + if (!stAb.matchesValidParam("ValidCard", card)) { + return false; + } + return true; + } +} diff --git a/forge-gui/res/cardsfolder/d/deathcoil_wurm.txt b/forge-gui/res/cardsfolder/d/deathcoil_wurm.txt index 8b9071bf0e9..4d665ac968c 100644 --- a/forge-gui/res/cardsfolder/d/deathcoil_wurm.txt +++ b/forge-gui/res/cardsfolder/d/deathcoil_wurm.txt @@ -2,5 +2,5 @@ Name:Deathcoil Wurm ManaCost:6 G G Types:Creature Wurm PT:7/6 -K:You may have CARDNAME assign its combat damage as though it weren't blocked. +S:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Card.Self | Optional$ True | Description$ You may have CARDNAME assign its combat damage as though it weren't blocked. Oracle:You may have Deathcoil Wurm assign its combat damage as though it weren't blocked. diff --git a/forge-gui/res/cardsfolder/g/garruk_savage_herald.txt b/forge-gui/res/cardsfolder/g/garruk_savage_herald.txt index eed86c1f525..cd45ec22783 100644 --- a/forge-gui/res/cardsfolder/g/garruk_savage_herald.txt +++ b/forge-gui/res/cardsfolder/g/garruk_savage_herald.txt @@ -6,5 +6,6 @@ A:AB$ Dig | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | DigNum$ 1 | Revea A:AB$ Pump | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SubAbility$ DBDamage | AILogic$ PowerDmg | SpellDescription$ Target creature you control deals damage equal to its power to another target creature. SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature to damage | TargetUnique$ True | AILogic$ PowerDmg | NumDmg$ X | DamageSource$ ParentTarget SVar:X:ParentTargeted$CardPower -A:AB$ PumpAll | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.YouCtrl | KW$ HIDDEN You may have CARDNAME assign its combat damage as though it weren't blocked. | SpellDescription$ Until end of turn, creatures you control gain "You may have this creature assign its combat damage as though it weren't blocked." +A:AB$ AnimateAll | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.YouCtrl | staticAbilities$ Static | SpellDescription$ Until end of turn, creatures you control gain "You may have this creature assign its combat damage as though it weren't blocked." +SVar:Static:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Card.Self | Optional$ True | Description$ You may have this creature assign its combat damage as though it weren't blocked. Oracle:[+1]: Reveal the top card of your library. If it's a creature card, put it into your hand. Otherwise, put it on the bottom of your library.\n[-2]: Target creature you control deals damage equal to its power to another target creature.\n[-7]: Until end of turn, creatures you control gain "You may have this creature assign its combat damage as though it weren't blocked." diff --git a/forge-gui/res/cardsfolder/g/gurzigost.txt b/forge-gui/res/cardsfolder/g/gurzigost.txt index 0c780d73bcf..8f661c7fed3 100644 --- a/forge-gui/res/cardsfolder/g/gurzigost.txt +++ b/forge-gui/res/cardsfolder/g/gurzigost.txt @@ -3,7 +3,8 @@ ManaCost:3 G G Types:Creature Beast PT:6/8 K:UpkeepCost:PutCardToLibFromGrave<2/-1/Card> -A:AB$ Pump | Cost$ G G Discard<1/Card> | Defined$ Self | KW$ HIDDEN You may have CARDNAME assign its combat damage as though it weren't blocked. | SpellDescription$ You may have CARDNAME assign its combat damage this turn as though it weren't blocked. +A:AB$ Effect | Cost$ G G Discard<1/Card> | StaticAbilities$ Static | SpellDescription$ You may have CARDNAME assign its combat damage this turn as though it weren't blocked. +SVar:Static:Mode$ AssignCombatDamageAsUnblocked | EffectZone$ Command | ValidCard$ Card.EffectSource | Optional$ True | Description$ You may have EFFECTSOURCE assign its combat damage this turn as though it weren't blocked. AI:RemoveDeck:All DeckHas:Ability$Discard Oracle:At the beginning of your upkeep, sacrifice Gurzigost unless you put two cards from your graveyard on the bottom of your library.\n{G}{G}, Discard a card: You may have Gurzigost assign its combat damage this turn as though it weren't blocked. diff --git a/forge-gui/res/cardsfolder/i/indomitable_might.txt b/forge-gui/res/cardsfolder/i/indomitable_might.txt index ed3061dcecc..da489a31865 100644 --- a/forge-gui/res/cardsfolder/i/indomitable_might.txt +++ b/forge-gui/res/cardsfolder/i/indomitable_might.txt @@ -3,6 +3,7 @@ ManaCost:3 G Types:Enchantment Aura K:Flash K:Enchant creature -A:SP$ Attach | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 3 | AddHiddenKeyword$ You may have CARDNAME assign its combat damage as though it weren't blocked. | Description$ Enchanted creature gets +3/+3. Enchanted creature's controller may have it assign its combat damage as though it weren't blocked. +A:SP$ Attach | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 3 | Description$ Enchanted creature gets +3/+3. +S:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Creature.EnchantedBy | Optional$ True | Description$ Enchanted creature's controller may have it assign its combat damage as though it weren't blocked. Oracle:Flash\nEnchant creature\nEnchanted creature gets +3/+3.\nEnchanted creature's controller may have it assign its combat damage as though it weren't blocked. diff --git a/forge-gui/res/cardsfolder/l/lone_wolf.txt b/forge-gui/res/cardsfolder/l/lone_wolf.txt index 39ff4e5a990..d64d09bc6a9 100644 --- a/forge-gui/res/cardsfolder/l/lone_wolf.txt +++ b/forge-gui/res/cardsfolder/l/lone_wolf.txt @@ -2,5 +2,5 @@ Name:Lone Wolf ManaCost:2 G Types:Creature Wolf PT:2/2 -K:You may have CARDNAME assign its combat damage as though it weren't blocked. +S:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Card.Self | Optional$ True | Description$ You may have CARDNAME assign its combat damage as though it weren't blocked. Oracle:You may have Lone Wolf assign its combat damage as though it weren't blocked. diff --git a/forge-gui/res/cardsfolder/o/outmaneuver.txt b/forge-gui/res/cardsfolder/o/outmaneuver.txt index c07120e901f..fddc46cb0bf 100644 --- a/forge-gui/res/cardsfolder/o/outmaneuver.txt +++ b/forge-gui/res/cardsfolder/o/outmaneuver.txt @@ -1,7 +1,8 @@ Name:Outmaneuver ManaCost:X R Types:Instant -A:SP$ Pump | Cost$ X R | KW$ HIDDEN CARDNAME assigns its combat damage as though it weren't blocked. | TargetMin$ X | TargetMax$ X | ValidTgts$ Creature.blocked | TgtPrompt$ Select X target blocked creatures | StackDescription$ X target blocked creatures [{c:Targeted}] assign their combat damage this turn as though they weren't blocked. | SpellDescription$ X target blocked creatures assign their combat damage this turn as though they weren't blocked. +A:SP$ Effect | StaticAbilities$ Static | TargetMin$ X | TargetMax$ X | ValidTgts$ Creature.blocked | TgtPrompt$ Select X target blocked creatures | RememberObjects$ Targeted | SpellDescription$ X target blocked creatures assign their combat damage this turn as though they weren't blocked. +SVar:Static:Mode$ AssignCombatDamageAsUnblocked | EffectZone$ Command | ValidCard$ Card.IsRemembered | Description$ These creatures assign their combat damage this turn as though they weren't blocked. SVar:X:Count$xPaid AI:RemoveDeck:All Oracle:X target blocked creatures assign their combat damage this turn as though they weren't blocked. diff --git a/forge-gui/res/cardsfolder/p/predatory_focus.txt b/forge-gui/res/cardsfolder/p/predatory_focus.txt index 60b8198c505..447a537b6ab 100644 --- a/forge-gui/res/cardsfolder/p/predatory_focus.txt +++ b/forge-gui/res/cardsfolder/p/predatory_focus.txt @@ -1,6 +1,6 @@ Name:Predatory Focus ManaCost:3 G G Types:Sorcery -A:SP$ Effect | Cost$ 3 G G | Name$ Predatory Focus Effect | StaticAbilities$ KWPump | AILogic$ Evasion | SpellDescription$ You may have creatures you control assign their combat damage this turn as though they weren't blocked. -SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddHiddenKeyword$ You may have CARDNAME assign its combat damage as though it weren't blocked. | Description$ You may have creatures you control assign their combat damage this turn as though they weren't blocked. +A:SP$ Effect | AILogic$ Evasion | StaticAbilities$ Static | SpellDescription$ You may have creatures you control assign their combat damage this turn as though they weren't blocked. +SVar:Static:Mode$ AssignCombatDamageAsUnblocked | EffectZone$ Command | ValidCard$ Creature.YouCtrl | Optional$ True | Description$ You may have creatures you control assign their combat damage this turn as though they weren't blocked. Oracle:You may have creatures you control assign their combat damage this turn as though they weren't blocked. diff --git a/forge-gui/res/cardsfolder/p/pride_of_lions.txt b/forge-gui/res/cardsfolder/p/pride_of_lions.txt index e33c083ab45..5be9bb4db27 100644 --- a/forge-gui/res/cardsfolder/p/pride_of_lions.txt +++ b/forge-gui/res/cardsfolder/p/pride_of_lions.txt @@ -2,5 +2,5 @@ Name:Pride of Lions ManaCost:3 G G Types:Creature Cat PT:4/4 -K:You may have CARDNAME assign its combat damage as though it weren't blocked. +S:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Card.Self | Optional$ True | Description$ You may have CARDNAME assign its combat damage as though it weren't blocked. Oracle:You may have Pride of Lions assign its combat damage as though it weren't blocked. diff --git a/forge-gui/res/cardsfolder/p/proud_wildbonder.txt b/forge-gui/res/cardsfolder/p/proud_wildbonder.txt index 509ba6ab126..c442e54b845 100644 --- a/forge-gui/res/cardsfolder/p/proud_wildbonder.txt +++ b/forge-gui/res/cardsfolder/p/proud_wildbonder.txt @@ -3,5 +3,7 @@ ManaCost:2 R/G R/G Types:Creature Human Warrior PT:4/3 K:Trample -S:Mode$ Continuous | Affected$ Creature.YouCtrl+withTrample | AddKeyword$ You may have CARDNAME assign its combat damage as though it weren't blocked. | Description$ Creatures you control with trample have "You may have this creature assign its combat damage as though it weren't blocked." +S:Mode$ Continuous | Affected$ Creature.YouCtrl+withTrample | AddStaticAbility$ Static | Description$ Creatures you control with trample have "You may have this creature assign its combat damage as though it weren't blocked." +SVar:Static:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Card.Self | Optional$ True | Description$ You may have this creature assign its combat damage as though it weren't blocked. +DeckHints:Keyword$Trample Oracle:Trample\nCreatures you control with trample have "You may have this creature assign its combat damage as though it weren't blocked." diff --git a/forge-gui/res/cardsfolder/r/rhox.txt b/forge-gui/res/cardsfolder/r/rhox.txt index 43a6d3299b8..935b280f027 100644 --- a/forge-gui/res/cardsfolder/r/rhox.txt +++ b/forge-gui/res/cardsfolder/r/rhox.txt @@ -2,6 +2,6 @@ Name:Rhox ManaCost:4 G G Types:Creature Rhino Beast PT:5/5 -K:You may have CARDNAME assign its combat damage as though it weren't blocked. -A:AB$ Regenerate | Cost$ 2 G | SpellDescription$ Regenerate CARDNAME. +S:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Card.Self | Optional$ True | Description$ You may have CARDNAME assign its combat damage as though it weren't blocked. +A:AB$ Regenerate | Cost$ 2 G | SpellDescription$ Regenerate CARDNAME. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) Oracle:You may have Rhox assign its combat damage as though it weren't blocked.\n{2}{G}: Regenerate Rhox. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) diff --git a/forge-gui/res/cardsfolder/r/ruxa_patient_professor.txt b/forge-gui/res/cardsfolder/r/ruxa_patient_professor.txt index ed5677893a6..532862c6ed9 100644 --- a/forge-gui/res/cardsfolder/r/ruxa_patient_professor.txt +++ b/forge-gui/res/cardsfolder/r/ruxa_patient_professor.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, return target creature card with no abilities from your graveyard to your hand. SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.NoAbilities+YouOwn S:Mode$ Continuous | Affected$ Creature.NoAbilities+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures you control with no abilities get +1/+1. -S:Mode$ Continuous | Affected$ Creature.NoAbilities+YouCtrl | AddHiddenKeyword$ You may have CARDNAME assign its combat damage as though it weren't blocked. | Description$ You may have creatures you control with no abilities assign their combat damage as though they weren't blocked. +S:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Creature.NoAbilities+YouCtrl | Optional$ True | Description$ You may have creatures you control with no abilities assign their combat damage as though they weren't blocked. SVar:HasAttackEffect:TRUE Oracle:Whenever Ruxa, Patient Professor enters the battlefield or attacks, return target creature card with no abilities from your graveyard to your hand.\nCreatures you control with no abilities get +1/+1.\nYou may have creatures you control with no abilities assign their combat damage as though they weren't blocked. diff --git a/forge-gui/res/cardsfolder/s/siege_behemoth.txt b/forge-gui/res/cardsfolder/s/siege_behemoth.txt index f4be0da8332..f33d831d977 100644 --- a/forge-gui/res/cardsfolder/s/siege_behemoth.txt +++ b/forge-gui/res/cardsfolder/s/siege_behemoth.txt @@ -3,6 +3,5 @@ ManaCost:5 G G Types:Creature Beast PT:7/4 K:Hexproof -S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ You may have CARDNAME assign its combat damage as though it weren't blocked. | CheckSVar$ X | SVarCompare$ EQ1 | Description$ As long as CARDNAME is attacking, for each creature you control, you may have that creature assign its combat damage as though it weren't blocked. -SVar:X:Count$Valid Card.Self+attacking +S:Mode$ AssignCombatDamageAsUnblocked | IsPresent$ Card.Self+attacking | ValidCard$ Creature.YouCtrl | Optional$ True | Description$ As long as CARDNAME is attacking, for each creature you control, you may have that creature assign its combat damage as though it weren't blocked. Oracle:Hexproof\nAs long as Siege Behemoth is attacking, for each creature you control, you may have that creature assign its combat damage as though it weren't blocked. diff --git a/forge-gui/res/cardsfolder/s/spinebiter.txt b/forge-gui/res/cardsfolder/s/spinebiter.txt index ba7f2a8dec7..84b4536f460 100644 --- a/forge-gui/res/cardsfolder/s/spinebiter.txt +++ b/forge-gui/res/cardsfolder/s/spinebiter.txt @@ -3,5 +3,5 @@ ManaCost:4 G G Types:Creature Phyrexian Beast PT:3/4 K:Infect -K:You may have CARDNAME assign its combat damage as though it weren't blocked. +S:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Card.Self | Optional$ True | Description$ You may have CARDNAME assign its combat damage as though it weren't blocked. Oracle:Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.)\nYou may have Spinebiter assign its combat damage as though it weren't blocked. diff --git a/forge-gui/res/cardsfolder/t/thorn_elemental.txt b/forge-gui/res/cardsfolder/t/thorn_elemental.txt index cfa8f5e82b6..01d19bc2c43 100644 --- a/forge-gui/res/cardsfolder/t/thorn_elemental.txt +++ b/forge-gui/res/cardsfolder/t/thorn_elemental.txt @@ -2,5 +2,5 @@ Name:Thorn Elemental ManaCost:5 G G Types:Creature Elemental PT:7/7 -K:You may have CARDNAME assign its combat damage as though it weren't blocked. +S:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Card.Self | Optional$ True | Description$ You may have CARDNAME assign its combat damage as though it weren't blocked. Oracle:You may have Thorn Elemental assign its combat damage as though it weren't blocked. diff --git a/forge-gui/res/cardsfolder/t/tornado_elemental.txt b/forge-gui/res/cardsfolder/t/tornado_elemental.txt index 3737c7d1cb6..5c13a55cca6 100644 --- a/forge-gui/res/cardsfolder/t/tornado_elemental.txt +++ b/forge-gui/res/cardsfolder/t/tornado_elemental.txt @@ -2,7 +2,7 @@ Name:Tornado Elemental ManaCost:5 G G Types:Creature Elemental PT:6/6 -K:You may have CARDNAME assign its combat damage as though it weren't blocked. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamageAllFlyers | TriggerDescription$ When CARDNAME enters the battlefield, it deals 6 damage to each creature with flying. SVar:TrigDamageAllFlyers:DB$ DamageAll | ValidCards$ Creature.withFlying | NumDmg$ 6 | ValidDescription$ each creature with flying. +S:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Card.Self | Optional$ True | Description$ You may have CARDNAME assign its combat damage as though it weren't blocked. Oracle:When Tornado Elemental enters the battlefield, it deals 6 damage to each creature with flying.\nYou may have Tornado Elemental assign its combat damage as though it weren't blocked. diff --git a/forge-gui/res/cardsfolder/upcoming/imaryll_elfhame_elite.txt b/forge-gui/res/cardsfolder/upcoming/imaryll_elfhame_elite.txt new file mode 100644 index 00000000000..539379103cb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/imaryll_elfhame_elite.txt @@ -0,0 +1,11 @@ +Name:Imaryll, Elfhame Elite +ManaCost:2 G G +Types:Legendary Creature Elf Warrior +PT:3/3 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +X/+X until end of turn, where X is the number of other Elves you control. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ X | NumDef$ X +SVar:X:Count$Valid Elf.YouCtrl+Other +SVar:HasAttackEffect:TRUE +S:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Card.Self | Optional$ True | Description$ You may have NICKNAME assign its combat damage as though it weren't blocked. +DeckNeeds:Type$Elf +Oracle:Whenever Imaryll, Elfhame Elite attacks, it gets +X/+X until end of turn, where X is the number of other Elves you control.\nYou may have Imaryll assign its combat damage as though it weren't blocked. diff --git a/forge-gui/res/cardsfolder/w/wolf_pack.txt b/forge-gui/res/cardsfolder/w/wolf_pack.txt index 2540889fccc..2f6075569a1 100644 --- a/forge-gui/res/cardsfolder/w/wolf_pack.txt +++ b/forge-gui/res/cardsfolder/w/wolf_pack.txt @@ -2,5 +2,5 @@ Name:Wolf Pack ManaCost:6 G G Types:Creature Wolf PT:7/6 -K:You may have CARDNAME assign its combat damage as though it weren't blocked. +S:Mode$ AssignCombatDamageAsUnblocked | ValidCard$ Card.Self | Optional$ True | Description$ You may have CARDNAME assign its combat damage as though it weren't blocked. Oracle:You may have Wolf Pack assign its combat damage as though it weren't blocked.