mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-14 17:58:01 +00:00
Merge branch 'Card-Forge:master' into master
This commit is contained in:
@@ -2430,7 +2430,7 @@ public class GameAction {
|
|||||||
}
|
}
|
||||||
if (c.isPlaneswalker()) {
|
if (c.isPlaneswalker()) {
|
||||||
int lethalPW = c.getCurrentLoyalty();
|
int lethalPW = c.getCurrentLoyalty();
|
||||||
// 120.10
|
// CR 120.10
|
||||||
lethal = c.isCreature() ? Math.min(lethal, lethalPW) : lethalPW;
|
lethal = c.isCreature() ? Math.min(lethal, lethalPW) : lethalPW;
|
||||||
}
|
}
|
||||||
lethalDamage.put(c, lethal);
|
lethalDamage.put(c, lethal);
|
||||||
@@ -2442,6 +2442,7 @@ public class GameAction {
|
|||||||
sourceLKI.getDamageHistory().registerDamage(e.getValue(), isCombat, sourceLKI, e.getKey(), lkiCache);
|
sourceLKI.getDamageHistory().registerDamage(e.getValue(), isCombat, sourceLKI, e.getKey(), lkiCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CR 702.15e
|
||||||
if (sum > 0 && sourceLKI.hasKeyword(Keyword.LIFELINK)) {
|
if (sum > 0 && sourceLKI.hasKeyword(Keyword.LIFELINK)) {
|
||||||
sourceLKI.getController().gainLife(sum, sourceLKI, cause);
|
sourceLKI.getController().gainLife(sum, sourceLKI, cause);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -302,8 +302,7 @@ public final class AbilityFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (spellAbility instanceof SpellApiBased && hostCard.isPermanent()) {
|
if (spellAbility instanceof SpellApiBased && hostCard.isPermanent()) {
|
||||||
String desc = mapParams.containsKey("SpellDescription") ? mapParams.get("SpellDescription")
|
String desc = mapParams.getOrDefault("SpellDescription", spellAbility.getHostCard().getName());
|
||||||
: spellAbility.getHostCard().getName();
|
|
||||||
spellAbility.setDescription(desc);
|
spellAbility.setDescription(desc);
|
||||||
} else if (mapParams.containsKey("SpellDescription")) {
|
} else if (mapParams.containsKey("SpellDescription")) {
|
||||||
spellAbility.rebuiltDescription();
|
spellAbility.rebuiltDescription();
|
||||||
|
|||||||
@@ -65,6 +65,10 @@ public class CharmEffect extends SpellAbilityEffect {
|
|||||||
// using getCardForUi game is not set, so can't guess max charm
|
// using getCardForUi game is not set, so can't guess max charm
|
||||||
num = Integer.MAX_VALUE;
|
num = Integer.MAX_VALUE;
|
||||||
} else {
|
} else {
|
||||||
|
// fallback needed while ability building
|
||||||
|
if (sa.getActivatingPlayer() == null) {
|
||||||
|
sa.setActivatingPlayer(source.getController());
|
||||||
|
}
|
||||||
num = Math.min(AbilityUtils.calculateAmount(source, sa.getParamOrDefault("CharmNum", "1"), sa), list.size());
|
num = Math.min(AbilityUtils.calculateAmount(source, sa.getParamOrDefault("CharmNum", "1"), sa), list.size());
|
||||||
}
|
}
|
||||||
final int min = sa.hasParam("MinCharmNum") ? AbilityUtils.calculateAmount(source, sa.getParam("MinCharmNum"), sa) : num;
|
final int min = sa.hasParam("MinCharmNum") ? AbilityUtils.calculateAmount(source, sa.getParam("MinCharmNum"), sa) : num;
|
||||||
|
|||||||
@@ -320,12 +320,9 @@ public class DamageDealEffect extends DamageBaseEffect {
|
|||||||
} else {
|
} else {
|
||||||
if (sa.hasParam("ExcessDamage") && (!sa.hasParam("ExcessDamageCondition") ||
|
if (sa.hasParam("ExcessDamage") && (!sa.hasParam("ExcessDamageCondition") ||
|
||||||
sourceLKI.isValid(sa.getParam("ExcessDamageCondition").split(","), activationPlayer, hostCard, sa))) {
|
sourceLKI.isValid(sa.getParam("ExcessDamageCondition").split(","), activationPlayer, hostCard, sa))) {
|
||||||
|
|
||||||
damageMap.put(sourceLKI, c, dmgToTarget);
|
damageMap.put(sourceLKI, c, dmgToTarget);
|
||||||
|
|
||||||
List<GameEntity> list = Lists.newArrayList();
|
List<GameEntity> list = AbilityUtils.getDefinedEntities(hostCard, sa.getParam("ExcessDamage"), sa);
|
||||||
list.addAll(AbilityUtils.getDefinedCards(hostCard, sa.getParam("ExcessDamage"), sa));
|
|
||||||
list.addAll(AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("ExcessDamage"), sa));
|
|
||||||
|
|
||||||
if (!list.isEmpty()) {
|
if (!list.isEmpty()) {
|
||||||
damageMap.put(sourceLKI, list.get(0), excess);
|
damageMap.put(sourceLKI, list.get(0), excess);
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import forge.game.spellability.AbilitySub;
|
|||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.util.CardTranslation;
|
||||||
import forge.util.TextUtil;
|
import forge.util.TextUtil;
|
||||||
|
|
||||||
public abstract class DamagePreventEffectBase extends SpellAbilityEffect {
|
public abstract class DamagePreventEffectBase extends SpellAbilityEffect {
|
||||||
@@ -24,7 +25,7 @@ public abstract class DamagePreventEffectBase extends SpellAbilityEffect {
|
|||||||
final Card hostCard = sa.getHostCard();
|
final Card hostCard = sa.getHostCard();
|
||||||
final Game game = hostCard.getGame();
|
final Game game = hostCard.getGame();
|
||||||
final Player player = hostCard.getController();
|
final Player player = hostCard.getController();
|
||||||
final String name = hostCard.getName() + "'s Effect";
|
final String name = CardTranslation.getTranslatedName(hostCard.getName()) + "'s Effect";
|
||||||
final String image = hostCard.getImageKey();
|
final String image = hostCard.getImageKey();
|
||||||
StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | ValidTarget$ ");
|
StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | ValidTarget$ ");
|
||||||
sb.append((o instanceof Card ? "Card.IsRemembered" : "Player.IsRemembered"));
|
sb.append((o instanceof Card ? "Card.IsRemembered" : "Player.IsRemembered"));
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ public class DelayedTriggerEffect extends SpellAbilityEffect {
|
|||||||
final Card host = sa.getHostCard();
|
final Card host = sa.getHostCard();
|
||||||
final Game game = host.getGame();
|
final Game game = host.getGame();
|
||||||
Map<String, String> mapParams = Maps.newHashMap(sa.getMapParams());
|
Map<String, String> mapParams = Maps.newHashMap(sa.getMapParams());
|
||||||
|
|
||||||
mapParams.remove("Cost");
|
mapParams.remove("Cost");
|
||||||
|
|
||||||
if (mapParams.containsKey("SpellDescription")) {
|
if (mapParams.containsKey("SpellDescription")) {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import forge.game.trigger.Trigger;
|
|||||||
import forge.game.trigger.TriggerHandler;
|
import forge.game.trigger.TriggerHandler;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.util.CardTranslation;
|
||||||
import forge.util.TextUtil;
|
import forge.util.TextUtil;
|
||||||
import forge.util.collect.FCollection;
|
import forge.util.collect.FCollection;
|
||||||
|
|
||||||
@@ -113,7 +114,7 @@ public class EffectEffect extends SpellAbilityEffect {
|
|||||||
|
|
||||||
String name = sa.getParam("Name");
|
String name = sa.getParam("Name");
|
||||||
if (name == null) {
|
if (name == null) {
|
||||||
name = hostCard.getName() + (sa.hasParam("Boon") ? "'s Boon" : "'s Effect");
|
name = CardTranslation.getTranslatedName(hostCard.getName()) + (sa.hasParam("Boon") ? "'s Boon" : "'s Effect");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unique Effects shouldn't be duplicated
|
// Unique Effects shouldn't be duplicated
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import forge.game.replacement.ReplacementHandler;
|
|||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.util.CardTranslation;
|
||||||
|
|
||||||
public class FogEffect extends SpellAbilityEffect {
|
public class FogEffect extends SpellAbilityEffect {
|
||||||
|
|
||||||
@@ -22,7 +23,7 @@ public class FogEffect extends SpellAbilityEffect {
|
|||||||
public void resolve(SpellAbility sa) {
|
public void resolve(SpellAbility sa) {
|
||||||
final Card hostCard = sa.getHostCard();
|
final Card hostCard = sa.getHostCard();
|
||||||
final Game game = hostCard.getGame();
|
final Game game = hostCard.getGame();
|
||||||
final String name = hostCard.getName() + "'s Effect";
|
final String name = CardTranslation.getTranslatedName(hostCard.getName()) + "'s Effect";
|
||||||
final String image = hostCard.getImageKey();
|
final String image = hostCard.getImageKey();
|
||||||
StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | IsCombat$ True");
|
StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | IsCombat$ True");
|
||||||
sb.append(" | Prevent$ True | Description$ Prevent all combat damage this turn.");
|
sb.append(" | Prevent$ True | Description$ Prevent all combat damage this turn.");
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import forge.game.trigger.Trigger;
|
|||||||
import forge.game.trigger.TriggerHandler;
|
import forge.game.trigger.TriggerHandler;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.util.CardTranslation;
|
||||||
|
|
||||||
public abstract class RegenerateBaseEffect extends SpellAbilityEffect {
|
public abstract class RegenerateBaseEffect extends SpellAbilityEffect {
|
||||||
|
|
||||||
@@ -24,44 +25,44 @@ public abstract class RegenerateBaseEffect extends SpellAbilityEffect {
|
|||||||
|
|
||||||
// create Effect for Regeneration
|
// create Effect for Regeneration
|
||||||
final Card eff = createEffect(
|
final Card eff = createEffect(
|
||||||
sa, sa.getActivatingPlayer(), hostCard.getName() + "'s Regeneration", hostCard.getImageKey());
|
sa, sa.getActivatingPlayer(), CardTranslation.getTranslatedName(hostCard.getName()) + "'s Regeneration", hostCard.getImageKey());
|
||||||
|
|
||||||
eff.addRemembered(list);
|
eff.addRemembered(list);
|
||||||
addForgetOnMovedTrigger(eff, "Battlefield");
|
addForgetOnMovedTrigger(eff, "Battlefield");
|
||||||
|
|
||||||
// build ReplacementEffect
|
// build ReplacementEffect
|
||||||
String repeffstr = "Event$ Destroy | ActiveZones$ Command | ValidCard$ Card.IsRemembered | Regeneration$ True"
|
String repeffstr = "Event$ Destroy | ActiveZones$ Command | ValidCard$ Card.IsRemembered | Regeneration$ True"
|
||||||
+ " | Description$ Regeneration (if creature would be destroyed, regenerate it instead)";
|
+ " | Description$ Regeneration (if creature would be destroyed, regenerate it instead)";
|
||||||
|
|
||||||
String effect = "DB$ Regeneration | Defined$ ReplacedCard";
|
String effect = "DB$ Regeneration | Defined$ ReplacedCard";
|
||||||
String exileEff = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile"
|
String exileEff = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile"
|
||||||
+ " | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0";
|
+ " | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0";
|
||||||
ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true);
|
ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true);
|
||||||
|
|
||||||
SpellAbility saReg = AbilityFactory.getAbility(effect, eff);
|
SpellAbility saReg = AbilityFactory.getAbility(effect, eff);
|
||||||
AbilitySub saExile = (AbilitySub)AbilityFactory.getAbility(exileEff, eff);
|
AbilitySub saExile = (AbilitySub)AbilityFactory.getAbility(exileEff, eff);
|
||||||
|
|
||||||
saReg.setSubAbility(saExile);
|
saReg.setSubAbility(saExile);
|
||||||
re.setOverridingAbility(saReg);
|
re.setOverridingAbility(saReg);
|
||||||
eff.addReplacementEffect(re);
|
eff.addReplacementEffect(re);
|
||||||
|
|
||||||
// add extra Remembered
|
// add extra Remembered
|
||||||
if (sa.hasParam("RememberObjects")) {
|
if (sa.hasParam("RememberObjects")) {
|
||||||
eff.addRemembered(AbilityUtils.getDefinedObjects(hostCard, sa.getParam("RememberObjects"), sa));
|
eff.addRemembered(AbilityUtils.getDefinedObjects(hostCard, sa.getParam("RememberObjects"), sa));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sa.hasParam("RegenerationTrigger")) {
|
if (sa.hasParam("RegenerationTrigger")) {
|
||||||
final String str = sa.getSVar(sa.getParam("RegenerationTrigger"));
|
final String str = sa.getSVar(sa.getParam("RegenerationTrigger"));
|
||||||
|
|
||||||
SpellAbility trigSA = AbilityFactory.getAbility(str, eff);
|
SpellAbility trigSA = AbilityFactory.getAbility(str, eff);
|
||||||
|
|
||||||
final String trigStr = "Mode$ Regenerated | ValidCause$ Effect.Self | TriggerZones$ Command "
|
final String trigStr = "Mode$ Regenerated | ValidCause$ Effect.Self | TriggerZones$ Command "
|
||||||
+ " | TriggerDescription$ " + trigSA.getDescription();
|
+ " | TriggerDescription$ " + trigSA.getDescription();
|
||||||
final Trigger trigger = TriggerHandler.parseTrigger(trigStr, eff, true);
|
final Trigger trigger = TriggerHandler.parseTrigger(trigStr, eff, true);
|
||||||
trigger.setOverridingAbility(trigSA);
|
trigger.setOverridingAbility(trigSA);
|
||||||
eff.addTrigger(trigger);
|
eff.addTrigger(trigger);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy text changes
|
// Copy text changes
|
||||||
if (sa.isIntrinsic()) {
|
if (sa.isIntrinsic()) {
|
||||||
eff.copyChangedTextFrom(hostCard);
|
eff.copyChangedTextFrom(hostCard);
|
||||||
@@ -75,7 +76,7 @@ public abstract class RegenerateBaseEffect extends SpellAbilityEffect {
|
|||||||
game.getAction().moveTo(ZoneType.Command, eff, sa, AbilityKey.newMap());
|
game.getAction().moveTo(ZoneType.Command, eff, sa, AbilityKey.newMap());
|
||||||
eff.updateStateForView();
|
eff.updateStateForView();
|
||||||
game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
|
game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
|
||||||
|
|
||||||
final GameCommand untilEOT = new GameCommand() {
|
final GameCommand untilEOT = new GameCommand() {
|
||||||
private static final long serialVersionUID = 259368227093961103L;
|
private static final long serialVersionUID = 259368227093961103L;
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import forge.game.replacement.ReplacementLayer;
|
|||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.util.CardTranslation;
|
||||||
|
|
||||||
public class SkipPhaseEffect extends SpellAbilityEffect {
|
public class SkipPhaseEffect extends SpellAbilityEffect {
|
||||||
|
|
||||||
@@ -58,7 +59,7 @@ public class SkipPhaseEffect extends SpellAbilityEffect {
|
|||||||
final String duration, final String phase, final String step) {
|
final String duration, final String phase, final String step) {
|
||||||
final Card hostCard = sa.getHostCard();
|
final Card hostCard = sa.getHostCard();
|
||||||
final Game game = hostCard.getGame();
|
final Game game = hostCard.getGame();
|
||||||
final String name = hostCard.getName() + "'s Effect";
|
final String name = CardTranslation.getTranslatedName(hostCard.getName()) + "'s Effect";
|
||||||
final String image = hostCard.getImageKey();
|
final String image = hostCard.getImageKey();
|
||||||
final boolean isNextThisTurn = duration != null && duration.equals("NextThisTurn");
|
final boolean isNextThisTurn = duration != null && duration.equals("NextThisTurn");
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import forge.game.spellability.AbilitySub;
|
|||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.util.CardTranslation;
|
||||||
import forge.util.Lang;
|
import forge.util.Lang;
|
||||||
|
|
||||||
public class SkipTurnEffect extends SpellAbilityEffect {
|
public class SkipTurnEffect extends SpellAbilityEffect {
|
||||||
@@ -38,7 +39,7 @@ public class SkipTurnEffect extends SpellAbilityEffect {
|
|||||||
public void resolve(SpellAbility sa) {
|
public void resolve(SpellAbility sa) {
|
||||||
final Card hostCard = sa.getHostCard();
|
final Card hostCard = sa.getHostCard();
|
||||||
final Game game = hostCard.getGame();
|
final Game game = hostCard.getGame();
|
||||||
final String name = hostCard.getName() + "'s Effect";
|
final String name = CardTranslation.getTranslatedName(hostCard.getName()) + "'s Effect";
|
||||||
final String image = hostCard.getImageKey();
|
final String image = hostCard.getImageKey();
|
||||||
final int numTurns = AbilityUtils.calculateAmount(hostCard, sa.getParam("NumTurns"), sa);
|
final int numTurns = AbilityUtils.calculateAmount(hostCard, sa.getParam("NumTurns"), sa);
|
||||||
String repeffstr = "Event$ BeginTurn | ActiveZones$ Command | ValidPlayer$ You " +
|
String repeffstr = "Event$ BeginTurn | ActiveZones$ Command | ValidPlayer$ You " +
|
||||||
|
|||||||
@@ -299,7 +299,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
private Map<Long, Player> goad = Maps.newTreeMap();
|
private Map<Long, Player> goad = Maps.newTreeMap();
|
||||||
|
|
||||||
private final List<GameCommand> leavePlayCommandList = Lists.newArrayList();
|
private final List<GameCommand> leavePlayCommandList = Lists.newArrayList();
|
||||||
private final List<GameCommand> etbCommandList = Lists.newArrayList();
|
|
||||||
private final List<GameCommand> untapCommandList = Lists.newArrayList();
|
private final List<GameCommand> untapCommandList = Lists.newArrayList();
|
||||||
private final List<GameCommand> changeControllerCommandList = Lists.newArrayList();
|
private final List<GameCommand> changeControllerCommandList = Lists.newArrayList();
|
||||||
private final List<GameCommand> unattachCommandList = Lists.newArrayList();
|
private final List<GameCommand> unattachCommandList = Lists.newArrayList();
|
||||||
@@ -3265,20 +3264,24 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
return canCounter;
|
return canCounter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void addComesIntoPlayCommand(final GameCommand c) {
|
|
||||||
etbCommandList.add(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void runComesIntoPlayCommands() {
|
|
||||||
for (final GameCommand c : etbCommandList) {
|
|
||||||
c.run();
|
|
||||||
}
|
|
||||||
etbCommandList.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void addLeavesPlayCommand(final GameCommand c) {
|
public final void addLeavesPlayCommand(final GameCommand c) {
|
||||||
leavePlayCommandList.add(c);
|
leavePlayCommandList.add(c);
|
||||||
}
|
}
|
||||||
|
public final void addUntapCommand(final GameCommand c) {
|
||||||
|
untapCommandList.add(c);
|
||||||
|
}
|
||||||
|
public final void addUnattachCommand(final GameCommand c) {
|
||||||
|
unattachCommandList.add(c);
|
||||||
|
}
|
||||||
|
public final void addFaceupCommand(final GameCommand c) {
|
||||||
|
faceupCommandList.add(c);
|
||||||
|
}
|
||||||
|
public final void addFacedownCommand(final GameCommand c) {
|
||||||
|
facedownCommandList.add(c);
|
||||||
|
}
|
||||||
|
public final void addChangeControllerCommand(final GameCommand c) {
|
||||||
|
changeControllerCommandList.add(c);
|
||||||
|
}
|
||||||
|
|
||||||
public final void runLeavesPlayCommands() {
|
public final void runLeavesPlayCommands() {
|
||||||
for (final GameCommand c : leavePlayCommandList) {
|
for (final GameCommand c : leavePlayCommandList) {
|
||||||
@@ -3286,22 +3289,6 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
}
|
}
|
||||||
leavePlayCommandList.clear();
|
leavePlayCommandList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void addUntapCommand(final GameCommand c) {
|
|
||||||
untapCommandList.add(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void addUnattachCommand(final GameCommand c) {
|
|
||||||
unattachCommandList.add(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void addFaceupCommand(final GameCommand c) {
|
|
||||||
faceupCommandList.add(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void addFacedownCommand(final GameCommand c) {
|
|
||||||
facedownCommandList.add(c);
|
|
||||||
}
|
|
||||||
public final void runUntapCommands() {
|
public final void runUntapCommands() {
|
||||||
for (final GameCommand c : untapCommandList) {
|
for (final GameCommand c : untapCommandList) {
|
||||||
c.run();
|
c.run();
|
||||||
@@ -3314,25 +3301,18 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
}
|
}
|
||||||
unattachCommandList.clear();
|
unattachCommandList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void runFaceupCommands() {
|
public final void runFaceupCommands() {
|
||||||
for (final GameCommand c : faceupCommandList) {
|
for (final GameCommand c : faceupCommandList) {
|
||||||
c.run();
|
c.run();
|
||||||
}
|
}
|
||||||
faceupCommandList.clear();
|
faceupCommandList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void runFacedownCommands() {
|
public final void runFacedownCommands() {
|
||||||
for (final GameCommand c : facedownCommandList) {
|
for (final GameCommand c : facedownCommandList) {
|
||||||
c.run();
|
c.run();
|
||||||
}
|
}
|
||||||
facedownCommandList.clear();
|
facedownCommandList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void addChangeControllerCommand(final GameCommand c) {
|
|
||||||
changeControllerCommandList.add(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void runChangeControllerCommands() {
|
public final void runChangeControllerCommands() {
|
||||||
for (final GameCommand c : changeControllerCommandList) {
|
for (final GameCommand c : changeControllerCommandList) {
|
||||||
c.run();
|
c.run();
|
||||||
@@ -3346,16 +3326,16 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
view.updateSickness(this);
|
view.updateSickness(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean isFirstTurnControlled() {
|
|
||||||
return sickness;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final boolean hasSickness() {
|
public final boolean hasSickness() {
|
||||||
return sickness && !hasKeyword(Keyword.HASTE);
|
return sickness && !hasKeyword(Keyword.HASTE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean isSick() {
|
public final boolean isSick() {
|
||||||
return sickness && isCreature() && !hasKeyword(Keyword.HASTE);
|
return hasSickness() && isCreature();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isFirstTurnControlled() {
|
||||||
|
return sickness;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasBecomeTargetThisTurn() {
|
public boolean hasBecomeTargetThisTurn() {
|
||||||
@@ -5070,7 +5050,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
getGame().getTriggerHandler().runTrigger(TriggerType.PhaseOut, runParams, false);
|
getGame().getTriggerHandler().runTrigger(TriggerType.PhaseOut, runParams, false);
|
||||||
// when it doesn't exist the game will no longer see it as tapped
|
// when it doesn't exist the game will no longer see it as tapped
|
||||||
runUntapCommands();
|
runUntapCommands();
|
||||||
// TODO need to run UntilHostLeavesPlay commands but only when worded "for as long as"
|
// TODO CR 702.26f need to run LeavesPlay + changeController commands but only when worded "for as long as"
|
||||||
}
|
}
|
||||||
|
|
||||||
setPhasedOut(!phasedOut);
|
setPhasedOut(!phasedOut);
|
||||||
@@ -5636,7 +5616,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
@Override
|
@Override
|
||||||
public final int addDamageAfterPrevention(final int damageIn, final Card source, final boolean isCombat, GameEntityCounterTable counterTable) {
|
public final int addDamageAfterPrevention(final int damageIn, final Card source, final boolean isCombat, GameEntityCounterTable counterTable) {
|
||||||
if (damageIn <= 0) {
|
if (damageIn <= 0) {
|
||||||
return 0; // Rule 119.8
|
return 0; // 120.8
|
||||||
}
|
}
|
||||||
|
|
||||||
// 120.1a Damage can’t be dealt to an object that’s neither a creature nor a planeswalker.
|
// 120.1a Damage can’t be dealt to an object that’s neither a creature nor a planeswalker.
|
||||||
|
|||||||
@@ -294,6 +294,8 @@ public enum CounterEnumType {
|
|||||||
P2P2("+2/+2", "+2/+2", 96, 226, 23),
|
P2P2("+2/+2", "+2/+2", 96, 226, 23),
|
||||||
|
|
||||||
QUEST("QUEST", 251, 189, 0),
|
QUEST("QUEST", 251, 189, 0),
|
||||||
|
|
||||||
|
REPRIEVE("REPR", 240, 120, 50),
|
||||||
|
|
||||||
RITUAL("RITUAL", 155, 17, 30),
|
RITUAL("RITUAL", 155, 17, 30),
|
||||||
|
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ public class PlayerProperty {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (property.equals("Defending")) {
|
} else if (property.equals("Defending")) {
|
||||||
if (!game.getCombat().getAttackersAndDefenders().values().contains(player)) {
|
if (game.getCombat() == null || !game.getCombat().getAttackersAndDefenders().values().contains(player)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (property.equals("LostLifeThisTurn")) {
|
} else if (property.equals("LostLifeThisTurn")) {
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ public class StaticAbilityNumLoyaltyAct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean applyLimitIncrease(final StaticAbility stAb, final Card card) {
|
public static boolean applyLimitIncrease(final StaticAbility stAb, final Card card) {
|
||||||
|
|
||||||
if (!stAb.matchesValidParam("ValidCard", card)) {
|
if (!stAb.matchesValidParam("ValidCard", card)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -58,7 +57,7 @@ public class StaticAbilityNumLoyaltyAct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
int more = AbilityUtils.calculateAmount(card, stAb.getParam("Additional"), stAb);
|
int more = AbilityUtils.calculateAmount(card, stAb.getParam("Additional"), stAb);
|
||||||
addl = addl + more;
|
addl += more;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -305,7 +305,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sp instanceof AbilityStatic) {
|
if (sp instanceof AbilityStatic || (sp.isTrigger() && sp.getTrigger().getOverridingAbility() instanceof AbilityStatic)) {
|
||||||
AbilityUtils.resolve(sp);
|
AbilityUtils.resolve(sp);
|
||||||
// AbilityStatic should do nothing below
|
// AbilityStatic should do nothing below
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ public class PlayerZoneBattlefield extends PlayerZone {
|
|||||||
private static final long serialVersionUID = 5750837078903423978L;
|
private static final long serialVersionUID = 5750837078903423978L;
|
||||||
|
|
||||||
private boolean trigger = true;
|
private boolean trigger = true;
|
||||||
private boolean leavesTrigger = true;
|
|
||||||
private CardCollection meldedCards = new CardCollection();
|
private CardCollection meldedCards = new CardCollection();
|
||||||
|
|
||||||
public PlayerZoneBattlefield(final ZoneType zone, final Player player) {
|
public PlayerZoneBattlefield(final ZoneType zone, final Player player) {
|
||||||
@@ -63,7 +62,6 @@ public class PlayerZoneBattlefield extends PlayerZone {
|
|||||||
|
|
||||||
if (trigger) {
|
if (trigger) {
|
||||||
c.setSickness(true); // summoning sickness
|
c.setSickness(true); // summoning sickness
|
||||||
c.runComesIntoPlayCommands();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,14 +70,13 @@ public class PlayerZoneBattlefield extends PlayerZone {
|
|||||||
public final void remove(final Card c) {
|
public final void remove(final Card c) {
|
||||||
super.remove(c);
|
super.remove(c);
|
||||||
|
|
||||||
if (leavesTrigger) {
|
if (trigger) {
|
||||||
c.runLeavesPlayCommands();
|
c.runLeavesPlayCommands();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setTriggers(final boolean b) {
|
public final void setTriggers(final boolean b) {
|
||||||
trigger = b;
|
trigger = b;
|
||||||
leavesTrigger = b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ public class Forge implements ApplicationListener {
|
|||||||
public static KeyInputAdapter keyInputAdapter;
|
public static KeyInputAdapter keyInputAdapter;
|
||||||
private static boolean exited;
|
private static boolean exited;
|
||||||
public boolean needsUpdate = false;
|
public boolean needsUpdate = false;
|
||||||
|
public static boolean advStartup = false;
|
||||||
public static boolean safeToClose = true;
|
public static boolean safeToClose = true;
|
||||||
public static boolean magnify = false;
|
public static boolean magnify = false;
|
||||||
public static boolean magnifyToggle = true;
|
public static boolean magnifyToggle = true;
|
||||||
|
|||||||
@@ -39,12 +39,9 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class AdventureDeckEditor extends TabPageScreen<AdventureDeckEditor> {
|
public class AdventureDeckEditor extends TabPageScreen<AdventureDeckEditor> {
|
||||||
public static FSkinImage MAIN_DECK_ICON = Forge.hdbuttons ? FSkinImage.HDLIBRARY :FSkinImage.DECKLIST;
|
private static final FileHandle deckIcon = Config.instance().getFile("ui/maindeck.png");
|
||||||
public static FSkinImage SIDEBOARD_ICON = Forge.hdbuttons ? FSkinImage.HDSIDEBOARD : FSkinImage.FLASHBACK;
|
private static Texture deckTexture = deckIcon.exists() ? new Texture(deckIcon) : null;
|
||||||
private static final float HEADER_HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 0.8f);
|
private static FImage MAIN_DECK_ICON = deckIcon.exists() ? new FImage() {
|
||||||
private static final FileHandle tomeIcon = Config.instance().getFile("ui/tome.png");
|
|
||||||
private static Texture tomeIconTexture = tomeIcon.exists() ? new Texture(tomeIcon) : null;
|
|
||||||
private static FImage CATALOG_ICON = tomeIcon.exists() ? new FImage() {
|
|
||||||
@Override
|
@Override
|
||||||
public float getWidth() {
|
public float getWidth() {
|
||||||
return 100f;
|
return 100f;
|
||||||
@@ -55,7 +52,40 @@ import java.util.Map;
|
|||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void draw(Graphics g, float x, float y, float w, float h) {
|
public void draw(Graphics g, float x, float y, float w, float h) {
|
||||||
g.drawImage(tomeIconTexture, x, y, w, h);
|
g.drawImage(deckTexture, x, y, w, h);
|
||||||
|
}
|
||||||
|
} : Forge.hdbuttons ? FSkinImage.HDLIBRARY :FSkinImage.DECKLIST;
|
||||||
|
private static final FileHandle sideIcon = Config.instance().getFile("ui/sideboard.png");
|
||||||
|
private static Texture sideTexture = sideIcon.exists() ? new Texture(sideIcon) : null;
|
||||||
|
private static FImage SIDEBOARD_ICON = sideIcon.exists() ? new FImage() {
|
||||||
|
@Override
|
||||||
|
public float getWidth() {
|
||||||
|
return 100f;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public float getHeight() {
|
||||||
|
return 100f;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void draw(Graphics g, float x, float y, float w, float h) {
|
||||||
|
g.drawImage(sideTexture, x, y, w, h);
|
||||||
|
}
|
||||||
|
} : Forge.hdbuttons ? FSkinImage.HDSIDEBOARD : FSkinImage.FLASHBACK;
|
||||||
|
private static final float HEADER_HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 0.8f);
|
||||||
|
private static final FileHandle binderIcon = Config.instance().getFile("ui/binder.png");
|
||||||
|
private static Texture binderTexture = binderIcon.exists() ? new Texture(binderIcon) : null;
|
||||||
|
private static FImage CATALOG_ICON = binderIcon.exists() ? new FImage() {
|
||||||
|
@Override
|
||||||
|
public float getWidth() {
|
||||||
|
return 100f;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public float getHeight() {
|
||||||
|
return 100f;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void draw(Graphics g, float x, float y, float w, float h) {
|
||||||
|
g.drawImage(binderTexture, x, y, w, h);
|
||||||
}
|
}
|
||||||
} : FSkinImage.QUEST_BOX;
|
} : FSkinImage.QUEST_BOX;
|
||||||
private static final FileHandle sellIcon = Config.instance().getFile("ui/sell.png");
|
private static final FileHandle sellIcon = Config.instance().getFile("ui/sell.png");
|
||||||
|
|||||||
@@ -8,16 +8,13 @@ import forge.Graphics;
|
|||||||
import forge.LobbyPlayer;
|
import forge.LobbyPlayer;
|
||||||
import forge.adventure.character.EnemySprite;
|
import forge.adventure.character.EnemySprite;
|
||||||
import forge.adventure.character.PlayerSprite;
|
import forge.adventure.character.PlayerSprite;
|
||||||
import forge.adventure.data.BiomeData;
|
|
||||||
import forge.adventure.data.EffectData;
|
import forge.adventure.data.EffectData;
|
||||||
import forge.adventure.data.EnemyData;
|
import forge.adventure.data.EnemyData;
|
||||||
import forge.adventure.data.ItemData;
|
import forge.adventure.data.ItemData;
|
||||||
import forge.adventure.player.AdventurePlayer;
|
import forge.adventure.player.AdventurePlayer;
|
||||||
import forge.adventure.stage.IAfterMatch;
|
import forge.adventure.stage.IAfterMatch;
|
||||||
import forge.adventure.stage.MapStage;
|
|
||||||
import forge.adventure.util.Config;
|
import forge.adventure.util.Config;
|
||||||
import forge.adventure.util.Current;
|
import forge.adventure.util.Current;
|
||||||
import forge.adventure.world.World;
|
|
||||||
import forge.assets.FBufferedImage;
|
import forge.assets.FBufferedImage;
|
||||||
import forge.assets.FSkin;
|
import forge.assets.FSkin;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
@@ -343,23 +340,6 @@ public class DuelScene extends ForgeScene {
|
|||||||
this.AIExtras.clear();
|
this.AIExtras.clear();
|
||||||
this.playerExtras.clear();
|
this.playerExtras.clear();
|
||||||
}
|
}
|
||||||
public String getCurrentLocation() {
|
|
||||||
String location = "";
|
|
||||||
if(MapStage.getInstance().isInMap())
|
|
||||||
location = TileMapScene.instance().rootPoint.getData().type;
|
|
||||||
else {
|
|
||||||
World world= Current.world();
|
|
||||||
int currentBiome = World.highestBiome(world.getBiome((int) player.getX() / world.getTileSize(), (int) player.getY() / world.getTileSize()));
|
|
||||||
List<BiomeData> biomeData = Current.world().getData().GetBiomes();
|
|
||||||
try {
|
|
||||||
BiomeData data = biomeData.get(currentBiome);
|
|
||||||
location = data.name;
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return location;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String selectAI(String ai) { //Decide opponent AI.
|
private String selectAI(String ai) { //Decide opponent AI.
|
||||||
String AI = ""; //Use user settings if it's null.
|
String AI = ""; //Use user settings if it's null.
|
||||||
|
|||||||
@@ -3,8 +3,15 @@ package forge.adventure.scene;
|
|||||||
import com.badlogic.gdx.Gdx;
|
import com.badlogic.gdx.Gdx;
|
||||||
import com.badlogic.gdx.graphics.GL20;
|
import com.badlogic.gdx.graphics.GL20;
|
||||||
import forge.Forge;
|
import forge.Forge;
|
||||||
|
import forge.adventure.character.PlayerSprite;
|
||||||
|
import forge.adventure.data.BiomeData;
|
||||||
import forge.adventure.stage.MapStage;
|
import forge.adventure.stage.MapStage;
|
||||||
import forge.adventure.stage.WorldStage;
|
import forge.adventure.stage.WorldStage;
|
||||||
|
import forge.adventure.util.Current;
|
||||||
|
import forge.adventure.world.World;
|
||||||
|
import forge.util.TextUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Game scene main over world scene
|
* Game scene main over world scene
|
||||||
@@ -51,6 +58,24 @@ public class GameScene extends HudScene {
|
|||||||
super.enter();
|
super.enter();
|
||||||
WorldStage.getInstance().handlePointsOfInterestCollision();
|
WorldStage.getInstance().handlePointsOfInterestCollision();
|
||||||
}
|
}
|
||||||
|
public String getAdventurePlayerLocation(boolean forHeader) {
|
||||||
|
String location = "";
|
||||||
|
if(MapStage.getInstance().isInMap()) {
|
||||||
|
location = forHeader? TileMapScene.instance().rootPoint.getData().name : TileMapScene.instance().rootPoint.getData().type;
|
||||||
|
} else {
|
||||||
|
World world= Current.world();
|
||||||
|
PlayerSprite player = WorldStage.getInstance().getPlayerSprite();
|
||||||
|
int currentBiome = World.highestBiome(world.getBiome((int) player.getX() / world.getTileSize(), (int) player.getY() / world.getTileSize()));
|
||||||
|
List<BiomeData> biomeData = Current.world().getData().GetBiomes();
|
||||||
|
try {
|
||||||
|
BiomeData data = biomeData.get(currentBiome);
|
||||||
|
location = forHeader? TextUtil.capitalize(data.name)+" Map" : data.name;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
location = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return location;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import forge.adventure.util.Current;
|
|||||||
import forge.adventure.world.WorldSave;
|
import forge.adventure.world.WorldSave;
|
||||||
import forge.adventure.world.WorldSaveHeader;
|
import forge.adventure.world.WorldSaveHeader;
|
||||||
import forge.screens.TransitionScreen;
|
import forge.screens.TransitionScreen;
|
||||||
|
import forge.util.TextUtil;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
@@ -42,7 +43,7 @@ public class SaveLoadScene extends UIScene {
|
|||||||
TextraLabel header;
|
TextraLabel header;
|
||||||
int currentSlot = 0, lastSelectedSlot = 0;
|
int currentSlot = 0, lastSelectedSlot = 0;
|
||||||
Image previewImage;
|
Image previewImage;
|
||||||
TextraLabel previewDate;
|
TextraLabel previewDate, playerLocation;
|
||||||
Image previewBorder;
|
Image previewBorder;
|
||||||
TextraButton saveLoadButton, back;
|
TextraButton saveLoadButton, back;
|
||||||
Selectable<TextraButton> quickSave;
|
Selectable<TextraButton> quickSave;
|
||||||
@@ -50,6 +51,7 @@ public class SaveLoadScene extends UIScene {
|
|||||||
Actor lastHighlightedSave;
|
Actor lastHighlightedSave;
|
||||||
SelectBox difficulty;
|
SelectBox difficulty;
|
||||||
ScrollPane scrollPane;
|
ScrollPane scrollPane;
|
||||||
|
char ASCII_179 = '│';
|
||||||
|
|
||||||
private SaveLoadScene() {
|
private SaveLoadScene() {
|
||||||
super(Forge.isLandscapeMode() ? "ui/save_load.json" : "ui/save_load_portrait.json");
|
super(Forge.isLandscapeMode() ? "ui/save_load.json" : "ui/save_load_portrait.json");
|
||||||
@@ -68,9 +70,13 @@ public class SaveLoadScene extends UIScene {
|
|||||||
//DifficultyData difficulty1 = Config.instance().getConfigData().difficulties[difficulty.getSelectedIndex()];
|
//DifficultyData difficulty1 = Config.instance().getConfigData().difficulties[difficulty.getSelectedIndex()];
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
|
|
||||||
previewImage = ui.findActor("preview");
|
previewImage = ui.findActor("preview");
|
||||||
previewDate = ui.findActor("saveDate");
|
previewDate = ui.findActor("saveDate");
|
||||||
|
playerLocation = Controls.newTextraLabel("");
|
||||||
|
playerLocation.setText("");
|
||||||
|
playerLocation.setX(previewImage.getX());
|
||||||
|
playerLocation.setY(previewImage.getY()+5);
|
||||||
|
ui.addActor(playerLocation);
|
||||||
header = Controls.newTextraLabel(Forge.getLocalizer().getMessage("lblSave"));
|
header = Controls.newTextraLabel(Forge.getLocalizer().getMessage("lblSave"));
|
||||||
header.setAlignment(Align.center);
|
header.setAlignment(Align.center);
|
||||||
layout.add(header).pad(2).colspan(4).align(Align.center).expandX();
|
layout.add(header).pad(2).colspan(4).align(Align.center).expandX();
|
||||||
@@ -169,9 +175,19 @@ public class SaveLoadScene extends UIScene {
|
|||||||
previewImage.setVisible(true);
|
previewImage.setVisible(true);
|
||||||
previewDate.setVisible(true);
|
previewDate.setVisible(true);
|
||||||
if (header.saveDate != null)
|
if (header.saveDate != null)
|
||||||
previewDate.setText(DateFormat.getDateInstance().format(header.saveDate) + "\n" + DateFormat.getTimeInstance(DateFormat.SHORT).format(header.saveDate));
|
previewDate.setText("{Scale=98%}"+DateFormat.getDateInstance().format(header.saveDate) + " " + DateFormat.getTimeInstance(DateFormat.SHORT).format(header.saveDate));
|
||||||
else
|
else
|
||||||
previewDate.setText("");
|
previewDate.setText("");
|
||||||
|
if (header.name.contains(Character.toString(ASCII_179))) {
|
||||||
|
String[] split = TextUtil.split(header.name, ASCII_179);
|
||||||
|
try {
|
||||||
|
playerLocation.setText(split[1]);
|
||||||
|
} catch (Exception e) {
|
||||||
|
playerLocation.setText("");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
playerLocation.setText("");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (previewImage != null)
|
if (previewImage != null)
|
||||||
@@ -239,7 +255,7 @@ public class SaveLoadScene extends UIScene {
|
|||||||
|
|
||||||
|
|
||||||
public void save() {
|
public void save() {
|
||||||
if (WorldSave.getCurrentSave().save(textInput.getText(), currentSlot)) {
|
if (WorldSave.getCurrentSave().save(textInput.getText()+ASCII_179+GameScene.instance().getAdventurePlayerLocation(true), currentSlot)) {
|
||||||
updateFiles();
|
updateFiles();
|
||||||
//ensure the dialog is hidden before switching
|
//ensure the dialog is hidden before switching
|
||||||
|
|
||||||
@@ -275,7 +291,13 @@ public class SaveLoadScene extends UIScene {
|
|||||||
|
|
||||||
int slot = WorldSave.filenameToSlot(name.getName());
|
int slot = WorldSave.filenameToSlot(name.getName());
|
||||||
WorldSaveHeader header = (WorldSaveHeader) oos.readObject();
|
WorldSaveHeader header = (WorldSaveHeader) oos.readObject();
|
||||||
buttons.get(slot).actor.setText(header.name);
|
if (header.name.contains(Character.toString(ASCII_179))) {
|
||||||
|
String[] split = TextUtil.split(header.name, ASCII_179);
|
||||||
|
buttons.get(slot).actor.setText(split[0]);
|
||||||
|
//playerLocation.setText(split[1]);
|
||||||
|
} else {
|
||||||
|
buttons.get(slot).actor.setText(header.name);
|
||||||
|
}
|
||||||
previews.put(slot, header);
|
previews.put(slot, header);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -111,12 +111,12 @@ public class GameHUD extends Stage {
|
|||||||
lifePoints = ui.findActor("lifePoints");
|
lifePoints = ui.findActor("lifePoints");
|
||||||
mana = ui.findActor("mana");
|
mana = ui.findActor("mana");
|
||||||
money = ui.findActor("money");
|
money = ui.findActor("money");
|
||||||
mana.setText("0/0");
|
mana.setText("{Scale=80%}0/0");
|
||||||
lifePoints.setText("20/20");
|
lifePoints.setText("{Scale=80%}20/20");
|
||||||
AdventurePlayer.current().onLifeChange(() -> lifePoints.setText(AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife()));
|
AdventurePlayer.current().onLifeChange(() -> lifePoints.setText("{Scale=80%}"+AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife()));
|
||||||
AdventurePlayer.current().onManaChange(() -> mana.setText(AdventurePlayer.current().getMana() + "/" + AdventurePlayer.current().getMaxMana()));
|
AdventurePlayer.current().onManaChange(() -> mana.setText("{Scale=80%}"+AdventurePlayer.current().getMana() + "/" + AdventurePlayer.current().getMaxMana()));
|
||||||
|
|
||||||
WorldSave.getCurrentSave().getPlayer().onGoldChange(() -> money.setText(String.valueOf(AdventurePlayer.current().getGold())));
|
WorldSave.getCurrentSave().getPlayer().onGoldChange(() -> money.setText("{Scale=80%}"+String.valueOf(AdventurePlayer.current().getGold())));
|
||||||
addActor(ui);
|
addActor(ui);
|
||||||
addActor(miniMapPlayer);
|
addActor(miniMapPlayer);
|
||||||
console = new Console();
|
console = new Console();
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package forge.itemmanager;
|
|||||||
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import forge.Forge;
|
|
||||||
import forge.Graphics;
|
import forge.Graphics;
|
||||||
import forge.assets.FSkinColor;
|
import forge.assets.FSkinColor;
|
||||||
import forge.assets.FSkinFont;
|
import forge.assets.FSkinFont;
|
||||||
@@ -49,8 +48,7 @@ public class CardManager extends ItemManager<PaperCard> {
|
|||||||
|
|
||||||
public static void addDefaultFilters(final ItemManager<? super PaperCard> itemManager) {
|
public static void addDefaultFilters(final ItemManager<? super PaperCard> itemManager) {
|
||||||
itemManager.addFilter(new CardColorFilter(itemManager));
|
itemManager.addFilter(new CardColorFilter(itemManager));
|
||||||
if (!Forge.isMobileAdventureMode)
|
itemManager.addFilter(new CardFormatFilter(itemManager));
|
||||||
itemManager.addFilter(new CardFormatFilter(itemManager));
|
|
||||||
itemManager.addFilter(new CardTypeFilter(itemManager));
|
itemManager.addFilter(new CardTypeFilter(itemManager));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ public abstract class FormatFilter<T extends InventoryItem> extends ItemFilter<T
|
|||||||
}
|
}
|
||||||
cbxFormats.addItem(Forge.getLocalizer().getMessage("lblOtherFormats"));
|
cbxFormats.addItem(Forge.getLocalizer().getMessage("lblOtherFormats"));
|
||||||
cbxFormats.addItem(Forge.getLocalizer().getMessage("lblChooseSets"));
|
cbxFormats.addItem(Forge.getLocalizer().getMessage("lblChooseSets"));
|
||||||
|
cbxFormats.setEnabled(!Forge.isMobileAdventureMode);
|
||||||
selectedFormat = cbxFormats.getText();
|
selectedFormat = cbxFormats.getText();
|
||||||
|
|
||||||
cbxFormats.setChangedHandler(new FEventHandler() {
|
cbxFormats.setChangedHandler(new FEventHandler() {
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
package forge.screens;
|
package forge.screens;
|
||||||
|
import static forge.assets.FSkin.getDefaultSkinFile;
|
||||||
|
import static forge.assets.FSkin.getSkinFile;
|
||||||
|
import com.badlogic.gdx.files.FileHandle;
|
||||||
import com.badlogic.gdx.graphics.Color;
|
import com.badlogic.gdx.graphics.Color;
|
||||||
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
import forge.Forge;
|
import forge.Forge;
|
||||||
import forge.Graphics;
|
import forge.Graphics;
|
||||||
import forge.animation.ForgeAnimation;
|
import forge.animation.ForgeAnimation;
|
||||||
@@ -16,6 +19,9 @@ public class ClosingScreen extends FContainer {
|
|||||||
private StaticAnimation staticAnimation;
|
private StaticAnimation staticAnimation;
|
||||||
private boolean restart = false;
|
private boolean restart = false;
|
||||||
private boolean drawStatic = false;
|
private boolean drawStatic = false;
|
||||||
|
private FileHandle adv_logo = getSkinFile("adv_logo.png");
|
||||||
|
private FileHandle existingLogo = adv_logo.exists() ? adv_logo : getDefaultSkinFile("adv_logo.png");
|
||||||
|
private Texture logo = existingLogo.exists() && Forge.advStartup ? new Texture(existingLogo) : FSkin.getLogo();
|
||||||
|
|
||||||
public ClosingScreen(boolean restart0) {
|
public ClosingScreen(boolean restart0) {
|
||||||
bgAnimation = new BGAnimation();
|
bgAnimation = new BGAnimation();
|
||||||
@@ -48,13 +54,14 @@ public class ClosingScreen extends FContainer {
|
|||||||
}
|
}
|
||||||
g.fillRect(Color.BLACK, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
|
g.fillRect(Color.BLACK, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
|
||||||
g.setAlphaComposite(1-percentage);
|
g.setAlphaComposite(1-percentage);
|
||||||
g.drawImage(Forge.isMobileAdventureMode ? FSkinTexture.ADV_BG_TEXTURE : FSkinTexture.BG_TEXTURE, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
|
g.drawImage(Forge.isMobileAdventureMode || Forge.advStartup ? FSkinTexture.ADV_BG_TEXTURE : FSkinTexture.BG_TEXTURE, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
|
||||||
g.setAlphaComposite(oldAlpha);
|
g.setAlphaComposite(oldAlpha);
|
||||||
float xmod = Forge.getScreenHeight() > 2000 ? 1.5f : 1f;
|
float xmod = Forge.getScreenHeight() > 2000 ? 1.5f : 1f;
|
||||||
if (FSkin.getLogo() != null) {
|
|
||||||
g.drawImage(FSkin.getLogo(), Forge.getScreenWidth()/2 - (FSkin.getLogo().getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (FSkin.getLogo().getHeight()*xmod)/2, FSkin.getLogo().getWidth()*xmod, FSkin.getLogo().getHeight()*xmod);
|
if (logo != null) {
|
||||||
|
g.drawImage(logo, Forge.getScreenWidth()/2 - (logo.getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (logo.getHeight()*xmod)/2, logo.getWidth()*xmod, logo.getHeight()*xmod);
|
||||||
} else {
|
} else {
|
||||||
g.drawImage(FSkinImage.LOGO,Forge.getScreenWidth()/2 - (FSkinImage.LOGO.getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (FSkinImage.LOGO.getHeight()*xmod)/1.5f, FSkinImage.LOGO.getWidth()*xmod, FSkinImage.LOGO.getHeight()*xmod);
|
g.drawImage(FSkinImage.LOGO, Forge.getScreenWidth()/2 - (FSkinImage.LOGO.getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (FSkinImage.LOGO.getHeight()*xmod)/1.5f, FSkinImage.LOGO.getWidth()*xmod, FSkinImage.LOGO.getHeight()*xmod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,12 +94,12 @@ public class ClosingScreen extends FContainer {
|
|||||||
}
|
}
|
||||||
g.fillRect(Color.BLACK, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
|
g.fillRect(Color.BLACK, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
|
||||||
g.setAlphaComposite(percentage);
|
g.setAlphaComposite(percentage);
|
||||||
g.drawImage(Forge.isMobileAdventureMode ? FSkinTexture.ADV_BG_TEXTURE : FSkinTexture.BG_TEXTURE, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
|
g.drawImage(Forge.isMobileAdventureMode || Forge.advStartup ? FSkinTexture.ADV_BG_TEXTURE : FSkinTexture.BG_TEXTURE, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
|
||||||
g.setAlphaComposite(oldAlpha);
|
g.setAlphaComposite(oldAlpha);
|
||||||
float xmod = Forge.getScreenHeight() > 2000 ? 1.5f : 1f;
|
float xmod = Forge.getScreenHeight() > 2000 ? 1.5f : 1f;
|
||||||
xmod *= 21-(20*percentage);
|
xmod *= 21-(20*percentage);
|
||||||
if (FSkin.getLogo() != null) {
|
if (logo != null) {
|
||||||
g.drawImage(FSkin.getLogo(), Forge.getScreenWidth()/2 - (FSkin.getLogo().getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (FSkin.getLogo().getHeight()*xmod)/2, FSkin.getLogo().getWidth()*xmod, FSkin.getLogo().getHeight()*xmod);
|
g.drawImage(logo, Forge.getScreenWidth()/2 - (logo.getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (logo.getHeight()*xmod)/2, logo.getWidth()*xmod, logo.getHeight()*xmod);
|
||||||
} else {
|
} else {
|
||||||
g.drawImage(FSkinImage.LOGO,Forge.getScreenWidth()/2 - (FSkinImage.LOGO.getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (FSkinImage.LOGO.getHeight()*xmod)/1.5f, FSkinImage.LOGO.getWidth()*xmod, FSkinImage.LOGO.getHeight()*xmod);
|
g.drawImage(FSkinImage.LOGO,Forge.getScreenWidth()/2 - (FSkinImage.LOGO.getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (FSkinImage.LOGO.getHeight()*xmod)/1.5f, FSkinImage.LOGO.getWidth()*xmod, FSkinImage.LOGO.getHeight()*xmod);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public class TransitionScreen extends FContainer {
|
|||||||
Runnable runnable;
|
Runnable runnable;
|
||||||
TextureRegion textureRegion;
|
TextureRegion textureRegion;
|
||||||
private String message = "";
|
private String message = "";
|
||||||
boolean matchTransition, isloading, isIntro, isFadeMusic, advStartup;
|
boolean matchTransition, isloading, isIntro, isFadeMusic;
|
||||||
|
|
||||||
public TransitionScreen(Runnable proc, TextureRegion screen, boolean enterMatch, boolean loading) {
|
public TransitionScreen(Runnable proc, TextureRegion screen, boolean enterMatch, boolean loading) {
|
||||||
this(proc, screen, enterMatch, loading, false, false);
|
this(proc, screen, enterMatch, loading, false, false);
|
||||||
@@ -43,7 +43,7 @@ public class TransitionScreen extends FContainer {
|
|||||||
isIntro = intro;
|
isIntro = intro;
|
||||||
isFadeMusic = fadeMusic;
|
isFadeMusic = fadeMusic;
|
||||||
message = loadingMessage;
|
message = loadingMessage;
|
||||||
advStartup = Forge.selector.equals("Adventure");
|
Forge.advStartup = Forge.selector.equals("Adventure");
|
||||||
}
|
}
|
||||||
|
|
||||||
public FProgressBar getProgressBar() {
|
public FProgressBar getProgressBar() {
|
||||||
@@ -111,7 +111,7 @@ public class TransitionScreen extends FContainer {
|
|||||||
g.drawWarpImage(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), percentage);
|
g.drawWarpImage(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), percentage);
|
||||||
} else if (isIntro) {
|
} else if (isIntro) {
|
||||||
if (textureRegion != null) {
|
if (textureRegion != null) {
|
||||||
if (advStartup) {
|
if (Forge.advStartup) {
|
||||||
g.drawGrayTransitionImage(Forge.getAssets().fallback_skins().get(0), 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), false, percentage);
|
g.drawGrayTransitionImage(Forge.getAssets().fallback_skins().get(0), 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), false, percentage);
|
||||||
g.setAlphaComposite(1-percentage);
|
g.setAlphaComposite(1-percentage);
|
||||||
g.drawImage(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
|
g.drawImage(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import java.util.*;
|
|||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import com.badlogic.gdx.math.Vector2;
|
import com.badlogic.gdx.math.Vector2;
|
||||||
import forge.adventure.scene.DuelScene;
|
import forge.adventure.scene.GameScene;
|
||||||
import forge.animation.ForgeAnimation;
|
import forge.animation.ForgeAnimation;
|
||||||
import forge.assets.FImage;
|
import forge.assets.FImage;
|
||||||
import forge.card.CardImageRenderer;
|
import forge.card.CardImageRenderer;
|
||||||
@@ -807,7 +807,7 @@ public class MatchScreen extends FScreen {
|
|||||||
FSkinTexture getBG() {
|
FSkinTexture getBG() {
|
||||||
if (Forge.isMobileAdventureMode) {
|
if (Forge.isMobileAdventureMode) {
|
||||||
//System.out.println("Adventure Location: "+DuelScene.instance().getCurrentLocation());
|
//System.out.println("Adventure Location: "+DuelScene.instance().getCurrentLocation());
|
||||||
switch(DuelScene.instance().getCurrentLocation()) {
|
switch(GameScene.instance().getAdventurePlayerLocation(false)) {
|
||||||
case "green":
|
case "green":
|
||||||
return FSkinTexture.ADV_BG_FOREST;
|
return FSkinTexture.ADV_BG_FOREST;
|
||||||
case "black":
|
case "black":
|
||||||
|
|||||||
BIN
forge-gui/res/adventure/Shandalar/ui/binder.png
Normal file
BIN
forge-gui/res/adventure/Shandalar/ui/binder.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
BIN
forge-gui/res/adventure/Shandalar/ui/maindeck.png
Normal file
BIN
forge-gui/res/adventure/Shandalar/ui/maindeck.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
@@ -36,8 +36,8 @@
|
|||||||
{
|
{
|
||||||
"type": "Label",
|
"type": "Label",
|
||||||
"name": "saveDate",
|
"name": "saveDate",
|
||||||
"x": 390,
|
"x": 370,
|
||||||
"y": 125,
|
"y": 24,
|
||||||
"width": 86,
|
"width": 86,
|
||||||
"height": 32
|
"height": 32
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -36,8 +36,8 @@
|
|||||||
{
|
{
|
||||||
"type": "Label",
|
"type": "Label",
|
||||||
"name": "saveDate",
|
"name": "saveDate",
|
||||||
"x": 70,
|
"x": 170,
|
||||||
"y": 40,
|
"y": 8,
|
||||||
"width": 96,
|
"width": 96,
|
||||||
"height": 16
|
"height": 16
|
||||||
},
|
},
|
||||||
|
|||||||
BIN
forge-gui/res/adventure/Shandalar/ui/sideboard.png
Normal file
BIN
forge-gui/res/adventure/Shandalar/ui/sideboard.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
@@ -2,9 +2,9 @@ Name:Academy Loremaster
|
|||||||
ManaCost:U U
|
ManaCost:U U
|
||||||
Types:Creature Human Wizard
|
Types:Creature Human Wizard
|
||||||
PT:2/3
|
PT:2/3
|
||||||
T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | OptionalDecider$ TriggeredPlayer | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, that player may draw an additional card. If they do, spells they cast this turn cost {2} more to cast
|
T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | OptionalDecider$ TriggeredPlayer | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, that player may draw an additional card. If they do, spells they cast this turn cost {2} more to cast.
|
||||||
SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ TriggeredPlayer | RememberDrawn$ True | SubAbility$ DBEffect
|
SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ TriggeredPlayer | RememberDrawn$ True | SubAbility$ DBEffect
|
||||||
SVar:DBEffect:DB$ Effect | ConditionDefined$ Remembered | ConditionPresent$ Card | Duration$ EndOfTurn | StaticAbilities$ RaiseCost | SubAbility$ DBCleanup | SpellDescription$ Spells they cast this turn cost {2} more to cast
|
SVar:DBEffect:DB$ Effect | ConditionDefined$ Remembered | ConditionPresent$ Card | Duration$ EndOfTurn | StaticAbilities$ RaiseCost | SubAbility$ DBCleanup
|
||||||
SVar:RaiseCost:Mode$ RaiseCost | ValidCard$ Card.ActivePlayerCtrl | Type$ Spell | Amount$ 2 | Description$ Spells they cast this turn cost {2} more to cast
|
SVar:RaiseCost:Mode$ RaiseCost | ValidCard$ Card.ActivePlayerCtrl | Type$ Spell | Amount$ 2 | Description$ Spells they cast this turn cost {2} more to cast.
|
||||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
Oracle:At the beginning of each player's draw step, that player may draw an additional card. If they do, spells they cast this turn cost {2} more to cast
|
Oracle:At the beginning of each player's draw step, that player may draw an additional card. If they do, spells they cast this turn cost {2} more to cast.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Name:Awakening
|
|||||||
ManaCost:2 G G
|
ManaCost:2 G G
|
||||||
Types:Enchantment
|
Types:Enchantment
|
||||||
T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigUntapAll | TriggerDescription$ At the beginning of each upkeep, untap all creatures and lands.
|
T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigUntapAll | TriggerDescription$ At the beginning of each upkeep, untap all creatures and lands.
|
||||||
SVar:TrigUntapAll:DB$ UntapAll | ValidCards$ Creature,Land | SpellDescription$ untap all creatures and lands.
|
SVar:TrigUntapAll:DB$ UntapAll | ValidCards$ Creature,Land
|
||||||
SVar:UntapsEachTurn:Creature,Land
|
SVar:UntapsEachTurn:Creature,Land
|
||||||
AI:RemoveDeck:Random
|
AI:RemoveDeck:Random
|
||||||
Oracle:At the beginning of each upkeep, untap all creatures and lands.
|
Oracle:At the beginning of each upkeep, untap all creatures and lands.
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ PT:2/2
|
|||||||
K:Trample
|
K:Trample
|
||||||
K:Haste
|
K:Haste
|
||||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME deals damage to a player, that player discards all the cards in their hand, then draws that many cards.
|
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME deals damage to a player, that player discards all the cards in their hand, then draws that many cards.
|
||||||
SVar:TrigDiscard:DB$ Discard | Defined$ TriggeredTarget | Mode$ Hand | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ Discard hand
|
SVar:TrigDiscard:DB$ Discard | Defined$ TriggeredTarget | Mode$ Hand | RememberDiscarded$ True | SubAbility$ DBDraw
|
||||||
SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ TriggeredTarget | SubAbility$ DBCleanup | SpellDescription$ Draw that many cards
|
SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ TriggeredTarget | SubAbility$ DBCleanup
|
||||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
SVar:X:Remembered$Amount
|
SVar:X:Remembered$Amount
|
||||||
Oracle:Trample, haste\nWhenever Barbed Shocker deals damage to a player, that player discards all the cards in their hand, then draws that many cards.
|
Oracle:Trample, haste\nWhenever Barbed Shocker deals damage to a player, that player discards all the cards in their hand, then draws that many cards.
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ Name:Bartered Cow
|
|||||||
ManaCost:3 W
|
ManaCost:3 W
|
||||||
Types:Creature Ox
|
Types:Creature Ox
|
||||||
PT:3/3
|
PT:3/3
|
||||||
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | TriggerController$ TriggeredCardController | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies or blocks you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")
|
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | TriggerController$ TriggeredCardController | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies or when you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")
|
||||||
T:Mode$ Discarded | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies or blocks you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")
|
T:Mode$ Discarded | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies or when you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")
|
||||||
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You
|
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You
|
||||||
SVar:SacMe:1
|
SVar:SacMe:1
|
||||||
SVar:DiscardMe:3
|
SVar:DiscardMe:3
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ManaCost:6 U
|
|||||||
Types:Creature Elemental
|
Types:Creature Elemental
|
||||||
PT:5/5
|
PT:5/5
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 blue Merfolk Wizard creature tokens.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 blue Merfolk Wizard creature tokens.
|
||||||
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ u_1_1_merfolk_wizard | TokenOwner$ You | SpellDescription$ Create two 1/1 blue Merfolk Wizard creature tokens.
|
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ u_1_1_merfolk_wizard | TokenOwner$ You
|
||||||
A:AB$ Untap | Cost$ tapXType<2/Merfolk> | SubAbility$ GainShroud | SpellDescription$ Untap CARDNAME.
|
A:AB$ Untap | Cost$ tapXType<2/Merfolk> | SubAbility$ GainShroud | SpellDescription$ Untap CARDNAME.
|
||||||
SVar:GainShroud:DB$ Pump | Defined$ Self | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn.
|
SVar:GainShroud:DB$ Pump | Defined$ Self | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn.
|
||||||
Oracle:When Benthicore enters the battlefield, create two 1/1 blue Merfolk Wizard creature tokens.\nTap two untapped Merfolk you control: Untap Benthicore. It gains shroud until end of turn. (It can't be the target of spells or abilities.)
|
Oracle:When Benthicore enters the battlefield, create two 1/1 blue Merfolk Wizard creature tokens.\nTap two untapped Merfolk you control: Untap Benthicore. It gains shroud until end of turn. (It can't be the target of spells or abilities.)
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ Types:Legendary Creature Cyclops
|
|||||||
PT:7/6
|
PT:7/6
|
||||||
K:Trample
|
K:Trample
|
||||||
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDig | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard.
|
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDig | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard.
|
||||||
SVar:TrigDig:DB$ Dig | DigNum$ 3 | Defined$ You | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | DestinationZone2$ Graveyard | SpellDescription$ Reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard.
|
SVar:TrigDig:DB$ Dig | DigNum$ 3 | Defined$ You | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | DestinationZone2$ Graveyard
|
||||||
A:AB$ DealDamage | Cost$ Discard<1/Land> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target.
|
A:AB$ DealDamage | Cost$ Discard<1/Land> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target.
|
||||||
Oracle:Trample\nWhenever Borborygmos Enraged deals combat damage to a player, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard.\nDiscard a land card: Borborygmos Enraged deals 3 damage to any target.
|
Oracle:Trample\nWhenever Borborygmos Enraged deals combat damage to a player, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard.\nDiscard a land card: Borborygmos Enraged deals 3 damage to any target.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Types:Creature Human Pirate
|
|||||||
PT:2/2
|
PT:2/2
|
||||||
K:Flash
|
K:Flash
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, each token that would be created under an opponent's control this turn is created under your control instead.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, each token that would be created under an opponent's control this turn is created under your control instead.
|
||||||
SVar:TrigEffect:DB$ Effect | Name$ Crafty Cutpurse Effect | ReplacementEffects$ OppCreatEnters | SpellDescription$ Each token that would be created under an opponent's control this turn is created under your control instead.
|
SVar:TrigEffect:DB$ Effect | Name$ Crafty Cutpurse Effect | ReplacementEffects$ OppCreatEnters
|
||||||
SVar:OppCreatEnters:Event$ CreateToken | ActiveZones$ Command | ValidToken$ Card.OppCtrl | ReplaceWith$ ETBYourCtrl | Layer$ Control | Description$ Each token that would be created under an opponent's control this turn is created under your control instead.
|
SVar:OppCreatEnters:Event$ CreateToken | ActiveZones$ Command | ValidToken$ Card.OppCtrl | ReplaceWith$ ETBYourCtrl | Layer$ Control | Description$ Each token that would be created under an opponent's control this turn is created under your control instead.
|
||||||
SVar:ETBYourCtrl:DB$ ReplaceToken | Type$ ReplaceController | ValidCard$ Card.OppCtrl | NewController$ You
|
SVar:ETBYourCtrl:DB$ ReplaceToken | Type$ ReplaceController | ValidCard$ Card.OppCtrl | NewController$ You
|
||||||
Oracle:Flash\nWhen Crafty Cutpurse enters the battlefield, each token that would be created under an opponent's control this turn is created under your control instead.
|
Oracle:Flash\nWhen Crafty Cutpurse enters the battlefield, each token that would be created under an opponent's control this turn is created under your control instead.
|
||||||
|
|||||||
@@ -4,5 +4,6 @@ Types:Creature Zombie Beast
|
|||||||
PT:3/3
|
PT:3/3
|
||||||
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature dies, you may put a +1/+1 counter on CARDNAME.
|
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature dies, you may put a +1/+1 counter on CARDNAME.
|
||||||
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
|
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
|
||||||
A:AB$ DealDamage | Cost$ SubCounter<1/P1P1> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target.
|
A:AB$ DealDamage | Cost$ SubCounter<1/P1P1> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ It deals 1 damage to any target.
|
||||||
|
DeckHas:Ability$Counters
|
||||||
Oracle:Whenever another creature dies, you may put a +1/+1 counter on Deathbringer Thoctar.\nRemove a +1/+1 counter from Deathbringer Thoctar: It deals 1 damage to any target.
|
Oracle:Whenever another creature dies, you may put a +1/+1 counter on Deathbringer Thoctar.\nRemove a +1/+1 counter from Deathbringer Thoctar: It deals 1 damage to any target.
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ Name:Debt of Loyalty
|
|||||||
ManaCost:1 W W
|
ManaCost:1 W W
|
||||||
Types:Instant
|
Types:Instant
|
||||||
A:SP$ Regenerate | Cost$ 1 W W | ValidTgts$ Creature | TgtPrompt$ Select target creature | RegenerationTrigger$ TrigGainControl | SpellDescription$ Regenerate target creature. You gain control of that creature if it regenerates this way.
|
A:SP$ Regenerate | Cost$ 1 W W | ValidTgts$ Creature | TgtPrompt$ Select target creature | RegenerationTrigger$ TrigGainControl | SpellDescription$ Regenerate target creature. You gain control of that creature if it regenerates this way.
|
||||||
SVar:TrigGainControl:ST$ GainControl | Cost$ 0 | Defined$ TriggeredCard | NewController$ You | SpellDescription$ Source controller gains control of CARDNAME if it regenerates this way.
|
SVar:TrigGainControl:ST$ GainControl | Cost$ 0 | Defined$ TriggeredCard | NewController$ You
|
||||||
AI:RemoveDeck:All
|
AI:RemoveDeck:All
|
||||||
Oracle:Regenerate target creature. You gain control of that creature if it regenerates this way.
|
Oracle:Regenerate target creature. You gain control of that creature if it regenerates this way.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Name:Deserter's Quarters
|
|||||||
ManaCost:2
|
ManaCost:2
|
||||||
Types:Artifact
|
Types:Artifact
|
||||||
K:You may choose not to untap CARDNAME during your untap step.
|
K:You may choose not to untap CARDNAME during your untap step.
|
||||||
A:AB$ Tap | Cost$ 6 T | ValidTgts$ Creature | RememberTapped$ True | AlwaysRemember$ True | SpellDescription$ Tap target creature. It doesn't untap during its controller's untap step for as long as Deserter's Quarters remains tapped. | StackDescription$ SpellDescription
|
A:AB$ Tap | Cost$ 6 T | ValidTgts$ Creature | RememberTapped$ True | AlwaysRemember$ True | SpellDescription$ Tap target creature. It doesn't untap during its controller's untap step for as long as CARDNAME remains tapped. | StackDescription$ SpellDescription
|
||||||
S:Mode$ Continuous | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step.
|
S:Mode$ Continuous | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step.
|
||||||
T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True
|
T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True
|
||||||
SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True
|
SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True
|
||||||
|
|||||||
@@ -4,5 +4,5 @@ Types:Creature Dragon Warrior
|
|||||||
PT:5/3
|
PT:5/3
|
||||||
K:Trample
|
K:Trample
|
||||||
T:Mode$ DamageDone | ValidSource$ Card.YouCtrl,Emblem.YouCtrl | ValidTarget$ Player | TriggerZones$ Battlefield | DamageAmount$ GE5 | Execute$ TrigDraw | TriggerDescription$ Whenever a source you control deals 5 or more damage to a player, draw a card.
|
T:Mode$ DamageDone | ValidSource$ Card.YouCtrl,Emblem.YouCtrl | ValidTarget$ Player | TriggerZones$ Battlefield | DamageAmount$ GE5 | Execute$ TrigDraw | TriggerDescription$ Whenever a source you control deals 5 or more damage to a player, draw a card.
|
||||||
SVar:TrigDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card.
|
SVar:TrigDraw:DB$ Draw | NumCards$ 1
|
||||||
Oracle:Trample\nWhenever a source you control deals 5 or more damage to a player, draw a card.
|
Oracle:Trample\nWhenever a source you control deals 5 or more damage to a player, draw a card.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ManaCost:4 G G
|
|||||||
Types:Legendary Creature Treefolk Wizard
|
Types:Legendary Creature Treefolk Wizard
|
||||||
PT:6/6
|
PT:6/6
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 1/1 blue Human Wizard creature tokens equal to the number of differently named lands you control.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 1/1 blue Human Wizard creature tokens equal to the number of differently named lands you control.
|
||||||
SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ u_1_1_human_wizard | SpellDescription$ Create a number of 1/1 blue Human Wizard creature tokens equal to the number of differently named lands you control.
|
SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ u_1_1_human_wizard
|
||||||
SVar:X:Count$DifferentCardNames_Land.YouCtrl+inZoneBattlefield
|
SVar:X:Count$DifferentCardNames_Land.YouCtrl+inZoneBattlefield
|
||||||
A:AB$ Draw | Cost$ 4 G U | NumCards$ Y | SubAbility$ PumpAll | SpellDescription$ Draw a card for each Wizard you control. They each get +1/+1 until end of turn for each card in your hand.
|
A:AB$ Draw | Cost$ 4 G U | NumCards$ Y | SubAbility$ PumpAll | SpellDescription$ Draw a card for each Wizard you control. They each get +1/+1 until end of turn for each card in your hand.
|
||||||
SVar:Y:Count$Valid Wizard.YouCtrl
|
SVar:Y:Count$Valid Wizard.YouCtrl
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
Name:Gate to the Aether
|
Name:Gate to the Aether
|
||||||
ManaCost:6
|
ManaCost:6
|
||||||
Types:Artifact
|
Types:Artifact
|
||||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigAetherDig | TriggerController$ TriggeredPlayer | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player reveals the top card of their library. If it's an artifact, creature, enchantment, or land card, the player may put it onto the battlefield.
|
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigAetherDig | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player reveals the top card of their library. If it's an artifact, creature, enchantment, or land card, the player may put it onto the battlefield.
|
||||||
SVar:TrigAetherDig:DB$ Dig | Defined$ TriggeredPlayer | DigNum$ 1 | Reveal$ True | DestinationZone$ Battlefield | DestinationZone2$ Library | LibraryPosition2$ 0 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Artifact,Creature,Enchantment,Land
|
SVar:TrigAetherDig:DB$ Dig | Defined$ TriggeredPlayer | Choser$ TriggeredPlayer | DigNum$ 1 | Reveal$ True | DestinationZone$ Battlefield | DestinationZone2$ Library | LibraryPosition2$ 0 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Artifact,Creature,Enchantment,Land
|
||||||
AI:RemoveDeck:Random
|
AI:RemoveDeck:Random
|
||||||
Oracle:At the beginning of each player's upkeep, that player reveals the top card of their library. If it's an artifact, creature, enchantment, or land card, the player may put it onto the battlefield.
|
Oracle:At the beginning of each player's upkeep, that player reveals the top card of their library. If it's an artifact, creature, enchantment, or land card, the player may put it onto the battlefield.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Name:Genesis Chamber
|
|||||||
ManaCost:2
|
ManaCost:2
|
||||||
Types:Artifact
|
Types:Artifact
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken | TriggerZones$ Battlefield | Execute$ TrigToken | IsPresent$ Card.Self+untapped | TriggerDescription$ Whenever a nontoken creature enters the battlefield, if CARDNAME is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken | TriggerZones$ Battlefield | Execute$ TrigToken | IsPresent$ Card.Self+untapped | TriggerDescription$ Whenever a nontoken creature enters the battlefield, if CARDNAME is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token.
|
||||||
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ TriggeredCardController | TokenScript$ c_1_1_a_myr | SpellDescription$ Create a 1/1 Myr artifact creature token.
|
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ TriggeredCardController | TokenScript$ c_1_1_a_myr
|
||||||
AI:RemoveDeck:Random
|
AI:RemoveDeck:Random
|
||||||
DeckHas:Ability$Token
|
DeckHas:Ability$Token
|
||||||
Oracle:Whenever a nontoken creature enters the battlefield, if Genesis Chamber is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token.
|
Oracle:Whenever a nontoken creature enters the battlefield, if Genesis Chamber is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token.
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ Types:Creature Shapeshifter
|
|||||||
PT:2/2
|
PT:2/2
|
||||||
K:Changeling
|
K:Changeling
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a colorless Shapeshifter creature token with changeling.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a colorless Shapeshifter creature token with changeling.
|
||||||
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_2_2_shapeshifter_changeling | TokenOwner$ You | SpellDescription$ Create a 2/2 colorless Shapeshifter creature token with changeling. (It has every creature type.)
|
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_2_2_shapeshifter_changeling | TokenOwner$ You
|
||||||
DeckHas:Ability$Token
|
DeckHas:Ability$Token
|
||||||
Oracle:Changeling (This card is every creature type.)\nWhen Irregular Cohort enters the battlefield, create a 2/2 colorless Shapeshifter creature token with changeling.
|
Oracle:Changeling (This card is every creature type.)\nWhen Irregular Cohort enters the battlefield, create a 2/2 colorless Shapeshifter creature token with changeling.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ManaCost:1 G
|
|||||||
Types:Legendary Creature Human Druid
|
Types:Legendary Creature Human Druid
|
||||||
PT:1/2
|
PT:1/2
|
||||||
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you draw your second card each turn, create a 2/2 green Cat creature token.
|
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you draw your second card each turn, create a 2/2 green Cat creature token.
|
||||||
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ g_2_2_cat | SpellDescription$ Create a 2/2 green Cat creature token.
|
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ g_2_2_cat
|
||||||
DeckHas:Ability$Token
|
DeckHas:Ability$Token
|
||||||
A:AB$ AnimateAll | Cost$ 4 G G | ValidCards$ Creature.YouCtrl | Power$ X | Toughness$ X | SpellDescription$ Until end of turn, creatures you control have base power and toughness X/X, where X is the number of cards in your hand.
|
A:AB$ AnimateAll | Cost$ 4 G G | ValidCards$ Creature.YouCtrl | Power$ X | Toughness$ X | SpellDescription$ Until end of turn, creatures you control have base power and toughness X/X, where X is the number of cards in your hand.
|
||||||
SVar:X:Count$InYourHand
|
SVar:X:Count$InYourHand
|
||||||
|
|||||||
@@ -5,6 +5,6 @@ PT:4/5
|
|||||||
K:Kicker:5 B
|
K:Kicker:5 B
|
||||||
K:Menace
|
K:Menace
|
||||||
T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace.
|
T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace.
|
||||||
SVar:TrigToken:DB$ Token | TokenAmount$ 8 | TokenScript$ b_2_2_zombie_knight_menace | TokenOwner$ You | SpellDescription$ When CARDNAME enters the battlefield, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace.
|
SVar:TrigToken:DB$ Token | TokenAmount$ 8 | TokenScript$ b_2_2_zombie_knight_menace | TokenOwner$ You
|
||||||
DeckHas:Ability$Token
|
DeckHas:Ability$Token
|
||||||
Oracle:Kicker {5}{B} (You may pay an additional {5}{B} as you cast this spell.)\nMenace\nWhen Josu Vess, Lich Knight enters the battlefield, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace.
|
Oracle:Kicker {5}{B} (You may pay an additional {5}{B} as you cast this spell.)\nMenace\nWhen Josu Vess, Lich Knight enters the battlefield, if it was kicked, create eight 2/2 black Zombie Knight creature tokens with menace.
|
||||||
|
|||||||
@@ -5,6 +5,6 @@ PT:3/4
|
|||||||
K:Flying
|
K:Flying
|
||||||
K:Lifelink
|
K:Lifelink
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn.
|
||||||
SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ X | TokenScript$ w_2_2_knight_vigilance | SpellDescription$ Create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn.
|
SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ X | TokenScript$ w_2_2_knight_vigilance
|
||||||
SVar:X:TriggeredCardController$OpponentsAttackedThisTurn
|
SVar:X:TriggeredCardController$OpponentsAttackedThisTurn
|
||||||
Oracle:Flying, lifelink\nWhen Militant Angel enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn.
|
Oracle:Flying, lifelink\nWhen Militant Angel enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn.
|
||||||
|
|||||||
@@ -6,9 +6,8 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S
|
|||||||
SVar:TrigDrain:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife
|
SVar:TrigDrain:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife
|
||||||
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2
|
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2
|
||||||
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ At the beginning of your end step you may exile NICKNAME. If you do, return it to the battlefield under it's owner's control at the beginning of your next upkeep. It gains haste.
|
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ At the beginning of your end step you may exile NICKNAME. If you do, return it to the battlefield under it's owner's control at the beginning of your next upkeep. It gains haste.
|
||||||
SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBDelaytrig
|
SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DelTrig
|
||||||
SVar:DBDelaytrig:DB$ Effect | Name$ Obzedat Effect | Triggers$ TrigEOT | RememberObjects$ Self | Duration$ Permanent
|
SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ ObzedatReturn | ConditionDefined$ Remembered | ConditionPresent$ Card | RememberObjects$ Remembered | TriggerDescription$ Return CARDNAME to the battlefield under its owner's control at the beginning of the next end step.
|
||||||
SVar:TrigEOT:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ ObzedatReturn | OneOff$ True | TriggerDescription$ Return CARDNAME to the battlefield under it's owner's control. It gains haste.
|
SVar:ObzedatReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Exile,Command | Destination$ Battlefield | SubAbility$ ObzedatPump
|
||||||
SVar:ObzedatReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ ObzedatPump
|
|
||||||
SVar:ObzedatPump:DB$ Pump | Defined$ Remembered | KW$ Haste | Duration$ Permanent
|
SVar:ObzedatPump:DB$ Pump | Defined$ Remembered | KW$ Haste | Duration$ Permanent
|
||||||
Oracle:When Obzedat, Ghost Council enters the battlefield, target opponent loses 2 life and you gain 2 life.\nAt the beginning of your end step, you may exile Obzedat. If you do, return it to the battlefield under its owner's control at the beginning of your next upkeep. It gains haste.
|
Oracle:When Obzedat, Ghost Council enters the battlefield, target opponent loses 2 life and you gain 2 life.\nAt the beginning of your end step, you may exile Obzedat. If you do, return it to the battlefield under its owner's control at the beginning of your next upkeep. It gains haste.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ManaCost:1 U U
|
|||||||
Types:Creature Djinn
|
Types:Creature Djinn
|
||||||
PT:2/3
|
PT:2/3
|
||||||
K:You may choose not to untap CARDNAME during your untap step.
|
K:You may choose not to untap CARDNAME during your untap step.
|
||||||
A:AB$ GainControl | Cost$ T | ValidTgts$ Creature.powerLEX | TgtPrompt$ Select target creature with power less than or equal to Old Man's. | LoseControl$ Untap,LeavesPlay,LoseControl,StaticCommandCheck | StaticCommandCheckSVar$ Y | StaticCommandSVarCompare$ GTX | SpellDescription$ Gain control of target creature with power less than or equal to Old Man of the Sea's power for as long as Old Man of the Sea remains tapped and that creature's power remains less than or equal to Old Man of the Sea's power.
|
A:AB$ GainControl | Cost$ T | ValidTgts$ Creature.powerLEX | TgtPrompt$ Select target creature with power less than or equal to Old Man's. | LoseControl$ Untap,LeavesPlay,LoseControl,StaticCommandCheck | StaticCommandCheckSVar$ Y | StaticCommandSVarCompare$ GTX | SpellDescription$ Gain control of target creature with power less than or equal to CARDNAME's power for as long as CARDNAME remains tapped and that creature's power remains less than or equal to CARDNAME's power.
|
||||||
SVar:X:Count$CardPower
|
SVar:X:Count$CardPower
|
||||||
# the hostcard of SVar Y is the controlled card
|
# the hostcard of SVar Y is the controlled card
|
||||||
SVar:Y:Count$CardPower
|
SVar:Y:Count$CardPower
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Name:Prophetic Titan
|
|||||||
ManaCost:4 U R
|
ManaCost:4 U R
|
||||||
Types:Creature Giant Wizard
|
Types:Creature Giant Wizard
|
||||||
PT:4/4
|
PT:4/4
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ Delirium — When CARDNAME enters the battlefield, choose one. If there are four or more card types among cards in your graveyard, choose both instead.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ Delirium — When CARDNAME enters the battlefield, ABILITY
|
||||||
SVar:TrigCharm:DB$ Charm | CharmNum$ X | Choices$ DBDealDamage,DBDig | AdditionalDescription$ If there are four or more card types in your graveyard, choose both.
|
SVar:TrigCharm:DB$ Charm | CharmNum$ X | Choices$ DBDealDamage,DBDig | AdditionalDescription$ If there are four or more card types in your graveyard, choose both.
|
||||||
SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker,Player | TgtPrompt$ Select any target | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to any target.
|
SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker,Player | TgtPrompt$ Select any target | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to any target.
|
||||||
SVar:DBDig:DB$ Dig | DigNum$ 4 | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order.
|
SVar:DBDig:DB$ Dig | DigNum$ 4 | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Name:Pure Reflection
|
|||||||
ManaCost:2 W
|
ManaCost:2 W
|
||||||
Types:Enchantment
|
Types:Enchantment
|
||||||
T:Mode$ SpellCast | ValidCard$ Creature | Execute$ TrigDestroy | ValidActivatingPlayer$ Player | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a creature spell, destroy all Reflections. Then that player creates an X/X white Reflection creature token, where X is the mana value of that spell.
|
T:Mode$ SpellCast | ValidCard$ Creature | Execute$ TrigDestroy | ValidActivatingPlayer$ Player | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a creature spell, destroy all Reflections. Then that player creates an X/X white Reflection creature token, where X is the mana value of that spell.
|
||||||
SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Reflection | SubAbility$ DBToken | SpellDescription$ Destroy all Reflections
|
SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Reflection | SubAbility$ DBToken
|
||||||
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenPower$ X | TokenToughness$ X | TokenScript$ w_x_x_reflection | TokenOwner$ TriggeredActivator
|
SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenPower$ X | TokenToughness$ X | TokenScript$ w_x_x_reflection | TokenOwner$ TriggeredActivator
|
||||||
SVar:X:TriggeredStackInstance$CardManaCostLKI
|
SVar:X:TriggeredStackInstance$CardManaCostLKI
|
||||||
Oracle:Whenever a player casts a creature spell, destroy all Reflections. Then that player creates an X/X white Reflection creature token, where X is the mana value of that spell.
|
Oracle:Whenever a player casts a creature spell, destroy all Reflections. Then that player creates an X/X white Reflection creature token, where X is the mana value of that spell.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ PT:4/4
|
|||||||
K:Partner:Krav, the Unredeemed:Krav
|
K:Partner:Krav, the Unredeemed:Krav
|
||||||
K:Flying
|
K:Flying
|
||||||
T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ YouTeamLifeGained | SVarCompare$ GE1 | Execute$ TrigWarrior | TriggerDescription$ At the beginning of each end step, if your team gained life this turn, create two 1/1 white Warrior creature tokens.
|
T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ YouTeamLifeGained | SVarCompare$ GE1 | Execute$ TrigWarrior | TriggerDescription$ At the beginning of each end step, if your team gained life this turn, create two 1/1 white Warrior creature tokens.
|
||||||
SVar:TrigWarrior:DB$ Token | TokenAmount$ 2 | TokenScript$ w_1_1_warrior | TokenOwner$ You | SpellDescription$ Create two 1/1 white Warrior creature tokens.
|
SVar:TrigWarrior:DB$ Token | TokenAmount$ 2 | TokenScript$ w_1_1_warrior | TokenOwner$ You
|
||||||
SVar:YouTeamLifeGained:Count$LifeYourTeamGainedThisTurn
|
SVar:YouTeamLifeGained:Count$LifeYourTeamGainedThisTurn
|
||||||
DeckHints:Name$Krav, the Unredeemed
|
DeckHints:Name$Krav, the Unredeemed
|
||||||
Oracle:Partner with Krav, the Unredeemed (When this creature enters the battlefield, target player may put Krav into their hand from their library, then shuffle.)\nFlying\nAt the beginning of each end step, if your team gained life this turn, create two 1/1 white Warrior creature tokens.
|
Oracle:Partner with Krav, the Unredeemed (When this creature enters the battlefield, target player may put Krav into their hand from their library, then shuffle.)\nFlying\nAt the beginning of each end step, if your team gained life this turn, create two 1/1 white Warrior creature tokens.
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ ManaCost:no cost
|
|||||||
Types:Vanguard
|
Types:Vanguard
|
||||||
HandLifeModifier:+1/+1
|
HandLifeModifier:+1/+1
|
||||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigDmgOpp | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each opponent.
|
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigDmgOpp | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each opponent.
|
||||||
SVar:TrigDmgOpp:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1
|
SVar:TrigDmgOpp:DB$ DealDamage | Defined$ Opponent | NumDmg$ 1
|
||||||
Oracle:Hand +1, life +1\nAt the beginning of your upkeep, Rumbling Slum Avatar deals 1 damage to each opponent.
|
Oracle:Hand +1, life +1\nAt the beginning of your upkeep, Rumbling Slum Avatar deals 1 damage to each opponent.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ PT:1/1
|
|||||||
K:Morph:3 G G
|
K:Morph:3 G G
|
||||||
S:Mode$ Continuous | Affected$ Creature.Saproling | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Card.Self+faceUp | Description$ All Saprolings get +1/+1.
|
S:Mode$ Continuous | Affected$ Creature.Saproling | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Card.Self+faceUp | Description$ All Saprolings get +1/+1.
|
||||||
T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, create four 1/1 green Saproling creature tokens.
|
T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, create four 1/1 green Saproling creature tokens.
|
||||||
SVar:TrigToken:DB$ Token | TokenAmount$ 4 | TokenScript$ g_1_1_saproling | TokenOwner$ You | SpellDescription$ Create four 1/1 green Saproling creature tokens.
|
SVar:TrigToken:DB$ Token | TokenAmount$ 4 | TokenScript$ g_1_1_saproling | TokenOwner$ You
|
||||||
SVar:PlayMain1:TRUE
|
SVar:PlayMain1:TRUE
|
||||||
DeckHints:Type$Fungus
|
DeckHints:Type$Fungus
|
||||||
DeckHas:Ability$Token
|
DeckHas:Ability$Token
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Name:Conductor of Cacophony
|
||||||
|
ManaCost:3 B
|
||||||
|
Types:Creature Demon
|
||||||
|
PT:2/1
|
||||||
|
K:etbCounter:P1P1:2
|
||||||
|
A:AB$ DamageAll | Cost$ B SubCounter<1/P1P1> | ValidCards$ Creature.Other | ValidPlayers$ Player | NumDmg$ 1 | ValidDescription$ each other creature and each player. | SpellDescription$ It deals 1 damage to each other creature and each player.
|
||||||
|
DeckHas:Ability$Counters
|
||||||
|
DeckHints:Ability$Counters
|
||||||
|
Oracle:Conductor of Cacophony enters the battlefield with two +1/+1 counters on it.\n{B}, Remove a +1/+1 counter from Conductor of Cacophony: It deals 1 damage to each other creature and each player.
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
Name:Distinguished Conjurer
|
||||||
|
ManaCost:1 W
|
||||||
|
Types:Creature Human Wizard
|
||||||
|
PT:1/2
|
||||||
|
T:Mode$ ChangesZone | ValidCard$ Creature.Other+YouCtrl | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield under your control, you gain 1 life.
|
||||||
|
SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 1
|
||||||
|
A:AB$ ChangeZone | Cost$ 4 W T | ValidTgts$ Creature.Other+YouCtrl | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Select another target creature you control | RememberChanged$ True | SubAbility$ DBReturn | SpellDescription$ Exile another target creature you control, then return it to the battlefield under its owner's control.
|
||||||
|
SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | SubAbility$ DBCleanup
|
||||||
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
|
DeckHas:Ability$LifeGain
|
||||||
|
SVar:BuffedBy:Creature
|
||||||
|
Oracle:Whenever another creature enters the battlefield under your control, you gain 1 life.\n{4}{W}, {T}: Exile another target creature you control, then return it to the battlefield under its owner's control.
|
||||||
10
forge-gui/res/cardsfolder/upcoming/dutiful_replicator.txt
Normal file
10
forge-gui/res/cardsfolder/upcoming/dutiful_replicator.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
Name:Dutiful Replicator
|
||||||
|
ManaCost:3
|
||||||
|
Types:Artifact Creature Assembly-Worker
|
||||||
|
PT:3/2
|
||||||
|
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigImmediate | TriggerDescription$ When CARDNAME enters the battlefield, you may pay {1}. When you do, create a token that's a copy of target token you control not named Dutiful Replicator.
|
||||||
|
SVar:TrigImmediate:AB$ ImmediateTrigger | Cost$ 1 | Execute$ TrigClone | TriggerDescription$ When you do, create a token that's a copy of target token you control not named Dutiful Replicator.
|
||||||
|
SVar:TrigClone:DB$ CopyPermanent | ValidTgts$ Permanent.token+YouCtrl+notnamedDutiful Replicator | TgtPrompt$ Select target token you control not named Dutiful Replicator
|
||||||
|
DeckHas:Ability$Token
|
||||||
|
DeckNeeds:Ability$Token
|
||||||
|
Oracle:When Dutiful Replicator enters the battlefield, you may pay {1}. When you do, create a token that's a copy of target token you control not named Dutiful Replicator.
|
||||||
11
forge-gui/res/cardsfolder/upcoming/hold_for_questioning.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/hold_for_questioning.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
Name:Hold for Questioning
|
||||||
|
ManaCost:3 U
|
||||||
|
Types:Enchantment Aura
|
||||||
|
K:Enchant creature or planeswalker
|
||||||
|
A:SP$ Attach | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | AILogic$ Curse
|
||||||
|
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap enchanted permanent and investigate. (Create a Clue token. It's an artifact with "{2}, Sacrifice this artifact: Draw a card.")
|
||||||
|
SVar:TrigTap:DB$ Tap | Defined$ Enchanted | SubAbility$ DBInvestigate
|
||||||
|
SVar:DBInvestigate:DB$ Investigate
|
||||||
|
S:Mode$ Continuous | Affected$ Permanent.EnchantedBy | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. & CARDNAME's activated abilities can't be activated. | Description$ Enchanted permanent doesn't untap during its controller's untap step and its activated abilities can't be activated.
|
||||||
|
DeckHas:Ability$Investigate|Token|Sacrifice & Type$Artifact|Clue
|
||||||
|
Oracle:Enchant creature or planeswalker\nWhen Hold for Questioning enters the battlefield, tap enchanted permanent and investigate. (Create a Clue token. It's an artifact with "{2}, Sacrifice this artifact: Draw a card.")\nEnchanted permanent doesn't untap during its controller's untap step and its activated abilities can't be activated.
|
||||||
8
forge-gui/res/cardsfolder/upcoming/infernal_idol.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/infernal_idol.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Name:Infernal Idol
|
||||||
|
ManaCost:3
|
||||||
|
Types:Artifact
|
||||||
|
A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}.
|
||||||
|
A:AB$ Draw | Cost$ 1 B B T Sac<1/CARDNAME> | NumCards$ 2 | SubAbility$ DBLoseLife | SpellDescription$ You draw two cards and you lose two life.
|
||||||
|
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2
|
||||||
|
DeckNeeds:Color$Black
|
||||||
|
Oracle:{T}: Add {B}.\n{1}{B}{B}, {T}, Sacrifice Infernal Idol: You draw two cards and you lose two life.
|
||||||
8
forge-gui/res/cardsfolder/upcoming/ingenious_leonin.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/ingenious_leonin.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Name:Ingenious Leonin
|
||||||
|
ManaCost:4 W
|
||||||
|
Types:Creature Cat Soldier
|
||||||
|
PT:4/4
|
||||||
|
A:AB$ PutCounter | Cost$ 3 W | ValidTgts$ Creature.attacking+Other+YouCtrl | TgtPrompt$ Select another target attacking creature you control | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on another target attacking creature you control. If that creature is a Cat, it gains first strike until end of turn.
|
||||||
|
SVar:DBPump:DB$ Pump | Defined$ Targeted | ConditionDefined$ Targeted | ConditionPresent$ Cat | KW$ First Strike | StackDesc$ If that creature is a Cat, it gains first strike until end of turn
|
||||||
|
DeckHints:Type$Cat
|
||||||
|
Oracle:{3}{W}: Put a +1/+1 counter on another target attacking creature you control. If that creature is a Cat, it gains first strike until end of turn.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Name:Lita, Mechanical Engineer
|
||||||
|
ManaCost:2 W
|
||||||
|
Types:Legendary Artifact Creature Artificer
|
||||||
|
PT:3/3
|
||||||
|
K:Vigilance
|
||||||
|
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ At the beginning of your end step, untap all artifact creatures you control.
|
||||||
|
SVar:TrigUntap:DB$ UntapAll | ValidCards$ Artifact.Creature+YouCtrl
|
||||||
|
A:AB$ Token | Cost$ 3 W T | TokenScript$ zeppelin | SpellDescription$ Create a 5/5 colorless Vehicle artifact token named Zeppelin with flying and crew 3.
|
||||||
|
DeckHas:Type$Vehicle & Ability$Token & Keyword$Flying
|
||||||
|
DeckHints:Type$Artifact
|
||||||
|
Oracle:Vigilance\nAt the beginning of your end step, untap all artifact creatures you control.\n{3}{W}, {T}: Create a 5/5 colorless Vehicle artifact token named Zeppelin with flying and crew 3.
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
Name:Magnanimous Magistrate
|
||||||
|
ManaCost:5 W
|
||||||
|
Types:Creature Human Advisor
|
||||||
|
PT:3/4
|
||||||
|
K:etbCounter:REPR:5
|
||||||
|
T:Mode$ ChangesZone | ValidCard$ Creature.Other+nonToken+cmcGE1 | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ Whenever another nontoken creature you control dies, if its mana value was 1 or greater, you may remove that many reprieve counters from CARDNAME. If you do, return that card to the battlefield under its owner's control.
|
||||||
|
SVar:TrigChangeZone:AB$ ChangeZone | Cost$ SubCounter<X/REPR> | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield
|
||||||
|
SVar:X:TriggeredCard$CardManaCost
|
||||||
|
DeckHas:Ability$Counters
|
||||||
|
Oracle:Magnanimous Magistrate enters the battlefield with five reprieve counters on it.\nWhenever another nontoken creature you control dies, if its mana value was 1 or greater, you may remove that many reprieve counters from Magnanimous Magistrate. If you do, return that card to the battlefield under its owner's control.
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Name:Mild-Mannered Librarian
|
||||||
|
ManaCost:G
|
||||||
|
Types:Creature Human
|
||||||
|
PT:1/1
|
||||||
|
A:AB$ Animate | Cost$ 3 G | GameActivationLimit$ 1 | Types$ Werewolf | RemoveCreatureTypes$ True | Duration$ Permanent | SubAbility$ DBCounter | SpellDescription$ CARDNAME becomes a Werewolf. Put two +1/+1 counters on it and you draw a card. Activate only once.
|
||||||
|
SVar:DBCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBDraw
|
||||||
|
SVar:DBDraw:DB$ Draw
|
||||||
|
DeckHas:Ability$Counters & Type$Werewolf
|
||||||
|
Oracle:{3}{G}: Mild-Mannered Librarian becomes a Werewolf. Put two +1/+1 counters on it and you draw a card. Activate only once.
|
||||||
9
forge-gui/res/cardsfolder/upcoming/pirated_copy.txt
Normal file
9
forge-gui/res/cardsfolder/upcoming/pirated_copy.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
Name:Pirated Copy
|
||||||
|
ManaCost:4 U
|
||||||
|
Types:Creature Shapeshifter Pirate
|
||||||
|
PT:0/0
|
||||||
|
K:ETBReplacement:Copy:DBCopy:Optional
|
||||||
|
SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTypes$ Pirate | AddTriggers$ DrawTrig | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it's a Pirate in addition to its other types and it has "Whenever this creature or another creature with the same name deals combat damage to a player, you draw a card."
|
||||||
|
SVar:DrawTrig:Mode$ DamageDone | ValidSource$ Card.Self,Creature.sameName | TriggerZones$ Battlefield | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever this creature or another creature with the same name deals combat damage to a player, you draw a card.
|
||||||
|
SVar:TrigDraw:DB$ Draw
|
||||||
|
Oracle:You may have Pirated Copy enter the battlefield as a copy of any creature on the battlefield, except it's a Pirate in addition to its other types and it has "Whenever this creature or another creature with the same name deals combat damage to a player, you draw a card."
|
||||||
10
forge-gui/res/cardsfolder/upcoming/preston_the_vanisher.txt
Normal file
10
forge-gui/res/cardsfolder/upcoming/preston_the_vanisher.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
Name:Preston, the Vanisher
|
||||||
|
ManaCost:3 W
|
||||||
|
Types:Legendary Creature Rabbit Wizard
|
||||||
|
PT:2/5
|
||||||
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+wasNotCast+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigCopyPermanent | TriggerDescription$ Whenever another nontoken creature enters the battlefield under your control, if it wasn't cast, create a token that's a copy of that creature except it's a 0/1 white Illusion.
|
||||||
|
SVar:TrigCopyPermanent:DB$ CopyPermanent | Defined$ TriggeredCard | NumCopies$ 1 | SetColor$ White | SetCreatureTypes$ Illusion | SetPower$ 0 | SetToughness$ 1
|
||||||
|
A:AB$ ChangeZone | Cost$ 1 W Sac<5/Illusion> | ValidTgts$ Permanent.nonLand | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Select target nonland permanent | SpellDescription$ Exile target nonland permanent.
|
||||||
|
DeckHas:Ability$Token|Sacrifice & Type$Illusion
|
||||||
|
DeckHints:Type$Illusion & Ability$Graveyard
|
||||||
|
Oracle:Whenever another nontoken creature enters the battlefield under your control, if it wasn't cast, create a token that's a copy of that creature except it's a 0/1 white Illusion.\n{1}{W}, Sacrifice five Illusions: Exile target nonland permanent.
|
||||||
10
forge-gui/res/cardsfolder/upcoming/primeval_herald.txt
Normal file
10
forge-gui/res/cardsfolder/upcoming/primeval_herald.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
Name:Primeval Herald
|
||||||
|
ManaCost:3 G
|
||||||
|
Types:Creature Elf Scout
|
||||||
|
PT:3/1
|
||||||
|
K:Trample
|
||||||
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle.
|
||||||
|
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | OptionalDecider$ You | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle.
|
||||||
|
SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | ShuffleNonMandatory$ True
|
||||||
|
SVar:HasAttackEffect:TRUE
|
||||||
|
Oracle:Trample\nWhenever Primeval Herald enters the battlefield or attacks, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle.
|
||||||
7
forge-gui/res/cardsfolder/upcoming/read_the_soul.txt
Normal file
7
forge-gui/res/cardsfolder/upcoming/read_the_soul.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Name:Read the Soul
|
||||||
|
ManaCost:3 U
|
||||||
|
Types:Instant
|
||||||
|
A:SP$ Charm | Choices$ Counter,Draw | CharmNum$ 1
|
||||||
|
SVar:Counter:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 4 | SpellDescription$ Counter target spell unless its controller pays {4}.
|
||||||
|
SVar:Draw:DB$ Draw | NumCards$ 2 | SpellDescription$ Draw two cards.
|
||||||
|
Oracle:Choose one —\n• Counter target spell unless its controller pays {4}.\n• Draw two cards.
|
||||||
16
forge-gui/res/cardsfolder/upcoming/rodolf_duskbringer.txt
Normal file
16
forge-gui/res/cardsfolder/upcoming/rodolf_duskbringer.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
Name:Rodolf Duskbringer
|
||||||
|
ManaCost:5 B
|
||||||
|
Types:Legendary Creature Vampire Angel
|
||||||
|
PT:4/4
|
||||||
|
K:Flying
|
||||||
|
K:Deathtouch
|
||||||
|
K:Lifelink
|
||||||
|
T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you gain life, CARDNAME gains indestructible until end of turn.
|
||||||
|
SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Indestructible
|
||||||
|
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | Execute$ TrigImmediateTrig | TriggerDescription$ At the beginning of your end step, you may pay {1}{W/B}. When you do, return target creature with mana value X or less from your graveyard to the battlefield, where X is the amount of life you gained this turn.
|
||||||
|
SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ 1 WB | Execute$ TrigChangeZone | TriggerDescription$ When you do, return target creature with mana value X or less from your graveyard to the battlefield, where X is the amount of life you gained this turn.
|
||||||
|
SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Creature.cmcLEX+YouOwn | TgtPrompt$ Select target creature card with mana value X or less | Origin$ Graveyard | Destination$ Battlefield
|
||||||
|
SVar:X:Count$LifeYouGainedThisTurn
|
||||||
|
DeckHas:Ability$Graveyard|LifeGain & Keyword$indestructible
|
||||||
|
DeckHints:Ability$Graveyard|LifeGain|Mill
|
||||||
|
Oracle:Flying, deathtouch, lifelink\nWhenever you gain life, Rodolf Duskbringer gains indestructible until end of turn.\nAt the beginning of your end step, you may pay {1}{W/B}. When you do, return target creature with mana value X or less from your graveyard to the battlefield, where X is the amount of life you gained this turn.
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
Name:Runadi, Behemoth Caller
|
||||||
|
ManaCost:2 G
|
||||||
|
Types:Legendary Creature Cat Shaman
|
||||||
|
PT:1/3
|
||||||
|
T:Mode$ SpellCast | ValidCard$ Creature.cmcGE5 | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigEffect | TriggerDescription$ Whenever you cast a creature spell with mana value 5 or greater, that creature enters the battlefield with X additional +1/+1 counters on it, where X is its mana value minus 4.
|
||||||
|
SVar:TrigEffect:DB$ Effect | RememberObjects$ TriggeredCard | ReplacementEffects$ ETBCreat | ExileOnMoved$ Stack
|
||||||
|
SVar:ETBCreat:Event$ Moved | ValidCard$ Card.IsRemembered | Destination$ Battlefield | ReplaceWith$ DBPutP1P1 | ReplacementResult$ Updated
|
||||||
|
SVar:DBPutP1P1:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | ETB$ True | CounterNum$ X
|
||||||
|
S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE3_P1P1 | AddKeyword$ Haste | Description$ Creatures you control with three or more +1/+1 counters on them have haste.
|
||||||
|
A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}.
|
||||||
|
SVar:X:Remembered$CardManaCost/Minus.4
|
||||||
|
DeckHas:Ability$Counters
|
||||||
|
DeckHints:Type$Tyranid|Hydra
|
||||||
|
Oracle:Whenever you cast a creature spell with mana value 5 or greater, that creature enters the battlefield with X additional +1/+1 counters on it, where X is its mana value minus 4.\nCreatures you control with three or more +1/+1 counters on them have haste.\n{T}: Add {G}.
|
||||||
8
forge-gui/res/cardsfolder/upcoming/towering_gibbon.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/towering_gibbon.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Name:Towering Gibbon
|
||||||
|
ManaCost:3 G
|
||||||
|
Types:Creature Ape
|
||||||
|
PT:*/4
|
||||||
|
K:Reach
|
||||||
|
S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | Description$ CARDNAME's power is equal to the highest mana value among creatures you control.
|
||||||
|
SVar:X:Count$Valid Creature.YouCtrl$GreatestCMC
|
||||||
|
Oracle:Reach\nTowering Gibbon's power is equal to the greatest mana value among creatures you control.
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
Name:Zask, Skittering Swarmlord
|
||||||
|
ManaCost:3 G G
|
||||||
|
Types:Legendary Creature Insect
|
||||||
|
PT:5/5
|
||||||
|
S:Mode$ Continuous | Affected$ Land.YouOwn,Insect.YouOwn | MayPlay$ True | AffectedZone$ Graveyard | Description$ You may play lands and cast Insect spells from your graveyard.o
|
||||||
|
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Insect.YouCtrl+Other | Execute$ TrigChange | TriggerDescription$ Whenever another Insect you control dies, put it on the bottom of its owner's library, then mill two cards. (Put the top two cards of your library into your graveyard.)
|
||||||
|
SVar:TrigChange:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | SubAbility$ DBMill
|
||||||
|
SVar:DBMill:DB$ Mill | NumCards$ 2
|
||||||
|
A:AB$ Pump | Cost$ 1 BG | ValidTgts$ Insect | NumAtt$ 1 | KW$ Deathtouch | SpellDescription$ Target Insect gets +1/+0 and gains deathtouch until end of turn.
|
||||||
|
DeckHas:Ability$Mill|Graveyard & Keyword$Deathtouch
|
||||||
|
DeckNeeds:Type$Insect
|
||||||
|
Oracle:You may play lands and cast Insect spells from your graveyard.\nWhenever another Insect you control dies, put it on the bottom of its owner's library, then mill two cards. (Put the top two cards of your library into your graveyard.)\n{1}{B/G}: Target Insect gets +1/+0 and gains deathtouch until end of turn.
|
||||||
@@ -3,7 +3,7 @@ ManaCost:5 W
|
|||||||
Types:Creature Giant Soldier
|
Types:Creature Giant Soldier
|
||||||
PT:3/6
|
PT:3/6
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Human creature token.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Human creature token.
|
||||||
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_human | TokenOwner$ You | SpellDescription$ Create a 1/1 white Human creature token.
|
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_human | TokenOwner$ You
|
||||||
DeckHints:Type$Human
|
DeckHints:Type$Human
|
||||||
DeckHas:Ability$Token
|
DeckHas:Ability$Token
|
||||||
Oracle:When Watchful Giant enters the battlefield, create a 1/1 white Human creature token.
|
Oracle:When Watchful Giant enters the battlefield, create a 1/1 white Human creature token.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Types:Enchantment
|
|||||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigEvoke | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player reveals a card at random from their hand. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able.
|
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigEvoke | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player reveals a card at random from their hand. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able.
|
||||||
SVar:TrigEvoke:DB$ Reveal | Random$ True | RememberRevealed$ True | Defined$ TriggeredPlayer | SubAbility$ DBEvokeLand
|
SVar:TrigEvoke:DB$ Reveal | Random$ True | RememberRevealed$ True | Defined$ TriggeredPlayer | SubAbility$ DBEvokeLand
|
||||||
SVar:DBEvokeLand:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Defined$ ValidHand Land.IsRemembered | ForgetChanged$ True | SubAbility$ DBEvokePlay
|
SVar:DBEvokeLand:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Defined$ ValidHand Land.IsRemembered | ForgetChanged$ True | SubAbility$ DBEvokePlay
|
||||||
SVar:DBEvokePlay:DB$ Play | ValidZone$ Hand | Controller$ TriggeredPlayer | Defined$ Remembered | WithoutManaCost$ True | SubAbility$ DBCleanup
|
SVar:DBEvokePlay:DB$ Play | ValidZone$ Hand | Controller$ TriggeredPlayer | Defined$ Remembered | ValidSA$ Spell | WithoutManaCost$ True | SubAbility$ DBCleanup
|
||||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
AI:RemoveDeck:Random
|
AI:RemoveDeck:Random
|
||||||
Oracle:At the beginning of each player's upkeep, that player reveals a card at random from their hand. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able.
|
Oracle:At the beginning of each player's upkeep, that player reveals a card at random from their hand. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able.
|
||||||
|
|||||||
@@ -6,8 +6,75 @@ Type=Draft
|
|||||||
ScryfallCode=J22
|
ScryfallCode=J22
|
||||||
|
|
||||||
[cards]
|
[cards]
|
||||||
|
4 U Distinguished Conjurer @Nils Hamm
|
||||||
|
5 U Ingenious Leonin @Eric Deschamps
|
||||||
|
6 M Lita, Mechanical Engineer @Bartek Fedyczak
|
||||||
|
7 U Magnanimous Magistrate @Marie Magny
|
||||||
|
8 R Preston, the Vanisher @Christina Kraus
|
||||||
|
11 U Hold for Questioning @Samuel Perin
|
||||||
12 M Isu the Abominable @Victor Adame Minguez
|
12 M Isu the Abominable @Victor Adame Minguez
|
||||||
|
15 C Merfolk Pupil @Caroline Gariba
|
||||||
|
16 M Pirated Copy @Daarken
|
||||||
|
19 M Ashcoat of the Shadow Swarm @Christina Kraus
|
||||||
|
20 U Conductor of Cacophony @Jason A. Engle
|
||||||
|
21 C Creeping Bloodsucker @Antonio José Manzanedo
|
||||||
|
23 U Disciple of Perdition @Alix Branwyn
|
||||||
|
25 R Rodolf Duskbringer @Billy Christian
|
||||||
|
28 R Termination Facilitator @Justine Cruz
|
||||||
29 R Ardoz, Cobbler of War @Kev Walker
|
29 R Ardoz, Cobbler of War @Kev Walker
|
||||||
|
40 M Kibo, Uktabi Prince @Zoltan Boros
|
||||||
|
41 U Mild-Mannered Librarian @Justyna Gil
|
||||||
|
42 U Primeval Herald @Tatiana Kirgetova
|
||||||
|
44 R Runadi, Behemoth Caller @Billy Christian
|
||||||
|
45 C Spectral Hunt-Caller @Uriah Voth
|
||||||
|
46 U Towering Gibbon @Chris Seaman
|
||||||
|
48 C Dutiful Replicator @Alexander Forssberg
|
||||||
|
49 C Infernal Idol @Drew Tucker
|
||||||
|
50 U Instruments of War @Drew Tucker
|
||||||
|
51 U Planar Atlas @Alexander Forssberg
|
||||||
|
52 U Arrest @Katana Canata
|
||||||
|
53 R Balan, Wandering Knight @Mai Okuma
|
||||||
|
56 C Flicker of Fate
|
||||||
|
57 U King of the Pride @Inuchiyo Meimaru
|
||||||
|
62 U Mirror Image @Yukie Tajima
|
||||||
|
64 U Spectral Sailor @Fuzichoco
|
||||||
|
65 C Spellstutter Sprite
|
||||||
|
66 U Whirler Rogue @I☆LA
|
||||||
|
67 C Diabolic Edict @Tetsu Kurosawa
|
||||||
|
68 U Feast on the Fallen
|
||||||
|
70 U Oathsworn Vampire @Border
|
||||||
|
71 R Ogre Slumlord
|
||||||
79 M Kiki-Jiki, Mirror Breaker @Ishikawa Kenta
|
79 M Kiki-Jiki, Mirror Breaker @Ishikawa Kenta
|
||||||
|
85 U Arlinn, Voice of the Pack @Hisashi Momose
|
||||||
|
88 C Elvish Rejuvenator @Shiramine
|
||||||
|
92 U Thrashing Brontodon @Kemonomichi
|
||||||
94 U Coldsteel Heart @I☆LA
|
94 U Coldsteel Heart @I☆LA
|
||||||
|
95 U Magnifying Glass @Yukihiro Maruo
|
||||||
|
96 R Peacewalker Colossus @Hisashi Momose
|
||||||
|
97 M Karn Liberated @Dai-XT
|
||||||
|
117 U Blood Artist @Julie Dillon
|
||||||
|
118 U Feast of Blood @Irina Nordsol
|
||||||
|
119 U Festering Evil @Samuel Araya
|
||||||
|
126 C Renegade Demon @Alexandre Honoré
|
||||||
|
133 U Uktabi Orangutan @Milivoj Ćeran
|
||||||
|
134 R Wicked Wolf @Steve Ellis
|
||||||
|
141 M Ajani, Strength of the Pride @Chris Rallis
|
||||||
|
142 U Ajani's Pridemate @Svetlin Velinov
|
||||||
|
184 R Felidar Retreat @Ralph Horsley
|
||||||
|
208 R Leonin Warleader @Jakub Kasper
|
||||||
|
232 R Regal Caracal @Filip Burburan
|
||||||
|
259 R Trove Warden @Lars Grant-West
|
||||||
|
323 U Nezumi Bone-Reader @Leonardo Santanna
|
||||||
|
384 C Burglar Rat @Tyler Walpole
|
||||||
|
387 C Chittering Rats @Yeong-Hao Han
|
||||||
|
392 U Crypt Rats @Matt Cavotta
|
||||||
|
397 R Demon of Catastrophes @Sidharth Chaturvedi
|
||||||
|
403 R Dread Presence @Anthony Palumbo
|
||||||
|
412 C Eviscerate @Min Yum
|
||||||
|
431 R Kothophed, Soul Hoarder @Jakub Kasper
|
||||||
|
463 R Seizan, Perverter of Truth @Kev Walker
|
||||||
|
465 C Sinuous Vermin @Jason Kang
|
||||||
|
468 C Typhoid Rats @Kev Walker
|
||||||
|
481 U Ulcerate @Johann Bodin
|
||||||
|
806 R Walking Ballista @Daniel Ljunggren
|
||||||
835 M Kibo, Uktabi Prince @Filipe Pagliuso
|
835 M Kibo, Uktabi Prince @Filipe Pagliuso
|
||||||
|
|||||||
@@ -36,3 +36,4 @@ ScryfallCode=SLC
|
|||||||
2020 R Shark Typhoon @Edgar Sánchez Hidalgo
|
2020 R Shark Typhoon @Edgar Sánchez Hidalgo
|
||||||
2021 R Elite Spellbinder @Alexis Ziritt
|
2021 R Elite Spellbinder @Alexis Ziritt
|
||||||
2022 M Nashi, Moon Sage's Scion @Death Burger
|
2022 M Nashi, Moon Sage's Scion @Death Burger
|
||||||
|
2023 M Lotus Field @ZIUK
|
||||||
|
|||||||
7
forge-gui/res/tokenscripts/zeppelin.txt
Normal file
7
forge-gui/res/tokenscripts/zeppelin.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Name:Zeppelin
|
||||||
|
ManaCost:no cost
|
||||||
|
Types:Artifact Creature
|
||||||
|
PT:5/5
|
||||||
|
K:Flying
|
||||||
|
K:Crew:3
|
||||||
|
Oracle:Flying\nCrew 3.
|
||||||
@@ -64,8 +64,8 @@ public abstract class InputSelectManyBase<T extends GameEntity> extends InputSyn
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void showMessage() {
|
public final void showMessage() {
|
||||||
if ( FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) &&
|
if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) &&
|
||||||
(card!=null) ) {
|
card != null) {
|
||||||
final StringBuilder sb = new StringBuilder();
|
final StringBuilder sb = new StringBuilder();
|
||||||
sb.append(card.toString());
|
sb.append(card.toString());
|
||||||
if ( (sa != null) && (!sa.toString().isEmpty()) ) { // some spell abilities have no useful string value
|
if ( (sa != null) && (!sa.toString().isEmpty()) ) { // some spell abilities have no useful string value
|
||||||
|
|||||||
@@ -743,13 +743,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
|
|||||||
switch (sa.getParam("ShowCardInPrompt")) {
|
switch (sa.getParam("ShowCardInPrompt")) {
|
||||||
case "FirstRemembered":
|
case "FirstRemembered":
|
||||||
o = sa.getHostCard().getFirstRemembered();
|
o = sa.getHostCard().getFirstRemembered();
|
||||||
if (o != null && o instanceof Card) {
|
if (o instanceof Card) {
|
||||||
show = (Card)o;
|
show = (Card)o;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "LastRemembered":
|
case "LastRemembered":
|
||||||
o = sa.getHostCard().getFirstRemembered();
|
o = sa.getHostCard().getFirstRemembered();
|
||||||
if (o != null && o instanceof Card) {
|
if (o instanceof Card) {
|
||||||
show = (Card)o;
|
show = (Card)o;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user