mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
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 '!'
This commit is contained in:
@@ -20,6 +20,7 @@ package forge.ai;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import forge.game.staticability.StaticAbilityAssignCombatDamageAsUnblocked;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
@@ -540,7 +541,7 @@ public class AiAttackController {
|
|||||||
|
|
||||||
for (Card attacker : categorizedAttackers) {
|
for (Card attacker : categorizedAttackers) {
|
||||||
if (!CombatUtil.canBeBlocked(attacker, accountedBlockers, null)
|
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);
|
unblockedAttackers.add(attacker);
|
||||||
} else {
|
} else {
|
||||||
if (predictEvasion) {
|
if (predictEvasion) {
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ import forge.game.cost.Cost;
|
|||||||
import forge.game.keyword.Keyword;
|
import forge.game.keyword.Keyword;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
|
import forge.game.staticability.StaticAbilityAssignCombatDamageAsUnblocked;
|
||||||
import forge.game.staticability.StaticAbilityCantAttackBlock;
|
import forge.game.staticability.StaticAbilityCantAttackBlock;
|
||||||
import forge.game.trigger.Trigger;
|
import forge.game.trigger.Trigger;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
@@ -204,7 +205,7 @@ public class AiBlockController {
|
|||||||
}
|
}
|
||||||
blocker = ComputerUtilCard.getWorstCreatureAI(killingBlockers);
|
blocker = ComputerUtilCard.getWorstCreatureAI(killingBlockers);
|
||||||
// 2.Blockers that won't get destroyed
|
// 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)) {
|
&& !ComputerUtilCombat.attackerHasThreateningAfflict(attacker, ai)) {
|
||||||
blocker = ComputerUtilCard.getWorstCreatureAI(safeBlockers);
|
blocker = ComputerUtilCard.getWorstCreatureAI(safeBlockers);
|
||||||
// check whether it's better to block a creature without trample to absorb more damage
|
// 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)
|
|| other.hasKeyword(Keyword.TRAMPLE)
|
||||||
|| ComputerUtilCombat.attackerHasThreateningAfflict(other, ai)
|
|| ComputerUtilCombat.attackerHasThreateningAfflict(other, ai)
|
||||||
|| ComputerUtilCombat.canDestroyBlocker(ai, blocker, other, combat, false)
|
|| 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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -668,7 +669,7 @@ public class AiBlockController {
|
|||||||
Card attacker = attackers.get(0);
|
Card attacker = attackers.get(0);
|
||||||
|
|
||||||
if (CombatUtil.getMinNumBlockersForAttacker(attacker, combat.getDefenderPlayerByAttacker(attacker)) > 1
|
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)) {
|
|| ComputerUtilCombat.attackerHasThreateningAfflict(attacker, ai)) {
|
||||||
attackers.remove(0);
|
attackers.remove(0);
|
||||||
makeChumpBlocks(combat, attackers);
|
makeChumpBlocks(combat, attackers);
|
||||||
@@ -689,7 +690,7 @@ public class AiBlockController {
|
|||||||
}
|
}
|
||||||
if (other.getNetCombatDamage() >= damageAbsorbed
|
if (other.getNetCombatDamage() >= damageAbsorbed
|
||||||
&& !other.hasKeyword(Keyword.TRAMPLE)
|
&& !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)
|
&& !ComputerUtilCombat.attackerHasThreateningAfflict(other, ai)
|
||||||
&& CombatUtil.canBlock(other, blocker, combat)) {
|
&& CombatUtil.canBlock(other, blocker, combat)) {
|
||||||
combat.addBlocker(other, blocker);
|
combat.addBlocker(other, blocker);
|
||||||
@@ -756,7 +757,7 @@ public class AiBlockController {
|
|||||||
|
|
||||||
for (final Card attacker : tramplingAttackers) {
|
for (final Card attacker : tramplingAttackers) {
|
||||||
if (CombatUtil.getMinNumBlockersForAttacker(attacker, combat.getDefenderPlayerByAttacker(attacker)) > combat.getBlockers(attacker).size()
|
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.")) {
|
|| attacker.hasKeyword("CARDNAME can't be blocked unless all creatures defending player controls block it.")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ import forge.game.replacement.ReplacementLayer;
|
|||||||
import forge.game.replacement.ReplacementType;
|
import forge.game.replacement.ReplacementType;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.staticability.StaticAbility;
|
import forge.game.staticability.StaticAbility;
|
||||||
|
import forge.game.staticability.StaticAbilityAssignCombatDamageAsUnblocked;
|
||||||
import forge.game.staticability.StaticAbilityMustAttack;
|
import forge.game.staticability.StaticAbilityMustAttack;
|
||||||
import forge.game.trigger.Trigger;
|
import forge.game.trigger.Trigger;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
@@ -325,8 +326,7 @@ public class ComputerUtilCombat {
|
|||||||
final List<Card> blockers = combat.getBlockers(attacker);
|
final List<Card> blockers = combat.getBlockers(attacker);
|
||||||
|
|
||||||
if (blockers.size() == 0
|
if (blockers.size() == 0
|
||||||
|| attacker.hasKeyword("You may have CARDNAME assign its combat damage "
|
|| StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker)) {
|
||||||
+ "as though it weren't blocked.")) {
|
|
||||||
unblocked.add(attacker);
|
unblocked.add(attacker);
|
||||||
} else if (attacker.hasKeyword(Keyword.TRAMPLE)
|
} else if (attacker.hasKeyword(Keyword.TRAMPLE)
|
||||||
&& getAttack(attacker) > totalShieldDamage(attacker, blockers)) {
|
&& getAttack(attacker) > totalShieldDamage(attacker, blockers)) {
|
||||||
@@ -367,8 +367,7 @@ public class ComputerUtilCombat {
|
|||||||
final List<Card> blockers = combat.getBlockers(attacker);
|
final List<Card> blockers = combat.getBlockers(attacker);
|
||||||
|
|
||||||
if (blockers.size() == 0
|
if (blockers.size() == 0
|
||||||
|| attacker.hasKeyword("You may have CARDNAME assign its combat damage"
|
|| StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker)) {
|
||||||
+ " as though it weren't blocked.")) {
|
|
||||||
unblocked.add(attacker);
|
unblocked.add(attacker);
|
||||||
} else if (attacker.hasKeyword(Keyword.TRAMPLE)
|
} else if (attacker.hasKeyword(Keyword.TRAMPLE)
|
||||||
&& getAttack(attacker) > totalShieldDamage(attacker, blockers)) {
|
&& getAttack(attacker) > totalShieldDamage(attacker, blockers)) {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import forge.game.card.CounterEnumType;
|
|||||||
import forge.game.cost.CostPayEnergy;
|
import forge.game.cost.CostPayEnergy;
|
||||||
import forge.game.keyword.Keyword;
|
import forge.game.keyword.Keyword;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
|
import forge.game.staticability.StaticAbilityAssignCombatDamageAsUnblocked;
|
||||||
import forge.game.staticability.StaticAbilityMustAttack;
|
import forge.game.staticability.StaticAbilityMustAttack;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -62,7 +63,8 @@ public class CreatureEvaluator implements Function<Card, Integer> {
|
|||||||
if (c.hasKeyword("Unblockable")) {
|
if (c.hasKeyword("Unblockable")) {
|
||||||
value += addValue(power * 10, "unblockable");
|
value += addValue(power * 10, "unblockable");
|
||||||
} else {
|
} 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");
|
value += addValue(power * 6, "thorns");
|
||||||
}
|
}
|
||||||
if (c.hasKeyword(Keyword.FEAR)) {
|
if (c.hasKeyword(Keyword.FEAR)) {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import java.util.Arrays;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
@@ -122,6 +121,12 @@ public class AnimateAllEffect extends AnimateEffectBase {
|
|||||||
sVars.addAll(Arrays.asList(sa.getParam("sVars").split(",")));
|
sVars.addAll(Arrays.asList(sa.getParam("sVars").split(",")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static abilities to add to the animated being
|
||||||
|
final List<String> stAbs = Lists.newArrayList();
|
||||||
|
if (sa.hasParam("staticAbilities")) {
|
||||||
|
stAbs.addAll(Arrays.asList(sa.getParam("staticAbilities").split(",")));
|
||||||
|
}
|
||||||
|
|
||||||
Map<String, String> sVarsMap = Maps.newHashMap();
|
Map<String, String> sVarsMap = Maps.newHashMap();
|
||||||
for (final String s : sVars) {
|
for (final String s : sVars) {
|
||||||
sVarsMap.put(s, AbilityUtils.getSVar(sa, s));
|
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);
|
list = CardLists.getValidCards(list, valid, host.getController(), host, sa);
|
||||||
|
|
||||||
for (final Card c : list) {
|
for (final Card c : list) {
|
||||||
doAnimate(c, sa, power, toughness, types, removeTypes, finalColors,
|
doAnimate(c, sa, power, toughness, types, removeTypes, finalColors, keywords, removeKeywords,
|
||||||
keywords, removeKeywords, hiddenKeywords,
|
hiddenKeywords, abilities, triggers, replacements, stAbs, timestamp);
|
||||||
abilities, triggers, replacements, ImmutableList.of(),
|
|
||||||
timestamp);
|
|
||||||
|
|
||||||
// give sVars
|
// give sVars
|
||||||
if (!sVarsMap.isEmpty() ) {
|
if (!sVarsMap.isEmpty() ) {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import forge.game.staticability.StaticAbilityAssignCombatDamageAsUnblocked;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
@@ -797,10 +798,11 @@ public class Combat {
|
|||||||
final SpellAbility emptySA = new SpellAbility.EmptySa(attacker);
|
final SpellAbility emptySA = new SpellAbility.EmptySa(attacker);
|
||||||
|
|
||||||
boolean assignToPlayer = false;
|
boolean assignToPlayer = false;
|
||||||
if (attacker.hasKeyword("CARDNAME assigns its combat damage as though it weren't blocked.")) {
|
if (StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker, false)) {
|
||||||
assignToPlayer = true;
|
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,
|
assignToPlayer = assigningPlayer.getController().confirmAction(emptySA, PlayerActionConfirmMode.AlternativeDamageAssignment,
|
||||||
Localizer.getInstance().getMessage("lblAssignCombatDamageWerentBlocked",
|
Localizer.getInstance().getMessage("lblAssignCombatDamageWerentBlocked",
|
||||||
CardTranslation.getTranslatedName(attacker.getName())), null);
|
CardTranslation.getTranslatedName(attacker.getName())), null);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,5 +2,5 @@ Name:Deathcoil Wurm
|
|||||||
ManaCost:6 G G
|
ManaCost:6 G G
|
||||||
Types:Creature Wurm
|
Types:Creature Wurm
|
||||||
PT:7/6
|
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.
|
Oracle:You may have Deathcoil Wurm assign its combat damage as though it weren't blocked.
|
||||||
|
|||||||
@@ -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.
|
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:DBDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature to damage | TargetUnique$ True | AILogic$ PowerDmg | NumDmg$ X | DamageSource$ ParentTarget
|
||||||
SVar:X:ParentTargeted$CardPower
|
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."
|
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."
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ ManaCost:3 G G
|
|||||||
Types:Creature Beast
|
Types:Creature Beast
|
||||||
PT:6/8
|
PT:6/8
|
||||||
K:UpkeepCost:PutCardToLibFromGrave<2/-1/Card>
|
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
|
AI:RemoveDeck:All
|
||||||
DeckHas:Ability$Discard
|
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.
|
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.
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ ManaCost:3 G
|
|||||||
Types:Enchantment Aura
|
Types:Enchantment Aura
|
||||||
K:Flash
|
K:Flash
|
||||||
K:Enchant creature
|
K:Enchant creature
|
||||||
A:SP$ Attach | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select creature | AILogic$ Pump
|
A:SP$ Attach | ValidTgts$ 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.
|
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.
|
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.
|
||||||
|
|||||||
@@ -2,5 +2,5 @@ Name:Lone Wolf
|
|||||||
ManaCost:2 G
|
ManaCost:2 G
|
||||||
Types:Creature Wolf
|
Types:Creature Wolf
|
||||||
PT:2/2
|
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.
|
Oracle:You may have Lone Wolf assign its combat damage as though it weren't blocked.
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
Name:Outmaneuver
|
Name:Outmaneuver
|
||||||
ManaCost:X R
|
ManaCost:X R
|
||||||
Types:Instant
|
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
|
SVar:X:Count$xPaid
|
||||||
AI:RemoveDeck:All
|
AI:RemoveDeck:All
|
||||||
Oracle:X target blocked creatures assign their combat damage this turn as though they weren't blocked.
|
Oracle:X target blocked creatures assign their combat damage this turn as though they weren't blocked.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
Name:Predatory Focus
|
Name:Predatory Focus
|
||||||
ManaCost:3 G G
|
ManaCost:3 G G
|
||||||
Types:Sorcery
|
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.
|
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: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.
|
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.
|
Oracle:You may have creatures you control assign their combat damage this turn as though they weren't blocked.
|
||||||
|
|||||||
@@ -2,5 +2,5 @@ Name:Pride of Lions
|
|||||||
ManaCost:3 G G
|
ManaCost:3 G G
|
||||||
Types:Creature Cat
|
Types:Creature Cat
|
||||||
PT:4/4
|
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.
|
Oracle:You may have Pride of Lions assign its combat damage as though it weren't blocked.
|
||||||
|
|||||||
@@ -3,5 +3,7 @@ ManaCost:2 R/G R/G
|
|||||||
Types:Creature Human Warrior
|
Types:Creature Human Warrior
|
||||||
PT:4/3
|
PT:4/3
|
||||||
K:Trample
|
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."
|
Oracle:Trample\nCreatures you control with trample have "You may have this creature assign its combat damage as though it weren't blocked."
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ Name:Rhox
|
|||||||
ManaCost:4 G G
|
ManaCost:4 G G
|
||||||
Types:Creature Rhino Beast
|
Types:Creature Rhino Beast
|
||||||
PT:5/5
|
PT:5/5
|
||||||
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.
|
||||||
A:AB$ Regenerate | Cost$ 2 G | SpellDescription$ Regenerate CARDNAME.
|
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.)
|
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.)
|
||||||
|
|||||||
@@ -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.
|
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
|
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 | 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
|
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.
|
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.
|
||||||
|
|||||||
@@ -3,6 +3,5 @@ ManaCost:5 G G
|
|||||||
Types:Creature Beast
|
Types:Creature Beast
|
||||||
PT:7/4
|
PT:7/4
|
||||||
K:Hexproof
|
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.
|
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.
|
||||||
SVar:X:Count$Valid Card.Self+attacking
|
|
||||||
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.
|
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.
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ ManaCost:4 G G
|
|||||||
Types:Creature Phyrexian Beast
|
Types:Creature Phyrexian Beast
|
||||||
PT:3/4
|
PT:3/4
|
||||||
K:Infect
|
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.
|
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.
|
||||||
|
|||||||
@@ -2,5 +2,5 @@ Name:Thorn Elemental
|
|||||||
ManaCost:5 G G
|
ManaCost:5 G G
|
||||||
Types:Creature Elemental
|
Types:Creature Elemental
|
||||||
PT:7/7
|
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.
|
Oracle:You may have Thorn Elemental assign its combat damage as though it weren't blocked.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Name:Tornado Elemental
|
|||||||
ManaCost:5 G G
|
ManaCost:5 G G
|
||||||
Types:Creature Elemental
|
Types:Creature Elemental
|
||||||
PT:6/6
|
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.
|
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.
|
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.
|
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.
|
||||||
|
|||||||
11
forge-gui/res/cardsfolder/upcoming/imaryll_elfhame_elite.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/imaryll_elfhame_elite.txt
Normal file
@@ -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.
|
||||||
@@ -2,5 +2,5 @@ Name:Wolf Pack
|
|||||||
ManaCost:6 G G
|
ManaCost:6 G G
|
||||||
Types:Creature Wolf
|
Types:Creature Wolf
|
||||||
PT:7/6
|
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.
|
Oracle:You may have Wolf Pack assign its combat damage as though it weren't blocked.
|
||||||
|
|||||||
Reference in New Issue
Block a user