Merge pull request #1951 from tool4ever/cleanStuff

Clean stuff
This commit is contained in:
tool4ever
2022-11-22 19:36:29 +01:00
committed by GitHub
43 changed files with 95 additions and 112 deletions

View File

@@ -2430,7 +2430,7 @@ public class GameAction {
} }
if (c.isPlaneswalker()) { if (c.isPlaneswalker()) {
int lethalPW = c.getCurrentLoyalty(); int lethalPW = c.getCurrentLoyalty();
// 120.10 // CR 120.10
lethal = c.isCreature() ? Math.min(lethal, lethalPW) : lethalPW; lethal = c.isCreature() ? Math.min(lethal, lethalPW) : lethalPW;
} }
lethalDamage.put(c, lethal); lethalDamage.put(c, lethal);
@@ -2442,6 +2442,7 @@ public class GameAction {
sourceLKI.getDamageHistory().registerDamage(e.getValue(), isCombat, sourceLKI, e.getKey(), lkiCache); sourceLKI.getDamageHistory().registerDamage(e.getValue(), isCombat, sourceLKI, e.getKey(), lkiCache);
} }
// CR 702.15e
if (sum > 0 && sourceLKI.hasKeyword(Keyword.LIFELINK)) { if (sum > 0 && sourceLKI.hasKeyword(Keyword.LIFELINK)) {
sourceLKI.getController().gainLife(sum, sourceLKI, cause); sourceLKI.getController().gainLife(sum, sourceLKI, cause);
} }

View File

@@ -302,8 +302,7 @@ public final class AbilityFactory {
} }
if (spellAbility instanceof SpellApiBased && hostCard.isPermanent()) { if (spellAbility instanceof SpellApiBased && hostCard.isPermanent()) {
String desc = mapParams.containsKey("SpellDescription") ? mapParams.get("SpellDescription") String desc = mapParams.getOrDefault("SpellDescription", spellAbility.getHostCard().getName());
: spellAbility.getHostCard().getName();
spellAbility.setDescription(desc); spellAbility.setDescription(desc);
} else if (mapParams.containsKey("SpellDescription")) { } else if (mapParams.containsKey("SpellDescription")) {
spellAbility.rebuiltDescription(); spellAbility.rebuiltDescription();

View File

@@ -65,6 +65,10 @@ public class CharmEffect extends SpellAbilityEffect {
// using getCardForUi game is not set, so can't guess max charm // using getCardForUi game is not set, so can't guess max charm
num = Integer.MAX_VALUE; num = Integer.MAX_VALUE;
} else { } else {
// fallback needed while ability building
if (sa.getActivatingPlayer() == null) {
sa.setActivatingPlayer(source.getController());
}
num = Math.min(AbilityUtils.calculateAmount(source, sa.getParamOrDefault("CharmNum", "1"), sa), list.size()); num = Math.min(AbilityUtils.calculateAmount(source, sa.getParamOrDefault("CharmNum", "1"), sa), list.size());
} }
final int min = sa.hasParam("MinCharmNum") ? AbilityUtils.calculateAmount(source, sa.getParam("MinCharmNum"), sa) : num; final int min = sa.hasParam("MinCharmNum") ? AbilityUtils.calculateAmount(source, sa.getParam("MinCharmNum"), sa) : num;

View File

@@ -320,12 +320,9 @@ public class DamageDealEffect extends DamageBaseEffect {
} else { } else {
if (sa.hasParam("ExcessDamage") && (!sa.hasParam("ExcessDamageCondition") || if (sa.hasParam("ExcessDamage") && (!sa.hasParam("ExcessDamageCondition") ||
sourceLKI.isValid(sa.getParam("ExcessDamageCondition").split(","), activationPlayer, hostCard, sa))) { sourceLKI.isValid(sa.getParam("ExcessDamageCondition").split(","), activationPlayer, hostCard, sa))) {
damageMap.put(sourceLKI, c, dmgToTarget); damageMap.put(sourceLKI, c, dmgToTarget);
List<GameEntity> list = Lists.newArrayList(); List<GameEntity> list = AbilityUtils.getDefinedEntities(hostCard, sa.getParam("ExcessDamage"), sa);
list.addAll(AbilityUtils.getDefinedCards(hostCard, sa.getParam("ExcessDamage"), sa));
list.addAll(AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("ExcessDamage"), sa));
if (!list.isEmpty()) { if (!list.isEmpty()) {
damageMap.put(sourceLKI, list.get(0), excess); damageMap.put(sourceLKI, list.get(0), excess);

View File

@@ -17,6 +17,7 @@ import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.CardTranslation;
import forge.util.TextUtil; import forge.util.TextUtil;
public abstract class DamagePreventEffectBase extends SpellAbilityEffect { public abstract class DamagePreventEffectBase extends SpellAbilityEffect {
@@ -24,7 +25,7 @@ public abstract class DamagePreventEffectBase extends SpellAbilityEffect {
final Card hostCard = sa.getHostCard(); final Card hostCard = sa.getHostCard();
final Game game = hostCard.getGame(); final Game game = hostCard.getGame();
final Player player = hostCard.getController(); final Player player = hostCard.getController();
final String name = hostCard.getName() + "'s Effect"; final String name = CardTranslation.getTranslatedName(hostCard.getName()) + "'s Effect";
final String image = hostCard.getImageKey(); final String image = hostCard.getImageKey();
StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | ValidTarget$ "); StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | ValidTarget$ ");
sb.append((o instanceof Card ? "Card.IsRemembered" : "Player.IsRemembered")); sb.append((o instanceof Card ? "Card.IsRemembered" : "Player.IsRemembered"));

View File

@@ -38,6 +38,7 @@ public class DelayedTriggerEffect extends SpellAbilityEffect {
final Card host = sa.getHostCard(); final Card host = sa.getHostCard();
final Game game = host.getGame(); final Game game = host.getGame();
Map<String, String> mapParams = Maps.newHashMap(sa.getMapParams()); Map<String, String> mapParams = Maps.newHashMap(sa.getMapParams());
mapParams.remove("Cost"); mapParams.remove("Cost");
if (mapParams.containsKey("SpellDescription")) { if (mapParams.containsKey("SpellDescription")) {

View File

@@ -27,6 +27,7 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler; import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.CardTranslation;
import forge.util.TextUtil; import forge.util.TextUtil;
import forge.util.collect.FCollection; import forge.util.collect.FCollection;
@@ -113,7 +114,7 @@ public class EffectEffect extends SpellAbilityEffect {
String name = sa.getParam("Name"); String name = sa.getParam("Name");
if (name == null) { if (name == null) {
name = hostCard.getName() + (sa.hasParam("Boon") ? "'s Boon" : "'s Effect"); name = CardTranslation.getTranslatedName(hostCard.getName()) + (sa.hasParam("Boon") ? "'s Boon" : "'s Effect");
} }
// Unique Effects shouldn't be duplicated // Unique Effects shouldn't be duplicated

View File

@@ -10,6 +10,7 @@ import forge.game.replacement.ReplacementHandler;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.CardTranslation;
public class FogEffect extends SpellAbilityEffect { public class FogEffect extends SpellAbilityEffect {
@@ -22,7 +23,7 @@ public class FogEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) { public void resolve(SpellAbility sa) {
final Card hostCard = sa.getHostCard(); final Card hostCard = sa.getHostCard();
final Game game = hostCard.getGame(); final Game game = hostCard.getGame();
final String name = hostCard.getName() + "'s Effect"; final String name = CardTranslation.getTranslatedName(hostCard.getName()) + "'s Effect";
final String image = hostCard.getImageKey(); final String image = hostCard.getImageKey();
StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | IsCombat$ True"); StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | IsCombat$ True");
sb.append(" | Prevent$ True | Description$ Prevent all combat damage this turn."); sb.append(" | Prevent$ True | Description$ Prevent all combat damage this turn.");

View File

@@ -15,6 +15,7 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler; import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.CardTranslation;
public abstract class RegenerateBaseEffect extends SpellAbilityEffect { public abstract class RegenerateBaseEffect extends SpellAbilityEffect {
@@ -24,7 +25,7 @@ public abstract class RegenerateBaseEffect extends SpellAbilityEffect {
// create Effect for Regeneration // create Effect for Regeneration
final Card eff = createEffect( final Card eff = createEffect(
sa, sa.getActivatingPlayer(), hostCard.getName() + "'s Regeneration", hostCard.getImageKey()); sa, sa.getActivatingPlayer(), CardTranslation.getTranslatedName(hostCard.getName()) + "'s Regeneration", hostCard.getImageKey());
eff.addRemembered(list); eff.addRemembered(list);
addForgetOnMovedTrigger(eff, "Battlefield"); addForgetOnMovedTrigger(eff, "Battlefield");

View File

@@ -15,6 +15,7 @@ import forge.game.replacement.ReplacementLayer;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.CardTranslation;
public class SkipPhaseEffect extends SpellAbilityEffect { public class SkipPhaseEffect extends SpellAbilityEffect {
@@ -58,7 +59,7 @@ public class SkipPhaseEffect extends SpellAbilityEffect {
final String duration, final String phase, final String step) { final String duration, final String phase, final String step) {
final Card hostCard = sa.getHostCard(); final Card hostCard = sa.getHostCard();
final Game game = hostCard.getGame(); final Game game = hostCard.getGame();
final String name = hostCard.getName() + "'s Effect"; final String name = CardTranslation.getTranslatedName(hostCard.getName()) + "'s Effect";
final String image = hostCard.getImageKey(); final String image = hostCard.getImageKey();
final boolean isNextThisTurn = duration != null && duration.equals("NextThisTurn"); final boolean isNextThisTurn = duration != null && duration.equals("NextThisTurn");

View File

@@ -16,6 +16,7 @@ import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.util.CardTranslation;
import forge.util.Lang; import forge.util.Lang;
public class SkipTurnEffect extends SpellAbilityEffect { public class SkipTurnEffect extends SpellAbilityEffect {
@@ -38,7 +39,7 @@ public class SkipTurnEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) { public void resolve(SpellAbility sa) {
final Card hostCard = sa.getHostCard(); final Card hostCard = sa.getHostCard();
final Game game = hostCard.getGame(); final Game game = hostCard.getGame();
final String name = hostCard.getName() + "'s Effect"; final String name = CardTranslation.getTranslatedName(hostCard.getName()) + "'s Effect";
final String image = hostCard.getImageKey(); final String image = hostCard.getImageKey();
final int numTurns = AbilityUtils.calculateAmount(hostCard, sa.getParam("NumTurns"), sa); final int numTurns = AbilityUtils.calculateAmount(hostCard, sa.getParam("NumTurns"), sa);
String repeffstr = "Event$ BeginTurn | ActiveZones$ Command | ValidPlayer$ You " + String repeffstr = "Event$ BeginTurn | ActiveZones$ Command | ValidPlayer$ You " +

View File

@@ -299,7 +299,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
private Map<Long, Player> goad = Maps.newTreeMap(); private Map<Long, Player> goad = Maps.newTreeMap();
private final List<GameCommand> leavePlayCommandList = Lists.newArrayList(); private final List<GameCommand> leavePlayCommandList = Lists.newArrayList();
private final List<GameCommand> etbCommandList = Lists.newArrayList();
private final List<GameCommand> untapCommandList = Lists.newArrayList(); private final List<GameCommand> untapCommandList = Lists.newArrayList();
private final List<GameCommand> changeControllerCommandList = Lists.newArrayList(); private final List<GameCommand> changeControllerCommandList = Lists.newArrayList();
private final List<GameCommand> unattachCommandList = Lists.newArrayList(); private final List<GameCommand> unattachCommandList = Lists.newArrayList();
@@ -3265,20 +3264,24 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
return canCounter; return canCounter;
} }
public final void addComesIntoPlayCommand(final GameCommand c) {
etbCommandList.add(c);
}
public final void runComesIntoPlayCommands() {
for (final GameCommand c : etbCommandList) {
c.run();
}
etbCommandList.clear();
}
public final void addLeavesPlayCommand(final GameCommand c) { public final void addLeavesPlayCommand(final GameCommand c) {
leavePlayCommandList.add(c); leavePlayCommandList.add(c);
} }
public final void addUntapCommand(final GameCommand c) {
untapCommandList.add(c);
}
public final void addUnattachCommand(final GameCommand c) {
unattachCommandList.add(c);
}
public final void addFaceupCommand(final GameCommand c) {
faceupCommandList.add(c);
}
public final void addFacedownCommand(final GameCommand c) {
facedownCommandList.add(c);
}
public final void addChangeControllerCommand(final GameCommand c) {
changeControllerCommandList.add(c);
}
public final void runLeavesPlayCommands() { public final void runLeavesPlayCommands() {
for (final GameCommand c : leavePlayCommandList) { for (final GameCommand c : leavePlayCommandList) {
@@ -3286,22 +3289,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
} }
leavePlayCommandList.clear(); leavePlayCommandList.clear();
} }
public final void addUntapCommand(final GameCommand c) {
untapCommandList.add(c);
}
public final void addUnattachCommand(final GameCommand c) {
unattachCommandList.add(c);
}
public final void addFaceupCommand(final GameCommand c) {
faceupCommandList.add(c);
}
public final void addFacedownCommand(final GameCommand c) {
facedownCommandList.add(c);
}
public final void runUntapCommands() { public final void runUntapCommands() {
for (final GameCommand c : untapCommandList) { for (final GameCommand c : untapCommandList) {
c.run(); c.run();
@@ -3314,25 +3301,18 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
} }
unattachCommandList.clear(); unattachCommandList.clear();
} }
public final void runFaceupCommands() { public final void runFaceupCommands() {
for (final GameCommand c : faceupCommandList) { for (final GameCommand c : faceupCommandList) {
c.run(); c.run();
} }
faceupCommandList.clear(); faceupCommandList.clear();
} }
public final void runFacedownCommands() { public final void runFacedownCommands() {
for (final GameCommand c : facedownCommandList) { for (final GameCommand c : facedownCommandList) {
c.run(); c.run();
} }
facedownCommandList.clear(); facedownCommandList.clear();
} }
public final void addChangeControllerCommand(final GameCommand c) {
changeControllerCommandList.add(c);
}
public final void runChangeControllerCommands() { public final void runChangeControllerCommands() {
for (final GameCommand c : changeControllerCommandList) { for (final GameCommand c : changeControllerCommandList) {
c.run(); c.run();
@@ -3346,16 +3326,16 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
view.updateSickness(this); view.updateSickness(this);
} }
public final boolean isFirstTurnControlled() {
return sickness;
}
public final boolean hasSickness() { public final boolean hasSickness() {
return sickness && !hasKeyword(Keyword.HASTE); return sickness && !hasKeyword(Keyword.HASTE);
} }
public final boolean isSick() { public final boolean isSick() {
return sickness && isCreature() && !hasKeyword(Keyword.HASTE); return hasSickness() && isCreature();
}
public final boolean isFirstTurnControlled() {
return sickness;
} }
public boolean hasBecomeTargetThisTurn() { public boolean hasBecomeTargetThisTurn() {
@@ -5070,7 +5050,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
getGame().getTriggerHandler().runTrigger(TriggerType.PhaseOut, runParams, false); getGame().getTriggerHandler().runTrigger(TriggerType.PhaseOut, runParams, false);
// when it doesn't exist the game will no longer see it as tapped // when it doesn't exist the game will no longer see it as tapped
runUntapCommands(); runUntapCommands();
// TODO need to run UntilHostLeavesPlay commands but only when worded "for as long as" // TODO CR 702.26f need to run LeavesPlay + changeController commands but only when worded "for as long as"
} }
setPhasedOut(!phasedOut); setPhasedOut(!phasedOut);
@@ -5636,7 +5616,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
@Override @Override
public final int addDamageAfterPrevention(final int damageIn, final Card source, final boolean isCombat, GameEntityCounterTable counterTable) { public final int addDamageAfterPrevention(final int damageIn, final Card source, final boolean isCombat, GameEntityCounterTable counterTable) {
if (damageIn <= 0) { if (damageIn <= 0) {
return 0; // Rule 119.8 return 0; // 120.8
} }
// 120.1a Damage cant be dealt to an object thats neither a creature nor a planeswalker. // 120.1a Damage cant be dealt to an object thats neither a creature nor a planeswalker.

View File

@@ -160,7 +160,7 @@ public class PlayerProperty {
return false; return false;
} }
} else if (property.equals("Defending")) { } else if (property.equals("Defending")) {
if (!game.getCombat().getAttackersAndDefenders().values().contains(player)) { if (game.getCombat() == null || !game.getCombat().getAttackersAndDefenders().values().contains(player)) {
return false; return false;
} }
} else if (property.equals("LostLifeThisTurn")) { } else if (property.equals("LostLifeThisTurn")) {

View File

@@ -29,7 +29,6 @@ public class StaticAbilityNumLoyaltyAct {
} }
public static boolean applyLimitIncrease(final StaticAbility stAb, final Card card) { public static boolean applyLimitIncrease(final StaticAbility stAb, final Card card) {
if (!stAb.matchesValidParam("ValidCard", card)) { if (!stAb.matchesValidParam("ValidCard", card)) {
return false; return false;
} }
@@ -58,7 +57,7 @@ public class StaticAbilityNumLoyaltyAct {
} }
} }
int more = AbilityUtils.calculateAmount(card, stAb.getParam("Additional"), stAb); int more = AbilityUtils.calculateAmount(card, stAb.getParam("Additional"), stAb);
addl = addl + more; addl += more;
} }
} }
} }

View File

@@ -305,7 +305,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
return; return;
} }
if (sp instanceof AbilityStatic) { if (sp instanceof AbilityStatic || (sp.isTrigger() && sp.getTrigger().getOverridingAbility() instanceof AbilityStatic)) {
AbilityUtils.resolve(sp); AbilityUtils.resolve(sp);
// AbilityStatic should do nothing below // AbilityStatic should do nothing below
return; return;

View File

@@ -36,7 +36,6 @@ public class PlayerZoneBattlefield extends PlayerZone {
private static final long serialVersionUID = 5750837078903423978L; private static final long serialVersionUID = 5750837078903423978L;
private boolean trigger = true; private boolean trigger = true;
private boolean leavesTrigger = true;
private CardCollection meldedCards = new CardCollection(); private CardCollection meldedCards = new CardCollection();
public PlayerZoneBattlefield(final ZoneType zone, final Player player) { public PlayerZoneBattlefield(final ZoneType zone, final Player player) {
@@ -63,7 +62,6 @@ public class PlayerZoneBattlefield extends PlayerZone {
if (trigger) { if (trigger) {
c.setSickness(true); // summoning sickness c.setSickness(true); // summoning sickness
c.runComesIntoPlayCommands();
} }
} }
@@ -72,14 +70,13 @@ public class PlayerZoneBattlefield extends PlayerZone {
public final void remove(final Card c) { public final void remove(final Card c) {
super.remove(c); super.remove(c);
if (leavesTrigger) { if (trigger) {
c.runLeavesPlayCommands(); c.runLeavesPlayCommands();
} }
} }
public final void setTriggers(final boolean b) { public final void setTriggers(final boolean b) {
trigger = b; trigger = b;
leavesTrigger = b;
} }
@Override @Override

View File

@@ -2,9 +2,9 @@ Name:Academy Loremaster
ManaCost:U U ManaCost:U U
Types:Creature Human Wizard Types:Creature Human Wizard
PT:2/3 PT:2/3
T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | OptionalDecider$ TriggeredPlayer | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, that player may draw an additional card. If they do, spells they cast this turn cost {2} more to cast T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | OptionalDecider$ TriggeredPlayer | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, that player may draw an additional card. If they do, spells they cast this turn cost {2} more to cast.
SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ TriggeredPlayer | RememberDrawn$ True | SubAbility$ DBEffect SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ TriggeredPlayer | RememberDrawn$ True | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | ConditionDefined$ Remembered | ConditionPresent$ Card | Duration$ EndOfTurn | StaticAbilities$ RaiseCost | SubAbility$ DBCleanup | SpellDescription$ Spells they cast this turn cost {2} more to cast SVar:DBEffect:DB$ Effect | ConditionDefined$ Remembered | ConditionPresent$ Card | Duration$ EndOfTurn | StaticAbilities$ RaiseCost | SubAbility$ DBCleanup
SVar:RaiseCost:Mode$ RaiseCost | ValidCard$ Card.ActivePlayerCtrl | Type$ Spell | Amount$ 2 | Description$ Spells they cast this turn cost {2} more to cast SVar:RaiseCost:Mode$ RaiseCost | ValidCard$ Card.ActivePlayerCtrl | Type$ Spell | Amount$ 2 | Description$ Spells they cast this turn cost {2} more to cast.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:At the beginning of each player's draw step, that player may draw an additional card. If they do, spells they cast this turn cost {2} more to cast Oracle:At the beginning of each player's draw step, that player may draw an additional card. If they do, spells they cast this turn cost {2} more to cast.

View File

@@ -2,7 +2,7 @@ Name:Awakening
ManaCost:2 G G ManaCost:2 G G
Types:Enchantment Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigUntapAll | TriggerDescription$ At the beginning of each upkeep, untap all creatures and lands. T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigUntapAll | TriggerDescription$ At the beginning of each upkeep, untap all creatures and lands.
SVar:TrigUntapAll:DB$ UntapAll | ValidCards$ Creature,Land | SpellDescription$ untap all creatures and lands. SVar:TrigUntapAll:DB$ UntapAll | ValidCards$ Creature,Land
SVar:UntapsEachTurn:Creature,Land SVar:UntapsEachTurn:Creature,Land
AI:RemoveDeck:Random AI:RemoveDeck:Random
Oracle:At the beginning of each upkeep, untap all creatures and lands. Oracle:At the beginning of each upkeep, untap all creatures and lands.

View File

@@ -5,8 +5,8 @@ PT:2/2
K:Trample K:Trample
K:Haste K:Haste
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME deals damage to a player, that player discards all the cards in their hand, then draws that many cards. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME deals damage to a player, that player discards all the cards in their hand, then draws that many cards.
SVar:TrigDiscard:DB$ Discard | Defined$ TriggeredTarget | Mode$ Hand | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ Discard hand SVar:TrigDiscard:DB$ Discard | Defined$ TriggeredTarget | Mode$ Hand | RememberDiscarded$ True | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ TriggeredTarget | SubAbility$ DBCleanup | SpellDescription$ Draw that many cards SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ TriggeredTarget | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Remembered$Amount SVar:X:Remembered$Amount
Oracle:Trample, haste\nWhenever Barbed Shocker deals damage to a player, that player discards all the cards in their hand, then draws that many cards. Oracle:Trample, haste\nWhenever Barbed Shocker deals damage to a player, that player discards all the cards in their hand, then draws that many cards.

View File

@@ -2,8 +2,8 @@ Name:Bartered Cow
ManaCost:3 W ManaCost:3 W
Types:Creature Ox Types:Creature Ox
PT:3/3 PT:3/3
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | TriggerController$ TriggeredCardController | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies or blocks you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | TriggerController$ TriggeredCardController | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies or when you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")
T:Mode$ Discarded | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies or blocks you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") T:Mode$ Discarded | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies or when you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You
SVar:SacMe:1 SVar:SacMe:1
SVar:DiscardMe:3 SVar:DiscardMe:3

View File

@@ -3,7 +3,7 @@ ManaCost:6 U
Types:Creature Elemental Types:Creature Elemental
PT:5/5 PT:5/5
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 blue Merfolk Wizard creature tokens. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 blue Merfolk Wizard creature tokens.
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ u_1_1_merfolk_wizard | TokenOwner$ You | SpellDescription$ Create two 1/1 blue Merfolk Wizard creature tokens. SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ u_1_1_merfolk_wizard | TokenOwner$ You
A:AB$ Untap | Cost$ tapXType<2/Merfolk> | SubAbility$ GainShroud | SpellDescription$ Untap CARDNAME. A:AB$ Untap | Cost$ tapXType<2/Merfolk> | SubAbility$ GainShroud | SpellDescription$ Untap CARDNAME.
SVar:GainShroud:DB$ Pump | Defined$ Self | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn. SVar:GainShroud:DB$ Pump | Defined$ Self | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn.
Oracle:When Benthicore enters the battlefield, create two 1/1 blue Merfolk Wizard creature tokens.\nTap two untapped Merfolk you control: Untap Benthicore. It gains shroud until end of turn. (It can't be the target of spells or abilities.) Oracle:When Benthicore enters the battlefield, create two 1/1 blue Merfolk Wizard creature tokens.\nTap two untapped Merfolk you control: Untap Benthicore. It gains shroud until end of turn. (It can't be the target of spells or abilities.)

View File

@@ -4,6 +4,6 @@ Types:Legendary Creature Cyclops
PT:7/6 PT:7/6
K:Trample K:Trample
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDig | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDig | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard.
SVar:TrigDig:DB$ Dig | DigNum$ 3 | Defined$ You | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | DestinationZone2$ Graveyard | SpellDescription$ Reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard. SVar:TrigDig:DB$ Dig | DigNum$ 3 | Defined$ You | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | DestinationZone2$ Graveyard
A:AB$ DealDamage | Cost$ Discard<1/Land> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target. A:AB$ DealDamage | Cost$ Discard<1/Land> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target.
Oracle:Trample\nWhenever Borborygmos Enraged deals combat damage to a player, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard.\nDiscard a land card: Borborygmos Enraged deals 3 damage to any target. Oracle:Trample\nWhenever Borborygmos Enraged deals combat damage to a player, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard.\nDiscard a land card: Borborygmos Enraged deals 3 damage to any target.

View File

@@ -4,7 +4,7 @@ Types:Creature Human Pirate
PT:2/2 PT:2/2
K:Flash K:Flash
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, each token that would be created under an opponent's control this turn is created under your control instead. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, each token that would be created under an opponent's control this turn is created under your control instead.
SVar:TrigEffect:DB$ Effect | Name$ Crafty Cutpurse Effect | ReplacementEffects$ OppCreatEnters | SpellDescription$ Each token that would be created under an opponent's control this turn is created under your control instead. SVar:TrigEffect:DB$ Effect | Name$ Crafty Cutpurse Effect | ReplacementEffects$ OppCreatEnters
SVar:OppCreatEnters:Event$ CreateToken | ActiveZones$ Command | ValidToken$ Card.OppCtrl | ReplaceWith$ ETBYourCtrl | Layer$ Control | Description$ Each token that would be created under an opponent's control this turn is created under your control instead. SVar:OppCreatEnters:Event$ CreateToken | ActiveZones$ Command | ValidToken$ Card.OppCtrl | ReplaceWith$ ETBYourCtrl | Layer$ Control | Description$ Each token that would be created under an opponent's control this turn is created under your control instead.
SVar:ETBYourCtrl:DB$ ReplaceToken | Type$ ReplaceController | ValidCard$ Card.OppCtrl | NewController$ You SVar:ETBYourCtrl:DB$ ReplaceToken | Type$ ReplaceController | ValidCard$ Card.OppCtrl | NewController$ You
Oracle:Flash\nWhen Crafty Cutpurse enters the battlefield, each token that would be created under an opponent's control this turn is created under your control instead. Oracle:Flash\nWhen Crafty Cutpurse enters the battlefield, each token that would be created under an opponent's control this turn is created under your control instead.

View File

@@ -2,6 +2,6 @@ Name:Debt of Loyalty
ManaCost:1 W W ManaCost:1 W W
Types:Instant Types:Instant
A:SP$ Regenerate | Cost$ 1 W W | ValidTgts$ Creature | TgtPrompt$ Select target creature | RegenerationTrigger$ TrigGainControl | SpellDescription$ Regenerate target creature. You gain control of that creature if it regenerates this way. A:SP$ Regenerate | Cost$ 1 W W | ValidTgts$ Creature | TgtPrompt$ Select target creature | RegenerationTrigger$ TrigGainControl | SpellDescription$ Regenerate target creature. You gain control of that creature if it regenerates this way.
SVar:TrigGainControl:ST$ GainControl | Cost$ 0 | Defined$ TriggeredCard | NewController$ You | SpellDescription$ Source controller gains control of CARDNAME if it regenerates this way. SVar:TrigGainControl:ST$ GainControl | Cost$ 0 | Defined$ TriggeredCard | NewController$ You
AI:RemoveDeck:All AI:RemoveDeck:All
Oracle:Regenerate target creature. You gain control of that creature if it regenerates this way. Oracle:Regenerate target creature. You gain control of that creature if it regenerates this way.

View File

@@ -2,7 +2,7 @@ Name:Deserter's Quarters
ManaCost:2 ManaCost:2
Types:Artifact Types:Artifact
K:You may choose not to untap CARDNAME during your untap step. K:You may choose not to untap CARDNAME during your untap step.
A:AB$ Tap | Cost$ 6 T | ValidTgts$ Creature | RememberTapped$ True | AlwaysRemember$ True | SpellDescription$ Tap target creature. It doesn't untap during its controller's untap step for as long as Deserter's Quarters remains tapped. | StackDescription$ SpellDescription A:AB$ Tap | Cost$ 6 T | ValidTgts$ Creature | RememberTapped$ True | AlwaysRemember$ True | SpellDescription$ Tap target creature. It doesn't untap during its controller's untap step for as long as CARDNAME remains tapped. | StackDescription$ SpellDescription
S:Mode$ Continuous | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. S:Mode$ Continuous | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step.
T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True
SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True

View File

@@ -4,5 +4,5 @@ Types:Creature Dragon Warrior
PT:5/3 PT:5/3
K:Trample K:Trample
T:Mode$ DamageDone | ValidSource$ Card.YouCtrl,Emblem.YouCtrl | ValidTarget$ Player | TriggerZones$ Battlefield | DamageAmount$ GE5 | Execute$ TrigDraw | TriggerDescription$ Whenever a source you control deals 5 or more damage to a player, draw a card. T:Mode$ DamageDone | ValidSource$ Card.YouCtrl,Emblem.YouCtrl | ValidTarget$ Player | TriggerZones$ Battlefield | DamageAmount$ GE5 | Execute$ TrigDraw | TriggerDescription$ Whenever a source you control deals 5 or more damage to a player, draw a card.
SVar:TrigDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1
Oracle:Trample\nWhenever a source you control deals 5 or more damage to a player, draw a card. Oracle:Trample\nWhenever a source you control deals 5 or more damage to a player, draw a card.

View File

@@ -3,7 +3,7 @@ ManaCost:4 G G
Types:Legendary Creature Treefolk Wizard Types:Legendary Creature Treefolk Wizard
PT:6/6 PT:6/6
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 1/1 blue Human Wizard creature tokens equal to the number of differently named lands you control. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 1/1 blue Human Wizard creature tokens equal to the number of differently named lands you control.
SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ u_1_1_human_wizard | SpellDescription$ Create a number of 1/1 blue Human Wizard creature tokens equal to the number of differently named lands you control. SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ u_1_1_human_wizard
SVar:X:Count$DifferentCardNames_Land.YouCtrl+inZoneBattlefield SVar:X:Count$DifferentCardNames_Land.YouCtrl+inZoneBattlefield
A:AB$ Draw | Cost$ 4 G U | NumCards$ Y | SubAbility$ PumpAll | SpellDescription$ Draw a card for each Wizard you control. They each get +1/+1 until end of turn for each card in your hand. A:AB$ Draw | Cost$ 4 G U | NumCards$ Y | SubAbility$ PumpAll | SpellDescription$ Draw a card for each Wizard you control. They each get +1/+1 until end of turn for each card in your hand.
SVar:Y:Count$Valid Wizard.YouCtrl SVar:Y:Count$Valid Wizard.YouCtrl

View File

@@ -1,7 +1,7 @@
Name:Gate to the Aether Name:Gate to the Aether
ManaCost:6 ManaCost:6
Types:Artifact Types:Artifact
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigAetherDig | TriggerController$ TriggeredPlayer | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player reveals the top card of their library. If it's an artifact, creature, enchantment, or land card, the player may put it onto the battlefield. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigAetherDig | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player reveals the top card of their library. If it's an artifact, creature, enchantment, or land card, the player may put it onto the battlefield.
SVar:TrigAetherDig:DB$ Dig | Defined$ TriggeredPlayer | DigNum$ 1 | Reveal$ True | DestinationZone$ Battlefield | DestinationZone2$ Library | LibraryPosition2$ 0 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Artifact,Creature,Enchantment,Land SVar:TrigAetherDig:DB$ Dig | Defined$ TriggeredPlayer | Choser$ TriggeredPlayer | DigNum$ 1 | Reveal$ True | DestinationZone$ Battlefield | DestinationZone2$ Library | LibraryPosition2$ 0 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Artifact,Creature,Enchantment,Land
AI:RemoveDeck:Random AI:RemoveDeck:Random
Oracle:At the beginning of each player's upkeep, that player reveals the top card of their library. If it's an artifact, creature, enchantment, or land card, the player may put it onto the battlefield. Oracle:At the beginning of each player's upkeep, that player reveals the top card of their library. If it's an artifact, creature, enchantment, or land card, the player may put it onto the battlefield.

View File

@@ -2,7 +2,7 @@ Name:Genesis Chamber
ManaCost:2 ManaCost:2
Types:Artifact Types:Artifact
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken | TriggerZones$ Battlefield | Execute$ TrigToken | IsPresent$ Card.Self+untapped | TriggerDescription$ Whenever a nontoken creature enters the battlefield, if CARDNAME is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken | TriggerZones$ Battlefield | Execute$ TrigToken | IsPresent$ Card.Self+untapped | TriggerDescription$ Whenever a nontoken creature enters the battlefield, if CARDNAME is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ TriggeredCardController | TokenScript$ c_1_1_a_myr | SpellDescription$ Create a 1/1 Myr artifact creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ TriggeredCardController | TokenScript$ c_1_1_a_myr
AI:RemoveDeck:Random AI:RemoveDeck:Random
DeckHas:Ability$Token DeckHas:Ability$Token
Oracle:Whenever a nontoken creature enters the battlefield, if Genesis Chamber is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token. Oracle:Whenever a nontoken creature enters the battlefield, if Genesis Chamber is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token.

View File

@@ -4,6 +4,6 @@ Types:Creature Shapeshifter
PT:2/2 PT:2/2
K:Changeling K:Changeling
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a colorless Shapeshifter creature token with changeling. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a colorless Shapeshifter creature token with changeling.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_2_2_shapeshifter_changeling | TokenOwner$ You | SpellDescription$ Create a 2/2 colorless Shapeshifter creature token with changeling. (It has every creature type.) SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_2_2_shapeshifter_changeling | TokenOwner$ You
DeckHas:Ability$Token DeckHas:Ability$Token
Oracle:Changeling (This card is every creature type.)\nWhen Irregular Cohort enters the battlefield, create a 2/2 colorless Shapeshifter creature token with changeling. Oracle:Changeling (This card is every creature type.)\nWhen Irregular Cohort enters the battlefield, create a 2/2 colorless Shapeshifter creature token with changeling.

View File

@@ -3,7 +3,7 @@ ManaCost:1 G
Types:Legendary Creature Human Druid Types:Legendary Creature Human Druid
PT:1/2 PT:1/2
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you draw your second card each turn, create a 2/2 green Cat creature token. T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you draw your second card each turn, create a 2/2 green Cat creature token.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ g_2_2_cat | SpellDescription$ Create a 2/2 green Cat creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ g_2_2_cat
DeckHas:Ability$Token DeckHas:Ability$Token
A:AB$ AnimateAll | Cost$ 4 G G | ValidCards$ Creature.YouCtrl | Power$ X | Toughness$ X | SpellDescription$ Until end of turn, creatures you control have base power and toughness X/X, where X is the number of cards in your hand. A:AB$ AnimateAll | Cost$ 4 G G | ValidCards$ Creature.YouCtrl | Power$ X | Toughness$ X | SpellDescription$ Until end of turn, creatures you control have base power and toughness X/X, where X is the number of cards in your hand.
SVar:X:Count$InYourHand SVar:X:Count$InYourHand

View File

@@ -5,6 +5,6 @@ PT:4/5
K:Kicker:5 B K:Kicker:5 B
K:Menace K:Menace
T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace. T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace.
SVar:TrigToken:DB$ Token | TokenAmount$ 8 | TokenScript$ b_2_2_zombie_knight_menace | TokenOwner$ You | SpellDescription$ When CARDNAME enters the battlefield, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace. SVar:TrigToken:DB$ Token | TokenAmount$ 8 | TokenScript$ b_2_2_zombie_knight_menace | TokenOwner$ You
DeckHas:Ability$Token DeckHas:Ability$Token
Oracle:Kicker {5}{B} (You may pay an additional {5}{B} as you cast this spell.)\nMenace\nWhen Josu Vess, Lich Knight enters the battlefield, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace. Oracle:Kicker {5}{B} (You may pay an additional {5}{B} as you cast this spell.)\nMenace\nWhen Josu Vess, Lich Knight enters the battlefield, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace.

View File

@@ -5,6 +5,6 @@ PT:3/4
K:Flying K:Flying
K:Lifelink K:Lifelink
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn.
SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ X | TokenScript$ w_2_2_knight_vigilance | SpellDescription$ Create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn. SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ X | TokenScript$ w_2_2_knight_vigilance
SVar:X:TriggeredCardController$OpponentsAttackedThisTurn SVar:X:TriggeredCardController$OpponentsAttackedThisTurn
Oracle:Flying, lifelink\nWhen Militant Angel enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn. Oracle:Flying, lifelink\nWhen Militant Angel enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn.

View File

@@ -6,9 +6,8 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S
SVar:TrigDrain:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife SVar:TrigDrain:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ At the beginning of your end step you may exile NICKNAME. If you do, return it to the battlefield under it's owner's control at the beginning of your next upkeep. It gains haste. T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ At the beginning of your end step you may exile NICKNAME. If you do, return it to the battlefield under it's owner's control at the beginning of your next upkeep. It gains haste.
SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBDelaytrig SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DelTrig
SVar:DBDelaytrig:DB$ Effect | Name$ Obzedat Effect | Triggers$ TrigEOT | RememberObjects$ Self | Duration$ Permanent SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ ObzedatReturn | ConditionDefined$ Remembered | ConditionPresent$ Card | RememberObjects$ Remembered | TriggerDescription$ Return CARDNAME to the battlefield under its owner's control at the beginning of the next end step.
SVar:TrigEOT:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ ObzedatReturn | OneOff$ True | TriggerDescription$ Return CARDNAME to the battlefield under it's owner's control. It gains haste. SVar:ObzedatReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Exile,Command | Destination$ Battlefield | SubAbility$ ObzedatPump
SVar:ObzedatReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ ObzedatPump
SVar:ObzedatPump:DB$ Pump | Defined$ Remembered | KW$ Haste | Duration$ Permanent SVar:ObzedatPump:DB$ Pump | Defined$ Remembered | KW$ Haste | Duration$ Permanent
Oracle:When Obzedat, Ghost Council enters the battlefield, target opponent loses 2 life and you gain 2 life.\nAt the beginning of your end step, you may exile Obzedat. If you do, return it to the battlefield under its owner's control at the beginning of your next upkeep. It gains haste. Oracle:When Obzedat, Ghost Council enters the battlefield, target opponent loses 2 life and you gain 2 life.\nAt the beginning of your end step, you may exile Obzedat. If you do, return it to the battlefield under its owner's control at the beginning of your next upkeep. It gains haste.

View File

@@ -3,7 +3,7 @@ ManaCost:1 U U
Types:Creature Djinn Types:Creature Djinn
PT:2/3 PT:2/3
K:You may choose not to untap CARDNAME during your untap step. K:You may choose not to untap CARDNAME during your untap step.
A:AB$ GainControl | Cost$ T | ValidTgts$ Creature.powerLEX | TgtPrompt$ Select target creature with power less than or equal to Old Man's. | LoseControl$ Untap,LeavesPlay,LoseControl,StaticCommandCheck | StaticCommandCheckSVar$ Y | StaticCommandSVarCompare$ GTX | SpellDescription$ Gain control of target creature with power less than or equal to Old Man of the Sea's power for as long as Old Man of the Sea remains tapped and that creature's power remains less than or equal to Old Man of the Sea's power. A:AB$ GainControl | Cost$ T | ValidTgts$ Creature.powerLEX | TgtPrompt$ Select target creature with power less than or equal to Old Man's. | LoseControl$ Untap,LeavesPlay,LoseControl,StaticCommandCheck | StaticCommandCheckSVar$ Y | StaticCommandSVarCompare$ GTX | SpellDescription$ Gain control of target creature with power less than or equal to CARDNAME's power for as long as CARDNAME remains tapped and that creature's power remains less than or equal to CARDNAME's power.
SVar:X:Count$CardPower SVar:X:Count$CardPower
# the hostcard of SVar Y is the controlled card # the hostcard of SVar Y is the controlled card
SVar:Y:Count$CardPower SVar:Y:Count$CardPower

View File

@@ -2,7 +2,7 @@ Name:Prophetic Titan
ManaCost:4 U R ManaCost:4 U R
Types:Creature Giant Wizard Types:Creature Giant Wizard
PT:4/4 PT:4/4
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ Delirium — When CARDNAME enters the battlefield, choose one. If there are four or more card types among cards in your graveyard, choose both instead. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ Delirium — When CARDNAME enters the battlefield, ABILITY
SVar:TrigCharm:DB$ Charm | CharmNum$ X | Choices$ DBDealDamage,DBDig | AdditionalDescription$ If there are four or more card types in your graveyard, choose both. SVar:TrigCharm:DB$ Charm | CharmNum$ X | Choices$ DBDealDamage,DBDig | AdditionalDescription$ If there are four or more card types in your graveyard, choose both.
SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker,Player | TgtPrompt$ Select any target | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to any target. SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker,Player | TgtPrompt$ Select any target | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to any target.
SVar:DBDig:DB$ Dig | DigNum$ 4 | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order. SVar:DBDig:DB$ Dig | DigNum$ 4 | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order.

View File

@@ -2,7 +2,7 @@ Name:Pure Reflection
ManaCost:2 W ManaCost:2 W
Types:Enchantment Types:Enchantment
T:Mode$ SpellCast | ValidCard$ Creature | Execute$ TrigDestroy | ValidActivatingPlayer$ Player | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a creature spell, destroy all Reflections. Then that player creates an X/X white Reflection creature token, where X is the mana value of that spell. T:Mode$ SpellCast | ValidCard$ Creature | Execute$ TrigDestroy | ValidActivatingPlayer$ Player | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a creature spell, destroy all Reflections. Then that player creates an X/X white Reflection creature token, where X is the mana value of that spell.
SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Reflection | SubAbility$ DBToken | SpellDescription$ Destroy all Reflections SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Reflection | SubAbility$ DBToken
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenPower$ X | TokenToughness$ X | TokenScript$ w_x_x_reflection | TokenOwner$ TriggeredActivator SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenPower$ X | TokenToughness$ X | TokenScript$ w_x_x_reflection | TokenOwner$ TriggeredActivator
SVar:X:TriggeredStackInstance$CardManaCostLKI SVar:X:TriggeredStackInstance$CardManaCostLKI
Oracle:Whenever a player casts a creature spell, destroy all Reflections. Then that player creates an X/X white Reflection creature token, where X is the mana value of that spell. Oracle:Whenever a player casts a creature spell, destroy all Reflections. Then that player creates an X/X white Reflection creature token, where X is the mana value of that spell.

View File

@@ -5,7 +5,7 @@ PT:4/4
K:Partner:Krav, the Unredeemed:Krav K:Partner:Krav, the Unredeemed:Krav
K:Flying K:Flying
T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ YouTeamLifeGained | SVarCompare$ GE1 | Execute$ TrigWarrior | TriggerDescription$ At the beginning of each end step, if your team gained life this turn, create two 1/1 white Warrior creature tokens. T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ YouTeamLifeGained | SVarCompare$ GE1 | Execute$ TrigWarrior | TriggerDescription$ At the beginning of each end step, if your team gained life this turn, create two 1/1 white Warrior creature tokens.
SVar:TrigWarrior:DB$ Token | TokenAmount$ 2 | TokenScript$ w_1_1_warrior | TokenOwner$ You | SpellDescription$ Create two 1/1 white Warrior creature tokens. SVar:TrigWarrior:DB$ Token | TokenAmount$ 2 | TokenScript$ w_1_1_warrior | TokenOwner$ You
SVar:YouTeamLifeGained:Count$LifeYourTeamGainedThisTurn SVar:YouTeamLifeGained:Count$LifeYourTeamGainedThisTurn
DeckHints:Name$Krav, the Unredeemed DeckHints:Name$Krav, the Unredeemed
Oracle:Partner with Krav, the Unredeemed (When this creature enters the battlefield, target player may put Krav into their hand from their library, then shuffle.)\nFlying\nAt the beginning of each end step, if your team gained life this turn, create two 1/1 white Warrior creature tokens. Oracle:Partner with Krav, the Unredeemed (When this creature enters the battlefield, target player may put Krav into their hand from their library, then shuffle.)\nFlying\nAt the beginning of each end step, if your team gained life this turn, create two 1/1 white Warrior creature tokens.

View File

@@ -5,7 +5,7 @@ PT:1/1
K:Morph:3 G G K:Morph:3 G G
S:Mode$ Continuous | Affected$ Creature.Saproling | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Card.Self+faceUp | Description$ All Saprolings get +1/+1. S:Mode$ Continuous | Affected$ Creature.Saproling | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Card.Self+faceUp | Description$ All Saprolings get +1/+1.
T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, create four 1/1 green Saproling creature tokens. T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, create four 1/1 green Saproling creature tokens.
SVar:TrigToken:DB$ Token | TokenAmount$ 4 | TokenScript$ g_1_1_saproling | TokenOwner$ You | SpellDescription$ Create four 1/1 green Saproling creature tokens. SVar:TrigToken:DB$ Token | TokenAmount$ 4 | TokenScript$ g_1_1_saproling | TokenOwner$ You
SVar:PlayMain1:TRUE SVar:PlayMain1:TRUE
DeckHints:Type$Fungus DeckHints:Type$Fungus
DeckHas:Ability$Token DeckHas:Ability$Token

View File

@@ -3,7 +3,7 @@ ManaCost:5 W
Types:Creature Giant Soldier Types:Creature Giant Soldier
PT:3/6 PT:3/6
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Human creature token. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Human creature token.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_human | TokenOwner$ You | SpellDescription$ Create a 1/1 white Human creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_human | TokenOwner$ You
DeckHints:Type$Human DeckHints:Type$Human
DeckHas:Ability$Token DeckHas:Ability$Token
Oracle:When Watchful Giant enters the battlefield, create a 1/1 white Human creature token. Oracle:When Watchful Giant enters the battlefield, create a 1/1 white Human creature token.

View File

@@ -4,7 +4,7 @@ Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigEvoke | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player reveals a card at random from their hand. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigEvoke | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player reveals a card at random from their hand. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able.
SVar:TrigEvoke:DB$ Reveal | Random$ True | RememberRevealed$ True | Defined$ TriggeredPlayer | SubAbility$ DBEvokeLand SVar:TrigEvoke:DB$ Reveal | Random$ True | RememberRevealed$ True | Defined$ TriggeredPlayer | SubAbility$ DBEvokeLand
SVar:DBEvokeLand:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Defined$ ValidHand Land.IsRemembered | ForgetChanged$ True | SubAbility$ DBEvokePlay SVar:DBEvokeLand:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Defined$ ValidHand Land.IsRemembered | ForgetChanged$ True | SubAbility$ DBEvokePlay
SVar:DBEvokePlay:DB$ Play | ValidZone$ Hand | Controller$ TriggeredPlayer | Defined$ Remembered | WithoutManaCost$ True | SubAbility$ DBCleanup SVar:DBEvokePlay:DB$ Play | ValidZone$ Hand | Controller$ TriggeredPlayer | Defined$ Remembered | ValidSA$ Spell | WithoutManaCost$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
AI:RemoveDeck:Random AI:RemoveDeck:Random
Oracle:At the beginning of each player's upkeep, that player reveals a card at random from their hand. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able. Oracle:At the beginning of each player's upkeep, that player reveals a card at random from their hand. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able.

View File

@@ -64,8 +64,8 @@ public abstract class InputSelectManyBase<T extends GameEntity> extends InputSyn
@Override @Override
public final void showMessage() { public final void showMessage() {
if ( FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) && if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) &&
(card!=null) ) { card != null) {
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
sb.append(card.toString()); sb.append(card.toString());
if ( (sa != null) && (!sa.toString().isEmpty()) ) { // some spell abilities have no useful string value if ( (sa != null) && (!sa.toString().isEmpty()) ) { // some spell abilities have no useful string value

View File

@@ -743,13 +743,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
switch (sa.getParam("ShowCardInPrompt")) { switch (sa.getParam("ShowCardInPrompt")) {
case "FirstRemembered": case "FirstRemembered":
o = sa.getHostCard().getFirstRemembered(); o = sa.getHostCard().getFirstRemembered();
if (o != null && o instanceof Card) { if (o instanceof Card) {
show = (Card)o; show = (Card)o;
} }
break; break;
case "LastRemembered": case "LastRemembered":
o = sa.getHostCard().getFirstRemembered(); o = sa.getHostCard().getFirstRemembered();
if (o != null && o instanceof Card) { if (o instanceof Card) {
show = (Card)o; show = (Card)o;
} }
break; break;