Merge branch 'master' into code-cleanup

# Conflicts:
#	forge-game/src/main/java/forge/game/ability/effects/ManifestBaseEffect.java
This commit is contained in:
Jetz
2024-09-26 10:21:19 -04:00
204 changed files with 1154 additions and 601 deletions

View File

@@ -1398,7 +1398,7 @@ public abstract class GameState {
c.setTurnInZone(turn);
} else if (info.equals("IsToken")) {
c.setGamePieceType(GamePieceType.TOKEN);
} else if (info.equals("ClassLevel:")) {
} else if (info.startsWith("ClassLevel:")) {
c.setClassLevel(Integer.parseInt(info.substring(info.indexOf(':') + 1)));
}
}

View File

@@ -114,6 +114,7 @@ public enum SpellApiToAi {
.put(ApiType.Mana, ManaAi.class)
.put(ApiType.ManaReflected, CannotPlayAi.class)
.put(ApiType.Manifest, ManifestAi.class)
.put(ApiType.ManifestDread, ManifestAi.class)
.put(ApiType.Meld, MeldAi.class)
.put(ApiType.Mill, MillAi.class)
.put(ApiType.MoveCounter, CountersMoveAi.class)

View File

@@ -148,12 +148,6 @@ public class DamageDealAi extends DamageAiBase {
String logic = sa.getParamOrDefault("AILogic", "");
if ("DiscardLands".equals(logic)) {
dmg = 2;
} else if ("OpponentHasCreatures".equals(logic)) {
for (Player opp : ai.getOpponents()) {
if (!opp.getCreaturesInPlay().isEmpty()) {
return true;
}
}
} else if (logic.startsWith("ProcRaid.")) {
if (ai.getGame().getPhaseHandler().isPlayerTurn(ai) && ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
for (Card potentialAtkr : ai.getCreaturesInPlay()) {

View File

@@ -44,20 +44,6 @@ public class RepeatEachAi extends SpellAbilityAi {
return false;
}
}
} else if ("OpponentHasCreatures".equals(logic)) { //TODO convert this to NeedsToPlayVar
for (Player opp : aiPlayer.getOpponents()) {
if (!opp.getCreaturesInPlay().isEmpty()) {
return true;
}
}
return false;
} else if ("OpponentHasMultipleCreatures".equals(logic)) {
for (Player opp : aiPlayer.getOpponents()) {
if (opp.getCreaturesInPlay().size() > 1) {
return true;
}
}
return false;
} else if ("AllPlayerLoseLife".equals(logic)) {
final Card source = sa.getHostCard();
SpellAbility repeat = sa.getAdditionalAbility("RepeatSubAbility");

View File

@@ -137,6 +137,7 @@ public enum AbilityKey {
Targets("Targets"),
Token("Token"),
TokenNum("TokenNum"),
Valiant("Valiant"),
Vehicle("Vehicle"),
Won("Won"),

View File

@@ -116,6 +116,7 @@ public enum ApiType {
Mana (ManaEffect.class),
ManaReflected (ManaReflectedEffect.class),
Manifest (ManifestEffect.class),
ManifestDread (ManifestDreadEffect.class),
Meld (MeldEffect.class),
Mill (MillEffect.class),
MoveCounter (CountersMoveEffect.class),

View File

@@ -61,7 +61,7 @@ public abstract class SpellAbilityEffect {
// prelude for when this is root ability
if (!(sa instanceof AbilitySub)) {
sb.append(sa.getHostCard()).append(" -");
if (sa.getHostCard().hasPromisedGift()) {
if (sa.getHostCard().hasPromisedGift() && sa.hasAdditionalAbility("GiftAbility")) {
sb.append(" Gift ").
append(sa.getAdditionalAbility("GiftAbility").getParam("GiftDescription")).
append(" to ").append(sa.getHostCard().getPromisedGift()).append(". ");

View File

@@ -253,6 +253,10 @@ public class CopyPermanentEffect extends TokenEffectBase {
if (sa.hasParam("ForEach")) {
for (Player p : AbilityUtils.getDefinedPlayers(host, sa.getParam("ForEach"), sa)) {
if (sa.hasParam("OptionalForEach") && !activator.getController().confirmAction(sa, null,
Localizer.getInstance().getMessage("lblCopyPermanentConfirm") + " (" + p + ")", null)) {
continue;
}
Card proto = getProtoType(sa, c, controller);
proto.addRemembered(p);
tokenTable.put(controller, proto, numCopies);

View File

@@ -40,7 +40,7 @@ public class DigEffect extends SpellAbilityEffect {
String verb = " looks at ";
if (sa.hasParam("DestinationZone") && sa.getParam("DestinationZone").equals("Exile") &&
numToDig == numToChange) {
numToDig == numToChange) {
verb = " exiles ";
} else if (sa.hasParam("Reveal") && sa.getParam("Reveal").equals("True")) {
verb = " reveals ";
@@ -79,7 +79,7 @@ public class DigEffect extends SpellAbilityEffect {
sb.append(" They ").append(sa.hasParam("Optional") ? "may " : "").append(verb2);
if (sa.hasParam("ChangeValid")) {
String what = sa.hasParam("ChangeValidDesc") ? sa.getParam("ChangeValidDesc") :
sa.getParam("ChangeValid");
sa.getParam("ChangeValid");
if (!StringUtils.containsIgnoreCase(what, "card")) {
what = what + " card";
}
@@ -90,7 +90,7 @@ public class DigEffect extends SpellAbilityEffect {
sb.append(sa.hasParam("ExileFaceDown") ? "face down " : "");
if (sa.hasParam("WithCounters") || sa.hasParam("ExileWithCounters")) {
String ctr = sa.hasParam("WithCounters") ? sa.getParam("WithCounters") :
sa.getParam("ExileWithCounters");
sa.getParam("ExileWithCounters");
sb.append("with a ");
sb.append(CounterType.getType(ctr).getName().toLowerCase());
sb.append(" counter on it. They ");
@@ -125,7 +125,6 @@ public class DigEffect extends SpellAbilityEffect {
final boolean anyNumber = sa.hasParam("AnyNumber");
final boolean optional = sa.hasParam("Optional");
final boolean noMove = sa.hasParam("NoMove");
final boolean skipReorder = sa.hasParam("SkipReorder");
// A hack for cards like Explorer's Scope that need to ensure that a card is revealed to the player activating the ability
@@ -188,37 +187,20 @@ public class DigEffect extends SpellAbilityEffect {
DelayedReveal delayedReveal = null;
boolean hasRevealed = true;
if (sa.hasParam("Reveal") && "True".equalsIgnoreCase(sa.getParam("Reveal"))) {
game.getAction().reveal(top, p, false);
game.getAction().reveal(top, p, false);
}
else if (sa.hasParam("RevealOptional")) {
String question = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblReveal") + ":", TextUtil.addSuffix(Lang.joinHomogenous(top),"?"));
hasRevealed = p.getController().confirmAction(sa, null, question, null);
hasRevealed = p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblRevealCardToOtherPlayers"), null);
if (hasRevealed) {
game.getAction().reveal(top, p);
}
}
else if (sa.hasParam("RevealValid")) {
final String revealValid = sa.getParam("RevealValid");
final CardCollection toReveal = CardLists.getValidCards(top, revealValid, cont, host, sa);
if (!toReveal.isEmpty()) {
game.getAction().reveal(toReveal, cont);
if (sa.hasParam("RememberRevealed")) {
host.addRemembered(toReveal);
}
}
}
else if (!sa.hasParam("NoLooking")) {
// show the user the revealed cards
delayedReveal = new DelayedReveal(top, srcZone, PlayerView.get(p), CardTranslation.getTranslatedName(host.getName()) + " - " + Localizer.getInstance().getMessage("lblLookingCardIn") + " ");
if (noMove) {
// Let the activating player see the cards even if they're not moved
game.getAction().revealTo(top, activator);
}
}
if (sa.hasParam("RememberRevealed") && !sa.hasParam("RevealValid") && hasRevealed) {
if (sa.hasParam("RememberRevealed") && hasRevealed) {
host.addRemembered(top);
}
if (sa.hasParam("ImprintRevealed") && hasRevealed) {
@@ -233,270 +215,269 @@ public class DigEffect extends SpellAbilityEffect {
host.setChosenPlayer(chooser);
}
}
if (!noMove) {
CardCollection movedCards;
rest.addAll(top);
CardCollection valid;
if (!changeValid.isEmpty()) {
if (changeValid.contains("ChosenType")) {
changeValid = changeValid.replace("ChosenType", host.getChosenType());
}
valid = CardLists.getValidCards(top, changeValid, cont, host, sa);
if (totalCMC) {
valid = CardLists.getValidCards(valid, "Card.cmcLE" + totcmc, cont, host, sa);
}
} else if (totalCMC) {
valid = CardLists.getValidCards(top, "Card.cmcLE" + totcmc, cont, host, sa);
} else {
// If all the cards are valid choices, no need for a separate reveal dialog to the chooser. pfps??
if (p == chooser && destZone1ChangeNum > 1) {
delayedReveal = null;
}
valid = top;
}
if (forceRevealToController) {
// Force revealing the card to the player activating the ability (e.g. Explorer's Scope)
game.getAction().revealTo(top, activator);
delayedReveal = null; // top is already seen by the player, do not reveal twice
CardCollection movedCards;
rest.addAll(top);
CardCollection valid;
if (!changeValid.isEmpty()) {
if (changeValid.contains("ChosenType")) {
changeValid = changeValid.replace("ChosenType", host.getChosenType());
}
// Optional abilities that use a dialog box to prompt the user to skip the ability (e.g. Explorer's Scope, Quest for Ula's Temple)
if (optional && mayBeSkipped && !valid.isEmpty()) {
String prompt = optionalAbilityPrompt != null ? optionalAbilityPrompt : Localizer.getInstance().getMessage("lblWouldYouLikeProceedWithOptionalAbility") + " " + host + "?\n\n(" + sa.getDescription() + ")";
if (!p.getController().confirmAction(sa, null, TextUtil.fastReplace(prompt, "CARDNAME", CardTranslation.getTranslatedName(host.getName())), null)) {
return;
}
valid = CardLists.getValidCards(top, changeValid, cont, host, sa);
if (totalCMC) {
valid = CardLists.getValidCards(valid, "Card.cmcLE" + totcmc, cont, host, sa);
}
} else if (totalCMC) {
valid = CardLists.getValidCards(top, "Card.cmcLE" + totcmc, cont, host, sa);
} else {
// If all the cards are valid choices, no need for a separate reveal dialog to the chooser. pfps??
if (p == chooser && destZone1ChangeNum > 1) {
delayedReveal = null;
}
valid = top;
}
if (changeAll) {
movedCards = new CardCollection(valid);
} else if (sa.hasParam("RandomChange")) {
int numChanging = Math.min(destZone1ChangeNum, valid.size());
movedCards = CardLists.getRandomSubList(valid, numChanging);
} else if (totalCMC) {
movedCards = new CardCollection();
if (p == chooser) {
chooser.getController().tempShowCards(top);
if (forceRevealToController) {
// Force revealing the card to the player activating the ability (e.g. Explorer's Scope)
game.getAction().revealTo(top, activator);
delayedReveal = null; // top is already seen by the player, do not reveal twice
}
// Optional abilities that use a dialog box to prompt the user to skip the ability (e.g. Explorer's Scope, Quest for Ula's Temple)
if (optional && mayBeSkipped && !valid.isEmpty()) {
String prompt = optionalAbilityPrompt != null ? optionalAbilityPrompt : Localizer.getInstance().getMessage("lblWouldYouLikeProceedWithOptionalAbility") + " " + host + "?\n\n(" + sa.getDescription() + ")";
if (!p.getController().confirmAction(sa, null, TextUtil.fastReplace(prompt, "CARDNAME", CardTranslation.getTranslatedName(host.getName())), null)) {
return;
}
}
if (changeAll) {
movedCards = new CardCollection(valid);
} else if (sa.hasParam("RandomChange")) {
int numChanging = Math.min(destZone1ChangeNum, valid.size());
movedCards = CardLists.getRandomSubList(valid, numChanging);
} else if (totalCMC) {
movedCards = new CardCollection();
if (p == chooser) {
chooser.getController().tempShowCards(top);
}
if (valid.isEmpty()) {
chooser.getController().notifyOfValue(sa, null,
Localizer.getInstance().getMessage("lblNoValidCards"));
}
while (!valid.isEmpty() && (anyNumber || movedCards.size() < destZone1ChangeNum)) {
Card chosen = chooser.getController().chooseSingleEntityForEffect(valid, delayedReveal, sa,
Localizer.getInstance().getMessage("lblChooseOne"), anyNumber || optional, p, null);
if (chosen == null) {
//if they can and did choose nothing, we're done here
break;
}
if (valid.isEmpty()) {
chooser.getController().notifyOfValue(sa, null,
Localizer.getInstance().getMessage("lblNoValidCards"));
}
while (!valid.isEmpty() && (anyNumber || movedCards.size() < destZone1ChangeNum)) {
Card chosen = chooser.getController().chooseSingleEntityForEffect(valid, delayedReveal, sa,
Localizer.getInstance().getMessage("lblChooseOne"), anyNumber || optional, p, null);
if (chosen == null) {
//if they can and did choose nothing, we're done here
break;
}
movedCards.add(chosen);
valid.remove(chosen);
totcmc = totcmc - chosen.getCMC();
valid = CardLists.getValidCards(valid, "Card.cmcLE" + totcmc, cont, host, sa);
}
chooser.getController().endTempShowCards();
if (!movedCards.isEmpty()) {
game.getAction().reveal(movedCards, chooser, true,
Localizer.getInstance().getMessage("lblPlayerPickedChosen",
chooser.getName(), ""));
}
} else if (sa.hasParam("ForEachColorPair")) {
movedCards = new CardCollection();
if (p == chooser) {
chooser.getController().tempShowCards(top);
}
for (final byte pair : MagicColor.COLORPAIR) {
Card chosen = chooser.getController().chooseSingleEntityForEffect(CardLists.filter(valid,
CardPredicates.isExactlyColor(pair)), delayedReveal, sa,
Localizer.getInstance().getMessage("lblChooseOne"), false, p, null);
if (chosen != null) {
movedCards.add(chosen);
valid.remove(chosen);
totcmc = totcmc - chosen.getCMC();
valid = CardLists.getValidCards(valid, "Card.cmcLE" + totcmc, cont, host, sa);
}
chooser.getController().endTempShowCards();
if (!movedCards.isEmpty()) {
game.getAction().reveal(movedCards, chooser, true,
Localizer.getInstance().getMessage("lblPlayerPickedChosen",
chooser.getName(), ""));
}
chooser.getController().endTempShowCards();
if (!movedCards.isEmpty()) {
game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedChosen", chooser.getName(), ""));
}
} else {
String prompt;
if (sa.hasParam("PrimaryPrompt")) {
prompt = sa.getParam("PrimaryPrompt");
} else {
prompt = Localizer.getInstance().getMessage("lblChooseCardsPutIntoZone", destZone1.getTranslatedName());
if (destZone1.equals(ZoneType.Library)) {
if (!destZone2.equals(ZoneType.Library) && destZone1ChangeNum == 1) {
if (libraryPosition == 0) {
prompt = Localizer.getInstance().getMessage("lblChooseACardToLeaveTargetLibraryTop", p.getName());
} else {
prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTarget", p.getName(), destZone1.getTranslatedName());
}
} else if (libraryPosition == -1) {
prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibraryBottom", p.getName());
} else if (libraryPosition == 0) {
prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibraryTop", p.getName());
}
}
} else if (sa.hasParam("ForEachColorPair")) {
movedCards = new CardCollection();
if (p == chooser) {
}
movedCards = new CardCollection();
if (valid.isEmpty()) {
chooser.getController().notifyOfValue(sa, null, Localizer.getInstance().getMessage("lblNoValidCards"));
} else {
if (p == chooser) { // the digger can still see all the dug cards when choosing
chooser.getController().tempShowCards(top);
}
for (final byte pair : MagicColor.COLORPAIR) {
Card chosen = chooser.getController().chooseSingleEntityForEffect(CardLists.filter(valid,
CardPredicates.isExactlyColor(pair)), delayedReveal, sa,
Localizer.getInstance().getMessage("lblChooseOne"), false, p, null);
if (chosen != null) {
movedCards.add(chosen);
}
int max = anyNumber ? valid.size() : Math.min(valid.size(), destZone1ChangeNum);
int min = (anyNumber || optional) ? 0 : max;
if (max > 0) { // if max is 0 don't make a choice
movedCards.addAll(chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p, null));
}
chooser.getController().endTempShowCards();
if (!movedCards.isEmpty()) {
game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedChosen", chooser.getName(), ""));
}
}
if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) {
game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedCardFrom", chooser.getName()));
}
}
if (sa.hasParam("ForgetOtherRemembered")) {
host.clearRemembered();
}
Collections.reverse(movedCards);
if (destZone1.equals(ZoneType.Battlefield) || destZone1.equals(ZoneType.Library)) {
if (sa.hasParam("GainControl")) {
// for Cybership
movedCards = (CardCollection) activator.getController().orderMoveToZoneList(rest, destZone2, sa);
} else {
String prompt;
movedCards = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, movedCards, destZone1, sa);
}
}
if (sa.hasParam("PrimaryPrompt")) {
prompt = sa.getParam("PrimaryPrompt");
} else {
prompt = Localizer.getInstance().getMessage("lblChooseCardsPutIntoZone", destZone1.getTranslatedName());
if (destZone1.equals(ZoneType.Library)) {
if (!destZone2.equals(ZoneType.Library) && destZone1ChangeNum == 1) {
if (libraryPosition == 0) {
prompt = Localizer.getInstance().getMessage("lblChooseACardToLeaveTargetLibraryTop", p.getName());
} else {
prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTarget", p.getName(), destZone1.getTranslatedName());
}
} else if (libraryPosition == -1) {
prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibraryBottom", p.getName());
} else if (libraryPosition == 0) {
prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibraryTop", p.getName());
}
}
for (Card c : movedCards) {
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
AbilityKey.addCardZoneTableParams(moveParams, zoneMovements);
if (destZone1.equals(ZoneType.Library) || destZone1.equals(ZoneType.PlanarDeck) || destZone1.equals(ZoneType.SchemeDeck)) {
c = game.getAction().moveTo(destZone1, c, libraryPosition, sa, AbilityKey.newMap());
} else {
if (destZone1.equals(ZoneType.Exile) && !c.canExiledBy(sa, true)) {
continue;
}
movedCards = new CardCollection();
if (valid.isEmpty()) {
chooser.getController().notifyOfValue(sa, null, Localizer.getInstance().getMessage("lblNoValidCards"));
} else {
if (p == chooser) { // the digger can still see all the dug cards when choosing
chooser.getController().tempShowCards(top);
}
int max = anyNumber ? valid.size() : Math.min(valid.size(), destZone1ChangeNum);
int min = (anyNumber || optional) ? 0 : max;
if (max > 0) { // if max is 0 don't make a choice
movedCards.addAll(chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p, null));
}
chooser.getController().endTempShowCards();
if (sa.hasParam("Tapped")) {
c.setTapped(true);
}
if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) {
game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedCardFrom", chooser.getName()));
if (sa.hasParam("FaceDown")) {
c.turnFaceDown(true);
CardFactoryUtil.setFaceDownState(c, sa);
}
if (destZone1.equals(ZoneType.Battlefield)) {
moveParams.put(AbilityKey.SimultaneousETB, movedCards);
if (sa.hasParam("GainControl")) {
c.setController(activator, game.getNextTimestamp());
}
if (sa.hasParam("WithCounters")) {
final int numCtr = AbilityUtils.calculateAmount(host,
sa.getParamOrDefault("WithCountersAmount", "1"), sa);
GameEntityCounterTable table = new GameEntityCounterTable();
table.put(activator, c, CounterType.getType(sa.getParam("WithCounters")), numCtr);
moveParams.put(AbilityKey.CounterTable, table);
}
}
if (sa.hasAdditionalAbility("AnimateSubAbility")) {
// need LKI before Animate does apply
moveParams.put(AbilityKey.CardLKI, CardCopyService.getLKICopy(c));
final SpellAbility animate = sa.getAdditionalAbility("AnimateSubAbility");
host.addRemembered(c);
AbilityUtils.resolve(animate);
host.removeRemembered(c);
animate.setSVar("unanimateTimestamp", String.valueOf(game.getTimestamp()));
}
c = game.getAction().moveTo(c.getController().getZone(destZone1), c, sa, moveParams);
if (destZone1.equals(ZoneType.Battlefield)) {
if (addToCombat(c, sa, "Attacking", "Blocking")) {
combatChanged = true;
}
} else if (destZone1.equals(ZoneType.Exile)) {
if (sa.hasParam("ExileWithCounters")) {
c.addCounter(CounterType.getType(sa.getParam("ExileWithCounters")), 1, activator, counterTable);
}
handleExiledWith(c, sa);
}
}
if (sa.hasParam("ExileFaceDown")) {
c.turnFaceDown(true);
}
if (sa.hasParam("WithMayLook")) {
c.addMayLookFaceDownExile(activator);
}
if (sa.hasParam("Imprint")) {
host.addImprintedCard(c);
}
if (sa.hasParam("ForgetOtherRemembered")) {
host.clearRemembered();
}
Collections.reverse(movedCards);
if (destZone1.equals(ZoneType.Battlefield) || destZone1.equals(ZoneType.Library)) {
if (sa.hasParam("GainControl")) {
// for Cybership
movedCards = (CardCollection) activator.getController().orderMoveToZoneList(rest, destZone2, sa);
} else {
movedCards = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, movedCards, destZone1, sa);
}
if (remZone1) {
host.addRemembered(c);
}
rest.remove(c);
}
// now, move the rest to destZone2
if (!rest.isEmpty() && (!sa.hasParam("DestZone2Optional") || p.getController().confirmAction(sa, null,
Localizer.getInstance().getMessage("lblDoYouWantPutCardToZone",
destZone2.getTranslatedName()), null))) {
if (destZone2 == ZoneType.Library || destZone2 == ZoneType.PlanarDeck
|| destZone2 == ZoneType.SchemeDeck || destZone2 == ZoneType.Graveyard) {
CardCollection afterOrder = rest;
if (sa.hasParam("RestRandomOrder")) {
CardLists.shuffle(afterOrder);
} else if (!skipReorder && rest.size() > 1) {
if (destZone2 == ZoneType.Graveyard) {
afterOrder = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, rest, destZone2, sa);
} else {
afterOrder = (CardCollection) chooser.getController().orderMoveToZoneList(rest, destZone2, sa);
}
}
if (libraryPosition2 != -1) {
// Closest to top
Collections.reverse(afterOrder);
}
for (Card c : movedCards) {
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
AbilityKey.addCardZoneTableParams(moveParams, zoneMovements);
for (final Card c : afterOrder) {
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
AbilityKey.addCardZoneTableParams(moveParams, zoneMovements);
if (destZone1.equals(ZoneType.Library) || destZone1.equals(ZoneType.PlanarDeck) || destZone1.equals(ZoneType.SchemeDeck)) {
c = game.getAction().moveTo(destZone1, c, libraryPosition, sa, AbilityKey.newMap());
} else {
if (destZone1.equals(ZoneType.Exile) && !c.canExiledBy(sa, true)) {
Card m = game.getAction().moveTo(destZone2, c, libraryPosition2, sa, moveParams);
if (remZone2) {
host.addRemembered(m);
}
}
} else {
// just move them randomly
for (Card c : rest) {
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
AbilityKey.addCardZoneTableParams(moveParams, zoneMovements);
if (destZone2 == ZoneType.Exile && !c.canExiledBy(sa, true)) {
continue;
}
if (sa.hasParam("Tapped")) {
c.setTapped(true);
}
if (sa.hasParam("FaceDown")) {
c.turnFaceDown(true);
CardFactoryUtil.setFaceDownState(c, sa);
}
if (destZone1.equals(ZoneType.Battlefield)) {
moveParams.put(AbilityKey.SimultaneousETB, movedCards);
if (sa.hasParam("GainControl")) {
c.setController(activator, game.getNextTimestamp());
}
if (sa.hasParam("WithCounters")) {
final int numCtr = AbilityUtils.calculateAmount(host,
sa.getParamOrDefault("WithCountersAmount", "1"), sa);
GameEntityCounterTable table = new GameEntityCounterTable();
table.put(activator, c, CounterType.getType(sa.getParam("WithCounters")), numCtr);
moveParams.put(AbilityKey.CounterTable, table);
}
}
if (sa.hasAdditionalAbility("AnimateSubAbility")) {
// need LKI before Animate does apply
moveParams.put(AbilityKey.CardLKI, CardCopyService.getLKICopy(c));
final SpellAbility animate = sa.getAdditionalAbility("AnimateSubAbility");
host.addRemembered(c);
AbilityUtils.resolve(animate);
host.removeRemembered(c);
animate.setSVar("unanimateTimestamp", String.valueOf(game.getTimestamp()));
}
c = game.getAction().moveTo(c.getController().getZone(destZone1), c, sa, moveParams);
if (destZone1.equals(ZoneType.Battlefield)) {
if (addToCombat(c, sa, "Attacking", "Blocking")) {
combatChanged = true;
}
} else if (destZone1.equals(ZoneType.Exile)) {
c = game.getAction().moveTo(destZone2, c, sa, moveParams);
if (destZone2 == ZoneType.Exile) {
if (sa.hasParam("ExileWithCounters")) {
c.addCounter(CounterType.getType(sa.getParam("ExileWithCounters")), 1, activator, counterTable);
}
handleExiledWith(c, sa);
}
}
if (sa.hasParam("ExileFaceDown")) {
c.turnFaceDown(true);
}
if (sa.hasParam("WithMayLook")) {
c.addMayLookFaceDownExile(activator);
}
if (sa.hasParam("Imprint")) {
host.addImprintedCard(c);
}
if (sa.hasParam("ForgetOtherRemembered")) {
host.clearRemembered();
}
if (remZone1) {
host.addRemembered(c);
}
rest.remove(c);
}
// now, move the rest to destZone2
if (!rest.isEmpty() && (!sa.hasParam("DestZone2Optional") || p.getController().confirmAction(sa, null,
Localizer.getInstance().getMessage("lblDoYouWantPutCardToZone",
destZone2.getTranslatedName()), null))) {
if (destZone2 == ZoneType.Library || destZone2 == ZoneType.PlanarDeck
|| destZone2 == ZoneType.SchemeDeck || destZone2 == ZoneType.Graveyard) {
CardCollection afterOrder = rest;
if (sa.hasParam("RestRandomOrder")) {
CardLists.shuffle(afterOrder);
} else if (!skipReorder && rest.size() > 1) {
if (destZone2 == ZoneType.Graveyard) {
afterOrder = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, rest, destZone2, sa);
} else {
afterOrder = (CardCollection) chooser.getController().orderMoveToZoneList(rest, destZone2, sa);
}
}
if (libraryPosition2 != -1) {
// Closest to top
Collections.reverse(afterOrder);
}
for (final Card c : afterOrder) {
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
AbilityKey.addCardZoneTableParams(moveParams, zoneMovements);
Card m = game.getAction().moveTo(destZone2, c, libraryPosition2, sa, moveParams);
if (remZone2) {
host.addRemembered(m);
}
}
} else {
// just move them randomly
for (Card c : rest) {
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
AbilityKey.addCardZoneTableParams(moveParams, zoneMovements);
if (destZone2 == ZoneType.Exile && !c.canExiledBy(sa, true)) {
continue;
}
c = game.getAction().moveTo(destZone2, c, sa, moveParams);
if (destZone2 == ZoneType.Exile) {
if (sa.hasParam("ExileWithCounters")) {
c.addCounter(CounterType.getType(sa.getParam("ExileWithCounters")), 1, activator, counterTable);
}
handleExiledWith(c, sa);
if (remZone2) {
host.addRemembered(c);
}
host.addRemembered(c);
}
}
}

View File

@@ -20,79 +20,69 @@ public abstract class ManifestBaseEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
final Card source = sa.getHostCard();
final Player activator = sa.getActivatingPlayer();
final Game game = source.getGame();
// Usually a number leaving possibility for X, Sacrifice X land: Manifest X creatures.
final int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(source, sa.getParam("Amount"), sa) : 1;
final int times = sa.hasParam("Times") ? AbilityUtils.calculateAmount(source, sa.getParam("Times"), sa) : 1;
for (int i = 0; i < times; i++) {
for (final Player p : getTargetPlayers(sa, "DefinedPlayer")) {
CardCollection tgtCards;
Card toGrave = null;
boolean fromLibrary = false;
if (sa.hasParam("Choices") || sa.hasParam("ChoiceZone")) {
ZoneType choiceZone = ZoneType.Hand;
if (sa.hasParam("ChoiceZone")) {
choiceZone = ZoneType.smartValueOf(sa.getParam("ChoiceZone"));
fromLibrary = choiceZone.equals(ZoneType.Library);
}
CardCollectionView choices = p.getCardsIn(choiceZone);
if (sa.hasParam("Choices")) {
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, source, sa);
}
if (choices.isEmpty()) {
continue;
}
for (final Player p : getTargetPlayers(sa, "DefinedPlayer")) {
manifestLoop(sa, p, amount);
}
}
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : getDefaultMessage() + " ";
protected void manifestLoop(SpellAbility sa, Player p, final int amount) {
tgtCards = new CardCollection(p.getController().chooseCardsForEffect(choices, sa, title, amount, amount, false, null));
} else if (sa.hasParam("Dread")) {
tgtCards = p.getTopXCardsFromLibrary(2);
if (!tgtCards.isEmpty()) {
Card manifest = p.getController().chooseSingleEntityForEffect(tgtCards, sa, getDefaultMessage(), null);
tgtCards.remove(manifest);
toGrave = tgtCards.isEmpty() ? null : tgtCards.getFirst();
tgtCards = new CardCollection(manifest);
}
fromLibrary = true;
} else if ("TopOfLibrary".equals(sa.getParamOrDefault("Defined", "TopOfLibrary"))) {
tgtCards = p.getTopXCardsFromLibrary(amount);
fromLibrary = true;
} else {
tgtCards = getTargetCards(sa);
if (tgtCards.allMatch(CardPredicates.inZone(ZoneType.Library))) {
fromLibrary = true;
}
}
final Card source = sa.getHostCard();
final Player activator = sa.getActivatingPlayer();
final Game game = source.getGame();
if (sa.hasParam("Shuffle")) {
CardLists.shuffle(tgtCards);
}
if (fromLibrary) {
for (Card c : tgtCards) {
// CR 701.34d If an effect instructs a player to manifest multiple cards from their library, those cards are manifested one at a time.
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
CardZoneTable triggerList = AbilityKey.addCardZoneTableParams(moveParams, sa);
internalEffect(c, p, sa, moveParams);
if (sa.hasParam("Dread") && toGrave != null) {
game.getAction().moveToGraveyard(toGrave, sa, moveParams);
toGrave = null;
}
triggerList.triggerChangesZoneAll(game, sa);
}
} else {
// manifest from other zones should be done at the same time
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
CardZoneTable triggerList = AbilityKey.addCardZoneTableParams(moveParams, sa);
for (Card c : tgtCards) {
internalEffect(c, p, sa, moveParams);
}
triggerList.triggerChangesZoneAll(game, sa);
}
CardCollection tgtCards;
boolean fromLibrary = false;
if (sa.hasParam("Choices") || sa.hasParam("ChoiceZone")) {
ZoneType choiceZone = ZoneType.Hand;
if (sa.hasParam("ChoiceZone")) {
choiceZone = ZoneType.smartValueOf(sa.getParam("ChoiceZone"));
fromLibrary = choiceZone.equals(ZoneType.Library);
}
CardCollectionView choices = p.getCardsIn(choiceZone);
if (sa.hasParam("Choices")) {
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, source, sa);
}
if (choices.isEmpty()) {
return;
}
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : getDefaultMessage() + " ";
tgtCards = new CardCollection(p.getController().chooseCardsForEffect(choices, sa, title, amount, amount, false, null));
} else if ("TopOfLibrary".equals(sa.getParamOrDefault("Defined", "TopOfLibrary"))) {
tgtCards = p.getTopXCardsFromLibrary(amount);
fromLibrary = true;
} else {
tgtCards = getTargetCards(sa);
if (tgtCards.allMatch(CardPredicates.inZone(ZoneType.Library))) {
fromLibrary = true;
}
}
if (sa.hasParam("Shuffle")) {
CardLists.shuffle(tgtCards);
}
if (fromLibrary) {
for (Card c : tgtCards) {
// CR 701.34d If an effect instructs a player to manifest multiple cards from their library, those cards are manifested one at a time.
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
CardZoneTable triggerList = AbilityKey.addCardZoneTableParams(moveParams, sa);
internalEffect(c, p, sa, moveParams);
triggerList.triggerChangesZoneAll(game, sa);
}
} else {
// manifest from other zones should be done at the same time
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
CardZoneTable triggerList = AbilityKey.addCardZoneTableParams(moveParams, sa);
for (Card c : tgtCards) {
internalEffect(c, p, sa, moveParams);
}
triggerList.triggerChangesZoneAll(game, sa);
}
}

View File

@@ -0,0 +1,41 @@
package forge.game.ability.effects;
import java.util.Map;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardZoneTable;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
public class ManifestDreadEffect extends ManifestEffect {
@Override
protected void manifestLoop(SpellAbility sa, Player p, final int amount) {
final Game game = p.getGame();
for (int i = 0; i < amount; i++) {
CardCollection tgtCards = p.getTopXCardsFromLibrary(2);
Card manifest = null;
Card toGrave = null;
if (!tgtCards.isEmpty()) {
manifest = p.getController().chooseSingleEntityForEffect(tgtCards, sa, getDefaultMessage(), null);
tgtCards.remove(manifest);
toGrave = tgtCards.isEmpty() ? null : tgtCards.getFirst();
// CR 701.34d If an effect instructs a player to manifest multiple cards from their library, those cards are manifested one at a time.
Map<AbilityKey, Object> moveParams = AbilityKey.newMap();
CardZoneTable triggerList = AbilityKey.addCardZoneTableParams(moveParams, sa);
internalEffect(manifest, p, sa, moveParams);
if (toGrave != null) {
toGrave = game.getAction().moveToGraveyard(toGrave, sa, moveParams);
}
triggerList.triggerChangesZoneAll(game, sa);
}
Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(p);
runParams.put(AbilityKey.Card, toGrave);
game.getTriggerHandler().runTrigger(TriggerType.ManifestDread, runParams, true);
}
}
}

View File

@@ -9,10 +9,11 @@ import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
public class ManifestEffect extends ManifestBaseEffect {
@Override
protected String getDefaultMessage() {
return Localizer.getInstance().getMessage("lblChooseCardToManifest");
}
@Override
protected Card internalEffect(Card c, Player p, SpellAbility sa, Map<AbilityKey, Object> moveParams) {
final Card source = sa.getHostCard();
Card rem = c.manifest(p, sa, moveParams);

View File

@@ -18,11 +18,16 @@ import forge.util.TextUtil;
import java.util.Map;
public class MillEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
final Card source = sa.getHostCard();
final Game game = source.getGame();
final int numCards = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumCards"), sa) : 1;
final int numCards = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(source, sa.getParam("NumCards"), sa) : 1;
if (numCards <= 0) {
return;
}
if (sa.hasParam("ForgetOtherRemembered")) {
source.clearRemembered();

View File

@@ -17,8 +17,7 @@ public class ScryEffect extends SpellAbilityEffect {
protected String getStackDescription(SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
final List<Player> players = Lists.newArrayList(); // players really affected
players.addAll(getTargetPlayers(sa));
final List<Player> players = getTargetPlayers(sa);
sb.append(Lang.joinHomogenous(players)).append(" ");
int num = 1;

View File

@@ -186,7 +186,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
private boolean startsGameInPlay = false;
private boolean drawnThisTurn = false;
private boolean foughtThisTurn = false;
private boolean becameTargetThisTurn = false;
private boolean becameTargetThisTurn, valiant = false;
private boolean enlistedThisCombat = false;
private boolean startedTheTurnUntapped = false;
private boolean cameUnderControlSinceLastUpkeep = true; // for Echo
@@ -3698,6 +3698,12 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
public void setBecameTargetThisTurn(boolean becameTargetThisTurn0) {
becameTargetThisTurn = becameTargetThisTurn0;
}
public boolean isValiant() {
return valiant;
}
public void setValiant(boolean v) {
valiant = v;
}
public boolean hasStartedTheTurnUntapped() {
return startedTheTurnUntapped;
@@ -7197,6 +7203,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
setRegeneratedThisTurn(0);
resetShieldCount();
setBecameTargetThisTurn(false);
setValiant(false);
setFoughtThisTurn(false);
turnedFaceUpThisTurn = false;
clearMustBlockCards();

View File

@@ -1414,7 +1414,7 @@ public class CardFactoryUtil {
inst.addTrigger(trigger);
} else if (keyword.startsWith("Impending")) {
// Remove Time counter trigger
final String endTrig = "Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE1_TIME" +
final String endTrig = "Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+impended+counters_GE1_TIME" +
" | Secondary$ True | TriggerDescription$ At the beginning of your end step, remove a time counter from it.";
final String remove = "DB$ RemoveCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 1";
@@ -1552,7 +1552,7 @@ public class CardFactoryUtil {
final String actualTrigger = "Mode$ Attacks | ValidCard$ Card.Self | Secondary$ True"
+ " | TriggerDescription$ Myriad (" + inst.getReminderText() + ")";
final String copyStr = "DB$ CopyPermanent | Defined$ Self | TokenTapped$ True | Optional$ True | TokenAttacking$ RememberedPlayer & Valid Planeswalker.ControlledBy Remembered"
final String copyStr = "DB$ CopyPermanent | Defined$ Self | TokenTapped$ True | OptionalForEach$ True | TokenAttacking$ RememberedPlayer & Valid Planeswalker.ControlledBy Remembered"
+ "| ForEach$ OppNonDefendingPlayer | AtEOT$ ExileCombat | CleanupForEach$ True";
final SpellAbility copySA = AbilityFactory.getAbility(copyStr, card);
@@ -2353,17 +2353,7 @@ public class CardFactoryUtil {
final String effect = "DB$ PutCounter | Defined$ ReplacedCard | CounterType$ TIME | CounterNum$ " + m
+ " | ETB$ True | SpellDescription$ " + desc;
SpellAbility repAb = AbilityFactory.getAbility(effect, card);
String staticEffect = "DB$ Effect | StaticAbilities$ NoCreature | ExileOnCounter$ TIME | Duration$ UntilHostLeavesPlay";
String staticNoCreature = "Mode$ Continuous | Affected$ Card.EffectSource+counters_GE1_TIME | RemoveType$ Creature | Description$ EFFECTSOURCE isn't a creature.";
AbilitySub effectAb = (AbilitySub)AbilityFactory.getAbility(staticEffect, card);
effectAb.setSVar("NoCreature", staticNoCreature);
repAb.setSubAbility(effectAb);
final ReplacementEffect re = createETBReplacement(card, ReplacementLayer.Other, repAb, false, true, intrinsic, "Card.Self+impended", "");
final ReplacementEffect re = createETBReplacement(card, ReplacementLayer.Other, effect, false, true, intrinsic, "Card.Self+impended", "");
inst.addReplacement(re);
} else if (keyword.equals("Jump-start")) {
@@ -3997,6 +3987,9 @@ public class CardFactoryUtil {
String effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutHorsemanship | Secondary$ True " +
" | Description$ Horsemanship (" + inst.getReminderText() + ")";
inst.addStaticAbility(StaticAbility.create(effect, state.getCard(), state, intrinsic));
} else if (keyword.startsWith("Impending")) {
String effect = "Mode$ Continuous | Affected$ Card.Self+impended+counters_GE1_TIME | RemoveType$ Creature | Secondary$ True";
inst.addStaticAbility(StaticAbility.create(effect, state.getCard(), state, intrinsic));
} else if (keyword.equals("Intimidate")) {
String effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonArtifact+!SharesColorWith | Secondary$ True " +
" | Description$ Intimidate (" + inst.getReminderText() + ")";

View File

@@ -302,7 +302,7 @@ public class ManaCostBeingPaid {
sc.xCount = sc.totalCount;
}
// nothing more left in otherSubtract
return;
break;
}
}
}
@@ -322,7 +322,7 @@ public class ManaCostBeingPaid {
sc.xCount = sc.totalCount;
}
// nothing more left in otherSubtract
return;
break;
}
}
}
@@ -342,7 +342,7 @@ public class ManaCostBeingPaid {
sc.xCount = sc.totalCount;
}
// nothing more left in otherSubtract
return;
break;
}
}
}
@@ -362,7 +362,7 @@ public class ManaCostBeingPaid {
sc.xCount = sc.totalCount;
}
// nothing more left in otherSubtract
return;
break;
}
}
}
@@ -384,7 +384,7 @@ public class ManaCostBeingPaid {
sc.xCount = sc.totalCount;
}
// nothing more left in otherSubtract
return;
break;
}
} else if (sc.xCount > 0) { // X part that can only be paid by specific color
if (otherSubtract >= sc.xCount) {
@@ -398,7 +398,7 @@ public class ManaCostBeingPaid {
sc.totalCount -= otherSubtract;
sc.xCount -= otherSubtract;
// nothing more left in otherSubtract
return;
break;
}
}
}

View File

@@ -21,11 +21,11 @@ public class PlayerProperty {
public static boolean playerHasProperty(Player player, String property, Player sourceController, Card source, CardTraitBase spellAbility) {
Game game = player.getGame();
if (property.endsWith("Activator")) {
sourceController = spellAbility.getHostCard().getController();
property = property.substring(0, property.length() - 9);
}
if (property.equals("You")) {
if (property.equals("Activator")) {
if (!player.equals(spellAbility.getHostCard().getController())) {
return false;
}
} else if (property.equals("You")) {
if (!player.equals(sourceController)) {
return false;
}

View File

@@ -60,6 +60,7 @@ public abstract class ReplacementEffect extends TriggerReplacementBase {
private boolean hasRun = false;
private List<ReplacementEffect> otherChoices = null;
private ReplacementEffectView view = null;
/**
* Gets the id.
@@ -109,6 +110,15 @@ public abstract class ReplacementEffect extends TriggerReplacementBase {
}
}
public ReplacementEffectView getView() {
if (view == null)
view = new ReplacementEffectView(this);
else {
view.updateHostCard(this);
view.updateDescription(this);
}
return view;
}
/**
* Sets the checks for run.
*

View File

@@ -0,0 +1,47 @@
package forge.game.replacement;
import forge.game.card.CardView;
import forge.game.card.IHasCardView;
import forge.trackable.TrackableObject;
import forge.trackable.TrackableProperty;
import forge.trackable.Tracker;
public class ReplacementEffectView extends TrackableObject implements IHasCardView {
private static final long serialVersionUID = 1L;
ReplacementEffectView(ReplacementEffect re) {
this(re, re.getHostCard() == null || re.getHostCard().getGame() == null ? null : re.getHostCard().getGame().getTracker());
}
ReplacementEffectView(ReplacementEffect re, Tracker tracker) {
super(re.getId(), tracker);
updateHostCard(re);
updateDescription(re);
}
@Override
public CardView getCardView() {
return this.getHostCard();
}
public CardView getHostCard() {
return get(TrackableProperty.RE_HostCard);
}
void updateHostCard(ReplacementEffect re) {
set(TrackableProperty.RE_HostCard, CardView.get(re.getHostCard()));
}
@Override
public String toString() {
return this.getDescription();
}
public String getDescription() {
return get(TrackableProperty.RE_Description);
}
void updateDescription(ReplacementEffect re) {
set(TrackableProperty.RE_Description, re.getDescription());
}
}

View File

@@ -144,9 +144,6 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView {
view.updateTargetPlayers(this);
view.updateText(this);
// Run BecomesTargetTrigger
Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.SourceSA, ability);
Set<GameObject> distinctObjects = Sets.newHashSet();
for (final GameObject tgt : target) {
if (oldTarget != null && oldTarget.contains(tgt)) {
@@ -157,16 +154,22 @@ public class SpellAbilityStackInstance implements IIdentifiable, IHasCardView {
continue;
}
Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.SourceSA, ability);
if (tgt instanceof Card && !((Card) tgt).hasBecomeTargetThisTurn()) {
runParams.put(AbilityKey.FirstTime, null);
((Card) tgt).setBecameTargetThisTurn(true);
}
if (tgt instanceof Card && !((Card) tgt).isValiant() && cause.getController().equals(((Card) tgt).getController())) {
runParams.put(AbilityKey.Valiant, null);
((Card) tgt).setValiant(true);
}
runParams.put(AbilityKey.Target, tgt);
getSourceCard().getGame().getTriggerHandler().runTrigger(TriggerType.BecomesTarget, runParams, false);
}
// Only run BecomesTargetOnce when at least one target is changed
if (!distinctObjects.isEmpty()) {
runParams = AbilityKey.newMap();
Map<AbilityKey, Object> runParams = AbilityKey.newMap();
runParams.put(AbilityKey.SourceSA, ability);
runParams.put(AbilityKey.Targets, distinctObjects);
runParams.put(AbilityKey.Cause, cause);

View File

@@ -62,6 +62,7 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone
private int mayPlayTurn = 0;
private SpellAbility payingTrigSA;
private StaticAbilityView view = null;
@Override
public final int getId() {
@@ -231,6 +232,16 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone
this.setCardState(state);
}
public StaticAbilityView getView() {
if (view == null)
view = new StaticAbilityView(this);
else {
view.updateHostCard(this);
view.updateDescription(this);
}
return view;
}
public final CardCollectionView applyContinuousAbilityBefore(final StaticAbilityLayer layer, final CardCollectionView preList) {
if (!shouldApplyContinuousAbility(layer, false)) {
return null;

View File

@@ -0,0 +1,47 @@
package forge.game.staticability;
import forge.game.card.CardView;
import forge.game.card.IHasCardView;
import forge.trackable.TrackableObject;
import forge.trackable.TrackableProperty;
import forge.trackable.Tracker;
public class StaticAbilityView extends TrackableObject implements IHasCardView {
private static final long serialVersionUID = 1L;
StaticAbilityView(StaticAbility st) {
this(st, st.getHostCard() == null || st.getHostCard().getGame() == null ? null : st.getHostCard().getGame().getTracker());
}
StaticAbilityView(StaticAbility st, Tracker tracker) {
super(st.getId(), tracker);
updateHostCard(st);
updateDescription(st);
}
@Override
public CardView getCardView() {
return this.getHostCard();
}
public CardView getHostCard() {
return get(TrackableProperty.ST_HostCard);
}
void updateHostCard(StaticAbility st) {
set(TrackableProperty.ST_HostCard, CardView.get(st.getHostCard()));
}
@Override
public String toString() {
return this.getDescription();
}
public String getDescription() {
return get(TrackableProperty.ST_Description);
}
void updateDescription(StaticAbility st) {
set(TrackableProperty.ST_Description, st.toString());
}
}

View File

@@ -77,6 +77,12 @@ public class TriggerBecomesTarget extends Trigger {
}
}
if (hasParam("Valiant")) {
if (!runParams.containsKey(AbilityKey.Valiant)) {
return false;
}
}
return true;
}

View File

@@ -0,0 +1,35 @@
package forge.game.trigger;
import java.util.Map;
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
public class TriggerManifestDread extends Trigger {
public TriggerManifestDread(Map<String, String> params, Card host, boolean intrinsic) {
super(params, host, intrinsic);
}
@Override
public boolean performTest(Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) {
return false;
}
return true;
}
@Override
public void setTriggeringObjects(SpellAbility sa, Map<AbilityKey, Object> runParams) {
sa.setTriggeringObject(AbilityKey.NewCard, runParams.get(AbilityKey.Card));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
// TODO Auto-generated method stub
return "";
}
}

View File

@@ -139,6 +139,9 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger {
if (!matchesValidParam("ValidSA", spellAbility)) {
return false;
}
if (!matchesValidParam("ValidSAonCard", spellAbility, cast)) {
return false;
}
if (hasParam("TargetsValid")) {
SpellAbility sa = spellAbility;

View File

@@ -97,6 +97,7 @@ public enum TriggerType {
LosesGame(TriggerLosesGame.class),
ManaAdded(TriggerManaAdded.class),
ManaExpend(TriggerManaExpend.class),
ManifestDread(TriggerManifestDread.class),
Mentored(TriggerMentored.class),
Milled(TriggerMilled.class),
MilledOnce(TriggerMilledOnce.class),

View File

@@ -441,13 +441,11 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
// Create a new object, since the triggers aren't happening right away
List<TargetChoices> chosenTargets = sp.getAllTargetChoices();
if (!chosenTargets.isEmpty()) {
runParams = AbilityKey.newMap();
SpellAbility s = sp;
if (si != null) {
s = si.getSpellAbility();
chosenTargets = s.getAllTargetChoices();
}
runParams.put(AbilityKey.SourceSA, s);
Set<GameObject> distinctObjects = Sets.newHashSet();
for (final TargetChoices tc : chosenTargets) {
for (final GameObject tgt : tc) {
@@ -457,14 +455,22 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
continue;
}
runParams = AbilityKey.newMap();
runParams.put(AbilityKey.SourceSA, s);
if (tgt instanceof Card && !((Card) tgt).hasBecomeTargetThisTurn()) {
runParams.put(AbilityKey.FirstTime, null);
((Card) tgt).setBecameTargetThisTurn(true);
}
if (tgt instanceof Card && !((Card) tgt).isValiant() && activator.equals(((Card) tgt).getController())) {
runParams.put(AbilityKey.Valiant, null);
((Card) tgt).setValiant(true);
}
runParams.put(AbilityKey.Target, tgt);
game.getTriggerHandler().runTrigger(TriggerType.BecomesTarget, runParams, false);
}
}
runParams = AbilityKey.newMap();
runParams.put(AbilityKey.SourceSA, s);
runParams.put(AbilityKey.Targets, distinctObjects);
runParams.put(AbilityKey.Cause, s.getHostCard());
game.getTriggerHandler().runTrigger(TriggerType.BecomesTargetOnce, runParams, false);

View File

@@ -241,6 +241,14 @@ public enum TrackableProperty {
CanPlay(TrackableTypes.BooleanType),
PromptIfOnlyPossibleAbility(TrackableTypes.BooleanType),
//ReplacementEffectView
RE_HostCard(TrackableTypes.CardViewType),
RE_Description(TrackableTypes.StringType),
//StaticAbilityView
ST_HostCard(TrackableTypes.CardViewType),
ST_Description(TrackableTypes.StringType),
//HasBackSide
BackSideName(TrackableTypes.StringType),
HasBackSide(TrackableTypes.BooleanType),

View File

@@ -431,10 +431,12 @@ public class ImageView<T extends InventoryItem> extends ItemView<T> {
Map<Comparable<?>, Pile> piles = new TreeMap<>();
for (ItemInfo itemInfo : group.items) {
Comparable<?> key = groupPileBy.fnSort.apply(itemInfo);
if (!piles.containsKey(key)) {
if (key != null && !piles.containsKey(key)) {
piles.put(key, new Pile());
}
piles.get(key).items.add(itemInfo);
Pile p = key == null ? null : piles.getOrDefault(key, null);
if (p != null)
p.items.add(itemInfo);
}
group.piles.clear();
group.piles.addAll(piles.values());

View File

@@ -2,7 +2,7 @@ Name:Agatha of the Vile Cauldron
ManaCost:R G
Types:Legendary Creature Human Warlock
PT:1/1
S:Mode$ ReduceCost | ValidCard$ Creature.YouCtrl | Type$ Ability | Amount$ X | MinMana$ 1 | AffectedZone$ Battlefield | Description$ Activated abilities of creatures you control cost X less to activate, where X is CARDNAME's power. This effect can't reduce the mana in that cost to less than one mana.
S:Mode$ ReduceCost | ValidCard$ Creature.YouCtrl | Type$ Ability | Amount$ X | MinMana$ 1 | AffectedZone$ Battlefield | Description$ Activated abilities of creatures you control cost {X} less to activate, where X is CARDNAME's power. This effect can't reduce the mana in that cost to less than one mana.
A:AB$ PumpAll | Cost$ 4 R G | ValidCards$ Creature.YouCtrl+StrictlyOther | NumAtt$ +1 | NumDef$ +1 | KW$ Trample & Haste | SpellDescription$ Other creatures you control get +1/+1 and gain trample and haste until end of turn.
SVar:X:Count$CardPower
Oracle:Activated abilities of creatures you control cost X less to activate, where X is Agatha of the Vile Cauldron's power. This effect can't reduce the mana in that cost to less than one mana.\n{4}{R}{G}: Other creatures you control get +1/+1 and gain trample and haste until end of turn.
Oracle:Activated abilities of creatures you control cost {X} less to activate, where X is Agatha of the Vile Cauldron's power. This effect can't reduce the mana in that cost to less than one mana.\n{4}{R}{G}: Other creatures you control get +1/+1 and gain trample and haste until end of turn.

View File

@@ -8,7 +8,7 @@ T:Mode$ ChangesZoneAll | TriggerZones$ Battlefield | ValidCards$ Cat.Other+YouCt
SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Token
DeckHas:Ability$Sacrifice|Token
AlternateMode:DoubleFaced
Oracle:When Ajani, Nacatl Pariah enters, create a 2/1 white Cat Warrior creature token.\nWhenever one or more other Cats you control die, you may exile Ajani, then return him to the battlefield transformed under his owner's control.
@@ -24,11 +24,7 @@ A:AB$ Token | Cost$ AddCounter<0/LOYALTY> | TokenAmount$ 1 | TokenScript$ w_2_1_
SVar:DBImmediateTrig1:DB$ ImmediateTrigger | TriggerAmount$ Remembered$Amount | ConditionPresent$ Permanent.Red+YouCtrl+Other | Execute$ TrigDamage | TriggerDescription$ When you do, if you control a red permanent other than CARDNAME, he deals damage equal to the number of creatures you control to any target.
SVar:TrigDamage:DB$ DealDamage | NumDmg$ X | ValidTgts$ Any | ConditionPresent$ Permanent.Red+YouCtrl+Other | SubAbility$ DBCleanup | TgtPrompt$ Select any valid target | SpellDescription$ CARDNAME deals damage equal to the number of creatures you control to any target.
SVar:X:Count$Valid Creature.YouCtrl
A:AB$ RepeatEach | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatPlayers$ Opponent | RepeatSubAbility$ ChooseArtf | SubAbility$ SacAllOthers | SpellDescription$ Each opponent chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest.
SVar:ChooseArtf:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Artifact.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose an artifact to keep | SubAbility$ ChooseCrtr | RememberChosen$ True | Mandatory$ True
SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose a creature to keep | SubAbility$ ChooseEnch | RememberChosen$ True | Mandatory$ True
SVar:ChooseEnch:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Enchantment.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose an enchantment to keep | SubAbility$ ChoosePwkr | RememberChosen$ True | Mandatory$ True
SVar:ChoosePwkr:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Planeswalker.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose a land to keep | RememberChosen$ True | Mandatory$ True
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonLand+OppCtrl+IsNotRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:AB$ ChooseCard | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ Opponent | Choices$ Permanent.nonLand | ChooseEach$ Artifact & Creature & Enchantment & Planeswalker | ControlledByPlayer$ Chooser | Mandatory$ True | Reveal$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each opponent chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest.
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonLand+OppCtrl+nonChosenCard | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
Oracle:[+2]: Put a +1/+1 counter on each Cat you control.\n[0]: Create a 2/1 white Cat Warrior creature token. When you do, if you control a red permanent other than Ajani, Nacatl Avenger, he deals damage equal to the number of creatures you control to any target.\n[-4]: Each opponent chooses an artifact, a creature, an enchantment and a planeswalker from among the nonland permanents they control, then sacrifices the rest.

View File

@@ -2,7 +2,8 @@ Name:All Shall Smolder in My Wake
ManaCost:no cost
Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ Ignite | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, destroy up to one target artifact, up to one target enchantment, and up to one target nonbasic land.
SVar:Ignite:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to destroy | SubAbility$ Burn
SVar:Burn:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment to destroy | SubAbility$ Smolder
SVar:Smolder:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land to destroy
SVar:Ignite:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to destroy | AILogic$ Destroy | IsCurse$ True | SubAbility$ Burn
SVar:Burn:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment to destroy | AILogic$ Destroy | IsCurse$ True | SubAbility$ Smolder
SVar:Smolder:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land to destroy | AILogic$ Destroy | IsCurse$ True | SubAbility$ Burninate
SVar:Burninate:DB$ Destroy | Defined$ Targeted
Oracle:When you set this scheme in motion, destroy up to one target artifact, up to one target enchantment, and up to one target nonbasic land.

View File

@@ -3,8 +3,9 @@ ManaCost:3 B B
Types:Creature Demon
PT:5/4
K:Flying
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of each opponent's end step, that player chooses up to two creature they control, then sacrifices the rest.
SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredPlayer | MinAmount$ 0 | Amount$ 2 | TargetControls$ True | Choices$ Creature | ChoiceTitle$ Choose up to two creatures | SubAbility$ DBSacrificeAll
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of each opponent's end step, that player chooses up to two creatures they control, then sacrifices the rest.
SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredPlayer | MinAmount$ 0 | Amount$ 2 | TargetControls$ True | Choices$ Creature | ChoiceTitle$ Choose up to two creatures to keep | Reveal$ True | SubAbility$ DBSacrificeAll
SVar:DBSacrificeAll:DB$ SacrificeAll | ValidCards$ Creature.nonChosenCard | Controller$ TriggeredPlayer | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHas:Ability$Sacrifice
Oracle:Flying\nAt the beginning of each opponent's end step, that player chooses up to two creatures they control, then sacrifices the rest.

View File

@@ -6,4 +6,5 @@ SVar:DBChooseSac:DB$ ChooseCard | Choices$ Card.IsRemembered | Defined$ Targeted
SVar:DBSac:DB$ SacrificeAll | Defined$ ChosenCard | SubAbility$ DBBounce | StackDescription$ None
SVar:DBBounce:DB$ ChangeZone | Defined$ Remembered | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBCleanup | StackDescription$ None
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Sacrifice
Oracle:Choose two target creatures controlled by the same player. Their controller chooses and sacrifices one of them. Return the other to its owner's hand.

View File

@@ -4,5 +4,5 @@ Types:Ongoing Scheme
S:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Spells you cast cost {1} less to cast.
T:Mode$ Phase | Phase$ End Of Turn | ValidPlayer$ Player.Opponent | Execute$ Abandon | TriggerZones$ Command | CheckSVar$ X | SVarCompare$ GE4 | TriggerDescription$ At the beginning of your opponents' end step, if they cast four or more spells this turn, abandon this scheme.
SVar:Abandon:DB$ Abandon
SVar:X:Count$ThisTurnCast_Card.YouDontCtrl
SVar:X:Count$ThisTurnCast_Card.ActivePlayerCtrl
Oracle:(An ongoing scheme remains face up until it's abandoned.)\nSpells you cast cost {1} less to cast.\nAt the beginning of your opponents' end step, if they cast four or more spells this turn, abandon this scheme.

View File

@@ -4,7 +4,7 @@ Types:Creature Bird
PT:2/1
K:Flying
K:etbCounter:P1P1:1:CheckSVar$ Morbid:CARDNAME enters with a +1/+1 counter on it if a creature died this turn.
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
K:Plot:1 B
DeckHas:Ability$Counters
Oracle:Flying\nBlacksnag Buzzard enters with a +1/+1 counter on it if a creature died this turn.\nPlot {1}{B} (You may pay {1}{B} and exile this card from your hand. Cast it as a sorcery on a later turn without paying its mana cost. Plot only as a sorcery.)

View File

@@ -4,6 +4,6 @@ Types:Creature Beast
PT:3/3
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, if a creature died this turn, put a +1/+1 counter on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
DeckHas:Ability$Counters
Oracle:At the beginning of your end step, if a creature died this turn, put a +1/+1 counter on Bulette.

View File

@@ -11,6 +11,6 @@ ALTERNATE
Name:Release
ManaCost:4 R W
Types:Sorcery
A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBSac | SpellDescription$ Each player sacrifices an artifact, a creature, an enchantment, a land, and a planeswalker.
SVar:DBSac:DB$ Sacrifice | Defined$ Player.IsRemembered | SacValid$ Artifact & Creature & Enchantment & Land & Planeswalker | SacEachValid$ True
A:SP$ Sacrifice | Defined$ Player | SacValid$ Artifact & Creature & Enchantment & Land & Planeswalker | SacEachValid$ True | SpellDescription$ Each player sacrifices an artifact, a creature, an enchantment, a land, and a planeswalker.
DeckHas:Ability$Sacrifice
Oracle:Each player sacrifices an artifact, a creature, an enchantment, a land, and a planeswalker.\nFuse (You may cast one or both halves of this card from your hand.)

View File

@@ -5,8 +5,8 @@ PT:6/6
K:First Strike
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBChoice | TriggerDescription$ When CARDNAME enters, target opponent may have you draw three cards. If the player doesn't, you mill three cards, then CARDNAME deals damage to that player equal to the total mana value of those cards.
SVar:DBChoice:DB$ GenericChoice | ValidTgts$ Opponent | Choices$ CombustDraw,CombustDamage | AILogic$ CombustibleGearhulk
SVar:CombustDraw:DB$ Draw | Defined$ You | NumCards$ 3 | SpellDescription$ Controller draws three cards
SVar:CombustDamage:DB$ Mill | Defined$ You | NumCards$ 3 | RememberMilled$ True | SubAbility$ DamageOpponent | SpellDescription$ Controller mills three cards, then CARDNAME deals damage to you equal to their total mana value.
SVar:CombustDraw:DB$ Draw | Defined$ You | NumCards$ 3 | SpellDescription$ CARDNAME's controller draws three cards.
SVar:CombustDamage:DB$ Mill | Defined$ You | NumCards$ 3 | RememberMilled$ True | SubAbility$ DamageOpponent | SpellDescription$ CARDNAME's controller mills three cards, then it deals damage to you equal to the total mana value of those cards.
SVar:DamageOpponent:DB$ DealDamage | Defined$ ParentTarget | NumDmg$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Remembered$SumCMC

View File

@@ -3,14 +3,11 @@ ManaCost:3 R W
Types:Legendary Creature Human Soldier
PT:5/3
T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigDig | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, spells you cast from exile this turn cost {X} less to cast, where X is the number of players being attacked. Exile the top X cards of your library. Until end of turn, you may cast spells from among those exiled cards.
SVar:TrigDig:DB$ Dig | DigNum$ X | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBStoreNum
SVar:DBStoreNum:DB$ StoreSVar | SVar$ Y | Type$ Calculate | Expression$ X | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | StaticAbilities$ ReduceCost,STPlay | RememberObjects$ Remembered | SubAbility$ DBCleanup
SVar:ReduceCost:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card.wasCastFromExile | Type$ Spell | Activator$ You | Amount$ Y | Description$ Spells you cast from exile this turn cost {X} less to cast, where X is the number of players you attacked.
SVar:TrigDig:DB$ Dig | DigNum$ X | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | StaticAbilities$ ReduceCost,STPlay | RememberObjects$ Remembered | SetChosenNumber$ X | SubAbility$ DBCleanup
SVar:ReduceCost:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card.wasCastFromExile | Type$ Spell | Activator$ You | Amount$ ChosenNumber | Description$ Spells you cast from exile this turn cost {X} less to cast, where X is the number of players you attacked.
SVar:STPlay:Mode$ Continuous | Affected$ Card.IsRemembered+nonLand | EffectZone$ Command | AffectedZone$ Exile | MayPlay$ True | Description$ Until end of turn, you may cast spells from among those exiled cards.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBResetNum
SVar:DBResetNum:DB$ StoreSVar | SVar$ Y | Type$ Number | Expression$ 0
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:TriggeredPlayersAttackedTarget$Amount
SVar:Y:Number$0
DeckHints:Keyword$Encore|Myriad
Oracle:Whenever you attack, spells you cast from exile this turn cost {X} less to cast, where X is the number of players being attacked. Exile the top X cards of your library. Until end of turn, you may cast spells from among those exiled cards.

View File

@@ -1,11 +1,9 @@
Name:Covetous Elegy
ManaCost:4 W B
Types:Sorcery
A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChooseSac | SubAbility$ DBSac | SpellDescription$ Each player chooses up to two creatures they control, then sacrifices the rest. Then you create a tapped Treasure token for each creature your opponents control.
SVar:DBChooseSac:DB$ ChooseCard | Defined$ Remembered | Choices$ Creature.RememberedPlayerCtrl | Amount$ 2 | ChoiceTitle$ Choose two creatures not to be sacrificed | RememberChosen$ True
SVar:DBSac:DB$ SacrificeAll | ValidCards$ Creature.IsNotRemembered | SubAbility$ DBToken
SVar:DBToken:DB$ Token | TokenScript$ c_a_treasure_sac | TokenAmount$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:SP$ ChooseCard | Defined$ Player | Choices$ Creature | ControlledByPlayer$ Chooser | MinAmount$ 0 | Amount$ 2 | ChoiceTitle$ Choose up to two creatures to keep | Reveal$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each player chooses up to two creatures they control, then sacrifices the rest. Then you create a tapped Treasure token for each creature your opponents control.
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.nonChosenCard | SubAbility$ DBToken
SVar:DBToken:DB$ Token | TokenScript$ c_a_treasure_sac | TokenAmount$ X
SVar:X:Count$Valid Creature.OppCtrl
AI:RemoveDeck:All
DeckHas:Ability$Token|Sacrifice & Type$Treasure

View File

@@ -1,9 +1,10 @@
Name:Crackling Doom
ManaCost:R W B
Types:Instant
A:SP$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 | SubAbility$ DBRepeat | AILogic$ OpponentHasCreatures | SpellDescription$ CARDNAME deals 2 damage to each opponent. Each opponent sacrifices a creature with the greatest power among creatures that player controls.
A:SP$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 | SubAbility$ DBRepeat | SpellDescription$ CARDNAME deals 2 damage to each opponent. Each opponent sacrifices a creature with the greatest power among creatures that player controls.
SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | RememberChosen$ True
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | RememberChosen$ True
SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ Each opponent sacrifices a creature with the greatest power among creatures they control.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:NeedsToPlay:Creature.OppCtrl
Oracle:Crackling Doom deals 2 damage to each opponent. Each opponent sacrifices a creature with the greatest power among creatures that player controls.

View File

@@ -3,6 +3,6 @@ ManaCost:2 U
Types:Instant
A:SP$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose up to one target creature each opponent controls | TargetMin$ 0 | TargetMax$ OneEach | TargetsForEachPlayer$ True | SubAbility$ DBRepeat | SpellDescription$ For each opponent, choose up to one target creature that player controls, then return that creature to its owner's hand unless its controller has you draw a card.
SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ Targeted | RepeatSubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Battlefield | Destination$ Hand | UnlessCost$ Draw<1/Player.YouActivator> | UnlessPayer$ RememberedController
SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Battlefield | Destination$ Hand | UnlessCost$ Draw<1/Player.Activator> | UnlessPayer$ RememberedController
SVar:OneEach:PlayerCountOpponents$Amount
Oracle:For each opponent, choose up to one target creature that player controls, then return that creature to its owner's hand unless its controller has you draw a card.

View File

@@ -6,7 +6,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E
A:AB$ Destroy | ValidTgts$ Land | TgtPrompt$ Select target land. | Cost$ T | SpellDescription$ Destroy target land.
SVar:DBTap:DB$ Tap | Defined$ Self | UnlessCost$ B B B | UnlessPayer$ You | UnlessResolveSubs$ WhenNotPaid | SubAbility$ DBChooseOpponent
SVar:DBChooseOpponent:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent | SubAbility$ DBChooseLand
SVar:DBChooseLand:DB$ ChooseCard | Defined$ ChosenPlayer | Choices$ Land.YouCtrl | Mandatory$ True | ChoiceTitle$ Select a land for opponent to sacrifice | SubAbility$ DBSacLand
SVar:DBChooseLand:DB$ ChooseCard | Defined$ ChosenPlayer | Choices$ Land.YouCtrl | Mandatory$ True | Reveal$ True | ChoiceTitle$ Select a land for opponent to sacrifice | SubAbility$ DBSacLand
SVar:DBSacLand:DB$ SacrificeAll | Defined$ ChosenCard
SVar:PlayMain1:FALSE
DeckHas:Ability$Sacrifice

View File

@@ -2,9 +2,9 @@ Name:Divine Reckoning
ManaCost:2 W W
Types:Sorcery
K:Flashback:5 W W
A:SP$ RepeatEach | AILogic$ OpponentHasMultipleCreatures | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose | SubAbility$ DBDestroyAll | SpellDescription$ Each player chooses a creature they control. Destroy the rest.
SVar:DBChoose:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True
SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Creature.IsNotRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:SP$ ChooseCard | Defined$ Player | Amount$ 1 | Choices$ Creature | ControlledByPlayer$ Chooser | Mandatory$ True | SubAbility$ DBDestroyAll | SpellDescription$ Each player chooses a creature they control. Destroy the rest.
SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Creature.!ChosenCard
AI:RemoveDeck:All
SVar:NeedsToPlayVar:Z GE2
SVar:Z:Count$Valid Creature.OppCtrl
Oracle:Each player chooses a creature they control. Destroy the rest.\nFlashback {5}{W}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.)

View File

@@ -1,7 +1,7 @@
Name:Doomsday
ManaCost:B B B
Types:Sorcery
A:SP$ ChangeZone | Origin$ Graveyard,Library | Destination$ Library | ChangeType$ Card | ChangeNum$ 5 | SubAbility$ DBChangeZone | RememberChanged$ True | Mandatory$ True | SpellDescription$ Search your library and graveyard for five cards and exile the rest. Put the chosen cards on top of your library in any order. You lose half your life, rounded up.
A:SP$ ChangeZone | Origin$ Graveyard,Library | Destination$ Library | ChangeType$ Card | ChangeNum$ 5 | Shuffle$ False | SubAbility$ DBChangeZone | RememberChanged$ True | Mandatory$ True | SpellDescription$ Search your library and graveyard for five cards and exile the rest. Put the chosen cards on top of your library in any order. You lose half your life, rounded up.
SVar:DBChangeZone:DB$ ChangeZoneAll | Defined$ You | Origin$ Graveyard,Library | Destination$ Exile | ChangeType$ Card.IsNotRemembered | SubAbility$ DBDig
SVar:DBDig:DB$ RearrangeTopOfLibrary | Defined$ You | NumCards$ X | SubAbility$ DBLoseLife
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ Y | SubAbility$ DBCleanup

View File

@@ -3,7 +3,7 @@ ManaCost:3 R G
Types:Legendary Artifact
T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigScry | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, scry 2, then you may reveal the top card of your library. If it's a creature card, put it onto the battlefield tapped and attacking. Until your next turn, it gains trample if you control a Dwarf and hexproof if you control an Elf.
SVar:TrigScry:DB$ Scry | ScryNum$ 2 | SubAbility$ DBDig
SVar:DBDig:DB$ Dig | DigNum$ 1 | ChangeNum$ All | Optional$ True | Reveal$ True | ChangeValid$ Creature | DestinationZone$ Battlefield | Tapped$ True | Attacking$ True | RememberChanged$ True | SubAbility$ DBPumpTrample
SVar:DBDig:DB$ Dig | DigNum$ 1 | ChangeNum$ All | RevealOptional$ True | RememberRevealed$ True | ChangeValid$ Creature.IsRemembered | DestinationZone$ Battlefield | Tapped$ True | Attacking$ True | SubAbility$ DBPumpTrample
SVar:DBPumpTrample:DB$ Pump | Defined$ Remembered | KW$ Trample | Duration$ UntilYourNextTurn | ConditionPresent$ Dwarf.YouCtrl | SubAbility$ DBPumpHexproof
SVar:DBPumpHexproof:DB$ Pump | Defined$ Remembered | KW$ Hexproof | Duration$ UntilYourNextTurn | ConditionPresent$ Elf.YouCtrl | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True

View File

@@ -4,7 +4,7 @@ Types:Creature Mouse Warrior
PT:2/2
K:Haste
K:Prowess
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | FirstTime$ True | Execute$ TrigExile | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, exile the top card of your library. Until end of turn, you may play that card.
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | Valiant$ True | Execute$ TrigExile | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, exile the top card of your library. Until end of turn, you may play that card.
SVar:TrigExile:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | SubAbility$ DBCleanup | ExileOnMoved$ Exile
SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card.

View File

@@ -5,6 +5,6 @@ PT:2/4
K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters, if a creature died this turn, create a 1/1 white Spirit creature token with flying.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_spirit_flying | TokenOwner$ You
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
DeckHas:Ability$Token
Oracle:Flying\nWhen Emissary of the Sleepless enters, if a creature died this turn, create a 1/1 white Spirit creature token with flying.

View File

@@ -3,7 +3,7 @@ ManaCost:2 B B
Types:Instant
S:Mode$ AlternativeCost | ValidSA$ Spell.Self | EffectZone$ All | Cost$ Sac<1/Creature.Black+nonToken/a nontoken black creature> | Description$ You may sacrifice a nontoken black creature rather than pay this spell's mana cost.
A:SP$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSacAll | SpellDescription$ Each opponent sacrifices a creature or planeswalker with the greatest mana value among creatures and planeswalkers they control.
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX,Planeswalker.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the greatest mana value among creatures and planeswalkers you control | Mandatory$ True | RememberChosen$ True
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX,Planeswalker.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the greatest mana value among creatures and planeswalkers you control | Mandatory$ True | Reveal$ True | RememberChosen$ True
SVar:X:Count$Valid Creature.RememberedPlayerCtrl,Planeswalker.RememberedPlayerCtrl$GreatestCMC
SVar:DBSacAll:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup
SVar:DBCleanupChosen:DB$ Cleanup | ClearChosenPlayer$ True

View File

@@ -3,6 +3,6 @@ ManaCost:W
Types:Creature Mouse Soldier
PT:1/2
K:Offspring:2
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | FirstTime$ True | Execute$ TrigPumpAll | TriggerDescription$ Valiant — Whenever this creature becomes the target of a spell or ability you control for the first time each turn, Mice you control get +1/+0 until end of turn.
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | Valiant$ True | Execute$ TrigPumpAll | TriggerDescription$ Valiant — Whenever this creature becomes the target of a spell or ability you control for the first time each turn, Mice you control get +1/+0 until end of turn.
SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Mouse.YouCtrl | NumAtt$ 1
Oracle:Offspring {2} (You may pay an additional {2} as you cast this spell. If you do, when this creature enters, create a 1/1 token copy of it.)\nValiant — Whenever this creature becomes the target of a spell or ability you control for the first time each turn, Mice you control get +1/+0 until end of turn.

View File

@@ -3,7 +3,7 @@ ManaCost:2 G
Types:Instant
A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target permanent card in your graveyard | ValidTgts$ Permanent.YouOwn | SubAbility$ DBToken | StackDescription$ SpellDescription | SpellDescription$ Return target permanent card from your graveyard to your hand. If a creature died this turn, create two 1/1 green Saproling creature tokens.
SVar:DBToken:DB$ Token | TokenAmount$ 2 | TokenScript$ g_1_1_saproling | TokenOwner$ You | ConditionCheckSVar$ Morbid | ConditionSVarCompare$ GE1
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
DeckHints:Type$Fungus
DeckHas:Ability$Token
Oracle:Return target permanent card from your graveyard to your hand. If a creature died this turn, create two 1/1 green Saproling creature tokens.

View File

@@ -5,6 +5,6 @@ PT:3/5
K:Reach
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigInvestigate | TriggerDescription$ Morbid — When CARDNAME enters, if a creature died this turn, investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.")
SVar:TrigInvestigate:DB$ Investigate
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
DeckHas:Ability$Investigate|Token
Oracle:Reach\nMorbid — When Funnel-Web Recluse enters, if a creature died this turn, investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.")

View File

@@ -8,7 +8,7 @@ SVar:DBPump:DB$ Pump | Defined$ ChosenCard | KW$ Lifelink
SVar:DBMurder:DB$ DestroyAll | ValidCards$ Creature.powerLE2 | SpellDescription$ Destroy each creature with power 2 or less.
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ChangeNum$ 2 | ChangeType$ Creature.YouOwn | SelectPrompt$ Select up to two creature cards from your graveyard to return to your hand | Hidden$ True | StackDescription$ {p:You} returns up to two creature cards from their graveyard to their hand. | SpellDescription$ Return up to two creature cards from your graveyard to your hand.
SVar:DBSacrifice:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac | SpellDescription$ Each opponent sacrifices a creature with the highest power among creatures they control.
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | RememberChosen$ True
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | RememberChosen$ True
SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ Each opponent sacrifices a creature with the greatest power among creatures they control.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Sacrifice|LifeGain|Counters & Keyword$Lifelink

View File

@@ -1,7 +1,8 @@
Name:Global Ruin
ManaCost:4 W
Types:Sorcery
A:SP$ ChooseCard | Defined$ Player | EachBasicType$ Controlled | SubAbility$ DBDestroy | SpellDescription$ Each player chooses from the lands they control a land of each basic land type, then sacrifices the rest. | StackDescription$ SpellDescription
A:SP$ ChooseCard | Defined$ Player | EachBasicType$ Controlled | Reveal$ True | SubAbility$ DBDestroy | SpellDescription$ Each player chooses from the lands they control a land of each basic land type, then sacrifices the rest. | StackDescription$ SpellDescription
SVar:DBDestroy:DB$ SacrificeAll | ValidCards$ Land.nonChosenCard | StackDescription$ None
AI:RemoveDeck:Random
DeckHas:Ability$Sacrifice
Oracle:Each player chooses from the lands they control a land of each basic land type, then sacrifices the rest.

View File

@@ -4,7 +4,7 @@ Types:Legendary Creature Insect
PT:1/2
K:Deathtouch
T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | ValidCard$ Card.Self,Creature.YouCtrl | Execute$ TrigTransform | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME or another creature you control enters, if it entered from your graveyard or you cast it from your graveyard, you may pay {G}. If you do, exile NICKNAME, then return it to the battlefield transformed under its owner's control.
T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self+wasCastFromYourGraveyardByYou,Creature.YouCtrl+wasCastFromYourGraveyardByYou | Execute$ TrigTransform | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ When CARDNAME enters, if it entered from your graveyard or you cast it from your graveyard, you may pay {G}. If you do, exile NICKNAME, then return it to the battlefield transformed under its owner's control.
T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self+wasCastFromYourGraveyardByYou,Creature.YouCtrl+wasCastFromYourGraveyardByYou | Execute$ TrigTransform | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ When CARDNAME or another creature you control enters, if it entered from your graveyard or you cast it from your graveyard, you may pay {G}. If you do, exile NICKNAME, then return it to the battlefield transformed under its owner's control.
SVar:TrigTransform:AB$ ChangeZone | Cost$ G | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | ForgetOtherRemembered$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
@@ -22,7 +22,7 @@ A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1
SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 2 | RememberMilled$ True | SubAbility$ DBPutCounter
SVar:DBPutCounter:DB$ PutCounter | Defined$ Imprinted | CounterType$ Deathtouch | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.Black | ConditionCompare$ EQ1 | SubAbility$ DBCleanup
A:AB$ Destroy | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment.
A:AB$ CopyPermanent | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ ValidGraveyard Creature.YouOwn | SetPower$ 1 | SetToughness$ 1 | SetColor$ Black & Green | SetCreatureTypes$ Insect | AILogic$ DuplicatePerms | SpellDescription$ For each creature card in your graveyard, create a token that's a copy of it, except it's a 1/1 black and green Insect.
A:AB$ CopyPermanent | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ ValidGraveyard Creature.YouOwn | SetPower$ 1 | SetToughness$ 1 | SetColor$ Black,Green | SetCreatureTypes$ Insect | AILogic$ DuplicatePerms | SpellDescription$ For each creature card in your graveyard, create a token that's a copy of it, except it's a 1/1 black and green Insect.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
DeckHas:Ability$Token|Mill
Oracle:[+1]: Create a 1/1 black and green Insect creature token, then mill two cards. Put a deathtouch counter on the token if a black card was milled this way.\n[-2]: Destroy target artifact or enchantment.\n[-6]: For each creature card in your graveyard, create a token that's a copy of it, except it's a 1/1 black and green Insect.

View File

@@ -3,5 +3,5 @@ ManaCost:2 B B
Types:Sorcery
A:SP$ Discard | ValidTgts$ Player | Mode$ TgtChoose | NumCards$ 2 | ConditionCheckSVar$ Morbid | ConditionSVarCompare$ EQ0 | SubAbility$ MorbidDiscard | SpellDescription$ Target player discards two cards.
SVar:MorbidDiscard:DB$ Discard | Defined$ Targeted | Mode$ RevealYouChoose | NumCards$ 2 | ConditionCheckSVar$ Morbid | ConditionSVarCompare$ GE1 | SpellDescription$ Morbid — If a creature died this turn, instead that player reveals their hand, you choose two cards from it, then that player discards those cards.
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
Oracle:Target player discards two cards.\nMorbid — If a creature died this turn, instead that player reveals their hand, you choose two cards from it, then that player discards those cards.

View File

@@ -2,7 +2,7 @@ Name:Heartfire Hero
ManaCost:R
Types:Creature Mouse Soldier
PT:1/1
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | FirstTime$ True | Execute$ TrigCounter | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, put a +1/+1 counter on it.
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | Valiant$ True | Execute$ TrigCounter | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, put a +1/+1 counter on it.
SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamageDies | TriggerDescription$ When CARDNAME dies, it deals damage equal to its power to each opponent.
SVar:TrigDamageDies:DB$ DealDamage | Defined$ Opponent | NumDmg$ X

View File

@@ -4,5 +4,5 @@ Types:Creature Elemental
PT:4/5
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigGainLife | TriggerDescription$ Morbid — When CARDNAME enters, if a creature died this turn, you gain 5 life.
SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 5
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
Oracle:Morbid — When Hollowhenge Scavenger enters, if a creature died this turn, you gain 5 life.

View File

@@ -3,7 +3,7 @@ ManaCost:1 U U
Types:Legendary Creature Human Wizard Advisor
PT:2/4
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigDig | TriggerDescription$ At the beginning of your end step, if you've cast a noncreature spell this turn, reveal the top five cards of your library. For each card type among noncreature spells you've cast this turn, you may put a card of that type from among the revealed cards into your hand. Put the rest on the bottom of your library in a random order.
SVar:TrigDig:DB$ Dig | DigNum$ 5 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBRepeatEach
SVar:TrigDig:DB$ PeekAndReveal | PeekAmount$ 5 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBRepeatEach
SVar:DBRepeatEach:DB$ RepeatEach | RepeatTypesFrom$ ThisTurnCast_Card.nonCreature+YouCtrl+sharesCardTypeWith Remembered | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZoneAll
SVar:ChooseCard:DB$ ChooseCard | Choices$ Card.IsRemembered+ChosenType | ImprintChosen$ True | ForgetChosen$ True | ChoiceTitle$ You may choose a card of this type to put into your hand | ChoiceTitleAppend$ ChosenType | ChoiceZone$ Library
SVar:DBChangeZoneAll:DB$ ChangeZone | Defined$ Imprinted | Origin$ Library | Destination$ Hand | SubAbility$ DBRestRandomOrder

View File

@@ -4,4 +4,5 @@ Types:Sorcery
A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Choose two target creatures controlled by the same player | TargetMin$ 2 | TargetMax$ 2 | TargetUnique$ True | TargetsWithSameController$ True | IsCurse$ True | SubAbility$ DBChooseSac | StackDescription$ SpellDescription | SpellDescription$ Choose two target creatures controlled by the same player. That player sacrifices one of them.
SVar:DBChooseSac:DB$ ChooseCard | DefinedCards$ Targeted | Defined$ TargetedController | ChoiceTitle$ Choose one to sacrifice | SubAbility$ DBSac | StackDescription$ None | AILogic$ WorstCard
SVar:DBSac:DB$ SacrificeAll | Defined$ ChosenCard | StackDescription$ None
DeckHas:Ability$Sacrifice
Oracle:Choose two target creatures controlled by the same player. That player sacrifices one of them.

View File

@@ -3,7 +3,7 @@ ManaCost:B R
Types:Battle Siege
Defense:4
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSacrifice | TriggerDescription$ When CARDNAME enters, target player sacrifices a creature or planeswalker and loses 1 life.
SVar:TrigSacrifice:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature,Planeswalker | SacMessage$ Creature or Planeswalker | SubAbility$ DBLoseLife
SVar:TrigSacrifice:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature,Planeswalker | SacMessage$ creature or planeswalker | SubAbility$ DBLoseLife
SVar:DBLoseLife:DB$ LoseLife | Defined$ TargetedPlayer | LifeAmount$ 1
DeckHas:Ability$Sacrifice|Counters
AlternateMode:DoubleFaced

View File

@@ -2,8 +2,9 @@ Name:Isolated Watchtower
ManaCost:no cost
Types:Land
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
A:AB$ Scry | Cost$ 2 T | ScryNum$ 1 | SubAbility$ DBReveal | CheckSVar$ X | SVarCompare$ GEY | SpellDescription$ Scry 1, then you may reveal the top card of your library. If a basic land card is revealed this way, put it onto the battlefield tapped. Activate only if an opponent controls at least two more lands than you.
SVar:DBReveal:DB$ Dig | Optional$ True | DigNum$ 1 | Reveal$ True | ChangeValid$ Land.Basic | DestinationZone$ Battlefield | Tapped$ True | DestinationZone2$ Library | LibraryPosition2$ 0
A:AB$ Scry | Cost$ 2 T | ScryNum$ 1 | SubAbility$ DBReveal | CheckSVar$ X | SVarCompare$ GEY | StackDescription$ REP Scry_{p:You} scries & you may_they may & your_their & put_{p:You} puts & . Activate only if an opponent controls at least two more lands than you._. | SpellDescription$ Scry 1, then you may reveal the top card of your library. If a basic land card is revealed this way, put it onto the battlefield tapped. Activate only if an opponent controls at least two more lands than you.
SVar:DBReveal:DB$ Dig | DigNum$ 1 | RevealOptional$ True | RememberRevealed$ True | ChangeValid$ Land.Basic+IsRemembered | ChangeNum$ All | DestinationZone$ Battlefield | Tapped$ True | DestinationZone2$ Library | LibraryPosition2$ 0 | SubAbility$ DBCleanup | StackDescription$ None
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:PlayerCountOpponents$HighestValid Land.YouCtrl
SVar:Y:Count$Valid Land.YouCtrl/Plus.2
Oracle:{T}: Add {C}.\n{2}, {T}: Scry 1, then you may reveal the top card of your library. If a basic land card is revealed this way, put it onto the battlefield tapped. Activate only if an opponent controls at least two more lands than you.

View File

@@ -3,8 +3,8 @@ ManaCost:3 R R
Types:Creature Human Soldier
PT:3/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChooseThree | TriggerDescription$ When CARDNAME enters, each player sacrifices all lands they control except for three.
SVar:TrigChooseThree:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose | SubAbility$ DBSacrificeAll
SVar:DBChoose:DB$ ChooseCard | Amount$ 3 | Defined$ Remembered | Choices$ Land.RememberedPlayerCtrl | ChoiceZone$ Battlefield | RememberChosen$ True | ChoiceTitle$ Choose three lands that would not be sacrificed
SVar:DBSacrificeAll:DB$ SacrificeAll | ValidCards$ Land.IsNotRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:TrigChooseThree:DB$ ChooseCard | Defined$ Player | Choices$ Land | ControlledByPlayer$ Chooser | Amount$ 3 | ChoiceTitle$ Choose three lands to keep | Mandatory$ True | Reveal$ True | SubAbility$ SacAllOthers
SVar:DBSacrificeAll:DB$ SacrificeAll | ValidCards$ Land.nonChosenCard | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHas:Ability$Sacrifice
Oracle:When Keldon Firebombers enters, each player sacrifices all lands they control except for three.

View File

@@ -11,4 +11,5 @@ SVar:X:Count$xPaid
SVar:Y:SVar$X/Times.Z
SVar:Z:Count$Valid Creature.RememberedPlayerCtrl+IsRemembered
AI:RemoveDeck:All
DeckHas:Ability$Sacrifice
Oracle:For each creature, its controller sacrifices it unless they pay X life.

View File

@@ -6,11 +6,9 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$
SVar:TrigDraw:DB$ Draw
A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenScript$ b_2_2_zombie | SpellDescription$ Create a 2/2 black Zombie creature token.
A:AB$ Sacrifice | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | Amount$ 2 | SacValid$ Creature | Defined$ Player | SpellDescription$ Each player sacrifices two creatures.
A:AB$ RepeatEach | Cost$ SubCounter<9/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatPlayers$ Opponent | RepeatSubAbility$ ChoosePerms | SubAbility$ SacAllOthers | SpellDescription$ Each opponent chooses a permanent they control of each permanent type and sacrifices the rest.
SVar:ChoosePerms:DB$ RepeatEach | RepeatTypesFrom$ Permanent.RememberedPlayerCtrl | ChooseOrder$ RememberedPlayer | RepeatSubAbility$ ChooseCard
SVar:ChooseCard:DB$ ChooseCard | Defined$ RememberedPlayer | Choices$ Card.ChosenType+RememberedPlayerCtrl | ChoiceTitle$ Choose a card of this type to keep | ChoiceTitleAppend$ ChosenType | RememberChosen$ True | Mandatory$ True
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.IsNotRemembered+OppCtrl | SubAbility$ DBCleanup | StackDescription$ None
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True
A:AB$ ChooseCard | Cost$ SubCounter<9/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ Opponent | Choices$ Permanent | ChooseEach$ Artifact & Battle & Creature & Enchantment & Land & Planeswalker | ControlledByPlayer$ Chooser | Mandatory$ True | Reveal$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each opponent chooses a permanent they control of each permanent type and sacrifices the rest.
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonChosenCard+OppCtrl | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHas:Ability$Token|Sacrifice & Type$Zombie
SVar:PlayMain1:TRUE
Oracle:Whenever a creature you control dies, draw a card.\n[+1]: Create a 2/2 black Zombie creature token.\n[-4]: Each player sacrifices two creatures.\n[-9]: Each opponent chooses a permanent they control of each permanent type and sacrifices the rest.

View File

@@ -1,13 +1,13 @@
Name:Limited Resources
ManaCost:W
Types:Enchantment
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ DBRepeatResources | TriggerDescription$ When CARDNAME enters, each player chooses five lands they control and sacrifices the rest.
SVar:DBRepeatResources:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ CardChoice
SVar:CardChoice:DB$ ChooseCard | Defined$ Remembered | Amount$ 5 | Choices$ Land.RememberedPlayerCtrl | ChoiceTitle$ Choose a land | RememberChosen$ True | SubAbility$ SacRest
SVar:SacRest:DB$ SacrificeAll | ValidCards$ Land.RememberedPlayerCtrl+IsNotRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ DBCardChoice | TriggerDescription$ When CARDNAME enters, each player chooses five lands they control and sacrifices the rest.
SVar:DBCardChoice:DB$ ChooseCard | Defined$ Player | Choices$ Land | ControlledByPlayer$ Chooser | Amount$ 5 | ChoiceTitle$ Choose five lands to keep | Mandatory$ True | Reveal$ True | SubAbility$ SacRest
SVar:SacRest:DB$ SacrificeAll | ValidCards$ Land.nonChosenCard | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
S:Mode$ CantPlayLand | IsPresent$ Land | PresentCompare$ GE10 | Description$ Players can't play lands as long as ten or more lands are on the battlefield.
SVar:NonStackingEffect:True
AI:RemoveDeck:All
AI:RemoveDeck:Random
DeckHas:Ability$Sacrifice
Oracle:When Limited Resources enters, each player chooses five lands they control and sacrifices the rest.\nPlayers can't play lands as long as ten or more lands are on the battlefield.

View File

@@ -4,5 +4,5 @@ Types:Instant
A:SP$ Destroy | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature.
T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | CheckSVar$ Morbid | SVarCompare$ GE1 | OptionalDecider$ You | TriggerDescription$ Morbid — When you cast this spell, if a creature died this turn, you may copy CARDNAME and may choose a new target for the copy.
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
Oracle:Morbid — When you cast this spell, if a creature died this turn, you may copy Malicious Affliction and may choose a new target for the copy.\nDestroy target nonblack creature.

View File

@@ -4,5 +4,5 @@ Types:Creature Spirit
PT:4/4
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigPump | TriggerDescription$ Morbid — When CARDNAME enters, if a creature died this turn, target creature gets -4/-4 until end of turn.
SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | NumAtt$ -4 | NumDef$ -4
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
Oracle:Morbid — When Morkrut Banshee enters, if a creature died this turn, target creature gets -4/-4 until end of turn.

View File

@@ -3,6 +3,6 @@ ManaCost:2 W
Types:Creature Mouse Soldier
PT:3/2
K:Flash
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | FirstTime$ True | Execute$ TrigTap | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, tap target creature an opponent controls.
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | Valiant$ True | Execute$ TrigTap | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, tap target creature an opponent controls.
SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls.
Oracle:Flash\nValiant — Whenever Mouse Trapper becomes the target of a spell or ability you control for the first time each turn, tap target creature an opponent controls.

View File

@@ -5,6 +5,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_spirit_flying | TokenOwner$ You
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ DBCopy | TriggerDescription$ Morbid — At the beginning of your end step, if a creature died this turn, populate. (Create a token that's a copy of a creature token you control.)
SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
DeckHas:Ability$Token & Type$Spirit
Oracle:When Muster the Departed enters, create a 1/1 white Spirit creature token with flying.\nMorbid — At the beginning of your end step, if a creature died this turn, populate. (Create a token that's a copy of a creature token you control.)

View File

@@ -6,7 +6,7 @@ SVar:OneOppSac:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | SubA
SVar:DBSac:DB$ Sacrifice | Defined$ ChosenPlayer | SacValid$ Creature | SubAbility$ DBCleanupChosen
SVar:EachOppSac:DB$ Sacrifice | Defined$ Player.Opponent | SacValid$ Creature | StackDescription$ SpellDescription | SpellDescription$ 10—19 VERT Each opponent sacrifices a creature.
SVar:SacTopPower:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSacAll | StackDescription$ SpellDescription | SpellDescription$ 20 VERT Each opponent sacrifices a creature with the greatest power among creatures that player controls.
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | RememberChosen$ True
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | RememberChosen$ True
SVar:DBSacAll:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup
SVar:DBCleanupChosen:DB$ Cleanup | ClearChosenPlayer$ True
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True

View File

@@ -2,7 +2,7 @@ Name:Nettle Guard
ManaCost:1 W
Types:Creature Mouse Soldier
PT:3/1
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | FirstTime$ True | Execute$ TrigPump | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, it gets +0/+2 until end of turn.
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | Valiant$ True | Execute$ TrigPump | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, it gets +0/+2 until end of turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumDef$ 2
A:AB$ Destroy | Cost$ 1 Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment.
Oracle:Valiant — Whenever Nettle Guard becomes the target of a spell or ability you control for the first time each turn, it gets +0/+2 until end of turn.\n{1}, Sacrifice Nettle Guard: Destroy target artifact or enchantment.

View File

@@ -2,8 +2,7 @@ Name:No One Will Hear Your Cries
ManaCost:no cost
Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each opponent chooses a creature they control, then sacrifices the rest.
SVar:TrigChoose:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ ChooseCreature | SubAbility$ DBSacrificeAll
SVar:ChooseCreature:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | ChoiceTitle$ Choose a creature | Mandatory$ True
SVar:TrigChoose:DB$ ChooseCard | Defined$ Opponent | Choices$ Creature | ControlledByPlayer$ Chooser | ChoiceTitle$ Choose a creature to keep | Mandatory$ True | Reveal$ True | SubAbility$ DBSacrificeAll
SVar:DBSacrificeAll:DB$ SacrificeAll | ValidCards$ Creature.nonChosenCard+OppCtrl | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
Oracle:When you set this scheme in motion, each opponent chooses a creature they control, then sacrifices the rest.

View File

@@ -5,7 +5,7 @@ PT:3/4
K:Flying
T:Mode$ Phase | Phase$ End of Turn | CheckSVar$ Morbid | SVarCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigFood | TriggerDescription$ At the beginning of each end step, if a creature died this turn, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")
SVar:TrigFood:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
A:AB$ Pump | Cost$ 2 B Sac<1/Creature.Other;Artifact/another creature or artifact> | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn.
DeckHas:Ability$Token|Sacrifice & Type$Food|Artifact
DeckHints:Ability$Sacrifice

View File

@@ -5,8 +5,8 @@ T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefiel
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ INFLUENCE | CounterNum$ 1 | SubAbility$ DBScry
SVar:DBScry:DB$ Scry | ScryNum$ 2 | SubAbility$ DBChoice
SVar:DBChoice:DB$ GenericChoice | ValidTgts$ Opponent | Choices$ CombustDraw,CombustDamage | AILogic$ CombustibleGearhulk
SVar:CombustDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SpellDescription$ Controller draws a card
SVar:CombustDamage:DB$ Mill | Defined$ You | NumCards$ X | RememberMilled$ True | SubAbility$ DamageOpponent | SpellDescription$ Controller mills X cards, where X is the number of influence counters on CARDNAME, and that player loses life equal to the total mana value of those cards.
SVar:CombustDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SpellDescription$ CARDNAME's controller draws a card.
SVar:CombustDamage:DB$ Mill | Defined$ You | NumCards$ X | RememberMilled$ True | SubAbility$ DamageOpponent | SpellDescription$ CARDNAME's controller mills X cards, where X is the number of influence counters on it, and you lose life equal to the total mana value of those cards.
SVar:DamageOpponent:DB$ LoseLife | Defined$ ParentTarget | LifeAmount$ Y | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$CardCounters.INFLUENCE

View File

@@ -1,13 +1,10 @@
Name:Perilous Predicament
ManaCost:4 B
Types:Instant
A:SP$ RepeatEach | AILogic$ OpponentHasMultipleCreatures | RepeatPlayers$ Opponent | RepeatSubAbility$ DBChoose | SubAbility$ DBSacAll | SpellDescription$ Each opponent sacrifices an artifact creature and a nonartifact creature.
SVar:DBChoose:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.Artifact+RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | ChoiceTitle$ Choose target artifact creature | AILogic$ WorstCard | SubAbility$ DBChoose2
SVar:DBChoose2:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.nonArtifact+IsNotRemembered+RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | ChoiceTitle$ Choose target nonartifact creature | AILogic$ WorstCard
SVar:DBSacAll:DB$ SacrificeAll | ValidCards$ Permanent.IsRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:SP$ Sacrifice | Defined$ Opponent | SacValid$ Creature.Artifact & Creature.nonArtifact | AILogic$ WorstCard | Mandatory$ True | SacEachValid$ True | SpellDescription$ Each opponent sacrifices an artifact creature and a nonartifact creature.
SVar:NeedsToPlayVar:Z GE2
SVar:Z:SVar$Z1/Plus.Z2
SVar:Z1:Count$Valid Creature.nonArtifact+OppCtrl/LimitMax.1
SVar:Z2:Count$Valid Creature.Artifact+OppCtrl/LimitMax.1
DeckHas:Ability$Sacrifice
Oracle:Each opponent sacrifices an artifact creature and a nonartifact creature.

View File

@@ -4,7 +4,7 @@ Types:Artifact Creature Phyrexian Dreadnought
PT:12/12
K:Trample
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ChooseCreatures | TriggerDescription$ When CARDNAME enters, sacrifice it unless you sacrifice any number of creatures with total power 12 or greater.
SVar:ChooseCreatures:DB$ ChooseCard | Defined$ You | Amount$ X | MinAmount$ 0 | Choices$ Creature.YouCtrl | ChoiceTitle$ Sacrifice any number of creatures with total power 12 or greater. | ChoiceZone$ Battlefield | RememberChosen$ True | SubAbility$ SacrificeSelf
SVar:ChooseCreatures:DB$ ChooseCard | Defined$ You | Amount$ X | MinAmount$ 0 | Choices$ Creature.YouCtrl | ChoiceTitle$ Sacrifice any number of creatures with total power 12 or greater. | ChoiceZone$ Battlefield | Reveal$ True | RememberChosen$ True | SubAbility$ SacrificeSelf
SVar:SacrificeSelf:DB$ Sacrifice | ConditionCheckSVar$ TotalPower | ConditionSVarCompare$ LT12 | SubAbility$ SacrificeCreatures
SVar:SacrificeCreatures:DB$ SacrificeAll | Defined$ Remembered | ConditionCheckSVar$ TotalPower | ConditionSVarCompare$ GE12 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
@@ -13,4 +13,5 @@ SVar:X:Count$Valid Creature.YouCtrl
AI:RemoveDeck:Random
SVar:NeedsToPlayVar:Y GE12
SVar:Y:Count$SumPower_Creature.YouCtrl+notnamedPhyrexian Dreadnought
DeckHas:Ability$Sacrifice
Oracle:Trample\nWhen Phyrexian Dreadnought enters, sacrifice it unless you sacrifice any number of creatures with total power 12 or greater.

View File

@@ -1,7 +1,7 @@
Name:Phyrexian Portal
ManaCost:3
Types:Artifact
A:AB$ Dig | Cost$ 3 | ValidTgts$ Opponent | Defined$ You | DigNum$ 10 | RememberRevealed$ True | NoLooking$ True | NoMove$ True | Choser$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | SubAbility$ DBTwoPiles | SpellDescription$ If your library has ten or more cards in it, target opponent looks at the top ten cards of your library and separates them into two face-down piles. Exile one of those piles. Search the other pile for a card, put it into your hand, then shuffle the rest of that pile into your library. | StackDescription$ SpellDescription
A:AB$ PeekAndReveal | Cost$ 3 | ValidTgts$ Opponent | Defined$ You | PeekAmount$ 10 | RememberPeeked$ True | NoPeek$ True | NoReveal$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | SubAbility$ DBTwoPiles | SpellDescription$ If your library has ten or more cards in it, target opponent looks at the top ten cards of your library and separates them into two face-down piles. Exile one of those piles. Search the other pile for a card, put it into your hand, then shuffle the rest of that pile into your library. | StackDescription$ SpellDescription
SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Targeted | FaceDown$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | ChosenPile$ DBHand | UnchosenPile$ DBExile
SVar:DBHand:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | ChooseFromDefined$ Remembered | Mandatory$ True | Shuffle$ True
SVar:DBExile:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Exile

View File

@@ -8,7 +8,7 @@ SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2
A:AB$ LoseLife | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | LifeAmount$ 1 | SubAbility$ DBDig | SpellDescription$ You lose 1 life. Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard.
SVar:DBDig:DB$ Dig | DigNum$ 3 | ChangeNum$ 1 | NoReveal$ True | DestinationZone2$ Graveyard | StackDescription$ {p:You} looks at the top three cards of their library. {p:You} puts one of them into their hand and the rest into their graveyard.
A:AB$ RepeatEach | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | RepeatPlayers$ Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac | SpellDescription$ Each opponent sacrifices a creature with the greatest power among creatures that player controls.
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | RememberChosen$ True
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | RememberChosen$ True
SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ Each opponent sacrifices a creature with the greatest power among creatures they control.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True
A:AB$ Repeat | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatSubAbility$ TrigDiscard | MaxRepeat$ 7 | StackDescription$ SpellDescription | SpellDescription$ Each opponent may discard a card. If they don't, they lose 3 life. Repeat this process six more times.

View File

@@ -1,9 +1,8 @@
Name:Quest for Ula's Temple
ManaCost:U
Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigDig | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may look at the top card of your library. If it's a creature card, you may reveal it and put a quest counter on Quest for CARDNAME.
SVar:TrigDig:DB$ Dig | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | SubAbility$ TrigDig2
SVar:TrigDig2:DB$ Dig | DigNum$ 1 | ChangeNum$ All | RevealValid$ Creature | ChangeValid$ Creature | Optional$ True | PromptToSkipOptionalAbility$ True | OptionalAbilityPrompt$ Would you like to reveal the creature and put a quest counter on CARDNAME? | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | RememberChanged$ True | AILogic$ AlwaysConfirm | SubAbility$ DBPutCounter
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPeek | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may look at the top card of your library. If it's a creature card, you may reveal it and put a quest counter on Quest for CARDNAME.
SVar:TrigPeek:DB$ PeekAndReveal | RevealValid$ Creature | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBPutCounter
SVar:DBPutCounter:DB$ PutCounter | CounterType$ QUEST | CounterNum$ 1 | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE3_QUEST | PresentCompare$ EQ1 | TriggerDescription$ At the beginning of each end step, if there are three or more quest counters on CARDNAME, you may put a Kraken, Leviathan, Octopus, or Serpent creature card from your hand onto the battlefield.
SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.Kraken,Creature.Leviathan,Creature.Octopus,Creature.Serpent | ChangeNum$ 1 | Hidden$ True

View File

@@ -11,8 +11,7 @@ Name:Riches
ManaCost:5 U U
Types:Sorcery
K:Aftermath
A:SP$ RepeatEach | AILogic$ OpponentHasCreatures | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ ChooseCreature | SubAbility$ StealChosen | SpellDescription$ Each opponent chooses a creature they control. You gain control of those creatures.
SVar:ChooseCreature:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | ChoiceTitle$ Choose a creature to be stolen | AILogic$ WorstCard | RememberChosen$ True | Mandatory$ True
SVar:StealChosen:DB$ GainControl | AllValid$ Permanent.IsRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:SP$ ChooseCard | Defined$ Opponent | Mandatory$ True | Amount$ 1 | Choices$ Creature | ControlledByPlayer$ Chooser | ChoiceTitle$ Choose a creature to be stolen | AILogic$ WorstCard | Mandatory$ True | SubAbility$ StealChosen | SpellDescription$ Each opponent chooses a creature they control. You gain control of those creatures.
SVar:StealChosen:DB$ GainControl | AllValid$ Permanent.ChosenCard
SVar:NeedsToPlay:Creature.OppCtrl
Oracle:Aftermath (Cast this spell only from your graveyard. Then exile it.)\nEach opponent chooses a creature they control. You gain control of those creatures.

View File

@@ -1,9 +1,8 @@
Name:Razia's Purification
ManaCost:4 R W
Types:Sorcery
A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChooseSac | SubAbility$ DBSac | SpellDescription$ Each player chooses three permanents they control, then sacrifices the rest.
SVar:DBChooseSac:DB$ ChooseCard | Defined$ Remembered | Choices$ Permanent.RememberedPlayerCtrl | Amount$ 3 | ChoiceTitle$ Choose three cards not to be sacrificed | RememberChosen$ True | Mandatory$ True
SVar:DBSac:DB$ SacrificeAll | ValidCards$ Permanent.IsNotRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:SP$ ChooseCard | Defined$ Player | Choices$ Permanent | ControlledByPlayer$ Chooser | Amount$ 3 | ChoiceTitle$ Choose three permanents to keep | Mandatory$ True | Reveal$ True | SubAbility$ DBSac | StackDescription$ SpellDescription | SpellDescription$ Each player chooses three permanents they control, then sacrifices the rest.
SVar:DBSac:DB$ SacrificeAll | ValidCards$ Permanent.nonChosenCard
DeckHas:Ability$Sacrifice
AI:RemoveDeck:All
Oracle:Each player chooses three permanents they control, then sacrifices the rest.

View File

@@ -5,5 +5,5 @@ PT:6/6
K:Flying
T:Mode$ Phase | Phase$ End of Turn | CheckSVar$ Morbid | SVarCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Morbid — At the beginning of each end step, if a creature died this turn, destroy target non-demon creature.
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.nonDemon | TgtPrompt$ Select target non-Demon creature
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
Oracle:Flying\nMorbid — At the beginning of each end step, if a creature died this turn, destroy target non-Demon creature.

View File

@@ -2,17 +2,11 @@ Name:Regna's Sanction
ManaCost:3 W
Types:Sorcery
A:SP$ AssignGroup | Defined$ Player | Choices$ FriendRepeat,FoeRepeat | AILogic$ FriendOrFoe | SpellDescription$ For each player, choose friend or foe. Each friend puts a +1/+1 counter on each creature they control. Each foe chooses one untapped creature they control, then taps the rest.
SVar:FriendRepeat:DB$ RepeatEach | RepeatPlayers$ Remembered | RepeatSubAbility$ DBPutCounter | ClearRememberedBeforeLoop$ True | StackDescription$ Each friend puts a +1/+1 counter on each creature they control. | SpellDescription$ Friend puts a +1/+1 counter on each creature they control.
SVar:DBPutCounter:DB$ PutCounterAll | ValidCards$ Creature.RememberedPlayerCtrl | CounterType$ P1P1 | CounterNum$ 1 | Placer$ Remembered
SVar:FoeRepeat:DB$ RepeatEach | AILogic$ OpponentHasMultipleCreatures | RepeatPlayers$ Remembered | ClearRememberedBeforeLoop$ True | RepeatSubAbility$ DBChoose | SubAbility$ DBTapAll | StackDescription$ Each foe chooses one untapped creature they control, then taps the rest. | SpellDescription$ Foe chooses one untapped creature they control, then taps the rest.
SVar:DBChoose:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.untapped+RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | SubAbility$ DBImprint
# Need to imprint all non remembered cards
SVar:DBImprint:DB$ Pump | ImprintCards$ Valid Creature.IsNotRemembered+RememberedPlayerCtrl | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True
SVar:DBTapAll:DB$ TapAll | ValidCards$ Creature.IsImprinted | TapperController$ True | SubAbility$ DBCleanupAll
SVar:DBCleanupAll:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | ClearChosenCard$ True
SVar:FriendRepeat:DB$ PutCounterAll | ValidCards$ Creature.RememberedPlayerCtrl | CounterType$ P1P1 | CounterNum$ 1 | Placer$ Controller | SpellDescription$ Each friend puts a +1/+1 counter on each creature they control.
SVar:FoeRepeat:DB$ ChooseCard | Defined$ Remembered | Choices$ Creature.untapped | ControlledByPlayer$ Chooser | Amount$ 1 | ChoiceTitle$ Choose one creature to keep untapped | Mandatory$ True | Reveal$ True | SubAbility$ DBTapAll | SpellDescription$ Each foe chooses one untapped creature they control, then taps the rest.
SVar:DBTapAll:DB$ TapAll | ValidCards$ Creature.nonChosenCard+RememberedPlayerCtrl | TapperController$ True
SVar:NeedsToPlayVar:Z GE3
SVar:Z:SVar$Z1/Plus.Z2
SVar:Z1:Count$Valid Creature.YourTeamCtrl+inZoneBattlefield
SVar:Z2:Count$Valid Creature.OppCtrl+inZoneBattlefield+untapped
SVar:Z1:Count$Valid Creature.YourTeamCtrl
SVar:Z2:Count$Valid Creature.OppCtrl+untapped
Oracle:For each player, choose friend or foe. Each friend puts a +1/+1 counter on each creature they control. Each foe chooses one untapped creature they control, then taps the rest.

View File

@@ -12,5 +12,5 @@ Name:Development
ManaCost:3 U R
Types:Instant
A:SP$ Repeat | RepeatSubAbility$ DBToken | MaxRepeat$ 3 | StackDescription$ SpellDescription | SpellDescription$ Create a 3/1 red Elemental creature token unless any opponent has you draw a card. Repeat this process two more times.
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_3_1_elemental | TokenOwner$ You | UnlessPayer$ Player.Opponent | UnlessCost$ Draw<1/Player.YouActivator> | UnlessAI$ MorePowerful
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_3_1_elemental | TokenOwner$ You | UnlessPayer$ Player.Opponent | UnlessCost$ Draw<1/Player.Activator> | UnlessAI$ MorePowerful
Oracle:Create a 3/1 red Elemental creature token unless any opponent has you draw a card. Repeat this process two more times.

View File

@@ -1,11 +1,10 @@
Name:Revival Experiment
ManaCost:4 B G
Types:Sorcery
A:SP$ RepeatEach | RepeatTypesFrom$ Permanent.YouOwn | TypesFromZone$ Graveyard | RepeatSubAbility$ ChooseCard | SubAbility$ DBReturn | SpellDescription$ For each permanent type, return up to one card of that type from your graveyard to the battlefield.
SVar:ChooseCard:DB$ ChooseCard | Choices$ Card.ChosenType+YouOwn | ChoiceZone$ Graveyard | ChoiceTitle$ Choose up to one card of this type to return | ChoiceTitleAppend$ ChosenType | RememberChosen$ True
SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Remembered | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ DBLoseLife
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | SubAbility$ DBChange | StackDescription$ SpellDescription | SubAbility$ DBExile | SpellDescription$ You lose 3 life for each card returned this way.
SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBCleanup | SpellDescription$ Exile CARDNAME.
A:SP$ ChooseCard | Defined$ You | Choices$ Card.Permanent+YouOwn | ChoiceZone$ Graveyard | ChooseEach$ Artifact & Battle & Creature & Enchantment & Land & Planeswalker | ControlledByPlayer$ Chooser | MinAmount$ 0 | Amount$ 1 | Reveal$ True | RememberChosen$ True | SubAbility$ DBReturn | StackDescription$ REP return_{p:You} returns & from your_from their & You lose_{p:You} loses & Exile_{p:You} exiles | SpellDescription$ For each permanent type, return up to one card of that type from your graveyard to the battlefield. You lose 3 life for each card returned this way. Exile CARDNAME.
SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Remembered | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ DBLoseLife | StackDescription$ None
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | SubAbility$ DBChange | SubAbility$ DBExile | StackDescription$ None
SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBCleanup | StackDescription$ None
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True
SVar:X:Remembered$Amount/Times.3
DeckHas:Ability$Graveyard

View File

@@ -4,7 +4,7 @@ Types:Creature Zombie Rogue
PT:4/3
T:Mode$ ChangesZone | Origin$ Any | CheckSVar$ Morbid | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters, if a creature died this turn, create a 2/2 blue and black Zombie Rogue creature token.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ ub_2_2_zombie_rogue | TokenOwner$ You
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
DeckHas:Ability$Token & Type$Zombie|Rogue & Color$Blue
K:Plot:2 B
Oracle:When Rictus Robber enters, if a creature died this turn, create a 2/2 blue and black Zombie Rogue creature token.\nPlot {2}{B} (You may pay {2}{B} and exile this card from your hand. Cast it as a sorcery on a later turn without paying its mana cost. Plot only as a sorcery.)

View File

@@ -5,4 +5,5 @@ A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Choose two target creatures contro
SVar:DBChooseSac:DB$ ChooseCard | Choices$ Card.IsRemembered | Defined$ TargetedController | ChoiceTitle$ Choose one to sacrifice | SubAbility$ DBSac | StackDescription$ None | AILogic$ WorstCard
SVar:DBSac:DB$ SacrificeAll | Defined$ ChosenCard | SubAbility$ DBCleanup | StackDescription$ None
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Sacrifice
Oracle:Choose two target creatures controlled by the same player. That player sacrifices one of them.

View File

@@ -5,6 +5,6 @@ PT:3/3
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, if a creature died this turn, put a +1/+1 counter on CARDNAME and untap it.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBUntap
SVar:DBUntap:DB$ Untap | Defined$ Self
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
DeckHas:Ability$Counters
Oracle:At the beginning of your end step, if a creature died this turn, put a +1/+1 counter on Sabertooth Mauler and untap it.

View File

@@ -2,7 +2,7 @@ Name:Saw in Half
ManaCost:2 B
Types:Instant
A:SP$ Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBCopy | RememberLKI$ True | SpellDescription$ Destroy target creature.
SVar:DBCopy:DB$ CopyPermanent | Defined$ Remembered | NumCopies$ 2 | Controller$ TargetedController | SetPower$ dX | SetToughness$ dY | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ If that creature dies this way, its controller creates two tokens that are copies of that creature, except their base power is half that creature's power and their base toughness is half that creature's toughness. Round up each time.
SVar:DBCopy:DB$ CopyPermanent | Defined$ RememberedLKI | NumCopies$ 2 | Controller$ TargetedController | SetPower$ dX | SetToughness$ dY | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ If that creature dies this way, its controller creates two tokens that are copies of that creature, except their base power is half that creature's power and their base toughness is half that creature's toughness. Round up each time.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Remembered$Amount
SVar:dX:RememberedLKI$CardPower/HalfUp

View File

@@ -4,7 +4,7 @@ Types:Creature Mouse Soldier
PT:3/2
K:Vigilance
K:Haste
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | FirstTime$ True | Execute$ TrigCounter | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, put a +1/+1 counter on it.
T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ SpellAbility.YouCtrl | TriggerZones$ Battlefield | Valiant$ True | Execute$ TrigCounter | TriggerDescription$ Valiant — Whenever CARDNAME becomes the target of a spell or ability you control for the first time each turn, put a +1/+1 counter on it.
SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
DeckHas:Ability$Counters
Oracle:Vigilance, haste\nValiant — Whenever Seedglaive Mentor becomes the target of a spell or ability you control for the first time each turn, put a +1/+1 counter on it.

View File

@@ -4,7 +4,7 @@ Types:Creature Demon
PT:8/4
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRepeat | TriggerDescription$ When CARDNAME enters, each opponent sacrifices a creature with the greatest power among creatures they control. You gain life equal to the greatest power among creatures sacrificed this way.
SVar:TrigRepeat:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | ImprintChosen$ True | AILogic$ WorstCard
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | ImprintChosen$ True | AILogic$ WorstCard
SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsImprinted | RememberSacrificed$ True | SubAbility$ DBLifeGain
SVar:DBLifeGain:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | ClearChosenCard$ True

View File

@@ -1,11 +1,10 @@
Name:Single Combat
ManaCost:3 W W
Types:Sorcery
A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose | SubAbility$ SacAllOthers | SpellDescription$ Each player chooses a creature or planeswalker they control, then sacrifices the rest. Players can't cast creature or planeswalker spells until the end of your next turn.
SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature,Planeswalker | TargetControls$ True | Mandatory$ True | RememberChosen$ True
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.IsNotRemembered,Planeswalker.IsNotRemembered | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | StaticAbilities$ STCantBeCast | Duration$ UntilTheEndOfYourNextTurn | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True
A:SP$ ChooseCard | Defined$ Player | Choices$ Creature,Planeswalker | ControlledByPlayer$ Chooser | ChoiceTitle$ Choose a creature or planeswalker to keep | Mandatory$ True | Reveal$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each player chooses a creature or planeswalker they control, then sacrifices the rest. Players can't cast creature or planeswalker spells until the end of your next turn.
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.nonChosenCard,Planeswalker.nonChosenCard | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | StaticAbilities$ STCantBeCast | Duration$ UntilTheEndOfYourNextTurn
SVar:STCantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Creature,Planeswalker | Description$ Players can't cast creature or planeswalker spells.
AI:RemoveDeck:All
DeckHas:Ability$Sacrifice
Oracle:Each player chooses a creature or planeswalker they control, then sacrifices the rest. Players can't cast creature or planeswalker spells until the end of your next turn.

View File

@@ -3,5 +3,5 @@ ManaCost:1 B
Types:Creature Human Cleric
PT:1/2
A:AB$ Token | Cost$ T tapXType<2/Creature> | CheckSVar$ Morbid | SVarCompare$ GE1 | TokenAmount$ 1 | TokenScript$ b_5_5_demon_flying | TokenOwner$ You | CostDesc$ Morbid — {T}, Tap two untapped creatures you control: | SpellDescription$ Create a 5/5 black Demon creature token with flying. Activate only if a creature died this turn.
SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature
SVar:Morbid:Count$Morbid.1.0
Oracle:Morbid — {T}, Tap two untapped creatures you control: Create a 5/5 black Demon creature token with flying. Activate only if a creature died this turn.

View File

@@ -2,8 +2,9 @@ Name:Slaughter the Strong
ManaCost:1 W W
Types:Sorcery
A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ ChooseCrtr | SubAbility$ SacAllOthers | SpellDescription$ Each player chooses any number of creatures they control with total power 4 or less, then sacrifices all other creatures they control.
SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl | WithTotalPower$ 4 | RememberChosen$ True | AILogic$ NegativePowerFirst
SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl | WithTotalPower$ 4 | Reveal$ True | RememberChosen$ True | AILogic$ NegativePowerFirst
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.IsNotRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All
DeckHas:Ability$Sacrifice
Oracle:Each player chooses any number of creatures they control with total power 4 or less, then sacrifices all other creatures they control.

View File

@@ -2,7 +2,7 @@ Name:Soul Shatter
ManaCost:2 B
Types:Instant
A:SP$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChoose | SubAbility$ DBSac | StackDescription$ Each opponent | SpellDescription$ Each opponent sacrifices a creature or planeswalker with the highest mana value among creatures and planeswalkers they control.
SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX,Planeswalker.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the highest mana value to sacrifice | Mandatory$ True | RememberChosen$ True
SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX,Planeswalker.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the highest mana value to sacrifice | Mandatory$ True | Reveal$ True | RememberChosen$ True
SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ sacrifices a creature or planeswalker with the highest mana value among creatures and planeswalkers they control.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$Valid Creature.RememberedPlayerCtrl,Planeswalker.RememberedPlayerCtrl$GreatestCMC

View File

@@ -1,7 +1,7 @@
Name:Stick Together
ManaCost:3 W W
Types:Sorcery
A:SP$ ChooseCard | Defined$ Player | ChooseEach$ Party | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each player chooses a party from among creatures they control,
A:SP$ ChooseCard | Defined$ Player | Choices$ Creature | ChooseEach$ Party | Reveal$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each player chooses a party from among creatures they control,
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.nonChosenCard | StackDescription$ then sacrifices the rest. | SpellDescription$ then sacrifices the rest. (To choose a party, choose up to one each of Cleric, Rogue, Warrior, and Wizard.)
DeckHas:Ability$Sacrifice
DeckHints:Ability$Party

View File

@@ -3,7 +3,7 @@ ManaCost:4 B
Types:Instant
A:SP$ Charm | MinCharmNum$ 1 | CharmNum$ Count$Compare Y GE1.2.1 | Choices$ DBOppSac,DBExile | AdditionalDescription$ . If you control a commander as you cast this spell, you may choose both.
SVar:DBOppSac:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBSac | SpellDescription$ Each opponent sacrifices a creature they control with the greatest power.
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | RememberChosen$ True
SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | ChoiceTitle$ Choose a creature you control with the greatest power | Mandatory$ True | Reveal$ True | RememberChosen$ True
SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ None
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True
SVar:DBExile:DB$ ChangeZoneAll | ChangeType$ Card.OppCtrl | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True | SubAbility$ DBToken | SpellDescription$ Exile all cards from all opponents' graveyards, then create X 0/1 black Thrull creature tokens, where X is the greatest power among creature cards exiled this way.

Some files were not shown because too many files have changed in this diff Show More