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

View File

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

View File

@@ -6,7 +6,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>${revision}</version>
<version>2.0.02</version>
</parent>
<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
if (sa.isBlitz() && ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, card)) {
return true;

View File

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

View File

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

View File

@@ -707,7 +707,7 @@ public class GameAction {
// needed for ETB lookahead like Bronzehide Lion
stAb.putParam("AffectedZone", "All");
SpellAbilityEffect.addForgetOnMovedTrigger(eff, "Battlefield");
eff.getOwner().getZone(ZoneType.Command).add(eff);
game.getAction().moveToCommand(eff, cause);
}
eff.addRemembered(copied);
@@ -724,6 +724,7 @@ public class GameAction {
}
}
private void storeChangesZoneAll(Card c, Zone zoneFrom, Zone zoneTo, Map<AbilityKey, Object> params) {
if (params != null && params.containsKey(AbilityKey.InternalTriggerTable)) {
((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 Card copied = moveTo(removed, c, cause, params);
if (c.isImmutable()) {
return copied;
}
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(c);
runParams.put(AbilityKey.Cause, cause);
if (origin != null) { // is generally null when adding via dev mode
@@ -1112,10 +1109,6 @@ public class GameAction {
// search for cards with static abilities
final FCollection<StaticAbility> staticAbilities = new FCollection<>();
final CardCollection staticList = new CardCollection();
Table<StaticAbility, StaticAbility, Set<StaticAbilityLayer>> dependencies = null;
if (preList.isEmpty()) {
dependencies = HashBasedTable.create();
}
game.forEachCardInGame(new Visitor<Card>() {
@Override
@@ -1123,7 +1116,7 @@ public class GameAction {
// need to get Card from preList if able
final Card co = preList.get(c);
for (StaticAbility stAb : co.getStaticAbilities()) {
if (stAb.checkMode("Continuous") && stAb.zonesCheck()) {
if (stAb.checkMode("Continuous")) {
staticAbilities.add(stAb);
}
}
@@ -1150,7 +1143,7 @@ public class GameAction {
StaticAbility stAb = staticsForLayer.get(0);
// dependency with CDA seems unlikely
if (!stAb.isCharacteristicDefining()) {
stAb = findStaticAbilityToApply(layer, staticsForLayer, preList, affectedPerAbility, dependencies);
stAb = findStaticAbilityToApply(layer, staticsForLayer, preList, affectedPerAbility);
}
staticsForLayer.remove(stAb);
final CardCollectionView previouslyAffected = affectedPerAbility.get(stAb);
@@ -1170,7 +1163,7 @@ public class GameAction {
if (affectedHere != null) {
for (final Card c : affectedHere) {
for (final StaticAbility st2 : c.getStaticAbilities()) {
if (!staticAbilities.contains(st2) && st2.checkMode("Continuous") && st2.zonesCheck()) {
if (!staticAbilities.contains(st2)) {
toAdd.add(st2);
st2.applyContinuousAbilityBefore(layer, preList);
}
@@ -1237,8 +1230,6 @@ public class GameAction {
game.getTriggerHandler().runTrigger(TriggerType.Always, 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
@@ -1257,8 +1248,7 @@ public class GameAction {
game.getTracker().unfreeze();
}
private StaticAbility findStaticAbilityToApply(StaticAbilityLayer layer, List<StaticAbility> staticsForLayer, CardCollectionView preList, Map<StaticAbility, CardCollectionView> affectedPerAbility,
Table<StaticAbility, StaticAbility, Set<StaticAbilityLayer>> dependencies) {
private StaticAbility findStaticAbilityToApply(StaticAbilityLayer layer, List<StaticAbility> staticsForLayer, CardCollectionView preList, Map<StaticAbility, CardCollectionView> affectedPerAbility) {
if (staticsForLayer.size() == 1) {
return staticsForLayer.get(0);
}
@@ -1305,24 +1295,21 @@ public class GameAction {
// ...what it applies to...
if (!dependency && compareAffected) {
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
if (!dependency) {
List<Object> effectResultsAfterOther = generateStaticAbilityResult(layer, stAb);
dependency = !effectResults.equals(effectResultsAfterOther);
if (!effectResults.equals(effectResultsAfterOther)) {
dependency = true;
}
}
if (dependency) {
dependencyGraph.addVertex(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
@@ -1844,10 +1831,19 @@ public class GameAction {
public void checkGameOverCondition() {
// award loses as SBE
GameEndReason reason = 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?
for (Player p : allPlayers) {
if (!p.hasWon()) {
@@ -1873,17 +1869,24 @@ public class GameAction {
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) {
if (p.checkLoseCondition()) { // this will set appropriate outcomes
if (losers == null) {
losers = Lists.newArrayListWithCapacity(3);
}
losers.add(p);
if (losers.contains(p)) {
continue;
}
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) {
for (Player p : losers) {
game.onPlayerLost(p);

View File

@@ -23,12 +23,15 @@ package forge.game;
public enum GameEndReason {
/** The All opponents lost. */
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 */
Draw,
/** Special conditions, they force one player to win and thus end the game */
WinsGameSpellEffect,
/** The Wins game spell effect. */
WinsGameSpellEffect, // ones that could be both hardcoded (felidar) and
// scripted ( such as Mayael's Aria )
/** Used to end multiplayer games where the all humans have lost or conceded while AIs cannot end match by themselves.*/
AllHumansLost,

View File

@@ -304,7 +304,8 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
@Override
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
@@ -312,11 +313,6 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
return new GameLogEntry(GameLogEntryType.STACK_RESOLVE, ev.toString());
}
@Override
public GameLogEntry visit(GameEventDoorChanged ev) {
return new GameLogEntry(GameLogEntryType.STACK_RESOLVE, ev.toString());
}
@Subscribe
public void recieve(GameEvent ev) {
GameLogEntry le = ev.visit(this);

View File

@@ -1,12 +1,8 @@
package forge.game;
import java.util.List;
import java.util.Set;
import com.google.common.collect.Iterables;
import com.google.common.collect.Table;
import com.google.common.collect.Table.Cell;
import forge.LobbyPlayer;
import forge.deck.Deck;
import forge.game.GameOutcome.AnteResult;
@@ -20,8 +16,6 @@ import forge.game.phase.PhaseType;
import forge.game.player.PlayerView;
import forge.game.player.RegisteredPlayer;
import forge.game.spellability.StackItemView;
import forge.game.staticability.StaticAbility;
import forge.game.staticability.StaticAbilityLayer;
import forge.game.zone.MagicStack;
import forge.trackable.TrackableCollection;
import forge.trackable.TrackableObject;
@@ -206,36 +200,15 @@ public class GameView extends TrackableObject {
public TrackableCollection<CardView> getRevealedCollection() {
return get(TrackableProperty.RevealedCardsCollection);
}
public void updateRevealedCards(TrackableCollection<CardView> 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() {
return get(TrackableProperty.CombatView);
}
public void updateCombatView(CombatView combatView) {
set(TrackableProperty.CombatView, combatView);
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -166,6 +166,14 @@ public class DiscardEffect extends SpellAbilityEffect {
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;
if (sa.hasParam("NumCards")) {
numCards = AbilityUtils.calculateAmount(source, sa.getParam("NumCards"), sa);

View File

@@ -1,5 +1,6 @@
package forge.game.ability.effects;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.Player;
@@ -17,9 +18,6 @@ public class GameWinEffect extends SpellAbilityEffect {
for (final Player p : getTargetPlayers(sa)) {
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;
}
final Player chooser;
if (sa.hasParam("Chooser")) {
chooser = AbilityUtils.getDefinedPlayers(card, sa.getParam("Chooser"), sa).get(0);
} else {
chooser = p;
}
if (abMana.isComboMana()) {
int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(card, sa.getParam("Amount"), sa) : 1;
if(amount <= 0)
@@ -74,7 +67,7 @@ public class ManaEffect extends SpellAbilityEffect {
ColorSet fullOptions = colorOptions;
// Use specifyManaCombo if possible
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()) {
Byte chosenColor = e.getKey();
String choice = MagicColor.toShortString(chosenColor);
@@ -101,7 +94,7 @@ public class ManaEffect extends SpellAbilityEffect {
// just use the first possible color.
choice = colorsProduced[differentChoice ? nMana : 0];
} 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);
if (chosenColor == 0)
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));
}
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) {
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())
continue;
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) {
generic += 2;
continue;
@@ -178,7 +171,7 @@ public class ManaEffect extends SpellAbilityEffect {
else if (cs.isMonoColor())
chosenColor = s.getColorMask();
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(' ');
@@ -226,7 +219,7 @@ public class ManaEffect extends SpellAbilityEffect {
if (cs.isMonoColor())
sb.append(MagicColor.toShortString(s.getColorMask()));
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));
}
}

View File

@@ -4799,8 +4799,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
p.get("Timestamp"), (long) 0);
} else if (category.equals("Keywords")) {
boolean removeAll = p.containsKey("RemoveAll") && (boolean) p.get("RemoveAll") == true;
addChangedCardKeywords((List<String>) p.get("AddKeywords"), (List<String>) p.get("RemoveKeywords"),
removeAll, (long) p.get("Timestamp"), null);
addChangedCardKeywords((List<String>) p.get("AddKeywords"), Lists.newArrayList(), removeAll,
(long) p.get("Timestamp"), null);
} else if (category.equals("Types")) {
addChangedCardTypes((CardType) p.get("AddTypes"), (CardType) p.get("RemoveTypes"),
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) {
boolean inZones = false;
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) {
@@ -8174,8 +8181,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
updateRooms();
getGame().fireEvent(new GameEventDoorChanged(p, this, stateName, true));
Map<AbilityKey, Object> unlockParams = AbilityKey.mapFromPlayer(p);
unlockParams.put(AbilityKey.Card, this);
unlockParams.put(AbilityKey.CardState, getState(stateName));
@@ -8200,8 +8205,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
updateRooms();
getGame().fireEvent(new GameEventDoorChanged(p, this, stateName, false));
return true;
}

View File

@@ -651,14 +651,12 @@ public class CardProperty {
return false;
}
} 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.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);
if (property.startsWith("Bottom")) {
cards = new CardCollection(cards);
Collections.reverse((CardCollection) cards);
}
if (property.startsWith("Bottom")) Collections.reverse(cards);
}
if (cards.isEmpty() || !card.equals(cards.get(0))) return false;
} else if (property.startsWith("Cloned")) {

View File

@@ -19,6 +19,6 @@ public class GameEventCardForetold extends GameEvent {
*/
@Override
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(GameEventCardPlotted event);
T visit(GameEventDayTimeChanged event);
T visit(GameEventDoorChanged event);
// This is base class for all visitors.
class Base<T> implements IGameEventVisitor<T>{
@@ -119,6 +118,5 @@ public interface IGameEventVisitor<T> {
public T visit(GameEventCardForetold event) { return null; }
public T visit(GameEventCardPlotted 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) {
if (state != GameLossReason.OpponentWon) {
// Replacement effects
Map<AbilityKey, Object> repParams = AbilityKey.mapFromAffected(this);
repParams.put(AbilityKey.LoseReason, state);
if (game.getReplacementHandler().run(ReplacementType.GameLoss, repParams) != ReplacementResult.NotReplaced) {
return false;
}
}
//final String spellName = sa != null ? sa.getHostCard().getName() : null;
setOutcome(PlayerOutcome.loss(state, spellName));
return true;
}

View File

@@ -293,7 +293,7 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone
if (!checkMode("CantAttackUnless") && (!checkMode("OptionalAttackCost") || !attackersWithOptionalCost.contains(attacker))) {
return null;
}
if (!checkConditions()) {
if (!this.checkConditions()) {
return null;
}
return StaticAbilityCantAttackBlock.getAttackCost(this, attacker, target);
@@ -321,26 +321,6 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone
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.
*
@@ -351,9 +331,23 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone
final Game game = getHostCard().getGame();
final PhaseHandler ph = game.getPhaseHandler();
if (!zonesCheck()) {
if (isSuppressed()) {
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");
if (null != condition) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -32,6 +32,7 @@ import forge.toolbox.FSkin;
import forge.toolbox.FTextArea;
import forge.util.FileUtil;
import forge.util.Localizer;
import forge.util.RuntimeVersion;
import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.tuple.Pair;
@@ -80,32 +81,45 @@ public enum VSubmenuDownloaders implements IVSubmenu<CSubmenuDownloaders> {
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(btnCheckForUpdates, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblCheckForUpdates")), constraintsLBL);
pnlContent.add(btnDownloadPics, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPics")), constraintsLBL);
// pnlContent.add(btnDownloadPics, constraintsBTN);
// pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPics")), 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(btnDownloadPicsHQ, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPicsHQ")), constraintsLBL);
pnlContent.add(btnDownloadPrices, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPrices")), constraintsLBL);
pnlContent.add(btnDownloadSetPics, constraintsBTN);
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadSetPics")), constraintsLBL);
// pnlContent.add(btnDownloadSkins, constraintsBTN);
// pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadSkins")), 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(_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(_makeLabel(localizer.getMessage("lblListImageData")), constraintsLBL);
@@ -123,6 +137,12 @@ public enum VSubmenuDownloaders implements IVSubmenu<CSubmenuDownloaders> {
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)
* @see forge.view.home.IViewSubmenu#populate()
*/

View File

@@ -104,7 +104,6 @@ import forge.player.PlayerZoneUpdate;
import forge.player.PlayerZoneUpdates;
import forge.screens.match.controllers.CAntes;
import forge.screens.match.controllers.CCombat;
import forge.screens.match.controllers.CDependencies;
import forge.screens.match.controllers.CDetailPicture;
import forge.screens.match.controllers.CDev;
import forge.screens.match.controllers.CDock;
@@ -168,7 +167,6 @@ public final class CMatchUI
private final CAntes cAntes = new CAntes(this);
private final CCombat cCombat = new CCombat();
private final CDependencies cDependencies = new CDependencies(this);
private final CDetailPicture cDetailPicture = new CDetailPicture(this);
private final CDev cDev = new CDev(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_STACK, getCStack().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.DEV_MODE, getCDev().getView());
this.myDocs.put(EDocID.BUTTON_DOCK, getCDock().getView());
@@ -413,11 +410,6 @@ public final class CMatchUI
cCombat.update();
} // showCombat(CombatView)
@Override
public void updateDependencies() {
cDependencies.update();
}
@Override
public void updateDayTime(String 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>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>${revision}</version>
<version>2.0.02</version>
</parent>
<artifactId>forge-gui-ios</artifactId>
@@ -35,7 +35,7 @@
<filtering>true</filtering>
</resource>
</resources>
<finalName>forge-ios-${revision}</finalName>
<finalName>forge-ios-2.0.02-SNAPSHOT</finalName>
</build>
<dependencies>

View File

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

View File

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

View File

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

View File

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

View File

@@ -66,8 +66,7 @@
"Questing Cosplayer",
"Teferi, Druid of Argoth",
"Anax and Cymede & Kynaios and Tiro",
"Call from the Grave",
"Mise"
"Call from the Grave"
],
"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.
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$ 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.
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

View File

@@ -200,7 +200,7 @@
<properties>
<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;name&quot;: &quot;go away&quot; },
{

View File

@@ -3,7 +3,7 @@ ManaCost:1 U U
Types:Artifact
K:Start your engines
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: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.)

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land
K:Start your engines
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.
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
ManaCost:2 U B
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.
SVar:DBChooseSac:DB$ ChooseCard | DefinedCards$ Targeted | Defined$ TargetedController | ChoiceTitle$ Choose one to sacrifice | SubAbility$ DBSac | StackDescription$ None | AILogic$ WorstCard
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 | 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: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
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
Types:Creature Goblin Advisor
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.)
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.)

View File

@@ -4,9 +4,9 @@ Types:Artifact Vehicle
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.
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
K:Crew:2
SVar:X:Count$xPaid
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:Start your engines
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.
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
ManaCost:1 B
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.
SVar:DBChoose:DB$ ChooseCard | DefinedCards$ Targeted | Mandatory$ True | ChoiceTitle$ Choose one to exile | Amount$ 1 | SubAbility$ ExileChosen | StackDescription$ None
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 | 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: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
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
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.
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.

View File

@@ -2,11 +2,8 @@ Name:Countryside Crusher
ManaCost:1 R R
Types:Creature Giant Warrior
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.
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$ 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.
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
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
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:X:ChosenCard$CardPower
SVar:X:Count$Valid Card.ChosenCard$CardPower
AI:RemoveDeck:Random
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
ManaCost:2 B
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.
SVar:DBBranch:DB$ Branch | BranchConditionSVar$ X | TrueSubAbility$ DBChangeZone | FalseSubAbility$ DBChooseOpp | SubAbility$ DBExile
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$ DBCleanup
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:DBChoose:DB$ ChooseCard | DefinedCards$ Targeted | ChoiceZone$ Graveyard | Amount$ 2 | Mandatory$ True | Defined$ ChosenPlayer | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | Defined$ Targeted.!ChosenCard | Origin$ Graveyard | Destination$ Hand
SVar:DBChoose:DB$ ChooseCard | Choices$ Card.IsRemembered | ChoiceZone$ Graveyard | Amount$ 2 | Mandatory$ True | Defined$ ChosenPlayer | ForgetChosen$ True | SubAbility$ DBReturn
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:NeedsToPlayVar:Z GE3
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: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: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.

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: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: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
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
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
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:TrigLoseLife:DB$ LoseLife | Defined$ Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife
SVar:DBGainLife:DB$ GainLife | LifeAmount$ 1

View File

@@ -3,6 +3,6 @@ ManaCost:1 R
Types:Creature Human Warrior
PT:3/1
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}.
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
K:Reach
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: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

View File

@@ -5,7 +5,7 @@ PT:4/5
K:Start your engines
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
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: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.

View File

@@ -1,7 +1,8 @@
Name:Fossil Find
ManaCost:RG
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
AI:RemoveDeck:All
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
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
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.
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.

View File

@@ -5,6 +5,6 @@ PT:2/1
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.
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.
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.
SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | NumDmg$ 1 | SubAbility$ DBGainLife
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.
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.

View File

@@ -4,6 +4,6 @@ Types:Creature Spirit Scout
PT:2/2
K:Flying
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.
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
K:Trample
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.
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:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
SVar:X:PlayerCountOpponents$HighestCounters.Poison
SVar:AffectedX:ChosenCard$TotalValue Toxic
SVar:AffectedX:Count$Valid Card.ChosenCard$TotalValue Toxic
DeckHas:Ability$Token & Type$Beast|Phyrexian
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.

View File

@@ -9,6 +9,7 @@ SVar:Y:SVar$X/Times.2
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$ 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
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
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
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.
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.

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:MustAttack:Mode$ MustAttack | ValidCreature$ Card.IsRemembered | Description$ This creature attacks this combat if able.
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.
DeckHas:Ability$Token
DeckHints:Type$Goblin

View File

@@ -4,7 +4,7 @@ Types:Enchantment
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.
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.
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.

View File

@@ -1,7 +1,7 @@
Name:Last Night Together
ManaCost:3 R G
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: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.

View File

@@ -4,6 +4,6 @@ Types:Creature Cat Scout
PT:2/2
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 | 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.
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
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 | 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:DiscardMe:2
DeckHints:Ability$Discard

View File

@@ -3,6 +3,6 @@ ManaCost:2 G
Types:Creature Elephant Scout
PT:3/3
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.
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.
SVar:X:Count$Valid Artifact.YouCtrl
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:TrigCopy:AB$ CopySpellAbility | Cost$ 1 | Defined$ TriggeredSpellAbility | Amount$ 1
DeckHints:Type$Artifact

View File

@@ -1,6 +1,7 @@
Name:Monomania
ManaCost:3 B B
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.
SVar:DBDiscard:DB$ Discard | Defined$ Targeted | Mode$ Defined | DefinedCards$ ValidHand Card.!ChosenCard
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$ NotRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Target player chooses a card in their hand and discards the rest.

View File

@@ -3,6 +3,6 @@ ManaCost:no cost
Types:Land
K:Start your engines
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}.
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
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.
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.
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
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
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.
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.

View File

@@ -2,6 +2,7 @@ Name:Pay No Heed
ManaCost:W
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.
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:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
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
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
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:PlayMain1:TRUE
DeckHas:Ability$Counters

View File

@@ -3,8 +3,9 @@ ManaCost:2 U
Types:Instant
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.
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:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
SVar:MaxTargets:Count$Valid Creature.YouCtrl
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.

View File

@@ -4,7 +4,7 @@ Types:Creature Zombie Cat Warrior
PT:2/5
K:Vigilance
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:TrigPump:DB$ Pump | ValidTgts$ Creature.YouCtrl,Vehicle.YouCtrl | TgtPrompt$ Select target creature or Vehicle | KW$ Double Strike
SVar:PlayMain1:TRUE

View File

@@ -2,8 +2,11 @@ Name:Purgatory
ManaCost:2 W B
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.
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.
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
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.
SVar:TrigDraw:DB$ Draw | NumCards$ 2 | SubAbility$ DBDiscard
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.
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.

View File

@@ -1,7 +1,8 @@
Name:Radiant Lotus
ManaCost:6
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:Y:SVar$X/Times.3
SVar:BuffedBy:Artifact

View File

@@ -3,7 +3,7 @@ ManaCost:4 B
Types:Creature Zombie Cat Knight
PT:5/4
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:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie
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: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: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:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
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.

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: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: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:NeedsToPlayVar:X GE2
AI:RemoveDeck:All

View File

@@ -3,7 +3,7 @@ ManaCost:1 U
Types:Creature Merfolk Scout
PT:2/1
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
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
PT:1/3
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.)
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.)

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
Types:Artifact
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: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

View File

@@ -3,6 +3,7 @@ ManaCost:3 U U
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.
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
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
K:Start your engines
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:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose
DeckHas:Ability$Sacrifice|Discard

View File

@@ -1,9 +1,12 @@
Name:Stinging Study
ManaCost:4 B
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:DBLoseLife:DB$ LoseLife | LifeAmount$ X
SVar:X:ChosenCard$CardManaCost
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True
SVar:X:Remembered$CardManaCost
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.

View File

@@ -5,7 +5,7 @@ PT:3/3
K:Flying
K:Haste
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.
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.

View File

@@ -4,6 +4,6 @@ Types:Creature Bird Warrior
PT:3/3
K:Flying
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.
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