Compare commits

..

2 Commits

Author SHA1 Message Date
GitHub Actions
a29da54b2e [maven-release-plugin] prepare release forge-2.0.02 2025-02-15 20:50:03 +00:00
Chris H
ec63b230c8 Temporarily remove flatten library for release 2025-02-15 12:34:35 -05:00
152 changed files with 336 additions and 949 deletions

View File

@@ -8,9 +8,6 @@ on:
description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)'
required: false required: false
default: false default: false
schedule:
# * is a special character in YAML so you have to quote this string
- cron: '00 18 * * *'
jobs: jobs:
build: build:
@@ -112,13 +109,16 @@ jobs:
env: env:
GITHUB_TOKEN: ${{ github.token }} GITHUB_TOKEN: ${{ github.token }}
- name: Upload snapshot to GitHub Prerelease - name: 📂 Sync files
uses: ncipollo/release-action@v1 uses: SamKirkland/FTP-Deploy-Action@v4.3.4
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with: with:
name: Daily Snapshot server: ftp.cardforge.org
tag: daily-snapshots username: ${{ secrets.FTP_USERNAME }}
prerelease: true password: ${{ secrets.FTP_PASSWORD }}
artifacts: izpack/* local-dir: izpack/
allowUpdates: true server-dir: downloads/dailysnapshots/
state-name: .ftp-deploy-both-sync-state.json
exclude: |
*.pom
*.repositories
*.xml

View File

@@ -3,7 +3,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>${revision}</version> <version>2.0.02</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@@ -6,7 +6,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>${revision}</version> <version>2.0.02</version>
</parent> </parent>
<artifactId>forge-ai</artifactId> <artifactId>forge-ai</artifactId>

View File

@@ -1099,11 +1099,6 @@ public class ComputerUtil {
} }
} }
// if AI has no speed, play start your engines on Main1
if (ai.noSpeed() && cardState.hasKeyword(Keyword.START_YOUR_ENGINES)) {
return true;
}
// cast Blitz in main 1 if the creature attacks // cast Blitz in main 1 if the creature attacks
if (sa.isBlitz() && ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, card)) { if (sa.isBlitz() && ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, card)) {
return true; return true;

View File

@@ -6,7 +6,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>${revision}</version> <version>2.0.02</version>
</parent> </parent>
<artifactId>forge-core</artifactId> <artifactId>forge-core</artifactId>

View File

@@ -6,7 +6,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>${revision}</version> <version>2.0.02</version>
</parent> </parent>
<artifactId>forge-game</artifactId> <artifactId>forge-game</artifactId>

View File

@@ -707,7 +707,7 @@ public class GameAction {
// needed for ETB lookahead like Bronzehide Lion // needed for ETB lookahead like Bronzehide Lion
stAb.putParam("AffectedZone", "All"); stAb.putParam("AffectedZone", "All");
SpellAbilityEffect.addForgetOnMovedTrigger(eff, "Battlefield"); SpellAbilityEffect.addForgetOnMovedTrigger(eff, "Battlefield");
eff.getOwner().getZone(ZoneType.Command).add(eff); game.getAction().moveToCommand(eff, cause);
} }
eff.addRemembered(copied); eff.addRemembered(copied);
@@ -724,6 +724,7 @@ public class GameAction {
} }
} }
private void storeChangesZoneAll(Card c, Zone zoneFrom, Zone zoneTo, Map<AbilityKey, Object> params) { private void storeChangesZoneAll(Card c, Zone zoneFrom, Zone zoneTo, Map<AbilityKey, Object> params) {
if (params != null && params.containsKey(AbilityKey.InternalTriggerTable)) { if (params != null && params.containsKey(AbilityKey.InternalTriggerTable)) {
((CardZoneTable) params.get(AbilityKey.InternalTriggerTable)).put(zoneFrom != null ? zoneFrom.getZoneType() : null, zoneTo.getZoneType(), c); ((CardZoneTable) params.get(AbilityKey.InternalTriggerTable)).put(zoneFrom != null ? zoneFrom.getZoneType() : null, zoneTo.getZoneType(), c);
@@ -933,10 +934,6 @@ public class GameAction {
final PlayerZone removed = c.getOwner().getZone(ZoneType.Exile); final PlayerZone removed = c.getOwner().getZone(ZoneType.Exile);
final Card copied = moveTo(removed, c, cause, params); final Card copied = moveTo(removed, c, cause, params);
if (c.isImmutable()) {
return copied;
}
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(c); final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(c);
runParams.put(AbilityKey.Cause, cause); runParams.put(AbilityKey.Cause, cause);
if (origin != null) { // is generally null when adding via dev mode if (origin != null) { // is generally null when adding via dev mode
@@ -1112,10 +1109,6 @@ public class GameAction {
// search for cards with static abilities // search for cards with static abilities
final FCollection<StaticAbility> staticAbilities = new FCollection<>(); final FCollection<StaticAbility> staticAbilities = new FCollection<>();
final CardCollection staticList = new CardCollection(); final CardCollection staticList = new CardCollection();
Table<StaticAbility, StaticAbility, Set<StaticAbilityLayer>> dependencies = null;
if (preList.isEmpty()) {
dependencies = HashBasedTable.create();
}
game.forEachCardInGame(new Visitor<Card>() { game.forEachCardInGame(new Visitor<Card>() {
@Override @Override
@@ -1123,7 +1116,7 @@ public class GameAction {
// need to get Card from preList if able // need to get Card from preList if able
final Card co = preList.get(c); final Card co = preList.get(c);
for (StaticAbility stAb : co.getStaticAbilities()) { for (StaticAbility stAb : co.getStaticAbilities()) {
if (stAb.checkMode("Continuous") && stAb.zonesCheck()) { if (stAb.checkMode("Continuous")) {
staticAbilities.add(stAb); staticAbilities.add(stAb);
} }
} }
@@ -1150,7 +1143,7 @@ public class GameAction {
StaticAbility stAb = staticsForLayer.get(0); StaticAbility stAb = staticsForLayer.get(0);
// dependency with CDA seems unlikely // dependency with CDA seems unlikely
if (!stAb.isCharacteristicDefining()) { if (!stAb.isCharacteristicDefining()) {
stAb = findStaticAbilityToApply(layer, staticsForLayer, preList, affectedPerAbility, dependencies); stAb = findStaticAbilityToApply(layer, staticsForLayer, preList, affectedPerAbility);
} }
staticsForLayer.remove(stAb); staticsForLayer.remove(stAb);
final CardCollectionView previouslyAffected = affectedPerAbility.get(stAb); final CardCollectionView previouslyAffected = affectedPerAbility.get(stAb);
@@ -1170,7 +1163,7 @@ public class GameAction {
if (affectedHere != null) { if (affectedHere != null) {
for (final Card c : affectedHere) { for (final Card c : affectedHere) {
for (final StaticAbility st2 : c.getStaticAbilities()) { for (final StaticAbility st2 : c.getStaticAbilities()) {
if (!staticAbilities.contains(st2) && st2.checkMode("Continuous") && st2.zonesCheck()) { if (!staticAbilities.contains(st2)) {
toAdd.add(st2); toAdd.add(st2);
st2.applyContinuousAbilityBefore(layer, preList); st2.applyContinuousAbilityBefore(layer, preList);
} }
@@ -1237,8 +1230,6 @@ public class GameAction {
game.getTriggerHandler().runTrigger(TriggerType.Always, runParams, false); game.getTriggerHandler().runTrigger(TriggerType.Always, runParams, false);
game.getTriggerHandler().runTrigger(TriggerType.Immediate, runParams, false); game.getTriggerHandler().runTrigger(TriggerType.Immediate, runParams, false);
game.getView().setDependencies(dependencies);
} }
// Update P/T and type in the view only once after all the cards have been processed, to avoid flickering // Update P/T and type in the view only once after all the cards have been processed, to avoid flickering
@@ -1257,8 +1248,7 @@ public class GameAction {
game.getTracker().unfreeze(); game.getTracker().unfreeze();
} }
private StaticAbility findStaticAbilityToApply(StaticAbilityLayer layer, List<StaticAbility> staticsForLayer, CardCollectionView preList, Map<StaticAbility, CardCollectionView> affectedPerAbility, private StaticAbility findStaticAbilityToApply(StaticAbilityLayer layer, List<StaticAbility> staticsForLayer, CardCollectionView preList, Map<StaticAbility, CardCollectionView> affectedPerAbility) {
Table<StaticAbility, StaticAbility, Set<StaticAbilityLayer>> dependencies) {
if (staticsForLayer.size() == 1) { if (staticsForLayer.size() == 1) {
return staticsForLayer.get(0); return staticsForLayer.get(0);
} }
@@ -1305,24 +1295,21 @@ public class GameAction {
// ...what it applies to... // ...what it applies to...
if (!dependency && compareAffected) { if (!dependency && compareAffected) {
CardCollectionView affectedAfterOther = StaticAbilityContinuous.getAffectedCards(stAb, preList); CardCollectionView affectedAfterOther = StaticAbilityContinuous.getAffectedCards(stAb, preList);
dependency = !Iterators.elementsEqual(affectedHere.iterator(), affectedAfterOther.iterator()); if (!Iterators.elementsEqual(affectedHere.iterator(), affectedAfterOther.iterator())) {
dependency = true;
}
} }
// ...or what it does to any of the things it applies to // ...or what it does to any of the things it applies to
if (!dependency) { if (!dependency) {
List<Object> effectResultsAfterOther = generateStaticAbilityResult(layer, stAb); List<Object> effectResultsAfterOther = generateStaticAbilityResult(layer, stAb);
dependency = !effectResults.equals(effectResultsAfterOther); if (!effectResults.equals(effectResultsAfterOther)) {
dependency = true;
}
} }
if (dependency) { if (dependency) {
dependencyGraph.addVertex(otherStAb); dependencyGraph.addVertex(otherStAb);
dependencyGraph.addEdge(stAb, otherStAb); dependencyGraph.addEdge(stAb, otherStAb);
if (dependencies != null) {
if (dependencies.contains(stAb, otherStAb)) {
dependencies.get(stAb, otherStAb).add(layer);
} else {
dependencies.put(stAb, otherStAb, EnumSet.of(layer));
}
}
} }
// undo changes and check next pair // undo changes and check next pair
@@ -1844,10 +1831,19 @@ public class GameAction {
public void checkGameOverCondition() { public void checkGameOverCondition() {
// award loses as SBE // award loses as SBE
GameEndReason reason = null;
List<Player> losers = null; List<Player> losers = null;
FCollectionView<Player> allPlayers = game.getPlayers();
FCollectionView<Player> allPlayers = game.getPlayers();
for (Player p : allPlayers) {
if (p.checkLoseCondition()) { // this will set appropriate outcomes
if (losers == null) {
losers = Lists.newArrayListWithCapacity(3);
}
losers.add(p);
}
}
GameEndReason reason = null;
// Has anyone won by spelleffect? // Has anyone won by spelleffect?
for (Player p : allPlayers) { for (Player p : allPlayers) {
if (!p.hasWon()) { if (!p.hasWon()) {
@@ -1873,17 +1869,24 @@ public class GameAction {
break; break;
} }
if (reason == null) { // loop through all the non-losing players that can't win
// see if all of their opponents are in that "about to lose" collection
if (losers != null) {
for (Player p : allPlayers) { for (Player p : allPlayers) {
if (p.checkLoseCondition()) { // this will set appropriate outcomes if (losers.contains(p)) {
if (losers == null) { continue;
losers = Lists.newArrayListWithCapacity(3);
}
losers.add(p);
} }
if (p.cantWin()) {
if (losers.containsAll(p.getOpponents())) {
// what to do here?!?!?!
System.err.println(p.toString() + " is about to win, but can't!");
}
}
} }
} }
// need a separate loop here, otherwise ConcurrentModificationException is raised
if (losers != null) { if (losers != null) {
for (Player p : losers) { for (Player p : losers) {
game.onPlayerLost(p); game.onPlayerLost(p);

View File

@@ -23,12 +23,15 @@ package forge.game;
public enum GameEndReason { public enum GameEndReason {
/** The All opponents lost. */ /** The All opponents lost. */
AllOpponentsLost, AllOpponentsLost,
// Noone won
/** The Draw. */
Draw, // Having little idea how they can reach a draw, so I didn't enumerate
// possible reasons here
// Special conditions, they force one player to win and thus end the game
/** Noone won */ /** The Wins game spell effect. */
Draw, WinsGameSpellEffect, // ones that could be both hardcoded (felidar) and
// scripted ( such as Mayael's Aria )
/** Special conditions, they force one player to win and thus end the game */
WinsGameSpellEffect,
/** Used to end multiplayer games where the all humans have lost or conceded while AIs cannot end match by themselves.*/ /** Used to end multiplayer games where the all humans have lost or conceded while AIs cannot end match by themselves.*/
AllHumansLost, AllHumansLost,

View File

@@ -304,7 +304,8 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
@Override @Override
public GameLogEntry visit(GameEventCardForetold ev) { public GameLogEntry visit(GameEventCardForetold ev) {
return new GameLogEntry(GameLogEntryType.STACK_RESOLVE, ev.toString()); String sb = TextUtil.concatWithSpace(ev.activatingPlayer.toString(), "has foretold.");
return new GameLogEntry(GameLogEntryType.STACK_RESOLVE, sb);
} }
@Override @Override
@@ -312,11 +313,6 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
return new GameLogEntry(GameLogEntryType.STACK_RESOLVE, ev.toString()); return new GameLogEntry(GameLogEntryType.STACK_RESOLVE, ev.toString());
} }
@Override
public GameLogEntry visit(GameEventDoorChanged ev) {
return new GameLogEntry(GameLogEntryType.STACK_RESOLVE, ev.toString());
}
@Subscribe @Subscribe
public void recieve(GameEvent ev) { public void recieve(GameEvent ev) {
GameLogEntry le = ev.visit(this); GameLogEntry le = ev.visit(this);

View File

@@ -1,12 +1,8 @@
package forge.game; package forge.game;
import java.util.List; import java.util.List;
import java.util.Set;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Table;
import com.google.common.collect.Table.Cell;
import forge.LobbyPlayer; import forge.LobbyPlayer;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.GameOutcome.AnteResult; import forge.game.GameOutcome.AnteResult;
@@ -20,8 +16,6 @@ import forge.game.phase.PhaseType;
import forge.game.player.PlayerView; import forge.game.player.PlayerView;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.game.spellability.StackItemView; import forge.game.spellability.StackItemView;
import forge.game.staticability.StaticAbility;
import forge.game.staticability.StaticAbilityLayer;
import forge.game.zone.MagicStack; import forge.game.zone.MagicStack;
import forge.trackable.TrackableCollection; import forge.trackable.TrackableCollection;
import forge.trackable.TrackableObject; import forge.trackable.TrackableObject;
@@ -206,36 +200,15 @@ public class GameView extends TrackableObject {
public TrackableCollection<CardView> getRevealedCollection() { public TrackableCollection<CardView> getRevealedCollection() {
return get(TrackableProperty.RevealedCardsCollection); return get(TrackableProperty.RevealedCardsCollection);
} }
public void updateRevealedCards(TrackableCollection<CardView> collection) { public void updateRevealedCards(TrackableCollection<CardView> collection) {
set(TrackableProperty.RevealedCardsCollection, collection); set(TrackableProperty.RevealedCardsCollection, collection);
} }
public String getDependencies() {
return get(TrackableProperty.Dependencies);
}
public void setDependencies(Table<StaticAbility, StaticAbility, Set<StaticAbilityLayer>> dependencies) {
if (dependencies.isEmpty()) {
return;
}
StringBuilder sb = new StringBuilder();
StaticAbilityLayer layer = null;
for (StaticAbilityLayer sal : StaticAbilityLayer.CONTINUOUS_LAYERS_WITH_DEPENDENCY) {
for (Cell<StaticAbility, StaticAbility, Set<StaticAbilityLayer>> dep : dependencies.cellSet()) {
if (dep.getValue().contains(sal)) {
if (layer != sal) {
layer = sal;
sb.append("Layer " + layer.num).append(": ");
}
sb.append(dep.getColumnKey().getHostCard().toString()).append(" <- ").append(dep.getRowKey().getHostCard().toString()).append("\n");
}
}
}
set(TrackableProperty.Dependencies, sb.toString());
}
public CombatView getCombat() { public CombatView getCombat() {
return get(TrackableProperty.CombatView); return get(TrackableProperty.CombatView);
} }
public void updateCombatView(CombatView combatView) { public void updateCombatView(CombatView combatView) {
set(TrackableProperty.CombatView, combatView); set(TrackableProperty.CombatView, combatView);
} }

View File

@@ -206,6 +206,7 @@ public class StaticEffect {
if (layers.contains(StaticAbilityLayer.ABILITIES)) { if (layers.contains(StaticAbilityLayer.ABILITIES)) {
p.removeChangedKeywords(getTimestamp(), ability.getId()); p.removeChangedKeywords(getTimestamp(), ability.getId());
} }
} }
// modify the affected card // modify the affected card

View File

@@ -538,8 +538,6 @@ public class AbilityUtils {
val = handlePaid(card.getEmerged(), calcX[1], card, ability); val = handlePaid(card.getEmerged(), calcX[1], card, ability);
} else if (calcX[0].startsWith("Crewed")) { } else if (calcX[0].startsWith("Crewed")) {
val = handlePaid(card.getCrewedByThisTurn(), calcX[1], card, ability); val = handlePaid(card.getCrewedByThisTurn(), calcX[1], card, ability);
} else if (calcX[0].startsWith("ChosenCard")) {
val = handlePaid(card.getChosenCards(), calcX[1], card, ability);
} else if (calcX[0].startsWith("Remembered")) { } else if (calcX[0].startsWith("Remembered")) {
// Add whole Remembered list to handlePaid // Add whole Remembered list to handlePaid
final CardCollection list = new CardCollection(); final CardCollection list = new CardCollection();

View File

@@ -8,13 +8,13 @@ import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect; import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardCollection; import forge.game.card.CardCollection;
import forge.game.event.GameEventCardPlotted;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.util.Lang; import forge.util.Lang;
import forge.util.TextUtil; import forge.util.TextUtil;
public class AlterAttributeEffect extends SpellAbilityEffect { public class AlterAttributeEffect extends SpellAbilityEffect {
@Override @Override
public void resolve(SpellAbility sa) { public void resolve(SpellAbility sa) {
@@ -48,8 +48,6 @@ public class AlterAttributeEffect extends SpellAbilityEffect {
switch (attr.trim()) { switch (attr.trim()) {
case "Plotted": case "Plotted":
altered = gameCard.setPlotted(activate); altered = gameCard.setPlotted(activate);
c.getGame().fireEvent(new GameEventCardPlotted(c, sa.getActivatingPlayer()));
break; break;
case "Solve": case "Solve":
case "Solved": case "Solved":

View File

@@ -121,7 +121,6 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect {
if (perpetual) { if (perpetual) {
Map <String, Object> params = new HashMap<>(); Map <String, Object> params = new HashMap<>();
params.put("AddKeywords", keywords); params.put("AddKeywords", keywords);
params.put("RemoveKeywords", removeKeywords);
params.put("RemoveAll", removeAll); params.put("RemoveAll", removeAll);
params.put("Timestamp", timestamp); params.put("Timestamp", timestamp);
params.put("Category", "Keywords"); params.put("Category", "Keywords");

View File

@@ -1,5 +1,6 @@
package forge.game.ability.effects; package forge.game.ability.effects;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;

View File

@@ -425,6 +425,9 @@ public class DigEffect extends SpellAbilityEffect {
if (sa.hasParam("Imprint")) { if (sa.hasParam("Imprint")) {
host.addImprintedCard(c); host.addImprintedCard(c);
} }
if (sa.hasParam("ForgetOtherRemembered")) {
host.clearRemembered();
}
if (remZone1) { if (remZone1) {
host.addRemembered(c); host.addRemembered(c);
} }

View File

@@ -166,6 +166,14 @@ public class DiscardEffect extends SpellAbilityEffect {
toBeDiscarded = GameActionUtil.orderCardsByTheirOwners(game, toBeDiscarded, ZoneType.Graveyard, sa); toBeDiscarded = GameActionUtil.orderCardsByTheirOwners(game, toBeDiscarded, ZoneType.Graveyard, sa);
} }
if (mode.equals("NotRemembered")) {
if (!p.canDiscardBy(sa, true)) {
continue;
}
toBeDiscarded = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), "Card.IsNotRemembered", p, source, sa);
toBeDiscarded = GameActionUtil.orderCardsByTheirOwners(game, toBeDiscarded, ZoneType.Graveyard, sa);
}
int numCards = 1; int numCards = 1;
if (sa.hasParam("NumCards")) { if (sa.hasParam("NumCards")) {
numCards = AbilityUtils.calculateAmount(source, sa.getParam("NumCards"), sa); numCards = AbilityUtils.calculateAmount(source, sa.getParam("NumCards"), sa);

View File

@@ -1,5 +1,6 @@
package forge.game.ability.effects; package forge.game.ability.effects;
import forge.game.ability.SpellAbilityEffect; import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.player.Player; import forge.game.player.Player;
@@ -17,9 +18,6 @@ public class GameWinEffect extends SpellAbilityEffect {
for (final Player p : getTargetPlayers(sa)) { for (final Player p : getTargetPlayers(sa)) {
p.altWinBySpellEffect(card.getName()); p.altWinBySpellEffect(card.getName());
} }
// CR 104.1. A game ends immediately when a player wins
card.getGame().getAction().checkGameOverCondition();
} }
} }

View File

@@ -51,13 +51,6 @@ public class ManaEffect extends SpellAbilityEffect {
continue; continue;
} }
final Player chooser;
if (sa.hasParam("Chooser")) {
chooser = AbilityUtils.getDefinedPlayers(card, sa.getParam("Chooser"), sa).get(0);
} else {
chooser = p;
}
if (abMana.isComboMana()) { if (abMana.isComboMana()) {
int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(card, sa.getParam("Amount"), sa) : 1; int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(card, sa.getParam("Amount"), sa) : 1;
if(amount <= 0) if(amount <= 0)
@@ -74,7 +67,7 @@ public class ManaEffect extends SpellAbilityEffect {
ColorSet fullOptions = colorOptions; ColorSet fullOptions = colorOptions;
// Use specifyManaCombo if possible // Use specifyManaCombo if possible
if (colorsNeeded == null && amount > 1 && !sa.hasParam("TwoEach")) { if (colorsNeeded == null && amount > 1 && !sa.hasParam("TwoEach")) {
Map<Byte, Integer> choices = chooser.getController().specifyManaCombo(sa, colorOptions, amount, differentChoice); Map<Byte, Integer> choices = p.getController().specifyManaCombo(sa, colorOptions, amount, differentChoice);
for (Map.Entry<Byte, Integer> e : choices.entrySet()) { for (Map.Entry<Byte, Integer> e : choices.entrySet()) {
Byte chosenColor = e.getKey(); Byte chosenColor = e.getKey();
String choice = MagicColor.toShortString(chosenColor); String choice = MagicColor.toShortString(chosenColor);
@@ -101,7 +94,7 @@ public class ManaEffect extends SpellAbilityEffect {
// just use the first possible color. // just use the first possible color.
choice = colorsProduced[differentChoice ? nMana : 0]; choice = colorsProduced[differentChoice ? nMana : 0];
} else { } else {
byte chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, byte chosenColor = p.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa,
differentChoice && (colorsNeeded == null || colorsNeeded.length <= nMana) ? fullOptions : colorOptions); differentChoice && (colorsNeeded == null || colorsNeeded.length <= nMana) ? fullOptions : colorOptions);
if (chosenColor == 0) if (chosenColor == 0)
throw new RuntimeException("ManaEffect::resolve() /*combo mana*/ - " + p + " color mana choice is empty for " + card.getName()); throw new RuntimeException("ManaEffect::resolve() /*combo mana*/ - " + p + " color mana choice is empty for " + card.getName());
@@ -144,7 +137,7 @@ public class ManaEffect extends SpellAbilityEffect {
mask |= MagicColor.fromName(colorsNeeded.charAt(nChar)); mask |= MagicColor.fromName(colorsNeeded.charAt(nChar));
} }
colorMenu = mask == 0 ? ColorSet.ALL_COLORS : ColorSet.fromMask(mask); colorMenu = mask == 0 ? ColorSet.ALL_COLORS : ColorSet.fromMask(mask);
byte val = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu); byte val = p.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (0 == val) { if (0 == val) {
throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + p + " color mana choice is empty for " + card.getName()); throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + p + " color mana choice is empty for " + card.getName());
} }
@@ -169,7 +162,7 @@ public class ManaEffect extends SpellAbilityEffect {
if (cs.isColorless()) if (cs.isColorless())
continue; continue;
if (s.isOr2Generic()) { // CR 106.8 if (s.isOr2Generic()) { // CR 106.8
chosenColor = chooser.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), card, cs); chosenColor = p.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), card, cs);
if (chosenColor == MagicColor.COLORLESS) { if (chosenColor == MagicColor.COLORLESS) {
generic += 2; generic += 2;
continue; continue;
@@ -178,7 +171,7 @@ public class ManaEffect extends SpellAbilityEffect {
else if (cs.isMonoColor()) else if (cs.isMonoColor())
chosenColor = s.getColorMask(); chosenColor = s.getColorMask();
else /* (cs.isMulticolor()) */ { else /* (cs.isMulticolor()) */ {
chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs); chosenColor = p.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
} }
sb.append(MagicColor.toShortString(chosenColor)); sb.append(MagicColor.toShortString(chosenColor));
sb.append(' '); sb.append(' ');
@@ -226,7 +219,7 @@ public class ManaEffect extends SpellAbilityEffect {
if (cs.isMonoColor()) if (cs.isMonoColor())
sb.append(MagicColor.toShortString(s.getColorMask())); sb.append(MagicColor.toShortString(s.getColorMask()));
else /* (cs.isMulticolor()) */ { else /* (cs.isMulticolor()) */ {
byte chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs); byte chosenColor = p.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
sb.append(MagicColor.toShortString(chosenColor)); sb.append(MagicColor.toShortString(chosenColor));
} }
} }

View File

@@ -4799,8 +4799,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
p.get("Timestamp"), (long) 0); p.get("Timestamp"), (long) 0);
} else if (category.equals("Keywords")) { } else if (category.equals("Keywords")) {
boolean removeAll = p.containsKey("RemoveAll") && (boolean) p.get("RemoveAll") == true; boolean removeAll = p.containsKey("RemoveAll") && (boolean) p.get("RemoveAll") == true;
addChangedCardKeywords((List<String>) p.get("AddKeywords"), (List<String>) p.get("RemoveKeywords"), addChangedCardKeywords((List<String>) p.get("AddKeywords"), Lists.newArrayList(), removeAll,
removeAll, (long) p.get("Timestamp"), null); (long) p.get("Timestamp"), null);
} else if (category.equals("Types")) { } else if (category.equals("Types")) {
addChangedCardTypes((CardType) p.get("AddTypes"), (CardType) p.get("RemoveTypes"), addChangedCardTypes((CardType) p.get("AddTypes"), (CardType) p.get("RemoveTypes"),
false, (Set<RemoveType>) p.get("RemoveXTypes"), false, (Set<RemoveType>) p.get("RemoveXTypes"),
@@ -7007,8 +7007,15 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
} }
public boolean isInZones(final List<ZoneType> zones) { public boolean isInZones(final List<ZoneType> zones) {
boolean inZones = false;
Zone z = this.getLastKnownZone(); Zone z = this.getLastKnownZone();
return z != null && zones.contains(z.getZoneType()); for (ZoneType okZone : zones) {
if (z.is(okZone)) {
inZones = true;
break;
}
}
return z != null && inZones;
} }
public boolean canBeDiscardedBy(SpellAbility sa, final boolean effect) { public boolean canBeDiscardedBy(SpellAbility sa, final boolean effect) {
@@ -8174,8 +8181,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
updateRooms(); updateRooms();
getGame().fireEvent(new GameEventDoorChanged(p, this, stateName, true));
Map<AbilityKey, Object> unlockParams = AbilityKey.mapFromPlayer(p); Map<AbilityKey, Object> unlockParams = AbilityKey.mapFromPlayer(p);
unlockParams.put(AbilityKey.Card, this); unlockParams.put(AbilityKey.Card, this);
unlockParams.put(AbilityKey.CardState, getState(stateName)); unlockParams.put(AbilityKey.CardState, getState(stateName));
@@ -8200,8 +8205,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
updateRooms(); updateRooms();
getGame().fireEvent(new GameEventDoorChanged(p, this, stateName, false));
return true; return true;
} }

View File

@@ -651,14 +651,12 @@ public class CardProperty {
return false; return false;
} }
} else if (property.startsWith("TopLibrary") || property.startsWith("BottomLibrary")) { } else if (property.startsWith("TopLibrary") || property.startsWith("BottomLibrary")) {
CardCollectionView cards = card.getOwner().getCardsIn(ZoneType.Library); CardCollection cards = (CardCollection) card.getOwner().getCardsIn(ZoneType.Library);
if (!property.equals("TopLibrary")) { if (!property.equals("TopLibrary")) {
if (property.contains("_")) cards = CardLists.getValidCards(cards, property.split("_")[1], if (property.equals("TopLibraryLand")) cards = CardLists.filter(cards, CardPredicates.LANDS);
else if (property.contains("_")) cards = CardLists.getValidCards(cards, property.split("_")[1],
sourceController, source, spellAbility); sourceController, source, spellAbility);
if (property.startsWith("Bottom")) { if (property.startsWith("Bottom")) Collections.reverse(cards);
cards = new CardCollection(cards);
Collections.reverse((CardCollection) cards);
}
} }
if (cards.isEmpty() || !card.equals(cards.get(0))) return false; if (cards.isEmpty() || !card.equals(cards.get(0))) return false;
} else if (property.startsWith("Cloned")) { } else if (property.startsWith("Cloned")) {

View File

@@ -19,6 +19,6 @@ public class GameEventCardForetold extends GameEvent {
*/ */
@Override @Override
public String toString() { public String toString() {
return activatingPlayer.getName() + " has foretold."; return activatingPlayer.getName() + " has foretold a card.";
} }
} }

View File

@@ -1,39 +0,0 @@
package forge.game.event;
import forge.card.CardStateName;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.util.CardTranslation;
import forge.util.Lang;
public class GameEventDoorChanged extends GameEvent {
public final Player activatingPlayer;
public final Card card;
public final CardStateName state;
public boolean unlock;
public GameEventDoorChanged(Player player, Card c, CardStateName state, boolean unlock) {
activatingPlayer = player;
card = c;
this.state = state;
this.unlock = unlock;
}
@Override
public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this);
}
@Override
public String toString() {
String doorName = CardTranslation.getTranslatedName(card.getState(state));
StringBuilder sb = new StringBuilder();
sb.append(activatingPlayer);
sb.append(" ");
sb.append(unlock ? "unlocks" : "locks");
sb.append(" ");
sb.append(Lang.getInstance().getPossessedObject(doorName, "Door"));
return sb.toString();
}
}

View File

@@ -60,7 +60,6 @@ public interface IGameEventVisitor<T> {
T visit(GameEventCardForetold event); T visit(GameEventCardForetold event);
T visit(GameEventCardPlotted event); T visit(GameEventCardPlotted event);
T visit(GameEventDayTimeChanged event); T visit(GameEventDayTimeChanged event);
T visit(GameEventDoorChanged event);
// This is base class for all visitors. // This is base class for all visitors.
class Base<T> implements IGameEventVisitor<T>{ class Base<T> implements IGameEventVisitor<T>{
@@ -119,6 +118,5 @@ public interface IGameEventVisitor<T> {
public T visit(GameEventCardForetold event) { return null; } public T visit(GameEventCardForetold event) { return null; }
public T visit(GameEventCardPlotted event) { return null; } public T visit(GameEventCardPlotted event) { return null; }
public T visit(GameEventDayTimeChanged event) { return null; } public T visit(GameEventDayTimeChanged event) { return null; }
public T visit(GameEventDoorChanged event) { return null; }
} }
} }

View File

@@ -2040,12 +2040,14 @@ public class Player extends GameEntity implements Comparable<Player> {
public final boolean loseConditionMet(final GameLossReason state, final String spellName) { public final boolean loseConditionMet(final GameLossReason state, final String spellName) {
if (state != GameLossReason.OpponentWon) { if (state != GameLossReason.OpponentWon) {
// Replacement effects
Map<AbilityKey, Object> repParams = AbilityKey.mapFromAffected(this); Map<AbilityKey, Object> repParams = AbilityKey.mapFromAffected(this);
repParams.put(AbilityKey.LoseReason, state); repParams.put(AbilityKey.LoseReason, state);
if (game.getReplacementHandler().run(ReplacementType.GameLoss, repParams) != ReplacementResult.NotReplaced) { if (game.getReplacementHandler().run(ReplacementType.GameLoss, repParams) != ReplacementResult.NotReplaced) {
return false; return false;
} }
} }
//final String spellName = sa != null ? sa.getHostCard().getName() : null;
setOutcome(PlayerOutcome.loss(state, spellName)); setOutcome(PlayerOutcome.loss(state, spellName));
return true; return true;
} }

View File

@@ -293,7 +293,7 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone
if (!checkMode("CantAttackUnless") && (!checkMode("OptionalAttackCost") || !attackersWithOptionalCost.contains(attacker))) { if (!checkMode("CantAttackUnless") && (!checkMode("OptionalAttackCost") || !attackersWithOptionalCost.contains(attacker))) {
return null; return null;
} }
if (!checkConditions()) { if (!this.checkConditions()) {
return null; return null;
} }
return StaticAbilityCantAttackBlock.getAttackCost(this, attacker, target); return StaticAbilityCantAttackBlock.getAttackCost(this, attacker, target);
@@ -321,26 +321,6 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone
return checkMode(mode) && checkConditions(); return checkMode(mode) && checkConditions();
} }
public final boolean zonesCheck() {
if (isSuppressed()) {
return false;
}
if (getHostCard().isPhasedOut()) {
return false;
}
if (!isCharacteristicDefining()) {
if (this.validHostZones != null) {
Zone zone = getHostCard().getGame().getZoneOf(getHostCard());
if (zone == null || !this.validHostZones.contains(zone.getZoneType())) {
return false;
}
} else if (!getHostCard().isInPlay()) { // default
return false;
}
}
return true;
}
/** /**
* Check conditions. * Check conditions.
* *
@@ -351,9 +331,23 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone
final Game game = getHostCard().getGame(); final Game game = getHostCard().getGame();
final PhaseHandler ph = game.getPhaseHandler(); final PhaseHandler ph = game.getPhaseHandler();
if (!zonesCheck()) { if (isSuppressed()) {
return false; return false;
} }
if (getHostCard().isPhasedOut()) {
return false;
}
if (!isCharacteristicDefining()) {
if (this.validHostZones != null) {
Zone zone = game.getZoneOf(getHostCard());
if (zone == null || !this.validHostZones.contains(zone.getZoneType())) {
return false;
}
} else if (!getHostCard().isInPlay()) { // default
return false;
}
}
String condition = getParam("Condition"); String condition = getParam("Condition");
if (null != condition) { if (null != condition) {

View File

@@ -21,7 +21,7 @@ public class StaticAbilityDevotion {
continue; continue;
} }
int t = Integer.parseInt(stAb.getParamOrDefault("Value", "1")); int t = Integer.parseInt(stAb.getParamOrDefault("Value", "1"));
i += t; i = i + t;
} }
} }
return i; return i;

View File

@@ -3,44 +3,35 @@ package forge.game.staticability;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
public enum StaticAbilityLayer { public enum StaticAbilityLayer {
/** Layer 1 for copiable values. */ /** Layer 1 for control-changing effects. */
COPY("1"), COPY,
/** Layer 2 for control-changing effects. */ /** Layer 2 for control-changing effects. */
CONTROL("2"), CONTROL,
/** Layer 3 for text-changing effects. */ /** Layer 3 for text-changing effects. */
TEXT("3"), TEXT,
/** Layer 4 for type-changing effects. */ /** Layer 4 for type-changing effects. */
TYPE("4"), TYPE,
/** Layer 5 for color-changing effects. */ /** Layer 5 for color-changing effects. */
COLOR("5"), COLOR,
/** Layer 6 for ability effects. */ /** Layer 6 for ability effects. */
ABILITIES("6"), ABILITIES,
/** Layer 7a for characteristic-defining power/toughness effects. */ /** Layer 7a for characteristic-defining power/toughness effects. */
CHARACTERISTIC("7a"), CHARACTERISTIC,
/** Layer 7b for power- and/or toughness-setting effects. */ /** Layer 7b for power- and/or toughness-setting effects. */
SETPT("7b"), SETPT,
/** Layer 7c for power- and/or toughness-modifying effects. */ /** Layer 7c for power- and/or toughness-modifying effects. */
MODIFYPT("7c"), MODIFYPT,
/** Layer 7d for power- and/or toughness-switching effects. */
//SWITCHPT("7d"),
/** Layer for game rule-changing effects. */ /** Layer for game rule-changing effects. */
RULES("8"); RULES;
public final String num;
StaticAbilityLayer(String n) {
num = n;
}
public final static ImmutableList<StaticAbilityLayer> CONTINUOUS_LAYERS = public final static ImmutableList<StaticAbilityLayer> CONTINUOUS_LAYERS =
ImmutableList.of(COPY, CONTROL, TEXT, TYPE, COLOR, ABILITIES, CHARACTERISTIC, SETPT, MODIFYPT, RULES); ImmutableList.of(COPY, CONTROL, TEXT, TYPE, COLOR, ABILITIES, CHARACTERISTIC, SETPT, MODIFYPT, RULES);

View File

@@ -301,8 +301,7 @@ public enum TrackableProperty {
GameLog(TrackableTypes.StringType), GameLog(TrackableTypes.StringType),
NeedsPhaseRedrawn(TrackableTypes.BooleanType), NeedsPhaseRedrawn(TrackableTypes.BooleanType),
PlayerTurn(TrackableTypes.PlayerViewType, FreezeMode.IgnoresFreeze), PlayerTurn(TrackableTypes.PlayerViewType, FreezeMode.IgnoresFreeze),
Phase(TrackableTypes.EnumType(PhaseType.class), FreezeMode.IgnoresFreeze), Phase(TrackableTypes.EnumType(PhaseType.class), FreezeMode.IgnoresFreeze);
Dependencies(TrackableTypes.StringType);
public enum FreezeMode { public enum FreezeMode {
IgnoresFreeze, IgnoresFreeze,

View File

@@ -23,7 +23,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>${revision}</version> <version>2.0.02</version>
</parent> </parent>
<artifactId>forge-gui-android</artifactId> <artifactId>forge-gui-android</artifactId>
@@ -66,7 +66,7 @@
<configuration> <configuration>
<!-- generate versionName from revision property to snapshot-version property --> <!-- generate versionName from revision property to snapshot-version property -->
<name>snapshot-version</name> <name>snapshot-version</name>
<value>${revision}</value> <value>2.0.02-SNAPSHOT</value>
<regex>-SNAPSHOT</regex> <regex>-SNAPSHOT</regex>
<replacement>-SNAPSHOT-${month.date}</replacement> <replacement>-SNAPSHOT-${month.date}</replacement>
<failIfNoMatch>false</failIfNoMatch> <failIfNoMatch>false</failIfNoMatch>

View File

@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>${revision}</version> <version>2.0.02</version>
</parent> </parent>
<artifactId>forge-gui-desktop</artifactId> <artifactId>forge-gui-desktop</artifactId>
@@ -49,7 +49,7 @@
<configuration> <configuration>
<!-- generate versionName from revision property to snapshot-version property --> <!-- generate versionName from revision property to snapshot-version property -->
<name>snapshot-version</name> <name>snapshot-version</name>
<value>${revision}</value> <value>2.0.02-SNAPSHOT</value>
<regex>-SNAPSHOT</regex> <regex>-SNAPSHOT</regex>
<replacement>-SNAPSHOT-${month.date}</replacement> <replacement>-SNAPSHOT-${month.date}</replacement>
<failIfNoMatch>false</failIfNoMatch> <failIfNoMatch>false</failIfNoMatch>

View File

@@ -87,7 +87,6 @@ public enum EDocID {
REPORT_MESSAGE (), REPORT_MESSAGE (),
REPORT_STACK (), REPORT_STACK (),
REPORT_COMBAT (), REPORT_COMBAT (),
REPORT_DEPENDENCIES (),
REPORT_LOG (), REPORT_LOG (),
DEV_MODE (), DEV_MODE (),

View File

@@ -32,6 +32,7 @@ import forge.toolbox.FSkin;
import forge.toolbox.FTextArea; import forge.toolbox.FTextArea;
import forge.util.FileUtil; import forge.util.FileUtil;
import forge.util.Localizer; import forge.util.Localizer;
import forge.util.RuntimeVersion;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
@@ -80,32 +81,45 @@ public enum VSubmenuDownloaders implements IVSubmenu<CSubmenuDownloaders> {
pnlContent.setOpaque(false); pnlContent.setOpaque(false);
pnlContent.add(_makeLabel("Bulk downloaders have been disabled. Please use auto-downloader for now."), constraintsLBL); if (javaRecentEnough()) {
// Github actions now uploading the latest version predictably. So we should be able to use this again.
pnlContent.add(btnCheckForUpdates, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblCheckForUpdates")), constraintsLBL);
// Github actions now uploading the latest version predictably. So we should be able to use this again. pnlContent.add(btnDownloadPics, constraintsBTN);
pnlContent.add(btnCheckForUpdates, constraintsBTN); pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPics")), constraintsLBL);
pnlContent.add(_makeLabel(localizer.getMessage("lblCheckForUpdates")), constraintsLBL);
// pnlContent.add(btnDownloadPics, constraintsBTN); pnlContent.add(btnDownloadPicsHQ, constraintsBTN);
// pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPics")), constraintsLBL); pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPicsHQ")), constraintsLBL);
//
// pnlContent.add(btnDownloadPicsHQ, constraintsBTN);
// pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPicsHQ")), constraintsLBL);
//
// pnlContent.add(btnDownloadSetPics, constraintsBTN);
// pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadSetPics")), constraintsLBL);
//
// pnlContent.add(btnDownloadQuestImages, constraintsBTN);
// pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadQuestImages")), constraintsLBL);
//
// pnlContent.add(btnDownloadAchievementImages, constraintsBTN);
// pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadAchievementImages")), constraintsLBL);
pnlContent.add(btnDownloadPrices, constraintsBTN); pnlContent.add(btnDownloadSetPics, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPrices")), constraintsLBL); pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadSetPics")), constraintsLBL);
// pnlContent.add(btnDownloadSkins, constraintsBTN); pnlContent.add(btnDownloadQuestImages, constraintsBTN);
// pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadSkins")), constraintsLBL); pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadQuestImages")), constraintsLBL);
pnlContent.add(btnDownloadAchievementImages, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadAchievementImages")), constraintsLBL);
pnlContent.add(btnDownloadPrices, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPrices")), constraintsLBL);
pnlContent.add(btnDownloadSkins, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadSkins")), constraintsLBL);
} else {
String text = localizer.getMessage("lblYourVersionOfJavaIsTooOld");
FLabel label = new FLabel.Builder().fontAlign(SwingConstants.CENTER).text(text).fontStyle(Font.BOLD).fontSize(18).build();
pnlContent.add(label, "w 90%!, h 25px!, center, gap 0 0 30px 3px");
text = localizer.getMessage("lblPleaseUpdateToTheLatestVersionOfJava");
label = new FLabel.Builder().fontAlign(SwingConstants.CENTER).text(text).fontStyle(Font.BOLD).fontSize(18).build();
pnlContent.add(label, "w 90%!, h 25px!, center, gap 0 0 0 36px");
text = localizer.getMessage("lblYoureRunning") + " " + System.getProperty("java.version");
text = text + " . " + localizer.getMessage("lblYouNeedAtLeastJavaVersion") ;
label = new FLabel.Builder().fontAlign(SwingConstants.CENTER).text(text).fontStyle(Font.BOLD).fontSize(18).build();
pnlContent.add(label, "w 90%!, h 25px!, center, gap 0 0 0 36px");
}
pnlContent.add(btnListImageData, constraintsBTN); pnlContent.add(btnListImageData, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblListImageData")), constraintsLBL); pnlContent.add(_makeLabel(localizer.getMessage("lblListImageData")), constraintsLBL);
@@ -123,6 +137,12 @@ public enum VSubmenuDownloaders implements IVSubmenu<CSubmenuDownloaders> {
pnlContent.add(_makeLabel(localizer.getMessage("lblLicensing")), constraintsLBL); pnlContent.add(_makeLabel(localizer.getMessage("lblLicensing")), constraintsLBL);
} }
private boolean javaRecentEnough() {
RuntimeVersion javaVersion = RuntimeVersion.of(System.getProperty("java.version"));
return javaVersion.getMajor() >= 9 || (javaVersion.getMajor() >= 1 && (javaVersion.getMinor() > 8 || (javaVersion.getMinor() == 8 && javaVersion.getUpdate() >= 101)));
}
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.view.home.IViewSubmenu#populate() * @see forge.view.home.IViewSubmenu#populate()
*/ */

View File

@@ -104,7 +104,6 @@ import forge.player.PlayerZoneUpdate;
import forge.player.PlayerZoneUpdates; import forge.player.PlayerZoneUpdates;
import forge.screens.match.controllers.CAntes; import forge.screens.match.controllers.CAntes;
import forge.screens.match.controllers.CCombat; import forge.screens.match.controllers.CCombat;
import forge.screens.match.controllers.CDependencies;
import forge.screens.match.controllers.CDetailPicture; import forge.screens.match.controllers.CDetailPicture;
import forge.screens.match.controllers.CDev; import forge.screens.match.controllers.CDev;
import forge.screens.match.controllers.CDock; import forge.screens.match.controllers.CDock;
@@ -168,7 +167,6 @@ public final class CMatchUI
private final CAntes cAntes = new CAntes(this); private final CAntes cAntes = new CAntes(this);
private final CCombat cCombat = new CCombat(); private final CCombat cCombat = new CCombat();
private final CDependencies cDependencies = new CDependencies(this);
private final CDetailPicture cDetailPicture = new CDetailPicture(this); private final CDetailPicture cDetailPicture = new CDetailPicture(this);
private final CDev cDev = new CDev(this); private final CDev cDev = new CDev(this);
private final CDock cDock = new CDock(this); private final CDock cDock = new CDock(this);
@@ -192,7 +190,6 @@ public final class CMatchUI
this.myDocs.put(EDocID.REPORT_MESSAGE, getCPrompt().getView()); this.myDocs.put(EDocID.REPORT_MESSAGE, getCPrompt().getView());
this.myDocs.put(EDocID.REPORT_STACK, getCStack().getView()); this.myDocs.put(EDocID.REPORT_STACK, getCStack().getView());
this.myDocs.put(EDocID.REPORT_COMBAT, cCombat.getView()); this.myDocs.put(EDocID.REPORT_COMBAT, cCombat.getView());
this.myDocs.put(EDocID.REPORT_DEPENDENCIES, cDependencies.getView());
this.myDocs.put(EDocID.REPORT_LOG, cLog.getView()); this.myDocs.put(EDocID.REPORT_LOG, cLog.getView());
this.myDocs.put(EDocID.DEV_MODE, getCDev().getView()); this.myDocs.put(EDocID.DEV_MODE, getCDev().getView());
this.myDocs.put(EDocID.BUTTON_DOCK, getCDock().getView()); this.myDocs.put(EDocID.BUTTON_DOCK, getCDock().getView());
@@ -413,11 +410,6 @@ public final class CMatchUI
cCombat.update(); cCombat.update();
} // showCombat(CombatView) } // showCombat(CombatView)
@Override
public void updateDependencies() {
cDependencies.update();
}
@Override @Override
public void updateDayTime(String daytime) { public void updateDayTime(String daytime) {
super.updateDayTime(daytime); super.updateDayTime(daytime);

View File

@@ -1,51 +0,0 @@
package forge.screens.match.controllers;
import forge.game.GameView;
import forge.gui.framework.ICDoc;
import forge.screens.match.CMatchUI;
import forge.screens.match.views.VDependencies;
/**
* Controls the combat panel in the match UI.
*
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
*
*/
public class CDependencies implements ICDoc {
private final CMatchUI matchUI;
private final VDependencies view;
public CDependencies(CMatchUI cMatchUI) {
view = new VDependencies(this);
matchUI = cMatchUI;
}
public VDependencies getView() {
return view;
}
@Override
public void register() {
}
/* (non-Javadoc)
* @see forge.gui.framework.ICDoc#initialize()
*/
@Override
public void initialize() {
}
/* (non-Javadoc)
* @see forge.gui.framework.ICDoc#update()
*/
@Override
public void update() {
GameView game = matchUI.getGameView();
if (game == null || game.getDependencies() == null) {
return;
}
String dependencies = game.getDependencies();
view.updateDependencies(dependencies.lines().count(), dependencies);
}
}

View File

@@ -1,115 +0,0 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Nate
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.screens.match.views;
import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab;
import forge.gui.framework.EDocID;
import forge.gui.framework.IVDoc;
import forge.screens.match.controllers.CDependencies;
import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinnedTextArea;
import forge.util.Localizer;
import net.miginfocom.swing.MigLayout;
/**
* Assembles Swing components of layer dependencies.
*
* <br><br><i>(V at beginning of class name denotes a view class.)</i>
*/
public class VDependencies implements IVDoc<CDependencies> {
// Fields used with interface IVDoc
private DragCell parentCell;
private final DragTab tab = new DragTab(Localizer.getInstance().getMessage("lblDependenciesTab"));
private final SkinnedTextArea tar = new SkinnedTextArea();
private final CDependencies controller;
public VDependencies(final CDependencies controller) {
this.controller = controller;
tar.setOpaque(false);
tar.setBorder(new FSkin.MatteSkinBorder(0, 0, 0, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
tar.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
tar.setFocusable(false);
tar.setLineWrap(true);
}
//========== Overridden methods
/* (non-Javadoc)
* @see forge.gui.framework.IVDoc#populate()
*/
@Override
public void populate() {
parentCell.getBody().removeAll();
parentCell.getBody().setLayout(new MigLayout("insets 0, gap 0, wrap"));
parentCell.getBody().add(tar, "w 95%!, gapleft 3%, gaptop 1%, h 95%");
}
/* (non-Javadoc)
* @see forge.gui.framework.IVDoc#setParentCell()
*/
@Override
public void setParentCell(final DragCell cell0) {
this.parentCell = cell0;
}
/* (non-Javadoc)
* @see forge.gui.framework.IVDoc#getParentCell()
*/
@Override
public DragCell getParentCell() {
return this.parentCell;
}
/* (non-Javadoc)
* @see forge.gui.framework.IVDoc#getDocumentID()
*/
@Override
public EDocID getDocumentID() {
return EDocID.REPORT_DEPENDENCIES;
}
/* (non-Javadoc)
* @see forge.gui.framework.IVDoc#getTabLabel()
*/
@Override
public DragTab getTabLabel() {
return tab;
}
/* (non-Javadoc)
* @see forge.gui.framework.IVDoc#getLayoutControl()
*/
@Override
public CDependencies getLayoutControl() {
return controller;
}
//========= Observer update methods
public void updateDependencies(final long cntDependencies, final String desc) {
tab.setText(cntDependencies > 0 ? (Localizer.getInstance().getMessage("lblDependenciesTab") + " : " + cntDependencies) : Localizer.getInstance().getMessage("lblDependenciesTab"));
// No need to update this unless it's showing
if (parentCell == null || !this.equals(parentCell.getSelected())) { return; }
tar.setText(desc);
}
}

View File

@@ -11,7 +11,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>${revision}</version> <version>2.0.02</version>
</parent> </parent>
<artifactId>forge-gui-ios</artifactId> <artifactId>forge-gui-ios</artifactId>
@@ -35,7 +35,7 @@
<filtering>true</filtering> <filtering>true</filtering>
</resource> </resource>
</resources> </resources>
<finalName>forge-ios-${revision}</finalName> <finalName>forge-ios-2.0.02-SNAPSHOT</finalName>
</build> </build>
<dependencies> <dependencies>

View File

@@ -9,7 +9,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>${revision}</version> <version>2.0.02</version>
</parent> </parent>
<artifactId>forge-gui-mobile-dev</artifactId> <artifactId>forge-gui-mobile-dev</artifactId>
@@ -45,7 +45,7 @@
<configuration> <configuration>
<!-- generate versionName from revision property to snapshot-version property --> <!-- generate versionName from revision property to snapshot-version property -->
<name>snapshot-version</name> <name>snapshot-version</name>
<value>${revision}</value> <value>2.0.02-SNAPSHOT</value>
<regex>-SNAPSHOT</regex> <regex>-SNAPSHOT</regex>
<replacement>-SNAPSHOT-${month.date}</replacement> <replacement>-SNAPSHOT-${month.date}</replacement>
<failIfNoMatch>false</failIfNoMatch> <failIfNoMatch>false</failIfNoMatch>

View File

@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>${revision}</version> <version>2.0.02</version>
</parent> </parent>
<artifactId>forge-gui-mobile</artifactId> <artifactId>forge-gui-mobile</artifactId>

View File

@@ -19,8 +19,12 @@ import forge.Graphics;
import forge.assets.FSkinColor; import forge.assets.FSkinColor;
import forge.assets.FSkinFont; import forge.assets.FSkinFont;
import forge.assets.FSkinImage; import forge.assets.FSkinImage;
import forge.gui.download.GuiDownloadAchievementImages;
import forge.gui.download.GuiDownloadPicturesLQ;
import forge.gui.download.GuiDownloadPrices; import forge.gui.download.GuiDownloadPrices;
import forge.gui.download.GuiDownloadQuestImages;
import forge.gui.download.GuiDownloadService; import forge.gui.download.GuiDownloadService;
import forge.gui.download.GuiDownloadSetPicturesLQ;
import forge.gui.download.GuiDownloadSkins; import forge.gui.download.GuiDownloadSkins;
import forge.gui.download.GuiDownloadZipService; import forge.gui.download.GuiDownloadZipService;
import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgeConstants;
@@ -76,34 +80,34 @@ public class FilesPage extends TabPage<SettingsScreen> {
} }
}, 0); }, 0);
//content downloaders //content downloaders
// lstItems.addItem(new ContentDownloader(Forge.getLocalizer().getMessage("btnDownloadPics"), lstItems.addItem(new ContentDownloader(Forge.getLocalizer().getMessage("btnDownloadPics"),
// Forge.getLocalizer().getMessage("lblDownloadPics")) { Forge.getLocalizer().getMessage("lblDownloadPics")) {
// @Override @Override
// protected GuiDownloadService createService() { protected GuiDownloadService createService() {
// return new GuiDownloadPicturesLQ(); return new GuiDownloadPicturesLQ();
// } }
// }, 1); }, 1);
// lstItems.addItem(new ContentDownloader(Forge.getLocalizer().getMessage("btnDownloadSetPics"), lstItems.addItem(new ContentDownloader(Forge.getLocalizer().getMessage("btnDownloadSetPics"),
// Forge.getLocalizer().getMessage("lblDownloadSetPics")) { Forge.getLocalizer().getMessage("lblDownloadSetPics")) {
// @Override @Override
// protected GuiDownloadService createService() { protected GuiDownloadService createService() {
// return new GuiDownloadSetPicturesLQ(); return new GuiDownloadSetPicturesLQ();
// } }
// }, 1); }, 1);
// lstItems.addItem(new ContentDownloader(Forge.getLocalizer().getMessage("btnDownloadQuestImages"), lstItems.addItem(new ContentDownloader(Forge.getLocalizer().getMessage("btnDownloadQuestImages"),
// Forge.getLocalizer().getMessage("lblDownloadQuestImages")) { Forge.getLocalizer().getMessage("lblDownloadQuestImages")) {
// @Override @Override
// protected GuiDownloadService createService() { protected GuiDownloadService createService() {
// return new GuiDownloadQuestImages(); return new GuiDownloadQuestImages();
// } }
// }, 1); }, 1);
// lstItems.addItem(new ContentDownloader(Forge.getLocalizer().getMessage("btnDownloadAchievementImages"), lstItems.addItem(new ContentDownloader(Forge.getLocalizer().getMessage("btnDownloadAchievementImages"),
// Forge.getLocalizer().getMessage("lblDownloadAchievementImages")) { Forge.getLocalizer().getMessage("lblDownloadAchievementImages")) {
// @Override @Override
// protected GuiDownloadService createService() { protected GuiDownloadService createService() {
// return new GuiDownloadAchievementImages(); return new GuiDownloadAchievementImages();
// } }
// }, 1); }, 1);
lstItems.addItem(new ContentDownloader(Forge.getLocalizer().getMessage("btnDownloadPrices"), lstItems.addItem(new ContentDownloader(Forge.getLocalizer().getMessage("btnDownloadPrices"),
Forge.getLocalizer().getMessage("lblDownloadPrices")) { Forge.getLocalizer().getMessage("lblDownloadPrices")) {
@Override @Override

View File

@@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>forge</artifactId> <artifactId>forge</artifactId>
<groupId>forge</groupId> <groupId>forge</groupId>
<version>${revision}</version> <version>2.0.02</version>
</parent> </parent>
<artifactId>forge-gui</artifactId> <artifactId>forge-gui</artifactId>

View File

@@ -66,8 +66,7 @@
"Questing Cosplayer", "Questing Cosplayer",
"Teferi, Druid of Argoth", "Teferi, Druid of Argoth",
"Anax and Cymede & Kynaios and Tiro", "Anax and Cymede & Kynaios and Tiro",
"Call from the Grave", "Call from the Grave"
"Mise"
], ],
"restrictedEditions": [ "restrictedEditions": [

View File

@@ -4,7 +4,7 @@ Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | CheckSVar$ YourLife | SVarCompare$ GE40 | Execute$ TrigSeek | TriggerDescription$ As long as Sorin's life total is 40 or more, Sorin seeks two nonland cards every upkeep and can't lose the game and his opponents can't win the game. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | CheckSVar$ YourLife | SVarCompare$ GE40 | Execute$ TrigSeek | TriggerDescription$ As long as Sorin's life total is 40 or more, Sorin seeks two nonland cards every upkeep and can't lose the game and his opponents can't win the game.
SVar:TrigSeek:DB$ Seek | Num$ 2 | Type$ Card.nonLand SVar:TrigSeek:DB$ Seek | Num$ 2 | Type$ Card.nonLand
R:Event$ GameLoss | ActiveZones$ Command | ValidPlayer$ You | Layer$ CantHappen | CheckSVar$ YourLife | SVarCompare$ GE40 | Secondary$ True | Description$ You can't lose the game and your opponents can't win the game. R:Event$ GameLoss | ActiveZones$ Command | ValidPlayer$ You | Layer$ CantHappen | CheckSVar$ YourLife | SVarCompare$ GE40 | Secondary$ True | Description$ You can't lose the game and your opponents can't win the game.
R:Event$ GameWin | ActiveZones$ Command | ValidPlayer$ Opponent | Layer$ CantHappen | Secondary$ True | EffectZone$ Command | CheckSVar$ YourLife | Secondary$ True | SVarCompare$ GE40 | Description$ You can't lose the game and your opponents can't win the game. R:Event$ GameWin | ActiveZones$ Battlefield | ValidPlayer$ Opponent | Layer$ CantHappen | Secondary$ True | EffectZone$ Command | CheckSVar$ YourLife | Secondary$ True | SVarCompare$ GE40 | Description$ You can't lose the game and your opponents can't win the game.
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | CheckSVar$ YourLifeCompare | SVarCompare$ EQ2 | Execute$ TrigConjure | TriggerDescription$ As long as Sorin's life total is between 20 and 40, at Sorin's upkeep, conjure a card from Sorin's Spellbook into exile with 2 time counters on it, it gains suspend. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | CheckSVar$ YourLifeCompare | SVarCompare$ EQ2 | Execute$ TrigConjure | TriggerDescription$ As long as Sorin's life total is between 20 and 40, at Sorin's upkeep, conjure a card from Sorin's Spellbook into exile with 2 time counters on it, it gains suspend.
SVar:TrigConjure:DB$ MakeCard | Conjure$ True | AtRandom$ True | Spellbook$ Sorin; Grim Nemesis,Sorin; Imperious Bloodlord,Sorin; Lord of Innistrad,Sorin Markov,Sorin; Solemn Visitor,Sorin the Mirthless,Sorin; Vampire Lord,Sorin; Vengeful Bloodlord,Timothar; Baron of Bats,Olivia Voldaren,Patriarch's Bidding,Licia; Sanguine Tribune,Astarion; the Decadent,Strefan; Maurer Progenitor,Evelyn; the Covetous,Anje; Maid of Dishonor,Edgar Markov,Swords to Plowshares,Cruel Celebrant,Olivia's Wrath,Markov Baron,Champion of Dusk,Vein Ripper,Anguished Unmaking,Mortify,Void Rend,Terminate,Despark,Bedevil,Utter End,Ruinous Ultimatum,Sign in Blood,Reanimate,Victimize | Zone$ Exile | RememberMade$ True | SubAbility$ DBPutCounter SVar:TrigConjure:DB$ MakeCard | Conjure$ True | AtRandom$ True | Spellbook$ Sorin; Grim Nemesis,Sorin; Imperious Bloodlord,Sorin; Lord of Innistrad,Sorin Markov,Sorin; Solemn Visitor,Sorin the Mirthless,Sorin; Vampire Lord,Sorin; Vengeful Bloodlord,Timothar; Baron of Bats,Olivia Voldaren,Patriarch's Bidding,Licia; Sanguine Tribune,Astarion; the Decadent,Strefan; Maurer Progenitor,Evelyn; the Covetous,Anje; Maid of Dishonor,Edgar Markov,Swords to Plowshares,Cruel Celebrant,Olivia's Wrath,Markov Baron,Champion of Dusk,Vein Ripper,Anguished Unmaking,Mortify,Void Rend,Terminate,Despark,Bedevil,Utter End,Ruinous Ultimatum,Sign in Blood,Reanimate,Victimize | Zone$ Exile | RememberMade$ True | SubAbility$ DBPutCounter
SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterNum$ 3 | CounterType$ TIME | SubAbility$ GiveSuspend SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterNum$ 3 | CounterType$ TIME | SubAbility$ GiveSuspend

View File

@@ -200,7 +200,7 @@
<properties> <properties>
<property name="dialog">[ <property name="dialog">[
{ {
&quot;text&quot;: &quot;A big gate is blocking the path, through the bars you can see an imposing figure in the room beyond.&quot;, &quot;text&quot;: &quot;A big gate is blocking the path, through the bars you can see an imposing figure in the room beyond. (you need all five shards from this dungeon to open this gate)&quot;,
&quot;options&quot;: [ &quot;options&quot;: [
{ &quot;name&quot;: &quot;go away&quot; }, { &quot;name&quot;: &quot;go away&quot; },
{ {

View File

@@ -3,7 +3,7 @@ ManaCost:1 U U
Types:Artifact Types:Artifact
K:Start your engines K:Start your engines
A:AB$ Draw | Cost$ 2 T | SpellDescription$ Draw a card. A:AB$ Draw | Cost$ 2 T | SpellDescription$ Draw a card.
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ DrawTrig | Description$ Max speed — Whenever you draw a card, each opponent mills two cards. (Each opponent puts the top two cards of their library into their graveyard.) S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ DrawTrig | Description$ Max speed — Whenever you draw a card, each opponent mills two cards. (Each opponent puts the top two cards of their library into their graveyard.)
SVar:DrawTrig:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMill | Secondary$ True | TriggerDescription$ Max speed — Whenever you draw a card, each opponent mills two cards. SVar:DrawTrig:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMill | Secondary$ True | TriggerDescription$ Max speed — Whenever you draw a card, each opponent mills two cards.
SVar:TrigMill:DB$ Mill | Defined$ Opponent | NumCards$ 2 SVar:TrigMill:DB$ Mill | Defined$ Opponent | NumCards$ 2
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\n{2}, {T}: Draw a card.\nMax speed — Whenever you draw a card, each opponent mills two cards. (Each opponent puts the top two cards of their library into their graveyard.) Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\n{2}, {T}: Draw a card.\nMax speed — Whenever you draw a card, each opponent mills two cards. (Each opponent puts the top two cards of their library into their graveyard.)

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land Types:Land
K:Start your engines K:Start your engines
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABPump | Description$ Max speed — {T}: Target creature gains haste until end of turn. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABPump | Description$ Max speed — {T}: Target creature gains haste until end of turn.
SVar:ABPump:AB$ Pump | Secondary$ True | PrecostDesc$ Max speed — | Cost$ T | ValidTgts$ Creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. SVar:ABPump:AB$ Pump | Secondary$ True | PrecostDesc$ Max speed — | Cost$ T | ValidTgts$ Creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn.
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\n{T}: Add {C}.\nMax speed — {T}: Target creature gains haste until end of turn. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\n{T}: Add {C}.\nMax speed — {T}: Target creature gains haste until end of turn.

View File

@@ -1,9 +1,10 @@
Name:Barrin's Spite Name:Barrin's Spite
ManaCost:2 U B ManaCost:2 U B
Types:Sorcery 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. Their controller chooses and sacrifices one of them. Return the other to its owner's hand. A:SP$ Pump | ValidTgts$ Creature | TgtPrompt$ Choose two target creatures controlled by the same player | TargetMin$ 2 | TargetMax$ 2 | TargetUnique$ True | TargetsWithSameController$ True | RememberTargets$ True | IsCurse$ True | SubAbility$ DBChooseSac | StackDescription$ SpellDescription | SpellDescription$ 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.
SVar:DBChooseSac:DB$ ChooseCard | DefinedCards$ Targeted | Defined$ TargetedController | ChoiceTitle$ Choose one to sacrifice | SubAbility$ DBSac | StackDescription$ None | AILogic$ WorstCard SVar:DBChooseSac:DB$ ChooseCard | Choices$ Card.IsRemembered | Defined$ TargetedController | ChoiceTitle$ Choose one to sacrifice | ForgetChosen$ True | SubAbility$ DBSac | StackDescription$ None | AILogic$ WorstCard
SVar:DBSac:DB$ SacrificeAll | Defined$ ChosenCard | SubAbility$ DBBounce | StackDescription$ None SVar:DBSac:DB$ SacrificeAll | Defined$ ChosenCard | SubAbility$ DBBounce | StackDescription$ None
SVar:DBBounce:DB$ ChangeZone | Defined$ Targeted.!ChosenCard | Origin$ Battlefield | Destination$ Hand | 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 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. 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

@@ -2,7 +2,7 @@ Name:Boom Scholar
ManaCost:1 R G ManaCost:1 R G
Types:Creature Goblin Advisor Types:Creature Goblin Advisor
PT:3/3 PT:3/3
S:Mode$ ReduceCost | ValidCard$ Permanent.YouCtrl+Other | ValidSpell$ Activated.Exhaust | Amount$ 2 | AffectedZone$ Battlefield | Description$ Exhaust abilities of other permanents you control cost {2} less to activate. S:Mode$ ReduceCost | ValidCard$ Permanent.YouCtrl+Other | Type$ Activated.Exhaust | Amount$ 2 | AffectedZone$ Battlefield | Description$ Exhaust abilities of other permanents you control cost {2} less to activate.
A:AB$ PumpAll | Cost$ 4 R G | ValidCards$ Creature.YouCtrl,Vehicle.YouCtrl | KW$ Trample | Exhaust$ True | SubAbility$ DBPutCounter | SpellDescription$ Creatures and Vehicles you control gain trample until end of turn. Put two +1/+1 counters on this creature. (Activate each exhaust ability only once.) A:AB$ PumpAll | Cost$ 4 R G | ValidCards$ Creature.YouCtrl,Vehicle.YouCtrl | KW$ Trample | Exhaust$ True | SubAbility$ DBPutCounter | SpellDescription$ Creatures and Vehicles you control gain trample until end of turn. Put two +1/+1 counters on this creature. (Activate each exhaust ability only once.)
SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2
Oracle:Exhaust abilities of other permanents you control cost {2} less to activate.\nExhaust — {4}{R}{G}: Creatures and Vehicles you control gain trample until end of turn. Put two +1/+1 counters on this creature. (Activate each exhaust ability only once.) Oracle:Exhaust abilities of other permanents you control cost {2} less to activate.\nExhaust — {4}{R}{G}: Creatures and Vehicles you control gain trample until end of turn. Put two +1/+1 counters on this creature. (Activate each exhaust ability only once.)

View File

@@ -4,9 +4,9 @@ Types:Artifact Vehicle
PT:5/5 PT:5/5
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMana | TriggerDescription$ When this Vehicle enters, add four mana of any one color. Spend this mana only to activate abilities. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMana | TriggerDescription$ When this Vehicle enters, add four mana of any one color. Spend this mana only to activate abilities.
SVar:TrigMana:DB$ Mana | Produced$ Any | Amount$ 4 | RestrictValid$ Activated SVar:TrigMana:DB$ Mana | Produced$ Any | Amount$ 4 | RestrictValid$ Activated
A:AB$ DealDamage | Cost$ X 2 R | ValidTgts$ Any | NumDmg$ X | Exhaust$ True | SubAbility$ DBPutCounter | SpellDescription$ This Vehicle deals X damage to any target. Put a +1/+1 counter on this Vehicle. (Activate each exhaust ability only once.) A:AB$ DealDamage | Cost$ X 2 R T | ValidTgts$ Any | NumDmg$ X | Exhaust$ True | SubAbility$ DBPutCounter | SpellDescription$ This Vehicle deals X damage to any target. Put a +1/+1 counter on this Vehicle. (Activate each exhaust ability only once.)
SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
K:Crew:2 K:Crew:2
SVar:X:Count$xPaid SVar:X:Count$xPaid
DeckHas:Ability$Counters DeckHas:Ability$Counters
Oracle:When this Vehicle enters, add four mana of any one color. Spend this mana only to activate abilities.\nExhaust — {X}{2}{R}: This Vehicle deals X damage to any target. Put a +1/+1 counter on this Vehicle. (Activate each exhaust ability only once.)\nCrew 2 Oracle:When this Vehicle enters, add four mana of any one color. Spend this mana only to activate abilities.\nExhaust — {X}{2}{R}: This Vehicle deals X damage to any target. Put a +1/+1 counter on this Vehicle. (Activate each exhaust ability only once.)\nCrew 2

View File

@@ -5,6 +5,6 @@ PT:1/1
K:Menace K:Menace
K:Start your engines K:Start your engines
A:AB$ Pump | Cost$ 2 | NumAtt$ +1 | SpellDescription$ This creature gets +1/+0 until end of turn. A:AB$ Pump | Cost$ 2 | NumAtt$ +1 | SpellDescription$ This creature gets +1/+0 until end of turn.
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature has double strike. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature has double strike.
SVar:MaxSpeedStatic:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Double Strike | Secondary$ True | Description$ Max speed — This creature has double strike. SVar:MaxSpeedStatic:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Double Strike | Secondary$ True | Description$ Max speed — This creature has double strike.
Oracle:Menace\nStart your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\n{2}: This creature gets +1/+0 until end of turn.\nMax speed — This creature has double strike. Oracle:Menace\nStart your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\n{2}: This creature gets +1/+0 until end of turn.\nMax speed — This creature has double strike.

View File

@@ -1,9 +1,10 @@
Name:Cannibalize Name:Cannibalize
ManaCost:1 B ManaCost:1 B
Types:Sorcery Types:Sorcery
A:SP$ Pump | ValidTgts$ Creature | TargetMin$ 2 | TargetMax$ 2 | TargetUnique$ True | TargetsWithSameController$ True | SubAbility$ DBChoose | StackDescription$ SpellDescription | IsCurse$ True | SpellDescription$ Choose two target creatures controlled by the same player. Exile one of those creatures and put two +1/+1 counters on the other. A:SP$ Pump | ValidTgts$ Creature | TargetMin$ 2 | TargetMax$ 2 | TargetUnique$ True | TargetsWithSameController$ True | RememberTargets$ True | SubAbility$ DBChoose | StackDescription$ SpellDescription | IsCurse$ True | SpellDescription$ Choose two target creatures controlled by the same player. Exile one of those creatures and put two +1/+1 counters on the other.
SVar:DBChoose:DB$ ChooseCard | DefinedCards$ Targeted | Mandatory$ True | ChoiceTitle$ Choose one to exile | Amount$ 1 | SubAbility$ ExileChosen | StackDescription$ None SVar:DBChoose:DB$ ChooseCard | Choices$ Card.IsRemembered | ForgetChosen$ True | Mandatory$ True | ChoiceTitle$ Choose one to exile | Amount$ 1 | SubAbility$ ExileChosen | StackDescription$ None
SVar:ExileChosen:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBPutCounter | StackDescription$ None SVar:ExileChosen:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBPutCounter | StackDescription$ None
SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted.!ChosenCard | CounterType$ P1P1 | CounterNum$ 2 | StackDescription$ None SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBCleanup | StackDescription$ None
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:All AI:RemoveDeck:All
Oracle:Choose two target creatures controlled by the same player. Exile one of those creatures and put two +1/+1 counters on the other. Oracle:Choose two target creatures controlled by the same player. Exile one of those creatures and put two +1/+1 counters on the other.

View File

@@ -2,5 +2,6 @@ Name:Celestial Judgment
ManaCost:4 W W ManaCost:4 W W
Types:Sorcery Types:Sorcery
A:SP$ ChooseCard | Choices$ Creature | EachDifferentPower$ True | SubAbility$ DBDestroy | StackDescription$ SpellDescription | SpellDescription$ For each different power among creatures on the battlefield, choose a creature with that power. Destroy each creature not chosen this way. A:SP$ ChooseCard | Choices$ Creature | EachDifferentPower$ True | SubAbility$ DBDestroy | StackDescription$ SpellDescription | SpellDescription$ For each different power among creatures on the battlefield, choose a creature with that power. Destroy each creature not chosen this way.
SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.nonChosenCard | StackDescription$ None SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.nonChosenCard | SubAbility$ DBCleanup | StackDescription$ None
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
Oracle:For each different power among creatures on the battlefield, choose a creature with that power. Destroy each creature not chosen this way. Oracle:For each different power among creatures on the battlefield, choose a creature with that power. Destroy each creature not chosen this way.

View File

@@ -2,11 +2,8 @@ Name:Countryside Crusher
ManaCost:1 R R ManaCost:1 R R
Types:Creature Giant Warrior Types:Creature Giant Warrior
PT:3/3 PT:3/3
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRepeat | TriggerDescription$ At the beginning of your upkeep, reveal the top card of your library. If it's a land card, put it into your graveyard and repeat this process. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigReveal | TriggerDescription$ At the beginning of your upkeep, reveal the top card of your library. If it's a land card, put it into your graveyard and repeat this process.
SVar:TrigRepeat:DB$ Repeat | RepeatSubAbility$ DBReset | RepeatDefined$ Remembered | RepeatPresent$ Card | RepeatSVarCompare$ EQ1 | SubAbility$ DBCleanup
SVar:DBReset:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBReveal
SVar:DBReveal:DB$ Dig | DigNum$ 1 | ChangeValid$ Land | ChangeNum$ All | Reveal$ True | DestinationZone$ Graveyard | RememberChanged$ True
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Land.nonToken+YouOwn | TriggerZones$ Battlefield | Execute$ TrigAddCounter | TriggerDescription$ Whenever a land card is put into your graveyard from anywhere, put a +1/+1 counter on CARDNAME. T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Land.nonToken+YouOwn | TriggerZones$ Battlefield | Execute$ TrigAddCounter | TriggerDescription$ Whenever a land card is put into your graveyard from anywhere, put a +1/+1 counter on CARDNAME.
SVar:TrigReveal:DB$ DigUntil | DigNum$ 1 | Valid$ Card.nonLand | ValidDescription$ a nonland card | FoundDestination$ Library | LibraryPosition$ 0 | RevealedDestination$ Graveyard
SVar:TrigAddCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 SVar:TrigAddCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1
Oracle:At the beginning of your upkeep, reveal the top card of your library. If it's a land card, put it into your graveyard and repeat this process.\nWhenever a land card is put into your graveyard from anywhere, put a +1/+1 counter on Countryside Crusher. Oracle:At the beginning of your upkeep, reveal the top card of your library. If it's a land card, put it into your graveyard and repeat this process.\nWhenever a land card is put into your graveyard from anywhere, put a +1/+1 counter on Countryside Crusher.

View File

@@ -3,6 +3,6 @@ ManaCost:1 R
Types:Kindred Instant Giant Types:Kindred Instant Giant
A:SP$ ChooseCard | Defined$ You | Mandatory$ True | Choices$ Creature.Giant+YouCtrl | ChoiceTitle$ Choose a Giant creature you control | SubAbility$ DBDmg | SpellDescription$ Choose a Giant creature you control. It deals damage equal to its power to target creature. A:SP$ ChooseCard | Defined$ You | Mandatory$ True | Choices$ Creature.Giant+YouCtrl | ChoiceTitle$ Choose a Giant creature you control | SubAbility$ DBDmg | SpellDescription$ Choose a Giant creature you control. It deals damage equal to its power to target creature.
SVar:DBDmg:DB$ DealDamage | NumDmg$ X | DamageSource$ ChosenCard | ValidTgts$ Creature SVar:DBDmg:DB$ DealDamage | NumDmg$ X | DamageSource$ ChosenCard | ValidTgts$ Creature
SVar:X:ChosenCard$CardPower SVar:X:Count$Valid Card.ChosenCard$CardPower
AI:RemoveDeck:Random AI:RemoveDeck:Random
Oracle:Choose a Giant creature you control. It deals damage equal to its power to target creature. Oracle:Choose a Giant creature you control. It deals damage equal to its power to target creature.

View File

@@ -1,13 +1,14 @@
Name:Deliver Unto Evil Name:Deliver Unto Evil
ManaCost:2 B ManaCost:2 B
Types:Sorcery Types:Sorcery
A:SP$ Pump | ValidTgts$ Card.YouCtrl | TgtPrompt$ Select target card | TargetMin$ 0 | TargetMax$ 4 | TgtZone$ Graveyard | SubAbility$ DBBranch | StackDescription$ SpellDescription | SpellDescription$ Choose up to four target cards in your graveyard. If you control a Bolas planeswalker, return those cards to your hand. Otherwise, an opponent chooses two of them. Leave the chosen cards in your graveyard and put the rest into your hand. Exile CARDNAME. A:SP$ Pump | ValidTgts$ Card.YouCtrl | TgtPrompt$ Select target card | TargetMin$ 0 | TargetMax$ 4 | TgtZone$ Graveyard | RememberTargets$ True | SubAbility$ DBBranch | StackDescription$ SpellDescription | SpellDescription$ Choose up to four target cards in your graveyard. If you control a Bolas planeswalker, return those cards to your hand. Otherwise, an opponent chooses two of them. Leave the chosen cards in your graveyard and put the rest into your hand. Exile CARDNAME.
SVar:DBBranch:DB$ Branch | BranchConditionSVar$ X | TrueSubAbility$ DBChangeZone | FalseSubAbility$ DBChooseOpp | SubAbility$ DBExile SVar:DBBranch:DB$ Branch | BranchConditionSVar$ X | TrueSubAbility$ DBChangeZone | FalseSubAbility$ DBChooseOpp | SubAbility$ DBCleanup
SVar:X:Count$Valid Planeswalker.Bolas+YouCtrl SVar:X:Count$Valid Planeswalker.Bolas+YouCtrl
SVar:DBChangeZone:DB$ ChangeZone | Defined$ Targeted | Origin$ Graveyard | Destination$ Hand SVar:DBChangeZone:DB$ ChangeZone | Defined$ Remembered | Origin$ Graveyard | Destination$ Hand
SVar:DBChooseOpp:DB$ ChoosePlayer | Choices$ Player.Opponent | SubAbility$ DBChoose SVar:DBChooseOpp:DB$ ChoosePlayer | Choices$ Player.Opponent | SubAbility$ DBChoose
SVar:DBChoose:DB$ ChooseCard | DefinedCards$ Targeted | ChoiceZone$ Graveyard | Amount$ 2 | Mandatory$ True | Defined$ ChosenPlayer | SubAbility$ DBReturn SVar:DBChoose:DB$ ChooseCard | Choices$ Card.IsRemembered | ChoiceZone$ Graveyard | Amount$ 2 | Mandatory$ True | Defined$ ChosenPlayer | ForgetChosen$ True | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | Defined$ Targeted.!ChosenCard | Origin$ Graveyard | Destination$ Hand SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Graveyard | Destination$ Hand
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenPlayer$ True | ClearChosenCard$ True | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | StackDescription$ None SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | StackDescription$ None
SVar:NeedsToPlayVar:Z GE3 SVar:NeedsToPlayVar:Z GE3
SVar:Z:Count$ValidGraveyard Card.YouOwn SVar:Z:Count$ValidGraveyard Card.YouOwn

View File

@@ -5,5 +5,6 @@ A:SP$ ChangeZoneAll | ChangeType$ Permanent | Origin$ Battlefield | Destination$
SVar:DBEffect:DB$ Effect | Triggers$ TrigUpkeep | RememberObjects$ Remembered | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:DBEffect:DB$ Effect | Triggers$ TrigUpkeep | RememberObjects$ Remembered | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:TrigUpkeep:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ BreachReturn | TriggerZones$ Command | TriggerDescription$ At the beginning of each player's upkeep, that player returns one of the exiled cards they own to the battlefield. SVar:TrigUpkeep:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ BreachReturn | TriggerZones$ Command | TriggerDescription$ At the beginning of each player's upkeep, that player returns one of the exiled cards they own to the battlefield.
SVar:BreachReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered+ActivePlayerCtrl | ForgetChanged$ True | Hidden$ True SVar:BreachReturn:DB$ ChooseCard | Defined$ TriggeredPlayer | Amount$ 1 | Mandatory$ True | ChoiceTitle$ Choose a card to return to the battlefield | Choices$ Card.IsRemembered+ActivePlayerCtrl | ChoiceZone$ Exile | SubAbility$ MoveChosen
SVar:MoveChosen:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ ChosenCard | ForgetChanged$ True
Oracle:Exile all permanents. For as long as any of those cards remain exiled, at the beginning of each player's upkeep, that player returns one of the exiled cards they own to the battlefield. Oracle:Exile all permanents. For as long as any of those cards remain exiled, at the beginning of each player's upkeep, that player returns one of the exiled cards they own to the battlefield.

View File

@@ -7,6 +7,6 @@ T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigReveal | TriggerDescript
SVar:TrigReveal:DB$ RevealHand | ValidTgts$ Opponent | RememberRevealed$ True | SubAbility$ DBChoose SVar:TrigReveal:DB$ RevealHand | ValidTgts$ Opponent | RememberRevealed$ True | SubAbility$ DBChoose
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Card.IsRemembered+cmcLE3+nonLand | ChoiceZone$ Hand | Amount$ 1 | Mandatory$ True | ChoiceTitle$ Choose a nonland card with mana value 3 or less | ForgetChosen$ True | SubAbility$ DBChoose2 SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Card.IsRemembered+cmcLE3+nonLand | ChoiceZone$ Hand | Amount$ 1 | Mandatory$ True | ChoiceTitle$ Choose a nonland card with mana value 3 or less | ForgetChosen$ True | SubAbility$ DBChoose2
SVar:DBChoose2:DB$ ChooseCard | Defined$ You | Choices$ Card.IsRemembered+cmcGE4 | ChoiceZone$ Hand | Amount$ 1 | Mandatory$ True | ChoiceTitle$ Choose a card with mana value 4 or greater | ForgetChosen$ True | SubAbility$ DBDiscard SVar:DBChoose2:DB$ ChooseCard | Defined$ You | Choices$ Card.IsRemembered+cmcGE4 | ChoiceZone$ Hand | Amount$ 1 | Mandatory$ True | ChoiceTitle$ Choose a card with mana value 4 or greater | ForgetChosen$ True | SubAbility$ DBDiscard
SVar:DBDiscard:DB$ Discard | Mode$ Defined | DefinedCards$ ValidHand Card.IsNotRemembered | Defined$ Targeted | SubAbility$ DBCleanup SVar:DBDiscard:DB$ Discard | Mode$ NotRemembered | Defined$ Targeted | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Emerge {5}{B}{B} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's mana value.)\nWhen you cast this spell, target opponent reveals their hand. You choose from it a nonland card with mana value 3 or less and a card with mana value 4 or greater. That player discards those cards. Oracle:Emerge {5}{B}{B} (You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's mana value.)\nWhen you cast this spell, target opponent reveals their hand. You choose from it a nonland card with mana value 3 or less and a card with mana value 4 or greater. That player discards those cards.

View File

@@ -5,7 +5,7 @@ PT:1/2
K:Start your engines K:Start your engines
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature enters, create a 2/2 black Zombie creature token. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature enters, create a 2/2 black Zombie creature token.
SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ DiesTrig | Description$ Max speed — Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ DiesTrig | Description$ Max speed — Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life.
SVar:DiesTrig:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | Secondary$ True | TriggerDescription$ Max speed — Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life. SVar:DiesTrig:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | Secondary$ True | TriggerDescription$ Max speed — Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life.
SVar:TrigLoseLife:DB$ LoseLife | Defined$ Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife SVar:TrigLoseLife:DB$ LoseLife | Defined$ Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife
SVar:DBGainLife:DB$ GainLife | LifeAmount$ 1 SVar:DBGainLife:DB$ GainLife | LifeAmount$ 1

View File

@@ -3,6 +3,6 @@ ManaCost:1 R
Types:Creature Human Warrior Types:Creature Human Warrior
PT:3/1 PT:3/1
K:Start your engines K:Start your engines
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABMana | Description$ Max speed — {T}: Add {R}{R}. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABMana | Description$ Max speed — {T}: Add {R}{R}.
SVar:ABMana:AB$ Mana | PrecostDesc$ Max speed — | Cost$ T | Produced$ R R | Secondary$ True | SpellDescription$ Add {R}{R}. SVar:ABMana:AB$ Mana | PrecostDesc$ Max speed — | Cost$ T | Produced$ R R | Secondary$ True | SpellDescription$ Add {R}{R}.
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — {T}: Add {R}{R}. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — {T}: Add {R}{R}.

View File

@@ -4,7 +4,7 @@ Types:Creature Human Mercenary
PT:3/4 PT:3/4
K:Reach K:Reach
K:Start your engines K:Start your engines
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ PhaseTrig | Description$ Max speed — At the beginning of your upkeep, exile the top card of your library. You may play that card this turn. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ PhaseTrig | Description$ Max speed — At the beginning of your upkeep, exile the top card of your library. You may play that card this turn.
SVar:PhaseTrig:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | ValidPlayer$ You | Secondary$ True | Execute$ TrigExile | TriggerDescription$ Max speed — At the beginning of your upkeep, exile the top card of your library. You may play that card this turn. SVar:PhaseTrig:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | ValidPlayer$ You | Secondary$ True | Execute$ TrigExile | TriggerDescription$ Max speed — At the beginning of your upkeep, exile the top card of your library. You may play that card this turn.
SVar:TrigExile:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect 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:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | SubAbility$ DBCleanup | ExileOnMoved$ Exile

View File

@@ -5,7 +5,7 @@ PT:4/5
K:Start your engines K:Start your engines
T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, NICKNAME deals 1 damage to each opponent. T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, NICKNAME deals 1 damage to each opponent.
SVar:TrigDamage:DB$ DealDamage | NumDmg$ 1 | Defined$ Opponent SVar:TrigDamage:DB$ DealDamage | NumDmg$ 1 | Defined$ Opponent
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddReplacementEffect$ DamageRep | Description$ Max speed — If a source you control would deal damage to an opponent or a permanent an opponent controls, it deals that much damage plus 1 instead. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddReplacementEffect$ DamageRep | Description$ Max speed — If a source you control would deal damage to an opponent or a permanent an opponent controls, it deals that much damage plus 1 instead.
SVar:DamageRep:Event$ DamageDone | MaxSpeed$ True | ActiveZones$ Battlefield | ValidSource$ Card.YouCtrl | ValidTarget$ Player.Opponent,Permanent.OppCtrl | ReplaceWith$ DmgPlus | Secondary$ True | Description$ Max speed — If a source you control would deal damage to an opponent or a permanent an opponent controls, it deals that much damage plus 1 instead. SVar:DamageRep:Event$ DamageDone | MaxSpeed$ True | ActiveZones$ Battlefield | ValidSource$ Card.YouCtrl | ValidTarget$ Player.Opponent,Permanent.OppCtrl | ReplaceWith$ DmgPlus | Secondary$ True | Description$ Max speed — If a source you control would deal damage to an opponent or a permanent an opponent controls, it deals that much damage plus 1 instead.
SVar:DmgPlus:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ ReplaceCount$DamageAmount/Plus.1 SVar:DmgPlus:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ ReplaceCount$DamageAmount/Plus.1
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nWhenever you attack, Far Fortune deals 1 damage to each opponent.\nMax speed — If a source you control would deal damage to an opponent or a permanent an opponent controls, it deals that much damage plus 1 instead. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nWhenever you attack, Far Fortune deals 1 damage to each opponent.\nMax speed — If a source you control would deal damage to an opponent or a permanent an opponent controls, it deals that much damage plus 1 instead.

View File

@@ -1,7 +1,8 @@
Name:Fossil Find Name:Fossil Find
ManaCost:RG ManaCost:RG
Types:Sorcery Types:Sorcery
A:SP$ ChangeZone | Hidden$ True | AtRandom$ True | Origin$ Graveyard | Destination$ Hand | SubAbility$ DBReorder | SpellDescription$ Return a card at random from your graveyard to your hand, then reorder your graveyard as you choose. A:SP$ ChooseCard | Choices$ Card.YouOwn | ChoiceZone$ Graveyard | AtRandom$ True | Amount$ 1 | SubAbility$ DBReturn | SpellDescription$ Return a card at random from your graveyard to your hand, then reorder your graveyard as you choose.
SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ ChosenCard | SubAbility$ DBReorder
SVar:DBReorder:DB$ ReorderZone | Zone$ Graveyard | Defined$ You SVar:DBReorder:DB$ ReorderZone | Zone$ Graveyard | Defined$ You
AI:RemoveDeck:All AI:RemoveDeck:All
Oracle:Return a card at random from your graveyard to your hand, then reorder your graveyard as you choose. Oracle:Return a card at random from your graveyard to your hand, then reorder your graveyard as you choose.

View File

@@ -5,7 +5,7 @@ PT:2/1
K:Start your engines K:Start your engines
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated | ReplaceWith$ ETBTapped | Description$ This creature enters tapped. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated | ReplaceWith$ ETBTapped | Description$ This creature enters tapped.
SVar:ETBTapped:DB$ Tap | Defined$ Self | ETB$ True SVar:ETBTapped:DB$ Tap | Defined$ Self | ETB$ True
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {B}, Sacrifice another creature or Vehicle: Draw a card. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {B}, Sacrifice another creature or Vehicle: Draw a card.
SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ B Sac<1/Vehicle.Other;Creature.Other/another creature or Vehicle> | Secondary$ True | SpellDescription$ Draw a card. SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ B Sac<1/Vehicle.Other;Creature.Other/another creature or Vehicle> | Secondary$ True | SpellDescription$ Draw a card.
DeckHas:Ability$Sacrifice DeckHas:Ability$Sacrifice
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nThis creature enters tapped.\nMax speed — {B}, Sacrifice another creature or Vehicle: Draw a card. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nThis creature enters tapped.\nMax speed — {B}, Sacrifice another creature or Vehicle: Draw a card.

View File

@@ -5,6 +5,6 @@ PT:2/1
K:Start your engines K:Start your engines
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When this creature enters, target opponent reveals their hand. You choose an instant or sorcery card from it. That player discards that card. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When this creature enters, target opponent reveals their hand. You choose an instant or sorcery card from it. That player discards that card.
SVar:TrigDiscard:DB$ Discard | ValidTgts$ Opponent | NumCards$ 1 | Mode$ RevealYouChoose | DiscardValid$ Instant,Sorcery SVar:TrigDiscard:DB$ Discard | ValidTgts$ Opponent | NumCards$ 1 | Mode$ RevealYouChoose | DiscardValid$ Instant,Sorcery
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature gets +1/+1 and has menace. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature gets +1/+1 and has menace.
SVar:MaxSpeedStatic:Mode$ Continuous | Secondary$ True | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Menace | Description$ Max speed — This creature gets +1/+1 and has menace. SVar:MaxSpeedStatic:Mode$ Continuous | Secondary$ True | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Menace | Description$ Max speed — This creature gets +1/+1 and has menace.
Oracle:Start your engines!\nWhen this creature enters, target opponent reveals their hand. You choose an instant or sorcery card from it. That player discards that card.\nMax speed — This creature gets +1/+1 and has menace. Oracle:Start your engines!\nWhen this creature enters, target opponent reveals their hand. You choose an instant or sorcery card from it. That player discards that card.\nMax speed — This creature gets +1/+1 and has menace.

View File

@@ -6,7 +6,7 @@ K:Start your engines
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When this creature enters, it deals 1 damage to target opponent and you gain 1 life. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When this creature enters, it deals 1 damage to target opponent and you gain 1 life.
SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | NumDmg$ 1 | SubAbility$ DBGainLife SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | NumDmg$ 1 | SubAbility$ DBGainLife
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature has deathtouch and haste. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature has deathtouch and haste.
SVar:MaxSpeedStatic:Mode$ Continuous | Secondary$ True | Affected$ Card.Self | AddKeyword$ Deathtouch & Haste | Description$ Max speed — This creature has deathtouch and haste. SVar:MaxSpeedStatic:Mode$ Continuous | Secondary$ True | Affected$ Card.Self | AddKeyword$ Deathtouch & Haste | Description$ Max speed — This creature has deathtouch and haste.
DeckHas:Ability$LifeGain DeckHas:Ability$LifeGain
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nWhen this creature enters, it deals 1 damage to target opponent and you gain 1 life.\nMax speed — This creature has deathtouch and haste. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nWhen this creature enters, it deals 1 damage to target opponent and you gain 1 life.\nMax speed — This creature has deathtouch and haste.

View File

@@ -4,6 +4,6 @@ Types:Creature Spirit Scout
PT:2/2 PT:2/2
K:Flying K:Flying
K:Start your engines K:Start your engines
S:Mode$ Continuous | EffectZone$ Graveyard | AffectedZone$ Graveyard | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {3}, Exile this card from your graveyard: Draw a card. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {3}, Exile this card from your graveyard: Draw a card.
SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ 3 ExileFromGrave<1/CARDNAME/this card> | ActivationZone$ Graveyard | Secondary$ True | SpellDescription$ Draw a card. SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ 3 ExileFromGrave<1/CARDNAME/this card> | ActivationZone$ Graveyard | Secondary$ True | SpellDescription$ Draw a card.
Oracle:Flying\nStart your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — {3}, Exile this card from your graveyard: Draw a card. Oracle:Flying\nStart your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — {3}, Exile this card from your graveyard: Draw a card.

View File

@@ -4,6 +4,6 @@ Types:Creature Goblin Scout
PT:3/2 PT:3/2
K:Trample K:Trample
K:Start your engines K:Start your engines
S:Mode$ Continuous | EffectZone$ Graveyard | AffectedZone$ Graveyard | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {3}, Exile this card from your graveyard: Draw a card. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {3}, Exile this card from your graveyard: Draw a card.
SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ 3 ExileFromGrave<1/CARDNAME/this card> | ActivationZone$ Graveyard | Secondary$ True | SpellDescription$ Draw a card. SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ 3 ExileFromGrave<1/CARDNAME/this card> | ActivationZone$ Graveyard | Secondary$ True | SpellDescription$ Draw a card.
Oracle:Trample\nStart your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — {3}, Exile this card from your graveyard: Draw a card. Oracle:Trample\nStart your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — {3}, Exile this card from your graveyard: Draw a card.

View File

@@ -8,7 +8,7 @@ SVar:TrigChooseCard:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creatur
SVar:DBDraw:DB$ Draw | NumCards$ AffectedX | SubAbility$ DBCleanup SVar:DBDraw:DB$ Draw | NumCards$ AffectedX | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
SVar:X:PlayerCountOpponents$HighestCounters.Poison SVar:X:PlayerCountOpponents$HighestCounters.Poison
SVar:AffectedX:ChosenCard$TotalValue Toxic SVar:AffectedX:Count$Valid Card.ChosenCard$TotalValue Toxic
DeckHas:Ability$Token & Type$Beast|Phyrexian DeckHas:Ability$Token & Type$Beast|Phyrexian
DeckHints:Keyword$Toxic|Infect DeckHints:Keyword$Toxic|Infect
Oracle:When Goliath Hatchery enters, create two 3/3 green Phyrexian Beast creature tokens with toxic 1. (Players dealt combat damage by them also get a poison counter.)\nCorrupted — At the beginning of your upkeep, if an opponent has three or more poison counters, choose a creature you control, then draw cards equal to its total toxic value. Oracle:When Goliath Hatchery enters, create two 3/3 green Phyrexian Beast creature tokens with toxic 1. (Players dealt combat damage by them also get a poison counter.)\nCorrupted — At the beginning of your upkeep, if an opponent has three or more poison counters, choose a creature you control, then draw cards equal to its total toxic value.

View File

@@ -9,6 +9,7 @@ SVar:Y:SVar$X/Times.2
K:Deathtouch K:Deathtouch
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ Whenever CARDNAME attacks or dies, choose a card at random exiled with NICKNAME and put that card into its owner's hand. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ Whenever CARDNAME attacks or dies, choose a card at random exiled with NICKNAME and put that card into its owner's hand.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChoose | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or dies, choose a card at random exiled with NICKNAME and put that card into its owner's hand. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChoose | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or dies, choose a card at random exiled with NICKNAME and put that card into its owner's hand.
SVar:TrigChoose:DB$ ChangeZone | AtRandom$ True | ChangeType$ Card.ExiledWithSource | Origin$ Exile | Destination$ Hand | Hidden$ True SVar:TrigChoose:DB$ ChooseCard | Amount$ 1 | AtRandom$ True | Choices$ Card.ExiledWithSource | ChoiceZone$ Exile | SubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Hand | Hidden$ True
DeckHas:Ability$Graveyard DeckHas:Ability$Graveyard
Oracle:As an additional cost to cast this spell, you may exile any number of creature cards from your graveyard. This spell costs {2} less to cast for each card exiled this way.\nDeathtouch\nWhenever Gorex, the Tombshell attacks or dies, choose a card at random exiled with Gorex and put that card into its owner's hand. Oracle:As an additional cost to cast this spell, you may exile any number of creature cards from your graveyard. This spell costs {2} less to cast for each card exiled this way.\nDeathtouch\nWhenever Gorex, the Tombshell attacks or dies, choose a card at random exiled with Gorex and put that card into its owner's hand.

View File

@@ -4,7 +4,7 @@ Types:Enchantment
K:Start your engines K:Start your engines
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this enchantment enters, create a 2/2 black Zombie creature token. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this enchantment enters, create a 2/2 black Zombie creature token.
SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABTutor | Description$ Max speed — {1}{B}, Sacrifice this enchantment: Search your library for a card, put it into your hand, then shuffle. Activate only as a sorcery. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABTutor | Description$ Max speed — {1}{B}, Sacrifice this enchantment: Search your library for a card, put it into your hand, then shuffle. Activate only as a sorcery.
SVar:ABTutor:AB$ ChangeZone | PrecostDesc$ Max speed — | Cost$ 1 B Sac<1/CARDNAME/this enchantment> | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | SorcerySpeed$ True | Secondary$ True | SpellDescription$ Search your library for a card, put it into your hand, then shuffle. Activate only as a sorcery. SVar:ABTutor:AB$ ChangeZone | PrecostDesc$ Max speed — | Cost$ 1 B Sac<1/CARDNAME/this enchantment> | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | SorcerySpeed$ True | Secondary$ True | SpellDescription$ Search your library for a card, put it into your hand, then shuffle. Activate only as a sorcery.
DeckHas:Ability$Token|Sacrifice DeckHas:Ability$Token|Sacrifice
Oracle:Start your engines!\nWhen this enchantment enters, create a 2/2 black Zombie creature token.\nMax speed — {1}{B}, Sacrifice this enchantment: Search your library for a card, put it into your hand, then shuffle. Activate only as a sorcery. Oracle:Start your engines!\nWhen this enchantment enters, create a 2/2 black Zombie creature token.\nMax speed — {1}{B}, Sacrifice this enchantment: Search your library for a card, put it into your hand, then shuffle. Activate only as a sorcery.

View File

@@ -9,7 +9,7 @@ SVar:TrigToken:DB$ Token | TokenScript$ r_1_1_goblin | RememberTokens$ True | Su
SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ MustAttack | Duration$ UntilEndOfCombat | SubAbility$ DBCleanup SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ MustAttack | Duration$ UntilEndOfCombat | SubAbility$ DBCleanup
SVar:MustAttack:Mode$ MustAttack | ValidCreature$ Card.IsRemembered | Description$ This creature attacks this combat if able. SVar:MustAttack:Mode$ MustAttack | ValidCreature$ Card.IsRemembered | Description$ This creature attacks this combat if able.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABMana | Description$ Max speed — {T}: Add {R} for each Goblin you control. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABMana | Description$ Max speed — {T}: Add {R} for each Goblin you control.
SVar:ABMana:AB$ Mana | PrecostDesc$ Max speed — | Cost$ T | Secondary$ True | Produced$ R | Amount$ Count$Valid Goblin.YouCtrl | SpellDescription$ Add {R} for each Goblin you control. SVar:ABMana:AB$ Mana | PrecostDesc$ Max speed — | Cost$ T | Secondary$ True | Produced$ R | Amount$ Count$Valid Goblin.YouCtrl | SpellDescription$ Add {R} for each Goblin you control.
DeckHas:Ability$Token DeckHas:Ability$Token
DeckHints:Type$Goblin DeckHints:Type$Goblin

View File

@@ -4,7 +4,7 @@ Types:Enchantment
K:Start your engines K:Start your engines
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When this enchantment enters, you may discard a card. If you do, draw two cards. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When this enchantment enters, you may discard a card. If you do, draw two cards.
SVar:TrigDraw:AB$ Draw | Cost$ Discard<1/Card> | NumCards$ 2 SVar:TrigDraw:AB$ Draw | Cost$ Discard<1/Card> | NumCards$ 2
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABPumpAll | Description$ Max speed — Sacrifice this enchantment: Creatures and Vehicles you control gain haste until end of turn. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABPumpAll | Description$ Max speed — Sacrifice this enchantment: Creatures and Vehicles you control gain haste until end of turn.
SVar:ABPumpAll:AB$ PumpAll | PrecostDesc$ Max speed — | Cost$ Sac<1/CARDNAME/this enchantment> | Secondary$ True | ValidCards$ Creature.YouCtrl,Vehicle.YouCtrl | KW$ Haste | SpellDescription$ Creatures and Vehicles you control gain haste until end of turn. SVar:ABPumpAll:AB$ PumpAll | PrecostDesc$ Max speed — | Cost$ Sac<1/CARDNAME/this enchantment> | Secondary$ True | ValidCards$ Creature.YouCtrl,Vehicle.YouCtrl | KW$ Haste | SpellDescription$ Creatures and Vehicles you control gain haste until end of turn.
DeckHas:Ability$Discard|Sacrifice DeckHas:Ability$Discard|Sacrifice
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nWhen this enchantment enters, you may discard a card. If you do, draw two cards.\nMax speed — Sacrifice this enchantment: Creatures and Vehicles you control gain haste until end of turn. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nWhen this enchantment enters, you may discard a card. If you do, draw two cards.\nMax speed — Sacrifice this enchantment: Creatures and Vehicles you control gain haste until end of turn.

View File

@@ -1,7 +1,7 @@
Name:Last Night Together Name:Last Night Together
ManaCost:3 R G ManaCost:3 R G
Types:Sorcery Types:Sorcery
A:SP$ ChooseCard | ValidTgts$ Creature | TgtPrompt$ Choose two target creatures | TargetMin$ 2 | TargetMax$ 2 | Amount$ 2 | Defined$ You | DefinedCards$ Targeted | SubAbility$ DBUntap | SpellDescription$ Choose two target creatures. A:SP$ ChooseCard | ValidTgts$ Creature | TgtPrompt$ Choose two target creatures | TargetMin$ 2 | TargetMax$ 2 | Amount$ 2 | Defined$ You | DefinedCards$ Targeted | AtRandom$ True | SubAbility$ DBUntap | SpellDescription$ Choose two target creatures.
SVar:DBUntap:DB$ Untap | Defined$ Targeted | SubAbility$ DBPutCounter | SpellDescription$ Untap them. SVar:DBUntap:DB$ Untap | Defined$ Targeted | SubAbility$ DBPutCounter | SpellDescription$ Untap them.
SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBPump | SpellDescription$ Put two +1/+1 counters on each of them. SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBPump | SpellDescription$ Put two +1/+1 counters on each of them.
SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Vigilance & Indestructible & Haste | SubAbility$ DBAddCombat | SpellDescription$ They gain vigilance, indestructible, and haste until end of turn. SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Vigilance & Indestructible & Haste | SubAbility$ DBAddCombat | SpellDescription$ They gain vigilance, indestructible, and haste until end of turn.

View File

@@ -4,6 +4,6 @@ Types:Creature Cat Scout
PT:2/2 PT:2/2
K:Start your engines K:Start your engines
S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ First Strike | Condition$ PlayerTurn | Description$ During your turn, this creature has first strike. S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ First Strike | Condition$ PlayerTurn | Description$ During your turn, this creature has first strike.
S:Mode$ Continuous | EffectZone$ Graveyard | AffectedZone$ Graveyard | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {3}, Exile this card from your graveyard: Draw a card. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {3}, Exile this card from your graveyard: Draw a card.
SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ 3 ExileFromGrave<1/CARDNAME/this card> | ActivationZone$ Graveyard | Secondary$ True | SpellDescription$ Draw a card. SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ 3 ExileFromGrave<1/CARDNAME/this card> | ActivationZone$ Graveyard | Secondary$ True | SpellDescription$ Draw a card.
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nDuring your turn, this creature has first strike.\nMax speed — {3}, Exile this card from your graveyard: Draw a card. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nDuring your turn, this creature has first strike.\nMax speed — {3}, Exile this card from your graveyard: Draw a card.

View File

@@ -5,7 +5,7 @@ K:Enchant creature or Vehicle
A:SP$ Attach | ValidTgts$ Creature,Vehicle | TgtPrompt$ Select target creature or Vehicle | AILogic$ Pump A:SP$ Attach | ValidTgts$ Creature,Vehicle | TgtPrompt$ Select target creature or Vehicle | AILogic$ Pump
K:Start your engines K:Start your engines
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Vigilance | Description$ Enchanted permanent gets +1/+1 and has vigilance. S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Vigilance | Description$ Enchanted permanent gets +1/+1 and has vigilance.
S:Mode$ Continuous | EffectZone$ Graveyard | AffectedZone$ Graveyard | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — You may cast this card from your graveyard. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — You may cast this card from your graveyard.
SVar:MaxSpeedStatic:Mode$ Continuous | Affected$ Card.Self | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlay$ True | Secondary$ True | Description$ Max speed — You may cast this card from your graveyard. SVar:MaxSpeedStatic:Mode$ Continuous | Affected$ Card.Self | AffectedZone$ Graveyard | EffectZone$ Graveyard | MayPlay$ True | Secondary$ True | Description$ Max speed — You may cast this card from your graveyard.
SVar:DiscardMe:2 SVar:DiscardMe:2
DeckHints:Ability$Discard DeckHints:Ability$Discard

View File

@@ -3,6 +3,6 @@ ManaCost:2 G
Types:Creature Elephant Scout Types:Creature Elephant Scout
PT:3/3 PT:3/3
K:Start your engines K:Start your engines
S:Mode$ Continuous | EffectZone$ Graveyard | AffectedZone$ Graveyard | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {3}, Exile this card from your graveyard: Draw a card. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {3}, Exile this card from your graveyard: Draw a card.
SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ 3 ExileFromGrave<1/CARDNAME/this card> | ActivationZone$ Graveyard | Secondary$ True | SpellDescription$ Draw a card. SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ 3 ExileFromGrave<1/CARDNAME/this card> | ActivationZone$ Graveyard | Secondary$ True | SpellDescription$ Draw a card.
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — {3}, Exile this card from your graveyard: Draw a card. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — {3}, Exile this card from your graveyard: Draw a card.

View File

@@ -5,7 +5,7 @@ PT:*/3
S:Mode$ Continuous | CharacteristicDefining$ True | SetPower$ X | Description$ NICKNAME's power is equal to the number of artifacts you control. S:Mode$ Continuous | CharacteristicDefining$ True | SetPower$ X | Description$ NICKNAME's power is equal to the number of artifacts you control.
SVar:X:Count$Valid Artifact.YouCtrl SVar:X:Count$Valid Artifact.YouCtrl
K:Start your engines K:Start your engines
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ CastTrig | Description$ Max speed — Whenever you cast an artifact spell, you may pay {1}. If you do, copy it. (The copy becomes a token.) S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ CastTrig | Description$ Max speed — Whenever you cast an artifact spell, you may pay {1}. If you do, copy it. (The copy becomes a token.)
SVar:CastTrig:Mode$ SpellCast | ValidCard$ Artifact | ValidActivatingPlayer$ You | Execute$ TrigCopy | OptionalDecider$ You | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Max speed — Whenever you cast an artifact spell, you may pay {1}. If you do, copy it. (The copy becomes a token.) SVar:CastTrig:Mode$ SpellCast | ValidCard$ Artifact | ValidActivatingPlayer$ You | Execute$ TrigCopy | OptionalDecider$ You | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Max speed — Whenever you cast an artifact spell, you may pay {1}. If you do, copy it. (The copy becomes a token.)
SVar:TrigCopy:AB$ CopySpellAbility | Cost$ 1 | Defined$ TriggeredSpellAbility | Amount$ 1 SVar:TrigCopy:AB$ CopySpellAbility | Cost$ 1 | Defined$ TriggeredSpellAbility | Amount$ 1
DeckHints:Type$Artifact DeckHints:Type$Artifact

View File

@@ -1,6 +1,7 @@
Name:Monomania Name:Monomania
ManaCost:3 B B ManaCost:3 B B
Types:Sorcery Types:Sorcery
A:SP$ ChooseCard | ValidTgts$ Player | Mandatory$ True | Choices$ Card | SubAbility$ DBDiscard | AILogic$ AtLeast2 | TargetControls$ True | ChoiceZone$ Hand | StackDescription$ SpellDescription | SpellDescription$ Target player chooses a card in their hand and discards the rest. A:SP$ ChooseCard | ValidTgts$ Player | Mandatory$ True | Choices$ Card | SubAbility$ DBDiscard | RememberChosen$ True | AILogic$ AtLeast2 | TargetControls$ True | ChoiceZone$ Hand | SpellDescription$ Target player chooses a card in their hand and discards the rest.
SVar:DBDiscard:DB$ Discard | Defined$ Targeted | Mode$ Defined | DefinedCards$ ValidHand Card.!ChosenCard SVar:DBDiscard:DB$ Discard | Defined$ Targeted | Mode$ NotRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Target player chooses a card in their hand and discards the rest. Oracle:Target player chooses a card in their hand and discards the rest.

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land Types:Land
K:Start your engines K:Start your engines
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABMana | Description$ Max speed — {T}: Add {C}{C}. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABMana | Description$ Max speed — {T}: Add {C}{C}.
SVar:ABMana:AB$ Mana | PrecostDesc$ Max speed — | Cost$ T | Produced$ C | Amount$ 2 | Secondary$ True | SpellDescription$ Add {C}{C}. SVar:ABMana:AB$ Mana | PrecostDesc$ Max speed — | Cost$ T | Produced$ C | Amount$ 2 | Secondary$ True | SpellDescription$ Add {C}{C}.
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\n{T}: Add {C}.\nMax speed — {T}: Add {C}{C}. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\n{T}: Add {C}.\nMax speed — {T}: Add {C}{C}.

View File

@@ -4,6 +4,6 @@ Types:Creature Mutant Scout
PT:2/3 PT:2/3
K:Start your engines K:Start your engines
A:AB$ Pump | Cost$ 2 | Defined$ Self | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ This creature gets +1/+1 until end of turn. A:AB$ Pump | Cost$ 2 | Defined$ Self | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ This creature gets +1/+1 until end of turn.
S:Mode$ Continuous | EffectZone$ Graveyard | AffectedZone$ Graveyard | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {3}, Exile this card from your graveyard: Draw a card. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {3}, Exile this card from your graveyard: Draw a card.
SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ 3 ExileFromGrave<1/CARDNAME/this card> | ActivationZone$ Graveyard | Secondary$ True | SpellDescription$ Draw a card. SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ 3 ExileFromGrave<1/CARDNAME/this card> | ActivationZone$ Graveyard | Secondary$ True | SpellDescription$ Draw a card.
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\n{2}: This creature gets +1/+1 until end of turn.\nMax speed — {3}, Exile this card from your graveyard: Draw a card. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\n{2}: This creature gets +1/+1 until end of turn.\nMax speed — {3}, Exile this card from your graveyard: Draw a card.

View File

@@ -5,7 +5,7 @@ PT:1/1
K:Start your engines K:Start your engines
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature dies, create a 1/1 colorless Servo artifact creature token. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When this creature dies, create a 1/1 colorless Servo artifact creature token.
SVar:TrigToken:DB$ Token | TokenScript$ c_1_1_a_servo SVar:TrigToken:DB$ Token | TokenScript$ c_1_1_a_servo
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature gets +1/+0. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature gets +1/+0.
SVar:MaxSpeedStatic:Mode$ Continuous | Secondary$ True | Affected$ Card.Self | AddPower$ 1 | Description$ Max speed — This creature gets +1/+0. SVar:MaxSpeedStatic:Mode$ Continuous | Secondary$ True | Affected$ Card.Self | AddPower$ 1 | Description$ Max speed — This creature gets +1/+0.
DeckHas:Ability$Token DeckHas:Ability$Token
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nWhen this creature dies, create a 1/1 colorless Servo artifact creature token.\nMax speed — This creature gets +1/+0. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nWhen this creature dies, create a 1/1 colorless Servo artifact creature token.\nMax speed — This creature gets +1/+0.

View File

@@ -2,6 +2,7 @@ Name:Pay No Heed
ManaCost:W ManaCost:W
Types:Instant Types:Instant
A:SP$ ChooseSource | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ Prevent all damage a source of your choice would deal this turn. A:SP$ ChooseSource | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ Prevent all damage a source of your choice would deal this turn.
SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem
SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCardStrict,Emblem.ChosenCard | Prevent$ True | Description$ Prevent all damage the source would deal this turn. SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCardStrict,Emblem.ChosenCard | Prevent$ True | Description$ Prevent all damage the source would deal this turn.
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
Oracle:Prevent all damage a source of your choice would deal this turn. Oracle:Prevent all damage a source of your choice would deal this turn.

View File

@@ -4,7 +4,7 @@ Types:Artifact
K:Start your engines K:Start your engines
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this artifact enters, exile target nonland permanent an opponent controls until this artifact leaves the battlefield. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this artifact enters, exile target nonland permanent an opponent controls until this artifact leaves the battlefield.
SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | Duration$ UntilHostLeavesPlay SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | Duration$ UntilHostLeavesPlay
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABPutCounter | Description$ Max speed — {T}: Put a +1/+1 counter on target creature or Vehicle you control. Activate only as a sorcery. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABPutCounter | Description$ Max speed — {T}: Put a +1/+1 counter on target creature or Vehicle you control. Activate only as a sorcery.
SVar:ABPutCounter:AB$ PutCounter | PrecostDesc$ Max speed — | Cost$ T | Secondary$ True | ValidTgts$ Creature.YouCtrl,Vehicle.YouCtrl | TgtPrompt$ Select target creature or Vehicle | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SpellDescription$ Put a +1/+1 counter on target creature or Vehicle you control. Activate only as a sorcery. SVar:ABPutCounter:AB$ PutCounter | PrecostDesc$ Max speed — | Cost$ T | Secondary$ True | ValidTgts$ Creature.YouCtrl,Vehicle.YouCtrl | TgtPrompt$ Select target creature or Vehicle | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SpellDescription$ Put a +1/+1 counter on target creature or Vehicle you control. Activate only as a sorcery.
SVar:PlayMain1:TRUE SVar:PlayMain1:TRUE
DeckHas:Ability$Counters DeckHas:Ability$Counters

View File

@@ -3,8 +3,9 @@ ManaCost:2 U
Types:Instant Types:Instant
K:Strive:1 U K:Strive:1 U
A:SP$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature | Mandatory$ True | SubAbility$ Pump4Tgt | AILogic$ Clone | SpellDescription$ Choose a creature on the battlefield. Any number of target creatures you control each become a copy of that creature until end of turn. A:SP$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature | Mandatory$ True | SubAbility$ Pump4Tgt | AILogic$ Clone | SpellDescription$ Choose a creature on the battlefield. Any number of target creatures you control each become a copy of that creature until end of turn.
SVar:Pump4Tgt:DB$ RepeatEach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | TargetMin$ 0 | TargetMax$ MaxTargets | DefinedCards$ Targeted | RepeatSubAbility$ ShapeTgt SVar:Pump4Tgt:DB$ RepeatEach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | TargetMin$ 0 | TargetMax$ MaxTargets | DefinedCards$ Targeted | RepeatSubAbility$ ShapeTgt | SubAbility$ DBCleanup
SVar:ShapeTgt:DB$ Clone | Defined$ ChosenCard | CloneTarget$ Remembered | Duration$ UntilEndOfTurn SVar:ShapeTgt:DB$ Clone | Defined$ ChosenCard | CloneTarget$ Remembered | Duration$ UntilEndOfTurn
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
SVar:MaxTargets:Count$Valid Creature.YouCtrl SVar:MaxTargets:Count$Valid Creature.YouCtrl
AI:RemoveDeck:All AI:RemoveDeck:All
Oracle:Strive — This spell costs {1}{U} more to cast for each target beyond the first.\nChoose a creature on the battlefield. Any number of target creatures you control each become a copy of that creature until end of turn. Oracle:Strive — This spell costs {1}{U} more to cast for each target beyond the first.\nChoose a creature on the battlefield. Any number of target creatures you control each become a copy of that creature until end of turn.

View File

@@ -4,7 +4,7 @@ Types:Creature Zombie Cat Warrior
PT:2/5 PT:2/5
K:Vigilance K:Vigilance
K:Start your engines K:Start your engines
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ PhaseTrig | Description$ Max speed — At the beginning of combat on your turn, target creature or Vehicle you control gains double strike until end of turn. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ PhaseTrig | Description$ Max speed — At the beginning of combat on your turn, target creature or Vehicle you control gains double strike until end of turn.
SVar:PhaseTrig:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Max speed — At the beginning of combat on your turn, target creature or Vehicle you control gains double strike until end of turn. SVar:PhaseTrig:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Max speed — At the beginning of combat on your turn, target creature or Vehicle you control gains double strike until end of turn.
SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.YouCtrl,Vehicle.YouCtrl | TgtPrompt$ Select target creature or Vehicle | KW$ Double Strike SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.YouCtrl,Vehicle.YouCtrl | TgtPrompt$ Select target creature or Vehicle | KW$ Double Strike
SVar:PlayMain1:TRUE SVar:PlayMain1:TRUE

View File

@@ -2,8 +2,11 @@ Name:Purgatory
ManaCost:2 W B ManaCost:2 W B
Types:Enchantment Types:Enchantment
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+YouOwn | Execute$ TrigChangeZone | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature is put into your graveyard from the battlefield, exile that card. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+YouOwn | Execute$ TrigChangeZone | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature is put into your graveyard from the battlefield, exile that card.
SVar:TrigChangeZone:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Exile SVar:TrigChangeZone:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ At the beginning of your upkeep, you may pay {4} and 2 life. If you do, return a card exiled with CARDNAME to the battlefield. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ At the beginning of your upkeep, you may pay {4} and 2 life. If you do, return a card exiled with CARDNAME to the battlefield.
SVar:TrigReturn:AB$ ChangeZone | Cost$ 4 PayLife<2> | ChangeType$ Card.ExiledWithSource | Mandatory$ True | Origin$ Exile | Destination$ Battlefield | Hidden$ True SVar:TrigReturn:AB$ ChooseCard | Cost$ 4 PayLife<2> | Defined$ You | Amount$ 1 | Choices$ Card.IsRemembered | ChoiceZone$ Exile | SubAbility$ DBChange
SVar:DBChange:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ForgetChanged$ True | Hidden$ True
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:NonStackingEffect:True SVar:NonStackingEffect:True
Oracle:Whenever a nontoken creature is put into your graveyard from the battlefield, exile that card.\nAt the beginning of your upkeep, you may pay {4} and 2 life. If you do, return a card exiled with Purgatory to the battlefield. Oracle:Whenever a nontoken creature is put into your graveyard from the battlefield, exile that card.\nAt the beginning of your upkeep, you may pay {4} and 2 life. If you do, return a card exiled with Purgatory to the battlefield.

View File

@@ -5,7 +5,7 @@ K:Start your engines
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When this artifact enters, draw two cards, then discard a card. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When this artifact enters, draw two cards, then discard a card.
SVar:TrigDraw:DB$ Draw | NumCards$ 2 | SubAbility$ DBDiscard SVar:TrigDraw:DB$ Draw | NumCards$ 2 | SubAbility$ DBDiscard
SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — Spells you cast cost {1} less to cast. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — Spells you cast cost {1} less to cast.
SVar:MaxSpeedStatic:Mode$ ReduceCost | Secondary$ True | ValidCard$ Card | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Max speed — Spells you cast cost {1} less to cast. SVar:MaxSpeedStatic:Mode$ ReduceCost | Secondary$ True | ValidCard$ Card | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Max speed — Spells you cast cost {1} less to cast.
DeckHas:Ability$Discard DeckHas:Ability$Discard
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nWhen this artifact enters, draw two cards, then discard a card.\nMax speed — Spells you cast cost {1} less to cast. Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nWhen this artifact enters, draw two cards, then discard a card.\nMax speed — Spells you cast cost {1} less to cast.

View File

@@ -1,7 +1,8 @@
Name:Radiant Lotus Name:Radiant Lotus
ManaCost:6 ManaCost:6
Types:Artifact Types:Artifact
A:AB$ Mana | Cost$ T Sac<X/Artifact> | XMin$ 1 | Chooser$ You | ValidTgts$ Player | Produced$ Any | Amount$ Y | StackDescription$ SpellDescription | SpellDescription$ Choose a color. Target player adds three mana of the chosen color for each artifact sacrificed this way. A:AB$ ChooseColor | Cost$ T Sac<X/Artifact> | XMin$ 1 | Defined$ You | SubAbility$ DBMana | SpellDescription$ Choose a color. Target player adds three mana of the chosen color for each artifact sacrificed this way.
SVar:DBMana:DB$ Mana | ValidTgts$ Player | Produced$ Chosen | Amount$ Y
SVar:X:Count$xPaid SVar:X:Count$xPaid
SVar:Y:SVar$X/Times.3 SVar:Y:SVar$X/Times.3
SVar:BuffedBy:Artifact SVar:BuffedBy:Artifact

View File

@@ -3,7 +3,7 @@ ManaCost:4 B
Types:Creature Zombie Cat Knight Types:Creature Zombie Cat Knight
PT:5/4 PT:5/4
K:Start your engines K:Start your engines
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ PhaseTrig | Description$ Max speed — At the beginning of your end step, create a 2/2 black Zombie creature token. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddTrigger$ PhaseTrig | Description$ Max speed — At the beginning of your end step, create a 2/2 black Zombie creature token.
SVar:PhaseTrig:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | Secondary$ True | TriggerDescription$ Max speed — At the beginning of your end step, create a 2/2 black Zombie creature token. SVar:PhaseTrig:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | Secondary$ True | TriggerDescription$ Max speed — At the beginning of your end step, create a 2/2 black Zombie creature token.
SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie
DeckHas:Ability$Token DeckHas:Ability$Token

View File

@@ -5,7 +5,8 @@ A:SP$ Charm | CharmNum$ 1 | Choices$ Bash,Token,Prevent
SVar:Bash:DB$ Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land | SpellDescription$ Destroy target nonbasic land. SVar:Bash:DB$ Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land | SpellDescription$ Destroy target nonbasic land.
SVar:Token:DB$ Token | TokenAmount$ 3 | TokenScript$ g_1_1_saproling | TokenOwner$ You | SpellDescription$ Create three 1/1 green Saproling creature tokens. SVar:Token:DB$ Token | TokenAmount$ 3 | TokenScript$ g_1_1_saproling | TokenOwner$ You | SpellDescription$ Create three 1/1 green Saproling creature tokens.
SVar:Prevent:DB$ ChooseSource | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ Prevent all damage a source of your choice would deal this turn. SVar:Prevent:DB$ ChooseSource | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ Prevent all damage a source of your choice would deal this turn.
SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem
SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCardStrict,Emblem.ChosenCard | Prevent$ True | Description$ Prevent all damage the source would deal this turn. SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCardStrict,Emblem.ChosenCard | Prevent$ True | Description$ Prevent all damage the source would deal this turn.
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHas:Ability$Token DeckHas:Ability$Token
Oracle:Choose one —\n• Destroy target nonbasic land.\n• Create three 1/1 green Saproling creature tokens.\n• Prevent all damage a source of your choice would deal this turn. Oracle:Choose one —\n• Destroy target nonbasic land.\n• Create three 1/1 green Saproling creature tokens.\n• Prevent all damage a source of your choice would deal this turn.

View File

@@ -5,7 +5,8 @@ A:SP$ ReorderZone | Zone$ Graveyard | Defined$ You | Random$ True | SubAbility$
SVar:DBChoosePlayer:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | AILogic$ Curse | SubAbility$ DBChoose SVar:DBChoosePlayer:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | AILogic$ Curse | SubAbility$ DBChoose
SVar:DBChoose:DB$ ChooseCard | Defined$ ChosenPlayer | Choices$ Card.YouOwn | ChoiceZone$ Graveyard | AtRandom$ True | Amount$ 1 | SubAbility$ DBReturn SVar:DBChoose:DB$ ChooseCard | Defined$ ChosenPlayer | Choices$ Card.YouOwn | ChoiceZone$ Graveyard | AtRandom$ True | Amount$ 1 | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ConditionDefined$ ChosenCard | ConditionPresent$ Card.Creature | ConditionCompare$ GE1 | Defined$ ChosenCard | SubAbility$ DBExile SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ConditionDefined$ ChosenCard | ConditionPresent$ Card.Creature | ConditionCompare$ GE1 | Defined$ ChosenCard | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ConditionDefined$ ChosenCard | ConditionPresent$ Card.Creature | ConditionCompare$ EQ0 | Defined$ ChosenCard SVar:DBExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ConditionDefined$ ChosenCard | ConditionPresent$ Card.Creature | ConditionCompare$ EQ0 | Defined$ ChosenCard | SubAbility$ DBCleanupChosen
SVar:DBCleanupChosen:DB$ Cleanup | ClearChosenPlayer$ True | ClearChosenCard$ True
SVar:X:Count$ValidGraveyard Creature.YouCtrl SVar:X:Count$ValidGraveyard Creature.YouCtrl
SVar:NeedsToPlayVar:X GE2 SVar:NeedsToPlayVar:X GE2
AI:RemoveDeck:All AI:RemoveDeck:All

View File

@@ -3,7 +3,7 @@ ManaCost:1 U
Types:Creature Merfolk Scout Types:Creature Merfolk Scout
PT:2/1 PT:2/1
K:Flying K:Flying
A:AB$ SetState | Cost$ 4 GP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform CARDNAME. Activate only as a sorcery. ({G/P} can be paid with either {G} or 2 life.) A:AB$ SetState | Cost$ 4 GP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ {4}{G/P}: Transform CARDNAME. Activate only as a sorcery. ({G/P} can be paid with either {G} or 2 life.)
AlternateMode:DoubleFaced AlternateMode:DoubleFaced
Oracle:{4}{G/P}: Transform Skyclave Aerialist. Activate only as a sorcery. ({G/P} can be paid with either {G} or 2 life.) Oracle:{4}{G/P}: Transform Skyclave Aerialist. Activate only as a sorcery. ({G/P} can be paid with either {G} or 2 life.)

View File

@@ -3,7 +3,7 @@ ManaCost:1 U
Types:Creature Ooze Types:Creature Ooze
PT:1/3 PT:1/3
K:Start your engines K:Start your engines
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABCopySpell | Description$ Max speed — {1}, Sacrifice this creature: Copy target spell you control. You may choose new targets for the copy. (A copy of a permanent spell becomes a token.) S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABCopySpell | Description$ Max speed — {1}, Sacrifice this creature: Copy target spell you control. You may choose new targets for the copy. (A copy of a permanent spell becomes a token.)
SVar:ABCopySpell:AB$ CopySpellAbility | PrecostDesc$ Max speed — | Cost$ 1 Sac<1/CARDNAME/this creature> | TgtPrompt$ Select target spell you control | ValidTgts$ Card.YouCtrl | TargetType$ Spell | Secondary$ True | MayChooseTarget$ True | SpellDescription$ Copy target spell you control. You may choose new targets for the copy. (A copy of a permanent spell becomes a token.) SVar:ABCopySpell:AB$ CopySpellAbility | PrecostDesc$ Max speed — | Cost$ 1 Sac<1/CARDNAME/this creature> | TgtPrompt$ Select target spell you control | ValidTgts$ Card.YouCtrl | TargetType$ Spell | Secondary$ True | MayChooseTarget$ True | SpellDescription$ Copy target spell you control. You may choose new targets for the copy. (A copy of a permanent spell becomes a token.)
DeckHas:Ability$Sacrifice|Token DeckHas:Ability$Sacrifice|Token
Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — {1}, Sacrifice this creature: Copy target spell you control. You may choose new targets for the copy. (A copy of a permanent spell becomes a token.) Oracle:Start your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — {1}, Sacrifice this creature: Copy target spell you control. You may choose new targets for the copy. (A copy of a permanent spell becomes a token.)

View File

@@ -1,8 +0,0 @@
Name:Sojourner's Enforcermite
ManaCost:6
Types:Artifact Creature Frog Myr Salamander
PT:6/6
K:Affinity:Permanent.withAffinity:permanent with affinity
K:TypeCycling:Card.withAffinity:2
Oracle:Affinity for Affinity (This card costs {1} less to cast for each permanent you control with affinity.)\nAffinitycycling {2} ({2}, Discard this card: Search your library for a card with affinity, reveal it, put it into your hand, then shuffle.)

View File

@@ -2,7 +2,7 @@ Name:Sphere of Annihilation
ManaCost:X B ManaCost:X B
Types:Artifact Types:Artifact
K:etbCounter:VOID:X K:etbCounter:VOID:X
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigExileSelf | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, exile CARDNAME, all creatures and planeswalkers with mana value less than or equal to the number of void counters on it, and all creature and planeswalker cards in graveyards with mana value less than or equal to the number of void counters on it. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigExileSelf | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, exile CARDNAME, all creatures and planeswalkers with mana value less than or equal to the number of void counters on it, and all creature and planeswalker cards in graveyards with mana value less than or equal to the number of void counters on it.
SVar:TrigExileSelf:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ Self | SubAbility$ DBExileAll SVar:TrigExileSelf:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ Self | SubAbility$ DBExileAll
SVar:DBExileAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Creature.cmcLEY,Planeswalker.cmcLEY | SubAbility$ DBExileAllGraveyard SVar:DBExileAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Creature.cmcLEY,Planeswalker.cmcLEY | SubAbility$ DBExileAllGraveyard
SVar:DBExileAllGraveyard:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | ChangeType$ Creature.cmcLEY,Planeswalker.cmcLEY SVar:DBExileAllGraveyard:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | ChangeType$ Creature.cmcLEY,Planeswalker.cmcLEY

View File

@@ -3,6 +3,7 @@ ManaCost:3 U U
Types:Sorcery Types:Sorcery
A:SP$ Pump | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ ChooseCreature | IsCurse$ True | StackDescription$ SpellDescription | SpellDescription$ Choose target player. Return half the creatures they control to their owner's hand, rounded up. A:SP$ Pump | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ ChooseCreature | IsCurse$ True | StackDescription$ SpellDescription | SpellDescription$ Choose target player. Return half the creatures they control to their owner's hand, rounded up.
SVar:ChooseCreature:DB$ ChooseCard | Choices$ Creature.TargetedPlayerCtrl | Mandatory$ True | Amount$ X | ChoiceTitle$ Choose half the creatures (rounded up) target player controls | SubAbility$ ReturnCreature SVar:ChooseCreature:DB$ ChooseCard | Choices$ Creature.TargetedPlayerCtrl | Mandatory$ True | Amount$ X | ChoiceTitle$ Choose half the creatures (rounded up) target player controls | SubAbility$ ReturnCreature
SVar:ReturnCreature:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Battlefield | Destination$ Hand SVar:ReturnCreature:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
SVar:X:TargetedPlayer$CreaturesInPlay/HalfUp SVar:X:TargetedPlayer$CreaturesInPlay/HalfUp
Oracle:Choose target player. Return half the creatures they control to their owner's hand, rounded up. Oracle:Choose target player. Return half the creatures they control to their owner's hand, rounded up.

View File

@@ -3,7 +3,7 @@ ManaCost:3
Types:Artifact Types:Artifact
K:Start your engines K:Start your engines
A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color.
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {T}, Sacrifice this artifact: Draw two cards, then discard a card. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddAbility$ ABDraw | Description$ Max speed — {T}, Sacrifice this artifact: Draw two cards, then discard a card.
SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ T Sac<1/CARDNAME/this artifact> | NumCards$ 2 | Secondary$ True | SubAbility$ DBDiscard | SpellDescription$ Draw two cards, then discard a card. SVar:ABDraw:AB$ Draw | PrecostDesc$ Max speed — | Cost$ T Sac<1/CARDNAME/this artifact> | NumCards$ 2 | Secondary$ True | SubAbility$ DBDiscard | SpellDescription$ Draw two cards, then discard a card.
SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose
DeckHas:Ability$Sacrifice|Discard DeckHas:Ability$Sacrifice|Discard

View File

@@ -1,9 +1,12 @@
Name:Stinging Study Name:Stinging Study
ManaCost:4 B ManaCost:4 B
Types:Instant Types:Instant
A:SP$ ChooseCard | Choices$ Card.IsCommander+YouOwn | ChoiceZone$ Command,Battlefield | Mandatory$ True | ChoiceTitle$ Choose a commander you own | SubAbility$ DBDraw | SpellDescription$ You draw X cards and you lose X life, where X is the mana value of a commander you own on the battlefield or in the command zone. A:SP$ ChooseCard | Choices$ Card.IsCommander+YouOwn | RememberChosen$ True | MinAmount$ 0 | ChoiceTitle$ Choose a commander on the battlefield | SubAbility$ ChooseCommand | ConditionPresent$ Card.IsCommander+YouOwn | SpellDescription$ You draw X cards and you lose X life, where X is the mana value of a commander you own on the battlefield or in the command zone.
SVar:ChooseCommand:DB$ ChooseCard | ChoiceZone$ Command | Choices$ Card.IsCommander+YouOwn | RememberChosen$ True | ChoiceTitle$ Choose a commander in command | SubAbility$ ChooseBF | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ EQ0 | Mandatory$ True
SVar:ChooseBF:DB$ ChooseCard | ChoiceZone$ Battlefield | Choices$ Card.IsCommander+YouOwn | RememberChosen$ True | ChoiceTitle$ Choose a commander on the battlefield | SubAbility$ DBDraw | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ EQ0 | Mandatory$ True
SVar:DBDraw:DB$ Draw | NumCards$ X | SubAbility$ DBLoseLife SVar:DBDraw:DB$ Draw | NumCards$ X | SubAbility$ DBLoseLife
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | SubAbility$ DBCleanup
SVar:X:ChosenCard$CardManaCost SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True
SVar:X:Remembered$CardManaCost
AI:RemoveDeck:NonCommander AI:RemoveDeck:NonCommander
Oracle:You draw X cards and you lose X life, where X is the mana value of a commander you own on the battlefield or in the command zone. Oracle:You draw X cards and you lose X life, where X is the mana value of a commander you own on the battlefield or in the command zone.

View File

@@ -5,7 +5,7 @@ PT:3/3
K:Flying K:Flying
K:Haste K:Haste
K:Start your engines K:Start your engines
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature has lifelink. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature has lifelink.
SVar:MaxSpeedStatic:Mode$ Continuous | Secondary$ True | Affected$ Card.Self | AddKeyword$ Lifelink | Description$ Max speed — This creature has lifelink. SVar:MaxSpeedStatic:Mode$ Continuous | Secondary$ True | Affected$ Card.Self | AddKeyword$ Lifelink | Description$ Max speed — This creature has lifelink.
DeckHas:Ability$LifeGain DeckHas:Ability$LifeGain
Oracle:Flying, haste\nStart your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — This creature has lifelink. Oracle:Flying, haste\nStart your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — This creature has lifelink.

View File

@@ -4,6 +4,6 @@ Types:Creature Bird Warrior
PT:3/3 PT:3/3
K:Flying K:Flying
K:Start your engines K:Start your engines
S:Mode$ Continuous | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature gets +0/+1 and has vigilance. S:Mode$ Continuous | CharacteristicDefining$ True | Affected$ Card.Self | Condition$ MaxSpeed | AddStaticAbility$ MaxSpeedStatic | Description$ Max speed — This creature gets +0/+1 and has vigilance.
SVar:MaxSpeedStatic:Mode$ Continuous | Secondary$ True | Affected$ Card.Self | AddToughness$ 1 | AddKeyword$ Vigilance | Description$ Max speed — This creature gets +0/+1 and has vigilance. SVar:MaxSpeedStatic:Mode$ Continuous | Secondary$ True | Affected$ Card.Self | AddToughness$ 1 | AddKeyword$ Vigilance | Description$ Max speed — This creature gets +0/+1 and has vigilance.
Oracle:Flying\nStart your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — This creature gets +0/+1 and has vigilance. Oracle:Flying\nStart your engines! (If you have no speed, it starts at 1. It increases once on each of your turns when an opponent loses life. Max speed is 4.)\nMax speed — This creature gets +0/+1 and has vigilance.

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