diff --git a/forge-core/src/main/java/forge/card/CardSplitType.java b/forge-core/src/main/java/forge/card/CardSplitType.java index a949ec8b975..f1e53ed0898 100644 --- a/forge-core/src/main/java/forge/card/CardSplitType.java +++ b/forge-core/src/main/java/forge/card/CardSplitType.java @@ -8,7 +8,8 @@ public enum CardSplitType Transform(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Transformed), Meld(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Meld), Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit), - Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped); + Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped), + Adventure(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Adventure); CardSplitType(FaceSelectionMethod calcMode, CardStateName stateName) { method = calcMode; diff --git a/forge-core/src/main/java/forge/card/CardStateName.java b/forge-core/src/main/java/forge/card/CardStateName.java index b7333a7de23..70b857dc5c8 100644 --- a/forge-core/src/main/java/forge/card/CardStateName.java +++ b/forge-core/src/main/java/forge/card/CardStateName.java @@ -9,6 +9,7 @@ public enum CardStateName { Meld, LeftSplit, RightSplit, + Adventure, ; diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 908f2bc678e..d45c5794e99 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -146,6 +146,10 @@ public class GameAction { } } + // if an adventureCard is put from Stack somewhere else, need to reset to Original State + if (c.isAdventureCard() && (zoneFrom.is(ZoneType.Stack) || !zoneTo.is(ZoneType.Stack))) { + c.setState(CardStateName.Original, true); + } // Clean up the temporary Dash SVar when the Dashed card leaves the battlefield // Clean up the temporary AtEOT SVar diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index e425d2fff6e..b0575c15420 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -22,6 +22,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import forge.card.CardStateName; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostParser; import forge.game.ability.AbilityUtils; @@ -101,6 +102,45 @@ public final class GameActionUtil { } source.turnFaceDownNoUpdate(); lkicheck = true; + } else if (sa.isAdventure() && !source.isInZone(ZoneType.Battlefield)) { + if (!source.isLKI()) { + source = CardUtil.getLKICopy(source); + } + + source.setState(CardStateName.Adventure, false); + + // need to reset CMC + source.setLKICMC(-1); + source.setLKICMC(source.getCMC()); + lkicheck = true; + } else if (source.isSplitCard() && (sa.isLeftSplit() || sa.isRightSplit())) { + if (!source.isLKI()) { + source = CardUtil.getLKICopy(source); + } + if (sa.isLeftSplit()) { + if (!source.hasState(CardStateName.LeftSplit)) { + source.addAlternateState(CardStateName.LeftSplit, false); + source.getState(CardStateName.LeftSplit).copyFrom( + sa.getHostCard().getState(CardStateName.LeftSplit), true); + } + + source.setState(CardStateName.LeftSplit, false); + } + + if (sa.isRightSplit()) { + if (!source.hasState(CardStateName.RightSplit)) { + source.addAlternateState(CardStateName.RightSplit, false); + source.getState(CardStateName.RightSplit).copyFrom( + sa.getHostCard().getState(CardStateName.RightSplit), true); + } + + source.setState(CardStateName.RightSplit, false); + } + + // need to reset CMC + source.setLKICMC(-1); + source.setLKICMC(source.getCMC()); + lkicheck = true; } if (lkicheck) { @@ -132,20 +172,6 @@ public final class GameActionUtil { newSA = sa.copyWithManaCostReplaced(activator, o.getAltManaCost()); newSA.setBasicSpell(false); changedManaCost = true; - if (host.hasSVar("AsForetoldSplitCMCHack")) { - // TODO: This is a temporary workaround for As Foretold interaction with split cards, better solution needed. - if (sa.isLeftSplit()) { - int leftCMC = sa.getHostCard().getCMC(Card.SplitCMCMode.LeftSplitCMC); - if (leftCMC > host.getCounters(CounterType.TIME)) { - continue; - } - } else if (sa.isRightSplit()) { - int rightCMC = sa.getHostCard().getCMC(Card.SplitCMCMode.RightSplitCMC); - if (rightCMC > host.getCounters(CounterType.TIME)) { - continue; - } - } - } } else { newSA = sa.copy(activator); } diff --git a/forge-game/src/main/java/forge/game/GlobalRuleChange.java b/forge-game/src/main/java/forge/game/GlobalRuleChange.java index 2e7fc2ca2ab..3eb37542dcf 100644 --- a/forge-game/src/main/java/forge/game/GlobalRuleChange.java +++ b/forge-game/src/main/java/forge/game/GlobalRuleChange.java @@ -27,6 +27,7 @@ public enum GlobalRuleChange { manapoolsDontEmpty ("Mana pools don't empty as steps and phases end."), noCycling ("Players can't cycle cards."), noCreatureETBTriggers ("Creatures entering the battlefield don't cause abilities to trigger."), + noCreatureDyingTriggers ("Creatures dying don't cause abilities to trigger."), noLegendRule ("The legend rule doesn't apply."), noPrevention ("Damage can't be prevented."), /* onlyOneAttackerATurn ("No more than one creature can attack each turn."), */ diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 99ecc3df0ea..7044c836f46 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -351,9 +351,12 @@ public class Card extends GameEntity implements Comparable { else if (isDoubleFaced() && currentStateName != CardStateName.Transformed) { return CardStateName.Transformed; } - else if (this.isMeldable() && currentStateName != CardStateName.Meld) { + else if (isMeldable() && currentStateName != CardStateName.Meld) { return CardStateName.Meld; } + else if (this.isAdventureCard() && currentStateName != CardStateName.Adventure) { + return CardStateName.Adventure; + } else { return CardStateName.Original; } @@ -803,6 +806,10 @@ public class Card extends GameEntity implements Comparable { return getRules() != null && getRules().getSplitType() == CardSplitType.Split; } + public final boolean isAdventureCard() { + return hasState(CardStateName.Adventure); + } + public final boolean isBackSide() { return backside; } @@ -1989,7 +1996,19 @@ public class Card extends GameEntity implements Comparable { continue; } - final String sAbility = formatSpellAbility(sa); + String sAbility = formatSpellAbility(sa); + + // add Adventure to AbilityText + if (sa.isAdventure() && state.getView().getState().equals(CardStateName.Original)) { + StringBuilder sbSA = new StringBuilder(); + sbSA.append("Adventure — ").append(getState(CardStateName.Adventure).getName()); + if (sa.getPayCosts() != null) { + sbSA.append(" ").append(sa.getPayCosts().toSimpleString()); + } + sbSA.append(": "); + sbSA.append(sAbility); + sAbility = sbSA.toString(); + } if (sa.getManaPart() != null) { if (addedManaStrings.contains(sAbility)) { @@ -2397,10 +2416,21 @@ public class Card extends GameEntity implements Comparable { // add Facedown abilities from Original state but only if this state is face down // need CardStateView#getState or might crash in StackOverflow - if ((mana == null || mana == false) && isFaceDown() && state.getView().getState() == CardStateName.FaceDown) { - for (SpellAbility sa : getState(CardStateName.Original).getNonManaAbilities()) { - if (sa.isManifestUp() || sa.isMorphUp()) { - list.add(sa); + if (isInZone(ZoneType.Battlefield)) { + if ((mana == null || mana == false) && isFaceDown() && state.getView().getState() == CardStateName.FaceDown) { + for (SpellAbility sa : getState(CardStateName.Original).getNonManaAbilities()) { + if (sa.isManifestUp() || sa.isMorphUp()) { + list.add(sa); + } + } + } + } else { + // Adenture may only be cast not from Battlefield + if (isAdventureCard() && state.getView().getState() == CardStateName.Original) { + for (SpellAbility sa : getState(CardStateName.Adventure).getSpellAbilities()) { + if (mana == null || mana == sa.isManaAbility()) { + list.add(sa); + } } } } @@ -5731,6 +5761,12 @@ public class Card extends GameEntity implements Comparable { } public void setSplitStateToPlayAbility(final SpellAbility sa) { + if (isAdventureCard()) { + if (sa.isAdventure()) { + setState(CardStateName.Adventure, true); + } + return; + } if (!isSplitCard()) { return; // just in case } diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 98dab46962d..ecbfaeae056 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -305,6 +305,11 @@ public class CardFactory { } else if (c.isMeldable() && cp instanceof PaperCard) { c.setState(CardStateName.Meld, false); c.setImageKey(cp.getImageKey(true)); + } else if (c.isAdventureCard()) { + c.setState(CardStateName.Adventure, false); + c.setImageKey(originalPicture); + c.setSetCode(cp.getEdition()); + c.setRarity(cp.getRarity()); } c.setSetCode(cp.getEdition()); @@ -325,7 +330,6 @@ public class CardFactory { // ****************************************************************** // ************** Link to different CardFactories ******************* - if (state == CardStateName.LeftSplit || state == CardStateName.RightSplit) { for (final SpellAbility sa : card.getSpellAbilities()) { if (state == CardStateName.LeftSplit) { @@ -342,6 +346,9 @@ public class CardFactory { } else if (state != CardStateName.Original){ CardFactoryUtil.setupKeywordedAbilities(card); } + if (state == CardStateName.Adventure) { + CardFactoryUtil.setupAdventureAbility(card); + } } card.setState(CardStateName.Original, false); @@ -728,6 +735,14 @@ public class CardFactory { final CardState ret2 = new CardState(out, CardStateName.Flipped); ret2.copyFrom(in.getState(CardStateName.Flipped, true), false); result.put(CardStateName.Flipped, ret2); + } else if (in.isAdventureCard()) { + final CardState ret1 = new CardState(out, CardStateName.Original); + ret1.copyFrom(in.getState(CardStateName.Original, true), false); + result.put(CardStateName.Original, ret1); + + final CardState ret2 = new CardState(out, CardStateName.Adventure); + ret2.copyFrom(in.getState(CardStateName.Adventure, true), false); + result.put(CardStateName.Adventure, ret2); } else { // in all other cases just copy the current state to original final CardState ret = new CardState(out, CardStateName.Original); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 829f0979785..d5176500cef 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -4738,4 +4738,30 @@ public class CardFactoryUtil { } return byClause + StringUtils.join(orClauses, " or ") + "."; } + + public static void setupAdventureAbility(Card card) { + if (card.getCurrentStateName() != CardStateName.Adventure) { + return; + } + SpellAbility sa = card.getFirstSpellAbility(); + if (sa == null) { + return; + } + sa.setAdventure(true); + + String abExile = "DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile | StackDescription$ None"; + + AbilitySub saExile = (AbilitySub)AbilityFactory.getAbility(abExile, card); + + String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ExileOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.nonCopiedSpell"; + AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card); + + StringBuilder sb = new StringBuilder(); + sb.append("Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonAdventure"); + sb.append(" | AffectedZone$ Exile | Description$ You may cast the card."); + saEffect.setSVar("Play", sb.toString()); + + saExile.setSubAbility(saEffect); + sa.appendSubAbility(saExile); + } } diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 3a2969c98eb..3de4411ab84 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -107,26 +107,8 @@ public class CardProperty { if (card.isSplitCard()) { return false; } - } else if (property.startsWith("leftcmc") || property.startsWith("rightcmc")) { - int x; - int y = 0; - String rhs = ""; - - if (property.startsWith("leftcmc")) { - rhs = property.substring(9); - y = card.getCMC(Card.SplitCMCMode.LeftSplitCMC); - } else if (property.startsWith("rightcmc")) { - rhs = property.substring(10); - y = card.getCMC(Card.SplitCMCMode.RightSplitCMC); - } - - try { - x = Integer.parseInt(rhs); - } catch (final NumberFormatException e) { - x = AbilityUtils.calculateAmount(source, rhs, spellAbility); - } - - if (!Expressions.compare(y, property, x)) { + } else if (property.equals("AdventureCard")) { + if (!card.isAdventureCard()) { return false; } } else if (property.startsWith("YouCtrl")) { @@ -1358,6 +1340,14 @@ public class CardProperty { if (card.isToken()) { return false; } + } else if (property.startsWith("copiedSpell")) { + if (!card.isCopiedSpell()) { + return false; + } + } else if (property.startsWith("nonCopiedSpell")) { + if (card.isCopiedSpell()) { + return false; + } } else if (property.startsWith("hasXCost")) { SpellAbility sa1 = card.getFirstSpellAbility(); if (sa1 != null && !sa1.isXCost()) { diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 4dcd5e489bf..82a306157e0 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -225,6 +225,11 @@ public final class CardUtil { newCopy.turnFaceDownNoUpdate(); } + if (in.isAdventureCard() && in.getFaceupCardStateName().equals(CardStateName.Original)) { + newCopy.addAlternateState(CardStateName.Adventure, false); + newCopy.getState(CardStateName.Adventure).copyFrom(in.getState(CardStateName.Adventure), true); + } + /* if (in.isCloned()) { newCopy.addAlternateState(CardStateName.Cloner, false); diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 19b1bfa52f8..53911856989 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -557,7 +557,7 @@ public class CardView extends GameEntityView { } tname = tname.isEmpty() ? state.getName() : tname; - toracle = toracle.isEmpty() ? state.getOracleText() : toracle; + if (isSplitCard()) { taltname = getAlternateState().getName(); taltoracle = getAlternateState().getOracleText(); @@ -572,7 +572,7 @@ public class CardView extends GameEntityView { sb.append(taltoracle); return sb.toString().trim(); } else { - return toracle; + return toracle.isEmpty() ? state.getOracleText() : toracle; } } diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index b3761737538..51a83100632 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -100,6 +100,10 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable if (card.isSplitCard()) { CardStateName name = isLeftSplit() ? CardStateName.LeftSplit : CardStateName.RightSplit; isInstant = card.getState(name).getType().isInstant(); + } else if (isAdventure()) { + if (card.hasState(CardStateName.Adventure)) { + isInstant = card.getState(CardStateName.Adventure).getType().isInstant(); + } } boolean lkicheck = false; @@ -130,6 +134,13 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable } card.turnFaceDownNoUpdate(); lkicheck = true; + } else if (isAdventure()) { + if (!card.isLKI()) { + card = CardUtil.getLKICopy(card); + } + + card.setState(CardStateName.Adventure, false); + lkicheck = true; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index fb7c64c7d80..2a016cc9706 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -118,6 +118,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private boolean basicLandAbility = false; + private boolean adventure = false; private SplitSide splitSide = null; enum SplitSide { LEFT, RIGHT } @@ -565,6 +566,15 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public void setTriggeringObject(final AbilityKey type, final Object o) { triggeringObjects.put(type, o); } + public void setTriggeringObjectsFrom(final Trigger trigger, final AbilityKey... types) { + int typesLength = types.length; + for (int i = 0; i < typesLength; i += 1) { + AbilityKey type = types[i]; + triggeringObjects.put(type, trigger.getFromRunParams(type)); + } + } + + public boolean hasTriggeringObject(final AbilityKey type) { return triggeringObjects.containsKey(type); } @@ -852,6 +862,12 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public void setRightSplit() { splitSide = SplitSide.RIGHT; } + public boolean isAdventure() { + return this.adventure; + } + public void setAdventure(boolean adventure) { + this.adventure = adventure; + } public SpellAbility copy() { return copy(hostCard, false); diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index 18b0e3c6f50..7d1c0b5fe36 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -66,7 +66,7 @@ public abstract class Trigger extends TriggerReplacementBase { /** The run params. */ - private Map runParams; + private Map runParams; private TriggerType mode; @@ -122,7 +122,7 @@ public abstract class Trigger extends TriggerReplacementBase { this.id = nextId(); this.intrinsic = intrinsic; - this.setRunParams(new HashMap<>()); // TODO: Consider whether this can be null instead, for performance reasons. + this.setRunParams(AbilityKey.newMap()); // TODO: Consider whether this can be null instead, for performance reasons. this.originalMapParams.putAll(params); this.mapParams.putAll(params); this.setHostCard(host); @@ -460,8 +460,8 @@ public abstract class Trigger extends TriggerReplacementBase { * * @return the runParams */ - public Map getRunParams() { - return this.runParams; + public Object getFromRunParams(AbilityKey key) { + return this.runParams.get(key); } /** @@ -470,7 +470,7 @@ public abstract class Trigger extends TriggerReplacementBase { * @param runParams0 * the runParams to set */ - public void setRunParams(final Map runParams0) { + public void setRunParams(final Map runParams0) { this.runParams = runParams0; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java index dcb65899236..42e0e0af649 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java @@ -63,7 +63,7 @@ public class TriggerAbandoned extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Scheme, this.getRunParams().get("Scheme")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Scheme); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java index ab2f92ccba2..a5345b69a63 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java @@ -64,7 +64,7 @@ public class TriggerAdapt extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java index 96fdfd28ae6..82f6c081ae7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java @@ -73,8 +73,7 @@ public class TriggerAttached extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Source, this.getRunParams().get("AttachSource")); - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("AttachTarget")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Source, AbilityKey.Target); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index 20fef05e093..2e09e604ca9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -85,11 +85,14 @@ public class TriggerAttackerBlocked extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Attacker, getRunParams().get("Attacker")); - sa.setTriggeringObject(AbilityKey.Blockers, getRunParams().get("Blockers")); - sa.setTriggeringObject(AbilityKey.Defender, getRunParams().get("Defender")); - sa.setTriggeringObject(AbilityKey.DefendingPlayer, getRunParams().get("DefendingPlayer")); - sa.setTriggeringObject(AbilityKey.NumBlockers, getRunParams().get("NumBlockers")); + sa.setTriggeringObjectsFrom( + this, + AbilityKey.Attacker, + AbilityKey.Blockers, + AbilityKey.Defender, + AbilityKey.DefendingPlayer, + AbilityKey.NumBlockers + ); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java index 7ddb60acdef..f4b01752327 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java @@ -88,8 +88,7 @@ public class TriggerAttackerBlockedByCreature extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker")); - sa.setTriggeringObject(AbilityKey.Blocker, this.getRunParams().get("Blocker")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Attacker, AbilityKey.Blocker); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java index a8e9d41209a..decaca22f1d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java @@ -70,9 +70,7 @@ public class TriggerAttackerUnblocked extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker")); - sa.setTriggeringObject(AbilityKey.Defender, this.getRunParams().get("Defender")); - sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Attacker, AbilityKey.Defender, AbilityKey.DefendingPlayer); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java index 23567718e5c..11220460602 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java @@ -85,8 +85,7 @@ public class TriggerAttackerUnblockedOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.AttackingPlayer, this.getRunParams().get("AttackingPlayer")); - sa.setTriggeringObject(AbilityKey.Defenders, this.getRunParams().get("Defenders")); + sa.setTriggeringObjectsFrom(this, AbilityKey.AttackingPlayer, AbilityKey.Defenders); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java index f9be4cacdd6..f26bcaa7293 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java @@ -87,8 +87,7 @@ public class TriggerAttackersDeclared extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers")); - sa.setTriggeringObject(AbilityKey.AttackingPlayer, this.getRunParams().get("AttackingPlayer")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Attackers, AbilityKey.AttackingPlayer); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java index cc35af51e0c..551ff2826bb 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java @@ -125,10 +125,13 @@ public class TriggerAttacks extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker")); - sa.setTriggeringObject(AbilityKey.Defender, this.getRunParams().get("Attacked")); - sa.setTriggeringObject(AbilityKey.Defenders, this.getRunParams().get("Defenders")); - sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer")); + sa.setTriggeringObjectsFrom( + this, + AbilityKey.Attacker, + AbilityKey.Defender, + AbilityKey.Defenders, + AbilityKey.DefendingPlayer + ); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java index d52c072f825..c53165cce66 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java @@ -36,7 +36,7 @@ public class TriggerBecomeMonarch extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java index 1e6643e767f..1dba122cb98 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java @@ -65,8 +65,7 @@ public class TriggerBecomeMonstrous extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.MonstrosityAmount, getRunParams().get("MonstrosityAmount")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.MonstrosityAmount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java index d6086fc7133..23117108cc7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java @@ -63,7 +63,7 @@ public class TriggerBecomeRenowned extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java index 4e87946af5f..d27f3903b9d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java @@ -89,9 +89,8 @@ public class TriggerBecomesTarget extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.SourceSA, this.getRunParams().get("SourceSA")); - sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard()); - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("Target")); + sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) getFromRunParams(AbilityKey.SourceSA)).getHostCard()); + sa.setTriggeringObjectsFrom(this, AbilityKey.SourceSA, AbilityKey.Target); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java index 368a1bc2281..eba4a98f119 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java @@ -81,9 +81,8 @@ public class TriggerBecomesTargetOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.SourceSA, this.getRunParams().get("SourceSA")); - sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard()); - sa.setTriggeringObject(AbilityKey.Targets, this.getRunParams().get("Targets")); + sa.setTriggeringObjectsFrom(this, AbilityKey.SourceSA, AbilityKey.Targets); + sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) getFromRunParams(AbilityKey.SourceSA)).getHostCard()); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java b/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java index c7ec35ae012..57a0947072e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java @@ -52,8 +52,7 @@ public class TriggerBlockersDeclared extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Blockers, this.getRunParams().get("Blockers")); - sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Blockers, AbilityKey.Attackers); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java index 6388a1ed6a2..7f537edea16 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java @@ -89,8 +89,7 @@ public class TriggerBlocks extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Blocker, this.getRunParams().get("Blocker")); - sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Blocker, AbilityKey.Attackers); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java index d95e92662ad..e0b27efee0f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java @@ -72,8 +72,7 @@ public class TriggerChampioned extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Championed, this.getRunParams().get("Championed")); - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Championed, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java index 0648a26418d..9c47284385e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java @@ -71,7 +71,7 @@ public class TriggerChangesController extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java index 1cd778b509b..a2574e1c897 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java @@ -218,7 +218,7 @@ public class TriggerChangesZone extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java index f2a36fa0f45..6c0b3b7c259 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java @@ -23,7 +23,7 @@ public class TriggerChangesZoneAll extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - final CardZoneTable table = (CardZoneTable) getRunParams().get("Cards"); + final CardZoneTable table = (CardZoneTable) getFromRunParams(AbilityKey.Cards); CardCollection allCards = this.filterCards(table); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java index 7b87470996a..f6b282ee52a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java @@ -121,10 +121,7 @@ public class TriggerCounterAdded extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - if (this.getRunParams().containsKey("Card")) - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - if (this.getRunParams().containsKey("Player")) - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java index 859fd6b8787..02c97d93d8b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java @@ -25,7 +25,7 @@ public class TriggerCounterAddedAll extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - final GameEntityCounterTable table = (GameEntityCounterTable) getRunParams().get("Objects"); + final GameEntityCounterTable table = (GameEntityCounterTable) getFromRunParams(AbilityKey.Objects); Map all = this.filterTable(table); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java index 4baeaff29c5..29cc7db445d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java @@ -106,11 +106,8 @@ public class TriggerCounterAddedOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - if (this.getRunParams().containsKey("Card")) - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - if (this.getRunParams().containsKey("Player")) - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); - sa.setTriggeringObject(AbilityKey.Amount, this.getRunParams().get("CounterAmount")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player); + sa.setTriggeringObject(AbilityKey.Amount, getFromRunParams(AbilityKey.CounterAmount)); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java index 1f344bfad12..dc3327f1509 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java @@ -83,7 +83,7 @@ public class TriggerCounterRemoved extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java index a96eb1df4c9..591e6df967e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java @@ -74,8 +74,7 @@ public class TriggerCounterRemovedOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Amount, this.getRunParams().get("CounterAmount")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Amount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java index ae5087b29e2..0afa88d020c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java @@ -93,10 +93,13 @@ public class TriggerCountered extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause")); - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); - sa.setTriggeringObject(AbilityKey.CounteredSA, this.getRunParams().get("CounteredSA")); + sa.setTriggeringObjectsFrom( + this, + AbilityKey.Card, + AbilityKey.Cause, + AbilityKey.Player, + AbilityKey.CounteredSA + ); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java b/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java index 655fa1d591a..624b97e1d24 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java @@ -39,8 +39,7 @@ public class TriggerCrewed extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Vehicle, this.getRunParams().get("Vehicle")); - sa.setTriggeringObject(AbilityKey.Crew, this.getRunParams().get("Crew")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Vehicle, AbilityKey.Crew); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java index 82359ed0c66..2df0732a3a5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java @@ -50,7 +50,7 @@ public class TriggerCycled extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java index 7a8dee7acec..20e744c5755 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java @@ -106,9 +106,7 @@ public class TriggerDamageDealtOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Source, this.getRunParams().get("DamageSource")); - sa.setTriggeringObject(AbilityKey.Targets, this.getRunParams().get("DamageTargets")); - sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Source, AbilityKey.Targets, AbilityKey.DamageAmount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java index 1c9751d0321..65651dd674e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java @@ -119,11 +119,14 @@ public class TriggerDamageDone extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)this.getRunParams().get("DamageSource"))); - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); - sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); - // This parameter is here because LKI information related to combat doesn't work properly - sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer")); + sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)getFromRunParams(AbilityKey.DamageSource))); + sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget)); + sa.setTriggeringObjectsFrom( + this, + AbilityKey.DamageAmount, + // This parameter is here because LKI information related to combat doesn't work properly + AbilityKey.DefendingPlayer + ); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java index f80a9c9e3c6..20078a32bbf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java @@ -58,15 +58,9 @@ public class TriggerDamageDoneOnce extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - if (this.getRunParams().containsKey("DamageTarget")) { - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); - } - if (this.getRunParams().containsKey("DamageSources")) { - sa.setTriggeringObject(AbilityKey.Sources, this.getRunParams().get("DamageSources")); - } - sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); - - + sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget)); + sa.setTriggeringObject(AbilityKey.Sources, getFromRunParams(AbilityKey.DamageSources)); + sa.setTriggeringObjectsFrom(this, AbilityKey.DamageAmount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java index 5807e02e70a..8736ba600ee 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java @@ -103,9 +103,9 @@ public class TriggerDamagePrevented extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)this.getRunParams().get("DamageSource"))); - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); - sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); + sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)getFromRunParams(AbilityKey.DamageSource))); + sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget)); + sa.setTriggeringObjectsFrom(this, AbilityKey.DamageAmount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java index b2cbf8ce369..9f6839167e7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java @@ -94,8 +94,8 @@ public class TriggerDamagePreventedOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); - sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); + sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget)); + sa.setTriggeringObjectsFrom(this, AbilityKey.DamageAmount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java index 22a39539d54..a91c5f78802 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java @@ -68,8 +68,7 @@ public class TriggerDestroyed extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Causer, this.getRunParams().get("Causer")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Causer); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java index 9d2ab4a1d8e..6f87272938c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java @@ -61,7 +61,7 @@ public class TriggerDevoured extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Devoured, this.getRunParams().get("Devoured")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Devoured); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java index 5b046239a43..10acd4010df 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java @@ -86,8 +86,7 @@ public class TriggerDiscarded extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Cause); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java index 30fae66a797..d8a88321e8f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java @@ -81,8 +81,7 @@ public class TriggerDrawn extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java index 615c5e94f10..80bce94215c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java @@ -62,7 +62,7 @@ public class TriggerEvolved extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java index b70e1fd4894..221bbcfd0a7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java @@ -33,8 +33,7 @@ public class TriggerExerted extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java index 0842e0732ae..bed1269155b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java @@ -97,7 +97,7 @@ public class TriggerExiled extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java index 49437a4b948..fbab5694a5e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java @@ -72,8 +72,7 @@ public class TriggerExploited extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Exploited, this.getRunParams().get("Exploited")); - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Exploited, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java index 54f1ff15f54..93b9b14cae7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java @@ -62,7 +62,7 @@ public class TriggerExplores extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Explorer, this.getRunParams().get("Card")); + sa.setTriggeringObject(AbilityKey.Explorer, getFromRunParams(AbilityKey.Card)); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java index aecf04ca0db..414e42e698a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java @@ -63,7 +63,7 @@ public class TriggerFight extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Fighter, this.getRunParams().get("Fighter")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Fighter); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java index 45dbc6a8346..22ebf4ffd9a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java @@ -70,7 +70,7 @@ public class TriggerFlippedCoin extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 87d51dc130d..b399b2b4f66 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -338,7 +338,7 @@ public class TriggerHandler { private void runStateTrigger(final Map runParams) { for (final Trigger t: activeTriggers) { if (canRunTrigger(t, TriggerType.Always, runParams)) { - runSingleTrigger(t, toStringMap(runParams)); + runSingleTrigger(t, runParams); } } } @@ -376,7 +376,7 @@ public class TriggerHandler { // Static triggers for (final Trigger t : Lists.newArrayList(activeTriggers)) { if (t.isStatic() && canRunTrigger(t, mode, runParams)) { - runSingleTrigger(t, toStringMap(runParams)); + runSingleTrigger(t, runParams); checkStatics = true; } @@ -420,7 +420,6 @@ public class TriggerHandler { final TriggerType mode = wt.getMode(); final Map runParams = wt.getParams(); - final Map stringRunParams = toStringMap(runParams); final List triggers = wt.getTriggers() != null ? wt.getTriggers() : activeTriggers; Card card = null; @@ -450,7 +449,7 @@ public class TriggerHandler { int x = 1 + handlePanharmonicon(t, runParams, player); for (int i = 0; i < x; ++i) { - runSingleTrigger(t, stringRunParams); + runSingleTrigger(t, runParams); } checkStatics = true; } @@ -459,7 +458,7 @@ public class TriggerHandler { for (final Trigger deltrig : delayedTriggersWorkingCopy) { if (deltrig.getHostCard().getController().equals(player)) { if (isTriggerActive(deltrig) && canRunTrigger(deltrig, mode, runParams)) { - runSingleTrigger(deltrig, stringRunParams); + runSingleTrigger(deltrig, runParams); delayedTriggers.remove(deltrig); } } @@ -541,20 +540,34 @@ public class TriggerHandler { } } } // Torpor Orb check + + if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCreatureDyingTriggers) + && !regtrig.isStatic() && mode.equals(TriggerType.ChangesZone)) { + if (runParams.get(AbilityKey.Destination) instanceof String && runParams.get(AbilityKey.Origin) instanceof String) { + final String dest = (String) runParams.get(AbilityKey.Destination); + final String origin = (String) runParams.get(AbilityKey.Origin); + if (dest.equals("Graveyard") && origin.equals("Battlefield") && runParams.get(AbilityKey.Card) instanceof Card) { + final Card card = (Card) runParams.get(AbilityKey.Card); + if (card.isCreature()) { + return false; + } + } + } + } return true; } // Checks if the conditions are right for a single trigger to go off, and // runs it if so. // Return true if the trigger went off, false otherwise. - private void runSingleTrigger(final Trigger regtrig, final Map runParams) { + private void runSingleTrigger(final Trigger regtrig, final Map runParams) { final Map triggerParams = regtrig.getMapParams(); regtrig.setRunParams(runParams); // All tests passed, execute ability. if (regtrig instanceof TriggerTapsForMana) { - final SpellAbility abMana = (SpellAbility) runParams.get("AbilityMana"); + final SpellAbility abMana = (SpellAbility) runParams.get(AbilityKey.AbilityMana); if (null != abMana && null != abMana.getManaPart()) { abMana.setUndoable(false); } @@ -562,7 +575,7 @@ public class TriggerHandler { SpellAbility sa = null; Card host = regtrig.getHostCard(); - final Card trigCard = regtrig.getRunParams().containsKey("Card") ? (Card)regtrig.getRunParams().get("Card") : null; + final Card trigCard = (Card) regtrig.getFromRunParams(AbilityKey.Card); if (trigCard != null && (host.getId() == trigCard.getId())) { host = trigCard; @@ -735,8 +748,8 @@ public class TriggerHandler { } } else if (kw.startsWith("Dieharmonicon")) { // 700.4. The term dies means "is put into a graveyard from the battlefield." - if (runParams.get(AbilityKey.Destination) instanceof String) { - final String origin = (String) runParams.get(AbilityKey.Destination); + if (runParams.get(AbilityKey.Origin) instanceof String) { + final String origin = (String) runParams.get(AbilityKey.Origin); if ("Battlefield".equals(origin) && runParams.get(AbilityKey.Destination) instanceof String) { final String dest = (String) runParams.get(AbilityKey.Destination); if ("Graveyard".equals(dest) && runParams.get(AbilityKey.Card) instanceof Card) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java index 4673c43daaf..46ef04bdf7c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java @@ -60,7 +60,7 @@ public class TriggerInvestigated extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } /** {@inheritDoc} */ diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java index 42facf2e807..9e06d86062a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java @@ -52,7 +52,7 @@ public class TriggerLandPlayed extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java index 9b13cc0d680..ab27b458c5c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java @@ -74,8 +74,7 @@ public class TriggerLifeGained extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.LifeAmount, getRunParams().get("LifeAmount")); - sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.LifeAmount, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java index a592a376217..bd747b33932 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java @@ -71,8 +71,7 @@ public class TriggerLifeLost extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.LifeAmount, this.getRunParams().get("LifeAmount")); - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.LifeAmount, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java index e55850fa631..1b1ad8f2389 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java @@ -39,7 +39,7 @@ public class TriggerLosesGame extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java index 51a74fa139e..c567c311cd6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java @@ -70,8 +70,7 @@ public class TriggerPayCumulativeUpkeep extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.PayingMana, this.getRunParams().get("PayingMana")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.PayingMana); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java index d6f94a2ea0f..9eb5571b930 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java @@ -70,7 +70,7 @@ public class TriggerPayEcho extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java index 9ff7bd8f4a8..89cf4d10920 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java @@ -61,8 +61,7 @@ public class TriggerPayLife extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.LifeAmount, getRunParams().get("LifeAmount")); - sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.LifeAmount, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java index 974d40259e7..19bf36a0dda 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java @@ -60,7 +60,7 @@ public class TriggerPhase extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java index d519d56959e..c250dbe097d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java @@ -28,7 +28,7 @@ public class TriggerPhaseIn extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java index 7adcb00cc8b..9583ff22d6f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java @@ -36,7 +36,7 @@ public class TriggerPhaseOut extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java index 4e1ccdf0a7e..e3b3ddd78ff 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java @@ -56,7 +56,7 @@ public class TriggerPlanarDice extends Trigger { */ @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java index 9cee000a7fe..3d9b36d339e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java @@ -53,7 +53,7 @@ public class TriggerPlaneswalkedFrom extends Trigger { */ @Override public void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Cards, this.getRunParams().get("Cards")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Cards); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java index 5644c090053..efc3f2079dd 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java @@ -53,7 +53,7 @@ public class TriggerPlaneswalkedTo extends Trigger { */ @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Cards, this.getRunParams().get("Cards")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Cards); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java index 8eea96379ef..b1358375fa9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java @@ -68,8 +68,7 @@ public class TriggerRegenerated extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Cause); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java index b86e7b10439..096aff377a7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java @@ -32,7 +32,7 @@ public class TriggerRevealed extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java index aac417535ef..4c4a05f110a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java @@ -126,7 +126,7 @@ public class TriggerSacrificed extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java index bd0f3cadac5..5202cec9429 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java @@ -62,7 +62,7 @@ public class TriggerScry extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java index 05fd3e062dc..da568d1437a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java @@ -74,7 +74,7 @@ public class TriggerSearchedLibrary extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java index 1811c949573..92e1ccd981c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java @@ -77,7 +77,7 @@ public class TriggerSetInMotion extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Scheme, this.getRunParams().get("Scheme")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Scheme); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java index ed801458055..4052524770e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java @@ -74,7 +74,7 @@ public class TriggerShuffled extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java index db43216f341..11085cc424e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java @@ -264,17 +264,20 @@ public class TriggerSpellAbilityCast extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - final SpellAbility castSA = (SpellAbility) getRunParams().get("CastSA"); + final SpellAbility castSA = (SpellAbility) getFromRunParams(AbilityKey.CastSA); final SpellAbilityStackInstance si = sa.getHostCard().getGame().getStack().getInstanceFromSpellAbility(castSA); sa.setTriggeringObject(AbilityKey.Card, castSA.getHostCard()); sa.setTriggeringObject(AbilityKey.SpellAbility, castSA); sa.setTriggeringObject(AbilityKey.StackInstance, si); sa.setTriggeringObject(AbilityKey.SpellAbilityTargetingCards, (si != null ? si.getSpellAbility(true) : castSA).getTargets().getTargetCards()); - sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player")); - sa.setTriggeringObject(AbilityKey.Activator, getRunParams().get("Activator")); - sa.setTriggeringObject(AbilityKey.CurrentStormCount, getRunParams().get("CurrentStormCount")); - sa.setTriggeringObject(AbilityKey.CurrentCastSpells, getRunParams().get("CurrentCastSpells")); - sa.setTriggeringObject(AbilityKey.CastSACMC, getRunParams().get("CastSACMC")); + sa.setTriggeringObjectsFrom( + this, + AbilityKey.Player, + AbilityKey.Activator, + AbilityKey.CurrentStormCount, + AbilityKey.CurrentCastSpells, + AbilityKey.CastSACMC + ); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java index 4dc044312ac..f6b553e016f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java @@ -91,7 +91,7 @@ public class TriggerSpellAbilityCopy extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - final SpellAbility copySA = (SpellAbility) getRunParams().get("CopySA"); + final SpellAbility copySA = (SpellAbility) getFromRunParams(AbilityKey.CopySA); final SpellAbilityStackInstance si = sa.getHostCard().getGame().getStack().getInstanceFromSpellAbility(copySA); sa.setTriggeringObject(AbilityKey.Card, copySA.getHostCard()); sa.setTriggeringObject(AbilityKey.SpellAbility, copySA); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java index 374e97aa73a..740d7f5fd05 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java @@ -56,7 +56,7 @@ public class TriggerSurveil extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } /** {@inheritDoc} */ diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java index 421a34d71ac..fb3ef851185 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java @@ -78,7 +78,7 @@ public class TriggerTaps extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index 5474f5fc6b8..4763c543f04 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -105,9 +105,7 @@ public class TriggerTapsForMana extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); - sa.setTriggeringObject(AbilityKey.Produced, this.getRunParams().get("Produced")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player, AbilityKey.Produced); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java index ab5944ab9b0..a7d75887819 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java @@ -59,7 +59,7 @@ public class TriggerTransformed extends Trigger { */ @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Transformer, this.getRunParams().get("Transformer")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Transformer); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java index 0c6c879c4b9..eed574ed726 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java @@ -21,7 +21,7 @@ public class TriggerTurnBegin extends Trigger { @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java index 8aa74bb14d3..f5f70484e6d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java @@ -61,7 +61,7 @@ public class TriggerTurnFaceUp extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java index f68eb51c482..c7dc5511b0e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java @@ -73,8 +73,7 @@ public class TriggerUnattach extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Object, getRunParams().get("Object")); - sa.setTriggeringObject(AbilityKey.Attach, getRunParams().get("Attach")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Object, AbilityKey.Attach); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java index f06243482c8..f2f4443f329 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java @@ -67,7 +67,7 @@ public class TriggerUntaps extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java index 07481b9571a..abe296995c3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java @@ -20,7 +20,6 @@ package forge.game.trigger; import java.util.List; import java.util.Map; -import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import forge.game.ability.AbilityKey; @@ -65,8 +64,13 @@ public class TriggerVote extends Trigger { @Override public final void setTriggeringObjects(final SpellAbility sa) { @SuppressWarnings("unchecked") - final ListMultimap votes = (ArrayListMultimap) this.getRunParams().get("AllVotes"); - sa.setTriggeringObject(AbilityKey.OtherVoters, getVoters(this.getHostCard().getController(), votes, true, true)); + FCollection voters = getVoters( + this.getHostCard().getController(), + (ListMultimap) getFromRunParams(AbilityKey.AllVotes), + true, + true + ); + sa.setTriggeringObject(AbilityKey.OtherVoters, voters); } @Override diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index a70ed6c30cb..d0040eb9745 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -659,7 +659,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable | OpponentTurn$ True | Description$ If it's not your turn, you may exile a blue card from your hand rather than pay this spell's mana cost. -Svar:Picture:http://mythicspoiler.com/mh1/cards/forceofnegation.jpg Oracle:If it's not your turn, you may exile a blue card from your hand rather than pay this spell's mana cost.\nCounter target noncreature spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyayrd. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/grinning_totem.txt b/forge-gui/res/cardsfolder/g/grinning_totem.txt index 8194fd08f06..f5f2bce00a6 100644 --- a/forge-gui/res/cardsfolder/g/grinning_totem.txt +++ b/forge-gui/res/cardsfolder/g/grinning_totem.txt @@ -4,13 +4,13 @@ Types:Artifact A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | ValidTgts$ Player.Opponent | IsCurse$ True | Chooser$ You | Origin$ Library | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | IsCurse$ True | RememberChanged$ True | SubAbility$ TotemEffect | SpellDescription$ Search target opponent's library for a card and exile it. Then that player shuffles their library. Until the beginning of your next upkeep, you may play that card. At the beginning of your next upkeep, if you haven't played it, put it into its owner's graveyard. | StackDescription$ SpellDescription SVar:TotemEffect:DB$ Effect | StaticAbilities$ STGrinning | Duration$ Permanent | RememberObjects$ Remembered | Triggers$ TrigDuration,TrigReturn,TrigLandPlayed,TrigCast | SVars$ DBDuration,ActiveTotem,RemoveEffect,DBReturn | SubAbility$ DBResetSVar # Even though the Effect is "Permanent", it's not really permanent -SVar:DBResetSVar:DB$ StoreSvar | SVar$ ActiveTotem | Type$ Number | Expression$ 1 | SubAbility$ DBCleanup +SVar:DBResetSVar:DB$ StoreSVar | SVar$ ActiveTotem | Type$ Number | Expression$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:ActiveTotem:Number$1 SVar:STGrinning:Mode$ Continuous | Affected$ Card.IsRemembered+OppOwn | MayPlay$ True | EffectZone$ Command | AffectedZone$ Exile | CheckSVar$ ActiveTotem | Description$ Until the beginning of your next upkeep, you may play that card. # Turn off the duration at the beginning of the upkeep statically SVar:TrigDuration:Mode$ Phase | Phase$ Upkeep | Player$ You | Static$ True | TriggerZones$ Command | Execute$ DBDuration -SVar:DBDuration:DB$ StoreSvar | SVar$ ActiveTotem | Type$ Number | Expression$ 0 +SVar:DBDuration:DB$ StoreSVar | SVar$ ActiveTotem | Type$ Number | Expression$ 0 # Return the card as a normal trigger SVar:TrigReturn:Mode$ Phase | Phase$ Upkeep | Player$ You | Static$ True | TriggerZones$ Command | Execute$ DBReturn SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Graveyard | SubAbility$ RemoveEffect diff --git a/forge-gui/res/cardsfolder/p/psychic_theft.txt b/forge-gui/res/cardsfolder/p/psychic_theft.txt index ee8aa45d7e8..a771d08d6de 100644 --- a/forge-gui/res/cardsfolder/p/psychic_theft.txt +++ b/forge-gui/res/cardsfolder/p/psychic_theft.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Player | Origin$ Hand | Destination$ Exile | ChangeType$ Instant,Sorcery | IsCurse$ True | Chooser$ You | ChangeNum$ 1 | RememberChanged$ True | SubAbility$ TheftEffect | SpellDescription$ Target player reveals their hand. You choose an instant or sorcery card from it and exile that card. You may cast that card for as long as it remains exiled. At the beginning of the next end step, if you haven't cast the card, return it to its owner's hand. | StackDescription$ SpellDescription SVar:TheftEffect:DB$ Effect | StaticAbilities$ STThieving | Duration$ Permanent | RememberObjects$ Remembered | Triggers$ TrigReturn,TrigCast | SVars$ ActivePsychic,RemoveEffect,DBReturn | SubAbility$ DBResetSVar # Even though the Effect is "Permanent", it's not really permanent -SVar:DBResetSVar:DB$ StoreSvar | SVar$ ActivePsychic | Type$ Number | Expression$ 1 | SubAbility$ DBCleanup +SVar:DBResetSVar:DB$ StoreSVar | SVar$ ActivePsychic | Type$ Number | Expression$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:ActivePsychic:Number$1 SVar:STThieving:Mode$ Continuous | Affected$ Card.IsRemembered+OppOwn | MayPlay$ True | EffectZone$ Command | AffectedZone$ Exile | CheckSVar$ ActivePsychic | Description$ You may cast that card for as long as it remains exiled. diff --git a/forge-gui/res/cardsfolder/upcoming/acclaimed_contender.txt b/forge-gui/res/cardsfolder/upcoming/acclaimed_contender.txt new file mode 100644 index 00000000000..1b3a5160860 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/acclaimed_contender.txt @@ -0,0 +1,7 @@ +Name:Acclaimed Contender +ManaCost:2 W +Types:Creature Human Knight +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Knight.YouCtrl+Other | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, if you control another Knight, look at the top five cards of your library. You may reveal a Knight, Aura, Equipment, or legendary artifact card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +SVar:TrigDig:DB$ Dig | DigNum$ 5 | ChangeNum$ 1 | ChangeValid$ Card.Knight,Aura,Equipment,Artifact.Legendary | RestRandomOrder$ True +Oracle:When Acclaimed Contender enters the battlefield, if you control another Knight, look at the top five cards of your library. You may reveal a Knight, Aura, Equipment, or legendary artifact card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/animating_faerie_bring_to_life.txt b/forge-gui/res/cardsfolder/upcoming/animating_faerie_bring_to_life.txt new file mode 100644 index 00000000000..c499d5251d5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/animating_faerie_bring_to_life.txt @@ -0,0 +1,16 @@ +Name:Animating Faerie +ManaCost:2 U +Types:Creature Faerie +PT:2/2 +K:Flying +Oracle:Flying +AlternateMode:Adventure + +ALTERNATE + +Name:Bring to Life +ManaCost:2 U +Types:Sorcery Adventure +A:SP$ Animate | Cost$ 2 U | ValidTgts$ Artifact.nonCreature+YouCtrl | TgtPrompt$ Select noncreature artifact | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature | RemoveCardTypes$ True | Permanent$ True | SubAbility$ DBPutCounter | SpellDescription$ Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on it. +SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 4 +Oracle:Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/archon_of_absolution.txt b/forge-gui/res/cardsfolder/upcoming/archon_of_absolution.txt new file mode 100644 index 00000000000..25c9de6f2c4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/archon_of_absolution.txt @@ -0,0 +1,8 @@ +Name:Archon of Absolution +ManaCost:3 W +Types:Creature Archon +PT:3/2 +K:Flying +K:Protection from white +S:Mode$ CantAttackUnless | ValidCard$ Creature | Target$ You,Planeswalker.YouCtrl | Cost$ 1 | Description$ Creatures can't attack you or a planeswalker you control unless their controller pays {1} for each of those creatures. +Oracle:Flying\nProtection from white (This creature can't be blocked, targeted, dealt damage, enchanted, or equipped by anything white.)\nCreatures can't attack you or a planeswalker you control unless their controller pays {1} for each of those creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/barge_in.txt b/forge-gui/res/cardsfolder/upcoming/barge_in.txt new file mode 100644 index 00000000000..07a14c80710 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/barge_in.txt @@ -0,0 +1,6 @@ +Name:Barge In +ManaCost:R +Types:Instant +A:SP$ Pump | Cost$ R | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBPump | SpellDescription$ Target attacking creature gets +2/+2 until end of turn. Each attacking non-Human creature gains trample until end of turn. +SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.nonHuman+attacking | KW$ Trample +Oracle:Target attacking creature gets +2/+2 until end of turn. Each attacking non-Human creature gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/bartered_cow.txt b/forge-gui/res/cardsfolder/upcoming/bartered_cow.txt new file mode 100644 index 00000000000..323eac840f0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bartered_cow.txt @@ -0,0 +1,10 @@ +Name:Bartered Cow +ManaCost:3 W +Types:Creature Ox +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$ 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.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +SVar:SacMe:1 +SVar:DiscardMe:3 +Oracle:When Bartered Cow dies or when you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") diff --git a/forge-gui/res/cardsfolder/upcoming/blacklance_paragon.txt b/forge-gui/res/cardsfolder/upcoming/blacklance_paragon.txt new file mode 100644 index 00000000000..48693c7c552 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blacklance_paragon.txt @@ -0,0 +1,8 @@ +Name:Blacklance Paragon +ManaCost:1 B +Types:Creature Human Knight +PT:3/1 +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target Knight gains deathtouch and lifelink until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Knight | TgtPrompt$ Select target Knight | KW$ Deathtouch & Lifelink +Oracle:Flash\nWhen Blacklance Paragon enters the battlefield, target Knight gains deathtouch and lifelink until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/bloodhaze_wolverine.txt b/forge-gui/res/cardsfolder/upcoming/bloodhaze_wolverine.txt new file mode 100644 index 00000000000..9acbdf89503 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bloodhaze_wolverine.txt @@ -0,0 +1,7 @@ +Name:Bloodhaze Wolverine +ManaCost:1 R +Types:Creature Wolverine +PT:2/1 +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you draw your second card each turn, CARDNAME gets +1/+1 and gains first strike until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | KW$ First Strike +Oracle:Whenever you draw your second card each turn, Bloodhaze Wolverine gets +1/+1 and gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/castle_ardenvale.txt b/forge-gui/res/cardsfolder/upcoming/castle_ardenvale.txt new file mode 100644 index 00000000000..7a11b90efd0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/castle_ardenvale.txt @@ -0,0 +1,10 @@ +Name:Castle Ardenvale +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:LandTapped +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Plains.YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control a Plains. +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +A:AB$ Token | Cost$ 2 W W T | TokenAmount$ 1 | TokenScript$ w_1_1_human | TokenOwner$ You | LegacyImage$ w 1 1 human eld | SpellDescription$ Create a 1/1 white Human creature token. +DeckHints:Type$Human +DeckHas:Ability$Token +Oracle:Castle Ardenvale enters the battlefield tapped unless you control a Plains.\n{T}: Add {W}.\n{2}{W}{W}, {T}: Create a 1/1 white Human creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/castle_embereth.txt b/forge-gui/res/cardsfolder/upcoming/castle_embereth.txt new file mode 100644 index 00000000000..1a506611e16 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/castle_embereth.txt @@ -0,0 +1,9 @@ +Name:Castle Embereth +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:LandTapped +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Mountain.YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control a Mountain. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +SVar:PlayMain1:TRUE +A:AB$ PumpAll | Cost$ 1 R R T | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | SpellDescription$ Creatures you control get +1/+0 until end of turn. +Oracle:Castle Embereth enters the battlefield tapped unless you control a Mountain.\n{T}: Add {R}.\n{1}{R}{R}, {T}: Creatures you control get +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/castle_garenbrig.txt b/forge-gui/res/cardsfolder/upcoming/castle_garenbrig.txt new file mode 100644 index 00000000000..0a5a271a550 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/castle_garenbrig.txt @@ -0,0 +1,8 @@ +Name:Castle Garenbrig +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:LandTapped +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Forest.YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control a Forest. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Mana | Cost$ 2 G G T | Produced$ G | Amount$ 6 | RestrictValid$ Spell.Creature,Activated.Creature | SpellDescription$ Add six {G}. Spend this mana only to cast creature spells or activate abilities of creatures. +Oracle:Castle Garenbrig enters the battlefield tapped unless you control a Forest.\n{T}: Add {G}.\n{2}{G}{G}, {T}: Add six {G}. Spend this mana only to cast creature spells or activate abilities of creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/castle_locthwain.txt b/forge-gui/res/cardsfolder/upcoming/castle_locthwain.txt new file mode 100644 index 00000000000..3112cad52ad --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/castle_locthwain.txt @@ -0,0 +1,10 @@ +Name:Castle Locthwain +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:LandTapped +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Swamp.YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control a Swamp. +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +A:AB$ Draw | Cost$ 1 B B T | NumCards$ 1 | SpellDescription$ Draw a card, then you lose life equal to the number of cards in your hand. | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | References$ X +SVar:X:Count$InYourHand +Oracle:Castle Locthwain enters the battlefield tapped unless you control a Swamp.\n{T}: Add {B}.\n{1}{B}{B}, {T}: Draw a card, then you lose life equal to the number of cards in your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/castle_vantress.txt b/forge-gui/res/cardsfolder/upcoming/castle_vantress.txt new file mode 100644 index 00000000000..15be04c43b1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/castle_vantress.txt @@ -0,0 +1,8 @@ +Name:Castle Vantress +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:LandTapped +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Island.YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control an Island. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Scry | Cost$ 2 U U T | ScryNum$ 2 | SpellDescription$ Scry 2. +Oracle:Castle Vantress enters the battlefield tapped unless you control an Island.\n{T}: Add {U}.\n{2}{U}{U}, {T}: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/edgewall_innkeeper.txt b/forge-gui/res/cardsfolder/upcoming/edgewall_innkeeper.txt new file mode 100644 index 00000000000..db027f357e7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/edgewall_innkeeper.txt @@ -0,0 +1,7 @@ +Name:Edgewall Innkeeper +ManaCost:G +Types:Creature Human Peasant +PT:1/1 +T:Mode$ SpellCast | ValidCard$ Creature.AdventureCard | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell that has an Adventure, draw a card. +SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 +Oracle:Whenever you cast a creature spell that has an Adventure, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/escape_to_the_wilds.txt b/forge-gui/res/cardsfolder/upcoming/escape_to_the_wilds.txt new file mode 100644 index 00000000000..ef196ed4c5e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/escape_to_the_wilds.txt @@ -0,0 +1,12 @@ +Name:Escape to the Wilds +ManaCost:3 R G +Types:Sorcery +A:SP$ Mill | Cost$ 3 R G | Destination$ Exile | NumCards$ 5 | RememberMilled$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top five cards of your library. You may play cards exiled this way until the end of your next turn. +SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | ForgetOnMoved$ Exile | StaticAbilities$ Play | Duration$ UntilTheEndOfYourNextTurn | SubAbility$ DBEffect2 +SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play cards exiled this the end of your next turn. +SVar:DBEffect2$ Effect | Cost$ 3 R G | Name$ CARDNAME Effect | StaticAbilities$ Exploration | AILogic$ Always | SpellDescription$ You may play an additional land this turn. | SubAbility$ DBCleanup +SVar:Exploration:Mode$ Continuous | Affected$ You | AddKeyword$ AdjustLandPlays:1 | EffectZone$ Command | Description$ You may play an additional land this turn. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:NeedsToPlayVar:ZZ GE1 +SVar:ZZ:Count$ValidHand Land.YouOwn +Oracle:Exile the top five cards of your library. You may play cards exiled this way until the end of your next turn.\nYou may play an additional land this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/fabled_passage.txt b/forge-gui/res/cardsfolder/upcoming/fabled_passage.txt new file mode 100644 index 00000000000..0dd3dd1dba4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fabled_passage.txt @@ -0,0 +1,7 @@ +Name:Fabled Passage +ManaCost:no cost +Types:Land +A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | RememerChanged$ True | SubAbility$ DBUntap | SpellDescription$ Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. Then if you control four or more lands, untap that land. +SVar:DBUntap:DB$ Untap | Defined$ Remembered | ConditionPresent$ Land.YouCtrl | ConditionCompare$ GE4 | ConditionDescription$ If you control four or more lands, untap that land. | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:{T}, Sacrifice Fabled Passage: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. Then if you control four or more lands, untap that land. diff --git a/forge-gui/res/cardsfolder/upcoming/ferocity_of_the_wilds.txt b/forge-gui/res/cardsfolder/upcoming/ferocity_of_the_wilds.txt new file mode 100644 index 00000000000..6d09ef063be --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ferocity_of_the_wilds.txt @@ -0,0 +1,6 @@ +Name:Ferocity of the Wilds +ManaCost:2 R +Types:Enchantment +S:Mode$ Continuous | Affected$ Creature.nonHuman+attacking+YouCtrl | AddPower$ 1 | AddKeyword$ Trample | Description$ Attacking non-Human creatures you control get +1/+0 and have trample. +SVar:PlayMain1:TRUE +Oracle:Attacking non-Human creatures you control get +1/+0 and have trample. diff --git a/forge-gui/res/cardsfolder/upcoming/festive_funeral.txt b/forge-gui/res/cardsfolder/upcoming/festive_funeral.txt new file mode 100644 index 00000000000..cbf1ae394d0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/festive_funeral.txt @@ -0,0 +1,6 @@ +Name:Festive Funeral +ManaCost:4 B +Types:Instant +A:SP$ Pump | Cost$ 4 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | References$ X | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the number of cards in your graveyard. +SVar:X:Count$InYourYard +Oracle:Target creature gets -X/-X until end of turn, where X is the number of cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/foreboding_fruit.txt b/forge-gui/res/cardsfolder/upcoming/foreboding_fruit.txt new file mode 100644 index 00000000000..b0137c2de2b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/foreboding_fruit.txt @@ -0,0 +1,8 @@ +Name:Foreboding Fruit +ManaCost:2 B +Types:Sorcery +A:SP$ Draw | Cost$ 2 B | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SubAbility$ DBLoseLife | SpellDescription$ Target player draws two cards and loses 2 life. Adamant — If at least three black mana was spent to cast this spell, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 2 life.") +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2 | Defined$ Targeted | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld | References$ X +SVar:X:Count$Adamant.Black.1.0 +Oracle:Target player draws two cards and loses 2 life.\nAdamant — If at least three black mana was spent to cast this spell, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 2 life.") diff --git a/forge-gui/res/cardsfolder/upcoming/fortifying_provisions.txt b/forge-gui/res/cardsfolder/upcoming/fortifying_provisions.txt new file mode 100644 index 00000000000..6db938168b6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fortifying_provisions.txt @@ -0,0 +1,8 @@ +Name:Fortifying Provisions +ManaCost:2 W +Types:Enchantment +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddToughness$ 1 | Description$ Creatures you control get +0/+1. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, 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 | LegacyImage$ c a food sac eld +SVar:PlayMain1:TRUE +Oracle:Creatures you control get +0/+1.\nWhen Fortifying Provisions enters the battlefield, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") diff --git a/forge-gui/res/cardsfolder/upcoming/foulmire_knight_profane_insight.txt b/forge-gui/res/cardsfolder/upcoming/foulmire_knight_profane_insight.txt new file mode 100644 index 00000000000..7965754d32f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/foulmire_knight_profane_insight.txt @@ -0,0 +1,16 @@ +Name:Foulmire Knight +ManaCost:B +Types:Creature Zombie Knight +PT:1/1 +K:Deathtouch +Oracle:Deathtouch +AlternateMode:Adventure + +ALTERNATE + +Name:Profane Insight +ManaCost:2 B +Types:Instant Adventure +A:SP$ Draw | Cost$ 2 B | Defined$ You | NumCards$ 1 | SubAbility$ DBLoseLife | SpellDescription$ You draw a card and you lose 1 life. +SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 1 +Oracle:You draw a card and you lose 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/giants_skewer.txt b/forge-gui/res/cardsfolder/upcoming/giants_skewer.txt new file mode 100644 index 00000000000..d2ecf989060 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/giants_skewer.txt @@ -0,0 +1,9 @@ +Name:Giant's Skewer +ManaCost:1 B +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 1 | Description$ Equipped creature gets +2/+1. +T:Mode$ DamageDone | ValidSource$ Creature.EquippedBy | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever equipped creature deals combat damage to a creature, 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 | LegacyImage$ c a food sac eld +DeckHas:Ability$LifeGain +K:Equip:3 +Oracle:Equipped creature gets +2/+1.\nWhenever equipped creature deals combat damage to a creature, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/grumgully_the_generous.txt b/forge-gui/res/cardsfolder/upcoming/grumgully_the_generous.txt new file mode 100644 index 00000000000..ab653e8e3c8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grumgully_the_generous.txt @@ -0,0 +1,7 @@ +Name:Grumgully, the Generous +ManaCost:1 R G +Types:Legendary Creature Goblin Shaman +PT:3/3 +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.YouCtrl+Other+nonHuman +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each other non-Human creature you controls enters the battlefield with an additional +1/+1 counter on it. +Oracle:Each other non-Human creature you controls enters the battlefield with an additional +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/hushbringer.txt b/forge-gui/res/cardsfolder/upcoming/hushbringer.txt new file mode 100644 index 00000000000..3fc0204661c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hushbringer.txt @@ -0,0 +1,10 @@ +Name:Hushbringer +ManaCost:1 W +Types:Creature Faerie +PT:1/2 +K:Flying +K:Lifelink +S:Mode$ Continuous | GlobalRule$ Creatures entering the battlefield don't cause abilities to trigger. | Description$ Creatures entering the battlefield or dying don't cause abilities to trigger. +S:Mode$ Continuous | GlobalRule$ Creatures dying don't cause abilities to trigger. | Secondary$ True | Description$ Creatures entering the battlefield or dying don't cause abilities to trigger. +AI:RemoveDeck:Random +Oracle:Flying, lifelink\nCreatures entering the battlefield or dying don't cause abilities to trigger. diff --git a/forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt b/forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt new file mode 100644 index 00000000000..41d7e14ea13 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt @@ -0,0 +1,9 @@ +Name:Idyllic Grange +ManaCost:no cost +Types:Land Plains +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Plains. +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Plains.YouCtrl+Other | ConditionCompare$ LT3 | SubAbility$ MoveToPlay +SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+untapped | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield untapped, put a +1/+1 counter on target creature you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 +Oracle:({T}: Add {W}.)\nIdyllic Grange enters the battlefield tapped unless you control three or more other Plains.\nWhen Idyllic Grange enters the battlefield untapped, put a +1/+1 counter on target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/improbable_alliance.txt b/forge-gui/res/cardsfolder/upcoming/improbable_alliance.txt new file mode 100644 index 00000000000..d202d4c64dc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/improbable_alliance.txt @@ -0,0 +1,9 @@ +Name:Improbable Alliance +ManaCost:U R +Types:Enchantment +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you draw your second card each turn, create a 1/1 blue Faerie creature token with flying. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_1_1_faerie_flying | TokenOwner$ You | LegacyImage$ u 1 1 faerie flying eld +A:AB$ Draw | Cost$ 4 U R | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +AI:RemoveDeck:All +Oracle:Whenever you draw your second card each turn, create a 1/1 blue Faerie creature token with flying.\n{4}{U}{R}: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/irencrag_pyromancer.txt b/forge-gui/res/cardsfolder/upcoming/irencrag_pyromancer.txt new file mode 100644 index 00000000000..6559ba57551 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/irencrag_pyromancer.txt @@ -0,0 +1,8 @@ +Name:Irencrag Pyromancer +ManaCost:2 R +Types:Creature Human Wizard +PT:0/4 +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever you draw your second card each turn, CARDNAME deals 3 damage to any target. +SVar:TrigDmg:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 +AI:RemoveDeck:Random +Oracle:Whenever you draw your second card each turn, Irencrag Pyromancer deals 3 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/linden_the_steadfast_queen.txt b/forge-gui/res/cardsfolder/upcoming/linden_the_steadfast_queen.txt new file mode 100644 index 00000000000..9936a7111b3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/linden_the_steadfast_queen.txt @@ -0,0 +1,8 @@ +Name:Linden, the Steadfast Queen +ManaCost:W W W +Types:Legendary Creature Human Noble +PT:3/3 +K:Vigilance +T:Mode$ Attacks | ValidCard$ Creature.White+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a white creature you control attacks, you gain 1 life. +SVar:TrigGainLife:DB$GainLife | LifeAmount$ 1 | Defined$ You +Oracle:Vigilance\nWhenever a white creature you control attacks, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/loch_dragon.txt b/forge-gui/res/cardsfolder/upcoming/loch_dragon.txt new file mode 100644 index 00000000000..97faf198374 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/loch_dragon.txt @@ -0,0 +1,9 @@ +Name:Loch Dragon +ManaCost:U/R U/R U/R U/R +Types:Creature Dragon +PT:3/2 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, you may discard a card. If you do, draw a card. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, you may discard a card. If you do, draw a card. +SVar:TrigDraw:AB$ Draw | Cost$ Discard<1/Card> | NumCards$ 1 +Oracle:Flying\nWhenever Loch Dragon enters the battlefield or attacks, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/locthwain_paladin.txt b/forge-gui/res/cardsfolder/upcoming/locthwain_paladin.txt new file mode 100644 index 00000000000..e9e5f59d791 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/locthwain_paladin.txt @@ -0,0 +1,7 @@ +Name:Locthwain Paladin +ManaCost:3 B +Types:Creature Human Knight +PT:3/2 +K:Menace +K:etbCounter:P1P1:1:Adamant$ Black:Adamant — If at least three black mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. +Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nAdamant — If at least three black mana was spent to cast this spell, Locthwain Paladin enters the battlefield with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/mad_ratter.txt b/forge-gui/res/cardsfolder/upcoming/mad_ratter.txt new file mode 100644 index 00000000000..dc66876f36f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mad_ratter.txt @@ -0,0 +1,8 @@ +Name:Mad Ratter +ManaCost:3 R +Types:Creature Goblin +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 two 1/1 black Rat creature tokens. +SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ b_1_1_rat | TokenOwner$ You | LegacyImage$ b 1 1 rat eld +SVar:PlayMain1:TRUE +Oracle:Whenever you draw your second card each turn, create two 1/1 black Rat creature tokens. diff --git a/forge-gui/res/cardsfolder/upcoming/mantle_of_tides.txt b/forge-gui/res/cardsfolder/upcoming/mantle_of_tides.txt new file mode 100644 index 00000000000..28670bc5792 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mantle_of_tides.txt @@ -0,0 +1,9 @@ +Name:Mantle of Tides +ManaCost:U +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 2 | Description$ Equipped creature gets +1/+2. +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigAttach | TriggerDescription$ Whenever you draw your second card each turn, attach CARDNAME to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +SVar:PlayMain1:TRUE +K:Equip:3 +Oracle:Equipped creature gets +1/+2.\nWhenever you draw your second card each turn, attach Mantle of Tides to target creature you control.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/merchant_of_the_vale_haggle.txt b/forge-gui/res/cardsfolder/upcoming/merchant_of_the_vale_haggle.txt new file mode 100644 index 00000000000..e88a20025ec --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/merchant_of_the_vale_haggle.txt @@ -0,0 +1,17 @@ +Name:Merchant of the Vale +ManaCost:2 R +Types:Creature Human Peasant +PT:2/3 +A:AB$ Draw | Cost$ 2 R Discard<1/Card> | NumCards$ 1 | Defined$ You | SpellDescription$ Draw a card. +Oracle:{2}{R}, Discard a card: Draw a card. +AlternateMode:Adventure + +ALTERNATE + +Name:Haggle +ManaCost:R +Types:Instant Adventure +A:SP$ Discard | Cost$ R | NumCards$ 1 | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ You may discard a card. If you do, draw a card. +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:You may discard a card. If you do, draw a card. (Then exile this card. You may cast the creature later from exile.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/mistford_river_turtle.txt b/forge-gui/res/cardsfolder/upcoming/mistford_river_turtle.txt new file mode 100644 index 00000000000..533e41737a7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mistford_river_turtle.txt @@ -0,0 +1,7 @@ +Name:Mistford River Turtle +ManaCost:3 U +Types:Creature Turtle +PT:1/5 +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target creature can't be blocked this turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.nonHuman+Other+attacking | TgtPrompt$ Select another target attacking non-Human creature | KW$ HIDDEN Unblockable +Oracle:Whenever Mistford River Turtle attacks, another target attacking non-Human creature can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/mysterious_pathlighter.txt b/forge-gui/res/cardsfolder/upcoming/mysterious_pathlighter.txt new file mode 100644 index 00000000000..251f8db2232 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mysterious_pathlighter.txt @@ -0,0 +1,8 @@ +Name:Mysterious Pathlighter +ManaCost:2 W +Types:Creature Faerie +PT:2/2 +K:Flying +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.YouCtrl+AdventureCard +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each creature you control that has an Adventure enters the battlefield with an additional +1/+1 counter on it. +Oracle:Flying\nEach creature you control that has an Adventure enters the battlefield with an additional +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt b/forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt new file mode 100644 index 00000000000..ceb98944205 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt @@ -0,0 +1,9 @@ +Name:Mystic Sanctuary +ManaCost:no cost +Types:Land Island +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Islands. +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Island.YouCtrl+Other | ConditionCompare$ LT3 | SubAbility$ MoveToPlay +SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+untapped | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put target instant or sorcery card from your graveyard on top of your library. +SVar:TrigChange:DB$ ChangeZone | TgtPrompt$ Choose target instant or sorcery card in your graveyard | ValidTgts$ Instant.YouOwn,Sorcery.YouOwn | Origin$ Graveyard | Destination$ Library +Oracle:({T}: Add {U}.)\nMystic Sanctuary enters the battlefield tapped unless you control three or more other Islands.\nWhen Mystic Sanctuary enters the battlefield untapped, you may put target instant or sorcery card from your graveyard on top of your library. diff --git a/forge-gui/res/cardsfolder/upcoming/oakhame_adversary.txt b/forge-gui/res/cardsfolder/upcoming/oakhame_adversary.txt new file mode 100644 index 00000000000..f0eb3973ad3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/oakhame_adversary.txt @@ -0,0 +1,9 @@ +Name:Oakhame Adversary +ManaCost:3 G +Types:Creature Elf Warrior +PT:2/3 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 2 | EffectZone$ All | IsPresent$ Permanent.Green+OppCtrl | Description$ CARDNAME costs {2} less to cast if your opponent controls a green permanent. +K:Deathtouch +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:This spell costs {2} less to cast if your opponent controls a green permanent.\nDeathtouch\nWhenever Oakhame Adversary deals combat damage to a player, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/once_and_future.txt b/forge-gui/res/cardsfolder/upcoming/once_and_future.txt new file mode 100644 index 00000000000..aac1b9d2b82 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/once_and_future.txt @@ -0,0 +1,12 @@ +Name:Once and Future +ManaCost:3 G +Types:Instant +A:SP$ ChangeZone | Cost$ 3 G | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target card in your graveyard | ValidTgts$ Card.YouOwn | SubAbility$ DBPump | SpellDescription$ Return target card from your graveyard to your hand. Put up to one other target card from your graveyard on top of your library. Exile CARDNAME. Adamant — If at least three green mana was spent to cast this spell, instead return those cards to your hand and exile CARDNAME. +SVar:DBPump:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | TgtZone$ Graveyard | TgtPrompt$ Choose target card in your graveyard | ValidTgts$ Card.YouOwn | TargetUnique$ True | RememberObjects$ ThisTargetedCard | SubAbility$ DBReturn +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Library | Hidden$ True | Defined$ Remembered | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X | SubAbility$ DBReturn2 +SVar:DBReturn2:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Hidden$ True | Defined$ Remembered | ConditionCheckSVar$ X | References$ X | SubAbility$ DBExile +SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemebered$ True +SVar:X:Count$Adamant.Green.1.0 +AI:RemoveDeck:Random +Oracle:Return target card from your graveyard to your hand. Put up to one other target card from your graveyard on top of your library. Exile Once and Future.\nAdamant — If at least three green mana was spent to cast this spell, instead return those cards to your hand and exile Once and Future. diff --git a/forge-gui/res/cardsfolder/upcoming/overwhelmed_apprentice.txt b/forge-gui/res/cardsfolder/upcoming/overwhelmed_apprentice.txt new file mode 100644 index 00000000000..34dc290b974 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/overwhelmed_apprentice.txt @@ -0,0 +1,8 @@ +Name:Overwhelmed Apprentice +ManaCost:U +Types:Creature Human Wizard +PT:1/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield, each opponent puts the top two cards of their library into their graveyard. Then you scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) +SVar:TrigMill:DB$ Mill | Defined$ Player.Opponent | NumCards$ 2 | SubAbility$ DBScry +SVar:DBScry:DB$ Scry | ScryNum$ 2 +Oracle:When Overwhelmed Apprentice enters the battlefield, each opponent puts the top two cards of their library into their graveyard. Then you scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) diff --git a/forge-gui/res/cardsfolder/upcoming/rampart_smasher.txt b/forge-gui/res/cardsfolder/upcoming/rampart_smasher.txt new file mode 100644 index 00000000000..dca21af2bcb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rampart_smasher.txt @@ -0,0 +1,6 @@ +Name:Rampart Smasher +ManaCost:R/G R/G R/G R/G +Types:Creature Giant +PT:5/5 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Knight,Creature.Wall | Description$ CARDNAME can't be blocked by Knights or Walls. +Oracle:Rampart Smasher can't be blocked by Knights or Walls. diff --git a/forge-gui/res/cardsfolder/upcoming/redcap_raiders.txt b/forge-gui/res/cardsfolder/upcoming/redcap_raiders.txt new file mode 100644 index 00000000000..11b60b9d93d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/redcap_raiders.txt @@ -0,0 +1,7 @@ +Name:Redcap Raiders +ManaCost:2 R +Types:Creature Goblin Warrior +PT:3/2 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may tap an untapped non-Human creature you control. If you do, CARDNAME gets +1/+1 and gains trample until end of turn. +SVar:TrigPump:AB$ Pump | Cost$ tapXType<1/Creature.nonHuman/non-Human creature> | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | KW$ Trample +Oracle:Whenever Redcap Raiders attacks, you may tap an untapped non-Human creature you control. If you do, Redcap Raiders gets +1/+1 and gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/return_of_the_wildspeaker.txt b/forge-gui/res/cardsfolder/upcoming/return_of_the_wildspeaker.txt new file mode 100644 index 00000000000..25e67135c63 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/return_of_the_wildspeaker.txt @@ -0,0 +1,8 @@ +Name:Return of the Wildspeaker +ManaCost:4 G +Types:Instant +A:SP$ Charm | Cost$ 4 G | Choices$ DBDraw,DBPumpAll +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | References$ X | SpellDescription$ Draw cards equal to the greatest power among non-Human creatures you control. +SVar:X:Count$GreatestPower_Creature.YouCtrl+nonHuman +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl+nonHuman | NumAtt$ 3 | NumDef$ 3 | SpellDescription$ Non-Human creatures you control get +3/+3 until end of turn. +Oracle:Choose one —\n• Draw cards equal to the greatest power among non-Human creatures you control.\n• Non-Human creatures you control get +3/+3 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/revenge_of_ravens.txt b/forge-gui/res/cardsfolder/upcoming/revenge_of_ravens.txt new file mode 100644 index 00000000000..262ffd25dd6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/revenge_of_ravens.txt @@ -0,0 +1,7 @@ +Name:Revenge of Ravens +ManaCost:3 B +Types:Enchantment +T:Mode$ Attacks | ValidCard$ Creature | Attacked$ You,Planeswalker.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature attacks you or a planeswalker you control, that creature's controller loses 1 life and you gain 1 life. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredAttackerController | LifeAmount$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 1 +Oracle:Whenever a creature attacks you or a planeswalker you control, that creature's controller loses 1 life and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/rosethorn_halberd.txt b/forge-gui/res/cardsfolder/upcoming/rosethorn_halberd.txt new file mode 100644 index 00000000000..9d5682f0fb4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rosethorn_halberd.txt @@ -0,0 +1,8 @@ +Name:Rosethorn Halberd +ManaCost:G +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target non-Human creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.nonHuman+YouCtrl | TgtPrompt$ Select target non-Human creature you control +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 1 | Description$ Equipped creature gets +2/+1. +K:Equip:5 +Oracle:When Rosethorn Halberd enters the battlefield, attach it to target non-Human creature you control.\nEquipped creature gets +2/+1.\nEquip {5} ({5}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/sage_of_the_falls.txt b/forge-gui/res/cardsfolder/upcoming/sage_of_the_falls.txt new file mode 100644 index 00000000000..ab70f78266d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sage_of_the_falls.txt @@ -0,0 +1,9 @@ +Name:Sage of the Falls +ManaCost:4 U +Types:Creature Merfolk Wizard +PT:2/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME or another non-Human creature enters the battlefield under you control, you may draw a card. If you do, discard a card. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonHuman+Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoot | OptionalDecider$ You | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another non-Human creature enters the battlefield under you control, you may draw a card. If you do, discard a card. +SVar:TrigLoot:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +Oracle:Whenever Sage of the Falls or another non-Human creature enters the battlefield under you control, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/so_tiny.txt b/forge-gui/res/cardsfolder/upcoming/so_tiny.txt new file mode 100644 index 00000000000..8c4560df64b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/so_tiny.txt @@ -0,0 +1,10 @@ +Name:So Tiny +ManaCost:U +Types:Enchantment Aura +K:Flash +K:Enchant creature +A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -X | References$ X,Y | Description$ Enchanted creature gets -2/-0. It gets -6/-0 instead as long as its controller has seven or more cards in their graveyard. +SVar:X:Count$Compare Y GE7.6.2 +SVar:Y:Count$ValidGraveyard Card.EnchantedControllerCtrl +Oracle:Flash\nEnchant creature\nEnchanted creature gets -2/-0. It gets -6/-0 instead as long as its controller has seven or more cards in their graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/sorcerers_broom.txt b/forge-gui/res/cardsfolder/upcoming/sorcerers_broom.txt new file mode 100644 index 00000000000..94a6a2c8eea --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sorcerers_broom.txt @@ -0,0 +1,8 @@ +Name:Sorcerer's Broom +ManaCost:2 +Types:Artifact Creature Spirit +PT:2/1 +T:Mode$ Sacrificed | ValidCard$ Permanent.Other | Execute$ TrigCopy | TriggerZones$ Battlefield | ValidPlayer$ You | TriggerDescription$ Whenever you sacrifice another permanent, you may pay {3}. If you do, create a token that's a copy of CARDNAME. +SVar:TrigCopy:AB$ CopyPermanent | Cost$ 3 | Defined$ Self | NumCopies$ 1 +AI:RemoveDeck:All +Oracle:Whenever you sacrifice another permanent, you may pay {3}. If you do, create a token that's a copy of Sorcerer's Broom. diff --git a/forge-gui/res/cardsfolder/upcoming/steelgaze_griffin.txt b/forge-gui/res/cardsfolder/upcoming/steelgaze_griffin.txt new file mode 100644 index 00000000000..0b46be76958 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/steelgaze_griffin.txt @@ -0,0 +1,9 @@ +Name:Steelgaze Griffin +ManaCost:4 U +Types:Creature Griffin +PT:2/4 +K:Flying +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ When you draw your second card each turn, CARDNAME gets +2/+0 until end of turn. +SVar:TrigPump:DB$ Pump | NumAtt$ +2 | NumDef$ +0 | Defined$ Self +SVar:PlayMain1:TRUE +Oracle:Flying\nWhen you draw your second card each turn, Steelgaze Griffin gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/stonecoil_serpent.txt b/forge-gui/res/cardsfolder/upcoming/stonecoil_serpent.txt new file mode 100644 index 00000000000..dd379d1423c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/stonecoil_serpent.txt @@ -0,0 +1,10 @@ +Name:Stonecoil Serpent +ManaCost:X +Types:Artifact Creature Snake +PT:0/0 +K:Reach +K:Trample +K:Protection from multicolored +K:etbCounter:P1P1:X +SVar:X:Count$xPaid +Oracle:Reach, trample, protection from multicolored\nStonecoil Serpent enters the battlefield with X +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/stormfist_crusader.txt b/forge-gui/res/cardsfolder/upcoming/stormfist_crusader.txt new file mode 100644 index 00000000000..6f2481fa7f8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/stormfist_crusader.txt @@ -0,0 +1,9 @@ +Name:Stormfist Crusader +ManaCost:B R +Types:Creature Human Knight +PT:2/2 +K:Menace +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your upkeep, each player draws a card and loses 1 life. +SVar:TrigDraw:DB$ Draw | Defined$ Player | NumCards$ 1 | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | Defined$ Player | LifeAmount$ 1 +Oracle:Menace\nAt the beginning of your upkeep, each player draws a card and loses 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/syr_alin_the_lions_claw.txt b/forge-gui/res/cardsfolder/upcoming/syr_alin_the_lions_claw.txt new file mode 100644 index 00000000000..641984a1f42 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/syr_alin_the_lions_claw.txt @@ -0,0 +1,8 @@ +Name:Syr Alin, the Lion's Claw +ManaCost:3 W W +Types:Legendary Creature Human Knight +PT:4/4 +K:First Strike +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, other creatures you control get +1/+1 until end of turn. +SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.Other+YouCtrl | NumAtt$ +1 | NumDef$ +1 +Oracle:First strike\nWhenever Syr Alin, the Lion's Claw attacks, other creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/syr_faren_the_hengehammer.txt b/forge-gui/res/cardsfolder/upcoming/syr_faren_the_hengehammer.txt new file mode 100644 index 00000000000..3415ec81776 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/syr_faren_the_hengehammer.txt @@ -0,0 +1,8 @@ +Name:Syr Faren, the Hengehammer +ManaCost:G G +Types:Legendary Creature Human Knight +PT:2/2 +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target creature gets +X/+X until end of turn, where X is CARDNAME's power. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.attacking+Other | TgtPrompt$ Select another target attacking creature | NumAtt$ X | NumDef$ X | References$ X +SVar:X:Count$CardPower +Oracle:Whenever Syr Faren, the Hengehammer attacks, another target attacking creature gets +X/+X until end of turn, where X is Syr Faren's power. diff --git a/forge-gui/res/cardsfolder/upcoming/tall_as_a_beanstalk.txt b/forge-gui/res/cardsfolder/upcoming/tall_as_a_beanstalk.txt new file mode 100644 index 00000000000..1d5b16a59ca --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tall_as_a_beanstalk.txt @@ -0,0 +1,7 @@ +Name:Tall as a Beanstalk +ManaCost:3 G +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 3 G | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 3 | AddKeyword$ Reach | AddType$ Giant | Description$ Enchanted creature gets +3/+3, has reach, and is a Giant in addition to its other types. +Oracle:Enchant creature\nEnchanted creature gets +3/+3, has reach, and is a Giant in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/tempting_witch.txt b/forge-gui/res/cardsfolder/upcoming/tempting_witch.txt new file mode 100644 index 00000000000..34ba26dbdb6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tempting_witch.txt @@ -0,0 +1,9 @@ +Name:Tempting Witch +ManaCost:2 B +Types:Creature Human Warlock +PT:1/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, 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 | LegacyImage$ c a food sac eld +DeckHas:Ability$LifeGain +A:AB$ LoseLife | Cost$ 2 T Sac<1/Food> | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 3 | SpellDescription$ Target player loses 3 life. +Oracle:When Tempting Witch enters the battlefield, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\n{2}, {T}, Sacrifice a Food: Target player loses 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/the_cauldron_of_eternity.txt b/forge-gui/res/cardsfolder/upcoming/the_cauldron_of_eternity.txt new file mode 100644 index 00000000000..fdd657ee8a5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_cauldron_of_eternity.txt @@ -0,0 +1,10 @@ +Name:The Cauldron of Eternity +ManaCost:10 B B +Types:Legendary Artifact +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {2} less for each creature card in your graveyard. +SVar:X:Count$TypeInYourYard.Creature +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ Whenever a creature you control dies, put it on the bottom of its owner's library. +SVar:TrigChange:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 +SVar:BuffedBy:Creature +A:AB$ ChangeZone | Cost$ 2 B T PayLife<2> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | SorcerySpeed$ True | SpellDescription$ Return target creature card from your graveyard to the battlefield. Activate this ability only any time you could cast a sorcery. +Oracle:This spell costs {2} less for each creature card in your graveyard.\nWhenever a creature you control dies, put it on the bottom of its owner's library.\n{2}{B}, {T}, Pay 2 life: Return target creature card from your graveyard to the battlefield. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/the_great_henge.txt b/forge-gui/res/cardsfolder/upcoming/the_great_henge.txt new file mode 100644 index 00000000000..4628b019329 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_great_henge.txt @@ -0,0 +1,11 @@ +Name:The Great Henge +ManaCost:7 G G +Types:Legendary Artifact +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {X} less to cast, where X is the greatest power among creatures you control. +SVar:X:Count$GreatestPower_Creature.YouCtrl +A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Add {G}{G}. You gain 2 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, put a +1/+1 counter on it and draw a card. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:This spell costs {X} less to cast, where X is the greatest power among creatures you control.\n{T}: Add {G}{G}. You gain 2 life.\nWhenever a nontoken creature enters the battlefield under your control, put a +1/+1 counter on it and draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/thrill_of_possibility.txt b/forge-gui/res/cardsfolder/upcoming/thrill_of_possibility.txt new file mode 100644 index 00000000000..3536b7d3689 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thrill_of_possibility.txt @@ -0,0 +1,7 @@ +Name:Thrill of Possibility +ManaCost:1 R +Types:Instant +A:SP$ Draw | Cost$ 1 R Discard<1/Card> | Defined$ You | NumCards$ 2 | SpellDescription$ Draw two cards. +DeckHas:Ability$Discard +DeckHints:Keyword$Madness & Ability$Delirium +Oracle:As an additional cost to cast this spell, discard a card.\nDraw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/torbran_thane_of_red_fell.txt b/forge-gui/res/cardsfolder/upcoming/torbran_thane_of_red_fell.txt new file mode 100644 index 00000000000..b22438badd9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/torbran_thane_of_red_fell.txt @@ -0,0 +1,9 @@ +Name:Torbran, Thane of Red Fell +ManaCost:1 R R R +Types:Legendary Creature Dwarf Noble +PT:2/4 +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.RedSource+YouCtrl | ValidTarget$ Player.Opponent,Permanent.OppCtrl | ReplaceWith$ DmgPlus2 | Description$ If a red source you control would deal damage to an opponent or a permanent an opponent controls, it deals that much damage plus 2 instead. +SVar:DmgPlus2:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X +SVar:X:ReplaceCount$DamageAmount/Plus.2 +SVar:PlayMain1:TRUE +Oracle:If a red source you control would deal damage to an opponent or a permanent an opponent controls, it deals that much damage plus 2 instead. diff --git a/forge-gui/res/cardsfolder/upcoming/unexplained_vision.txt b/forge-gui/res/cardsfolder/upcoming/unexplained_vision.txt new file mode 100644 index 00000000000..7f484b8a997 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/unexplained_vision.txt @@ -0,0 +1,7 @@ +Name:Unexplained Vision +ManaCost:4 U +Types:Sorcery +A:SP$ Draw | Cost$ 4 U | NumCards$ 3 | SubAbility$ DBScry | SpellDescription$ Draw three cards. Adamant — If at least three blue mana was spent to cast this spell, scry 3. +SVar:DBScry:DB$ Scry | ScryNum$ 3 | ConditionCheckSVar$ X | References$ X +SVar:X:Count$Adamant.Blue.1.0 +Oracle:Draw three cards.\nAdamant — If at least three blue mana was spent to cast this spell, scry 3. diff --git a/forge-gui/res/cardsfolder/upcoming/vantress_paladin.txt b/forge-gui/res/cardsfolder/upcoming/vantress_paladin.txt new file mode 100644 index 00000000000..3b0476c39c0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vantress_paladin.txt @@ -0,0 +1,7 @@ +Name:Vantress Paladin +ManaCost:3 U +Types:Creature Human Knight +PT:2/2 +K:Flying +K:etbCounter:P1P1:1:Adamant$ Blue:Adamant — If at least three blue mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. +Oracle:Flying\nAdamant — If at least three blue mana was spent to cast this spell, Vantress Paladin enters the battlefield with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/wandermare.txt b/forge-gui/res/cardsfolder/upcoming/wandermare.txt new file mode 100644 index 00000000000..75c4b295306 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wandermare.txt @@ -0,0 +1,8 @@ +Name:Wandermare +ManaCost:1 G W +Types:Creature Horse +PT:3/3 +T:Mode$ SpellCast | ValidCard$ Creature.AdventureCard | ValidActivatingPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell that has an Adventure, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:Whenever you cast a creature spell that has an Adventure, put a +1/+1 counter on Wandermare. (It doesn’t need to have gone on the adventure first.) diff --git a/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt b/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt index b6b9625fad9..4fd8616f7a5 100644 --- a/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt +++ b/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt @@ -2,9 +2,8 @@ Name:Witch's Cottage ManaCost:no cost Types:Land Swamp R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Swamps. -SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LT3 | References$ ETBCheckSVar | SubAbility$ MoveToPlay +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Swamp.YouCtrl+Other | ConditionCompare$ LT3 | SubAbility$ MoveToPlay SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield -SVar:ETBCheckSVar:Count$Valid Swamp.YouCtrl+Other -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put target creature card from your graveyard on top of your library. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+untapped | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield untapped, you may put target creature card from your graveyard on top of your library. SVar:TrigChange:DB$ ChangeZone | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | Origin$ Graveyard | Destination$ Library Oracle:({T}: Add {B}.)\nWitch's Cottage enters the battlefield tapped unless you control three or more other Swamps.\nWhen Witch's Cottage enters the battlefield untapped, you may put target creature card from your graveyard on top of your library. diff --git a/forge-gui/res/cardsfolder/upcoming/yorvo_lord_of_garenbrig.txt b/forge-gui/res/cardsfolder/upcoming/yorvo_lord_of_garenbrig.txt new file mode 100644 index 00000000000..06d4ac10138 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/yorvo_lord_of_garenbrig.txt @@ -0,0 +1,12 @@ +Name:Yorvo, Lord of Garenbrig +ManaCost:G G G +Types:Legendary Creature Giant Noble +PT:0/0 +K:etbCounter:P1P1:4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl+Green | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another green creature enters the battlefield under your control, put a +1/+1 counter on CARDNAME. Then if that creature's power is greater than CARDNAME's power, put another +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | COnditionCheckSVar$ X | ConditionSVarCompare$ GEY | References$ X,Y +SVar:X:TriggeredCard$CardPower +SVar:Y:Count$CardPower +DeckHas:Ability$Counters +Oracle:Yorvo, Lord of Garenbrig enters the battlefield with four +1/+1 counters on it.\nWhenever another green creature enters the battlefield under your control, put a +1/+1 counter on Yorvo. Then if that creature's power is greater than Yorvo's power, put another +1/+1 counter on Yorvo. diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 5142a6a34ce..4a84d50e47a 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -179,8 +179,8 @@ KeyboardShortcuts=Tastenkombinationen lblAchievements=Errungenschaften # VSubmenuDownloaders.java btnDownloadSetPics=Bilder(LQ) Sets herunterladen -btnDownloadPicsHQ=Bilder(HQ Karten herunterladen (Sehr langsam!) btnDownloadPics=Bilder(LQ) Karten herunterladen +btnDownloadPicsHQ=Bilder(HQ) Karten herunterladen (Sehr langsam!) btnDownloadQuestImages=Bilder für Quests herunterladen btnDownloadAchievementImages=Bilder für Erfolge herunterladen btnReportBug=Einen Fehler melden @@ -389,7 +389,7 @@ lblVanguardDesc=Jeder Spieler hat eine eigene spielbeeinflussende \"Avatar\"-Kar lblCommander=Commander lblCommanderDesc=Jeder Spieler hat eine legendäre \"General\"-Karte, welche (fast) jederzeit gespielt werden kann und die Farben des Decks bestimmt. lblOathbreaker=Eidbrecher -lblOathbreakerDesc=Jeder Spieler hat eine Plainswalker-Karte als seinen "Eidbrecher", welche jederzeit gespielt werdeb kann und die Farben des Decks festlegt. Jeder Spieler hat außerdem noch einnen "Signatur"-Spruch, welcher gespielt werden kann, solange der Eidbrecher im Spiel ist. +lblOathbreakerDesc=Jeder Spieler hat eine Planeswalker-Karte als seinen "Eidbrecher", welche jederzeit gespielt werden kann und die Farben des Decks festlegt. Jeder Spieler hat außerdem noch einen "Signatur"-Spruch, welcher gespielt werden kann, solange der Eidbrecher im Spiel ist. lblTinyLeaders=Kleine Anführer lblTinyLeadersDesc=Jeder Spieler hat eine legendäre \"General\"-Karte, welche (fast) jederzeit gespielt werden kann und die Farben des Decks bestimmt. Alle Karten haben umgewandelte Manakosten von max. 3. lblBrawl=Brawl @@ -528,7 +528,7 @@ lblConstructedDecks=Konstruierte Decks lblCommanderDecks=Commander Decks lblRandomCommanderDecks=Zufälliges Commander Deck lblRandomCommanderCard-basedDecks=Zufälliges Commander Deck (kartenbasiert) -lblOathbreakerDecks=Oathbreaker-Decks +lblOathbreakerDecks=Eidbrecher-Decks lblTinyLeadersDecks=Kleine-Anführer-Decks lblBrawlDecks=Brawl Decks lblSchemeDecks=Komplott-Decks @@ -796,7 +796,7 @@ lbltoplanardeck=zum Weltendeck lbltoconspiracydeck=zum Verschwörungsdeck lblMove=Verschieben #VDock.java -lblDock=Anhängen +lblDock=Symbolleiste lblViewDeckList=Zeige Deckliste lblRevertLayout=Layout zurücksetzen lblOpenLayout=Lade Layout @@ -849,8 +849,8 @@ ttbtnRandDeck5=Erzeugt konstuiertes Deck in fünf Farben lblCurrentDeck2=aktuelles Deck lblUntitled=Unbenannt #VPrompt.java -lblPrompt=Abfrage -lblGameSetup=Spielaufbau +lblPrompt=Meldungen +lblGameSetup=Spielvorbereitung #ColumnDef.java lblAIStatus=KI-Status lblCMC=UMK @@ -891,13 +891,13 @@ lblSettings=Einstellungen #SettingsPage.java lblAutomaticBugReports=Automatischer Fehlerbericht lblBattlefieldTextureFiltering=Texturenfilter Spielfeld -lblCompactListItems=kompakte Liste -lblCompactTabs=kompakte Tabs +lblCompactListItems=Kompakte Liste +lblCompactTabs=Kompakte Tabs lblCardOverlays=Karten-Overlays lblDisableCardEffect=Karten-"Effekt"-Anzeige abschalten lblDynamicBackgroundPlanechase=Weltenjagd dynamischer Hintergrund lblGameplayOptions=Spiel-Optionen -lblGeneralSettings=allgem. Einstellungen +lblGeneralSettings=Allgem. Einstellungen lblHotSeatMode=Hot-Seat-Modus lblLandscapeMode=Querformat lblLater=Später @@ -912,7 +912,7 @@ lblShowCardManaCostOverlays=Blende die Manakosten der Karten ein lblShowCardNameOverlays=Blende den Namen der Karten ein lblShowCardOverlays=Zeige Karten-Einblendungen an lblShowCardPTOverlays=Blende Stärke und Widerstand ein -lblShowMatchBackground=Zeige Duell hintergund an +lblShowMatchBackground=Zeige Duell-Hintergund an lblVibrateAfterLongPress=Vibieren nach langem Tastendruck lblVibrateWhenLosingLife=Vibrieren nach Lebenspunktverlust lblVibrationOptions=Vibrationsoptionen @@ -970,3 +970,7 @@ lblCollection=Sammlung lblCatalog=Katalog lblCommanders=Komandeure lblOathbreakers=Eidbrecher +#Forge.java +lblLoadingFonts=Lade Schriften... +lblLoadingCardTranslations=Lade Kartenübersetzungen... +lblFinishingStartup=Abschliessen... diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index f94a7edc84c..86f39905691 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -969,4 +969,8 @@ lblInventory=Inventory lblCollection=Collection lblCatalog=Catalog lblCommanders=Commanders -lblOathbreakers=Oathbreakers \ No newline at end of file +lblOathbreakers=Oathbreakers +#Forge.java +lblLoadingFonts=Loading fonts... +lblLoadingCardTranslations=Loading card translations... +lblFinishingStartup=Finishing startup... \ No newline at end of file diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 5e916608fcd..968fbf9fc48 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -969,4 +969,8 @@ lblInventory=Inventario lblCollection=Colección lblCatalog=Catálogo lblCommanders=Commanders -lblOathbreakers=Oathbreakers \ No newline at end of file +lblOathbreakers=Oathbreakers +#Forge.java +lblLoadingFonts=Loading fonts... +lblLoadingCardTranslations=Loading card translations... +lblFinishingStartup=Finishing startup... \ No newline at end of file diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index b23a8408ba6..a588789c5db 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -969,4 +969,8 @@ lblInventory=库存 lblCollection=珍藏 lblCatalog=目录 lblCommanders=指挥官 -lblOathbreakers=破誓者 \ No newline at end of file +lblOathbreakers=破誓者 +#Forge.java +lblLoadingFonts=加载字体中 +lblLoadingCardTranslations=加载卡牌翻译中 +lblFinishingStartup=完成启动 \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/g_7_7_giant.txt b/forge-gui/res/tokenscripts/g_7_7_giant.txt new file mode 100644 index 00000000000..ab0ad7d07b6 --- /dev/null +++ b/forge-gui/res/tokenscripts/g_7_7_giant.txt @@ -0,0 +1,6 @@ +Name:Giant +Colors:green +ManaCost:no cost +PT:7/7 +Types:Creature Giant +Oracle: \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/r_1_1_dwarf.txt b/forge-gui/res/tokenscripts/r_1_1_dwarf.txt new file mode 100644 index 00000000000..f6ff5776ddf --- /dev/null +++ b/forge-gui/res/tokenscripts/r_1_1_dwarf.txt @@ -0,0 +1,6 @@ +Name:Dwarf +ManaCost:no cost +Types:Creature Dwarf +Colors:red +PT:1/1 +Oracle: diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index 67dd9217b04..2ccc98d7e08 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -282,7 +282,7 @@ public class DeckgenUtil { } List restrictedCardsAdded = new ArrayList<>(); for (PaperCard c:selectedCards){ - if (format.getRestrictedCards().contains(c.getName())&&!restrictedCardsAdded.contains(c)){ + if (format.getRestrictedCards().contains(c.getName())&&!restrictedCardsAdded.contains(c.getName())){ playsetList.add(c); restrictedCardsAdded.add(c.getName()); continue;