mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 11:48:02 +00:00
Merge branch 'master' into master2
This commit is contained in:
@@ -937,9 +937,6 @@ public class AiController {
|
||||
if (!sa.checkRestrictions(spellHost, player)) {
|
||||
return AiPlayDecision.AnotherTime;
|
||||
}
|
||||
if (sa instanceof SpellPermanent) {
|
||||
return canPlayFromEffectAI((SpellPermanent) sa, false, true);
|
||||
}
|
||||
if (sa.usesTargeting()) {
|
||||
if (!sa.isTargetNumberValid() && sa.getTargetRestrictions().getNumCandidates(sa, true) == 0) {
|
||||
return AiPlayDecision.TargetingFailed;
|
||||
@@ -949,6 +946,9 @@ public class AiController {
|
||||
}
|
||||
}
|
||||
if (sa instanceof Spell) {
|
||||
if (card.isPermanent()) {
|
||||
return canPlayFromEffectAI((Spell) sa, false, true);
|
||||
}
|
||||
if (!player.cantLoseForZeroOrLessLife() && player.canLoseLife() &&
|
||||
ComputerUtil.getDamageForPlaying(player, sa) >= player.getLife()) {
|
||||
return AiPlayDecision.CurseEffects;
|
||||
@@ -1279,7 +1279,7 @@ public class AiController {
|
||||
return AiPlayDecision.WillPlay;
|
||||
}
|
||||
|
||||
if (spell instanceof SpellPermanent) {
|
||||
if (card.isPermanent()) {
|
||||
if (!checkETBEffects(card, spell, null)) {
|
||||
return AiPlayDecision.BadEtbEffects;
|
||||
}
|
||||
|
||||
@@ -1530,6 +1530,24 @@ public class PlayerControllerAi extends PlayerController {
|
||||
return SpellApiToAi.Converter.get(api).chooseCardName(player, sa, faces);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICardFace chooseSingleCardFace(SpellAbility sa, List<ICardFace> faces, String message) {
|
||||
ApiType api = sa.getApi();
|
||||
if (null == api) {
|
||||
throw new InvalidParameterException("SA is not api-based, this is not supported yet");
|
||||
}
|
||||
return SpellApiToAi.Converter.get(api).chooseCardFace(player, sa, faces);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CardState chooseSingleCardState(SpellAbility sa, List<CardState> states, String message, Map<String, Object> params) {
|
||||
ApiType api = sa.getApi();
|
||||
if (null == api) {
|
||||
throw new InvalidParameterException("SA is not api-based, this is not supported yet");
|
||||
}
|
||||
return SpellApiToAi.Converter.get(api).chooseCardState(player, sa, states, params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Card chooseDungeon(Player ai, List<PaperCard> dungeonCards, String message) {
|
||||
// TODO: improve the conditions that define which dungeon is a viable option to choose
|
||||
|
||||
@@ -8,6 +8,7 @@ import forge.card.mana.ManaCost;
|
||||
import forge.card.mana.ManaCostParser;
|
||||
import forge.game.GameEntity;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardState;
|
||||
import forge.game.card.CounterType;
|
||||
import forge.game.cost.Cost;
|
||||
import forge.game.mana.ManaCostBeingPaid;
|
||||
@@ -365,6 +366,18 @@ public abstract class SpellAbilityAi {
|
||||
return face == null ? "" : face.getName();
|
||||
}
|
||||
|
||||
public ICardFace chooseCardFace(Player ai, SpellAbility sa, List<ICardFace> faces) {
|
||||
System.err.println("Warning: default (ie. inherited from base class) implementation of chooseCardFace is used for " + this.getClass().getName() + ". Consider declaring an overloaded method");
|
||||
|
||||
return Iterables.getFirst(faces, null);
|
||||
}
|
||||
|
||||
public CardState chooseCardState(Player ai, SpellAbility sa, List<CardState> faces, Map<String, Object> params) {
|
||||
System.err.println("Warning: default (ie. inherited from base class) implementation of chooseCardState is used for " + this.getClass().getName() + ". Consider declaring an overloaded method");
|
||||
|
||||
return Iterables.getFirst(faces, null);
|
||||
}
|
||||
|
||||
public int chooseNumber(Player player, SpellAbility sa, int min, int max, Map<String, Object> params) {
|
||||
return max;
|
||||
}
|
||||
|
||||
@@ -190,6 +190,7 @@ public enum SpellApiToAi {
|
||||
.put(ApiType.TwoPiles, TwoPilesAi.class)
|
||||
.put(ApiType.Unattach, CannotPlayAi.class)
|
||||
.put(ApiType.UnattachAll, UnattachAllAi.class)
|
||||
.put(ApiType.UnlockDoor, AlwaysPlayAi.class)
|
||||
.put(ApiType.Untap, UntapAi.class)
|
||||
.put(ApiType.UntapAll, UntapAllAi.class)
|
||||
.put(ApiType.Venture, VentureAi.class)
|
||||
|
||||
@@ -12,6 +12,7 @@ public enum CardStateName {
|
||||
RightSplit,
|
||||
Adventure,
|
||||
Modal,
|
||||
EmptyRoom,
|
||||
SpecializeW,
|
||||
SpecializeU,
|
||||
SpecializeB,
|
||||
|
||||
@@ -190,7 +190,12 @@ public class GameAction {
|
||||
// Make sure the card returns from the battlefield as the original card with two halves
|
||||
resetToOriginal = true;
|
||||
}
|
||||
} else if (!zoneTo.is(ZoneType.Stack)) {
|
||||
} else if (zoneTo.is(ZoneType.Battlefield) && c.isRoom()) {
|
||||
if (c.getCastSA() == null) {
|
||||
// need to set as empty room
|
||||
c.updateRooms();
|
||||
}
|
||||
} else if (!zoneTo.is(ZoneType.Stack) && !zoneTo.is(ZoneType.Battlefield)) {
|
||||
// For regular splits, recreate the original state unless the card is going to stack as one half
|
||||
resetToOriginal = true;
|
||||
}
|
||||
@@ -604,6 +609,9 @@ public class GameAction {
|
||||
// CR 603.6b
|
||||
if (toBattlefield) {
|
||||
zoneTo.saveLKI(copied, lastKnownInfo);
|
||||
if (copied.isRoom() && copied.getCastSA() != null) {
|
||||
copied.unlockRoom(copied.getCastSA().getActivatingPlayer(), copied.getCastSA().getCardStateName());
|
||||
}
|
||||
}
|
||||
|
||||
// only now that the LKI preserved it
|
||||
|
||||
@@ -30,6 +30,7 @@ public enum AbilityKey {
|
||||
Blockers("Blockers"),
|
||||
CanReveal("CanReveal"),
|
||||
Card("Card"),
|
||||
CardState("CardState"),
|
||||
Cards("Cards"),
|
||||
CardsFiltered("CardsFiltered"),
|
||||
CardLKI("CardLKI"),
|
||||
|
||||
@@ -194,6 +194,7 @@ public enum ApiType {
|
||||
TwoPiles (TwoPilesEffect.class),
|
||||
Unattach (UnattachEffect.class),
|
||||
UnattachAll (UnattachAllEffect.class),
|
||||
UnlockDoor (UnlockDoorEffect.class),
|
||||
Untap (UntapEffect.class),
|
||||
UntapAll (UntapAllEffect.class),
|
||||
Venture (VentureEffect.class),
|
||||
|
||||
@@ -144,6 +144,7 @@ public class CloneEffect extends SpellAbilityEffect {
|
||||
|
||||
final long ts = game.getNextTimestamp();
|
||||
tgtCard.addCloneState(CardFactory.getCloneStates(cardToCopy, tgtCard, sa), ts);
|
||||
tgtCard.updateRooms();
|
||||
|
||||
// set ETB tapped of clone
|
||||
if (sa.hasParam("IntoPlayTapped")) {
|
||||
|
||||
@@ -273,6 +273,7 @@ public class CounterEffect extends SpellAbilityEffect {
|
||||
// card is no longer cast
|
||||
c.setCastSA(null);
|
||||
c.setCastFrom(null);
|
||||
c.forceTurnFaceUp();
|
||||
if (tgtSA instanceof SpellPermanent) {
|
||||
c.setController(srcSA.getActivatingPlayer(), 0);
|
||||
movedCard = game.getAction().moveToPlay(c, srcSA.getActivatingPlayer(), srcSA, params);
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
package forge.game.ability.effects;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import forge.card.CardStateName;
|
||||
import forge.game.Game;
|
||||
import forge.game.ability.SpellAbilityEffect;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardCollection;
|
||||
import forge.game.card.CardLists;
|
||||
import forge.game.card.CardState;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.Localizer;
|
||||
|
||||
public class UnlockDoorEffect extends SpellAbilityEffect {
|
||||
|
||||
@Override
|
||||
public void resolve(SpellAbility sa) {
|
||||
final Card source = sa.getHostCard();
|
||||
final Game game = source.getGame();
|
||||
final Player activator = sa.getActivatingPlayer();
|
||||
|
||||
CardCollection list;
|
||||
|
||||
if (sa.hasParam("Choices")) {
|
||||
Player chooser = activator;
|
||||
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChoose") + " ";
|
||||
|
||||
CardCollection choices = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("Choices"), activator, source, sa);
|
||||
|
||||
Card c = chooser.getController().chooseSingleEntityForEffect(choices, sa, title, Maps.newHashMap());
|
||||
if (c == null) {
|
||||
return;
|
||||
}
|
||||
list = new CardCollection(c);
|
||||
} else {
|
||||
list = getTargetCards(sa);
|
||||
}
|
||||
|
||||
for (Card c : list) {
|
||||
Map<String, Object> params = Maps.newHashMap();
|
||||
params.put("Object", c);
|
||||
switch (sa.getParamOrDefault("Mode", "ThisDoor")) {
|
||||
case "ThisDoor":
|
||||
c.unlockRoom(activator, sa.getCardStateName());
|
||||
break;
|
||||
case "Unlock":
|
||||
List<CardState> states = c.getLockedRooms().stream().map(stateName -> c.getState(stateName)).collect(Collectors.toList());
|
||||
|
||||
// need to choose Room Name
|
||||
CardState chosen = activator.getController().chooseSingleCardState(sa, states, "Choose Room to unlock", params);
|
||||
if (chosen == null) {
|
||||
continue;
|
||||
}
|
||||
c.unlockRoom(activator, chosen.getStateName());
|
||||
break;
|
||||
case "LockOrUnlock":
|
||||
switch (c.getLockedRooms().size()) {
|
||||
case 0:
|
||||
// no locked, all unlocked, can only lock door
|
||||
List<CardState> unlockStates = c.getUnlockedRooms().stream().map(stateName -> c.getState(stateName)).collect(Collectors.toList());
|
||||
CardState chosenUnlock = activator.getController().chooseSingleCardState(sa, unlockStates, "Choose Room to lock", params);
|
||||
if (chosenUnlock == null) {
|
||||
continue;
|
||||
}
|
||||
c.lockRoom(activator, chosenUnlock.getStateName());
|
||||
break;
|
||||
case 1:
|
||||
// TODO check for Lock vs Unlock first?
|
||||
List<CardState> bothStates = Lists.newArrayList();
|
||||
bothStates.add(c.getState(CardStateName.LeftSplit));
|
||||
bothStates.add(c.getState(CardStateName.RightSplit));
|
||||
CardState chosenBoth = activator.getController().chooseSingleCardState(sa, bothStates, "Choose Room to lock or unlock", params);
|
||||
if (chosenBoth == null) {
|
||||
continue;
|
||||
}
|
||||
if (c.getLockedRooms().contains(chosenBoth.getStateName())) {
|
||||
c.unlockRoom(activator, chosenBoth.getStateName());
|
||||
} else {
|
||||
c.lockRoom(activator, chosenBoth.getStateName());
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
List<CardState> lockStates = c.getLockedRooms().stream().map(stateName -> c.getState(stateName)).collect(Collectors.toList());
|
||||
|
||||
// need to choose Room Name
|
||||
CardState chosenLock = activator.getController().chooseSingleCardState(sa, lockStates, "Choose Room to unlock", params);
|
||||
if (chosenLock == null) {
|
||||
continue;
|
||||
}
|
||||
c.unlockRoom(activator, chosenLock.getStateName());
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -215,6 +215,9 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
|
||||
private boolean plotted;
|
||||
|
||||
private Set<CardStateName> unlockedRooms = EnumSet.noneOf(CardStateName.class);
|
||||
private Map<CardStateName, SpellAbility> unlockAbilities = Maps.newEnumMap(CardStateName.class);
|
||||
|
||||
private boolean specialized;
|
||||
|
||||
private int timesCrewedThisTurn = 0;
|
||||
@@ -444,6 +447,9 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
if (state == CardStateName.FaceDown) {
|
||||
return getFaceDownState();
|
||||
}
|
||||
if (state == CardStateName.EmptyRoom) {
|
||||
return getEmptyRoomState();
|
||||
}
|
||||
CardCloneStates clStates = getLastClonedState();
|
||||
if (clStates == null) {
|
||||
return getOriginalState(state);
|
||||
@@ -452,7 +458,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
}
|
||||
|
||||
public boolean hasState(final CardStateName state) {
|
||||
if (state == CardStateName.FaceDown) {
|
||||
if (state == CardStateName.FaceDown || state == CardStateName.EmptyRoom) {
|
||||
return true;
|
||||
}
|
||||
CardCloneStates clStates = getLastClonedState();
|
||||
@@ -466,6 +472,9 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
if (state == CardStateName.FaceDown) {
|
||||
return getFaceDownState();
|
||||
}
|
||||
if (state == CardStateName.EmptyRoom) {
|
||||
return getEmptyRoomState();
|
||||
}
|
||||
return states.get(state);
|
||||
}
|
||||
|
||||
@@ -492,7 +501,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
boolean needsTransformAnimation = transform || rollback;
|
||||
// faceDown has higher priority over clone states
|
||||
// while text change states doesn't apply while the card is faceDown
|
||||
if (state != CardStateName.FaceDown) {
|
||||
if (state != CardStateName.FaceDown && state != CardStateName.EmptyRoom) {
|
||||
CardCloneStates cloneStates = getLastClonedState();
|
||||
if (cloneStates != null) {
|
||||
if (!cloneStates.containsKey(state)) {
|
||||
@@ -796,6 +805,10 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
return setState(CardStateName.FaceDown, false);
|
||||
}
|
||||
|
||||
public void forceTurnFaceUp() {
|
||||
turnFaceUp(false, null);
|
||||
}
|
||||
|
||||
public boolean turnFaceUp(SpellAbility cause) {
|
||||
return turnFaceUp(true, cause);
|
||||
}
|
||||
@@ -930,6 +943,10 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
return alt ? StaticData.instance().getCommonCards().getName(name, true) : name;
|
||||
}
|
||||
|
||||
public final boolean hasNameOverwrite() {
|
||||
return changedCardNames.values().stream().anyMatch(CardChangedName::isOverwrite);
|
||||
}
|
||||
|
||||
public final boolean hasNonLegendaryCreatureNames() {
|
||||
boolean result = false;
|
||||
for (CardChangedName change : this.changedCardNames.values()) {
|
||||
@@ -1041,7 +1058,12 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
}
|
||||
|
||||
public final boolean isSplitCard() {
|
||||
return getRules() != null && getRules().getSplitType() == CardSplitType.Split;
|
||||
// Normal Split Cards, these need to return true before Split States are added
|
||||
if (getRules() != null && getRules().getSplitType() == CardSplitType.Split) {
|
||||
return true;
|
||||
};
|
||||
// in case or clones or copies
|
||||
return hasState(CardStateName.LeftSplit);
|
||||
}
|
||||
|
||||
public final boolean isAdventureCard() {
|
||||
@@ -4088,13 +4110,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
if (Iterables.isEmpty(changedCardTypes)) {
|
||||
return state.getType();
|
||||
}
|
||||
// CR 506.4 attacked planeswalkers leave combat
|
||||
boolean checkCombat = state.getType().isPlaneswalker() && game.getCombat() != null && !game.getCombat().getAttackersOf(this).isEmpty();
|
||||
CardTypeView types = state.getType().getTypeWithChanges(changedCardTypes);
|
||||
if (checkCombat && !types.isPlaneswalker()) {
|
||||
game.getCombat().removeFromCombat(this);
|
||||
}
|
||||
return types;
|
||||
return state.getType().getTypeWithChanges(changedCardTypes);
|
||||
}
|
||||
|
||||
public final CardTypeView getOriginalType() {
|
||||
@@ -5577,6 +5593,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
|
||||
public final boolean isOutlaw() { return getType().isOutlaw(); }
|
||||
|
||||
public final boolean isRoom() { return getType().hasSubtype("Room"); }
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public final int compareTo(final Card that) {
|
||||
@@ -5987,9 +6005,21 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
boolean shares = getName(true).equals(name);
|
||||
|
||||
// Split cards has extra logic to check if it does share a name with
|
||||
if (isSplitCard()) {
|
||||
shares |= name.equals(getState(CardStateName.LeftSplit).getName());
|
||||
shares |= name.equals(getState(CardStateName.RightSplit).getName());
|
||||
if (!shares && !hasNameOverwrite()) {
|
||||
if (isInPlay()) {
|
||||
// split cards in play are only rooms
|
||||
for (String door : getUnlockedRoomNames()) {
|
||||
shares |= name.equals(door);
|
||||
}
|
||||
} else { // not on the battlefield
|
||||
if (hasState(CardStateName.LeftSplit)) {
|
||||
shares |= name.equals(getState(CardStateName.LeftSplit).getName());
|
||||
}
|
||||
if (hasState(CardStateName.RightSplit)) {
|
||||
shares |= name.equals(getState(CardStateName.RightSplit).getName());
|
||||
}
|
||||
}
|
||||
// TODO does it need extra check for stack?
|
||||
}
|
||||
|
||||
if (!shares && hasNonLegendaryCreatureNames()) {
|
||||
@@ -7476,6 +7506,15 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
}
|
||||
}
|
||||
|
||||
if (isInPlay() && !isPhasedOut() && player.canCastSorcery()) {
|
||||
if (getCurrentStateName() == CardStateName.RightSplit || getCurrentStateName() == CardStateName.EmptyRoom) {
|
||||
abilities.add(getUnlockAbility(CardStateName.LeftSplit));
|
||||
}
|
||||
if (getCurrentStateName() == CardStateName.LeftSplit || getCurrentStateName() == CardStateName.EmptyRoom) {
|
||||
abilities.add(getUnlockAbility(CardStateName.RightSplit));
|
||||
}
|
||||
}
|
||||
|
||||
if (isInPlay() && isFaceDown() && oState.getType().isCreature() && oState.getManaCost() != null && !oState.getManaCost().isNoCost())
|
||||
{
|
||||
if (isManifested()) {
|
||||
@@ -7715,12 +7754,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
}
|
||||
}
|
||||
|
||||
public void forceTurnFaceUp() {
|
||||
getGame().getTriggerHandler().suppressMode(TriggerType.TurnFaceUp);
|
||||
turnFaceUp(false, null);
|
||||
getGame().getTriggerHandler().clearSuppression(TriggerType.TurnFaceUp);
|
||||
}
|
||||
|
||||
public final void addGoad(Long timestamp, final Player p) {
|
||||
goad.put(timestamp, p);
|
||||
updateAbilityTextForView();
|
||||
@@ -8083,4 +8116,107 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
|
||||
}
|
||||
return StaticAbilityWitherDamage.isWitherDamage(this);
|
||||
}
|
||||
|
||||
public Set<CardStateName> getUnlockedRooms() {
|
||||
return this.unlockedRooms;
|
||||
}
|
||||
public void setUnlockedRooms(Set<CardStateName> set) {
|
||||
this.unlockedRooms = set;
|
||||
}
|
||||
|
||||
public List<String> getUnlockedRoomNames() {
|
||||
List<String> result = Lists.newArrayList();
|
||||
for (CardStateName stateName : unlockedRooms) {
|
||||
if (this.hasState(stateName)) {
|
||||
result.add(this.getState(stateName).getName());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public Set<CardStateName> getLockedRooms() {
|
||||
Set<CardStateName> result = Sets.newHashSet(CardStateName.LeftSplit, CardStateName.RightSplit);
|
||||
result.removeAll(this.unlockedRooms);
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<String> getLockedRoomNames() {
|
||||
List<String> result = Lists.newArrayList();
|
||||
for (CardStateName stateName : getLockedRooms()) {
|
||||
if (this.hasState(stateName)) {
|
||||
result.add(this.getState(stateName).getName());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public boolean unlockRoom(Player p, CardStateName stateName) {
|
||||
if (unlockedRooms.contains(stateName) || (stateName != CardStateName.LeftSplit && stateName != CardStateName.RightSplit)) {
|
||||
return false;
|
||||
}
|
||||
unlockedRooms.add(stateName);
|
||||
|
||||
updateRooms();
|
||||
|
||||
Map<AbilityKey, Object> unlockParams = AbilityKey.mapFromPlayer(p);
|
||||
unlockParams.put(AbilityKey.Card, this);
|
||||
unlockParams.put(AbilityKey.CardState, getState(stateName));
|
||||
getGame().getTriggerHandler().runTrigger(TriggerType.UnlockDoor, unlockParams, true);
|
||||
|
||||
// fully unlock
|
||||
if (unlockedRooms.size() > 1) {
|
||||
Map<AbilityKey, Object> fullyUnlockParams = AbilityKey.mapFromPlayer(p);
|
||||
fullyUnlockParams.put(AbilityKey.Card, this);
|
||||
|
||||
getGame().getTriggerHandler().runTrigger(TriggerType.FullyUnlock, fullyUnlockParams, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean lockRoom(Player p, CardStateName stateName) {
|
||||
if (!unlockedRooms.contains(stateName) || (stateName != CardStateName.LeftSplit && stateName != CardStateName.RightSplit)) {
|
||||
return false;
|
||||
}
|
||||
unlockedRooms.remove(stateName);
|
||||
|
||||
updateRooms();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void updateRooms() {
|
||||
if (!this.isRoom()) {
|
||||
return;
|
||||
}
|
||||
if (this.isFaceDown()) {
|
||||
return;
|
||||
}
|
||||
if (unlockedRooms.isEmpty()) {
|
||||
this.setState(CardStateName.EmptyRoom, true);
|
||||
} else if (unlockedRooms.size() > 1) {
|
||||
this.setState(CardStateName.Original, true);
|
||||
} else { // we already know the set is only one
|
||||
for (CardStateName name : unlockedRooms) {
|
||||
this.setState(name, true);
|
||||
}
|
||||
}
|
||||
// update trigger after state change
|
||||
getGame().getTriggerHandler().clearActiveTriggers(this, null);
|
||||
getGame().getTriggerHandler().registerActiveTrigger(this, false);
|
||||
}
|
||||
|
||||
public CardState getEmptyRoomState() {
|
||||
if (!states.containsKey(CardStateName.EmptyRoom)) {
|
||||
states.put(CardStateName.EmptyRoom, CardUtil.getEmptyRoomCharacteristic(this));
|
||||
}
|
||||
return states.get(CardStateName.EmptyRoom);
|
||||
}
|
||||
|
||||
public SpellAbility getUnlockAbility(CardStateName state) {
|
||||
if (!unlockAbilities.containsKey(state)) {
|
||||
unlockAbilities.put(state, CardFactoryUtil.abilityUnlockRoom(getState(state)));
|
||||
}
|
||||
return unlockAbilities.get(state);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -258,6 +258,16 @@ public class CardFactory {
|
||||
final CardState original = card.getState(CardStateName.Original);
|
||||
original.addNonManaAbilities(card.getCurrentState().getNonManaAbilities());
|
||||
original.addIntrinsicKeywords(card.getCurrentState().getIntrinsicKeywords()); // Copy 'Fuse' to original side
|
||||
for (Trigger t : card.getCurrentState().getTriggers()) {
|
||||
if (t.isIntrinsic()) {
|
||||
original.addTrigger(t.copy(card, false));
|
||||
}
|
||||
}
|
||||
for (StaticAbility st : card.getCurrentState().getStaticAbilities()) {
|
||||
if (st.isIntrinsic()) {
|
||||
original.addStaticAbility(st.copy(card, false));
|
||||
}
|
||||
}
|
||||
original.getSVars().putAll(card.getCurrentState().getSVars()); // Unfortunately need to copy these to (Effect looks for sVars on execute)
|
||||
} else if (state != CardStateName.Original) {
|
||||
CardFactoryUtil.setupKeywordedAbilities(card);
|
||||
@@ -415,7 +425,11 @@ public class CardFactory {
|
||||
c.setAttractionLights(face.getAttractionLights());
|
||||
|
||||
// SpellPermanent only for Original State
|
||||
if (c.getCurrentStateName() == CardStateName.Original || c.getCurrentStateName() == CardStateName.Modal || c.getCurrentStateName().toString().startsWith("Specialize")) {
|
||||
if (c.getCurrentStateName() == CardStateName.Original ||
|
||||
c.getCurrentStateName() == CardStateName.LeftSplit ||
|
||||
c.getCurrentStateName() == CardStateName.RightSplit ||
|
||||
c.getCurrentStateName() == CardStateName.Modal ||
|
||||
c.getCurrentStateName().toString().startsWith("Specialize")) {
|
||||
if (c.isLand()) {
|
||||
SpellAbility sa = new LandAbility(c);
|
||||
sa.setCardState(c.getCurrentState());
|
||||
|
||||
@@ -119,6 +119,12 @@ public class CardFactoryUtil {
|
||||
return morphDown;
|
||||
}
|
||||
|
||||
public static SpellAbility abilityUnlockRoom(CardState cardState) {
|
||||
String unlockStr = "ST$ UnlockDoor | Cost$ " + cardState.getManaCost().getShortString() + " | Unlock$ True | SpellDescription$ Unlock " + cardState.getName();
|
||||
|
||||
return AbilityFactory.getAbility(unlockStr, cardState);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* abilityMorphUp.
|
||||
|
||||
@@ -215,6 +215,24 @@ public final class CardUtil {
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static CardState getEmptyRoomCharacteristic(Card c) {
|
||||
return getEmptyRoomCharacteristic(c, CardStateName.EmptyRoom);
|
||||
}
|
||||
public static CardState getEmptyRoomCharacteristic(Card c, CardStateName state) {
|
||||
final CardType type = new CardType(false);
|
||||
type.add("Enchantment");
|
||||
type.add("Room");
|
||||
final CardState ret = new CardState(c, state);
|
||||
|
||||
ret.setName("");
|
||||
ret.setType(type);
|
||||
|
||||
// find new image key for empty room
|
||||
ret.setImageKey(c.getImageKey());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// a nice entry point with minimum parameters
|
||||
public static Set<String> getReflectableManaColors(final SpellAbility sa) {
|
||||
return getReflectableManaColors(sa, sa, Sets.newHashSet(), new CardCollection());
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package forge.game.card;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
import forge.ImageKeys;
|
||||
import forge.StaticData;
|
||||
@@ -40,6 +41,14 @@ public class CardView extends GameEntityView {
|
||||
return s == null ? null : s.getView();
|
||||
}
|
||||
|
||||
public static Map<CardStateView, CardState> getStateMap(Iterable<CardState> states) {
|
||||
Map<CardStateView, CardState> stateViewCache = Maps.newLinkedHashMap();
|
||||
for (CardState state : states) {
|
||||
stateViewCache.put(state.getView(), state);
|
||||
}
|
||||
return stateViewCache;
|
||||
}
|
||||
|
||||
public CardView getBackup() {
|
||||
if (get(TrackableProperty.PaperCardBackup) == null)
|
||||
return null;
|
||||
@@ -795,7 +804,7 @@ public class CardView extends GameEntityView {
|
||||
sb.append(getOwner().getCommanderInfo(this)).append("\r\n");
|
||||
}
|
||||
|
||||
if (isSplitCard() && !isFaceDown() && getZone() != ZoneType.Stack) {
|
||||
if (isSplitCard() && !isFaceDown() && getZone() != ZoneType.Stack && getZone() != ZoneType.Battlefield) {
|
||||
sb.append("(").append(getLeftSplitState().getName()).append(") ");
|
||||
sb.append(getLeftSplitState().getAbilityText());
|
||||
sb.append("\r\n\r\n").append("(").append(getRightSplitState().getName()).append(") ");
|
||||
@@ -1183,6 +1192,11 @@ public class CardView extends GameEntityView {
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(getId(), state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return (getName() + " (" + getDisplayId() + ")").trim();
|
||||
|
||||
@@ -626,7 +626,7 @@ public class Combat {
|
||||
}
|
||||
|
||||
public final boolean removeAbsentCombatants() {
|
||||
// iterate all attackers and remove illegal declarations
|
||||
// CR 506.4 iterate all attackers and remove illegal declarations
|
||||
CardCollection missingCombatants = new CardCollection();
|
||||
for (Entry<GameEntity, AttackingBand> ee : attackedByBands.entries()) {
|
||||
for (Card c : ee.getValue().getAttackers()) {
|
||||
@@ -634,6 +634,12 @@ public class Combat {
|
||||
missingCombatants.add(c);
|
||||
}
|
||||
}
|
||||
if (ee.getKey() instanceof Card) {
|
||||
Card c = (Card) ee.getKey();
|
||||
if (!c.isBattle() && !c.isPlaneswalker()) {
|
||||
missingCombatants.add(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (Entry<AttackingBand, Card> be : blockedBands.entries()) {
|
||||
|
||||
@@ -64,6 +64,8 @@ import org.apache.commons.lang3.tuple.Pair;
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@@ -3954,4 +3956,12 @@ public class Player extends GameEntity implements Comparable<Player> {
|
||||
Map.Entry<Long, Player> e = declaresBlockers.lastEntry();
|
||||
return e == null ? null : e.getValue();
|
||||
}
|
||||
|
||||
public List<String> getUnlockedDoors() {
|
||||
return StreamSupport.stream(getCardsIn(ZoneType.Battlefield).spliterator(), false)
|
||||
.filter(Card::isRoom)
|
||||
.map(Card::getUnlockedRoomNames)
|
||||
.flatMap(Collection::stream)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -243,6 +243,8 @@ public abstract class PlayerController {
|
||||
public abstract byte chooseColorAllowColorless(String message, Card c, ColorSet colors);
|
||||
|
||||
public abstract ICardFace chooseSingleCardFace(SpellAbility sa, String message, Predicate<ICardFace> cpp, String name);
|
||||
public abstract ICardFace chooseSingleCardFace(SpellAbility sa, List<ICardFace> faces, String message);
|
||||
public abstract CardState chooseSingleCardState(SpellAbility sa, List<CardState> states, String message, Map<String, Object> params);
|
||||
public abstract List<String> chooseColors(String message, SpellAbility sa, int min, int max, List<String> options);
|
||||
|
||||
public abstract CounterType chooseCounterType(List<CounterType> options, SpellAbility sa, String prompt, Map<String, Object> params);
|
||||
|
||||
@@ -583,7 +583,6 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
|
||||
public ApiType getApi() {
|
||||
return api;
|
||||
}
|
||||
|
||||
public void setApi(ApiType apiType) {
|
||||
api = apiType;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,6 @@ import forge.game.player.Player;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.game.spellability.SpellAbilityStackInstance;
|
||||
import forge.game.spellability.TargetChoices;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.util.Expressions;
|
||||
import forge.util.Localizer;
|
||||
import forge.util.collect.FCollection;
|
||||
@@ -229,23 +228,6 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger {
|
||||
}
|
||||
}
|
||||
|
||||
if (hasParam("SharesNameWithActivatorsZone")) {
|
||||
String zones = getParam("SharesNameWithActivatorsZone");
|
||||
if (si == null) {
|
||||
return false;
|
||||
}
|
||||
boolean sameNameFound = false;
|
||||
for (Card c: si.getSpellAbility().getActivatingPlayer().getCardsIn(ZoneType.listValueOf(zones))) {
|
||||
if (cast.getName().equals(c.getName())) {
|
||||
sameNameFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!sameNameFound) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasParam("NoColoredMana")) {
|
||||
for (Mana m : spellAbility.getPayingMana()) {
|
||||
if (!m.isColorless()) {
|
||||
|
||||
@@ -144,6 +144,7 @@ public enum TriggerType {
|
||||
TurnBegin(TriggerTurnBegin.class),
|
||||
TurnFaceUp(TriggerTurnFaceUp.class),
|
||||
Unattach(TriggerUnattach.class),
|
||||
UnlockDoor(TriggerUnlockDoor.class),
|
||||
UntapAll(TriggerUntapAll.class),
|
||||
Untaps(TriggerUntaps.class),
|
||||
VisitAttraction(TriggerVisitAttraction.class),
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
package forge.game.trigger;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import forge.game.ability.AbilityKey;
|
||||
import forge.game.card.Card;
|
||||
import forge.game.card.CardState;
|
||||
import forge.game.spellability.SpellAbility;
|
||||
import forge.util.Localizer;
|
||||
|
||||
public class TriggerUnlockDoor extends Trigger {
|
||||
|
||||
public TriggerUnlockDoor(final Map<String, String> params, final Card host, final boolean intrinsic) {
|
||||
super(params, host, intrinsic);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean performTest(Map<AbilityKey, Object> runParams) {
|
||||
if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (hasParam("ThisDoor")) {
|
||||
CardState state = (CardState) runParams.get(AbilityKey.CardState);
|
||||
// This Card
|
||||
if (!getHostCard().equals(state.getCard())) {
|
||||
return false;
|
||||
}
|
||||
// This Face
|
||||
if (!getCardStateName().equals(state.getStateName())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTriggeringObjects(SpellAbility sa, Map<AbilityKey, Object> runParams) {
|
||||
sa.setTriggeringObjectsFrom(runParams, AbilityKey.Card, AbilityKey.Player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getImportantStackObjects(SpellAbility sa) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(Localizer.getInstance().getMessage("lblPlayer")).append(": ").append(sa.getTriggeringObject(AbilityKey.Player));
|
||||
sb.append(", ").append(Localizer.getInstance().getMessage("lblCard")).append(": ").append(sa.getTriggeringObject(AbilityKey.Card));
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -47,7 +47,7 @@ public abstract class TrackableObject implements IIdentifiable, Serializable {
|
||||
@Override
|
||||
public final boolean equals(final Object o) {
|
||||
if (o == null) { return false; }
|
||||
return o.hashCode() == id && o.getClass().equals(getClass());
|
||||
return o.hashCode() == hashCode() && o.getClass().equals(getClass());
|
||||
}
|
||||
|
||||
// don't know if this is really needed, but don't know a better way
|
||||
|
||||
@@ -198,7 +198,7 @@ public class CardDetailPanel extends SkinnedPanel {
|
||||
nameCost = name;
|
||||
} else {
|
||||
final String manaCost;
|
||||
if (card.isSplitCard() && card.hasAlternateState() && !card.isFaceDown() && card.getZone() != ZoneType.Stack) { //only display current state's mana cost when on stack
|
||||
if (card.isSplitCard() && card.hasAlternateState() && !card.isFaceDown() && card.getZone() != ZoneType.Stack && card.getZone() != ZoneType.Battlefield) { //only display current state's mana cost when on stack
|
||||
manaCost = card.getLeftSplitState().getManaCost() + " // " + card.getAlternateState().getManaCost();
|
||||
} else {
|
||||
manaCost = state.getManaCost().toString();
|
||||
|
||||
@@ -23,6 +23,7 @@ import java.util.regex.Pattern;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import forge.card.CardRarity;
|
||||
import forge.card.CardStateName;
|
||||
import forge.card.mana.ManaCost;
|
||||
import forge.game.card.CardView;
|
||||
import forge.game.card.CardView.CardStateView;
|
||||
@@ -749,8 +750,11 @@ public class FCardImageRenderer {
|
||||
//draw type
|
||||
x += padding;
|
||||
w -= padding;
|
||||
String typeLine = CardDetailUtil.formatCardType(state, true).replace(" - ", " — ");
|
||||
drawVerticallyCenteredString(g, typeLine, new Rectangle(x, y, w, h), TYPE_FONT, TYPE_SIZE);
|
||||
// check for shared type line
|
||||
if (!state.getType().hasStringType("Room") || state.getState() != CardStateName.RightSplit) {
|
||||
String typeLine = CardDetailUtil.formatCardType(state, true).replace(" - ", " — ");
|
||||
drawVerticallyCenteredString(g, typeLine, new Rectangle(x, y, w, h), TYPE_FONT, TYPE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -479,12 +479,15 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
|
||||
|
||||
private void displayIconOverlay(final Graphics g, final boolean canShow) {
|
||||
if (canShow && showCardManaCostOverlay() && cardWidth < 200) {
|
||||
final boolean showSplitMana = card.isSplitCard();
|
||||
final boolean showSplitMana = card.isSplitCard() && card.getZone() != ZoneType.Battlefield;
|
||||
if (!showSplitMana) {
|
||||
drawManaCost(g, card.getCurrentState().getManaCost(), 0);
|
||||
} else {
|
||||
if (!card.isFaceDown()) { // no need to draw mana symbols on face down split cards (e.g. manifested)
|
||||
PaperCard pc = StaticData.instance().getCommonCards().getCard(card.getName());
|
||||
PaperCard pc = null;
|
||||
if (!card.getName().isEmpty()) {
|
||||
pc = StaticData.instance().getCommonCards().getCard(card.getName());
|
||||
}
|
||||
int ofs = pc != null && Card.getCardForUi(pc).hasKeyword(Keyword.AFTERMATH) ? -12 : 12;
|
||||
|
||||
drawManaCost(g, card.getLeftSplitState().getManaCost(), ofs);
|
||||
|
||||
@@ -727,6 +727,18 @@ public class PlayerControllerForTests extends PlayerController {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICardFace chooseSingleCardFace(SpellAbility sa, List<ICardFace> faces, String message) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CardState chooseSingleCardState(SpellAbility sa, List<CardState> states, String message, Map<String, Object> params) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Card chooseDungeon(Player player, List<PaperCard> dungeonCards, String message) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
@@ -278,7 +278,7 @@ public class CardImageRenderer {
|
||||
if (!noText && state != null) {
|
||||
//draw mana cost for card
|
||||
ManaCost mainManaCost = state.getManaCost();
|
||||
if (card.isSplitCard() && card.getAlternateState() != null) {
|
||||
if (card.isSplitCard() && card.getAlternateState() != null && !card.isFaceDown() && card.getZone() != ZoneType.Stack && card.getZone() != ZoneType.Battlefield) {
|
||||
//handle rendering both parts of split card
|
||||
mainManaCost = card.getLeftSplitState().getManaCost();
|
||||
ManaCost otherManaCost = card.getRightSplitState().getManaCost();
|
||||
@@ -1117,7 +1117,7 @@ public class CardImageRenderer {
|
||||
float manaCostWidth = 0;
|
||||
if (canShow) {
|
||||
ManaCost mainManaCost = state.getManaCost();
|
||||
if (card.isSplitCard() && card.hasAlternateState() && !card.isFaceDown() && card.getZone() != ZoneType.Stack) { //only display current state's mana cost when on stack
|
||||
if (card.isSplitCard() && card.hasAlternateState() && !card.isFaceDown() && card.getZone() != ZoneType.Stack && card.getZone() != ZoneType.Battlefield) { //only display current state's mana cost when on stack
|
||||
//handle rendering both parts of split card
|
||||
mainManaCost = card.getLeftSplitState().getManaCost();
|
||||
ManaCost otherManaCost = card.getAlternateState().getManaCost();
|
||||
|
||||
@@ -854,19 +854,17 @@ public class CardRenderer {
|
||||
}
|
||||
if (showCardManaCostOverlay(card)) {
|
||||
float manaSymbolSize = w / 4.5f;
|
||||
if (card.isSplitCard() && card.hasAlternateState()) {
|
||||
if (!card.isFaceDown()) { // no need to draw mana symbols on face down split cards (e.g. manifested)
|
||||
if (isChoiceList) {
|
||||
if (card.getRightSplitState().getName().equals(details.getName()))
|
||||
drawManaCost(g, card.getRightSplitState().getManaCost(), x - padding, y, w + 2 * padding, h, manaSymbolSize);
|
||||
else
|
||||
drawManaCost(g, card.getLeftSplitState().getManaCost(), x - padding, y, w + 2 * padding, h, manaSymbolSize);
|
||||
} else {
|
||||
ManaCost leftManaCost = card.getLeftSplitState().getManaCost();
|
||||
ManaCost rightManaCost = card.getRightSplitState().getManaCost();
|
||||
drawManaCost(g, leftManaCost, x - padding, y-(manaSymbolSize/1.5f), w + 2 * padding, h, manaSymbolSize);
|
||||
drawManaCost(g, rightManaCost, x - padding, y+(manaSymbolSize/1.5f), w + 2 * padding, h, manaSymbolSize);
|
||||
}
|
||||
if (card.isSplitCard() && card.hasAlternateState() && !card.isFaceDown() && card.getZone() != ZoneType.Stack && card.getZone() != ZoneType.Battlefield) {
|
||||
if (isChoiceList) {
|
||||
if (card.getRightSplitState().getName().equals(details.getName()))
|
||||
drawManaCost(g, card.getRightSplitState().getManaCost(), x - padding, y, w + 2 * padding, h, manaSymbolSize);
|
||||
else
|
||||
drawManaCost(g, card.getLeftSplitState().getManaCost(), x - padding, y, w + 2 * padding, h, manaSymbolSize);
|
||||
} else {
|
||||
ManaCost leftManaCost = card.getLeftSplitState().getManaCost();
|
||||
ManaCost rightManaCost = card.getRightSplitState().getManaCost();
|
||||
drawManaCost(g, leftManaCost, x - padding, y-(manaSymbolSize/1.5f), w + 2 * padding, h, manaSymbolSize);
|
||||
drawManaCost(g, rightManaCost, x - padding, y+(manaSymbolSize/1.5f), w + 2 * padding, h, manaSymbolSize);
|
||||
}
|
||||
} else {
|
||||
drawManaCost(g, showAltState ? card.getAlternateState().getManaCost() : card.getCurrentState().getManaCost(), x - padding, y, w + 2 * padding, h, manaSymbolSize);
|
||||
|
||||
@@ -4,7 +4,7 @@ Types:Instant
|
||||
K:Devoid
|
||||
A:SP$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand | RememberChanged$ True | TgtPromt$ Select target nonland permanent | SubAbility$ DBEffect | SpellDescription$ Exile target nonland permanent.
|
||||
SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ MayPlay,ManaConvert | SubAbility$ DBCleanup | Duration$ Permanent | ForgetOnMoved$ Exile | SpellDescription$ You may cast that card for as long as it remains exiled, and you may spend colorless mana as though it were mana of any color to cast that spell.
|
||||
SVar:MayPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ You may cast that card for as long as it remains exiled
|
||||
SVar:MayPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ You may cast that card for as long as it remains exiled.
|
||||
SVar:ManaConvert:Mode$ ManaConvert | ValidPlayer$ You | ValidCard$ Card.IsRemembered | ValidSA$ Spell.MayPlaySource | ManaConversion$ C->AnyColor | AffectedZone$ Exile | Description$ You may spend colorless mana as though it were mana of any color to cast that spell.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
Oracle:Devoid\nExile target nonland permanent. You may cast that card for as long as it remains exiled, and you may spend colorless mana as though it were mana of any color to cast that spell.
|
||||
|
||||
@@ -6,10 +6,10 @@ Draft:Reveal CARDNAME as you draft it.
|
||||
Draft:Reveal the next card you draft and note its name.
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearchHand | TriggerDescription$ When CARDNAME enters, you may search your hand and/or library for a card with a name noted as you drafted cards named Aether Searcher. You may cast it without paying its mana cost. If you searched your library this way, shuffle.
|
||||
SVar:TrigSearchHand:DB$ ChangeZone | Origin$ Hand | Destination$ Hand | ChangeType$ Card.NotedNameAetherSearcher | ChangeNum$ 1 | RememberChanged$ True | SubAbility$ TrigBranch
|
||||
# Branch to casting the found spell
|
||||
# Branch to cast that card from hand
|
||||
SVar:TrigBranch:DB$ Branch | BranchConditionSVar$ X | BranchConditionSVarCompare$ EQ1 | TrueSubAbility$ CastFromHand | FalseSubAbility$ SearchLibrary
|
||||
SVar:CastFromHand:DB$ Play | ValidZone$ Hand | Valid$ Card.IsRemembered | Controller$ You | WithoutManaCost$ True | Optional$ True | SubAbility$ DBCleanup
|
||||
# Or search the library
|
||||
# Branch to search the library and cast that card
|
||||
SVar:SearchLibrary:DB$ ChangeZone | Origin$ Library | Destination$ Library | ChangeType$ Card.NotedNameAetherSearcher | ChangeNum$ 1 | RememberChanged$ True | SubAbility$ CastFromLibrary
|
||||
SVar:CastFromLibrary:DB$ Play | ValidZone$ Library | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | Valid$ Card.IsRemembered | Controller$ You | WithoutManaCost$ True | Optional$ True | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
|
||||
@@ -14,7 +14,7 @@ ManaCost:no cost
|
||||
Colors:red
|
||||
Types:Creature Werewolf
|
||||
PT:5/4
|
||||
T:Mode$ Transformed | ValidCard$ Card.Self | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ Whenever this creature transforms into CARDNAME, you may destroy target artifact. If that artifact is put into a graveyard this way, CARDNAME deals 3 damage to that artifact's controller
|
||||
T:Mode$ Transformed | ValidCard$ Card.Self | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ Whenever this creature transforms into CARDNAME, you may destroy target artifact. If that artifact is put into a graveyard this way, CARDNAME deals 3 damage to that artifact's controller.
|
||||
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DBDamage
|
||||
SVar:DBDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 3 | SubAbility$ DBCleanup | ConditionCheckSVar$ IsDestroyed | ConditionSVarCompare$ GE1
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
|
||||
@@ -5,6 +5,6 @@ PT:4/3
|
||||
K:Flying
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters, you may search your graveyard, hand, and/or library for a card named Magnifying Glass and/or a card named Thinking Cap and put them onto the battlefield. If you search your library this way, shuffle.
|
||||
SVar:TrigSearch:DB$ ChangeZone | OriginAlternative$ Graveyard,Hand | Hidden$ True | Origin$ Library | Destination$ Battlefield | DifferentNames$ True | ChangeType$ Card.namedMagnifying Glass,Card.namedThinking Cap | ChangeNum$ 2 | ShuffleNonMandatory$ True
|
||||
DeckHas:Ability$Artifact|Equipment
|
||||
DeckHas:Ability$Graveyard
|
||||
DeckHints:Name$Thinking Cap|Magnifying Glass
|
||||
Oracle:Flying\nWhen Agency Outfitter enters, you may search your graveyard, hand, and/or library for a card named Magnifying Glass and/or a card named Thinking Cap and put them onto the battlefield. If you search your library this way, shuffle.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Aggressive Instinct
|
||||
ManaCost:1 G
|
||||
Types:Sorcery
|
||||
A:SP$ Pump | ValidTgts$ Creature.YouCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature you control | SubAbility$ SoulsDamage | StackDescription$ None | SpellDescription$ Target creature you control deals damage equal to its power to target creature you don't control
|
||||
A:SP$ Pump | ValidTgts$ Creature.YouCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature you control | SubAbility$ SoulsDamage | StackDescription$ None | SpellDescription$ Target creature you control deals damage equal to its power to target creature you don't control.
|
||||
SVar:SoulsDamage:DB$ DealDamage | ValidTgts$ Creature.YouDontCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature you don't control | NumDmg$ X | DamageSource$ ParentTarget
|
||||
SVar:X:ParentTargeted$CardPower
|
||||
Oracle:Target creature you control deals damage equal to its power to target creature you don't control.
|
||||
|
||||
@@ -2,6 +2,6 @@ Name:Aid the Fallen
|
||||
ManaCost:1 B
|
||||
Types:Sorcery
|
||||
A:SP$ Charm | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBCreature,DBPlaneswalker
|
||||
SVar:DBCreature:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature in your graveyard | SpellDescription$ Return target creature card from your graveyard to your hand
|
||||
SVar:DBPlaneswalker:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Planeswalker.YouCtrl | TgtPrompt$ Select target planeswalker in your graveyard | SpellDescription$ Return target planeswalker card from your graveyard to your hand
|
||||
SVar:DBCreature:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature in your graveyard | SpellDescription$ Return target creature card from your graveyard to your hand.
|
||||
SVar:DBPlaneswalker:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Planeswalker.YouCtrl | TgtPrompt$ Select target planeswalker in your graveyard | SpellDescription$ Return target planeswalker card from your graveyard to your hand.
|
||||
Oracle:Choose one or both —\n• Return target creature card from your graveyard to your hand.\n• Return target planeswalker card from your graveyard to your hand.
|
||||
|
||||
@@ -17,7 +17,7 @@ ALTERNATE
|
||||
Name:Wild Goose Chase
|
||||
ManaCost:U G
|
||||
Types:Instant Adventure
|
||||
A:SP$ Draw | Defined$ You | NumCards$ 2 | SubAbility$ TrigDiscard | SpellDescription$ Draw two cards, then discard two cards
|
||||
A:SP$ Draw | Defined$ You | NumCards$ 2 | SubAbility$ TrigDiscard | SpellDescription$ Draw two cards, then discard two cards.
|
||||
SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ DBToken
|
||||
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | SpellDescription$ Create a Food token.
|
||||
Oracle:Draw two cards, then discard two cards. Create a Food token.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:All Will Be One
|
||||
ManaCost:3 R R
|
||||
Types:Enchantment
|
||||
T:Mode$ CounterPlayerAddedAll | ValidObject$ Permanent.inRealZoneBattlefield,Player | TriggerZones$ Battlefield | ValidSource$ You | Execute$ TrigDamage | TriggerDescription$ Whenever you put one or more counters on a permanent or player, CARDNAME deals that much damage to target opponent, creature an opponent controls, or planeswalker an opponent controls
|
||||
T:Mode$ CounterPlayerAddedAll | ValidObject$ Permanent.inRealZoneBattlefield,Player | TriggerZones$ Battlefield | ValidSource$ You | Execute$ TrigDamage | TriggerDescription$ Whenever you put one or more counters on a permanent or player, CARDNAME deals that much damage to target opponent, creature an opponent controls, or planeswalker an opponent controls.
|
||||
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl,Planeswalker.OppCtrl,Opponent | TgtPrompt$ Select target opponent, creature an opponent controls, or planeswalker an opponent controls. | NumDmg$ X
|
||||
SVar:X:TriggerCount$Amount
|
||||
DeckNeeds:Ability$Counters
|
||||
|
||||
@@ -9,7 +9,7 @@ SVar:Z:SVar$X/Plus.Y
|
||||
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChooseCardType | TriggerDescription$ At the beginning of your end step, choose a card type, then reveal the top two cards of your library. Put all cards of the chosen type revealed this way into your hand and the rest on the bottom of your library in any order.
|
||||
SVar:TrigChooseCardType:DB$ ChooseType | Defined$ You | Type$ Card | SubAbility$ DBDig
|
||||
SVar:DBDig:DB$ Dig | DigNum$ 2 | Reveal$ True | ChangeNum$ All | ChangeValid$ Card.ChosenType | DestinationZone2$ Library | LibraryPosition$ -1
|
||||
DeckHints:Ability$Foretell
|
||||
DeckHints:Keyword$Foretell
|
||||
AI:RemoveDeck:All
|
||||
AlternateMode:Modal
|
||||
Oracle:Alrund gets +1/+1 for each card in your hand and each foretold card you own in exile.\nAt the beginning of your end step, choose a card type, then reveal the top two cards of your library. Put all cards of the chosen type revealed this way into your hand and the rest on the bottom of your library in any order.
|
||||
|
||||
@@ -5,4 +5,4 @@ PT:5/4
|
||||
Draft:Draft CARDNAME face up.
|
||||
Draft:As long as CARDNAME is face up during the draft, you can't look at booster packs and must draft cards at random. After you draft three cards this way, turn CARDNAME face down. (You may look at cards as you draft them.)
|
||||
K:Flying
|
||||
Oracle:Draft Archdemon of Paliano face up.\n\nAs long as Archdemon of Paliano is face up during the draft, you can't look at booster packs and must draft cards at random. After you draft three cards this way, turn Archdemon of Paliano face down. (You may look at cards as you draft them.)\nFlying
|
||||
Oracle:Draft Archdemon of Paliano face up.\nAs long as Archdemon of Paliano is face up during the draft, you can't look at booster packs and must draft cards at random. After you draft three cards this way, turn Archdemon of Paliano face down. (You may look at cards as you draft them.)\nFlying
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:X G
|
||||
Types:Sorcery
|
||||
A:SP$ PutCounter | TargetMin$ 0 | TargetMax$ X | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select up to X target lands you control | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBAnimate | SpellDescription$ Put two +1/+1 counters on each of up to X target lands you control. They each become 0/0 Elemental creatures with reach, haste, and "When this creature leaves the battlefield, conjure a card named Forest onto the battlefield tapped." They're still lands.
|
||||
SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste & Reach | Duration$ Permanent | Triggers$ DiesTrig
|
||||
SVar:DiesTrig:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigConjure | TriggerDescription$ When this creature leaves the battlefield, conjure a card named Forest onto the battlefield tapped
|
||||
SVar:DiesTrig:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigConjure | TriggerDescription$ When this creature leaves the battlefield, conjure a card named Forest onto the battlefield tapped.
|
||||
SVar:TrigConjure:DB$ MakeCard | Conjure$ True | Name$ Forest | Zone$ Battlefield | Tapped$ True
|
||||
SVar:X:Count$xPaid
|
||||
DeckHas:Type$Elemental & Ability$Counters
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Asinine Antics
|
||||
ManaCost:2 U U
|
||||
Types:Sorcery
|
||||
K:MayFlashCost:2
|
||||
A:SP$ RepeatEach | RepeatCards$ Creature.OppCtrl | Zone$ Battlefield | RepeatSubAbility$ DBToken | ChangeZoneTable$ True | SpellDescription$ For each creature your opponents control, create a Cursed Role token attached to that creature. (if you control another Role on it, put that one into the graveyard. Enchanted creature is 1/1)
|
||||
A:SP$ RepeatEach | RepeatCards$ Creature.OppCtrl | Zone$ Battlefield | RepeatSubAbility$ DBToken | ChangeZoneTable$ True | SpellDescription$ For each creature your opponents control, create a Cursed Role token attached to that creature. (If you control another Role on it, put that one into the graveyard. Enchanted creature is 1/1.)
|
||||
SVar:DBToken:DB$ Token | TokenScript$ role_cursed | AttachedTo$ Remembered
|
||||
DeckHas:Type$Aura|Role & Ability$Token
|
||||
Oracle:You may cast Asinine Antics as though it had flash if you pay {2} more to cast it. \nFor each creature your opponents control, create a Cursed Role token attached to that creature. (if you control another Role on it, put that one into the graveyard. Enchanted creature is 1/1)
|
||||
Oracle:You may cast Asinine Antics as though it had flash if you pay {2} more to cast it. \nFor each creature your opponents control, create a Cursed Role token attached to that creature. (If you control another Role on it, put that one into the graveyard. Enchanted creature is 1/1.)
|
||||
|
||||
@@ -7,7 +7,7 @@ SVar:CurrentLife:Count$YourLifeTotal
|
||||
SVar:X:Count$YourStartingLife/HalfDown
|
||||
T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+Other+YouCtrl | Origin$ Battlefield | Destination$ Graveyard | Execute$ DBAskOpponentDrawOrPlay | TriggerZones$ Battlefield | TriggerDescription$ Whenever another nontoken creature you control dies, target opponent may have you draw a card. If they don't, you may put a creature card with equal or lesser toughness from your hand onto the battlefield.
|
||||
SVar:DBAskOpponentDrawOrPlay:DB$ GenericChoice | ValidTgts$ Opponent | Choices$ DBDrawCard,DBCheatCreature
|
||||
SVar:DBDrawCard:DB$ Draw | Defined$ You | NumCards$ 1 | SpellDescription$ Controller draws a card
|
||||
SVar:DBCheatCreature:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.toughnessLEY | ChangeNum$ 1 | SpellDescription$ Controller may put a creature card with equal or lesser toughness from your hand onto the battlefield.
|
||||
SVar:DBDrawCard:DB$ Draw | Defined$ You | NumCards$ 1 | SpellDescription$ CARDNAME's controller draws a card.
|
||||
SVar:DBCheatCreature:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.toughnessLEY | ChangeNum$ 1 | SpellDescription$ CARDNAME's controller may put a creature card with equal or lesser toughness from their hand onto the battlefield.
|
||||
SVar:Y:TriggeredCard$CardToughness
|
||||
Oracle:As long as your life total is less than or equal to half your starting life total, Bane, Lord of Darkness has indestructible.\nWhenever another nontoken creature you control dies, target opponent may have you draw a card. If they don't, you may put a creature card with equal or lesser toughness from your hand onto the battlefield.
|
||||
|
||||
@@ -2,5 +2,5 @@ Name:Battershield Warrior
|
||||
ManaCost:2 W
|
||||
Types:Creature Human Warrior
|
||||
PT:2/2
|
||||
A:AB$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | Boast$ True | SpellDescription$ Creatures you control get +1/+1 until end of turn
|
||||
A:AB$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | Boast$ True | SpellDescription$ Creatures you control get +1/+1 until end of turn.
|
||||
Oracle:Boast — {1}{W}: Creatures you control get +1/+1 until end of turn. (Activate only if this creature attacked this turn and only once each turn.)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Name:Black Tulip
|
||||
ManaCost:0
|
||||
Types:Artifact
|
||||
A:AB$ Mana | Cost$ T Exile<1/CARDNAME> | Produced$ Any | Amount$ 3 | AILogic$ BlackLotus | CheckSVar$ Count$YourTurns | SVarCompare$ GE6 | SpellDescription$ Add three mana of any one color. You can't activate this ability until you've begun your sixth turn of the game (Keep track if this is in your deck!)
|
||||
Oracle:{T}, Exile Black Tulip: Add three mana of any one color. You can't activate this ability until you've begun your sixth turn of the game (Keep track if this is in your deck!)
|
||||
A:AB$ Mana | Cost$ T Exile<1/CARDNAME> | Produced$ Any | Amount$ 3 | AILogic$ BlackLotus | CheckSVar$ Count$YourTurns | SVarCompare$ GE6 | SpellDescription$ Add three mana of any one color. You can't activate this ability until you've begun your sixth turn of the game. (Keep track if this is in your deck!)
|
||||
Oracle:{T}, Exile Black Tulip: Add three mana of any one color. You can't activate this ability until you've begun your sixth turn of the game. (Keep track if this is in your deck!)
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:3 W W
|
||||
Types:Enchantment
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self,Enchantment.Other+YouCtrl | Execute$ TrigCounter | TriggerDescription$ Constellation — Whenever CARDNAME or another enchantment you control enters, put a blessing counter on CARDNAME.
|
||||
SVar:TrigCounter:DB$ PutCounter | CounterType$ BLESSING | CounterNum$ 1
|
||||
S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ X | AddToughness$ X | Description$ Creatures you control get +1/+1 for each blessing counter on CARDNAME
|
||||
S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ X | AddToughness$ X | Description$ Creatures you control get +1/+1 for each blessing counter on CARDNAME.
|
||||
SVar:X:Count$CardCounters.BLESSING
|
||||
DeckHints:Type$Enchantment
|
||||
DeckHas:Ability$Counters
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Name:Brainsurge
|
||||
ManaCost:2 U
|
||||
Types:Instant
|
||||
A:SP$ Draw | NumCards$ 4 | StackDescription$ {p:You} draws four cards, | SpellDescription$ Draw four cards, then put two cards from your hand on top of your library in any order | SubAbility$ ChangeZoneDB
|
||||
A:SP$ Draw | NumCards$ 4 | StackDescription$ {p:You} draws four cards, | SpellDescription$ Draw four cards, then put two cards from your hand on top of your library in any order. | SubAbility$ ChangeZoneDB
|
||||
SVar:ChangeZoneDB:DB$ ChangeZone | Origin$ Hand | Destination$ Library | ChangeNum$ 2 | Mandatory$ True | Reorder$ True | StackDescription$ then puts two cards from their hand on top of their library in any order.
|
||||
Oracle:Draw four cards, then put two cards from your hand on top of your library in any order.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Brawl
|
||||
ManaCost:3 R R
|
||||
Types:Instant
|
||||
A:SP$ AnimateAll | ValidCards$ Creature | Abilities$ ThrowPunch | SpellDescription$ Until end of turn, all creatures gain "{T}: This creature deals damage equal to its power to target creature."
|
||||
SVar:ThrowPunch:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ BrawlX | SpellDescription$ This creature deals damage equal to its power to target creature.
|
||||
SVar:ThrowPunch:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ BrawlX | SpellDescription$ CARDNAME deals damage equal to its power to target creature.
|
||||
SVar:BrawlX:Count$CardPower
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Until end of turn, all creatures gain "{T}: This creature deals damage equal to its power to target creature."
|
||||
|
||||
@@ -8,8 +8,8 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ Aurify | TriggerDescription$ W
|
||||
T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ Aurify | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, you may attach to it any number of Auras on the battlefield and you may put onto the battlefield attached to it any number of Aura cards that could enchant it from your graveyard and/or hand.
|
||||
SVar:Aurify:DB$ RepeatEach | RepeatSubAbility$ BrunaAttach | RepeatCards$ Aura.CanEnchantSource+!Attached | SubAbility$ ZoneAuras
|
||||
SVar:BrunaAttach:DB$ Attach | Object$ Remembered | Defined$ Self | Optional$ True
|
||||
SVar:ZoneAuras:DB$ ChangeZone | Origin$ Hand,Graveyard | Destination$ Battlefield | ChangeType$ Aura.CanEnchantSource+YouOwn | AttachedTo$ Self | ChangeNum$ Count | Optional$ True | Hidden$ True
|
||||
SVar:Count:Count$ValidHand,Graveyard Aura.CanEnchantSource+YouOwn
|
||||
SVar:ZoneAuras:DB$ ChangeZone | Origin$ Hand,Graveyard | Destination$ Battlefield | ChangeType$ Aura.CanEnchantSource+YouOwn | AttachedTo$ Self | ChangeNum$ CountAuras | Optional$ True | Hidden$ True
|
||||
SVar:CountAuras:Count$ValidHand,Graveyard Aura.CanEnchantSource+YouOwn
|
||||
SVar:HasAttackEffect:TRUE
|
||||
SVar:HasBlockEffect:TRUE
|
||||
DeckNeeds:Type$Aura
|
||||
|
||||
@@ -2,5 +2,5 @@ Name:Cabal Inquisitor
|
||||
ManaCost:1 B
|
||||
Types:Creature Human Minion
|
||||
PT:1/1
|
||||
A:AB$ Discard | Cost$ 1 B T ExileFromGrave<2/Card> | ValidTgts$ Player | Activation$ Threshold | NumCards$ 1 | Mode$ TgtChoose | SorcerySpeed$ True | SpellDescription$ Target player discards a card. Activate only as a sorcery and only if seven or more cards are in your graveyard. | PrecostDesc$ Threshold —
|
||||
A:AB$ Discard | Cost$ 1 B T ExileFromGrave<2/Card> | ValidTgts$ Player | Activation$ Threshold | PrecostDesc$ Threshold — | NumCards$ 1 | Mode$ TgtChoose | SorcerySpeed$ True | SpellDescription$ Target player discards a card. Activate only as a sorcery and only if seven or more cards are in your graveyard.
|
||||
Oracle:Threshold — {1}{B}, {T}, Exile two cards from your graveyard: Target player discards a card. Activate only as a sorcery and only if seven or more cards are in your graveyard.
|
||||
|
||||
@@ -3,5 +3,5 @@ ManaCost:1 B B
|
||||
Types:Creature Human Minion
|
||||
PT:1/1
|
||||
A:AB$ Pump | Cost$ B T | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets -1/-1 until end of turn.
|
||||
A:AB$ Pump | Cost$ 3 B B T | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | Activation$ Threshold | SpellDescription$ Target creature gets -2/-2 until end of turn. Activate only if seven or more cards are in your graveyard. | PrecostDesc$ Threshold —
|
||||
A:AB$ Pump | Cost$ 3 B B T | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | Activation$ Threshold | PrecostDesc$ Threshold — | SpellDescription$ Target creature gets -2/-2 until end of turn. Activate only if seven or more cards are in your graveyard.
|
||||
Oracle:{B}, {T}: Target creature gets -1/-1 until end of turn.\nThreshold — {3}{B}{B}, {T}: Target creature gets -2/-2 until end of turn. Activate only if seven or more cards are in your graveyard.
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
Name:Call a Surprise Witness
|
||||
ManaCost:1 W
|
||||
Types:Sorcery
|
||||
A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl+cmcLE3 | AnimateSubAbility$ DBAnimate | RememberChanged$ True | SubAbility$ DBPutCounter | TgtPrompt$ Select target creature card with mana value 3 or less | SpellDescription$ Return target creature card with mana value 3 or less from your graveyard to the battlefield.
|
||||
SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ Flying | CounterNum$ 1 | SubAbility$ DBCleanup | SpellDescription$ Put a flying counter on it
|
||||
SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Spirit | Duration$ Permanent | SpellDescription$ It's a Spirit in addition to its other types.
|
||||
A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl+cmcLE3 | AnimateSubAbility$ DBAnimate | RememberChanged$ True | SubAbility$ DBPutCounter | TgtPrompt$ Select target creature card with mana value 3 or less | StackDescription$ REP Return_{p:You} returns & target creature card with mana value 3 or less_{c:Targeted} & your_their & Put_{p:You} puts & on it_on {c:Targeted} | SpellDescription$ Return target creature card with mana value 3 or less from your graveyard to the battlefield. Put a flying counter on it. It's a Spirit in addition to its other types.
|
||||
SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ Flying | CounterNum$ 1 | SubAbility$ DBCleanup | StackDescription$ None
|
||||
SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Spirit | Duration$ Permanent
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
DeckHas:Ability$Graveyard & Type$Spirit
|
||||
Oracle:Return target creature card with mana value 3 or less from your graveyard to the battlefield. Put a flying counter on it. It's a Spirit in addition to its other types.
|
||||
|
||||
@@ -4,7 +4,7 @@ Types:Sorcery
|
||||
A:SP$ GainControl | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | AllValid$ Creature.TargetedPlayerCtrl | AddKWs$ Haste | Untap$ True | NewController$ You | LoseControl$ EOT | RememberControlled$ True | SubAbility$ DBEffect | SpellDescription$ Gain control of all creatures target opponent controls until end of turn. Untap those creatures. They gain haste until end of turn. You can't attack that player this turn. You can't sacrifice those creatures this turn.
|
||||
SVar:DBEffect:DB$ Effect | RememberObjects$ TargetedPlayer,RememberedCard | StaticAbilities$ CantSac,CantAttack | SubAbility$ DBCleanup
|
||||
SVar:CantSac:Mode$ CantSacrifice | ValidCard$ Card.IsRemembered+YouCtrl | Description$ You can't sacrifice those creatures this turn.
|
||||
SVar:CantAttack:Mode$ CantAttack | ValidCard$ Creature.YouCtrl | Target$ Player.IsRemembered | Description$ You can't attack that player this turn
|
||||
SVar:CantAttack:Mode$ CantAttack | ValidCard$ Creature.YouCtrl | Target$ Player.IsRemembered | Description$ You can't attack that player this turn.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Gain control of all creatures target opponent controls until end of turn. Untap those creatures. They gain haste until end of turn. You can't attack that player this turn. You can't sacrifice those creatures this turn.
|
||||
|
||||
@@ -2,9 +2,9 @@ Name:Casualties of War
|
||||
ManaCost:2 B B G G
|
||||
Types:Sorcery
|
||||
A:SP$ Charm | MinCharmNum$ 1 | CharmNum$ 5 | Choices$ DestroyArtifact,DestroyCreature,DestroyEnchantment,DestroyLand,DestroyPlaneswalker
|
||||
SVar:DestroyArtifact:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact
|
||||
SVar:DestroyArtifact:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact.
|
||||
SVar:DestroyCreature:DB$ Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature.
|
||||
SVar:DestroyEnchantment:DB$ Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target Enchantment | SpellDescription$ Destroy target Enchantment.
|
||||
SVar:DestroyEnchantment:DB$ Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target Enchantment | SpellDescription$ Destroy target enchantment.
|
||||
SVar:DestroyLand:DB$ Destroy | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land.
|
||||
SVar:DestroyPlaneswalker:DB$ Destroy | ValidTgts$ Planeswalker | TgtPrompt$ Select target planeswalker | SpellDescription$ Destroy target planeswalker.
|
||||
Oracle:Choose one or more —\n• Destroy target artifact.\n• Destroy target creature.\n• Destroy target enchantment.\n• Destroy target land.\n• Destroy target planeswalker.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Cavalcade of Calamity
|
||||
ManaCost:1 R
|
||||
Types:Enchantment
|
||||
T:Mode$ Attacks | ValidCard$ Creature.powerLE1+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature you control with power 1 or less attacks, CARDNAME deals 1 damage to the player or planeswalker that creature is attacking
|
||||
T:Mode$ Attacks | ValidCard$ Creature.powerLE1+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature you control with power 1 or less attacks, CARDNAME deals 1 damage to the player or planeswalker that creature is attacking.
|
||||
SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredDefender.Player & Valid Planeswalker.TriggeredDefender | NumDmg$ 1
|
||||
SVar:PlayMain1:TRUE
|
||||
Oracle:Whenever a creature you control with power 1 or less attacks, Cavalcade of Calamity deals 1 damage to the player or planeswalker that creature is attacking.
|
||||
|
||||
@@ -19,7 +19,7 @@ ManaCost:no cost
|
||||
Colors:red
|
||||
Types:Legendary Planeswalker Chandra
|
||||
Loyalty:4
|
||||
A:AB$ DealDamage | Cost$ AddCounter<1/LOYALTY> | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | Planeswalker$ True | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target player or planeswalker
|
||||
A:AB$ DealDamage | Cost$ AddCounter<1/LOYALTY> | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | Planeswalker$ True | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target player or planeswalker.
|
||||
A:AB$ DealDamage | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Creature | Planeswalker$ True | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature.
|
||||
A:AB$ DealDamage | Cost$ SubCounter<7/LOYALTY> | Defined$ Player.Opponent | Planeswalker$ True | Ultimate$ True | NumDmg$ 6 | RememberDamaged$ True | SubAbility$ DBUltimateEmblem | SpellDescription$ CARDNAME deals 6 damage to each opponent. Each player dealt damage this way gets an emblem with "At the beginning of your upkeep, this emblem deals 3 damage to you."
|
||||
SVar:DBUltimateEmblem:DB$ Effect | Name$ Emblem — Chandra, Roaring Flame | Image$ emblem_chandra_roaring_flame | Stackable$ True | Triggers$ FlameTrigger | Duration$ Permanent | AILogic$ Always | EffectOwner$ Player.IsRemembered | SubAbility$ DBCleanup
|
||||
|
||||
@@ -4,5 +4,5 @@ Types:Enchantment
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ At the beginning of your upkeep, instant and sorcery cards in your hand perpetually gain "This spell costs {1} less to cast."
|
||||
SVar:TrigAnimate:DB$ AnimateAll | ValidCards$ Sorcery.YouOwn,Instant.YouOwn | Zone$ Hand | staticAbilities$ ReduceCost | Duration$ Perpetual
|
||||
SVar:ReduceCost:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | Description$ This spell costs {1} less to cast.
|
||||
A:AB$ MakeCard | Cost$ Sac<1/CARDNAME> | Conjure$ True | Spellbook$ Empty the Warrens,Galvanic Relay,Grapeshot | SorcerySpeed$ True | Zone$ Hand | SpellDescription$ Conjure a card of your choice from Charged Conjuration's spellbook into your hand. Activate only as a sorcery.
|
||||
A:AB$ MakeCard | Cost$ Sac<1/CARDNAME> | Conjure$ True | Spellbook$ Empty the Warrens,Galvanic Relay,Grapeshot | SorcerySpeed$ True | Zone$ Hand | SpellDescription$ Conjure a card of your choice from CARDNAME's spellbook into your hand. Activate only as a sorcery.
|
||||
Oracle:At the beginning of your upkeep, instant and sorcery cards in your hand perpetually gain "This spell costs {1} less to cast."\nSacrifice this enchantment: Conjure a card of your choice from Charged Conjuration's spellbook into your hand. Activate only as a sorcery.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:3 U
|
||||
Types:Instant
|
||||
K:Cycling:1 U
|
||||
A:SP$ Tap | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 4 | SpellDescription$ Tap up to four target creatures.
|
||||
T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigTap | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may tap target creature
|
||||
T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigTap | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may tap target creature.
|
||||
SVar:TrigTap:DB$ Tap | ValidTgts$ Creature | TgtPrompt$ Select target creature
|
||||
Oracle:Tap up to four target creatures.\nCycling {1}{U} ({1}{U}, Discard this card: Draw a card.)\nWhen you cycle Choking Tethers, you may tap target creature.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:no cost
|
||||
Types:Scheme
|
||||
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ ChooseChampion | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, target opponent chooses a player. Until your next turn, only you and the chosen player can cast spells and attack with creatures.
|
||||
SVar:ChooseChampion:DB$ ChoosePlayer | ValidTgts$ Opponent | Choices$ Player | AILogic$ BestAllyBoardPosition | SubAbility$ PrepChamps
|
||||
SVar:PrepChamps:DB$ Effect | RememberObjects$ ChosenPlayer,You | Name$ Choose Your Champion Scheme | Duration$ UntilYourNextTurn | StaticAbilities$ RestrictAttackers,RestrictCasting
|
||||
SVar:PrepChamps:DB$ Effect | RememberObjects$ ChosenPlayer,You | Duration$ UntilYourNextTurn | StaticAbilities$ RestrictAttackers,RestrictCasting
|
||||
SVar:RestrictAttackers:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature.!RememberedPlayerCtrl | Description$ Until your next turn, only you and the chosen player can attack with creatures.
|
||||
SVar:RestrictCasting:Mode$ CantBeCast | ValidCard$ Card | Caster$ Player.IsNotRemembered | EffectZone$ Command | Description$ Until your next turn, only you and the chosen player can cast spells.
|
||||
Oracle:When you set this scheme in motion, target opponent chooses a player. Until your next turn, only you and the chosen player can cast spells and attack with creatures.
|
||||
|
||||
@@ -2,5 +2,5 @@ Name:Chronostutter
|
||||
ManaCost:5 U
|
||||
Types:Instant
|
||||
A:SP$ ChangeZone | Origin$ Battlefield | Destination$ Library | ValidTgts$ Creature | LibraryPosition$ 1 | SpellDescription$ Put target creature into its owner's library second from the top.
|
||||
# Library Position is zero indexed. So 1 is second from the top
|
||||
# LibraryPosition is zero indexed. So 1 is second from the top
|
||||
Oracle:Put target creature into its owner's library second from the top.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Cindercone Smite
|
||||
ManaCost:R
|
||||
Types:Sorcery
|
||||
A:SP$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SubAbility$ DBTreasure | SpellDescription$ CARDNAME deals 2 damage to target creature
|
||||
A:SP$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SubAbility$ DBTreasure | SpellDescription$ CARDNAME deals 2 damage to target creature.
|
||||
SVar:DBTreasure:DB$ Token | ConditionCheckSVar$ X | TokenScript$ c_a_treasure_sac | SpellDescription$ Then create a Treasure token if you weren't the starting player.
|
||||
SVar:X:Count$StartingPlayer.0.1
|
||||
Oracle:Cindercone Smite deals 2 damage to target creature. Then create a Treasure token if you weren't the starting player.
|
||||
|
||||
@@ -4,4 +4,4 @@ Types:Artifact Creature Wall
|
||||
PT:0/3
|
||||
K:Defender
|
||||
A:AB$ Tap | Cost$ 2 W T | ValidTgts$ Creature | SpellDescription$ Tap target creature.
|
||||
Oracle:Defender\n{2}{W}, {T}: Tap target creature
|
||||
Oracle:Defender\n{2}{W}, {T}: Tap target creature.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Cobbled Lancer
|
||||
ManaCost:U
|
||||
Types:Creature Zombie Horse
|
||||
PT:3/3
|
||||
A:SP$ PermanentCreature | Cost$ U ExileFromGrave<1/Creature/creature card>
|
||||
A:SP$ PermanentCreature | Cost$ U ExileFromGrave<1/Creature>
|
||||
A:AB$ Draw | Cost$ 3 U ExileFromGrave<1/CARDNAME> | NumCards$ 1 | ActivationZone$ Graveyard | SpellDescription$ Draw a card.
|
||||
DeckHas:Ability$Graveyard
|
||||
Oracle:As an additional cost to cast this spell, exile a creature card from your graveyard.\n{3}{U}, Exile Cobbled Lancer from your graveyard: Draw a card.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Commit
|
||||
ManaCost:3 U
|
||||
Types:Instant
|
||||
A:SP$ ChangeZone | TgtZone$ Stack,Battlefield | Origin$ Battlefield,Stack | Destination$ Library | ValidTgts$ Permanent.nonLand,Card.inZoneStack | TgtPrompt$ Select target spell or nonland permanent | LibraryPosition$ 1 | Fizzle$ True | SpellDescription$ Put target spell or nonland permanent into its owner's library second from the top.
|
||||
# Library Position is zero indexed. So 1 is second from the top
|
||||
# LibraryPosition is zero indexed. So 1 is second from the top
|
||||
AlternateMode:Split
|
||||
Oracle:Put target spell or nonland permanent into its owner's library second from the top.
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@ K:Enchant creature you control
|
||||
A:SP$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | AILogic$ Pump
|
||||
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 2 | AddKeyword$ Haste | Description$ Enchanted creature gets +3/+2, has haste, and attacks each combat if able.
|
||||
S:Mode$ MustAttack | ValidCreature$ Creature.EnchantedBy
|
||||
A:AB$ Pump | Cost$ R | ActivationZone$ Graveyard | ValidTgts$ Creature.YouCtrl | SorcerySpeed$ True | TgtPrompt$ Select target creature you control | SubAbility$ DBChange | StackDescription$ None | SpellDescription$
|
||||
SVar:DBChange:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | AttachedTo$ ParentTarget | SubAbility$ DBAnimate | StackDescription$ REP target creature you control_{c:ParentTarget} | SpellDescription$ Return CARDNAME from your graveyard to the battlefield attached to target creature you control.
|
||||
SVar:DBAnimate:DB$ Animate | staticAbilities$ Hunger | Defined$ Self | Duration$ Perpetual | StackDescription$ CARDNAME perpetually gains "Enchanted creature gets -1/-1." | SpellDescription$ CARDNAME perpetually gains "Enchanted creature gets -1/-1." Activate only as a sorcery.
|
||||
A:AB$ Pump | Cost$ R | ActivationZone$ Graveyard | ValidTgts$ Creature.YouCtrl | SorcerySpeed$ True | TgtPrompt$ Select target creature you control | SubAbility$ DBChange | StackDescription$ REP Return_{p:You} returns & your_their & target creature you control_{c:Targeted} & ." Activate only as a sorcery._." | SpellDescription$ Return CARDNAME from your graveyard to the battlefield attached to target creature you control. CARDNAME perpetually gains "Enchanted creature gets -1/-1." Activate only as a sorcery.
|
||||
SVar:DBChange:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | AttachedTo$ ParentTarget | SubAbility$ DBAnimate | StackDescription$ None
|
||||
SVar:DBAnimate:DB$ Animate | staticAbilities$ Hunger | Defined$ Self | Duration$ Perpetual | StackDescription$ None
|
||||
SVar:Hunger:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -1 | AddToughness$ -1 | Description$ Enchanted creature gets -1/-1.
|
||||
DeckHas:Ability$Graveyard
|
||||
Oracle:Enchant creature you control\nEnchanted creature gets +3/+2, has haste, and attacks each combat if able.\n{R}: Return Craving of Yeenoghu from your graveyard to the battlefield attached to target creature you control. Craving of Yeenoghu perpetually gains "Enchanted creature gets -1/-1." Activate only as a sorcery.
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:2
|
||||
Types:Artifact
|
||||
S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ Player | Description$ Play with the top card of your library revealed.
|
||||
S:Mode$ Continuous | Affected$ Creature.YouCtrl+SharesColorWith TopOfLibrary | AddPower$ 1 | AddToughness$ 1 | TopCardOfLibraryIs$ Creature | Description$ As long as the top card of your library is a creature card, creatures you control that share a color with that card get +1/+1.
|
||||
A:AB$ Dig | Cost$ G W | LibraryPosition$ -1 | DigNum$ 1 | Reveal$ False | DestinationZone$ Library | SpellDescription$ Put the top card of your library on the bottom of your library
|
||||
A:AB$ Dig | Cost$ G W | LibraryPosition$ -1 | DigNum$ 1 | Reveal$ False | DestinationZone$ Library | SpellDescription$ Put the top card of your library on the bottom of your library.
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Play with the top card of your library revealed.\nAs long as the top card of your library is a creature card, creatures you control that share a color with that card get +1/+1.\n{G}{W}: Put the top card of your library on the bottom of your library.
|
||||
|
||||
@@ -4,7 +4,7 @@ Types:Enchantment Aura Curse
|
||||
K:Enchant player
|
||||
A:SP$ Attach | Cost$ 5 B B | ValidTgts$ Player | AILogic$ Curse
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.EnchantedBy | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of enchanted player's upkeep, that player sacrifices a creature or planeswalker. If the player can't, they lose 5 life.
|
||||
SVar:TrigSac:DB$ Sacrifice | SacValid$ Creature,Planeswalker | Defined$ TriggeredPlayer | SubAbility$ DBLoseLife | RememberSacrificed$ True | SpellDescription$ Sacrifice a creature or planeswalker
|
||||
SVar:TrigSac:DB$ Sacrifice | SacValid$ Creature,Planeswalker | Defined$ TriggeredPlayer | SubAbility$ DBLoseLife | RememberSacrificed$ True | SpellDescription$ Sacrifice a creature or planeswalker.
|
||||
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 5 | Defined$ TriggeredPlayer | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:X:Remembered$Amount
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:4
|
||||
Types:Artifact
|
||||
A:AB$ PutCounter | Cost$ 2 T | ValidTgts$ Land.nonSwamp | TgtPrompt$ Select target non-Swamp land | RememberCards$ True | CounterType$ MIRE | CounterNum$ 1 | ActivationPhases$ Upkeep | SubAbility$ DBEffect | SpellDescription$ Put a mire counter on target non-Swamp land. That land is a Swamp for as long as it has a mire counter on it. Activate only during your upkeep.
|
||||
SVar:DBEffect:DB$ Effect | RememberObjects$ Targeted | StaticAbilities$ TombStatic | ForgetOnMoved$ Battlefield | ForgetCounter$ MIRE | Duration$ Permanent
|
||||
SVar:TombStatic:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered | AddType$ Swamp | RemoveLandTypes$ True | Description$ That land is a Swamp for as long as it has a mire counter on it
|
||||
SVar:TombStatic:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered | AddType$ Swamp | RemoveLandTypes$ True | Description$ That land is a Swamp for as long as it has a mire counter on it.
|
||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, at the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with CARDNAME but that a mire counter has not been removed from with CARDNAME.
|
||||
SVar:TrigEffect:DB$ Effect | RememberObjects$ RememberedCard | Triggers$ UpkeepRemove | ForgetOnMoved$ Battlefield | Duration$ Permanent | SubAbility$ DBClearRemembered
|
||||
SVar:UpkeepRemove:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigRemove | TriggerZones$ Command | TriggerDescription$ At the beginning of your upkeep, remove all mire counters from a land that a mire counter was put onto with EFFECTSOURCE but that a mire counter has not been removed from with EFFECTSOURCE.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:7 R
|
||||
Types:Sorcery
|
||||
A:SP$ Shuffle | SubAbility$ DBChoose | StackDescription$ {p:You} shuffles their library, | SpellDescription$ Shuffle your library. As many times as you choose, you may exile the top card of your library. If the total mana value of the cards exiled this way is 13 or less, you may cast any number of spells from among those cards without paying their mana costs.
|
||||
SVar:DBChoose:DB$ GenericChoice | Choices$ DBRepeat,Play | Defined$ You
|
||||
SVar:DBRepeat:DB$ Repeat | RepeatSubAbility$ DBDig | RepeatOptional$ True | SubAbility$ Play | SpellDescription$ As many times as you choose, you may exile the top card of your library
|
||||
SVar:DBRepeat:DB$ Repeat | RepeatSubAbility$ DBDig | RepeatOptional$ True | SubAbility$ Play | SpellDescription$ As many times as you choose, you may exile the top card of your library.
|
||||
SVar:DBDig:DB$ Dig | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Card | DestinationZone$ Exile | RememberChanged$ True
|
||||
SVar:Play:DB$ Play | Defined$ Remembered | ValidSA$ Spell | Amount$ All | WithoutManaCost$ True | Optional$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ LE13 | SubAbility$ DBCleanup | SpellDescription$ If the total mana value of the cards exiled this way is 13 or less, you may cast any number of spells from among those cards without paying their mana costs.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
|
||||
@@ -2,9 +2,9 @@ Name:Dargo, the Shipwrecker
|
||||
ManaCost:6 R
|
||||
Types:Legendary Creature Giant Pirate
|
||||
PT:7/5
|
||||
A:SP$ PermanentCreature | Cost$ 6 R Sac<X/Artifact;Creature/artifact or creature> | AILogic$ SacToReduceCost | CostDesc$ As an additional cost to cast this spell, you may sacrifice any number of artifacts and/or creatures. | SpellDescription$
|
||||
S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Y | EffectZone$ All | Relative$ True | Description$ This spell costs {2} less to cast for each permanent sacrificed this way and {2} less to cast for each other artifact or creature you've sacrificed this turn.
|
||||
S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Z | EffectZone$ All | Secondary$ True | Description$ This spell costs {2} less to cast for each permanent sacrificed this way and {2} less to cast for each other artifact or creature you've sacrificed this turn.
|
||||
A:SP$ PermanentCreature | Cost$ 6 R Sac<X/Artifact;Creature/any number of artifacts and/or creatures> | AILogic$ SacToReduceCost | AdditionalDesc$ This spell costs {2} less to cast for each permanent sacrificed this way and {2} less to cast for each other artifact or creature you've sacrificed this turn.
|
||||
S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Y | EffectZone$ All | Relative$ True
|
||||
S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Z | EffectZone$ All
|
||||
SVar:X:Count$xPaid
|
||||
SVar:Y:SVar$X/Times.2
|
||||
SVar:Z:PlayerCountPropertyYou$SacrificedThisTurn Artifact,Creature/Times.2
|
||||
|
||||
@@ -43,5 +43,5 @@ SVar:UpkeepLoseTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ Tr
|
||||
SVar:TrigLose:DB$ LoseLife | Defined$ You | LifeAmount$ Count$TypeYouCtrl.Creature
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
A:AB$ Pump | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | IsCurse$ True | NumAtt$ -3 | NumDef$ -3 | Duration$ Perpetual | StackDescription$ REP Target creature an opponent controls_{c:Targeted} | SpellDescription$ Target creature an opponent controls perpetually gets -3/-3.
|
||||
DeckHas:Ability$LifeGain|Graveyard|Sacrifice|LifeGain
|
||||
DeckHas:Ability$LifeGain|Graveyard|Sacrifice
|
||||
Oracle:[+1]: Until your next turn, whenever an opponent attacks you and/or planeswalkers you control, they discard a card. If they can't, they sacrifice an attacking creature.\n[-2]: Accept one of Davriel's offers, then accept one of Davriel's conditions.\n[-3]: Target creature an opponent controls perpetually gets -3/-3.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Death Mutation
|
||||
ManaCost:6 B G
|
||||
Types:Sorcery
|
||||
A:SP$ Destroy | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SubAbility$ TrigToken | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. Create X 1/1 green Saproling creature tokens, where X is that creature's mana value.
|
||||
# X will be the Converted Mana Cost of the target of Mutation
|
||||
# X will be the converted mana cost of the target of Death Mutation
|
||||
SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ g_1_1_saproling | TokenOwner$ You
|
||||
SVar:X:Targeted$CardManaCost
|
||||
DeckHas:Ability$Token
|
||||
|
||||
@@ -3,6 +3,6 @@ ManaCost:6
|
||||
Types:Creature Eldrazi
|
||||
PT:6/6
|
||||
K:Vigilance
|
||||
A:AB$ ChangeZone | Cost$ Sac<2/Eldrazi.Scion> | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | SorcerySpeed$ True | SpellDescription$ Return CARDNAME from your graveyard to your hand. Activate only as a sorcery. | CostDesc$ Sacrifice two Eldrazi Scions:
|
||||
A:AB$ ChangeZone | Cost$ Sac<2/Eldrazi.Scion> | CostDesc$ Sacrifice two Eldrazi Scions: | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | SorcerySpeed$ True | SpellDescription$ Return CARDNAME from your graveyard to your hand. Activate only as a sorcery.
|
||||
SVar:DiscardMe:1
|
||||
Oracle:Vigilance\nSacrifice two Eldrazi Scions: Return Deathless Behemoth from your graveyard to your hand. Activate only as a sorcery.
|
||||
|
||||
@@ -6,6 +6,6 @@ K:Deathtouch
|
||||
K:Megamorph:4 G
|
||||
T:Mode$ TurnFaceUp | ValidCard$ Permanent.YouCtrl | Execute$ TrigChange | TriggerZones$ Graveyard | OptionalDecider$ You | TriggerDescription$ Whenever a permanent you control is turned face up, you may return CARDNAME from your graveyard to the battlefield face up or face down.
|
||||
SVar:TrigChange:DB$ GenericChoice | Choices$ DBTop,DBBottom
|
||||
SVar:DBTop:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Put it on battlefield face up
|
||||
SVar:DBBottom:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | FaceDown$ True | SpellDescription$ Put it on battlefield face down
|
||||
SVar:DBTop:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Put CARDNAME on battlefield face up.
|
||||
SVar:DBBottom:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | FaceDown$ True | SpellDescription$ Put CARDNAME on battlefield face down.
|
||||
Oracle:Deathtouch\nWhenever a permanent you control is turned face up, you may return Deathmist Raptor from your graveyard to the battlefield face up or face down.\nMegamorph {4}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:8 R R
|
||||
Types:Sorcery
|
||||
K:Cycling:5 R R
|
||||
A:SP$ ChangeZoneAll | ChangeType$ Artifact,Land,Creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBExileHand | SpellDescription$ Exile all artifacts, creatures, and lands from the battlefield, all cards from all graveyards, and all cards from all hands.
|
||||
T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigDestroyAll | TriggerDescription$ When you cycle CARDNAME, destroy all lands
|
||||
T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigDestroyAll | TriggerDescription$ When you cycle CARDNAME, destroy all lands.
|
||||
SVar:DBExileHand:DB$ ChangeZoneAll | ChangeType$ Card | Origin$ Hand | Destination$ Exile | SubAbility$ DBExileGraveyard
|
||||
SVar:DBExileGraveyard:DB$ ChangeZoneAll | ChangeType$ Card | Origin$ Graveyard | Destination$ Exile
|
||||
SVar:TrigDestroyAll:DB$ DestroyAll | ValidCards$ Land | SpellDescription$ Destroy all lands.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Dirge of Dread
|
||||
ManaCost:2 B
|
||||
Types:Sorcery
|
||||
A:SP$ PumpAll | ValidCards$ Creature | KW$ Fear | SpellDescription$ All creatures gain fear until end of turn.
|
||||
T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPump | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may have target creature gain fear until end of turn
|
||||
T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPump | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may have target creature gain fear until end of turn.
|
||||
K:Cycling:1 B
|
||||
SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Fear
|
||||
Oracle:All creatures gain fear until end of turn. (They can't be blocked except by artifact creatures and/or black creatures.)\nCycling {1}{B} ({1}{B}, Discard this card: Draw a card.)\nWhen you cycle Dirge of Dread, you may have target creature gain fear until end of turn.
|
||||
|
||||
@@ -5,7 +5,7 @@ K:Equip:3
|
||||
S:Mode$ Continuous | Affected$ Card.EquippedBy | AddAbility$ DivinerDraw | AddTrigger$ TrigDraw | AddSVar$ DivinerTrigPump | Description$ Equipped creature has "Whenever you draw a card, this creature gets +1/+1 and gains flying until end of turn" and "{4}: Draw a card."
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Wizard | TriggerZones$ Battlefield | Execute$ TrigAttach | OptionalDecider$ You | TriggerDescription$ Whenever a Wizard creature enters, you may attach CARDNAME to it.
|
||||
SVar:TrigAttach:DB$ Attach | Defined$ TriggeredCard
|
||||
SVar:TrigDraw:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ DivinerTrigPump | TriggerDescription$ Whenever you draw a card, CARDNAME gets +1/+1 and gains flying until end of turn
|
||||
SVar:TrigDraw:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ DivinerTrigPump | TriggerDescription$ Whenever you draw a card, CARDNAME gets +1/+1 and gains flying until end of turn.
|
||||
SVar:DivinerTrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | KW$ Flying
|
||||
SVar:DivinerDraw:AB$ Draw | Cost$ 4 | NumCards$ 1 | SpellDescription$ Draw a card.
|
||||
Oracle:Equipped creature has "Whenever you draw a card, this creature gets +1/+1 and gains flying until end of turn" and "{4}: Draw a card."\nWhenever a Wizard creature enters, you may attach Diviner's Wand to it.\nEquip {3}
|
||||
|
||||
@@ -5,7 +5,7 @@ PT:6/5
|
||||
K:Flying
|
||||
K:Haste
|
||||
S:Mode$ Continuous | Affected$ Creature.Other+YouCtrl | AddKeyword$ Haste | Description$ Other creatures you control have haste.
|
||||
T:Mode$ SpellCast | ValidCard$ Creature,Planeswalker | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | SharesNameWithActivatorsZone$ Graveyard | Execute$ TrigLoseLife | TriggerDescription$ Whenever an opponent casts a creature or planeswalker spell with the same name as a card in their graveyard, that player loses 10 life.
|
||||
T:Mode$ SpellCast | ValidSAonCard$ Spell.Creature+sharesNameWith YourGraveyard,Spell.Planeswalker+sharesNameWith YourGraveyard | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever an opponent casts a creature or planeswalker spell with the same name as a card in their graveyard, that player loses 10 life.
|
||||
SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredActivator | LifeAmount$ 10
|
||||
SVar:PlayMain1:TRUE
|
||||
Oracle:Flying, haste\nOther creatures you control have haste.\nWhenever an opponent casts a creature or planeswalker spell with the same name as a card in their graveyard, that player loses 10 life.
|
||||
|
||||
@@ -5,7 +5,7 @@ PT:5/5
|
||||
K:Devoid
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters, create two 1/1 colorless Eldrazi Scion creature tokens. They have "Sacrifice this creature: Add {C}."
|
||||
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ c_1_1_eldrazi_scion_sac | TokenOwner$ You
|
||||
A:AB$ Tap | Cost$ Sac<1/Card.Eldrazi+Scion> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. | CostDesc$ Sacrifice an Eldrazi Scion:
|
||||
A:AB$ Tap | Cost$ Sac<1/Card.Eldrazi+Scion> | CostDesc$ Sacrifice an Eldrazi Scion: | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature.
|
||||
DeckHints:Type$Eldrazi
|
||||
DeckHas:Ability$Mana.Colorless|Token
|
||||
Oracle:Devoid (This card has no color.)\nWhen Drowner of Hope enters, create two 1/1 colorless Eldrazi Scion creature tokens. They have "Sacrifice this creature: Add {C}."\nSacrifice an Eldrazi Scion: Tap target creature.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:2 W U
|
||||
Types:Legendary Planeswalker Dungeon Master
|
||||
Loyalty:1
|
||||
K:ETBReplacement:Other:RollLoyal
|
||||
SVar:RollLoyal:DB$ RollDice | Sides$ 4 | ResultSVar$ Result | SubAbility$ DBLoyalty | SpellDescription$ Add 1d4 loyalty counters to CARDNAME
|
||||
SVar:RollLoyal:DB$ RollDice | Sides$ 4 | ResultSVar$ Result | SubAbility$ DBLoyalty | SpellDescription$ Add 1d4 loyalty counters to CARDNAME.
|
||||
SVar:DBLoyalty:DB$ PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ Result | ETB$ True
|
||||
A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | ValidTgts$ Opponent | TokenOwner$ Targeted | TokenScript$ b_1_1_skeleton_opp_life | Planeswalker$ True | SpellDescription$ Target opponent creates a 1/1 black Skeleton creature token with "When this creature dies, each opponent gains 2 life."
|
||||
A:AB$ RollDice | Cost$ AddCounter<1/LOYALTY> | Sides$ 20 | ResultSubAbilities$ 1:DBSkipTurn,12-20:DBDraw | Planeswalker$ True | SpellDescription$ Roll a d20. If you roll a 1, skip your next turn. If you roll a 12 or higher, draw a card.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:B
|
||||
Types:Sorcery
|
||||
A:SP$ Branch | BranchConditionSVar$ LifeCheck | BranchConditionSVarCompare$ GE2 | FalseSubAbility$ DBDraw | TrueSubAbility$ DBSeek | SpellDescription$ Draw a card. If an opponent lost life this turn and you gained life this turn, seek two Vampire cards instead.
|
||||
SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card.
|
||||
SVar:DBSeek:DB$ Seek | Num$ 2 | Type$ Vampire | SpellDescription$ Seek two Vampire card
|
||||
SVar:DBSeek:DB$ Seek | Num$ 2 | Type$ Vampire | SpellDescription$ Seek two Vampire cards.
|
||||
SVar:LifeCheck:SVar$Y/Plus.X
|
||||
SVar:X:Count$LifeOppsLostThisTurn/LimitMax.1
|
||||
SVar:Y:Count$LifeYouGainedThisTurn/LimitMax.1
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Dwindle
|
||||
ManaCost:2 U
|
||||
Types:Enchantment Aura
|
||||
K:Enchant creature
|
||||
A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | IsCurse$ True | SpellDescription$ Enchant creature
|
||||
A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | IsCurse$ True
|
||||
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -6 | AddToughness$ -0 | Description$ Enchanted creature gets -6/-0.
|
||||
T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature | ValidBlocker$ Creature.EnchantedBy | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ When enchanted creature blocks, destroy it.
|
||||
SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredBlockerLKICopy
|
||||
|
||||
@@ -5,6 +5,6 @@ PT:5/4
|
||||
K:Flying
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of each player's upkeep, that player may pay {R}{R} or 2 life. If the player does, they gain control of CARDNAME.
|
||||
SVar:TrigChoose:DB$ GenericChoice | Defined$ TriggeredPlayer | AILogic$ PayUnlessCost | Choices$ PayRR,Pay2Life
|
||||
SVar:PayRR:DB$ GainControl | Defined$ Self | NewController$ TriggeredPlayer | UnlessCost$ R R | UnlessPayer$ TriggeredPlayer | UnlessSwitched$ True | UnlessAI$ OnlyDontControl | SpellDescription$ Pay R R to gain control of CARDNAME
|
||||
SVar:Pay2Life:DB$ GainControl | Defined$ Self | NewController$ TriggeredPlayer | UnlessCost$ PayLife<2> | UnlessPayer$ TriggeredPlayer | UnlessSwitched$ True | UnlessAI$ OnlyDontControl | SpellDescription$ Pay 2 life to gain control of CARDNAME
|
||||
SVar:PayRR:DB$ GainControl | Defined$ Self | NewController$ TriggeredPlayer | UnlessCost$ R R | UnlessPayer$ TriggeredPlayer | UnlessSwitched$ True | UnlessAI$ OnlyDontControl | SpellDescription$ Pay R R to gain control of CARDNAME.
|
||||
SVar:Pay2Life:DB$ GainControl | Defined$ Self | NewController$ TriggeredPlayer | UnlessCost$ PayLife<2> | UnlessPayer$ TriggeredPlayer | UnlessSwitched$ True | UnlessAI$ OnlyDontControl | SpellDescription$ Pay 2 life to gain control of CARDNAME.
|
||||
Oracle:Flying\nAt the beginning of each player's upkeep, that player may pay {R}{R} or 2 life. If the player does, they gain control of Emberwilde Djinn.
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Emrakul's Evangel
|
||||
ManaCost:2 G
|
||||
Types:Creature Human Horror
|
||||
PT:3/2
|
||||
A:AB$ Token | Cost$ T Sac<X/Creature.Other+nonEldrazi/other non-Eldrazi creatures> Sac<1/CARDNAME> | TokenAmount$ Y | TokenScript$ c_3_2_eldrazi_horror | TokenOwner$ You | SpellDescription$ Create a 3/2 colorless Eldrazi Horror creature token for each creature sacrificed this way. | CostDesc$ {T}, Sacrifice CARDNAME and any number of other non-Eldrazi creatures:
|
||||
A:AB$ Token | Cost$ T Sac<X/Creature.Other+nonEldrazi/other non-Eldrazi creatures> Sac<1/CARDNAME> | CostDesc$ {T}, Sacrifice CARDNAME and any number of other non-Eldrazi creatures: | TokenAmount$ Y | TokenScript$ c_3_2_eldrazi_horror | TokenOwner$ You | SpellDescription$ Create a 3/2 colorless Eldrazi Horror creature token for each creature sacrificed this way.
|
||||
SVar:Y:Sacrificed$Valid Creature
|
||||
SVar:X:Count$xPaid
|
||||
DeckHints:Ability$Token & Type$Eldrazi|Horror
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Name:Enervate
|
||||
ManaCost:1 U
|
||||
Types:Instant
|
||||
A:SP$ Tap | TgtPrompt$ Choose target artifact, creature or land | ValidTgts$ Artifact,Creature,Land | SpellDescription$ Tap target artifact, creature or land. Draw a card at the beginning of next turn's upkeep | SubAbility$ DelTrigSlowtrip
|
||||
A:SP$ Tap | TgtPrompt$ Choose target artifact, creature or land | ValidTgts$ Artifact,Creature,Land | SpellDescription$ Tap target artifact, creature or land. Draw a card at the beginning of next turn's upkeep. | SubAbility$ DelTrigSlowtrip
|
||||
SVar:DelTrigSlowtrip:DB$ DelayedTrigger | NextTurn$ True | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card.
|
||||
SVar:DrawSlowtrip:DB$ Draw | NumCards$ 1 | Defined$ You
|
||||
AI:RemoveDeck:All
|
||||
|
||||
@@ -3,5 +3,5 @@ ManaCost:2
|
||||
Types:Sorcery Lesson
|
||||
A:SP$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | SubAbility$ DBGainLife | SpellDescription$ Search your library for a basic land card, reveal it, put it into your hand, then shuffle. You gain 2 life.
|
||||
SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2
|
||||
DeckHas:Ability$GainLife
|
||||
DeckHas:Ability$LifeGain
|
||||
Oracle:Search your library for a basic land card, reveal it, put it into your hand, then shuffle. You gain 2 life.
|
||||
|
||||
@@ -4,5 +4,5 @@ Types:Creature Djinn
|
||||
PT:4/5
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ At the beginning of your upkeep, target non-Wall creature an opponent controls gains forestwalk until your next upkeep. (It can't be blocked as long as defending player controls a Forest.)
|
||||
SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.nonWall+OppCtrl | TgtPrompt$ Select target non-Wall creature an opponent controls | KW$ Landwalk:Forest | Duration$ UntilYourNextUpkeep
|
||||
DeckHas:Ability$Forestwalk
|
||||
DeckHas:Keyword$Forestwalk
|
||||
Oracle:At the beginning of your upkeep, target non-Wall creature an opponent controls gains forestwalk until your next upkeep. (It can't be blocked as long as defending player controls a Forest.)
|
||||
|
||||
@@ -5,6 +5,6 @@ K:Enchant land
|
||||
A:SP$ Attach | Cost$ U U U | ValidTgts$ Land | AILogic$ Curse
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ At the beginning of the upkeep of enchanted land's controller, destroy that land unless that player pays {1} or 1 life.
|
||||
SVar:TrigDestroy:DB$ GenericChoice | Choices$ Pay1,Pay1Life | AILogic$ PayUnlessCost | Defined$ TriggeredPlayer
|
||||
SVar:Pay1:DB$ Destroy | Defined$ Enchanted | UnlessCost$ 1 | UnlessPayer$ TriggeredPlayer | SpellDescription$ Destroy enchanted land unless you pay {1}
|
||||
SVar:Pay1Life:DB$ Destroy | Defined$ Enchanted | UnlessCost$ PayLife<1> | UnlessPayer$ TriggeredPlayer | SpellDescription$ Destroy enchanted land unless you pay 1 life
|
||||
SVar:Pay1:DB$ Destroy | Defined$ Enchanted | UnlessCost$ 1 | UnlessPayer$ TriggeredPlayer | SpellDescription$ Destroy enchanted land unless you pay {1}.
|
||||
SVar:Pay1Life:DB$ Destroy | Defined$ Enchanted | UnlessCost$ PayLife<1> | UnlessPayer$ TriggeredPlayer | SpellDescription$ Destroy enchanted land unless you pay 1 life.
|
||||
Oracle:Enchant land\nAt the beginning of the upkeep of enchanted land's controller, destroy that land unless that player pays {1} or 1 life.
|
||||
|
||||
@@ -6,7 +6,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S
|
||||
SVar:TrigCharm:DB$ Charm | Choices$ Drain,Battle
|
||||
SVar:Drain:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses 2 life and you gain 2 life.
|
||||
SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | StackDescription$ None
|
||||
SVar:Battle:DB$ AddOrRemoveCounter | ValidTgts$ Battle | RemoveConditionSVar$ Targeted$Valid Battle.OppProtect | CounterType$ DEFENSE | CounterNum$ 3 | StackDescription$ REP Choose target battle. _ & it_{c:Targeted} | SpellDescription$ Choose target battle. If an opponent protects it, remove three defense counters from it. Otherwise, put three defense counters on it.
|
||||
SVar:Battle:DB$ AddOrRemoveCounter | ValidTgts$ Battle | RemoveConditionSVar$ Targeted$Valid Battle.OppProtect | CounterType$ DEFENSE | CounterNum$ 3 | StackDescription$ REP Choose target battle_{p:You} chooses {c:Targeted} & remove_{p:You} removes & put_{p:You} puts | SpellDescription$ Choose target battle. If an opponent protects it, remove three defense counters from it. Otherwise, put three defense counters on it.
|
||||
DeckHas:Ability$LifeGain
|
||||
DeckHints:Type$Battle
|
||||
Oracle:When Etched Host Doombringer enters, choose one —\n• Target opponent loses 2 life and you gain 2 life.\n• Choose target battle. If an opponent protects it, remove three defense counters from it. Otherwise, put three defense counters on it.
|
||||
|
||||
@@ -5,9 +5,9 @@ A:SP$ Repeat | RepeatSubAbility$ ResetCheck | RepeatCheckSVar$ NumPlayerGiveup |
|
||||
SVar:ResetCheck:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ Number | Expression$ 0 | SubAbility$ DBRepeatChoice
|
||||
SVar:DBRepeatChoice:DB$ RepeatEach | StartingWith$ You | RepeatSubAbility$ DBChoice | RepeatPlayers$ Player
|
||||
SVar:DBChoice:DB$ GenericChoice | Choices$ DBCheckHand,DBNoChange | Defined$ Player.IsRemembered
|
||||
SVar:DBCheckHand:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ EQ0 | SubAbility$ DBChoose | SpellDescription$ Choose a permanent to put onto the battlefield
|
||||
SVar:DBCheckHand:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ EQ0 | SubAbility$ DBChoose | SpellDescription$ Choose a permanent to put onto the battlefield.
|
||||
SVar:DBChoose:DB$ ChangeZone | DefinedPlayer$ Player.IsRemembered | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent | ChangeNum$ 1 | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ GE1
|
||||
SVar:DBNoChange:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | SpellDescription$ Do not put a permanent onto the battlefield
|
||||
SVar:DBNoChange:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | SpellDescription$ Do not put a permanent onto the battlefield.
|
||||
SVar:FinalReset:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ Number | Expression$ 0 | SubAbility$ DBCleanup
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:NumPlayerGiveup:Number$0
|
||||
|
||||
@@ -2,7 +2,7 @@ Name:Euru, Acorn Scrounger
|
||||
ManaCost:2 B G
|
||||
Types:Legendary Creature Squirrel Soldier
|
||||
PT:3/3
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigImmediateTrig | TriggerDescription$When CARDNAME enters, you may forage. When you do, conjure a card named Chitterspitter onto the battlefield.
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigImmediateTrig | TriggerDescription$ When CARDNAME enters, you may forage. When you do, conjure a card named Chitterspitter onto the battlefield.
|
||||
SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ Forage | Execute$ TrigConjure | SpellDescription$ When you do, conjure a card named Chitterspitter onto the battlefield.
|
||||
SVar:TrigConjure:DB$ MakeCard | Name$ Chitterspitter | TokenCard$ True | Zone$ Battlefield
|
||||
T:Mode$ DamageDoneOnce | ValidSource$ Squirrel.YouCtrl | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPutCounterAll | TriggerZones$ Battlefield | TriggerDescription$ Whenever one or more Squirrels you control deal combat damage to a player, you may sacrifice a token. If you do, put an acorn counter on each permanent you control named Chitterspitter.
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:no cost
|
||||
Types:Artifact Attraction
|
||||
Lights:4 5 6
|
||||
K:Visit:TrigPhaseOut
|
||||
SVar:TrigPhaseOut:DB$ Phases | ValidTgts$ Creature.IsNotRemembered | RememberAffected$ True | WontPhaseInNormal$ True | SubAbility$ DBEffect | TgtPrompt$ Select target creature that hasn't been phased out by Ferris Wheel | SpellDescription$ Visit — Choose target creature that hasn't been phased out with CARDNAME. That creature phases out until you roll a 3 or less while rolling to visit your Attractions.
|
||||
SVar:TrigPhaseOut:DB$ Phases | ValidTgts$ Creature.IsNotRemembered | RememberAffected$ True | WontPhaseInNormal$ True | SubAbility$ DBEffect | TgtPrompt$ Select target creature that hasn't been phased out by CARDNAME | SpellDescription$ Visit — Choose target creature that hasn't been phased out with CARDNAME. That creature phases out until you roll a 3 or less while rolling to visit your Attractions.
|
||||
SVar:DBEffect:DB$ Effect | Triggers$ TrigComeBack | RememberObjects$ Remembered | Duration$ Permanent
|
||||
SVar:TrigComeBack:Mode$ RolledDie | TriggerZones$ Command | Execute$ TrigPhaseIn | Static$ True | ValidResult$ LE3 | RolledToVisitAttractions$ True | ValidPlayer$ You
|
||||
SVar:TrigPhaseIn:DB$ Phases | Defined$ Remembered | PhaseInOrOut$ True | SubAbility$ DBExileSelf
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:2 R
|
||||
Types:Sorcery
|
||||
# Target a creature for three damage
|
||||
A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Choose target creature for 3 damage | SubAbility$ RepeatFlip | StackDescription$ None | SpellDescription$ Flip a coin until you lose a flip or choose to stop flipping. If you lose a flip, CARDNAME has no effect. If you win one or more flips, CARDNAME deals 3 damage to target creature. If you win two or more flips, CARDNAME deals 6 damage to each opponent. If you win three or more flips, draw nine cards and untap all lands you control.
|
||||
# Repeat Flip
|
||||
# Repeat flip
|
||||
SVar:RepeatFlip:DB$ Repeat | RepeatSubAbility$ FlipAgain | RepeatCheckSVar$ Loss | RepeatSVarCompare$ EQ0 | RepeatOptional$ True | SubAbility$ DamageCreature
|
||||
SVar:FlipAgain:DB$ FlipACoin | WinSubAbility$ IncrementWins | LoseSubAbility$ IncrementLoss
|
||||
SVar:IncrementWins:DB$ StoreSVar | SVar$ Wins | Type$ CountSVar | Expression$ Wins/Plus.1
|
||||
@@ -13,9 +13,9 @@ SVar:ResetWins:DB$ StoreSVar | SVar$ Wins | Type$ Number | Expression$ 0
|
||||
SVar:DamageCreature:DB$ DealDamage | Defined$ Targeted | NumDmg$ 3 | ConditionCheckSVar$ Wins | ConditionSVarCompare$ GE1 | SubAbility$ DamageOpponents
|
||||
# Damage each opponent
|
||||
SVar:DamageOpponents:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 6 | ConditionCheckSVar$ Wins | ConditionSVarCompare$ GE2 | SubAbility$ DrawNine
|
||||
# Draw Nine Cards
|
||||
# Draw nine cards
|
||||
SVar:DrawNine:DB$ Draw | Defined$ You | NumCards$ 9 | ConditionCheckSVar$ Wins | ConditionSVarCompare$ GE3 | SubAbility$ UntapLands
|
||||
# Untap Lands
|
||||
# Untap lands
|
||||
SVar:UntapLands:DB$ UntapAll | ValidCards$ Land.YouCtrl | ConditionCheckSVar$ Wins | ConditionSVarCompare$ GE3
|
||||
SVar:Wins:Number$0
|
||||
SVar:Loss:Number$0
|
||||
|
||||
@@ -2,6 +2,6 @@ Name:Flame Fusillade
|
||||
ManaCost:3 R
|
||||
Types:Sorcery
|
||||
A:SP$ AnimateAll | ValidCards$ Permanent.YouCtrl | Abilities$ ABDamage | SpellDescription$ Until end of turn, permanents you control gain "{T}: This permanent deals 1 damage to any target."
|
||||
SVar:ABDamage:AB$ DealDamage | Cost$ T | NumDmg$ 1 | ValidTgts$ Any | SpellDescription$ CARDNAME deals 1 damage to any target
|
||||
SVar:ABDamage:AB$ DealDamage | Cost$ T | NumDmg$ 1 | ValidTgts$ Any | SpellDescription$ CARDNAME deals 1 damage to any target.
|
||||
AI:RemoveDeck:All
|
||||
Oracle:Until end of turn, permanents you control gain "{T}: This permanent deals 1 damage to any target."
|
||||
|
||||
@@ -4,6 +4,6 @@ Types:Enchantment Aura
|
||||
K:Enchant creature
|
||||
A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Pump
|
||||
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | AddTrigger$ TrigDamageDone | Description$ Enchanted creature has flying and "Whenever this creature deals combat damage to a player, venture into the dungeon." (Enter the first room or advance to the next room.)
|
||||
SVar:TrigDamageDone:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigVenture | TriggerDescription$ Whenever this creature deals combat damage to a player, venture into the dungeon.
|
||||
SVar:TrigDamageDone:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigVenture | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, venture into the dungeon.
|
||||
SVar:TrigVenture:DB$ Venture
|
||||
Oracle:Enchant creature\nEnchanted creature has flying and "Whenever this creature deals combat damage to a player, venture into the dungeon." (Enter the first room or advance to the next room.)
|
||||
|
||||
@@ -4,8 +4,8 @@ Types:Sorcery
|
||||
A:SP$ Repeat | ValidTgts$ Opponent | RepeatSubAbility$ DBSac | RepeatOptional$ True | StackDescription$ SpellDescription | SpellDescription$ Sacrifice a nontoken permanent. If you do, target opponent loses 2 life unless that player sacrifices a permanent or discards a card. You may repeat this process any number of times.
|
||||
SVar:DBSac:DB$ Sacrifice | SacValid$ Permanent.nonToken | SacMessage$ nontoken permanent | RememberSacrificed$ True | SubAbility$ DBGenericChoice
|
||||
SVar:DBGenericChoice:DB$ GenericChoice | Choices$ PaySac,PayDiscard | Defined$ Targeted | AILogic$ PayUnlessCost | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
|
||||
SVar:PaySac:DB$ LoseLife | LifeAmount$ 2 | Defined$ Targeted | UnlessCost$ Sac<1/Permanent> | UnlessPayer$ Targeted | UnlessAI$ LifeLE2 | SpellDescription$ You lose 2 life unless you sacrifice a permanent
|
||||
SVar:PayDiscard:DB$ LoseLife | LifeAmount$ 2 | Defined$ Targeted | UnlessCost$ Discard<1/Card> | UnlessPayer$ Targeted | UnlessAI$ LifeLE2 | SpellDescription$ You lose 2 life unless you discard a card
|
||||
SVar:PaySac:DB$ LoseLife | LifeAmount$ 2 | Defined$ Targeted | UnlessCost$ Sac<1/Permanent> | UnlessPayer$ Targeted | UnlessAI$ LifeLE2 | SpellDescription$ You lose 2 life unless you sacrifice a permanent.
|
||||
SVar:PayDiscard:DB$ LoseLife | LifeAmount$ 2 | Defined$ Targeted | UnlessCost$ Discard<1/Card> | UnlessPayer$ Targeted | UnlessAI$ LifeLE2 | SpellDescription$ You lose 2 life unless you discard a card.
|
||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
AI:RemoveDeck:All
|
||||
AI:RemoveDeck:Random
|
||||
|
||||
@@ -3,7 +3,6 @@ ManaCost:B B
|
||||
Types:Creature Imp
|
||||
PT:2/2
|
||||
K:Flying
|
||||
# Note: The Executing Ability needs to be a Drawback for the AI to properly test it's conditions
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters, you lose 2 life.
|
||||
SVar:TrigLoseLife:DB$ LoseLife | LifeAmount$ 2
|
||||
Oracle:Flying\nWhen Foul Imp enters, you lose 2 life.
|
||||
|
||||
@@ -9,7 +9,7 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||
SVar:X:Count$xPaid
|
||||
T:Mode$ Attacks | ValidCard$ Card.EquippedBy | Execute$ TrigDoubleCounters | TriggerDescription$ Whenever equipped creature attacks, double the number of +1/+1 counters on it.
|
||||
SVar:TrigDoubleCounters:DB$ MultiplyCounter | Defined$ TriggeredAttackerLKICopy | CounterType$ P1P1
|
||||
S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddSVar$ AE | Secondary$ True | Description$ Add attack effect to attached
|
||||
S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddSVar$ AE
|
||||
SVar:AE:SVar:HasAttackEffect:TRUE
|
||||
K:Equip:2
|
||||
DeckHas:Ability$Token|Counters
|
||||
|
||||
@@ -3,7 +3,7 @@ ManaCost:1 W
|
||||
Types:Legendary Creature Halfling Warrior
|
||||
PT:2/2
|
||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBAttach | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME enters or attacks, you may attach target Equipment you control with mana value 2 or 3 to NICKNAME.
|
||||
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DBAttach | TriggerZones$ Battlefield | OptionalDecider$ You | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks, you may attach target Equipment you control with mana value 2 or 3 to NICKNAME
|
||||
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DBAttach | TriggerZones$ Battlefield | OptionalDecider$ You | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks, you may attach target Equipment you control with mana value 2 or 3 to NICKNAME.
|
||||
SVar:DBAttach:DB$ Attach | ValidTgts$ Equipment.cmcEQ2+YouCtrl,Equipment.cmcEQ3+YouCtrl | Object$ Targeted | Defined$ Self
|
||||
R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ Card.Self | PlayerTurn$ True | Description$ As long as it's your turn, prevent all damage that would be dealt to NICKNAME.
|
||||
DeckHints:Type$Equipment
|
||||
|
||||
@@ -5,5 +5,5 @@ PT:4/4
|
||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoice | TriggerDescription$ At the beginning of your upkeep, choose flying, first strike, trample, or rampage 3. CARDNAME gains that ability until your next upkeep.
|
||||
SVar:TrigChoice:DB$ Pump | Defined$ Self | KWChoice$ Flying,First Strike,Trample,Rampage:3 | Duration$ UntilYourNextUpkeep
|
||||
AI:RemoveDeck:All
|
||||
DeckHas:Keyword$Rampage|Trample|FirstStrike|Flying
|
||||
DeckHas:Keyword$Rampage|Trample|First Strike|Flying
|
||||
Oracle:At the beginning of your upkeep, choose flying, first strike, trample, or rampage 3. Gabriel Angelfire gains that ability until your next upkeep. (Whenever a creature with rampage 3 becomes blocked, it gets +3/+3 until end of turn for each creature blocking it beyond the first.)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user