Merge branch 'master' into 'german-translation'

# Conflicts:
#   forge-gui/res/languages/de-DE.properties
This commit is contained in:
Dagin Svezek
2020-01-02 12:23:37 +00:00
139 changed files with 1117 additions and 585 deletions

View File

@@ -24,7 +24,7 @@ public class AbandonEffect extends SpellAbilityEffect {
Player controller = source.getController();
boolean isOptional = sa.hasParam("Optional");
if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblWouldYoulikeAbandon") + " " + source + "?")) {
if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblWouldYoulikeAbandonConfirm", source.toString()))) {
return;
}

View File

@@ -62,7 +62,7 @@ public class AddTurnEffect extends SpellAbilityEffect {
extra.setCantSetSchemesInMotion(true);
}
if (sa.hasParam("ShowMessage")) {
p.getGame().getAction().nofityOfValue(sa, p, p + " " + Localizer.getInstance().getMessage("lblTakesExtraTurn"), null);
p.getGame().getAction().nofityOfValue(sa, p, Localizer.getInstance().getMessage("lblPlayerTakesExtraTurn", p.toString()), null);
}
}
}

View File

@@ -50,7 +50,7 @@ public class AssignGroupEffect extends SpellAbilityEffect {
Multimap<SpellAbility, GameObject> result = ArrayListMultimap.create();
for (GameObject g : defined) {
final String title = Localizer.getInstance().getMessage("lblChooseAbilityFor") + " " + g.toString();
final String title = Localizer.getInstance().getMessage("lblChooseAbilityForObject", g.toString());
Map<String, Object> params = Maps.newHashMap();
params.put("Affected", g);

View File

@@ -61,7 +61,7 @@ public class AttachEffect extends SpellAbilityEffect {
// If Cast Targets will be checked on the Stack
for (final Card attachment : attachments) {
String message = Localizer.getInstance().getMessage("lblDoYouWantAttach") + " " + attachment + " " + Localizer.getInstance().getMessage("lblTo") + " " + attachTo + "?";
String message = Localizer.getInstance().getMessage("lblDoYouWantAttachSourceToTarget", attachment.toString(), attachTo.toString());
if ( sa.hasParam("Optional") && !p.getController().confirmAction(sa, null, message) )
continue;
handleAttachment(attachment, attachTo, sa);
@@ -174,7 +174,7 @@ public class AttachEffect extends SpellAbilityEffect {
players.add(player);
}
}
final Player pa = p.getController().chooseSingleEntityForEffect(players, aura, source + " - " + Localizer.getInstance().getMessage("lblSelectAPlayerAttachTo"));
final Player pa = p.getController().chooseSingleEntityForEffect(players, aura, Localizer.getInstance().getMessage("lblSelectAPlayerAttachSourceTo", source.toString()));
if (pa != null) {
handleAura(source, pa);
return true;
@@ -187,7 +187,7 @@ public class AttachEffect extends SpellAbilityEffect {
return false;
}
final Card o = p.getController().chooseSingleEntityForEffect(list, aura, source + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo"));
final Card o = p.getController().chooseSingleEntityForEffect(list, aura, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", source.toString()));
if (o != null) {
handleAura(source, o);
//source.enchantEntity((Card) o);

View File

@@ -60,7 +60,7 @@ public class BidLifeEffect extends SpellAbilityEffect {
if (result) { // a different choose number
bid += p.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblBidLife") + ":", 1, 9);
winner = p;
host.getGame().getAction().nofityOfValue(sa, p, Localizer.getInstance().getMessage("lblTopBidWith") + " " + bid + " " + Localizer.getInstance().getMessage("lbllife"), p);
host.getGame().getAction().nofityOfValue(sa, p, Localizer.getInstance().getMessage("lblTopBidWithValueLife", String.valueOf(bid)), p);
}
}
}

View File

@@ -45,7 +45,7 @@ public class ChangeCombatantsEffect extends SpellAbilityEffect {
final GameEntity originalDefender = combat.getDefenderByAttacker(c);
final FCollectionView<GameEntity> defs = combat.getDefenders();
final GameEntity defender = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(defs, sa,
Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c, false);
Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", c.toString()), false);
if (originalDefender != null && !originalDefender.equals(defender)) {
AttackingBand ab = combat.getBandOfAttacker(c);
if (ab != null) {

View File

@@ -51,8 +51,8 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
// Redirect rules read 'you MAY choose new targets' ... okay!
// TODO: Don't even ask to change targets, if the SA and subs don't actually have targets
boolean isOptional = sa.hasParam("Optional");
if (isOptional && !chooser.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantChangeTargets") + " " + tgtSA.getHostCard() + "?")) {
continue;
if (isOptional && !chooser.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantChangeAbilityTargets", tgtSA.getHostCard().toString()))) {
continue;
}
if (changesOneTarget) {
// 1. choose a target of target spell

View File

@@ -99,19 +99,9 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
final String targets = Lang.joinHomogenous(cards);
final String message;
if (sa.hasParam("OptionQuestion")) {
message = TextUtil.fastReplace(sa.getParam("OptionQuestion"), "TARGETS", targets);
message = TextUtil.fastReplace(sa.getParam("OptionQuestion"), "TARGETS", targets);
} else {
final StringBuilder sb = new StringBuilder();
sb.append(Localizer.getInstance().getMessage("lblMove") + " ");
sb.append(targets);
sb.append(" " + Localizer.getInstance().getMessage("lblFrom") + " ");
sb.append(Lang.joinHomogenous(origin));
sb.append(" " + Localizer.getInstance().getMessage("lblTo") + " ");
sb.append(destination);
sb.append("?");
message = sb.toString();
message = Localizer.getInstance().getMessage("lblMoveTargetFromOriginToDestination", targets, Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME), destination.toString());
}
if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, message)) {

View File

@@ -440,7 +440,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
hostCard.addRemembered(CardUtil.getLKICopy(tgtC));
}
final String prompt = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantMove"), tgtC.toString(), Localizer.getInstance().getMessage("lblFrom"), origin.toString(), Localizer.getInstance().getMessage("lblTo"), TextUtil.addSuffix(destination.toString(),"?"));
final String prompt = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantMoveTargetFromOriToDest", tgtC.toString(), origin.toString(), destination.toString()));
if (optional && !player.getController().confirmAction(sa, null, prompt) )
continue;
@@ -504,7 +504,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AttachedTo"), tgtC.getController(), tgtC);
}
if (!list.isEmpty()) {
Card attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo"));
Card attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", tgtC.toString()));
tgtC.attachToEntity(attachedTo);
} else { // When it should enter the battlefield attached to an illegal permanent it fails
continue;
@@ -514,7 +514,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (sa.hasParam("AttachedToPlayer")) {
FCollectionView<Player> list = AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("AttachedToPlayer"), sa);
if (!list.isEmpty()) {
Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - " + Localizer.getInstance().getMessage("lblSelectAPlayerAttachTo"));
Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectAPlayerAttachSourceTo", tgtC.toString()));
tgtC.attachToEntity(attachedTo);
}
else { // When it should enter the battlefield attached to an illegal player it fails
@@ -561,7 +561,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
}
} else {
defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblDeclareDefenderFor") + " " + movedCard );
defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblDeclareDefenderForCard", movedCard.toString()));
}
if (defender != null) {
combat.addAttacker(movedCard, defender);
@@ -750,7 +750,14 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
final boolean optional = sa.hasParam("Optional");
if (optional) {
String message = MessageUtil.formatMessage(defined ? Localizer.getInstance().getMessage("lblPutThatCardFrom") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase() + " " + Localizer.getInstance().getMessage("lblTo") + " " + destination.name().toLowerCase() : Localizer.getInstance().getMessage("lblSearch") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase() + "?", decider, player);
String prompt;
if (defined) {
prompt = Localizer.getInstance().getMessage("lblPutThatCardFromPlayerOriginToDestination", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase(), destination.name().toLowerCase());
}
else {
prompt = Localizer.getInstance().getMessage("lblSearchPlayerZoneConfirm", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase());
}
String message = MessageUtil.formatMessage(prompt , decider, player);
if (!decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneGeneral, message)) {
return;
}
@@ -822,7 +829,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
continue;
}
SpellAbility tgtSA = decider.getController().getAbilityToPlay(tgtCard, sas);
if (!decider.getController().confirmAction(tgtSA, null, Localizer.getInstance().getMessage("lblDoYouWantPlay") + " " + tgtCard + "?")) {
if (!decider.getController().confirmAction(tgtSA, null, Localizer.getInstance().getMessage("lblDoYouWantPlayCard", tgtCard.toString()))) {
continue;
}
// if played, that card cannot be found
@@ -854,7 +861,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
final boolean champion = sa.hasParam("Champion");
final boolean forget = sa.hasParam("ForgetChanged");
final boolean imprint = sa.hasParam("Imprint");
String selectPrompt = sa.hasParam("SelectPrompt") ? sa.getParam("SelectPrompt") : MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardFrom") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player);
String selectPrompt = sa.hasParam("SelectPrompt") ? sa.getParam("SelectPrompt") : MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardFromPlayerZone", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase()), decider, player);
final String totalcmc = sa.getParam("WithTotalCMC");
int totcmc = AbilityUtils.calculateAmount(source, totalcmc, sa);
@@ -867,9 +874,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (! sa.hasParam("SelectPrompt")) {
// new default messaging for multi select
if (fetchList.size() > changeNum) {
selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectUpTo") + " " + changeNum + " " + Localizer.getInstance().getMessage("lblCardsFrom") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player);
//Select up to %changeNum cards from %players %origin
selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectUpToNumCardFromPlayerZone", String.valueOf(changeNum), "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase()), decider, player);
} else {
selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardsFrom") + " {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player);
selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardsFromPlayerZone", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase()), decider, player);
}
}
// ensure that selection is within maximum allowed changeNum
@@ -931,7 +939,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (c == null) {
final int num = Math.min(fetchList.size(), changeNum - i);
String message = Localizer.getInstance().getMessage("lblCancelSearchUpTo") + " " + num + " " + Localizer.getInstance().getMessage("lblMoreCard") + (num != 1 ? "s" : "") + " " + Localizer.getInstance().getMessage("lblCanBeSelected");
String message = Localizer.getInstance().getMessage("lblCancelSearchUpToSelectNumCards", String.valueOf(num));
if (fetchList.isEmpty() || decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneGeneral, message)) {
break;
@@ -1002,7 +1010,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (!list.isEmpty()) {
Card attachedTo = null;
if (list.size() > 1) {
attachedTo = decider.getController().chooseSingleEntityForEffect(list, sa, c + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo"));
attachedTo = decider.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", c.toString()));
}
else {
attachedTo = list.get(0);
@@ -1020,7 +1028,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (sa.hasParam("AttachedToPlayer")) {
FCollectionView<Player> list = AbilityUtils.getDefinedPlayers(source, sa.getParam("AttachedToPlayer"), sa);
if (!list.isEmpty()) {
Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, c + " - " + Localizer.getInstance().getMessage("lblSelectAPlayerAttachTo"));
Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", c.toString()));
c.attachToEntity(attachedTo);
}
else { // When it should enter the battlefield attached to an illegal permanent it fails
@@ -1043,7 +1051,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
}
} else {
defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblDeclareDefenderFor") + " " + c );
defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblDeclareDefenderForCard", c.toString()));
}
if (defender != null) {
combat.addAttacker(c, defender);

View File

@@ -83,7 +83,7 @@ public class ChooseCardEffect extends SpellAbilityEffect {
for (final String type : CardType.getBasicTypes()) {
final CardCollectionView cl = CardLists.getType(land, type);
if (!cl.isEmpty()) {
final String prompt = "Choose " + Lang.nounWithAmount(1, type);
final String prompt = Localizer.getInstance().getMessage("lblChoose") + " " + Lang.nounWithAmount(1, type);
Card c = p.getController().chooseSingleEntityForEffect(cl, sa, prompt, false);
if (c != null) {
chosen.add(c);
@@ -99,8 +99,8 @@ public class ChooseCardEffect extends SpellAbilityEffect {
int chosenP = 0;
while (!creature.isEmpty()) {
Card c = p.getController().chooseSingleEntityForEffect(creature, sa,
Localizer.getInstance().getMessage("lblSelectCreatureWithTotalPowerLessOrEqualTo") + " " + (totP - chosenP - negativeNum)
+ "\r\n(" + Localizer.getInstance().getMessage("lblSelected") + ":" + chosenPool + ")\r\n(" + Localizer.getInstance().getMessage("lblTotalPower") + ": " + chosenP + ")", chosenP <= totP);
Localizer.getInstance().getMessage("lblSelectCreatureWithTotalPowerLessOrEqualToNum", (totP - chosenP - negativeNum))
+ "\r\n(" + Localizer.getInstance().getMessage("lblSelected") + ":" + chosenPool + ")\r\n(" + Localizer.getInstance().getMessage("lblTotalPowerNum", chosenP) + ")", chosenP <= totP);
if (c == null) {
if (p.getController().confirmAction(sa, PlayerActionConfirmMode.OptionalChoose, Localizer.getInstance().getMessage("lblCancelChooseConfirm"))) {
break;

View File

@@ -104,7 +104,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect {
} else {
// use CardFace because you might name a alternate name
//"name a card" in mtg card oracle text is "choose a card name",change text
final String message = validDesc.equals("card") ? Localizer.getInstance().getMessage("lblChooseACardName") : Localizer.getInstance().getMessage("lblChooseA") + validDesc + Localizer.getInstance().getMessage("lblCardName") + ".";
final String message = validDesc.equals("card") ? Localizer.getInstance().getMessage("lblChooseACardName") : Localizer.getInstance().getMessage("lblChooseASpecificCard", validDesc);
Predicate<ICardFace> cpp = Predicates.alwaysTrue();
if (sa.hasParam("ValidCards")) {
@@ -116,7 +116,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect {
host.setNamedCard(chosen);
if(!randomChoice) {
p.getGame().getAction().nofityOfValue(sa, host, p.getName() + " " + Localizer.getInstance().getMessage("lblPicked") + " " + chosen, p);
p.getGame().getAction().nofityOfValue(sa, host, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), chosen), p);
p.setNamedCard(chosen);
}
}

View File

@@ -50,27 +50,25 @@ public class ChooseColorEffect extends SpellAbilityEffect {
List<String> chosenColors;
int cntMin = sa.hasParam("TwoColors") ? 2 : 1;
int cntMax = sa.hasParam("TwoColors") ? 2 : sa.hasParam("OrColors") ? colorChoices.size() : 1;
String prompt;
String prompt = null;
if (cntMax == 1) {
prompt = Localizer.getInstance().getMessage("lblChooseAColor");
}
else {
prompt = Localizer.getInstance().getMessage("lblChoose") + " " + Lang.getNumeral(cntMin);
if (cntMax > cntMin) {
if (cntMax >= MagicColor.NUMBER_OR_COLORS) {
prompt += " " + Localizer.getInstance().getMessage("lblOrMore");
} else {
prompt += " " + Localizer.getInstance().getMessage("lblTo") + " " + Lang.getNumeral(cntMax);
}
if (cntMax >= MagicColor.NUMBER_OR_COLORS) {
prompt = Localizer.getInstance().getMessage("lblAtLastChooseNumColors", Lang.getNumeral(cntMin));
} else {
prompt = Localizer.getInstance().getMessage("lblChooseSpecifiedRangeColors", Lang.getNumeral(cntMin), Lang.getNumeral(cntMax));
}
}
prompt += " " + Localizer.getInstance().getMessage("lblColors");
}
chosenColors = p.getController().chooseColors(prompt, sa, cntMin, cntMax, colorChoices);
if (chosenColors.isEmpty()) {
return;
}
card.setChosenColors(chosenColors);
p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " " + Localizer.getInstance().getMessage("lblPicked") + " " + Lang.joinHomogenous(chosenColors), p);
p.getGame().getAction().nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), Lang.joinHomogenous(chosenColors)), p);
}
}
}

View File

@@ -73,7 +73,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect {
card.setChosenNumber(chosen);
}
if (sa.hasParam("Notify")) {
p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " " + Localizer.getInstance().getMessage("lblPicked") + " " + chosen, p);
p.getGame().getAction().nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), chosen), p);
}
}
}
@@ -86,7 +86,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect {
for (Entry<Player, Integer> ev : chooseMap.entrySet()) {
int num = ev.getValue();
Player player = ev.getKey();
sb.append(player).append(" " + Localizer.getInstance().getMessage("lblChose") + " ").append(num);
sb.append(Localizer.getInstance().getMessage("lblPlayerChoseNum", player.getName(), String.valueOf(num)));
sb.append("\r\n");
if (num > highest) {
highestNum.clear();

View File

@@ -94,7 +94,7 @@ public class CloneEffect extends SpellAbilityEffect {
}
final boolean optional = sa.hasParam("Optional");
if (optional && !host.getController().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantCopy") + " " + cardToCopy + "?")) {
if (optional && !host.getController().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantCopyCard", cardToCopy))) {
return;
}

View File

@@ -228,7 +228,7 @@ public class ControlGainEffect extends SpellAbilityEffect {
final FCollectionView<GameEntity> e = combat.getDefenders();
final GameEntity defender = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(e, sa,
Localizer.getInstance().getMessage("lblDeclareDefenderFor") + " " + tgtC);
Localizer.getInstance().getMessage("lblDeclareDefenderForCard", tgtC.toString()));
if (defender != null) {
combat.addAttacker(tgtC, defender);

View File

@@ -207,12 +207,12 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
GameEntity defender;
if ("True".equals(attacked)) {
FCollectionView<GameEntity> defs = game.getCombat().getDefenders();
defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c, false);
defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", c.toString()), false);
} else {
defender = AbilityUtils.getDefinedPlayers(host, sa.getParam("CopyAttacking"), sa).get(0);
if (sa.hasParam("ChoosePlayerOrPlaneswalker") && defender != null) {
FCollectionView<GameEntity> defs = game.getCombat().getDefendersControlledBy((Player) defender);
defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c + " {" + Localizer.getInstance().getMessage("lblDefender") + ": " + defender + "}", false);
defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", c.toString()) + " {" + Localizer.getInstance().getMessage("lblDefender") + ": " + defender + "}", false);
}
}
game.getCombat().addAttacker(copyInPlay, defender);
@@ -244,7 +244,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
list = CardLists.getValidCards(list, sa.getParam("AttachedTo"), copyInPlay.getController(), copyInPlay);
}
if (!list.isEmpty()) {
Card attachedTo = activator.getController().chooseSingleEntityForEffect(list, sa, copyInPlay + " - " + Localizer.getInstance().getMessage("lblSelectACardAttachTo"));
Card attachedTo = activator.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", copyInPlay.toString()));
copyInPlay.attachToEntity(attachedTo);
} else {

View File

@@ -67,7 +67,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
}
boolean isOptional = sa.hasParam("Optional");
if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantCopyTheSpell") + " " + card + "?")) {
if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantCopyTheSpell", card.toString()))) {
return;
}
@@ -85,7 +85,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
final int spellCount = Integer.parseInt(sa.getParam("CopyMultipleSpells"));
for (int multi = 0; multi < spellCount && !tgtSpells.isEmpty(); multi++) {
String prompt = Localizer.getInstance().getMessage("lblSelectMultiSpellCopyToStack").replace("%d", Lang.getOrdinal(multi + 1));
String prompt = Localizer.getInstance().getMessage("lblSelectMultiSpellCopyToStack", Lang.getOrdinal(multi + 1));
SpellAbility chosen = controller.getController().chooseSingleSpellForEffect(tgtSpells, sa, prompt,
ImmutableMap.of());
SpellAbility copiedSpell = CardFactory.copySpellAbilityAndPossiblyHost(card, chosen.getHostCard(), chosen, true);

View File

@@ -110,11 +110,7 @@ public class CountersMoveEffect extends SpellAbilityEffect {
// only select cards if the counterNum is any
if (counterNum.equals("Any")) {
StringBuilder sb = new StringBuilder();
sb.append(Localizer.getInstance().getMessage("lblChooseTakeCountersCard").replace("%s", cType.getName()));
srcCards = player.getController().chooseCardsForEffect(srcCards, sa, sb.toString(), 0, srcCards.size(), true);
srcCards = player.getController().chooseCardsForEffect(srcCards, sa, Localizer.getInstance().getMessage("lblChooseTakeCountersCard", cType.getName()), 0, srcCards.size(), true);
}
for (Card src : srcCards) {
@@ -136,10 +132,7 @@ public class CountersMoveEffect extends SpellAbilityEffect {
params.put("CounterType", cType);
params.put("Source", src);
params.put("Target", dest);
StringBuilder sb = new StringBuilder();
sb.append(Localizer.getInstance().getMessage("lblTakeHowMany") + " ").append(cType.getName());
sb.append(" " + Localizer.getInstance().getMessage("lblCountersFrom") + " ").append(src).append("?");
cnum = player.getController().chooseNumber(sa, sb.toString(), 0, cmax, params);
cnum = player.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblTakeHowManyTargetCounterFromCard", cType.getName(), src.toString()), 0, cmax, params);
} else {
cnum = AbilityUtils.calculateAmount(host, counterNum, sa);
}
@@ -173,12 +166,8 @@ public class CountersMoveEffect extends SpellAbilityEffect {
tgtCards = CardLists.getValidCards(tgtCards, sa.getParam("ValidDefined"), player, host, sa);
if (counterNum.equals("Any")) {
StringBuilder sb = new StringBuilder();
sb.append(Localizer.getInstance().getMessage("lblChooseCardToGet") + " ").append(cType.getName());
sb.append(" " + Localizer.getInstance().getMessage("lblCountersFrom") + " ").append(source).append(".");
tgtCards = player.getController().chooseCardsForEffect(
tgtCards, sa, sb.toString(), 0, tgtCards.size(), true);
tgtCards = player.getController().chooseCardsForEffect(tgtCards, sa,
Localizer.getInstance().getMessage("lblChooseCardToGetCountersFrom", cType.getName(), source.toString()), 0, tgtCards.size(), true);
}
boolean updateSource = false;
@@ -202,9 +191,7 @@ public class CountersMoveEffect extends SpellAbilityEffect {
params.put("CounterType", cType);
params.put("Source", source);
params.put("Target", cur);
StringBuilder sb = new StringBuilder();
sb.append(Localizer.getInstance().getMessage("lblPutHowMany") + " ").append(cType.getName()).append(" " + Localizer.getInstance().getMessage("lblCountersOn") + " ").append(cur).append("?");
int cnum = player.getController().chooseNumber(sa, sb.toString(), 0, source.getCounters(cType), params);
int cnum = player.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblPutHowManyTargetCounterOnCard", cType.getName(), cur.toString()), 0, source.getCounters(cType), params);
if (cnum > 0) {
source.subtractCounter(cType, cnum);
@@ -262,10 +249,7 @@ public class CountersMoveEffect extends SpellAbilityEffect {
params.put("CounterType", cType);
params.put("Source", source);
params.put("Target", cur);
StringBuilder sb = new StringBuilder();
sb.append(Localizer.getInstance().getMessage("lblTakeHowMany") + " ").append(cType.getName());
sb.append(" " + Localizer.getInstance().getMessage("lblCountersFrom") + " ").append(source).append("?");
cntToMove = pc.chooseNumber(sa, sb.toString(), 0, cntToMove, params);
cntToMove = pc.chooseNumber(sa, Localizer.getInstance().getMessage("lblTakeHowManyTargetCounterFromCard", cType.getName(), source.toString()), 0, cntToMove, params);
}
if (source.getCounters(cType) >= cntToMove) {
@@ -298,10 +282,8 @@ public class CountersMoveEffect extends SpellAbilityEffect {
params.put("CounterType", chosenType);
params.put("Source", source);
params.put("Target", dest);
StringBuilder sb = new StringBuilder();
sb.append(Localizer.getInstance().getMessage("lblTakeHowMany") + " ").append(chosenType.getName()).append(" " + Localizer.getInstance().getMessage("lblCounters") + "?");
int chosenAmount = pc.chooseNumber(
sa, sb.toString(), 0, Math.min(tgtCounters.get(chosenType), cntToMove), params);
int chosenAmount = pc.chooseNumber(sa, Localizer.getInstance().getMessage("lblTakeHowManyTargetCounters", chosenType.getName()),
0, Math.min(tgtCounters.get(chosenType), cntToMove), params);
if (chosenAmount > 0) {
dest.addCounter(chosenType, chosenAmount, player, true, table);

View File

@@ -236,7 +236,7 @@ public class CountersPutEffect extends SpellAbilityEffect {
continue;
}
String message = Localizer.getInstance().getMessage("lblDoYouWantPutTargetP1P1CountersOn").replace("%d", String.valueOf(counterAmount)) + " " + gameCard + " ?";
String message = Localizer.getInstance().getMessage("lblDoYouWantPutTargetP1P1CountersOnCard", String.valueOf(counterAmount), gameCard.toString());
Player chooser = pc.chooseSingleEntityForEffect(activator.getOpponents(), sa, Localizer.getInstance().getMessage("lblChooseAnOpponent"));
if (chooser.getController().confirmAction(sa, PlayerActionConfirmMode.Tribute, message)) {

View File

@@ -102,7 +102,7 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect {
CounterType chosenType = pc.chooseCounterType(list, sa, prompt, params);
params.put("CounterType", chosenType);
prompt = Localizer.getInstance().getMessage("lblWhatToDoWithTargetCounter").replace("%s", chosenType.getName()) + " ";
prompt = Localizer.getInstance().getMessage("lblWhatToDoWithTargetCounter", chosenType.getName()) + " ";
Boolean putCounter = pc.chooseBinary(sa, prompt, BinaryChoiceType.AddOrRemove, params);
if (putCounter) {

View File

@@ -130,10 +130,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
srcCards = game.getCardsIn(ZoneType.Battlefield);
srcCards = CardLists.getValidCards(srcCards, sa.getParam("ValidSource"), player, card, sa);
if (num.equals("Any")) {
StringBuilder sb = new StringBuilder();
sb.append(Localizer.getInstance().getMessage("lblChooseCardtoTakeTargetCounters").replace("%s", counterType.getName()));
srcCards = player.getController().chooseCardsForEffect(srcCards, sa, sb.toString(), 0, srcCards.size(), true);
srcCards = player.getController().chooseCardsForEffect(srcCards, sa, Localizer.getInstance().getMessage("lblChooseCardsToTakeTargetCounters", counterType.getName()), 0, srcCards.size(), true);
}
} else {
srcCards = getTargetCards(sa);
@@ -173,7 +170,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
Map<String, Object> params = Maps.newHashMap();
params.put("Target", gameCard);
params.put("CounterType", type);
String title = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget").replace("%s", type);
String title = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget", type);
cntToRemove = pc.chooseNumber(sa, title, 0, cntToRemove, params);
}
@@ -217,7 +214,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
String prompt = Localizer.getInstance().getMessage("lblSelectCountersTypeToRemove");
CounterType chosenType = pc.chooseCounterType(
ImmutableList.copyOf(tgtCounters.keySet()), sa, prompt, params);
prompt = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget").replace("%s", chosenType.getName());
prompt = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget", chosenType.getName());
int max = Math.min(cntToRemove, tgtCounters.get(chosenType));
params = Maps.newHashMap();
params.put("Target", entity);

View File

@@ -84,7 +84,7 @@ public class DamageDealEffect extends DamageBaseEffect {
List<GameObject> tgts = getTargets(sa);
if (sa.hasParam("OptionalDecider")) {
Player decider = Iterables.getFirst(AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("OptionalDecider"), sa), null);
if (decider != null && !decider.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantDealTargetDamageTo").replace("%d", String.valueOf(dmg)) + " " + tgts + " ?")) {
if (decider != null && !decider.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantDealTargetDamageToTarget", String.valueOf(dmg), tgts.toString()))) {
return;
}
}

View File

@@ -222,17 +222,17 @@ public class DigEffect extends SpellAbilityEffect {
}
chooser.getController().endTempShowCards();
if (!movedCards.isEmpty()) {
game.getAction().reveal(movedCards, chooser, true, chooser + " " + Localizer.getInstance().getMessage("lblPicked") + " ");
game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedChosen", chooser.getName(), ""));
}
}
else if (allButOne) {
movedCards = new CardCollection(valid);
String prompt;
if (destZone2.equals(ZoneType.Library) && libraryPosition2 == 0) {
prompt = Localizer.getInstance().getMessage("lblChooseACardToLeaveTargetLibraryTop").replace("%s", "{player's}");
prompt = Localizer.getInstance().getMessage("lblChooseACardToLeaveTargetLibraryTop", "{player's}");
}
else {
prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTarget").replace("%s", "{player's}") + " " + destZone2.name();
prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTargetZone", "{player's}", destZone2.getTranslatedName());
}
Card chosen = chooser.getController().chooseSingleEntityForEffect(valid, delayedReveal, sa, prompt, false, p);
@@ -246,12 +246,12 @@ public class DigEffect extends SpellAbilityEffect {
if (sa.hasParam("PrimaryPrompt")) {
prompt = sa.getParam("PrimaryPrompt");
} else {
prompt = Localizer.getInstance().getMessage("lblChooseCardsPutInto") + " " + destZone1.name();
prompt = Localizer.getInstance().getMessage("lblChooseCardsPutIntoZone", destZone1.getTranslatedName());
if (destZone1.equals(ZoneType.Library)) {
if (libraryPosition == -1) {
prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayBottom").replace("%s", "{player's}");
prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayBottom", "{player's}");
} else if (libraryPosition == 0) {
prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayTop").replace("%s", "{player's}");
prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayTop", "{player's}");
}
}
}
@@ -276,10 +276,7 @@ public class DigEffect extends SpellAbilityEffect {
}
if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) {
game.getAction().reveal(movedCards, chooser, true,
chooser + " " + Localizer.getInstance().getMessage("lblPicked") + " " +
(movedCards.size() == 1 ? Localizer.getInstance().getMessage("lblThisCard") : Localizer.getInstance().getMessage("lblTheseCards")) +
" " + Localizer.getInstance().getMessage("lblFrom") + " ");
game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedCardFrom", chooser.getName()));
}
}
if (sa.hasParam("ForgetOtherRemembered")) {

View File

@@ -82,8 +82,7 @@ public class DigMultipleEffect extends SpellAbilityEffect {
CardCollection chosen = chooser.getController().chooseCardsForEffectMultiple(validMap, sa, Localizer.getInstance().getMessage("lblChooseCards"));
if (!chosen.isEmpty()) {
game.getAction().reveal(chosen, chooser, true,
chooser + " " + Localizer.getInstance().getMessage("lblPicked") + " " + (chosen.size() == 1 ? Localizer.getInstance().getMessage("lblThisCard") : Localizer.getInstance().getMessage("lblTheseCards")) + " " + Localizer.getInstance().getMessage("lblFrom") + " ");
game.getAction().reveal(chosen, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedCardFrom", chooser.getName()));
}
for (Card c : chosen) {

View File

@@ -160,7 +160,7 @@ public class DigUntilEffect extends SpellAbilityEffect {
final Card c = itr.next();
final ZoneType origin = c.getZone().getZoneType();
if (optionalFound && !p.getController().confirmAction(sa, null,
Localizer.getInstance().getMessage("lblDoYouWantPutCardTo") + " " + foundDest.name() + "?")) {
Localizer.getInstance().getMessage("lblDoYouWantPutCardToZone", foundDest.getTranslatedName()))) {
continue;
} else {
Card m = null;

View File

@@ -206,7 +206,7 @@ public class DiscardEffect extends SpellAbilityEffect {
if (!p.canDiscardBy(sa)) {
continue;
}
String message = Localizer.getInstance().getMessage("lblWouldYouLikeRandomDiscardTargetCard").replace("%d", String.valueOf(numCards));
String message = Localizer.getInstance().getMessage("lblWouldYouLikeRandomDiscardTargetCard", String.valueOf(numCards));
boolean runDiscard = !sa.hasParam("Optional") || p.getController().confirmAction(sa, PlayerActionConfirmMode.Random, message);
if (runDiscard) {
@@ -326,8 +326,7 @@ public class DiscardEffect extends SpellAbilityEffect {
}
if (mode.startsWith("Reveal") ) {
p.getController().reveal(toBeDiscarded, ZoneType.Hand, p,
chooser + " " + Localizer.getInstance().getMessage("lblHasChosen") + " " + (toBeDiscarded.size() == 1 ? Localizer.getInstance().getMessage("lblThisCard") : Localizer.getInstance().getMessage("lblTheseCards")) + " " + Localizer.getInstance().getMessage("lblFrom") + " ");
p.getController().reveal(toBeDiscarded, ZoneType.Hand, p, Localizer.getInstance().getMessage("lblPlayerHasChosenCardsFrom", chooser.getName()));
}
for (Card card : toBeDiscarded) {
if (card == null) { continue; }

View File

@@ -50,7 +50,7 @@ public class DrawEffect extends SpellAbilityEffect {
for (final Player p : getDefinedPlayersOrTargeted(sa)) {
if ((tgt == null) || p.canBeTargetedBy(sa))
if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDraw") + " " + Lang.nounWithAmount(numCards, " card") + "?"))
if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDrawCards", Lang.nounWithAmount(numCards, " card"))))
continue;
int actualNum = numCards;

View File

@@ -45,9 +45,7 @@ public class EncodeEffect extends SpellAbilityEffect {
// Handle choice of whether or not to encoded
final StringBuilder sb = new StringBuilder();
sb.append(Localizer.getInstance().getMessage("lblDoYouWantExile") + " ").append(host).append(" " + Localizer.getInstance().getMessage("lblAndEncodeOntoAYouControlCreature"));
if (!player.getController().confirmAction(sa, null, sb.toString())) {
if (!player.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantExileCardAndEncodeOntoYouCreature", host.toString()))) {
return;
}
@@ -58,11 +56,11 @@ public class EncodeEffect extends SpellAbilityEffect {
Card choice = player.getController().chooseSingleEntityForEffect(choices, sa, Localizer.getInstance().getMessage("lblChooseACreatureYouControlToEncode") + " ", true);
if (choice == null) {
return;
return;
}
StringBuilder codeLog = new StringBuilder();
codeLog.append(Localizer.getInstance().getMessage("lblEncoding") + " ").append(host.toString()).append(" " + Localizer.getInstance().getMessage("lblTo") + " ").append(choice.toString());
codeLog.append("Encoding ").append(host.toString()).append(" to ").append(choice.toString());
game.getGameLog().add(GameLogEntryType.STACK_RESOLVE, codeLog.toString());
// store hostcard in encoded array

View File

@@ -112,7 +112,7 @@ public class ManaEffect extends SpellAbilityEffect {
return;
}
game.action.nofityOfValue(sa, card, activator + " " + Localizer.getInstance().getMessage("lblPicked") + " " + choiceString, activator);
game.action.nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", activator.getName(), choiceString), activator);
abMana.setExpressChoice(choiceString.toString());
}
}
@@ -142,7 +142,7 @@ public class ManaEffect extends SpellAbilityEffect {
}
choice = MagicColor.toShortString(val);
game.action.nofityOfValue(sa, card, act + " " + Localizer.getInstance().getMessage("lblPicked") + " " + choice, act);
game.action.nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", act.getName(), choice), act);
abMana.setExpressChoice(choice);
}
}
@@ -173,7 +173,7 @@ public class ManaEffect extends SpellAbilityEffect {
if (cs.isMonoColor())
sb.append(MagicColor.toShortString(s.getColorMask()));
else /* (cs.isMulticolor()) */ {
byte chosenColor = sa.getActivatingPlayer().getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFrom") + " " + s.toString(), sa, cs);
byte chosenColor = sa.getActivatingPlayer().getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
sb.append(MagicColor.toShortString(chosenColor));
}
}

View File

@@ -40,7 +40,7 @@ public class MillEffect extends SpellAbilityEffect {
for (final Player p : getTargetPlayers(sa)) {
if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) {
if (sa.hasParam("Optional")) {
final String prompt = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantPutLibraryCardsTo"), TextUtil.addSuffix(destination.toString(),"?"));
final String prompt = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantPutLibraryCardsTo", destination.getTranslatedName()));
if (!p.getController().confirmAction(sa, null, prompt)) {
continue;
}

View File

@@ -86,7 +86,7 @@ public class MultiplePilesEffect extends SpellAbilityEffect {
for (int i = 1; i < piles; i++) {
int size = pool.size();
CardCollectionView pile = p.getController().chooseCardsForEffect(pool, sa, Localizer.getInstance().getMessage("lblChooseCardsInPile") + " " + i, 0, size, false);
CardCollectionView pile = p.getController().chooseCardsForEffect(pool, sa, Localizer.getInstance().getMessage("lblChooseCardsInTargetPile", String.valueOf(i)), 0, size, false);
pileList.add(pile);
pool.removeAll(pile);
}

View File

@@ -3,7 +3,6 @@ package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.List;
import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicate;
@@ -163,7 +162,7 @@ public class PlayEffect extends SpellAbilityEffect {
game.getAction().revealTo(tgtCard, activator);
}
if (optional && !controller.getController().confirmAction(sa, null, TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantPlay"), TextUtil.addSuffix(tgtCard.toString(),"?")))) {
if (optional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantPlayCard", tgtCard.toString()))) {
if (wasFaceDown) {
tgtCard.turnFaceDownNoUpdate();
}

View File

@@ -328,7 +328,7 @@ public class PumpEffect extends SpellAbilityEffect {
final String targets = Lang.joinHomogenous(tgtCards);
final String message = sa.hasParam("OptionQuestion")
? TextUtil.fastReplace(sa.getParam("OptionQuestion"), "TARGETS", targets)
: TextUtil.concatNoSpace(Localizer.getInstance().getMessage("lblApplyPumpTo") + " ", targets, "?");
: Localizer.getInstance().getMessage("lblApplyPumpToTarget", targets);
if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, message)) {
return;

View File

@@ -26,7 +26,7 @@ public class RollPlanarDiceEffect extends SpellAbilityEffect {
game.getPhaseHandler().incPlanarDiceRolledthisTurn();
}
PlanarDice result = PlanarDice.roll(activator, null);
String message = activator.getName() + " " + Localizer.getInstance().getMessage("lblRolled") + " " + result.toString();
String message = Localizer.getInstance().getMessage("lblPlayerRolledResult", activator.getName(), result.toString());
game.getAction().nofityOfValue(sa, activator, message, null);
}

View File

@@ -18,14 +18,14 @@ public class RunSVarAbilityEffect extends SpellAbilityEffect {
String sVars = sa.getParam("SVars");
List<Card> cards = getTargetCards(sa);
if (sVars == null || cards.isEmpty()) {
return;
return;
}
List<SpellAbility> validSA = new ArrayList<>();
final boolean isTrigger = sa.hasParam("IsTrigger");
for (final Card tgtC : cards) {
if (!tgtC.hasSVar(sVars)) {
continue;
}
continue;
}
final SpellAbility actualSA = AbilityFactory.getAbility(tgtC.getSVar(sVars), tgtC);
actualSA.setTrigger(isTrigger);
actualSA.setActivatingPlayer(sa.getActivatingPlayer());

View File

@@ -157,21 +157,21 @@ public class SacrificeEffect extends SpellAbilityEffect {
game.getTriggerHandler().runTrigger(TriggerType.Exploited, runParams, false);
}
if (wasDestroyed || wasSacrificed) {
countSacrificed++;
if (remSacrificed) {
card.addRemembered(lKICopy);
}
countSacrificed++;
if (remSacrificed) {
card.addRemembered(lKICopy);
}
}
}
}
if (remSVar != null) {
card.setSVar(remSVar, String.valueOf(countSacrificed));
SpellAbility root = sa;
do {
root.setSVar(remSVar, String.valueOf(countSacrificed));
root = root.getSubAbility();
} while (root != null);
card.setSVar(remSVar, String.valueOf(countSacrificed));
SpellAbility root = sa;
do {
root.setSVar(remSVar, String.valueOf(countSacrificed));
root = root.getSubAbility();
} while (root != null);
}
}
@@ -194,10 +194,10 @@ public class SacrificeEffect extends SpellAbilityEffect {
final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), num, sa);
if (valid.equals("Self")) {
sb.append(Localizer.getInstance().getMessage("lblSacrifice") + " ").append(sa.getHostCard().toString());
sb.append("Sacrifices ").append(sa.getHostCard().toString());
} else if (valid.equals("Card.AttachedBy")) {
final Card toSac = sa.getHostCard().getEnchantingCard();
sb.append(toSac.getController()).append(" " + Localizer.getInstance().getMessage("lblSacrifice") + " ").append(toSac).append(".");
sb.append(toSac.getController()).append(" Sacrifices ").append(toSac).append(".");
} else {
for (final Player p : tgts) {
sb.append(p.getName()).append(" ");
@@ -209,9 +209,9 @@ public class SacrificeEffect extends SpellAbilityEffect {
}
if (sa.hasParam("Destroy")) {
sb.append(Localizer.getInstance().getMessage("lblDestroys") + " ");
sb.append("Destroys ");
} else {
sb.append(Localizer.getInstance().getMessage("lblSacrifice") + " ");
sb.append("Sacrifices ");
}
sb.append(amount).append(" ").append(msg).append(".");
}

View File

@@ -42,10 +42,10 @@ public class ScryEffect extends SpellAbilityEffect {
// Optional here for spells that have optional multi-player scrying
for (final Player p : getTargetPlayers(sa)) {
if ( (!sa.usesTargeting() || p.canBeTargetedBy(sa)) &&
(!isOptional || p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWanttoScry"))) ) {
players.add(p);
}
if ( (!sa.usesTargeting() || p.canBeTargetedBy(sa)) &&
(!isOptional || p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWanttoScry"))) ) {
players.add(p);
}
}
sa.getActivatingPlayer().getGame().getAction().scry(players, num, sa);
}

View File

@@ -21,7 +21,7 @@ public class ShuffleEffect extends SpellAbilityEffect {
for (final Player p : tgtPlayers) {
if ((tgt == null) || p.canBeTargetedBy(sa)) {
boolean mustShuffle = !optional || sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblHaveTargetShuffle").replace("%s", p + ""));
boolean mustShuffle = !optional || sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblHaveTargetShuffle", p.getName()));
if (mustShuffle)
p.shuffle(sa);
}

View File

@@ -39,7 +39,7 @@ public class TapOrUntapEffect extends SpellAbilityEffect {
for (final Card tgtC : tgtCards) {
if (tgtC.isInPlay() && ((tgt == null) || tgtC.canBeTargetedBy(sa))) {
// If the effected card is controlled by the same controller of the SA, default to untap.
boolean tap = pc.chooseBinary(sa, Localizer.getInstance().getMessage("lblTapOrUntap") + " " + tgtC + "?", PlayerController.BinaryChoiceType.TapOrUntap,
boolean tap = pc.chooseBinary(sa, Localizer.getInstance().getMessage("lblTapOrUntapTarget", tgtC), PlayerController.BinaryChoiceType.TapOrUntap,
!tgtC.getController().equals(sa.getActivatingPlayer()) );
if (tap) {

View File

@@ -480,7 +480,7 @@ public class TokenEffect extends SpellAbilityEffect {
// into battlefield attacking only should work if you are the attacking player
if (combat.getAttackingPlayer().equals(controller)) {
final FCollectionView<GameEntity> defs = combat.getDefenders();
final GameEntity defender = controller.getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWith") + " " + c, false);
final GameEntity defender = controller.getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", c.toString()), false);
combat.addAttacker(c, defender);
combatChanged = true;
}

View File

@@ -875,7 +875,7 @@ public class CardFactory {
}
}
if (sa.hasParam("GainTextOf")) {
if (sa.hasParam("GainTextOf") && originalState != null) {
state.setSetCode(originalState.getSetCode());
state.setRarity(originalState.getRarity());
state.setImageKey(originalState.getImageKey());

View File

@@ -1,32 +1,38 @@
package forge.game.zone;
import forge.util.Localizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.common.base.Function;
/**
* The Enum Zone.
*/
public enum ZoneType {
Hand(true),
Library(true),
Graveyard(false),
Battlefield(false),
Exile(false),
Flashback(false),
Command(false),
Stack(false),
Sideboard(true),
Ante(false),
SchemeDeck(true),
PlanarDeck(true),
None(true);
Hand(true, Localizer.getInstance().getMessage("lblHandZone")),
Library(true, Localizer.getInstance().getMessage("lblLibraryZone")),
Graveyard(false, Localizer.getInstance().getMessage("lblGraveyardZone")),
Battlefield(false, Localizer.getInstance().getMessage("lblBattlefieldZone")),
Exile(false, Localizer.getInstance().getMessage("lblExileZone")),
Flashback(false, Localizer.getInstance().getMessage("lblFlashbackZone")),
Command(false, Localizer.getInstance().getMessage("lblCommandZone")),
Stack(false, Localizer.getInstance().getMessage("lblStackZone")),
Sideboard(true, Localizer.getInstance().getMessage("lblSideboardZone")),
Ante(false, Localizer.getInstance().getMessage("lblAnteZone")),
SchemeDeck(true, Localizer.getInstance().getMessage("lblSchemeDeckZone")),
PlanarDeck(true, Localizer.getInstance().getMessage("lblPlanarDeckZone")),
None(true, Localizer.getInstance().getMessage("lblNoneZone"));
public static final List<ZoneType> STATIC_ABILITIES_SOURCE_ZONES = Arrays.asList(Battlefield, Graveyard, Exile, Command/*, Hand*/);
private final boolean holdsHiddenInfo;
ZoneType(boolean holdsHidden) {
private final String zoneName;
ZoneType(boolean holdsHidden, String name) {
holdsHiddenInfo = holdsHidden;
zoneName = name;
}
public static ZoneType smartValueOf(final String value) {
@@ -64,6 +70,10 @@ public enum ZoneType {
return !holdsHiddenInfo;
}
public String getTranslatedName() {
return zoneName;
}
public static boolean isHidden(final String origin) {
List<ZoneType> zone = ZoneType.listValueOf(origin);
@@ -82,4 +92,13 @@ public enum ZoneType {
public static boolean isKnown(final String origin) {
return !isHidden(origin);
}
public static class Accessors {
public static Function<ZoneType, String> GET_TRANSLATED_NAME = new Function<ZoneType, String>() {
@Override
public String apply(final ZoneType arg0) {
return arg0.getTranslatedName();
}
};
}
}

View File

@@ -19,6 +19,7 @@ mcrawford620
Meerkov
Myrd
nefigah
Northmoc
OgreBattlecruiser
pfps
Ryan1729

View File

@@ -2,7 +2,7 @@ Name:Ajani's Aid
ManaCost:2 G W
Types:Enchantment
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Valiant Protector, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedAjani; Valiant Protector | ChangeNum$ 1 | Optional$ True
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedAjani; Valiant Protector | ChangeNum$ 1 | Optional$ True
A:AB$ ChooseCard | Cost$ Sac<1/CARDNAME> | Choices$ Creature | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SVars$ DBEffect | RememberChosen$ True | SpellDescription$ Prevent all combat damage a creature of your choice would deal this turn.
SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | RememberObjects$ Remembered | SVars$ RPreventNextFromSource | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1
SVar:RPreventNextFromSource:Event$ DamageDone | CombatDamage$ True | ValidSource$ Card.IsRemembered | Prevent$ True | PreventionEffect$ True | Description$ Prevent all combat damage a creature of your choice would deal this turn.

View File

@@ -3,7 +3,7 @@ ManaCost:3 B R
Types:Sorcery
A:SP$ Destroy | Cost$ 3 B R | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBDealDamage | SpellDescription$ Destroy target creature. CARDNAME deals 3 damage to target player or planeswalker. You may search your library and/or graveyard for a card named Angrath, Minotaur Pirate, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 3 | SubAbility$ DBSearch
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedAngrath; Minotaur Pirate | ChangeNum$ 1 | Optional$ True
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedAngrath; Minotaur Pirate | ChangeNum$ 1 | Optional$ True
DeckNeeds:Name$Angrath, Minotaur Pirate
SVar:Picture:http://www.wizards.com/global/images/magic/general/angraths_fury.jpg
Oracle:Destroy target creature. Angrath's Fury deals 3 damage to target player or planeswalker. You may search your library and/or graveyard for a card named Angrath, Minotaur Pirate, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -2,6 +2,6 @@ Name:Chandra's Flame Wave
ManaCost:3 R R
Types:Sorcery
A:SP$ DamageAll | Cost$ 3 R R | ValidTgts$ Player | NumDmg$ 2 | ValidPlayers$ Targeted | ValidCards$ Creature.TargetedPlayerCtrl | ValidDescription$ target player and each creature that player controls. | SubAbility$ DBSearch | SpellDescription$ CARDNAME deals 2 damage to target player and each creature that player controls. Search your library and/or graveyard for a card named Chandra, Flame's Fury, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedChandra; Flame's Fury | ChangeNum$ 1 | Optional$ True
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedChandra; Flame's Fury | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Chandra, Flame's Fury
Oracle:Chandra's Flame Wave deals 2 damage to target player and each creature that player controls. Search your library and/or graveyard for a card named Chandra, Flame's Fury, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -2,6 +2,6 @@ Name:Chandra's Outburst
ManaCost:3 R R
Types:Sorcery
A:SP$ DealDamage | Cost$ 3 R R | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 4 | SubAbility$ DBSearch | SpellDescription$ CARDNAME deals 4 damage to target player or planeswalker.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedChandra; Bold Pyromancer | ChangeNum$ 1
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedChandra; Bold Pyromancer | ChangeNum$ 1
DeckNeeds:Name$Chandra, Bold Pyromancer
Oracle:Chandra's Outburst deals 4 damage to target player or planeswalker.\nSearch your library and/or graveyard for a card named Chandra, Bold Pyromancer, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -4,6 +4,6 @@ Types:Creature Beast
PT:5/2
K:Trample
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDomri; City Smasher | ChangeNum$ 1 | Optional$ True
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedDomri; City Smasher | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Domri, City Smasher
Oracle:Trample\nWhen Domri's Nodorog enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -2,6 +2,6 @@ Name:Dovin's Dismissal
ManaCost:2 W U
Types:Instant
A:SP$ ChangeZone | Cost$ 2 W U | ValidTgts$ Creature.tapped | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target tapped creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SubAbility$ DBSearch | SpellDescription$ Put up to one target tapped creature on top of its owner's library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDovin; Architect of Law | ChangeNum$ 1 | Optional$ True
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedDovin; Architect of Law | ChangeNum$ 1 | Optional$ True
DeckNeeds:Name$Dovin, Architect of Law
Oracle:Put up to one target tapped creature on top of its owner's library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -4,6 +4,6 @@ Types:Creature Elk Spirit
PT:3/3
K:Trample
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Vivien, Nature's Avenger, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedVivien; Nature's Avenger | ChangeNum$ 1 | Optional$ True
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedVivien; Nature's Avenger | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Vivien, Nature's Avenger
Oracle:Trample\nWhen Ethereal Elk enters the battlefield, you may search your library and/or graveyard for a card named Vivien, Nature's Avenger, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -2,7 +2,7 @@ Name:Gideon's Battle Cry
ManaCost:2 W W
Types:Sorcery
A:SP$ PutCounterAll | Cost$ 2 W W | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBSearch | SpellDescription$ Put a +1/+1 counter on each creature you control.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedGideon; the Oathsworn | ChangeNum$ 1
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedGideon; the Oathsworn | ChangeNum$ 1 | Optional$ True
DeckHas:Ability$Counters
DeckHints:Name$Gideon, the Oathsworn
Oracle:Put a +1/+1 counter on each creature you control. You may search your library and/or graveyard for a card named Gideon, the Oathsworn, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -2,7 +2,7 @@ Name:Gideon's Resolve
ManaCost:4 W
Types:Enchantment
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Gideon, Martial Paragon, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedGideon; Martial Paragon | ChangeNum$ 1 | Optional$ True
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedGideon; Martial Paragon | ChangeNum$ 1 | Optional$ True
S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures you control get +1/+1.
SVar:PlayMain1:TRUE
DeckHints:Name$Gideon, Martial Paragon

View File

@@ -2,9 +2,9 @@ Name:Goblin Goon
ManaCost:3 R
Types:Creature Goblin Mutant
PT:6/6
S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ CARDNAME can't attack. & CARDNAME can't block. | CheckSVar$ X | SVarCompare$ LEY | Description$ CARDNAME can't attack unless you control more creatures than defending player. CARDNAME can't block unless you control more creatures than attacking player.
S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefender$ hasFewerCreaturesInPlayThanYou | Description$ CARDNAME can't attack unless you control more creatures than defending player.
S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't block. | CheckSVar$ Y | SVarCompare$ GEX | Description$ CARDNAME can't block unless you control more creatures than attacking player.
SVar:X:Count$Valid Creature.YouCtrl
SVar:Y:Count$Valid Creature.YouDontCtrl
SVar:Y:Count$Valid Creature.ActivePlayerCtrl
SVar:BuffedBy:Creature
SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_goon.jpg
Oracle:Goblin Goon can't attack unless you control more creatures than defending player.\nGoblin Goon can't block unless you control more creatures than attacking player.

View File

@@ -5,6 +5,6 @@ PT:3/2
K:Flying
K:Vigilance
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Valiant it, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedAjani; Inspiring Leader | ChangeNum$ 1 | Optional$ True
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedAjani; Inspiring Leader | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Ajani, Inspiring Leader
Oracle:Flying, vigilance\nWhen Goldmane Griffin enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Inspiring Leader, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -2,7 +2,7 @@ Name:Grasping Current
ManaCost:4 U
Types:Sorcery
A:SP$ ChangeZone | Cost$ 4 U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return up to two target creatures to their owner's hand.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedJace; Ingenious Mind-Mage | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, and put it into your hand. If you searched your library this way, shuffle it.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedJace; Ingenious Mind-Mage | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, and put it into your hand. If you searched your library this way, shuffle it.
DeckHints:Name$Jace, Ingenious Mind-Mage
SVar:Picture:http://www.wizards.com/global/images/magic/general/grasping_current.jpg
Oracle:Return up to two target creatures to their owner's hand.\nSearch your library and/or graveyard for a card named Jace, Ingenious Mind-Mage, reveal it, and put it into your hand. If you searched your library this way, shuffle it.

View File

@@ -2,6 +2,6 @@ Name:Jace's Ruse
ManaCost:3 U U
Types:Sorcery
A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return up to two target creatures to their owner's hand. You may search your library and/or graveyard for a card named Jace, Arcane Wizards, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:DBSearch:DB$ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedJace; Arcane Strategist | ChangeNum$ 1 | Optional$ True
SVar:DBSearch:DB$ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedJace; Arcane Strategist | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Jace, Arcane Strategist
Oracle:Return up to two target creatures to their owner's hand. You may search your library and/or graveyard for a card named Jace, Arcane Strategist, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -2,7 +2,7 @@ Name:Liberating Combustion
ManaCost:4 R
Types:Sorcery
A:SP$ DealDamage | Cost$ 4 R | ValidTgts$ Creature | NumDmg$ 6 | SubAbility$ DBSearch | SpellDescription$ CARDNAME deals 6 damage to target creature. You may search your library and/or graveyard for a card named Chandra, Pyrogenius, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedChandra; Pyrogenius | ChangeNum$ 1 | Optional$ True
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedChandra; Pyrogenius | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Chandra, Pyrogenius
SVar:Picture:http://www.wizards.com/global/images/magic/general/liberating_combustion.jpg
Oracle:Liberating Combustion deals 6 damage to target creature. You may search your library and/or graveyard for a card named Chandra, Pyrogenius, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -2,7 +2,7 @@ Name:Liliana's Influence
ManaCost:4 B B
Types:Sorcery
A:SP$ PutCounterAll | Cost$ 4 B B | ValidCards$ Creature.YouDontCtrl | CounterType$ M1M1 | CounterNum$ 1 | SubAbility$ DBShuffle | IsCurse$ True | SubAbility$ DBSearch | SpellDescription$ Put a -1/-1 counter on each creature you don't control. You may search your library and/or graveyard for a card named Liliana, Death Wielder, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedLiliana; Death Wielder | ChangeNum$ 1 | Optional$ True
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedLiliana; Death Wielder | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Liliana, Death Wielder
SVar:Picture:http://www.wizards.com/global/images/magic/general/lilianas_influence.jpg
Oracle:Put a -1/-1 counter on each creature you don't control. You may search your library and/or graveyard for a card named Liliana, Death Wielder, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -2,9 +2,9 @@ Name:Mogg Toady
ManaCost:1 R
Types:Creature Goblin
PT:2/2
S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ CARDNAME can't attack. & CARDNAME can't block. | CheckSVar$ X | SVarCompare$ LEY | References$ X,Y | Description$ CARDNAME can't attack unless you control more creatures than defending player.CARDNAME can't block unless you control more creatures than attacking player.
S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefender$ hasFewerCreaturesInPlayThanYou | Description$ CARDNAME can't attack unless you control more creatures than defending player.
S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't block. | CheckSVar$ Y | SVarCompare$ GEX | Description$ CARDNAME can't block unless you control more creatures than attacking player.
SVar:X:Count$Valid Creature.YouCtrl
SVar:Y:Count$Valid Creature.YouDontCtrl
SVar:Y:Count$Valid Creature.ActivePlayerCtrl
SVar:BuffedBy:Creature
SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_toady.jpg
Oracle:Mogg Toady can't attack unless you control more creatures than defending player.\nMogg Toady can't block unless you control more creatures than attacking player.

View File

@@ -2,8 +2,8 @@ Name:Monstrous Hound
ManaCost:3 R
Types:Creature Hound
PT:4/4
S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ CARDNAME can't attack. & CARDNAME can't block. | CheckSVar$ X | SVarCompare$ LEY | References$ X,Y | Description$ CARDNAME can't attack unless you control more lands than defending player. CARDNAME can't block unless you control more lands than attacking player.
S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefender$ hasFewerLandsInPlayThanYou | Description$ CARDNAME cant attack unless you control more lands than defending player.
S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't block. | CheckSVar$ Y | SVarCompare$ GEX | Description$ CARDNAME can't block unless you control more lands than attacking player.
SVar:X:Count$Valid Land.YouCtrl
SVar:Y:Count$Valid Land.YouDontCtrl
SVar:Picture:http://www.wizards.com/global/images/magic/general/monstrous_hound.jpg
SVar:Y:Count$Valid Land.ActivePlayerCtrl
Oracle:Monstrous Hound can't attack unless you control more lands than defending player.\nMonstrous Hound can't block unless you control more lands than attacking player.

View File

@@ -3,6 +3,6 @@ ManaCost:1 W U
Types:Legendary Creature Human Cleric
PT:2/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Teferi, Timebender, reveal it, then put it into your hand. If you searched your library this way, shuffle it.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedTeferi; Timebender | ChangeNum$ 1 | Optional$ True
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedTeferi; Timebender | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Teferi, Timebender
Oracle:When Niambi, Faithful Healer enters the battlefield, you may search your library and/or graveyard for a card named Teferi, Timebender, reveal it, then put it into your hand. If you searched your library this way, shuffle it.

View File

@@ -2,6 +2,6 @@ Name:Oko's Hospitality
ManaCost:3 G U
Types:Instant
A:SP$ AnimateAll | Cost$ 3 G U | ValidCards$ Creature.YouCtrl | Power$ 3 | Toughness$ 3 | SubAbility$ DBSearch | SpellDescription$ Creatures you control have base power and toughness 3/3 until end of turn. You may search your library and/or graveyard for a card named Oko, the Trickster, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedOko; the Trickster | ChangeNum$ 1 | Optional$ True
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedOko; the Trickster | ChangeNum$ 1 | Optional$ True
DeckNeeds:Name$Oko, the Trickster
Oracle:Creatures you control have base power and toughness 3/3 until end of turn. You may search your library and/or graveyard for a card named Oko, the Trickster, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -2,6 +2,6 @@ Name:Ral's Dispersal
ManaCost:3 U U
Types:Instant
A:SP$ ChangeZone | Cost$ 3 U U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return target creature to its owner's hand. You may search you library and/or graveyard for a card named, Ral, Caller of Storms and put it in your hand. If you search your library this way, shuffle it.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedRal; Caller of Storms | ChangeNum$ 1 | Optional$ True
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedRal; Caller of Storms | ChangeNum$ 1 | Optional$ True
DeckNeeds:Name$Ral, Caller of Storms
Oracle:Return target creature to its owner's hand. You may search you library and/or graveyard for a card named Ral, Caller of Storms, reveal it, and put it in to your hand. If you search your library this way, shuffle it.

View File

@@ -2,6 +2,6 @@ Name:Rhythmic Water Vortex
ManaCost:3 U U
Types:Sorcery
A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return up to two target creatures to their owner's hand.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedMu Yanling | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Mu Yanling, reveal it, and put it into your hand. If you searched your library this way, shuffle it.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedMu Yanling | ChangeNum$ 1 | SpellDescription$ Search your library and/or graveyard for a card named Mu Yanling, reveal it, and put it into your hand. If you searched your library this way, shuffle it.
DeckHints:Name$Mu Yanling
Oracle:Return up to two target creatures to their owner's hand.\nSearch your library and/or graveyard for a card named Mu Yanling, reveal it, and put it into your hand. If you searched your library this way, shuffle it.

View File

@@ -3,6 +3,6 @@ ManaCost:4 R
Types:Creature Human Knight
PT:5/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Rowan, Fearless Sparkmage, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedRowan; Fearless Sparkmage | ChangeNum$ 1 | Optional$ True
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedRowan; Fearless Sparkmage | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Rowan, Fearless Sparkmage
Oracle:When Rowan's Stalwarts enters the battlefield, you may search your library and/or graveyard for a card named Rowan, Fearless Sparkmage, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -3,6 +3,6 @@ ManaCost:3 B B
Types:Creature Vampire
PT:4/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named flying, Vampire CARDNAME, and put it into your hand. If you search your library this way, shuffle it.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedSorin; Vampire Lord | ChangeNum$ 1 | Optional$ True
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedSorin; Vampire Lord | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Sorin, Vampire Lord
Oracle:When Sorin's Guide enters the battlefield, you may search your library and/or graveyard for a card named Sorin, Vampire Lord, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -3,7 +3,7 @@ ManaCost:3 R W
Types:Creature Dinosaur
PT:4/4
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Huatli, Dinosaur Knight, reveal it, then put it into your hand. If you search your library this way, shuffle it.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedHuatli; Dinosaur Knight | ChangeNum$ 1 | Optional$ True
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedHuatli; Dinosaur Knight | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Huatli, Dinosaur Knight
SVar:Picture:http://www.wizards.com/global/images/magic/general/sun_blessed_mount.jpg
Oracle:When Sun-Blessed Mount enters the battlefield, you may search your library and/or graveyard for a card named Huatli, Dinosaur Knight, reveal it, then put it into your hand. If you searched your library this way, shuffle it.

View File

@@ -2,7 +2,7 @@ Name:Tezzeret's Betrayal
ManaCost:3 U B
Types:Sorcery
A:SP$ Destroy | Cost$ 3 U B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBSearch | SpellDescription$ Destroy target creature. You may search your library and/or graveyard for a card named Tezzeret, Master of Metal, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedTezzeret; Master of Metal | ChangeNum$ 1 | Optional$ True
SVar:DBSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedTezzeret; Master of Metal | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Tezzeret, Master of Metal
SVar:Picture:http://www.wizards.com/global/images/magic/general/tezzerets_betrayal.jpg
Oracle:Destroy target creature. You may search your library and/or graveyard for a card named Tezzeret, Master of Metal, reveal it, and put it into your hand. If you search your library this way, shuffle it.

View File

@@ -1,7 +1,6 @@
Name:Underworld Dreams
ManaCost:B B B
Types:Enchantment
T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever an opponent draws a card, CARDNAME deals 1 damage to them.
T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever an opponent draws a card, CARDNAME deals 1 damage to that player.
SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredPlayer | NumDmg$ 1
SVar:Picture:http://www.wizards.com/global/images/magic/general/underworld_dreams.jpg
Oracle:Whenever an opponent draws a card, Underworld Dreams deals 1 damage to them.
Oracle:Whenever an opponent draws a card, Underworld Dreams deals 1 damage to that player.

View File

@@ -0,0 +1,8 @@
Name:Allure of the Unknown
ManaCost:3 B R
Types:Sorcery
A:SP$ ChoosePlayer | Cost$ 3 B R | Defined$ You | Choices$ Player.Opponent | SubAbility$ DBDig | ChoiceTitle$ Choose an opponent | SpellDescription$ Reveal the top six cards of your library. An opponent exiles a nonland card from among them, then you put the rest into your hand. That opponent may cast the exiled card without paying its mana cost. | StackDescription$ SpellDescription
SVar:DBDig:DB$ Dig | DigNum$ 6 | Reveal$ True | Choser$ Player.Chosen | ChangeNum$ 1 | ChangeValid$ Card.nonLand | AILogic$ BestCard | DestinationZone$ Exile | DestinationZone2$ Hand | RememberChanged$ True | SubAbility$ DBPlay
SVar:DBPlay:DB$ Play | WithoutManaCost$ True | Controller$ Player.Chosen | Optional$ True | OptionalDecider$ Player.Chosen | ValidZone$ Exile | Valid$ Card.IsRemembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenPlayer$ True
Oracle:Reveal the top six cards of your library. An opponent exiles a nonland card from among them, then you put the rest into your hand. That opponent may cast the exiled card without paying its mana cost.

View File

@@ -2,7 +2,7 @@ Name:Ashiok, Nightmare Muse
ManaCost:3 U B
Types:Legendary Planeswalker Ashiok
Loyalty:5
A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ ub_2_3_nightmare_mill | TokenOwner$ You | LegacyImage$ ub 2 3 Nightmare mill thb | SubAbility$ DBDraw | SpellDescription$ Create a 2/3 blue and black Nightmare creature token with "Whenever this creature attacks or blocks, each opponent exiles the top two cards of their library."
A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ ub_2_3_nightmare_mill | TokenOwner$ You | LegacyImage$ ub 2 3 Nightmare mill thb | SpellDescription$ Create a 2/3 blue and black Nightmare creature token with "Whenever this creature attacks or blocks, each opponent exiles the top two cards of their library."
A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBExile | SpellDescription$ Return target nonland permanent to its owners hand, then that player exiles a card from their hand.
SVar:DBExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | DefinedPlayer$ TargetedOwner | Chooser$ TargetedOwner
A:AB$ Play | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Valid$ Card.nonLand+faceUp+OwnedBy Player.Opponent | ValidZone$ Exile | WithoutManaCost$ True | Amount$ 3 | Optional$ True | SpellDescription$ You may cast up to three face-up cards your opponents own from exile without paying their mana costs.

View File

@@ -0,0 +1,9 @@
Name:Ashiok, Sculptor of Fears
ManaCost:4 U B
Types:Legendary Planeswalker Ashiok
Loyalty:4
A:AB$ Draw | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | NumCards$ 1 | SubAbility$ DBMill | SpellDescription$ Draw a card. Each player puts the top two cards of their library into their graveyard.
SVar:DBMill:DB$ Mill | Defined$ Player | NumCards$ 2
A:AB$ ChangeZone | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Select target creature card in a graveyard | ValidTgts$ Creature | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control.
A:AB$ GainControl | Cost$ SubCounter<11/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | AllValid$ Creature.TargetedPlayerCtrl | NewController$ You | StackDescription$ SpellDescription | SpellDescription$ Gain control of all creatures target opponent controls.
Oracle:+2: Draw a card. Each player puts the top two cards of their library into their graveyard.\n5: Put target creature card from a graveyard onto the battlefield under you control.\n11: Gain control of all creatures target opponent controls.

View File

@@ -0,0 +1,11 @@
Name:Chainweb Aracnir
ManaCost:G
Types:Creature Spider
PT:1/2
K:Reach
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals damage equal to its power to target creature with flying an opponent controls.
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl+withFlying | TgtPrompt$ Select target creature with flying an opponent controls | NumDmg$ X | References$ X
SVar:X:Count$CardPower
K:Escape:3 G G ExileFromGrave<4/Card.Other>
K:etbCounter:P1P1:3:ValidCard$ Card.Self+escaped:CARDNAME escapes with three +1/+1 counters on it.
Oracle:Reach\nWhen Chainweb Aracnir enters the battlefield, it deals damage equal to its power to target creature with flying an opponent controls.\nEscape — {2}{G}{G}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).\nChainweb Aracnir escapes with three +1/+1 counters on it.

View File

@@ -0,0 +1,5 @@
Name:Deathbellow War Cry
ManaCost:5 R R R
Types:Sorcery
A:SP$ ChangeZone | Cost$ 5 R R R | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.Minotaur | ChangeNum$ 4 | DifferentNames$ True | SpellDescription$ Search your library for up to four Minotaur creature cards with different names, put them onto the battlefield, then shuffle your library.
Oracle:Search your library for up to four Minotaur creature cards with different names, put them onto the battlefield, then shuffle your library.

View File

@@ -0,0 +1,10 @@
Name:Demon of Loathing
ManaCost:5 B B
Types:Creature Demon
PT:7/7
K:Flying
K:Trample
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player sacrifices a creature.
SVar:TrigSac:DB$Sacrifice | Defined$ TriggeredTarget | SacValid$ Creature
SVar:MustBeBlocked:True
Oracle:Flying, trample\nWhenever Demon of Loathing deals combat damage to a player, that player sacrifices a creature.

View File

@@ -0,0 +1,9 @@
Name:Elspeth, Sun's Nemesis
ManaCost:2 W W
Types:Legendary Planeswalker Elspeth
Loyalty:5
A:AB$ Pump | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ +2 | NumDef$ +1 | SpellDescription$ Up to two target creatures you control each get +2/+1 until end of turn.
A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 2 | TokenScript$ w_1_1_human_soldier | TokenOwner$ You | LegacyImage$ w 1 1 human soldier the | SpellDescription$ Create two 1/1 white Human Soldier creature tokens.
A:AB$ GainLife | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | Ultimate$ True | LifeAmount$ 5 | SpellDescription$ You gain 5 life.
K:Escape:4 W W ExileFromGrave<4/Card.Other>
Oracle:1: Up to two target creatures you control each get +2/+1 until end of turn.\n2: Create two 1/1 white Human Soldier creature tokens.\n3: You gain 5 life.\nEscape—{4}{W}{W}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost.)

View File

@@ -0,0 +1,11 @@
Name:Elspeth, Undaunted Hero
ManaCost:2 W W W
Types:Legendary Planeswalker Elspeth
Loyalty:5
A:AB$ PutCounter | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | CounterNum$ 1 | CounterType$ P1P1 | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creatures | SpellDescription$ Put a +1/+1 counter on each of up to two target creatures.
DeckHas:Ability$Counters
A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Battlefield | ChangeType$ Card.namedSunlit Hoplite | ChangeNum$ 1 | StackDescription$ SpellDescription |SpellDescription$ Search your library and/or graveyard for a card named Sunlit Hoplite and put it onto the battlefield. If you search your library this way, shuffle it.
DeckHints:Name$Sunlit Hoplite
A:AB$ PumpAll | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +X | NumDef$ +X | References$ X | KW$ Flying | SpellDescription$ Until end of turn, creatures you control gain flying and get +X/+X, where X is your devotion to white.
SVar:X:Count$Devotion.White
Oracle:+2: Put a +1/+1 counter on each of up to two target creatures.\n2: Search your library and/or graveyard for a card named Sunlit Hoplite and put it onto the battlefield. If you search your library this way, shuffle it.\n8: Until end of turn, creatures you control gain flying and get +X/+X, where X is your devotion to white.

View File

@@ -0,0 +1,6 @@
Name:Fruit of Tizerus
ManaCost:B
Types:Sorcery
A:SP$ LoseLife | Cost$ B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 2 | SpellDescription$ Target player loses 2 life.
K:Escape:3 B ExileFromGrave<3/Card.Other>
Oracle:Target player loses 2 life.\nEscape — {3}{B}, Exile three other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).

View File

@@ -0,0 +1,12 @@
Name:Gallia of the Endless Dance
ManaCost:R G
Types:Legendary Creature Satyr
PT:2/2
K:Haste
S:Mode$ Continuous | Affected$ Card.Satyr+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Haste | Description$ Other Satyrs you control get +1/+1 and have haste.
T:Mode$ AttackersDeclared | Execute$ TrigDiscard | CheckSVar$ AttackerCount | SVarCompare$ GE3 | NoResolvingCheck$ True | TriggerZones$ Battlefield | AttackingPlayer$ You | OptionalDecider$ You | TriggerDescription$ Whenever you attack with three or more creatures, you may discard a card at random. If you do, draw two cards.
SVar:AttackerCount:Count$Valid Creature.attacking
SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ Random | RememberDiscarded$ True | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Haste\nOther Satyrs you control get +1/+1 and have haste.\nWhenever you attack with three or more creatures, you may discard a card at random. If you do, draw two cards.

View File

@@ -0,0 +1,11 @@
Name:Grasping Giant
ManaCost:5 W
Types:Creature Giant
PT:5/7
K:Vigilance
T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, exile that creature until CARDNAME leaves the battlefield.
SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredBlocker | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigReturn | Secondary$ True | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, exile that creature until CARDNAME leaves the battlefield.
SVar:TrigReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Vigilance\nWhenever Grasping Giant becomes blocked by a creature, exile that creature until Grasping Giant leaves the battlefield.

View File

@@ -0,0 +1,9 @@
Name:Hero of the Winds
ManaCost:3 W
Types:Creature Human Soldier
PT:1/4
K:Flying
T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPumpAll | TriggerDescription$ Whenever you cast a spell that targets CARDNAME, creatures you control get +1/+0 until end of turn.
SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1
SVar:BuffedBy:Card
Oracle:Flying\nWhenever you cast a spell that targets Hero of the Winds, creatures you control get +1/+0 until end of turn.

View File

@@ -2,8 +2,8 @@ Name:Heroes of the Revel
ManaCost:4 R
Types:Creature Satyr Soldier
PT:4/4
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 2/2 red Satyr creature token with "This creature can't block."
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_2_2_satyr_noblock | TokenOwner$ You | LegacyImage$ r 2 2 satyr noblock thb
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 red Satyr creature token with "This creature can't block."
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_1_1_satyr_noblock | TokenOwner$ You | LegacyImage$ r 1 1 satyr noblock thb
T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a spell that targets CARDNAME, creatures you control get +1/+0 until end of turn.
SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1
Oracle:When Heroes of the Revel enters the battlefield, create a 2/2 red Satyr creature token with "This creature can't block."\nWhenever you cast a spell that targets Heroes of the Revel, creatures you control get +1/+0 until end of turn.
Oracle:When Heroes of the Revel enters the battlefield, create a 1/1 red Satyr creature token with "This creature can't block."\nWhenever you cast a spell that targets Heroes of the Revel, creatures you control get +1/+0 until end of turn.

View File

@@ -0,0 +1,7 @@
Name:Ironscale Hydra
ManaCost:3 G G
Types:Creature Hydra
PT:5/5
R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ValidSource$ Creature | IsCombat$ True | ReplaceWith$ Counters | Description$ If a creature would deal combat damage to CARDNAME, prevent that damage and put a +1/+1 counter on CARDNAME.
SVar:Counters:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
Oracle:If a creature would deal combat damage to Ironscale Hydra, prevent that damage and put a +1/+1 counter on Ironscale Hydra.

View File

@@ -0,0 +1,12 @@
Name:Medomai's Prophecy
ManaCost:1 U
Types:Enchantment Saga
K:Saga:4:DBScry,DBNameCard,DBEffect,DBLook
SVar:DBScry:DB$ Scry | ScryNum$ 2 | SpellDescription$ Scry 2.
SVar:DBNameCard:DB$ NameCard | SpellDescription$ Choose a card name.
SVar:DBEffect:DB$ Effect | Name$ Medomai's Prophecy Effect | Triggers$ NamedCardCast | SVars$ NamedCardCast,TrigDraw,ExileEffect | SpellDescription$ When you cast a spell with the chosen name for the first time this turn, draw two cards.
SVar:DBLook:DB$ Dig | Defined$ Player | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | SpellDescription$ Look at the top card of each player's library.
SVar:NamedCardCast:Mode$ SpellCast | ValidCard$ Card.NamedCard | ValidActivatingPlayer$ You | TriggerZones$ Command | Execute$ TrigDraw | TriggerDescription$ When you cast a spell with the chosen name for the first time this turn, draw two cards.
SVar:TrigDraw:DB$ Draw | NumCards$ 2 | SubAbility$ ExileEffect
SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after IV.)\nI — Scry 2.\nII — Choose a card name.\nIII — When you cast a spell with the chosen name for the first time this turn, draw two cards.\nIV - Look at the top card of each player's library.

View File

@@ -0,0 +1,6 @@
Name:Memory Drain
ManaCost:2 U U
Types:Instant
A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ DBScry | SpellDescription$ Counter target spell. Scry 2.
SVar:DBScry:DB$Scry | ScryNum$ 2
Oracle:Counter target spell. Scry 2.

View File

@@ -0,0 +1,10 @@
Name:Minion's Return
ManaCost:2 B
Types:Enchantment Aura
K:Flash
K:Enchant creature
A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AITgts$ Card.nonToken | AILogic$ Pump
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChange | TriggerDescription$ When enchanted creature dies, return that card to the battlefield under your control.
SVar:TrigChange:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Defined$ TriggeredCard
Oracle:Flash\nEnchant creature\nWhen enchanted creature dies, return that card to the battlefield under your control.

View File

@@ -0,0 +1,7 @@
Name:Mire's Grasp
ManaCost:1 B
Types:Enchantment Aura
K:Enchant creature
A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Curse
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -3 | AddToughness$ -3 | Description$ Enchanted creature gets -3/-3.
Oracle:Enchant creature\nEnchanted creature gets -3/-3.

View File

@@ -0,0 +1,6 @@
Name:Naiad of Hidden Coves
ManaCost:2 U
Types:Enchantment Creature Nymph
PT:2/3
S:Mode$ ReduceCost | Type$ Spell | Activator$ You | Amount$ 1 | Condition$ NotPlayerTurn | Description$ As long as it's not your turn, spells you cast cost {1} less to cast.
Oracle:As long as it's not your turn, spells you cast cost {1} less to cast.

View File

@@ -0,0 +1,8 @@
Name:Nylea's Huntmaster
ManaCost:3 G
Types:Creature Centaur Shaman
PT:4/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +X/+0 until end of turn, where X is your devotion to green. (Each {G} in the mana costs of permanents you control counts toward your devotion to green.)
SVar:TrigPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | References$ X
SVar:X:Count$Devotion.Green
Oracle:When Nylea's Huntmaster enters the battlefield, target creature gets +X/+0 until end of turn, where X is your devotion to green. (Each {G} in the mana costs of permanents you control counts toward your devotion to green.)

View File

@@ -0,0 +1,5 @@
Name:Nyxborn Brute
ManaCost:3 R R
Types:Enchantment Creature Cyclops
PT:7/3
Oracle:

View File

@@ -0,0 +1,5 @@
Name:Nyxborn Colossus
ManaCost:3 G G G
Types:Enchantment Creature Giant
PT:6/7
Oracle:

View File

@@ -0,0 +1,5 @@
Name:Nyxborn Courser
ManaCost:1 W W
Types:Enchantment Creature Centaur Scout
PT:2/4
Oracle:

View File

@@ -0,0 +1,5 @@
Name:Nyxborn Marauder
ManaCost:2 B B
Types:Enchantment Creature Minotaur
PT:4/3
Oracle:

View File

@@ -0,0 +1,5 @@
Name:Nyxborn Seaguard
ManaCost:2 U U
Types:Enchantment Creature Merfolk Soldier
PT:2/5
Oracle:

View File

@@ -0,0 +1,8 @@
Name:Omen of the Dead
ManaCost:B
Types:Enchantment
K:Flash
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return target creature card from your graveyard to your hand.
SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouCtrl
A:AB$ Scry | Cost$ 2 B Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2.
Oracle:Flash\nWhen Omen of the Dead enters the battlefield, return target creature card from your graveyard to your hand.\n{2}{B}, Sacrifice Omen of the Dead: Scry 2.

View File

@@ -0,0 +1,8 @@
Name:Omen of the Hunt
ManaCost:2 G
Types:Enchantment
K:Flash
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | ShuffleNonMandatory$ True
A:AB$ Scry | Cost$ 2 G Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2.
Oracle:Flash\nWhen Omen of the Hunt enters the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.\n{2}{G}, Sacrifice Omen of the Hunt: Scry 2.

View File

@@ -0,0 +1,9 @@
Name:Omen of the Sea
ManaCost:1 U
Types:Enchantment
K:Flash
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 2, then draw a card.
SVar:TrigScry:DB$ Scry | ScryNum$ 2 | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1
A:AB$ Scry | Cost$ 2 U Sac<1/CARDNAME> | ScryNum$ 2 | SpellDescription$ Scry 2.
Oracle:Flash\nWhen Omen of the Sea enters the battlefield, scry 2, then draw a card.\n{2}{U}, Sacrifice Omen of the Sea: Scry 2.

View File

@@ -0,0 +1,6 @@
Name:Phalanx Tactics
ManaCost:1 W
Types:Instant
A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +1 | TgtPrompt$ Select target creature you control | SubAbility$ DBPumpAll | SpellDescription$ Target creature you control gets +2/+1 until end of turn. Each other creature you control gets +1/+1 until end of turn.
SVar:DBPumpAll:DB$PumpAll | ValidCards$ Targeted.Other+YouCtrl+Creature | NumAtt$ +1 | NumDef$ +1
Oracle:Target creature you control gets +2/+1 until end of turn. Each other creature you control gets +1/+1 until end of turn.

View File

@@ -0,0 +1,7 @@
Name:Pious Wayfarer
ManaCost:W
Types:Creature Human Scout
PT:1/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, target creature gets +1/+1 until end of turn.
SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 1 | NumDef$ 1
Oracle:Constellation — Whenever an enchantment enters the battlefield under your control, target creature gets +1/+1 until end of turn.

View File

@@ -0,0 +1,7 @@
Name:Rage-Scarred Berserker
ManaCost:4 B
Types:Creature Minotaur Berserker
PT:5/4
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +1/+0 and gains indestructible until end of turn.
SVar:TrigPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | KW$ Indestructible
Oracle:When Rage-Scarred Berserker enters the battlefield, target creature gets +1/+0 and gains indestructible until end of turn.

Some files were not shown because too many files have changed in this diff Show More