Merge pull request #1951 from tool4ever/cleanStuff

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -15,6 +15,7 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.CardTranslation;
public abstract class RegenerateBaseEffect extends SpellAbilityEffect {
@@ -24,7 +25,7 @@ public abstract class RegenerateBaseEffect extends SpellAbilityEffect {
// create Effect for Regeneration
final Card eff = createEffect(
sa, sa.getActivatingPlayer(), hostCard.getName() + "'s Regeneration", hostCard.getImageKey());
sa, sa.getActivatingPlayer(), CardTranslation.getTranslatedName(hostCard.getName()) + "'s Regeneration", hostCard.getImageKey());
eff.addRemembered(list);
addForgetOnMovedTrigger(eff, "Battlefield");
@@ -39,7 +40,7 @@ public abstract class RegenerateBaseEffect extends SpellAbilityEffect {
ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true);
SpellAbility saReg = AbilityFactory.getAbility(effect, eff);
AbilitySub saExile = (AbilitySub)AbilityFactory.getAbility(exileEff, eff);
AbilitySub saExile = (AbilitySub)AbilityFactory.getAbility(exileEff, eff);
saReg.setSubAbility(saExile);
re.setOverridingAbility(saReg);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,8 +2,8 @@ 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.")
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | TriggerController$ TriggeredCardController | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies or when you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")
T:Mode$ Discarded | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies or when you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You
SVar:SacMe:1
SVar:DiscardMe:3

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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