mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-14 09:48:02 +00:00
Compare commits
2 Commits
daily-snap
...
forge-2.0.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a29da54b2e | ||
|
|
ec63b230c8 |
24
.github/workflows/snapshot-both-pc-android.yml
vendored
24
.github/workflows/snapshot-both-pc-android.yml
vendored
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<artifactId>forge</artifactId>
|
||||
<groupId>forge</groupId>
|
||||
<version>${revision}</version>
|
||||
<version>2.0.02</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>forge-ai</artifactId>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<artifactId>forge</artifactId>
|
||||
<groupId>forge</groupId>
|
||||
<version>${revision}</version>
|
||||
<version>2.0.02</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>forge-core</artifactId>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<artifactId>forge</artifactId>
|
||||
<groupId>forge</groupId>
|
||||
<version>${revision}</version>
|
||||
<version>2.0.02</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>forge-game</artifactId>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -206,6 +206,7 @@ public class StaticEffect {
|
||||
if (layers.contains(StaticAbilityLayer.ABILITIES)) {
|
||||
p.removeChangedKeywords(getTimestamp(), ability.getId());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// modify the affected card
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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":
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package forge.game.ability.effects;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
@@ -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.";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -21,7 +21,7 @@ public class StaticAbilityDevotion {
|
||||
continue;
|
||||
}
|
||||
int t = Integer.parseInt(stAb.getParamOrDefault("Value", "1"));
|
||||
i += t;
|
||||
i = i + t;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -87,7 +87,6 @@ public enum EDocID {
|
||||
REPORT_MESSAGE (),
|
||||
REPORT_STACK (),
|
||||
REPORT_COMBAT (),
|
||||
REPORT_DEPENDENCIES (),
|
||||
REPORT_LOG (),
|
||||
|
||||
DEV_MODE (),
|
||||
|
||||
@@ -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);
|
||||
|
||||
// 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(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(btnDownloadPrices, constraintsBTN);
|
||||
pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPrices")), constraintsLBL);
|
||||
|
||||
// pnlContent.add(btnDownloadSkins, constraintsBTN);
|
||||
// pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadSkins")), 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()
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<parent>
|
||||
<artifactId>forge</artifactId>
|
||||
<groupId>forge</groupId>
|
||||
<version>${revision}</version>
|
||||
<version>2.0.02</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>forge-gui</artifactId>
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
<properties>
|
||||
<property name="dialog">[
|
||||
{
|
||||
"text": "A big gate is blocking the path, through the bars you can see an imposing figure in the room beyond.",
|
||||
"text": "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)",
|
||||
"options": [
|
||||
{ "name": "go away" },
|
||||
{
|
||||
|
||||
@@ -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.)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.)
|
||||
|
||||
@@ -4,7 +4,7 @@ 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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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}.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.)
|
||||
|
||||
|
||||
@@ -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.)
|
||||
|
||||
@@ -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.)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user