mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
Merge branch 'Card-Forge:master' into master
This commit is contained in:
@@ -54,6 +54,7 @@ import forge.game.replacement.ReplacementLayer;
|
||||
import forge.game.replacement.ReplacementType;
|
||||
import forge.game.spellability.*;
|
||||
import forge.game.staticability.StaticAbility;
|
||||
import forge.game.staticability.StaticAbilityDisableTriggers;
|
||||
import forge.game.staticability.StaticAbilityMustTarget;
|
||||
import forge.game.trigger.Trigger;
|
||||
import forge.game.trigger.TriggerType;
|
||||
@@ -262,11 +263,6 @@ public class AiController {
|
||||
}
|
||||
}
|
||||
|
||||
if (card.isCreature()
|
||||
&& game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCreatureETBTriggers)) {
|
||||
return api == null;
|
||||
}
|
||||
|
||||
boolean rightapi = false;
|
||||
|
||||
// Trigger play improvements
|
||||
@@ -281,6 +277,12 @@ public class AiController {
|
||||
continue;
|
||||
}
|
||||
|
||||
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(tr.getHostCard());
|
||||
runParams.put(AbilityKey.Destination, ZoneType.Battlefield.name());
|
||||
if (StaticAbilityDisableTriggers.disabled(game, tr, runParams)) {
|
||||
return api == null;
|
||||
}
|
||||
|
||||
if (tr.hasParam("ValidCard")) {
|
||||
String validCard = tr.getParam("ValidCard");
|
||||
if (!validCard.contains("Self")) {
|
||||
@@ -1646,7 +1648,8 @@ public class AiController {
|
||||
}
|
||||
|
||||
private final SpellAbility getSpellAbilityToPlay() {
|
||||
final CardCollection cards = ComputerUtilAbility.getAvailableCards(game, player);
|
||||
CardCollection cards = ComputerUtilAbility.getAvailableCards(game, player);
|
||||
cards = ComputerUtilCard.dedupeCards(cards);
|
||||
List<SpellAbility> saList = Lists.newArrayList();
|
||||
|
||||
SpellAbility top = null;
|
||||
|
||||
@@ -33,6 +33,7 @@ import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
import forge.ai.AiCardMemory.MemorySet;
|
||||
import forge.ai.ability.ChooseGenericEffectAi;
|
||||
import forge.ai.ability.ProtectAi;
|
||||
import forge.ai.ability.TokenAi;
|
||||
@@ -449,14 +450,27 @@ public class ComputerUtil {
|
||||
}
|
||||
|
||||
// try everything when about to die
|
||||
if (game.getPhaseHandler().getPhase().equals(PhaseType.COMBAT_DECLARE_BLOCKERS)
|
||||
&& ComputerUtilCombat.lifeInSeriousDanger(ai, game.getCombat())) {
|
||||
final CardCollection nonCreatures = CardLists.getNotType(typeList, "Creature");
|
||||
if (!nonCreatures.isEmpty()) {
|
||||
return ComputerUtilCard.getWorstAI(nonCreatures);
|
||||
} else if (!typeList.isEmpty()) {
|
||||
// TODO make sure survival is possible in case the creature blocks a trampler
|
||||
return ComputerUtilCard.getWorstAI(typeList);
|
||||
if (game.getPhaseHandler().getPhase().equals(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
|
||||
// in some rare situations the call to lifeInDanger could lead us back here, this will prevent an overflow
|
||||
boolean preventReturn = sa != null && sa.isManaAbility();
|
||||
if (preventReturn) {
|
||||
AiCardMemory.rememberCard(ai, sa.getHostCard(), MemorySet.HELD_MANA_SOURCES_FOR_NEXT_SPELL);
|
||||
}
|
||||
|
||||
boolean danger = ComputerUtilCombat.lifeInSeriousDanger(ai, game.getCombat());
|
||||
|
||||
if (preventReturn) {
|
||||
AiCardMemory.forgetCard(ai, sa.getHostCard(), MemorySet.HELD_MANA_SOURCES_FOR_NEXT_SPELL);
|
||||
}
|
||||
|
||||
if (danger) {
|
||||
final CardCollection nonCreatures = CardLists.getNotType(typeList, "Creature");
|
||||
if (!nonCreatures.isEmpty()) {
|
||||
return ComputerUtilCard.getWorstAI(nonCreatures);
|
||||
} else if (!typeList.isEmpty()) {
|
||||
// TODO make sure survival is possible in case the creature blocks a trampler
|
||||
return ComputerUtilCard.getWorstAI(typeList);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -609,7 +623,7 @@ public class ComputerUtil {
|
||||
int count = 0;
|
||||
|
||||
while (count < amount) {
|
||||
Card prefCard = getCardPreference(ai, source, "SacCost", typeList);
|
||||
Card prefCard = getCardPreference(ai, source, "SacCost", typeList, ability);
|
||||
if (prefCard == null) {
|
||||
prefCard = ComputerUtilCard.getWorstAI(typeList);
|
||||
}
|
||||
|
||||
@@ -2052,6 +2052,28 @@ public class ComputerUtilCard {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static CardCollection dedupeCards(CardCollection cc) {
|
||||
if (cc.size() <= 1) {
|
||||
return cc;
|
||||
}
|
||||
CardCollection deduped = new CardCollection();
|
||||
for (Card c : cc) {
|
||||
boolean unique = true;
|
||||
if (c.isInZone(ZoneType.Hand)) {
|
||||
for (Card d : deduped) {
|
||||
if (d.isInZone(ZoneType.Hand) && d.getOwner().equals(c.getOwner()) && d.getName().equals(c.getName())) {
|
||||
unique = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (unique) {
|
||||
deduped.add(c);
|
||||
}
|
||||
}
|
||||
return deduped;
|
||||
}
|
||||
|
||||
// Determine if the AI has an AI:RemoveDeck:All or an AI:RemoveDeck:Random hint specified.
|
||||
// Includes a NPE guard on getRules() which might otherwise be tripped on some cards (e.g. tokens).
|
||||
public static boolean isCardRemAIDeck(final Card card) {
|
||||
|
||||
@@ -200,8 +200,8 @@ public class ComputerUtilCombat {
|
||||
return 0;
|
||||
}
|
||||
|
||||
damage += predictPowerBonusOfAttacker(attacker, null, combat, withoutAbilities);
|
||||
if (!attacker.hasKeyword(Keyword.INFECT)) {
|
||||
damage += predictPowerBonusOfAttacker(attacker, null, combat, withoutAbilities);
|
||||
sum = predictDamageTo(attacked, damage, attacker, true);
|
||||
if (attacker.hasDoubleStrike()) {
|
||||
sum *= 2;
|
||||
@@ -328,10 +328,10 @@ public class ComputerUtilCombat {
|
||||
if (blockers.size() == 0
|
||||
|| StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker)) {
|
||||
unblocked.add(attacker);
|
||||
} else if (attacker.hasKeyword(Keyword.TRAMPLE)
|
||||
&& getAttack(attacker) > totalShieldDamage(attacker, blockers)) {
|
||||
if (!attacker.hasKeyword(Keyword.INFECT)) {
|
||||
damage += getAttack(attacker) - totalShieldDamage(attacker, blockers);
|
||||
} else if (attacker.hasKeyword(Keyword.TRAMPLE) && !attacker.hasKeyword(Keyword.INFECT)) {
|
||||
int dmgAfterShielding = getAttack(attacker) - totalShieldDamage(attacker, blockers);
|
||||
if (dmgAfterShielding > 0) {
|
||||
damage += dmgAfterShielding;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -369,13 +369,14 @@ public class ComputerUtilCombat {
|
||||
if (blockers.size() == 0
|
||||
|| StaticAbilityAssignCombatDamageAsUnblocked.assignCombatDamageAsUnblocked(attacker)) {
|
||||
unblocked.add(attacker);
|
||||
} else if (attacker.hasKeyword(Keyword.TRAMPLE)
|
||||
&& getAttack(attacker) > totalShieldDamage(attacker, blockers)) {
|
||||
} else if (attacker.hasKeyword(Keyword.TRAMPLE)) {
|
||||
int trampleDamage = getAttack(attacker) - totalShieldDamage(attacker, blockers);
|
||||
if (attacker.hasKeyword(Keyword.INFECT)) {
|
||||
poison += trampleDamage;
|
||||
if (trampleDamage > 0) {
|
||||
if (attacker.hasKeyword(Keyword.INFECT)) {
|
||||
poison += trampleDamage;
|
||||
}
|
||||
poison += predictPoisonFromTriggers(attacker, ai, trampleDamage);
|
||||
}
|
||||
poison += predictPoisonFromTriggers(attacker, ai, trampleDamage);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -686,7 +687,7 @@ public class ComputerUtilCombat {
|
||||
final int defenderDefense = blocker.getLethalDamage() - flankingMagnitude + defBushidoMagnitude;
|
||||
|
||||
return defenderDefense;
|
||||
} // shieldDamage
|
||||
}
|
||||
|
||||
// For AI safety measures like Regeneration
|
||||
/**
|
||||
@@ -2475,11 +2476,13 @@ public class ComputerUtilCombat {
|
||||
}
|
||||
}
|
||||
poison += pd;
|
||||
if (pd > 0 && attacker.hasDoubleStrike()) {
|
||||
poison += pd;
|
||||
}
|
||||
// TODO: Predict replacement effects for counters (doubled, reduced, additional counters, etc.)
|
||||
}
|
||||
// intern toxic effect
|
||||
poison += attacker.getKeywordMagnitude(Keyword.TOXIC);
|
||||
}
|
||||
if (attacker.hasDoubleStrike()) {
|
||||
poison *= 2;
|
||||
}
|
||||
return poison;
|
||||
}
|
||||
|
||||
@@ -234,7 +234,7 @@ public class ComputerUtilCost {
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean checkForManaSacrificeCost(final Player ai, final Cost cost, final Card source, final SpellAbility sourceAbility, final boolean effect) {
|
||||
public static boolean checkForManaSacrificeCost(final Player ai, final Cost cost, final SpellAbility sourceAbility, final boolean effect) {
|
||||
// TODO cheating via autopay can still happen, need to get the real ai player from controlledBy
|
||||
if (cost == null || !ai.isAI()) {
|
||||
return true;
|
||||
@@ -247,18 +247,17 @@ public class ComputerUtilCost {
|
||||
exclude.addAll(AiCardMemory.getMemorySet(ai, MemorySet.PAYS_SAC_COST));
|
||||
}
|
||||
if (part.payCostFromSource()) {
|
||||
list.add(source);
|
||||
list.add(sourceAbility.getHostCard());
|
||||
} else if (part.getType().equals("OriginalHost")) {
|
||||
list.add(sourceAbility.getOriginalHost());
|
||||
} else if (part.getAmount().equals("All")) {
|
||||
// Does the AI want to use Sacrifice All?
|
||||
return false;
|
||||
} else {
|
||||
final String amount = part.getAmount();
|
||||
Integer c = part.convertAmount();
|
||||
|
||||
if (c == null) {
|
||||
c = AbilityUtils.calculateAmount(source, amount, sourceAbility);
|
||||
c = part.getAbilityAmount(sourceAbility);
|
||||
}
|
||||
final AiController aic = ((PlayerControllerAi)ai.getController()).getAi();
|
||||
CardCollectionView choices = aic.chooseSacrificeType(part.getType(), sourceAbility, effect, c, exclude);
|
||||
@@ -636,7 +635,7 @@ public class ComputerUtilCost {
|
||||
|
||||
return ComputerUtilMana.canPayManaCost(sa, player, extraManaNeeded, effect)
|
||||
&& CostPayment.canPayAdditionalCosts(sa.getPayCosts(), sa);
|
||||
} // canPayCost()
|
||||
}
|
||||
|
||||
public static boolean willPayUnlessCost(SpellAbility sa, Player payer, Cost cost, boolean alreadyPaid, FCollectionView<Player> payers) {
|
||||
final Card source = sa.getHostCard();
|
||||
|
||||
@@ -316,10 +316,6 @@ public class ComputerUtilMana {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!ComputerUtilCost.checkForManaSacrificeCost(ai, ma.getPayCosts(), ma.getHostCard(), ma, ma.isTrigger())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (sa.getApi() == ApiType.Animate) {
|
||||
// For abilities like Genju of the Cedars, make sure that we're not activating the aura ability by tapping the enchanted card for mana
|
||||
if (saHost.isAura() && "Enchanted".equals(sa.getParam("Defined"))
|
||||
@@ -381,9 +377,15 @@ public class ComputerUtilMana {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (canPayShardWithSpellAbility(toPay, ai, paymentChoice, sa, checkCosts, cost.getXManaCostPaidByColor())) {
|
||||
return paymentChoice;
|
||||
if (!canPayShardWithSpellAbility(toPay, ai, paymentChoice, sa, checkCosts, cost.getXManaCostPaidByColor())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!ComputerUtilCost.checkForManaSacrificeCost(ai, ma.getPayCosts(), ma, ma.isTrigger())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return paymentChoice;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -114,10 +114,11 @@ public class CreatureEvaluator implements Function<Card, Integer> {
|
||||
value += addValue(power * 15, "infect");
|
||||
}
|
||||
else if (c.hasKeyword(Keyword.WITHER)) {
|
||||
value += addValue(power * 10, "Wither");
|
||||
value += addValue(power * 10, "wither");
|
||||
}
|
||||
value += addValue(c.getKeywordMagnitude(Keyword.RAMPAGE), "rampage");
|
||||
value += addValue(c.getKeywordMagnitude(Keyword.TOXIC) * 5, "toxic");
|
||||
value += addValue(c.getKeywordMagnitude(Keyword.AFFLICT) * 5, "afflict");
|
||||
value += addValue(c.getKeywordMagnitude(Keyword.RAMPAGE), "rampage");
|
||||
}
|
||||
|
||||
value += addValue(c.getKeywordMagnitude(Keyword.ANNIHILATOR) * 50, "eldrazi");
|
||||
|
||||
@@ -1066,9 +1066,7 @@ public abstract class GameState {
|
||||
}
|
||||
top.addMergedCard(bottom);
|
||||
|
||||
if (top.getMutatedTimestamp() != -1) {
|
||||
top.removeCloneState(top.getMutatedTimestamp());
|
||||
}
|
||||
top.removeMutatedStates();
|
||||
|
||||
final long ts = game.getNextTimestamp();
|
||||
top.setMutatedTimestamp(ts);
|
||||
|
||||
@@ -73,7 +73,7 @@ public class MultiTargetSelector {
|
||||
|
||||
public void reset() {
|
||||
for (PossibleTargetSelector selector : selectors) {
|
||||
selector.reset();
|
||||
selector.reset();
|
||||
}
|
||||
currentIndex = -1;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package forge.ai.simulation;
|
||||
|
||||
import forge.util.MyRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
@@ -10,6 +9,7 @@ import java.util.Set;
|
||||
import forge.ai.AiPlayDecision;
|
||||
import forge.ai.ComputerUtil;
|
||||
import forge.ai.ComputerUtilAbility;
|
||||
import forge.ai.ComputerUtilCard;
|
||||
import forge.ai.ComputerUtilCost;
|
||||
import forge.ai.ability.ChangeZoneAi;
|
||||
import forge.ai.ability.ExploreAi;
|
||||
@@ -66,25 +66,14 @@ public class SpellAbilityPicker {
|
||||
|
||||
private List<SpellAbility> getCandidateSpellsAndAbilities() {
|
||||
CardCollection cards = ComputerUtilAbility.getAvailableCards(game, player);
|
||||
cards = ComputerUtilCard.dedupeCards(cards);
|
||||
List<SpellAbility> all = ComputerUtilAbility.getSpellAbilities(cards, player);
|
||||
HashMap<String, Card> landsDeDupe = new HashMap<>();
|
||||
List<SpellAbility> candidateSAs = ComputerUtilAbility.getOriginalAndAltCostAbilities(all, player);
|
||||
int writeIndex = 0;
|
||||
for (int i = 0; i < candidateSAs.size(); i++) {
|
||||
SpellAbility sa = candidateSAs.get(i);
|
||||
for (SpellAbility sa : candidateSAs) {
|
||||
if (sa.isManaAbility()) {
|
||||
continue;
|
||||
}
|
||||
// Skip identical lands.
|
||||
if (sa instanceof LandAbility) {
|
||||
Card land = sa.getHostCard();
|
||||
Card previousLand = landsDeDupe.get(sa.getHostCard().getName());
|
||||
if (previousLand != null && previousLand.getZone() == land.getZone() &&
|
||||
previousLand.getOwner() == land.getOwner()) {
|
||||
continue;
|
||||
}
|
||||
landsDeDupe.put(land.getName(), land);
|
||||
}
|
||||
sa.setActivatingPlayer(player, true);
|
||||
|
||||
AiPlayDecision opinion = canPlayAndPayForSim(sa);
|
||||
|
||||
@@ -579,6 +579,12 @@ public class GameAction {
|
||||
c.setZone(zoneTo);
|
||||
}
|
||||
|
||||
if (fromBattlefield) {
|
||||
// order here is important so it doesn't unattach cards that might have returned from UntilHostLeavesPlay
|
||||
unattachCardLeavingBattlefield(copied);
|
||||
c.runLeavesPlayCommands();
|
||||
}
|
||||
|
||||
// do ETB counters after zone add
|
||||
if (!suppress && toBattlefield && !copied.getEtbCounters().isEmpty()) {
|
||||
game.getTriggerHandler().registerActiveTrigger(copied, false);
|
||||
@@ -706,7 +712,6 @@ public class GameAction {
|
||||
|
||||
copied.setState(CardStateName.Original, true);
|
||||
}
|
||||
unattachCardLeavingBattlefield(copied);
|
||||
} else if (toBattlefield) {
|
||||
for (Player p : game.getPlayers()) {
|
||||
copied.getDamageHistory().setNotAttackedSinceLastUpkeepOf(p);
|
||||
@@ -982,9 +987,15 @@ public class GameAction {
|
||||
if (c.isInZone(ZoneType.Stack)) {
|
||||
c.getGame().getStack().remove(c);
|
||||
}
|
||||
|
||||
final Zone z = c.getZone();
|
||||
// in some corner cases there's no zone yet (copied spell that failed targeting)
|
||||
if (c.getZone() != null) {
|
||||
c.getZone().remove(c);
|
||||
if (z != null) {
|
||||
z.remove(c);
|
||||
if (z.is(ZoneType.Battlefield)) {
|
||||
c.runLeavesPlayCommands();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// CR 603.6c other players LTB triggers should work
|
||||
@@ -1045,20 +1056,13 @@ public class GameAction {
|
||||
}
|
||||
|
||||
game.getTriggerHandler().suppressMode(TriggerType.ChangesZone);
|
||||
for (Player p : game.getPlayers()) {
|
||||
((PlayerZoneBattlefield) p.getZone(ZoneType.Battlefield)).setTriggers(false);
|
||||
}
|
||||
|
||||
final int tiz = c.getTurnInZone();
|
||||
|
||||
oldBattlefield.remove(c);
|
||||
newBattlefield.add(c);
|
||||
c.setSickness(true);
|
||||
if (game.getPhaseHandler().inCombat()) {
|
||||
game.getCombat().removeFromCombat(c);
|
||||
}
|
||||
|
||||
c.setTurnInZone(tiz);
|
||||
c.setCameUnderControlSinceLastUpkeep(true);
|
||||
|
||||
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(c);
|
||||
@@ -1066,9 +1070,6 @@ public class GameAction {
|
||||
game.getTriggerHandler().runTrigger(TriggerType.ChangesController, runParams, false);
|
||||
|
||||
game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
|
||||
for (Player p : game.getPlayers()) {
|
||||
((PlayerZoneBattlefield) p.getZone(ZoneType.Battlefield)).setTriggers(true);
|
||||
}
|
||||
c.runChangeControllerCommands();
|
||||
}
|
||||
|
||||
|
||||
@@ -25,8 +25,6 @@ public enum GlobalRuleChange {
|
||||
alwaysWither ("All damage is dealt as though its source had wither."),
|
||||
attackerChoosesBlockers ("The attacking player chooses how each creature blocks each combat."),
|
||||
manaBurn ("A player losing unspent mana causes that player to lose that much life."),
|
||||
noCreatureETBTriggers ("Creatures entering the battlefield don't cause abilities to trigger."),
|
||||
noCreatureDyingTriggers ("Creatures dying don't cause abilities to trigger."),
|
||||
noNight ("It can't become night."),
|
||||
/* onlyOneAttackerATurn ("No more than one creature can attack each turn."), */
|
||||
onlyOneAttackerACombat ("No more than one creature can attack each combat."),
|
||||
|
||||
@@ -31,6 +31,7 @@ public enum AbilityKey {
|
||||
CastSA("CastSA"),
|
||||
Card("Card"),
|
||||
Cards("Cards"),
|
||||
CardsFiltered("CardsFiltered"),
|
||||
CardLKI("CardLKI"),
|
||||
Cause("Cause"),
|
||||
Causer("Causer"),
|
||||
|
||||
@@ -118,12 +118,10 @@ public abstract class SpellAbilityEffect {
|
||||
int amount = AbilityUtils.calculateAmount(sa.getHostCard(), svar, sa);
|
||||
sb.append(" ");
|
||||
sb.append(TextUtil.enclosedParen(TextUtil.concatNoSpace(svar,"=",String.valueOf(amount))));
|
||||
} else {
|
||||
if (sa.costHasManaX()) {
|
||||
int amount = sa.getXManaCostPaid() == null ? 0 : sa.getXManaCostPaid();
|
||||
sb.append(" ");
|
||||
sb.append(TextUtil.enclosedParen(TextUtil.concatNoSpace("X","=",String.valueOf(amount))));
|
||||
}
|
||||
} else if (sa.costHasManaX()) {
|
||||
int amount = sa.getXManaCostPaid() == null ? 0 : sa.getXManaCostPaid();
|
||||
sb.append(" ");
|
||||
sb.append(TextUtil.enclosedParen(TextUtil.concatNoSpace("X","=",String.valueOf(amount))));
|
||||
}
|
||||
|
||||
String currentName = CardTranslation.getTranslatedName(sa.getHostCard().getName());
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.util.List;
|
||||
import forge.game.Game;
|
||||
import forge.game.GameEntity;
|
||||
import forge.game.GameEntityCounterTable;
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.ability.SpellAbilityEffect;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardLists;
|
||||
@@ -14,6 +15,7 @@ import forge.game.player.Player;
|
||||
import forge.game.player.PlayerController;
|
||||
import forge.game.player.PlayerPredicates;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.trigger.TriggerType;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.Localizer;
|
||||
import forge.util.collect.FCollection;
|
||||
@@ -52,5 +54,7 @@ public class CountersProliferateEffect extends SpellAbilityEffect {
|
||||
}
|
||||
}
|
||||
table.replaceCounterEffect(game, sa, true);
|
||||
|
||||
game.getTriggerHandler().runTrigger(TriggerType.Proliferate, AbilityKey.mapFromPlayer(p), false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,9 +66,7 @@ public class MutateEffect extends SpellAbilityEffect {
|
||||
}
|
||||
|
||||
// First remove current mutated states
|
||||
if (target.getMutatedTimestamp() != -1) {
|
||||
target.removeCloneState(target.getMutatedTimestamp());
|
||||
}
|
||||
target.removeMutatedStates();
|
||||
// Now add all abilities from bottom cards
|
||||
final Long ts = game.getNextTimestamp();
|
||||
target.setMutatedTimestamp(ts);
|
||||
|
||||
@@ -1240,7 +1240,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
}
|
||||
|
||||
public final void removeMutatedStates() {
|
||||
if (getMutatedTimestamp() != -1) {
|
||||
if (isMutated()) {
|
||||
removeCloneState(getMutatedTimestamp());
|
||||
}
|
||||
}
|
||||
@@ -2251,7 +2251,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
|| keyword.startsWith("Fabricate") || keyword.startsWith("Soulshift") || keyword.startsWith("Bushido")
|
||||
|| keyword.startsWith("Crew") || keyword.startsWith("Tribute") || keyword.startsWith("Absorb")
|
||||
|| keyword.startsWith("Graft") || keyword.startsWith("Fading") || keyword.startsWith("Vanishing")
|
||||
|| keyword.startsWith("Afterlife") || keyword.startsWith("Hideaway")
|
||||
|| keyword.startsWith("Afterlife") || keyword.startsWith("Hideaway") || keyword.startsWith("Toxic")
|
||||
|| keyword.startsWith("Afflict") || keyword.startsWith ("Poisonous") || keyword.startsWith("Rampage")
|
||||
|| keyword.startsWith("Renown") || keyword.startsWith("Annihilator") || keyword.startsWith("Devour")) {
|
||||
final String[] k = keyword.split(":");
|
||||
@@ -5801,6 +5801,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
||||
}
|
||||
return getCastSA().isMadness();
|
||||
}
|
||||
|
||||
public boolean wasDiscarded() { return discarded; }
|
||||
public void setDiscarded(boolean state) { discarded = state; }
|
||||
|
||||
|
||||
@@ -88,7 +88,6 @@ public class CostExert extends CostPartWithList {
|
||||
typeList = CardLists.getValidCards(typeList, this.getType().split(";"), payer, source, ability);
|
||||
final int amount = this.getAbilityAmount(ability);
|
||||
|
||||
|
||||
return needsAnnoucement || (typeList.size() >= amount);
|
||||
}
|
||||
|
||||
|
||||
@@ -82,7 +82,6 @@ public class CostPutCardToLib extends CostPartWithList {
|
||||
sb.append(Cost.convertAmountTypeToWords(i, getAmount(), desc));
|
||||
}
|
||||
|
||||
|
||||
if (sameZone) {
|
||||
sb.append(" from the same ").append(from);
|
||||
} else if (!this.payCostFromSource()) {
|
||||
@@ -137,7 +136,7 @@ public class CostPutCardToLib extends CostPartWithList {
|
||||
}
|
||||
|
||||
typeList = CardLists.getValidCards(typeList, getType().split(";"), payer, source, ability);
|
||||
|
||||
|
||||
if (typeList.size() < i) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -170,6 +170,7 @@ public enum Keyword {
|
||||
SURGE("Surge", KeywordWithCost.class, false, "You may cast this spell for its surge cost if you or a teammate has cast another spell this turn."),
|
||||
SUSPEND("Suspend", Suspend.class, false, "Rather than cast this card from your hand, you may pay %s and exile it with {%d:time counter} on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost."),
|
||||
TOTEM_ARMOR("Totem armor", SimpleKeyword.class, true, "If enchanted permanent would be destroyed, instead remove all damage marked on it and destroy this Aura."),
|
||||
TOXIC("Toxic", KeywordWithAmount.class, false, "Players dealt combat damage by this creature also get {%d:poison counter}."),
|
||||
TRAINING("Training", SimpleKeyword.class, false, "Whenever this creature attacks with another creature with greater power, put a +1/+1 counter on this creature."),
|
||||
TRAMPLE("Trample", Trample.class, true, "This creature can deal excess combat damage to the player or planeswalker it's attacking."),
|
||||
TRANSFIGURE("Transfigure", KeywordWithCost.class, false, "%s, Sacrifice this creature: Search your library for a creature card with the same mana value as this creature and put that card onto the battlefield, then shuffle. Transfigure only as a sorcery."),
|
||||
|
||||
@@ -671,8 +671,9 @@ public class Player extends GameEntity implements Comparable<Player> {
|
||||
boolean infect = source.hasKeyword(Keyword.INFECT)
|
||||
|| hasKeyword("All damage is dealt to you as though its source had infect.");
|
||||
|
||||
int poisonCounters = 0;
|
||||
if (infect) {
|
||||
addPoisonCounters(amount, source.getController(), counterTable);
|
||||
poisonCounters += amount;
|
||||
}
|
||||
else if (!hasKeyword("Damage doesn't cause you to lose life.")) {
|
||||
// rule 118.2. Damage dealt to a player normally causes that player to lose that much life.
|
||||
@@ -684,6 +685,14 @@ public class Player extends GameEntity implements Comparable<Player> {
|
||||
}
|
||||
}
|
||||
|
||||
if (isCombat) {
|
||||
poisonCounters += source.getKeywordMagnitude(Keyword.TOXIC);
|
||||
}
|
||||
|
||||
if (poisonCounters > 0) {
|
||||
addPoisonCounters(poisonCounters, source.getController(), counterTable);
|
||||
}
|
||||
|
||||
//Oathbreaker, Tiny Leaders, and Brawl ignore commander damage rule
|
||||
if (source.isCommander() && isCombat
|
||||
&& !this.getGame().getRules().hasAppliedVariant(GameType.Oathbreaker)
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
package forge.game.staticability;
|
||||
|
||||
import com.google.common.base.Predicates;
|
||||
import com.google.common.collect.Table.Cell;
|
||||
|
||||
import forge.game.Game;
|
||||
import forge.game.card.*;
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.trigger.Trigger;
|
||||
import forge.game.trigger.TriggerType;
|
||||
import forge.game.zone.ZoneType;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class StaticAbilityDisableTriggers {
|
||||
|
||||
static String MODE = "DisableTriggers";
|
||||
|
||||
public static boolean disabled(final Game game, final Trigger regtrig, final Map<AbilityKey, Object> runParams) {
|
||||
CardCollectionView cardList = null;
|
||||
// if LTB look back
|
||||
if ((regtrig.getMode() == TriggerType.ChangesZone || regtrig.getMode() == TriggerType.ChangesZoneAll) && "Battlefield".equals(regtrig.getParam("Origin"))) {
|
||||
if (runParams.containsKey(AbilityKey.LastStateBattlefield)) {
|
||||
cardList = (CardCollectionView) runParams.get(AbilityKey.LastStateBattlefield);
|
||||
}
|
||||
if (cardList == null) {
|
||||
cardList = game.getLastStateBattlefield();
|
||||
}
|
||||
} else {
|
||||
cardList = game.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES);
|
||||
}
|
||||
|
||||
for (final Card ca : cardList) {
|
||||
for (final StaticAbility stAb : ca.getStaticAbilities()) {
|
||||
if (!stAb.getParam("Mode").equals(MODE) || stAb.isSuppressed() || !stAb.checkConditions()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isDisabled(stAb, regtrig, runParams)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isDisabled(final StaticAbility stAb, final Trigger regtrig, final Map<AbilityKey, Object> runParams) {
|
||||
final TriggerType trigMode = regtrig.getMode();
|
||||
|
||||
// CR 603.2e
|
||||
if (stAb.hasParam("ValidCard") && regtrig.getSpawningAbility() != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!stAb.matchesValidParam("ValidCard", regtrig.getHostCard())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (stAb.hasParam("ValidMode")) {
|
||||
if (!ArrayUtils.contains(stAb.getParam("ValidMode").split(","), trigMode.toString())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (trigMode.equals(TriggerType.ChangesZone)) {
|
||||
// Cause of the trigger – the card changing zones
|
||||
if (!stAb.matchesValidParam("ValidCause", runParams.get(AbilityKey.Card))) {
|
||||
return false;
|
||||
}
|
||||
if (!stAb.matchesValidParam("Destination", runParams.get(AbilityKey.Destination))) {
|
||||
return false;
|
||||
}
|
||||
if (!stAb.matchesValidParam("Origin", runParams.get(AbilityKey.Origin))) {
|
||||
return false;
|
||||
}
|
||||
if ("Graveyard".equals(runParams.get(AbilityKey.Destination))
|
||||
&& "Battlefield".equals(runParams.get(AbilityKey.Origin))) {
|
||||
// Allow triggered ability of a dying creature that triggers
|
||||
// only when that creature is put into a graveyard from anywhere
|
||||
if ("Card.Self".equals(regtrig.getParam("ValidCard"))
|
||||
&& (!regtrig.hasParam("Origin") || "Any".equals(regtrig.getParam("Origin")))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else if (trigMode.equals(TriggerType.ChangesZoneAll)) {
|
||||
final String origin = stAb.getParam("Origin");
|
||||
final String destination = stAb.getParam("Destination");
|
||||
// check if some causes were already ignored by a different ability, then the forbidden causes will be combined
|
||||
CardZoneTable table = (CardZoneTable) runParams.get(AbilityKey.CardsFiltered);
|
||||
if (table == null) {
|
||||
table = (CardZoneTable) runParams.get(AbilityKey.Cards);
|
||||
}
|
||||
CardZoneTable filtered = new CardZoneTable();
|
||||
boolean possiblyDisabled = false;
|
||||
|
||||
// purge all forbidden causes from table
|
||||
for (Cell<ZoneType, ZoneType, CardCollection> cell : table.cellSet()) {
|
||||
CardCollection changers = cell.getValue();
|
||||
if ((origin == null || cell.getRowKey() == ZoneType.valueOf(origin)) &&
|
||||
(destination == null || cell.getColumnKey() == ZoneType.valueOf(destination))) {
|
||||
changers = CardLists.filter(changers, Predicates.not(CardPredicates.restriction(stAb.getParam("ValidCause").split(","), stAb.getHostCard().getController(), stAb.getHostCard(), stAb)));
|
||||
// static will match some of the causes
|
||||
if (changers.size() < cell.getValue().size()) {
|
||||
possiblyDisabled = true;
|
||||
}
|
||||
}
|
||||
filtered.put(cell.getRowKey(), cell.getColumnKey(), changers);
|
||||
}
|
||||
|
||||
if (!possiblyDisabled) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// test if trigger would still fire when ignoring forbidden causes
|
||||
final Map<AbilityKey, Object> runParamsFiltered = AbilityKey.newMap(runParams);
|
||||
runParamsFiltered.put(AbilityKey.Cards, filtered);
|
||||
if (regtrig.performTest(runParamsFiltered)) {
|
||||
// store the filtered Cards because Panharmonicon shouldn't see the others
|
||||
runParams.put(AbilityKey.CardsFiltered, filtered);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ public class StaticAbilityPanharmonicon {
|
||||
|
||||
CardCollectionView cardList = null;
|
||||
// if LTB look back
|
||||
if (t.getMode() == TriggerType.ChangesZone && "Battlefield".equals(t.getParam("Origin"))) {
|
||||
if ((t.getMode() == TriggerType.ChangesZone || t.getMode() == TriggerType.ChangesZoneAll) && "Battlefield".equals(t.getParam("Origin"))) {
|
||||
if (runParams.containsKey(AbilityKey.LastStateBattlefield)) {
|
||||
cardList = (CardCollectionView) runParams.get(AbilityKey.LastStateBattlefield);
|
||||
}
|
||||
@@ -102,7 +102,11 @@ public class StaticAbilityPanharmonicon {
|
||||
// Check if the cards have a trigger at all
|
||||
final String origin = stAb.getParam("Origin");
|
||||
final String destination = stAb.getParam("Destination");
|
||||
final CardZoneTable table = (CardZoneTable) runParams.get(AbilityKey.Cards);
|
||||
// check if some causes were ignored
|
||||
CardZoneTable table = (CardZoneTable) runParams.get(AbilityKey.CardsFiltered);
|
||||
if (table == null) {
|
||||
table = (CardZoneTable) runParams.get(AbilityKey.Cards);
|
||||
}
|
||||
|
||||
if (table.filterCards(origin == null ? null : ImmutableList.of(ZoneType.smartValueOf(origin)), ZoneType.smartValueOf(destination), stAb.getParam("ValidCause"), card, stAb).isEmpty()) {
|
||||
return false;
|
||||
|
||||
@@ -83,7 +83,7 @@ public class TriggerAbilityTriggered extends Trigger {
|
||||
if (!matchesValidParam("ValidCause", causes)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (hasParam("TriggeredOwnAbility") && "True".equals(getParam("TriggeredOwnAbility")) && !Iterables.contains(causes, source)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -19,18 +19,15 @@ package forge.game.trigger;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import com.google.common.base.Predicates;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.ListMultimap;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Multimaps;
|
||||
import com.google.common.collect.Table.Cell;
|
||||
|
||||
import forge.game.CardTraitBase;
|
||||
import forge.game.CardTraitPredicates;
|
||||
import forge.game.Game;
|
||||
import forge.game.GlobalRuleChange;
|
||||
import forge.game.IHasSVars;
|
||||
import forge.game.ability.AbilityFactory;
|
||||
import forge.game.ability.AbilityKey;
|
||||
@@ -39,6 +36,7 @@ import forge.game.card.*;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.spellability.AbilitySub;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.staticability.StaticAbilityDisableTriggers;
|
||||
import forge.game.staticability.StaticAbilityPanharmonicon;
|
||||
import forge.game.zone.Zone;
|
||||
import forge.game.zone.ZoneType;
|
||||
@@ -445,74 +443,9 @@ public class TriggerHandler {
|
||||
}
|
||||
}
|
||||
|
||||
// Torpor Orb check
|
||||
if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCreatureETBTriggers)
|
||||
&& !regtrig.isStatic()) {
|
||||
if (mode.equals(TriggerType.ChangesZone)) {
|
||||
if (runParams.get(AbilityKey.Destination) instanceof String) {
|
||||
final String dest = (String) runParams.get(AbilityKey.Destination);
|
||||
if (dest.equals("Battlefield") && runParams.get(AbilityKey.Card) instanceof Card) {
|
||||
final Card card = (Card) runParams.get(AbilityKey.Card);
|
||||
if (card.isCreature()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (mode.equals(TriggerType.ChangesZoneAll)) {
|
||||
CardZoneTable table = (CardZoneTable) runParams.get(AbilityKey.Cards);
|
||||
// find out if any other cards would still trigger it
|
||||
boolean found = false;
|
||||
for (Cell<ZoneType, ZoneType, CardCollection> cell : table.cellSet()) {
|
||||
// this currently assumes the table will not contain multiple destinations
|
||||
// however with some effects (e.g. Goblin Welder) that should indeed be the case
|
||||
// once Forge handles that correctly this section needs to account for that
|
||||
// (by doing a closer check of the triggered ability first)
|
||||
if (cell.getColumnKey() != ZoneType.Battlefield) {
|
||||
found = true;
|
||||
} else if (Iterables.any(cell.getValue(), Predicates.not(CardPredicates.isType("Creature")))) {
|
||||
found = true;
|
||||
}
|
||||
if (found) break;
|
||||
}
|
||||
if (!found) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} // Torpor Orb check
|
||||
|
||||
if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCreatureDyingTriggers)
|
||||
&& !regtrig.isStatic()) {
|
||||
if (mode.equals(TriggerType.ChangesZone)) {
|
||||
if (runParams.get(AbilityKey.Destination) instanceof String && runParams.get(AbilityKey.Origin) instanceof String) {
|
||||
final String dest = (String) runParams.get(AbilityKey.Destination);
|
||||
final String origin = (String) runParams.get(AbilityKey.Origin);
|
||||
if (dest.equals("Graveyard") && origin.equals("Battlefield") && runParams.get(AbilityKey.Card) instanceof Card) {
|
||||
// It will trigger if the ability is of a dying creature that triggers only when that creature is put into a graveyard from anywhere
|
||||
if (!"Card.Self".equals(regtrig.getParam("ValidCard")) || (regtrig.hasParam("Origin") && !"Any".equals(regtrig.getParam("Origin")))) {
|
||||
final Card card = (Card) runParams.get(AbilityKey.Card);
|
||||
if (card.isCreature()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (mode.equals(TriggerType.ChangesZoneAll)) {
|
||||
CardZoneTable table = (CardZoneTable) runParams.get(AbilityKey.Cards);
|
||||
boolean found = false;
|
||||
for (Cell<ZoneType, ZoneType, CardCollection> cell : table.cellSet()) {
|
||||
if (cell.getRowKey() != ZoneType.Battlefield) {
|
||||
found = true;
|
||||
} else if (cell.getColumnKey() != ZoneType.Graveyard) {
|
||||
found = true;
|
||||
} else if (Iterables.any(cell.getValue(), Predicates.not(CardPredicates.isType("Creature")))) {
|
||||
found = true;
|
||||
}
|
||||
if (found) break;
|
||||
}
|
||||
if (!found) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// check if any static abilities are disabling the trigger (Torpor Orb and the like)
|
||||
if (!regtrig.isStatic() && StaticAbilityDisableTriggers.disabled(game, regtrig, runParams)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
package forge.game.trigger;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.util.Localizer;
|
||||
|
||||
public class TriggerProliferate extends Trigger {
|
||||
|
||||
public TriggerProliferate(Map<String, String> params, Card host, boolean intrinsic) {
|
||||
super(params, host, intrinsic);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean performTest(Map<AbilityKey, Object> runParams) {
|
||||
if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTriggeringObjects(SpellAbility sa, Map<AbilityKey, Object> runParams) {
|
||||
sa.setTriggeringObjectsFrom(runParams, AbilityKey.Player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getImportantStackObjects(SpellAbility sa) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(Localizer.getInstance().getMessage("lblPlayer")).append(": ").append(sa.getTriggeringObject(AbilityKey.Player));
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -94,6 +94,7 @@ public enum TriggerType {
|
||||
PlanarDice(TriggerPlanarDice.class),
|
||||
PlaneswalkedFrom(TriggerPlaneswalkedFrom.class),
|
||||
PlaneswalkedTo(TriggerPlaneswalkedTo.class),
|
||||
Proliferate(TriggerProliferate.class),
|
||||
Regenerated(TriggerRegenerated.class),
|
||||
Revealed(TriggerRevealed.class),
|
||||
RolledDie(TriggerRolledDie.class),
|
||||
|
||||
@@ -857,7 +857,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
||||
final Trigger trig = sa.getTrigger();
|
||||
final Card newHost = game.getCardState(host);
|
||||
if (host.isAura() && newHost.isInZone(ZoneType.Graveyard) && trig.getMode() == TriggerType.ChangesZone &&
|
||||
trig.getParam("Destination").equals("Graveyard") && trig.getParam("ValidCard").equals("Card.EnchantedBy")) {
|
||||
"Graveyard".equals(trig.getParam("Destination")) && "Card.EnchantedBy".equals(trig.getParam("ValidCard"))) {
|
||||
sa.setHostCard(newHost);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,16 +65,6 @@ public class PlayerZoneBattlefield extends PlayerZone {
|
||||
}
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public final void remove(final Card c) {
|
||||
super.remove(c);
|
||||
|
||||
if (trigger) {
|
||||
c.runLeavesPlayCommands();
|
||||
}
|
||||
}
|
||||
|
||||
public final void setTriggers(final boolean b) {
|
||||
trigger = b;
|
||||
}
|
||||
|
||||
@@ -2495,4 +2495,41 @@ public class GameSimulationTest extends SimulationTest {
|
||||
AssertJUnit.assertNotNull(simMentor);
|
||||
AssertJUnit.assertEquals(1, simMentor.getCounters(CounterEnumType.P1P1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHushbringer() {
|
||||
Game game = initAndCreateGame();
|
||||
Player p = game.getPlayers().get(0);
|
||||
|
||||
addCard("Naban, Dean of Iteration", p);
|
||||
addCard("Hushbringer", p);
|
||||
addCard("Ingenious Artillerist", p);
|
||||
|
||||
// both ETB together and Artillerist should still trigger from the non-creature
|
||||
addCardToZone("Spellbook", p, ZoneType.Library);
|
||||
// whereas Naban doesn't see Memnarch to double the trigger
|
||||
addCardToZone("Memnarch", p, ZoneType.Library);
|
||||
|
||||
addCard("Forest", p);
|
||||
addCard("Forest", p);
|
||||
addCard("Island", p);
|
||||
addCard("Island", p);
|
||||
addCard("Island", p);
|
||||
addCard("Mountain", p);
|
||||
addCard("Mountain", p);
|
||||
|
||||
Card genesis = addCardToZone("Genesis Ultimatum", p, ZoneType.Hand);
|
||||
|
||||
SpellAbility genesisSA = genesis.getFirstSpellAbility();
|
||||
|
||||
game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p);
|
||||
game.getAction().checkStateEffects(true);
|
||||
|
||||
GameSimulator sim = createSimulator(game, p);
|
||||
sim.simulateSpellAbility(genesisSA);
|
||||
Game simGame = sim.getSimulatedGameState();
|
||||
|
||||
// 2 damage dealt for 2 artifacts
|
||||
AssertJUnit.assertEquals(18, simGame.getPlayers().get(1).getLife());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,13 +3,14 @@ ManaCost:1 B
|
||||
Types:Enchantment Aura
|
||||
K:Enchant creature card in a graveyard
|
||||
A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | TgtZone$ Graveyard | AILogic$ Reanimate
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReanimate | TriggerDescription$ When CARDNAME enters the battlefield, if it's on the battlefield, it loses "enchant creature card in a graveyard" and gains "enchant creature put onto the battlefield with CARDNAME." Return enchanted creature card to the battlefield under your control and attach CARDNAME to it.
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReanimate | TriggerDescription$ When CARDNAME enters the battlefield, if it's on the battlefield, it loses "enchant creature card in a graveyard" and gains "enchant creature put onto the battlefield with CARDNAME." Return enchanted creature card to the battlefield under your control and attach CARDNAME to it. When CARDNAME leaves the battlefield, that creature's controller sacrifices it.
|
||||
SVar:TrigReanimate:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Enchanted | RememberChanged$ True | GainControl$ True | SubAbility$ DBAnimate
|
||||
SVar:DBAnimate:DB$ Animate | Defined$ Self | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature put onto the battlefield with CARDNAME | RemoveKeywords$ Enchant creature card in a graveyard | Duration$ Permanent | SubAbility$ DBAttach
|
||||
SVar:DBAttach:DB$ Attach | Defined$ Remembered
|
||||
SVar:DBAttach:DB$ Attach | Defined$ Remembered | SubAbility$ DBDelay
|
||||
SVar:DBDelay:DB$ DelayedTrigger | Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Execute$ TrigSacrifice | RememberObjects$ RememberedLKI | TriggerDescription$ When CARDNAME leaves the battlefield, that creature's controller sacrifices it.
|
||||
SVar:NewAttach:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature.IsRemembered | AILogic$ Pump
|
||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigSacrifice | TriggerDescription$ When Animate Dead leaves the battlefield, that creature's controller sacrifices it.
|
||||
SVar:TrigSacrifice:DB$ Destroy | Sacrifice$ True | Defined$ DirectRemembered | SubAbility$ DBCleanup
|
||||
SVar:TrigSacrifice:DB$ Destroy | Sacrifice$ True | Defined$ DelayTriggerRememberedLKI
|
||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ DBCleanup | Static$ True
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -1 | Description$ Enchanted creature gets -1/-0.
|
||||
DeckHas:Ability$Graveyard
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
Name:Bitterblossom
|
||||
ManaCost:1 B
|
||||
Types:Tribal Enchantment Faerie
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, you lose 1 life and create a 1/1 black Faerie Rogue creature token with flying.
|
||||
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_1_1_faerie_rogue_flying | TokenOwner$ You | SubAbility$ DB
|
||||
SVar:DB:DB$ LoseLife | LifeAmount$ 1
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 1 life and create a 1/1 black Faerie Rogue creature token with flying.
|
||||
SVar:TrigLoseLife:DB$ LoseLife | LifeAmount$ 1 | SubAbility$ DBToken
|
||||
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_1_1_faerie_rogue_flying | TokenOwner$ You
|
||||
SVar:AICastPreference:NeverCastIfLifeBelow$ 4
|
||||
Oracle:At the beginning of your upkeep, you lose 1 life and create a 1/1 black Faerie Rogue creature token with flying.
|
||||
|
||||
@@ -4,6 +4,6 @@ Types:Enchantment Aura Curse
|
||||
K:Enchant player
|
||||
A:SP$ Attach | Cost$ 4 U | ValidTgts$ Player | AILogic$ Curse
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ Player.EnchantedBy | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted player casts an instant or sorcery spell, each other player may copy that spell and may choose new targets for the copy they control.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ TriggeredCardOpponent | Optional$ True | MayChooseTarget$ True
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ NonTriggeredCardController | Optional$ True | MayChooseTarget$ True
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Enchant player\nWhenever enchanted player casts an instant or sorcery spell, each other player may copy that spell and may choose new targets for the copy they control.
|
||||
|
||||
@@ -3,13 +3,14 @@ ManaCost:1 B
|
||||
Types:Enchantment Aura
|
||||
K:Enchant creature card in a graveyard
|
||||
A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | TgtZone$ Graveyard | AILogic$ Reanimate
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReanimate | TriggerDescription$ When CARDNAME enters the battlefield, if it's on the battlefield, it loses "enchant creature card in a graveyard" and gains "enchant creature put onto the battlefield with CARDNAME." Put enchanted creature card onto the battlefield tapped under your control and attach CARDNAME to it.
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReanimate | TriggerDescription$ When CARDNAME enters the battlefield, if it's on the battlefield, it loses "enchant creature card in a graveyard" and gains "enchant creature put onto the battlefield with CARDNAME." Put enchanted creature card onto the battlefield tapped under your control and attach CARDNAME to it. When CARDNAME leaves the battlefield, that creature's controller sacrifices it.
|
||||
SVar:TrigReanimate:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Enchanted | RememberChanged$ True | GainControl$ True | Tapped$ True | SubAbility$ DBAnimate
|
||||
SVar:DBAnimate:DB$ Animate | Defined$ Self | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature put onto the battlefield with CARDNAME | RemoveKeywords$ Enchant creature card in a graveyard | Duration$ Permanent | SubAbility$ DBAttach
|
||||
SVar:DBAttach:DB$ Attach | Defined$ Remembered
|
||||
SVar:DBAttach:DB$ Attach | Defined$ Remembered | SubAbility$ DBDelay
|
||||
SVar:DBDelay:DB$ DelayedTrigger | Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Execute$ TrigSacrifice | RememberObjects$ RememberedLKI | TriggerDescription$ When CARDNAME leaves the battlefield, that creature's controller sacrifices it.
|
||||
SVar:NewAttach:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature.IsRemembered | AILogic$ Pump
|
||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigSacrifice | TriggerDescription$ When CARDNAME leaves the battlefield, that creature's controller sacrifices it.
|
||||
SVar:TrigSacrifice:DB$ Destroy | Sacrifice$ True | Defined$ DirectRemembered | SubAbility$ DBCleanup
|
||||
SVar:TrigSacrifice:DB$ Destroy | Sacrifice$ True | Defined$ DirectRemembered
|
||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ DBCleanup | Static$ True
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Enchanted creature gets +1/+1 and doesn't untap during its controller's untap step.
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.EnchantedController | TriggerZones$ Battlefield | OptionalDecider$ EnchantedController | Execute$ TrigUntap | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, that player may pay {1}{B}. If the player does, untap that creature.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:5 R
|
||||
Types:Creature Devil
|
||||
PT:4/2
|
||||
K:Undying
|
||||
T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Card.Self,Creature.YouOwn+Other | Execute$ ReanimateDmg | TriggerDescription$ Whenever CARDNAME or another creature enters the battlefield from your graveyard, that creature deals damage equal to its power to any target.
|
||||
T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Card.Self+YouOwn,Creature.YouOwn+Other | Execute$ ReanimateDmg | TriggerDescription$ Whenever CARDNAME or another creature enters the battlefield from your graveyard, that creature deals damage equal to its power to any target.
|
||||
SVar:ReanimateDmg:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | DamageSource$ TriggeredCard | NumDmg$ Damage
|
||||
SVar:Damage:TriggeredCard$CardPower
|
||||
Oracle:Undying (When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.)\nWhenever Flayer of the Hatebound or another creature enters the battlefield from your graveyard, that creature deals damage equal to its power to any target.
|
||||
|
||||
@@ -2,6 +2,6 @@ Name:Hive Mind
|
||||
ManaCost:5 U
|
||||
Types:Enchantment
|
||||
T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ Player | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts an instant or sorcery spell, each other player copies that spell. Each of those players may choose new targets for their copy.
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ TriggeredCardOpponent | MayChooseTarget$ True
|
||||
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ NonTriggeredCardController | MayChooseTarget$ True
|
||||
AI:RemoveDeck:Random
|
||||
Oracle:Whenever a player casts an instant or sorcery spell, each other player copies that spell. Each of those players may choose new targets for their copy.
|
||||
|
||||
@@ -4,7 +4,8 @@ Types:Creature Faerie
|
||||
PT:1/2
|
||||
K:Flying
|
||||
K:Lifelink
|
||||
S:Mode$ Continuous | GlobalRule$ Creatures entering the battlefield don't cause abilities to trigger. | Description$ Creatures entering the battlefield or dying don't cause abilities to trigger.
|
||||
S:Mode$ Continuous | GlobalRule$ Creatures dying don't cause abilities to trigger. | Secondary$ True | Description$ Creatures entering the battlefield or dying don't cause abilities to trigger.
|
||||
S:Mode$ DisableTriggers | ValidCause$ Creature | ValidMode$ ChangesZone,ChangesZoneAll | Destination$ Battlefield | Description$ Creatures entering the battlefield or dying don't cause abilities to trigger.
|
||||
S:Mode$ DisableTriggers | ValidCause$ Creature | ValidMode$ ChangesZone,ChangesZoneAll | Origin$ Battlefield | Destination$ Graveyard | Secondary$ True | Description$ Creatures entering the battlefield or dying don't cause abilities to trigger.
|
||||
AI:RemoveDeck:Random
|
||||
DeckHas:Ability$LifeGain
|
||||
Oracle:Flying, lifelink\nCreatures entering the battlefield or dying don't cause abilities to trigger.
|
||||
|
||||
@@ -4,6 +4,6 @@ Types:Creature Hippogriff
|
||||
PT:2/1
|
||||
K:Flash
|
||||
K:Flying
|
||||
S:Mode$ Continuous | GlobalRule$ Creatures entering the battlefield don't cause abilities to trigger. | Description$ Creatures entering the battlefield don't cause abilities to trigger.
|
||||
S:Mode$ DisableTriggers | ValidCause$ Creature | ValidMode$ ChangesZone,ChangesZoneAll | Destination$ Battlefield | Description$ Creatures entering the battlefield don't cause abilities to trigger.
|
||||
AI:RemoveDeck:Random
|
||||
Oracle:Flash\nFlying\nCreatures entering the battlefield don't cause abilities to trigger.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:4 G
|
||||
Types:Legendary Planeswalker Yanggu
|
||||
Loyalty:4
|
||||
A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn.
|
||||
A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ mowu | TokenOwner$ You | SpellDescription$ If you don't control a creature named Mowu, create Mowu, a legendary 3/3 green Dog creature token. | IsPresent$ Creature.YouCtrl+namedMowu | PresentCompare$ EQ0
|
||||
A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ mowu | TokenOwner$ You | SpellDescription$ If you don't control a creature named Mowu, create Mowu, a legendary 3/3 green Dog creature token. | ConditionPresent$ Creature.YouCtrl+namedMowu | ConditionCompare$ EQ0
|
||||
A:AB$ Pump | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | KW$ Trample | SpellDescription$ Until end of turn, target creature gains trample and gets +X/+X, where X is the number of lands you control.
|
||||
SVar:X:Count$TypeYouCtrl.Land
|
||||
Oracle:[+1]: Target creature gets +2/+2 until end of turn.\n[-1]: If you don't control a creature named Mowu, create Mowu, a legendary 3/3 green Dog creature token.\n[-5]: Until end of turn, target creature gains trample and gets +X/+X, where X is the number of lands you control.
|
||||
|
||||
@@ -4,9 +4,10 @@ Types:Legendary Creature Human Wizard
|
||||
PT:5/5
|
||||
S:Mode$ Continuous | Affected$ Creature.Legendary+YouCtrl | AddPower$ X | AddToughness$ X | Description$ Legendary creatures you control get +X/+X, where X is the number of legendary creatures you control.
|
||||
T:Mode$ SpellCast | ValidCard$ Card.Legendary+wasCastFromYourHandByYou | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ DBDigUntil | TriggerDescription$ Whenever you cast a legendary spell from your hand, exile cards from the top of your library until you exile a legendary nonland card with lesser mana value. You may cast that card without paying its mana cost. Put the rest on the bottom of your library in a random order.
|
||||
SVar:DBDigUntil:DB$ DigUntil | Defined$ You | Valid$ Card.nonLand+Legendary+cmcLTY | FoundDestination$ Exile | RevealedDestination$ Library| RememberFound$ True | RestRandomOrder$ True | SubAbility$ DBPlay
|
||||
SVar:DBPlay:DB$ Play | Defined$ Remembered | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:DBDigUntil:DB$ DigUntil | Defined$ You | Valid$ Card.nonLand+Legendary+cmcLTY | FoundDestination$ Exile | RevealedDestination$ Exile | ImprintFound$ True | RememberRevealed$ True | SubAbility$ DBPlay
|
||||
SVar:DBPlay:DB$ Play | Defined$ Imprinted | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True | SubAbility$ DBChange
|
||||
SVar:DBChange:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Exile | Destination$ Library | RandomOrder$ True | LibraryPosition$ -1 | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
|
||||
SVar:X:Count$Valid Creature.Legendary+YouCtrl
|
||||
SVar:Y:TriggeredCard$CardManaCost
|
||||
DeckHints:Type$Legendary
|
||||
|
||||
@@ -4,7 +4,7 @@ Types:Legendary Snow Creature Shapeshifter
|
||||
PT:0/0
|
||||
K:Changeling
|
||||
K:ETBReplacement:Copy:DBCopy:Optional
|
||||
SVar:DBCopy:DB$ Clone | Choices$ Permanent.Other+YouCtrl | AddTypes$ Legendary & Snow | SubAbility$ DBConditionEffect | AddKeywords$ Changeling | SpellDescription$ You may have Moritte of the Frost enter the battlefield as a copy of a permanent you control, except it's legendary and snow in addition to its other types and, if it's a creature, it enters with two additional +1/+1 counters on it and has changeling.
|
||||
SVar:DBCopy:DB$ Clone | Choices$ Permanent.Other+YouCtrl | AddTypes$ Legendary & Snow | SubAbility$ DBConditionEffect | AddKeywords$ Changeling | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of a permanent you control, except it's legendary and snow in addition to its other types and, if it's a creature, it enters with two additional +1/+1 counters on it and has changeling.
|
||||
SVar:DBConditionEffect:DB$ Effect | RememberObjects$ Self | Name$ Moritte of the Frost Effect | ReplacementEffects$ ETBCreat
|
||||
SVar:ETBCreat:Event$ Moved | ValidCard$ Creature.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | ReplacementResult$ Updated | Description$ If it's a creature, it enters with two additional +1/+1 counters on it.
|
||||
SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ 2 | SubAbility$ DBExile
|
||||
|
||||
@@ -2,13 +2,14 @@ Name:Necromancy
|
||||
ManaCost:2 B
|
||||
Types:Enchantment
|
||||
K:MayFlashSac
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ RaiseDead | TriggerDescription$ When CARDNAME enters the battlefield, if it's on the battlefield, it becomes an Aura with "enchant creature put onto the battlefield with CARDNAME." Put target creature card from a graveyard onto the battlefield under your control and attach CARDNAME to it
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ RaiseDead | TriggerDescription$ When CARDNAME enters the battlefield, if it's on the battlefield, it becomes an Aura with "enchant creature put onto the battlefield with CARDNAME." Put target creature card from a graveyard onto the battlefield under your control and attach CARDNAME to it. When CARDNAME leaves the battlefield, that creature's controller sacrifices it. When CARDNAME leaves the battlefield, that creature's controller sacrifices it.
|
||||
SVar:RaiseDead:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | RememberChanged$ True | TgtPrompt$ Select target creature card in a graveyard | ValidTgts$ Creature | ChangeNum$ 1 | SubAbility$ Aurify
|
||||
SVar:Aurify:DB$ Animate | IsPresent$ Card.Self | Types$ Aura | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature put onto the battlefield with CARDNAME | Duration$ Permanent | SubAbility$ NecromAttach
|
||||
SVar:NewAttach:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature.IsRemembered | AILogic$ Pump
|
||||
SVar:NewAttach:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature.IsRemembered | AILogic$ Pump | SubAbility$ DBDelay
|
||||
SVar:DBDelay:DB$ DelayedTrigger | Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Execute$ TrigSacrifice | RememberObjects$ RememberedLKI | TriggerDescription$ When CARDNAME leaves the battlefield, that creature's controller sacrifices it.
|
||||
SVar:NecromAttach:DB$ Attach | Defined$ Remembered
|
||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME leaves the battlefield, enchanted permanent's controller sacrifices it.
|
||||
SVar:TrigSac:DB$ Destroy | Sacrifice$ True | Defined$ DirectRemembered | SubAbility$ DBCleanup
|
||||
SVar:TrigSacrifice:DB$ Destroy | Sacrifice$ True | Defined$ DirectRemembered
|
||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ DBCleanup | Static$ True
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:NeedsToPlayVar:Y GE1
|
||||
SVar:Y:Count$TypeInYourYard.Creature
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:3
|
||||
Types:Artifact Creature Phyrexian Dragon
|
||||
PT:2/2
|
||||
K:Double Strike
|
||||
T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | OptionalDecider$ You | TriggerZones$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield from your graveyard, you may discard your hand. If you do, draw three cards.
|
||||
T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | OptionalDecider$ You | TriggerZones$ Battlefield | ValidCard$ Card.Self+YouOwn | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield from your graveyard, you may discard your hand. If you do, draw three cards.
|
||||
SVar:TrigDiscard:DB$ Discard | Mode$ Hand | Defined$ You | SubAbility$ DBDraw
|
||||
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 3
|
||||
K:Unearth:3 R R
|
||||
|
||||
@@ -5,7 +5,7 @@ Loyalty:5
|
||||
K:Compleated
|
||||
A:AB$ Tap | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact,Creature | TgtPrompt$ Select up to one target artifact or creature | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBPump | SpellDescription$ Tap up to one target artifact or creature. It doesn't untap during its controller's next untap step.
|
||||
SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent
|
||||
A:AB$ ChangeZone | Cost$ SubCounter<X/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent.nonLand+cmcEQX | TgtPrompt$ Select target nonland permanent card with mana value X | AILogic$ BestCard | Origin$ Graveyard | Destination$ Exile | SubAbility$ DBCopy | SpellDescription$ Exile target nonland permanent card with mana value X from your graveyard.
|
||||
A:AB$ ChangeZone | Cost$ SubCounter<X/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent.nonLand+cmcEQX+YouCtrl | TgtPrompt$ Select target nonland permanent card with mana value X | AILogic$ BestCard | Origin$ Graveyard | Destination$ Exile | SubAbility$ DBCopy | SpellDescription$ Exile target nonland permanent card with mana value X from your graveyard.
|
||||
SVar:DBCopy:DB$ CopyPermanent | Defined$ Targeted | SpellDescription$ Create a token that's a copy of that card.
|
||||
SVar:X:Count$xPaid
|
||||
A:AB$ Token | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | TokenScript$ tamiyos_notebook | SpellDescription$ Create Tamiyo's Notebook, a legendary colorless artifact token with "Spells you cast cost {2} less to cast" and "{T}: Draw a card."
|
||||
|
||||
@@ -2,5 +2,6 @@ Name:Tocatli Honor Guard
|
||||
ManaCost:1 W
|
||||
Types:Creature Human Soldier
|
||||
PT:1/3
|
||||
S:Mode$ Continuous | GlobalRule$ Creatures entering the battlefield don't cause abilities to trigger. | Description$ Creatures entering the battlefield don't cause abilities to trigger.
|
||||
S:Mode$ DisableTriggers | ValidCause$ Creature | ValidMode$ ChangesZone,ChangesZoneAll | Destination$ Battlefield | Description$ Creatures entering the battlefield don't cause abilities to trigger.
|
||||
AI:RemoveDeck:Random
|
||||
Oracle:Creatures entering the battlefield don't cause abilities to trigger.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Torpor Orb
|
||||
ManaCost:2
|
||||
Types:Artifact
|
||||
S:Mode$ Continuous | GlobalRule$ Creatures entering the battlefield don't cause abilities to trigger. | Description$ Creatures entering the battlefield don't cause abilities to trigger.
|
||||
S:Mode$ DisableTriggers | ValidCause$ Creature | ValidMode$ ChangesZone,ChangesZoneAll | Destination$ Battlefield | Description$ Creatures entering the battlefield don't cause abilities to trigger.
|
||||
SVar:NonStackingEffect:True
|
||||
AI:RemoveDeck:Random
|
||||
Oracle:Creatures entering the battlefield don't cause abilities to trigger.
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
Name:Archfiend of the Dross
|
||||
ManaCost:2 B
|
||||
Types:Creature Phyrexian Demon
|
||||
PT:6/6
|
||||
K:Flying
|
||||
K:etbCounter:OIL:4
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCtr | TriggerDescription$ At the beginning of your upkeep, remove an oil counter from CARDNAME. Then if it has no oil counters on it, you lose the game.
|
||||
SVar:TrigRemoveCtr:DB$ RemoveCounter | Defined$ Self | CounterType$ OIL | CounterNum$ 1 | SubAbility$ LoseGame
|
||||
SVar:LoseGame:DB$ LosesGame | Defined$ You | ConditionDefined$ Self | ConditionPresent$ Card.counters_EQ0_OIL
|
||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature an opponent controls dies, its controller loses 2 life.
|
||||
SVar:TrigLoseLife:DB$ LoseLife | LifeAmount$ 2 | Defined$ TriggeredCardController
|
||||
DeckHas:Ability$Counters
|
||||
AI:RemoveDeck:Random
|
||||
Oracle:Flying\nArchfiend of the Dross enters the battlefield with four oil counters on it.\nAt the beginning of your upkeep, remove an oil counter from Archfiend of the Dross. Then if it has no oil counters on it, you lose the game.\nWhenever a creature an opponent controls dies, its controller loses 2 life.
|
||||
13
forge-gui/res/cardsfolder/upcoming/argentum_masticore.txt
Normal file
13
forge-gui/res/cardsfolder/upcoming/argentum_masticore.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
Name:Argentum Masticore
|
||||
ManaCost:5
|
||||
Types:Artifact Creature Phyrexian Masticore
|
||||
PT:5/5
|
||||
K:First strike
|
||||
K:Protection:Card.MultiColor:Protection from multicolored
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of your upkeep, sacrifice CARDNAME unless you discard a card. When you discard a card this way, destroy target nonland permanent an opponent controls with mana value less than or equal to the mana value of the discarded card.
|
||||
SVar:TrigSacrifice:DB$ Sacrifice | UnlessCost$ Discard<1/Card> | UnlessPayer$ You | OrString$ Sacrifice it. | SubAbility$ TrigImmediateTrig
|
||||
SVar:TrigImmediateTrig:DB$ ImmediateTrigger | ConditionDefined$ Discarded | ConditionPresent$ Card | ConditionCompare$ GE1 | RememberObjects$ Discarded | Execute$ TrigDestroy | TriggerDescription$ When you discard a card this way, destroy target nonland permanent an opponent controls with mana value less than or equal to the mana value of the discarded card.
|
||||
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Permanent.nonLand+cmcLEX+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls with mana value less or equal to the discarded card
|
||||
SVar:X:TriggerRemembered$CardManaCost
|
||||
DeckHas:Ability$Discard|Sacrifice
|
||||
Oracle:First strike, protection from multicolored\nAt the beginning of your upkeep, sacrifice Argentum Masticore unless you discard a card. When you discard a card this way, destroy target nonland permanent an opponent controls with mana value less than or equal to the mana value of the discarded card.
|
||||
@@ -0,0 +1,14 @@
|
||||
Name:Arteeoh, Dread Scavenger
|
||||
ManaCost:1 B G U
|
||||
Types:Legendary Artifact Creature Robot
|
||||
PT:3/3
|
||||
K:Flying
|
||||
K:Deathtouch
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigExchange | TriggerDescription$ Whenever NICKNAME deals combat damage to a player, you may exchange control of two other target artifacts. When you do, create a token that's a copy of target artifact you don't control, except it's a 1/1 green Squirrel creature token in addition to its other colors and types.
|
||||
SVar:TrigExchange:DB$ ExchangeControl | RememberExchanged$ True | ValidTgts$ Artifact.Other | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Choose two other target artifacts | Optional$ True | AILogic$ TrigTwoTargets | SubAbility$ TrigImmediateTrig
|
||||
SVar:TrigImmediateTrig:DB$ ImmediateTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE2 | SubAbility$ DBCleanup | Execute$ TrigToken | TriggerDescription$ When you do, create a token that's a copy of target artifact you don't control, except it's a 1/1 green Squirrel creature token in addition to its other colors and types.
|
||||
SVar:TrigToken:DB$ CopyPermanent | ValidTgts$ Artifact.YouDontCtrl | TgtPrompt$ Select target artifact you don't control | SetPower$ 1 | SetToughness$ 1 | AddColors$ Green | AddTypes$ Creature & Squirrel
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
DeckHas:Ability$Token & Type$Squirrel
|
||||
AI:RemoveDeck:Random
|
||||
Oracle:Flying, deathtouch\nWhenever Arteeoh deals combat damage to a player, you may exchange control of two other target artifacts. When you do, create a token that's a copy of target artifact you don't control, except it's a 1/1 green Squirrel creature token in addition to its other colors and types.
|
||||
@@ -0,0 +1,8 @@
|
||||
Name:Black Sun's Twilight
|
||||
ManaCost:X B
|
||||
Types:Instant
|
||||
A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature | TargetMin$ 0 | TargetMax$ 1 | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SubAbility$ DBReanimate | SpellDescription$ Up to one target creature gets -X/-X until end of turn. If X is 5 or more, return a creature card with mana value X or less from your graveyard to the battlefield tapped.
|
||||
SVar:DBReanimate:DB$ ChangeZone | Origin$ Graveyard | Chooser$ You | ChangeNum$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ GE5 | Destination$ Battlefield | Hidden$ True | Tapped$ True | ChangeType$ Creature.YouOwn+cmcLEX
|
||||
SVar:X:Count$xPaid
|
||||
DeckHas:Ability$Graveyard
|
||||
Oracle:Up to one target creature gets -X/-X until end of turn. If X is 5 or more, return a creature card with mana value X or less from your graveyard to the battlefield tapped.
|
||||
10
forge-gui/res/cardsfolder/upcoming/blightbelly_rat.txt
Normal file
10
forge-gui/res/cardsfolder/upcoming/blightbelly_rat.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
Name:Blightbelly Rat
|
||||
ManaCost:1 B
|
||||
Types:Creature Phyrexian Rat
|
||||
PT:2/2
|
||||
K:Toxic:1
|
||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigProliferate | TriggerDescription$ When CARDNAME dies, proliferate.
|
||||
SVar:TrigProliferate:DB$ Proliferate
|
||||
DeckHas:Ability$Proliferate
|
||||
DeckNeeds:Ability$Counters
|
||||
Oracle:Toxic 1 (Players dealt combat damage by this creature also get a poison counter.)\nWhen Blightbelly Rat dies, proliferate.
|
||||
11
forge-gui/res/cardsfolder/upcoming/bloated_contaminator.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/bloated_contaminator.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Name:Bloated Contaminator
|
||||
ManaCost:2 G
|
||||
Types:Creature Phyrexian Beast
|
||||
PT:4/4
|
||||
K:Trample
|
||||
K:Toxic:1
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigProliferate | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, proliferate.
|
||||
SVar:TrigProliferate:DB$ Proliferate
|
||||
DeckHas:Ability$Proliferate
|
||||
DeckHints:Type$Planeswalker & Ability$Counters
|
||||
Oracle:Trample\nToxic 1\nWhenever Bloated Contaminator deals combat damage to a player, proliferate.
|
||||
11
forge-gui/res/cardsfolder/upcoming/conduit_of_worlds.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/conduit_of_worlds.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Name:Conduit of Worlds
|
||||
ManaCost:2 G G
|
||||
Types:Artifact
|
||||
S:Mode$ Continuous | Affected$ Land.YouOwn | MayPlay$ True | AffectedZone$ Graveyard | Description$ You may play lands from your graveyard.
|
||||
A:AB$ Play | Cost$ T | ValidSA$ Spell | SorcerySpeed$ True | TgtPrompt$ Choose target nonland permanent card in your graveyard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | TgtZone$ Graveyard | ValidTgts$ Permanent.nonLand+YouOwn | RememberPlayed$ True | Optional$ True | SubAbility$ DBEffect | SpellDescription$ Choose target nonland permanent card in your graveyard. If you haven't cast a spell this turn, you may cast that card. If you do, you can't cast additional spells this turn. Activate only as a sorcery.
|
||||
SVar:DBEffect:DB$ Effect | Name$ Conduit of Worlds's Effect | ConditionDefined$ Remembered | ConditionPresent$ Card | StaticAbilities$ STCantBeCast | SubAbility$ DBCleanup
|
||||
SVar:STCantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ You | Description$ You can't cast additional spells this turn.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:X:Count$ThisTurnCast_Spell.YouCtrl
|
||||
DeckHints:Ability$Graveyard|Mill|Dredge
|
||||
Oracle:You may play lands from your graveyard.\n{T}: Choose target nonland permanent card in your graveyard. If you haven't cast a spell this turn, you may cast that card. If you do, you can't cast additional spells this turn. Activate only as a sorcery.
|
||||
@@ -0,0 +1,8 @@
|
||||
Name:Elesh Norn, Mother of Machines
|
||||
ManaCost:4 W
|
||||
Types:Legendary Creature Phyrexian Praetor
|
||||
PT:4/7
|
||||
K:Vigilance
|
||||
S:Mode$ Panharmonicon | ValidMode$ ChangesZone,ChangesZoneAll | ValidCard$ Permanent.YouCtrl | ValidCause$ Permanent | Destination$ Battlefield | Description$ If a permanent entering the battlefield under your control causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.
|
||||
S:Mode$ DisableTriggers | ValidCause$ Permanent | ValidMode$ ChangesZone,ChangesZoneAll | Destination$ Battlefield | ValidCard$ Permanent.OppCtrl | Description$ Permanents entering the battlefield don't cause abilities of permanents your opponents control to trigger.
|
||||
Oracle:Vigilance\nIf a permanent entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.\nPermanents entering the battlefield don't cause abilities of permanents your opponents control to trigger.
|
||||
@@ -0,0 +1,5 @@
|
||||
Name:Encroaching Mycosynth
|
||||
ManaCost:3 U
|
||||
Types:Artifact
|
||||
S:Mode$ Continuous | Affected$ Permanent.nonLand+YouCtrl | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | AddType$ Artifact | Description$ Nonland permanents you control are artifacts in addition to their other types. The same is true for permanent spells you control and nonland permanent cards you own that aren't on the battlefield.
|
||||
Oracle:Nonland permanents you control are artifacts in addition to their other types. The same is true for permanent spells you control and nonland permanent cards you own that aren't on the battlefield.
|
||||
12
forge-gui/res/cardsfolder/upcoming/evolved_spinoderm.txt
Normal file
12
forge-gui/res/cardsfolder/upcoming/evolved_spinoderm.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
Name:Evolved Spinoderm
|
||||
ManaCost:2 G G
|
||||
Types:Creature Phyrexian Beast
|
||||
PT:5/5
|
||||
K:etbCounter:OIL:4
|
||||
S:Mode$ Continuous | Affected$ Creature.Self+counters_LE2_OIL | AddKeyword$ Trample | Description$ CARDNAME has trample as long as it has two or fewer oil counters on it. Otherwise, it has hexproof.
|
||||
S:Mode$ Continuous | Affected$ Creature.Self+counters_GT2_OIL | AddKeyword$ Hexproof
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCtr | TriggerDescription$ At the beginning of your upkeep, remove an oil counter from CARDNAME. Then if it has no oil counters on it, sacrifice it.
|
||||
SVar:TrigRemoveCtr:DB$ RemoveCounter | Defined$ Self | CounterType$ OIL | CounterNum$ 1 | SubAbility$ DBSacrifice
|
||||
SVar:DBSacrifice:DB$ Sacrifice | ConditionDefined$ Self | ConditionPresent$ Card.counters_EQ0_OIL
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:Evolved Spinoderm enters the battlefield with four oil counters on it.\nEvolved Spinoderm has trample as long as it has two or fewer oil counters on it. Otherwise, it has hexproof.\nAt the beginning of your upkeep, remove an oil counter from Evolved Spinoderm. Then if it has no oil counters on it, sacrifice it.
|
||||
@@ -0,0 +1,12 @@
|
||||
Name:Ezuri, Stalker of Spheres
|
||||
ManaCost:2 G U
|
||||
Types:Legendary Creature Phyrexian Elf Warrior
|
||||
PT:3/3
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigProliferate | TriggerDescription$ When CARDNAME enters the battlefield, you may pay {3}. If you do, proliferate twice.
|
||||
SVar:TrigProliferate:AB$ Proliferate | Cost$ 3 | SubAbility$ TrigProliferate2
|
||||
SVar:TrigProliferate2:DB$ Proliferate
|
||||
T:Mode$ Proliferate | ValidPlayer$ You | Execute$ TrigDraw | TriggerDescription$ Whenever you proliferate, draw a card.
|
||||
SVar:TrigDraw:DB$ Draw
|
||||
DeckHas:Ability$Proliferate|Counters
|
||||
DeckNeeds:Ability$Counters
|
||||
Oracle:When Ezuri, Stalker of Spheres enters the battlefield, you may pay {3}. If you do, proliferate twice.\nWhenever you proliferate, draw a card.
|
||||
@@ -0,0 +1,12 @@
|
||||
Name:Geth, Thane of Contracts
|
||||
ManaCost:1 B B
|
||||
Types:Legendary Creature Phyrexian Zombie
|
||||
PT:3/4
|
||||
S:Mode$ Continuous | Affected$ Creature.Other+YouCtrl | AddPower$ -1 | AddToughness$ -1 | Description$ Other creatures you control get -1/-1.
|
||||
A:AB$ ChangeZone | Cost$ 1 B B T | Origin$ Graveyard | SorcerySpeed$ True | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature in your graveyard | SubAbility$ DBAnimate | SpellDescription$ Return target creature card from your graveyard to the battlefield. It gains "If this creature would leave the battlefield, exile it instead of putting it anywhere else." Activate only as a sorcery.
|
||||
SVar:DBAnimate:DB$ Animate | Replacements$ ReplaceLeaves | Defined$ Targeted | Duration$ Permanent
|
||||
SVar:ReplaceLeaves:Event$ Moved | ActiveZones$ Battlefield | Origin$ Battlefield | ValidCard$ Card.Self | ReplaceWith$ Exile | Description$ If this creature would leave the battlefield, exile it instead.
|
||||
SVar:Exile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ ReplacedCard
|
||||
DeckHints:Ability$Graveyard|Mill|Dredge|Sacrifice
|
||||
DeckHas:Ability$Graveyard
|
||||
Oracle:Other creatures you control get -1/-1.\n{1}{B}{B}, {T}: Return target creature card from your graveyard to the battlefield. It gains "If this creature would leave the battlefield, exile it instead of putting it anywhere else." Activate only as a sorcery.
|
||||
13
forge-gui/res/cardsfolder/upcoming/glissa_sunslayer.txt
Normal file
13
forge-gui/res/cardsfolder/upcoming/glissa_sunslayer.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
Name:Glissa Sunslayer
|
||||
ManaCost:1 B G
|
||||
Types:Legendary Creature Phyrexian Zombie Elf
|
||||
PT:3/3
|
||||
K:First strike
|
||||
K:Deathtouch
|
||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigCharm | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, ABILITY
|
||||
SVar:TrigCharm:DB$ Charm | Choices$ DBDraw,DBDestroy,DBRemove
|
||||
SVar:DBDraw:DB$ Draw | SubAbility$ DBLoseLife | SpellDescription$ You draw a card and you lose 1 life.
|
||||
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1
|
||||
SVar:DBDestroy:DB$ Destroy | ValidTgts$ Enchantment | SpellDescription$ Destroy target enchantment.
|
||||
SVar:DBRemove:DB$ RemoveCounter | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | CounterType$ Any | CounterNum$ 3 | SpellDescription$ Remove up to three counters from target permanent.
|
||||
Oracle:First strike, deathtouch\nWhenever Glissa Sunslayer deals combat damage to a player, choose one —\n• You draw a card and you lose 1 life.\n• Destroy target enchantment.\n• Remove up to three counters from target permanent.
|
||||
@@ -0,0 +1,8 @@
|
||||
Name:Graaz, Unstoppable Juggernaut
|
||||
ManaCost:8
|
||||
Types:Legendary Artifact Creature Juggernaut
|
||||
PT:7/5
|
||||
S:Mode$ MustAttack | ValidCreature$ Juggernaut.YouCtrl | Description$ Juggernauts you control attack each combat if able.
|
||||
S:Mode$ CantBlockBy | ValidAttacker$ Juggernaut.YouCtrl | ValidBlocker$ Creature.Wall | Description$ Juggernauts you control can't be blocked by Walls.
|
||||
S:Mode$ Continuous | Affected$ Creature.Other+YouCtrl | AffectedZone$ Battlefield | SetPower$ 5 | SetToughness$ 3 | AddType$ Juggernaut | Description$ Other creatures you control have base power and toughness 5/3 and are Juggernauts in addition to their other creature types.
|
||||
Oracle:Juggernauts you control attack each combat if able.\nJuggernauts you control can't be blocked by Walls.\nOther creatures you control have base power and toughness 5/3 and are Juggernauts in addition to their other creature types.
|
||||
@@ -0,0 +1,10 @@
|
||||
Name:Karumonix, the Rat King
|
||||
ManaCost:1 B B
|
||||
Types:Legendary Creature Phyrexian Rat
|
||||
PT:3/3
|
||||
K:Toxic:1
|
||||
S:Mode$ Continuous | Affected$ Rat.YouCtrl+Other | AddKeyword$ Toxic:1 | Description$ Other Rats you control have toxic 1.
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When NICKNAME enters the battlefield, look at the top five cards of your library. You may reveal any number of Rat cards from among them and put the revealed cards into your hand. Put the rest on the bottom of your library in a random order.
|
||||
SVar:TrigDig:DB$ Dig | DigNum$ 5 | AnyNumber$ True | ChangeValid$ Rat | RestRandomOrder$ True
|
||||
DeckNeeds:Type$Rat
|
||||
Oracle:Toxic 1\nOther Rats you control have toxic 1.\nWhen Karumonix enters the battlefield, look at the top five cards of your library. You may reveal any number of Rat cards from among them and put the revealed cards into your hand. Put the rest on the bottom of your library in a random order.
|
||||
11
forge-gui/res/cardsfolder/upcoming/kemba_kha_enduring.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/kemba_kha_enduring.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Name:Kemba, Kha Enduring
|
||||
ManaCost:1 W
|
||||
Types:Creature Cat Cleric
|
||||
PT:2/2
|
||||
T:Mode$ ChangesZone | ValidCard$ Card.Self,Creature.Other+Cat+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigAttach | TriggerDescription$ Whenever CARDNAME or another Cat enters the battlefield under your control, attach up to one target Equipment you control to that creature.
|
||||
SVar:TrigAttach:DB$ Attach | Defined$ TriggeredCard | Object$ Targeted | ValidTgts$ Equipment.YouCtrl | TgtPrompt$ Select up to one target Equipment you control | TargetMin$ 0 | TargetMax$ 1
|
||||
S:Mode$ Continuous | Affected$ Creature.YouCtrl+equipped | AddPower$ 1 | AddToughness$ 1 | Description$ Equipped creatures you control get +1/+1.
|
||||
A:AB$ Token | Cost$ 3 W W | TokenScript$ w_2_2_cat | TokenAmount$ 1 | TokenOwner$ You | SpellDescription$ Create a 2/2 white Cat creature token.
|
||||
DeckNeeds:Type$Equipment
|
||||
DeckHas:Ability$Token
|
||||
Oracle:Whenever Kemba, Kha Enduring or another Cat enters the battlefield under your control, attach up to one target Equipment you control to that creature.\nEquipped creatures you control get +1/+1.\n{3}{W}{W}: Create a 2/2 white Cat creature token.
|
||||
@@ -0,0 +1,9 @@
|
||||
Name:Kethek, Crucible Goliath
|
||||
ManaCost:2 R B
|
||||
Types:Legendary Creature Phyrexian Beast
|
||||
PT:4/4
|
||||
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your end step, you may sacrifice another creature. If you do, reveal cards from the top of your library until you reveal a nonlegendary creature card with lesser mana value, put it onto the battlefield, then put the rest on the bottom of your library in a random order.
|
||||
SVar:TrigSac:AB$ DigUntil | Cost$ Sac<1/Creature.Other/another creature> | Defined$ You | Valid$ Card.Creature+nonLegendary+cmcLTX | FoundDestination$ Battlefield | RevealedDestination$ Library | RestRandomOrder$ True
|
||||
SVar:X:Sacrificed$CardManaCost
|
||||
DeckHas:Ability$Sacrifice
|
||||
Oracle:At the beginning of your end step, you may sacrifice another creature. If you do, reveal cards from the top of your library until you reveal a nonlegendary creature card with lesser mana value, put it onto the battlefield, then put the rest on the bottom of your library in a random order.
|
||||
@@ -0,0 +1,11 @@
|
||||
Name:Malcator, Purity Overseer
|
||||
ManaCost:1 W U
|
||||
Types:Creature Phyrexian Elephant Wizard
|
||||
PT:1/1
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ TriggerDescription$ When CARDNAME enters the battlefield, create a 3/3 colorless Phyrexian Golem artifact creature token.
|
||||
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE3 | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, if three or more artifacts entered the battlefield under your control this turn, create a 3/3 colorless Phyrexian Golem artifact creature token.
|
||||
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_3_3_a_phyrexian_golem | TokenOwner$ You
|
||||
SVar:X:Count$ThisTurnEntered_Battlefield_Artifact.YouCtrl
|
||||
DeckHas:Ability$Token & Type$Golem|Artifact
|
||||
DeckHints:Type$Artifact
|
||||
Oracle:When Malcator, Purity Overseer enters the battlefield, create a 3/3 colorless Phyrexian Golem artifact creature token.\nAt the beginning of your end step, if three or more artifacts entered the battlefield under your control this turn, create a 3/3 colorless Phyrexian Golem artifact creature token.
|
||||
10
forge-gui/res/cardsfolder/upcoming/migloz_maze_crusher.txt
Normal file
10
forge-gui/res/cardsfolder/upcoming/migloz_maze_crusher.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
Name:Migloz, Maze Crusher
|
||||
ManaCost:1 R G
|
||||
Types:Legendary Creature Phyrexian Beast
|
||||
PT:4/4
|
||||
K:etbCounter:OIL:5
|
||||
A:AB$ Pump | Cost$ 1 SubCounter<1/OIL/NICKNAME> | Defined$ Self | KW$ Vigilance & Menace | SpellDescription$ It gains vigilance and menace until end of turn.
|
||||
A:AB$ Pump | Cost$ 2 SubCounter<2/OIL/NICKNAME> | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ It gets +2/+2 until end of turn.
|
||||
A:AB$ Destroy | Cost$ 3 SubCounter<3/OIL/NICKNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment.
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:Migloz, Maze Crusher enters the battlefield with five oil counters on it.\n{1}, Remove an oil counter from Migloz: It gains vigilance and menace until end of turn.\n{2}, Remove two oil counters from Migloz: It gets +2/+2 until end of turn.\n{3}, Remove three oil counters from Migloz: Destroy target artifact or enchantment.
|
||||
11
forge-gui/res/cardsfolder/upcoming/mindsplice_apparatus.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/mindsplice_apparatus.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Name:Mindsplice Apparatus
|
||||
ManaCost:3 U
|
||||
Types:Artifact
|
||||
K:Flash
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ At the beginning of your upkeep, put an oil counter on CARDNAME.
|
||||
SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ OIL | CounterNum$ 1
|
||||
S:Mode$ ReduceCost | ValidCard$ Instant,Sorcery | Type$ Spell | Activator$ You | Amount$ X | Description$ Instant and sorcery spells you cast cost 1 less to cast for each oil counter on CARDNAME.
|
||||
SVar:X:Count$CardCounters.OIL
|
||||
DeckHas:Ability$Counters
|
||||
DeckHints:Type$Instant|Sorcery
|
||||
Oracle:Flash\nAt the beginning of your upkeep, put an oil counter on Mindsplice Apparatus.\nInstant and sorcery spells you cast cost 1 less to cast for each oil counter on Mindsplice Apparatus.
|
||||
8
forge-gui/res/cardsfolder/upcoming/mirrex.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/mirrex.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
Name:Mirrex
|
||||
ManaCost:no cost
|
||||
Types:Land Sphere
|
||||
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
|
||||
A:AB$ Mana | Cost$ T | Produced$ Any | IsPresent$ Card.Self+ThisTurnEntered | SpellDescription$ Add one mana of any color. Activate only if CARDNAME entered the battlefield this turn.
|
||||
A:AB$ Token | Cost$ 3 T | TokenScript$ c_1_1_a_phyrexian_mite_toxic_noblock | TokenOwner$ You | SpellDescription$ Create a 1/1 colorless Phyrexian Mite artifact creature token with toxic 1 and "This creature can't block." (Players dealt combat damage by it also get a poison counter.)
|
||||
DeckHas:Ability$Token & Type$Phyrexian|Mite|Artifact
|
||||
Oracle:{T}: Add {C}.\n{T}: Add one mana of any color. Activate only if Mirrex entered the battlefield this turn.\n{3},{T}: Create a 1/1 colorless Phyrexian Mite artifact creature token with toxic 1 and "This creature can't block." (Players dealt combat damage by it also get a poison counter.)
|
||||
@@ -0,0 +1,9 @@
|
||||
Name:Monument to Perfection
|
||||
ManaCost:2
|
||||
Types:Artifact
|
||||
A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic,Land.Locus,Land.Sphere | ChangeTypeDesc$ basic, Sphere, or Locus land card | SpellDescription$ Search your library for a basic, Sphere, or Locus land card, reveal it, put it into your hand, then shuffle.
|
||||
A:AB$ Animate | Cost$ 3 | CheckSVar$ CountAll | SVarCompare$ GE9 | Power$ 9 | Toughness$ 9 | Types$ Artifact,Creature,Phyrexian,Construct | RemoveAllAbilities$ True | Defined$ Self | Keywords$ Indestructible & Toxic:9 | Duration$ Permanent | SpellDescription$ CARDNAME becomes a 9/9 Phyrexian Construct artifact creature, loses all abilities, and gains indestructible and toxic 9. Activate only if there are nine or more lands with different names among the basic, Sphere, and Locus lands you control.
|
||||
SVar:CountAll:Count$DifferentCardNames_Land.YouCtrl+inZoneBattlefield+Basic,Land.YouCtrl+inZoneBattlefield+Sphere,Land.YouCtrl+inZoneBattlefield+Locus
|
||||
DeckNeeds:Type$Locus|Sphere
|
||||
DeckHas:Type$Phyrexian|Construct|Artifact
|
||||
Oracle:{3},{T}: Search your library for a basic, Sphere, or Locus land card, reveal it, put it into your hand, then shuffle.\n{3}: Monument to Perfection becomes a 9/9 Phyrexian Construct artifact creature, loses all abilities, and gains indestructible and toxic 9. Activate only if there are nine or more lands with different names among the basic, Sphere, and Locus lands you control.
|
||||
7
forge-gui/res/cardsfolder/upcoming/myr_convert.txt
Normal file
7
forge-gui/res/cardsfolder/upcoming/myr_convert.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
Name:Myr Convert
|
||||
ManaCost:2
|
||||
Types:Artifact Creature Phyrexian Myr
|
||||
PT:2/1
|
||||
K:Toxic:1
|
||||
A:AB$ Mana | Cost$ T PayLife<2> | Produced$ Any | SpellDescription$ Add one mana of any color.
|
||||
Oracle:Toxic 1 (Players dealt combat damage by this creature also get a poison counter.)\nT, Pay 2 life: Add one mana of any color.
|
||||
@@ -0,0 +1,9 @@
|
||||
Name:Necrogen Rotpriest
|
||||
ManaCost:2 B G
|
||||
Types:Creature Phyrexian Zombie Cleric
|
||||
PT:1/5
|
||||
K:Toxic:2
|
||||
T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl+withToxic | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPoison | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature you control with toxic deals combat damage to a player, that player gets an additional poison counter.
|
||||
SVar:TrigPoison:DB$ Poison | Defined$ TriggeredTarget | Num$ 1
|
||||
A:AB$ Pump | Cost$ 1 B G | ValidTgts$ Creature.YouCtrl+withToxic | TgtPrompt$ Select target creature you control with toxic | KW$ Deathtouch | SpellDescription$ Target creature you control with toxic gains deathtouch until end of turn.
|
||||
Oracle:Toxic 2 (Players dealt combat damage by this creature also get two poison counters.)\nWhenever a creature you control with toxic deals combat damage to a player, that player gets an additional poison counter.\n1BG: Target creature you control with toxic gains deathtouch until end of turn.
|
||||
9
forge-gui/res/cardsfolder/upcoming/skrelvs_hive.txt
Normal file
9
forge-gui/res/cardsfolder/upcoming/skrelvs_hive.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Name:Skrelv's Hive
|
||||
ManaCost:1 W
|
||||
Types:Enchantment
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 1 life and create a 1/1 colorless Phyrexian Mite artifact creature token with toxic 1 and "This creature can't block."
|
||||
SVar:TrigLoseLife:DB$ LoseLife | LifeAmount$ 1 | SubAbility$ DBToken
|
||||
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_1_1_a_phyrexian_mite_toxic_noblock | TokenOwner$ You
|
||||
S:Mode$ Continuous | Affected$ Creature.YouCtrl+withToxic | AddKeyword$ Lifelink | CheckSVar$ X | SVarCompare$ GE3 | Description$ Corrupted - As long as an opponent has three or more poison counters, creatures you control with toxic have lifelink.
|
||||
SVar:X:PlayerCountOpponents$HighestPoisonCounters
|
||||
Oracle:At the beginning of your upkeep, you lose 1 life and create a 1/1 colorless Phyrexian Mite artifact creature token with toxic 1 and "This creature can't block."\nCorrupted - As long as an opponent has three or more poison counters, creatures you control with toxic have lifelink.
|
||||
@@ -0,0 +1,8 @@
|
||||
Name:The Monumental Facade
|
||||
ManaCost:no cost
|
||||
Types:Land Sphere
|
||||
K:etbCounter:OIL:5
|
||||
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
|
||||
A:AB$ PutCounter | Cost$ T SubCounter<1/OIL> | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl | TgtPrompt$ Select target Artifact of Creature you control | SorcerySpeed$ True | CounterType$ OIL | SpellDescription$ Put an oil counter on target artifact or creature you control. Activate only as a sorcery.
|
||||
DeckHas:Ability$Counters
|
||||
Oracle:The Monumental Facade enters the battlefield with five oil counters on it.\n{T}: Add {C}.\n{T}, Remove an oil counter from The Monumental Facade: Put an oil counter on target artifact or creature you control. Activate only as a sorcery.
|
||||
@@ -0,0 +1,9 @@
|
||||
Name:The Mycosynth Gardens
|
||||
ManaCost:no cost
|
||||
Types:Land Sphere
|
||||
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
|
||||
A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color.
|
||||
A:AB$ Clone | Cost$ X T | ValidTgts$ Artifact.YouCtrl+cmcEQX+nonToken | TgtPrompt$ Select target nontoken artifact you control | SpellDescription$ CARDNAME becomes a copy of target nontoken artifact you control with mana value X.
|
||||
SVar:X:Count$xPaid
|
||||
DeckHints:Type$Artifact
|
||||
Oracle:{T}: Add {C}.\n{1}, {T}: Add one mana of any color.\n{X}, {T}: The Mycosynth Gardens becomes a copy of target nontoken artifact you control with mana value X.
|
||||
9
forge-gui/res/cardsfolder/upcoming/the_seedcore.txt
Normal file
9
forge-gui/res/cardsfolder/upcoming/the_seedcore.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Name:The Seedcore
|
||||
ManaCost:no cost
|
||||
Types:Land Sphere
|
||||
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
|
||||
A:AB$ Mana | Cost$ T | Produced$ Any | RestrictValid$ Spell.Creature+Phyrexian | SpellDescription$ Add one mana of any color. Spend this mana only to cast Phyrexian creature spells.
|
||||
A:AB$ Pump | Cost$ T | PrecostDesc$ Corrupted — | CheckSVar$ X | SVarCompare$ GE3 | ValidTgts$ Creature.powerEQ1+toughnessEQ1 | TgtPrompt$ Select target 1/1 creature | NumAtt$ +2 | NumDef$ +1 | SpellDescription$ Target 1/1 creature gets +2/+1 until end of turn. Activate only if an opponent has three or more poison counters.
|
||||
SVar:X:PlayerCountOpponents$HighestPoisonCounters
|
||||
DeckNeeds:Type$Phyrexian
|
||||
Oracle:{T}: Add {C}.\n{T}: Add one mana of any color. Spend this mana only to cast Phyrexian creature spells.\nCorrupted - {T}: Target 1/1 creature gets +2/+1 until end of turn. Activate only if an opponent has three or more poison counters.
|
||||
12
forge-gui/res/cardsfolder/upcoming/venser_corpse_puppet.txt
Normal file
12
forge-gui/res/cardsfolder/upcoming/venser_corpse_puppet.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
Name:Venser, Corpse Puppet
|
||||
ManaCost:U B
|
||||
Types:Legendary Creature Phyrexian Zombie Wizard
|
||||
PT:1/3
|
||||
K:Lifelink
|
||||
K:Toxic:1
|
||||
T:Mode$ Proliferate | ValidPlayer$ You | Execute$ TrigChoose | TriggerDescription$ Whenever you proliferate, ABILITY
|
||||
SVar:TrigChoose:DB$ Charm | Choices$ DBToken,DBPump
|
||||
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ the_hollow_sentinel | TokenOwner$ You | ConditionPresent$ Creature.YouCtrl+namedThe Hollow Sentinel | ConditionCompare$ EQ0 | SpellDescription$ If you don't control a creature named The Hollow Sentinel, create The Hollow Sentinel, a legendary 3/3 colorless Phyrexian Golem artifact creature token.
|
||||
SVar:DBPump:DB$ Pump | ValidTgts$ Creature.Artifact+YouCtrl | TgtPrompt$ Select target artifact creature you control | KW$ Flying & Lifelink | SpellDescription$ Target artifact creature you control gains flying and lifelink until end of turn.
|
||||
Oracle:Lifelink, toxic 1\nWhenever you proliferate, choose one -\n• If you don't control a creature named The Hollow Sentinel, create The Hollow Sentinel, a legendary 3/3 colorless Phyrexian Golem artifact creature token.\n• Target artifact creature you control gains flying and lifelink until end of turn.
|
||||
|
||||
7
forge-gui/res/cardsfolder/upcoming/zenith_chronicler.txt
Normal file
7
forge-gui/res/cardsfolder/upcoming/zenith_chronicler.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
Name:Zenith Chronicler
|
||||
ManaCost:2
|
||||
Types:Artifact Creature Phyrexian Construct
|
||||
PT:3/1
|
||||
T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ Player | TriggerZones$ Battlefield | ActivatorThisTurnCast$ EQ1 | NoResolvingCheck$ True | Execute$ TrigDraw | TriggerDescription$ Whenever a player casts their first multicolored spell each turn, each other player draws a card.
|
||||
SVar:TrigDraw:DB$ Draw | Defined$ NonTriggeredCardController
|
||||
Oracle:Whenever a player casts their first multicolored spell each turn, each other player draws a card.
|
||||
@@ -7,5 +7,6 @@ ScryfallCode=PH21
|
||||
|
||||
[cards]
|
||||
1 M Andrios, Roaming Explorer @Borja Pindado
|
||||
2 M Arteeoh, Dread Scavenger @Zoltan Boros
|
||||
3 M Byode, Inverse Sun @Dominik Mayer
|
||||
4 M Ersta, Friend to All @Winona Nelson
|
||||
|
||||
8
forge-gui/res/formats/Archived/Legacy/2023-01-13.txt
Normal file
8
forge-gui/res/formats/Archived/Legacy/2023-01-13.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
[format]
|
||||
Name:Legacy (DMR)
|
||||
Type:Archived
|
||||
Subtype:Legacy
|
||||
Effective:2023-01-13
|
||||
Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, HOU, C17, XLN, DDT, IMA, V17, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR
|
||||
Banned:Advantageous Proclamation; Adriana's Valor; Amulet of Quoz; Ancestral Recall; Arcum's Astrolabe; Assemble the Rank and Vile; Backup Plan; Balance; Bazaar of Baghdad; Black Lotus; Brago's Favor; Bronze Tablet; Channel; Chaos Orb; Cleanse; Contract from Below; Crusade; Darkpact; Deathrite Shaman; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Double Stroke; Dreadhorde Arcanist; Earthcraft; Echoing Boon; Emissary's Ploy; Falling Star; Fastbond; Flash; Frantic Search; Gitaxian Probe; Goblin Recruiter; Gush; Hermit Druid; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imperial Seal; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Library of Alexandria; Lurrus of the Dream-Den; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Muzzio's Preparations; Mystical Tutor; Natural Unity; Necropotence; Oath of Druids; Oko, Thief of Crowns; Power Play; Pradesh Gypsies; Ragavan, Nimble Pilferer; Rebirth; Secret Summoning; Secrets of Paradise; Sensei's Divining Top; Sentinel Dispatch; Shahrazad; Skullclamp; Sol Ring; Sovereign's Realm; Stone-Throwing Devils; Strip Mine; Summoner's Bond; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Underworld Breach; Unexpected Potential; Vampiric Tutor; Weight Advantage; Wheel of Fortune; Windfall; Worldknit; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker
|
||||
Additional:Arvinox, the Mind Flail; Blanka, Ferocious Friend; Bjorna, Nightfall Alchemist; Cecily, Haunted Mage; Chief Jim Hopper; Chun-Li, Countless Kicks; Daryl, Hunter of Walkers; Dhalsim, Pliable Pacifist; Dustin, Gadget Genius; E. Honda, Sumo Champion; Eleven, the Mage; Elmar, Ulvenwald Informant; Glenn, the Voice of Calm; Guile, Sonic Soldier; Hargilde, Kindly Runechanter; Havengul Laboratory; Ken, Burning Brawler; Lucas, the Sharpshooter; Max, the Daredevil; Michonne, Ruthless Survivor; Mike, the Dungeon Master; Mind Flayer, the Shadow; Negan, the Cold-Blooded; Othelm, Sigardian Outcast; Rick, Steadfast Leader; Ryu, World Warrior; Sophina, Spearsage Deserter; Wernog, Rider's Chaplain; Will the Wise; Zangief, the Red Cyclone
|
||||
9
forge-gui/res/formats/Archived/Vintage/2023-01-13.txt
Normal file
9
forge-gui/res/formats/Archived/Vintage/2023-01-13.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
[format]
|
||||
Name:Vintage (DMR)
|
||||
Type:Archived
|
||||
Subtype:Vintage
|
||||
Effective:2023-01-13
|
||||
Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, HOU, C17, XLN, DDT, IMA, V17, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR
|
||||
Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will
|
||||
Banned:Adriana's Valor; Advantageous Proclamation; Amulet of Quoz; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Bronze Tablet; Chaos Orb; Cleanse; Contract from Below; Crusade; Darkpact; Demonic Attorney; Double Stroke; Echoing Boon; Emissary's Ploy; Falling Star; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Muzzio's Preparations; Natural Unity; Power Play; Pradesh Gypsies; Rebirth; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Shahrazad; Sovereign's Realm; Stone-Throwing Devils; Summoner's Bond; Tempest Efreet; Timmerian Fiends; Unexpected Potential; Weight Advantage; Worldknit
|
||||
Additional:Arvinox, the Mind Flail; Blanka, Ferocious Friend; Bjorna, Nightfall Alchemist; Cecily, Haunted Mage; Chief Jim Hopper; Chun-Li, Countless Kicks; Daryl, Hunter of Walkers; Dhalsim, Pliable Pacifist; Dustin, Gadget Genius; E. Honda, Sumo Champion; Eleven, the Mage; Elmar, Ulvenwald Informant; Glenn, the Voice of Calm; Guile, Sonic Soldier; Hargilde, Kindly Runechanter; Havengul Laboratory; Ken, Burning Brawler; Lucas, the Sharpshooter; Max, the Daredevil; Michonne, Ruthless Survivor; Mike, the Dungeon Master; Mind Flayer, the Shadow; Negan, the Cold-Blooded; Othelm, Sigardian Outcast; Rick, Steadfast Leader; Ryu, World Warrior; Sophina, Spearsage Deserter; Wernog, Rider's Chaplain; Will the Wise; Zangief, the Red Cyclone
|
||||
@@ -3,5 +3,5 @@ Name:Legacy
|
||||
Order:105
|
||||
Subtype:Legacy
|
||||
Type:Sanctioned
|
||||
Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, HOU, C17, XLN, DDT, IMA, V17, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD
|
||||
Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, HOU, C17, XLN, DDT, IMA, V17, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR
|
||||
Banned:Advantageous Proclamation; Adriana's Valor; Amulet of Quoz; Ancestral Recall; Arcum's Astrolabe; Assemble the Rank and Vile; Backup Plan; Balance; Bazaar of Baghdad; Black Lotus; Brago's Favor; Bronze Tablet; Channel; Chaos Orb; Cleanse; Contract from Below; Crusade; Darkpact; Deathrite Shaman; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Double Stroke; Dreadhorde Arcanist; Earthcraft; Echoing Boon; Emissary's Ploy; Falling Star; Fastbond; Flash; Frantic Search; Gitaxian Probe; Goblin Recruiter; Gush; Hermit Druid; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imperial Seal; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Library of Alexandria; Lurrus of the Dream-Den; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Muzzio's Preparations; Mystical Tutor; Natural Unity; Necropotence; Oath of Druids; Oko, Thief of Crowns; Power Play; Pradesh Gypsies; Ragavan, Nimble Pilferer; Rebirth; Secret Summoning; Secrets of Paradise; Sensei's Divining Top; Sentinel Dispatch; Shahrazad; Skullclamp; Sol Ring; Sovereign's Realm; Stone-Throwing Devils; Strip Mine; Summoner's Bond; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Underworld Breach; Unexpected Potential; Vampiric Tutor; Weight Advantage; Wheel of Fortune; Windfall; Worldknit; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker
|
||||
|
||||
@@ -3,6 +3,6 @@ Name:Vintage
|
||||
Order:104
|
||||
Subtype:Vintage
|
||||
Type:Sanctioned
|
||||
Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, HOU, C17, XLN, DDT, IMA, V17, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD
|
||||
Sets:LEA, LEB, 2ED, ARN, ATQ, 3ED, LEG, DRC94, DRK, PHPR, FEM, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, POR, WTH, TMP, STH, EXO, PO2, USG, ATH, ULG, 6ED, UDS, S99, PTK, MMQ, BRB, NMS, S00, PCY, BTD, INV, PLS, 7ED, APC, ODY, DKM, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, MED, LRW, DD1, MOR, SHM, EVE, DRB, ME2, ALA, DD2, CFX, DDC, ARB, M10, TD0, FVE, ME3, ZEN, DDD, PDS, WWK, DDE, ROE, DPA, M11, FVR, DDF, SOM, TD1, PD2, ME4, MBS, DDG, NPH, TD2, COM, M12, FVL, DDH, ISD, PD3, DKA, DDI, AVR, M13, V12, DDJ, RTR, CM1, GTC, DDK, DGM, MMA, M14, V13, DDL, THS, C13, BNG, DDM, JOU, MD1, CNS, VMA, M15, V14, DDN, KTK, C14, DVD, EVG, GVL, JVC, FRF, UGF, DDO, DTK, TPR, MM2, ORI, V15, DDP, BFZ, EXP, C15, PZ1, OGW, DDQ, SOI, W16, EMA, EMN, V16, CN2, DDR, KLD, MPS_KLD, C16, PZ2, AER, MM3, DDS, AKH, MPS_AKH, W17, CMA, HOU, C17, XLN, DDT, IMA, V17, RIX, A25, DDU, DOM, CM2, BBD, SS1, GS1, M19, C18, GRN, MPS_GRN, GK1, G18, GNT, UMA, RNA, MPS_RNA, GK2, WAR, MPS_WAR, MH1, SS2, M20, C19, ELD, MB1, GN2, SLD, THB, IKO, C20, SS3, M21, JMP, 2XM, ZNR, ZNE, ZNC, CMR, CC1, KHM, KHC, TSR, STX, STA, C21, MH2, H1R, AFR, AFC, MID, MIC, VOW, VOC, DBL, CC2, NEO, NEC, SNC, NCC, SLX, CLB, 2X2, DMU, DMC, 40K, UNF, GN3, BRO, BRC, BRR, BOT, J22, SCD, DMR
|
||||
Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Time Vault; Time Walk; Timetwister; Tinker; Tolarian Academy; Treasure Cruise; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will
|
||||
Banned:Adriana's Valor; Advantageous Proclamation; Amulet of Quoz; Assemble the Rank and Vile; Backup Plan; Brago's Favor; Bronze Tablet; Chaos Orb; Cleanse; Contract from Below; Crusade; Darkpact; Demonic Attorney; Double Stroke; Echoing Boon; Emissary's Ploy; Falling Star; Hired Heist; Hold the Perimeter; Hymn of the Wilds; Immediate Action; Imprison; Incendiary Dissent; Invoke Prejudice; Iterative Analysis; Jeweled Bird; Jihad; Muzzio's Preparations; Natural Unity; Power Play; Pradesh Gypsies; Rebirth; Secret Summoning; Secrets of Paradise; Sentinel Dispatch; Shahrazad; Sovereign's Realm; Stone-Throwing Devils; Summoner's Bond; Tempest Efreet; Timmerian Fiends; Unexpected Potential; Weight Advantage; Worldknit
|
||||
|
||||
@@ -11,6 +11,7 @@ Lair
|
||||
Locus
|
||||
Mine
|
||||
Power-Plant
|
||||
Sphere:Spheres
|
||||
Tower
|
||||
Urza's
|
||||
[CreatureTypes]
|
||||
@@ -166,6 +167,7 @@ Merfolk:Merfolk
|
||||
Metathran:Metathrans
|
||||
Minion:Minions
|
||||
Minotaur:Minotaurs
|
||||
Mite:Mites
|
||||
Mole:Moles
|
||||
Monger:Mongers
|
||||
Mongoose:Mongooses
|
||||
|
||||
@@ -4,5 +4,5 @@ Types:Creature Bird
|
||||
Colors:black
|
||||
PT:1/1
|
||||
K:Flying
|
||||
K:CARDNAME can't block.
|
||||
S:Mode$ CantBlockBy | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block.
|
||||
Oracle:Flying\nThis creature can't block.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Goblin Construct Token
|
||||
ManaCost:no cost
|
||||
PT:0/1
|
||||
Types:Artifact Creature Goblin Construct
|
||||
K:CARDNAME can't block.
|
||||
S:Mode$ CantBlockBy | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block.
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigDealDamage | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to you.
|
||||
SVar:TrigDealDamage:DB$ DealDamage | Defined$ You | NumDmg$ 1
|
||||
Oracle:This creature can't block.\nAt the beginning of your upkeep, this creature deals 1 damage to you.
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
Name:Phyrexian Mite Token
|
||||
ManaCost:no cost
|
||||
Types:Artifact Creature Phyrexian Mite
|
||||
PT:1/1
|
||||
K:Toxic:1
|
||||
S:Mode$ CantBlockBy | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block
|
||||
Oracle:Toxic 1\nThis creature can't block.
|
||||
@@ -2,5 +2,5 @@ Name:Robot Token
|
||||
ManaCost:no cost
|
||||
Types:Artifact Creature Robot
|
||||
PT:4/4
|
||||
S:Mode$ CantBlockBy | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block
|
||||
S:Mode$ CantBlockBy | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block.
|
||||
Oracle:This creature can't block.
|
||||
|
||||
@@ -3,5 +3,5 @@ ManaCost:no cost
|
||||
Types:Creature Goblin
|
||||
Colors:red
|
||||
PT:1/1
|
||||
K:CARDNAME can't block.
|
||||
S:Mode$ CantBlockBy | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block.
|
||||
Oracle:This creature can't block.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:no cost
|
||||
Types:Creature Pirate
|
||||
Colors:red
|
||||
PT:1/1
|
||||
K:CARDNAME can't block.
|
||||
S:Mode$ CantBlockBy | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block.
|
||||
S:Mode$ MustAttack | ValidCreature$ Creature.YouCtrl | Description$ Creatures you control attack each combat if able.
|
||||
Oracle:This creature can't block.\nCreatures you control attack each combat if able.
|
||||
|
||||
@@ -3,5 +3,5 @@ ManaCost:no cost
|
||||
Types:Creature Satyr
|
||||
Colors:red
|
||||
PT:1/1
|
||||
K:CARDNAME can't block.
|
||||
S:Mode$ CantBlockBy | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block.
|
||||
Oracle:This creature can't block.
|
||||
|
||||
5
forge-gui/res/tokenscripts/the_hollow_sentinel.txt
Normal file
5
forge-gui/res/tokenscripts/the_hollow_sentinel.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
Name:The Hollow Sentinel
|
||||
ManaCost:no cost
|
||||
Types:Legendary Creature Phyrexian Golem
|
||||
PT:3/3
|
||||
Oracle:
|
||||
@@ -124,7 +124,7 @@ public class InputSelectEntitiesFromList<T extends GameEntity> extends InputSele
|
||||
? String.format(message, selected.size())
|
||||
: String.format(message, max - selected.size()));
|
||||
|
||||
if (sa != null && sa.hasParam("Crew")) {
|
||||
if (sa != null && sa.hasParam("Crew") && sa.getPayCosts().hasSpecificCostType(CostTapType.class)) {
|
||||
msg.append("\nCrewing: ").
|
||||
append(CardLists.getTotalPower((FCollection<Card>)getSelected(), true, true)).
|
||||
append(" / ").append(TextUtil.fastReplace(sa.getPayCosts().getCostPartByType(CostTapType.class).getType(), "Creature.Other+withTotalPowerGE", ""));
|
||||
|
||||
Reference in New Issue
Block a user