diff --git a/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java index b6bf52a8478..7e41ba9618e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java @@ -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; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java index 9edf0d3ecbd..2a1353e03be 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java @@ -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); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java index 03a455900a3..1f392ec35c4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java @@ -50,7 +50,7 @@ public class AssignGroupEffect extends SpellAbilityEffect { Multimap 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 params = Maps.newHashMap(); params.put("Affected", g); diff --git a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java index 78b1b475dd8..4f805200be7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java @@ -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); diff --git a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java index 1468724219c..22391ec5f5d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java @@ -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); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java index 5f82bd43f42..5c2c5c254f4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java @@ -45,7 +45,7 @@ public class ChangeCombatantsEffect extends SpellAbilityEffect { final GameEntity originalDefender = combat.getDefenderByAttacker(c); final FCollectionView 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) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java index ee8c24184ff..d194043e9dc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java @@ -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 diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java index c14492ddc09..6f9af54a757 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java @@ -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)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 5bad714d73f..a27bc73f4ca 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -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 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 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); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java index 020ba61fbbb..2c13373cecc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java @@ -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; diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java index dd72c9835ea..9e2f06a8958 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java @@ -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 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); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java index 8d91adfaaaa..365cc2f862a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java @@ -50,27 +50,25 @@ public class ChooseColorEffect extends SpellAbilityEffect { List 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); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java index 63e5ae38259..d54b3579625 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java @@ -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 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(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index a06f15dbec5..2edf442ac8f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -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; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java index 74ce08933ea..ba781a3f6a7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java @@ -228,7 +228,7 @@ public class ControlGainEffect extends SpellAbilityEffect { final FCollectionView 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); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index ef0cabec2e8..5cf859810d2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -207,12 +207,12 @@ public class CopyPermanentEffect extends SpellAbilityEffect { GameEntity defender; if ("True".equals(attacked)) { FCollectionView 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 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 { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java index 2e5288996f0..4333aae28e3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java @@ -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); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java index d01f55be7ef..8bd8dd1fe81 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java @@ -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); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index bdb4eb95f3c..b4fd88d8ae5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -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)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java index b02f91f0c0d..61e89d134ec 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java @@ -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) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java index 7855b68162c..5698fb50bb0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java @@ -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 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); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index 0c537c98898..5ba5f4d8203 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -84,7 +84,7 @@ public class DamageDealEffect extends DamageBaseEffect { List 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; } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index 15099d80991..48569298711 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -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")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java index b7afd1cc9cb..dfeccc06ade 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java @@ -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) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java index 62b82dc6a44..b99c372277e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java @@ -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; diff --git a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java index a44f1c6c6ad..cff66313247 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java @@ -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; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java index 9684f09190f..c1912191dad 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java @@ -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; diff --git a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java index 550b77e7711..89b6344abdd 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java @@ -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 diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index a4812c22ddc..b55bcc90385 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -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)); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java index 8fb24cf9163..7b28f2427b4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java @@ -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; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java index 7bc72c9142e..ec3de6b43eb 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java @@ -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); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 9d65e3a36a5..49c1fceccc3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -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(); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 9d81c13e010..3f46f2aebd4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -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; diff --git a/forge-game/src/main/java/forge/game/ability/effects/RollPlanarDiceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RollPlanarDiceEffect.java index 5493a77bb34..6f71242efdd 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RollPlanarDiceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RollPlanarDiceEffect.java @@ -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); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java index e812e83a209..ab24cfa830d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RunSVarAbilityEffect.java @@ -18,14 +18,14 @@ public class RunSVarAbilityEffect extends SpellAbilityEffect { String sVars = sa.getParam("SVars"); List cards = getTargetCards(sa); if (sVars == null || cards.isEmpty()) { - return; + return; } List 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()); diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java index b5411646c17..f4a84e42a43 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java @@ -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("."); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java index aeb03cb8d95..a0436020c2f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java @@ -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); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java index 1b5b4514920..b774c93d2d2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java @@ -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); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapEffect.java index 872cb003a21..c70faeb6390 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapEffect.java @@ -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) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index 76dcdbbd966..38d780d8b9f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -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 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; } diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index f41e3542467..34aec26647b 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -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()); diff --git a/forge-game/src/main/java/forge/game/zone/ZoneType.java b/forge-game/src/main/java/forge/game/zone/ZoneType.java index 3383a83cb14..e9157309546 100644 --- a/forge-game/src/main/java/forge/game/zone/ZoneType.java +++ b/forge-game/src/main/java/forge/game/zone/ZoneType.java @@ -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 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 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 GET_TRANSLATED_NAME = new Function() { + @Override + public String apply(final ZoneType arg0) { + return arg0.getTranslatedName(); + } + }; + } } diff --git a/forge-gui/release-files/CONTRIBUTORS.txt b/forge-gui/release-files/CONTRIBUTORS.txt index e8072d2e3d0..ffae9fb7a4b 100644 --- a/forge-gui/release-files/CONTRIBUTORS.txt +++ b/forge-gui/release-files/CONTRIBUTORS.txt @@ -19,6 +19,7 @@ mcrawford620 Meerkov Myrd nefigah +Northmoc OgreBattlecruiser pfps Ryan1729 diff --git a/forge-gui/res/cardsfolder/a/ajanis_aid.txt b/forge-gui/res/cardsfolder/a/ajanis_aid.txt index 4aebeaab1a2..83422cc69d9 100644 --- a/forge-gui/res/cardsfolder/a/ajanis_aid.txt +++ b/forge-gui/res/cardsfolder/a/ajanis_aid.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/a/angraths_fury.txt b/forge-gui/res/cardsfolder/a/angraths_fury.txt index 54c273e75fc..32b96159103 100644 --- a/forge-gui/res/cardsfolder/a/angraths_fury.txt +++ b/forge-gui/res/cardsfolder/a/angraths_fury.txt @@ -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. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt b/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt index a1cb566e033..f71d13056ea 100644 --- a/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt +++ b/forge-gui/res/cardsfolder/c/chandras_flame_wave.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/c/chandras_outburst.txt b/forge-gui/res/cardsfolder/c/chandras_outburst.txt index 1f41bcb20f3..271a88857c9 100644 --- a/forge-gui/res/cardsfolder/c/chandras_outburst.txt +++ b/forge-gui/res/cardsfolder/c/chandras_outburst.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/d/domris_nodorog.txt b/forge-gui/res/cardsfolder/d/domris_nodorog.txt index 63564138bf9..2436b124fab 100644 --- a/forge-gui/res/cardsfolder/d/domris_nodorog.txt +++ b/forge-gui/res/cardsfolder/d/domris_nodorog.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/d/dovins_dismissal.txt b/forge-gui/res/cardsfolder/d/dovins_dismissal.txt index 4ad9b8a5e86..aa84261ae5e 100644 --- a/forge-gui/res/cardsfolder/d/dovins_dismissal.txt +++ b/forge-gui/res/cardsfolder/d/dovins_dismissal.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/e/ethereal_elk.txt b/forge-gui/res/cardsfolder/e/ethereal_elk.txt index 5796059969b..028212a92be 100644 --- a/forge-gui/res/cardsfolder/e/ethereal_elk.txt +++ b/forge-gui/res/cardsfolder/e/ethereal_elk.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt b/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt index 3b8fd338e99..d22c7e0ab6f 100644 --- a/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt +++ b/forge-gui/res/cardsfolder/g/gideons_battle_cry.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/g/gideons_resolve.txt b/forge-gui/res/cardsfolder/g/gideons_resolve.txt index 1ecc2aada69..0bfb6e097d0 100644 --- a/forge-gui/res/cardsfolder/g/gideons_resolve.txt +++ b/forge-gui/res/cardsfolder/g/gideons_resolve.txt @@ -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 diff --git a/forge-gui/res/cardsfolder/g/goblin_goon.txt b/forge-gui/res/cardsfolder/g/goblin_goon.txt index 9e033694361..2f4ed831921 100644 --- a/forge-gui/res/cardsfolder/g/goblin_goon.txt +++ b/forge-gui/res/cardsfolder/g/goblin_goon.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/g/goldmane_griffin.txt b/forge-gui/res/cardsfolder/g/goldmane_griffin.txt index 1eae39450c9..6d735cfb5fb 100644 --- a/forge-gui/res/cardsfolder/g/goldmane_griffin.txt +++ b/forge-gui/res/cardsfolder/g/goldmane_griffin.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/g/grasping_current.txt b/forge-gui/res/cardsfolder/g/grasping_current.txt index 479635023cb..71203a17db4 100644 --- a/forge-gui/res/cardsfolder/g/grasping_current.txt +++ b/forge-gui/res/cardsfolder/g/grasping_current.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/j/jaces_ruse.txt b/forge-gui/res/cardsfolder/j/jaces_ruse.txt index 72f07430c79..801cff7581e 100644 --- a/forge-gui/res/cardsfolder/j/jaces_ruse.txt +++ b/forge-gui/res/cardsfolder/j/jaces_ruse.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/l/liberating_combustion.txt b/forge-gui/res/cardsfolder/l/liberating_combustion.txt index 42d5557ff39..92cc21bd2c2 100644 --- a/forge-gui/res/cardsfolder/l/liberating_combustion.txt +++ b/forge-gui/res/cardsfolder/l/liberating_combustion.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/l/lilianas_influence.txt b/forge-gui/res/cardsfolder/l/lilianas_influence.txt index 2d313b13ae4..bbc9d2ec8e7 100644 --- a/forge-gui/res/cardsfolder/l/lilianas_influence.txt +++ b/forge-gui/res/cardsfolder/l/lilianas_influence.txt @@ -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. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/mogg_toady.txt b/forge-gui/res/cardsfolder/m/mogg_toady.txt index dae4a3a2d08..708375ed69d 100644 --- a/forge-gui/res/cardsfolder/m/mogg_toady.txt +++ b/forge-gui/res/cardsfolder/m/mogg_toady.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/m/monstrous_hound.txt b/forge-gui/res/cardsfolder/m/monstrous_hound.txt index 3f1660cd13e..1d1d9a05e88 100644 --- a/forge-gui/res/cardsfolder/m/monstrous_hound.txt +++ b/forge-gui/res/cardsfolder/m/monstrous_hound.txt @@ -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 can’t 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. diff --git a/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt b/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt index 93b157bafb4..02ccfd15ec4 100644 --- a/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt +++ b/forge-gui/res/cardsfolder/n/niambi_faithful_healer.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/o/okos_hospitality.txt b/forge-gui/res/cardsfolder/o/okos_hospitality.txt index 6551ca3c462..98b59ad20e7 100644 --- a/forge-gui/res/cardsfolder/o/okos_hospitality.txt +++ b/forge-gui/res/cardsfolder/o/okos_hospitality.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/r/rals_dispersal.txt b/forge-gui/res/cardsfolder/r/rals_dispersal.txt index bf091ea1034..0d0d0fd078e 100644 --- a/forge-gui/res/cardsfolder/r/rals_dispersal.txt +++ b/forge-gui/res/cardsfolder/r/rals_dispersal.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt b/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt index 1c919d8bbaa..e075fa4c0bf 100644 --- a/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt +++ b/forge-gui/res/cardsfolder/r/rhythmic_water_vortex.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt b/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt index e4c3dc1c89a..cb026f19367 100644 --- a/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt +++ b/forge-gui/res/cardsfolder/r/rowans_stalwarts.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/s/sorins_guide.txt b/forge-gui/res/cardsfolder/s/sorins_guide.txt index 97942b00ccf..c2d30694e37 100644 --- a/forge-gui/res/cardsfolder/s/sorins_guide.txt +++ b/forge-gui/res/cardsfolder/s/sorins_guide.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt b/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt index 4ff2711a72c..92a0b9dfde9 100644 --- a/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt +++ b/forge-gui/res/cardsfolder/s/sun_blessed_mount.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt b/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt index 7426200799b..c2852ea3c81 100644 --- a/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt +++ b/forge-gui/res/cardsfolder/t/tezzerets_betrayal.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/u/underworld_dreams.txt b/forge-gui/res/cardsfolder/u/underworld_dreams.txt index b4115b7fc64..9bdbfbe375d 100644 --- a/forge-gui/res/cardsfolder/u/underworld_dreams.txt +++ b/forge-gui/res/cardsfolder/u/underworld_dreams.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/allure_of_the_unknown.txt b/forge-gui/res/cardsfolder/upcoming/allure_of_the_unknown.txt new file mode 100644 index 00000000000..60aa94cafbc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/allure_of_the_unknown.txt @@ -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. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt b/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt index 3b301ba9849..448f20b4de4 100644 --- a/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt +++ b/forge-gui/res/cardsfolder/upcoming/ashiok_nightmare_muse.txt @@ -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 owner’s 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. diff --git a/forge-gui/res/cardsfolder/upcoming/ashiok_sculptor_of_fears.txt b/forge-gui/res/cardsfolder/upcoming/ashiok_sculptor_of_fears.txt new file mode 100755 index 00000000000..6e94b1c9366 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ashiok_sculptor_of_fears.txt @@ -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.\n−5: Put target creature card from a graveyard onto the battlefield under you control.\n−11: Gain control of all creatures target opponent controls. diff --git a/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt b/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt new file mode 100644 index 00000000000..11db7fd6bf0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chainweb_aracnir.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/deathbellow_war_cry.txt b/forge-gui/res/cardsfolder/upcoming/deathbellow_war_cry.txt new file mode 100644 index 00000000000..ae84aa2c002 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/deathbellow_war_cry.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/demon_of_loathing.txt b/forge-gui/res/cardsfolder/upcoming/demon_of_loathing.txt new file mode 100644 index 00000000000..1d5494b135b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/demon_of_loathing.txt @@ -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. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/elspeth_suns_nemesis.txt b/forge-gui/res/cardsfolder/upcoming/elspeth_suns_nemesis.txt new file mode 100755 index 00000000000..6a0a65454c8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/elspeth_suns_nemesis.txt @@ -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.\n−2: Create two 1/1 white Human Soldier creature tokens.\n−3: 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.) diff --git a/forge-gui/res/cardsfolder/upcoming/elspeth_undaunted_hero.txt b/forge-gui/res/cardsfolder/upcoming/elspeth_undaunted_hero.txt new file mode 100755 index 00000000000..b9ce2ca3763 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/elspeth_undaunted_hero.txt @@ -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.\n−2: 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.\n−8: Until end of turn, creatures you control gain flying and get +X/+X, where X is your devotion to white. diff --git a/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerus.txt b/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerus.txt new file mode 100644 index 00000000000..c8a9a620b7e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fruit_of_tizerus.txt @@ -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). diff --git a/forge-gui/res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt b/forge-gui/res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt new file mode 100644 index 00000000000..c96cca41d15 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gallia_of_the_endless_dance.txt @@ -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. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/grasping_giant.txt b/forge-gui/res/cardsfolder/upcoming/grasping_giant.txt new file mode 100644 index 00000000000..0fa57133606 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grasping_giant.txt @@ -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. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/hero_of_the_winds.txt b/forge-gui/res/cardsfolder/upcoming/hero_of_the_winds.txt new file mode 100755 index 00000000000..731fd1cddf7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hero_of_the_winds.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt b/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt index 136afb781dd..9543c304b34 100644 --- a/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt +++ b/forge-gui/res/cardsfolder/upcoming/heroes_of_the_revel.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt b/forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt new file mode 100644 index 00000000000..8f00b76e3d4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ironscale_hydra.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/medomais_prophecy.txt b/forge-gui/res/cardsfolder/upcoming/medomais_prophecy.txt new file mode 100644 index 00000000000..c57b689280b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/medomais_prophecy.txt @@ -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. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/memory_drain.txt b/forge-gui/res/cardsfolder/upcoming/memory_drain.txt new file mode 100755 index 00000000000..2744cacf801 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/memory_drain.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/minions_return.txt b/forge-gui/res/cardsfolder/upcoming/minions_return.txt new file mode 100644 index 00000000000..15aa8619e06 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/minions_return.txt @@ -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. + diff --git a/forge-gui/res/cardsfolder/upcoming/mires_grasp.txt b/forge-gui/res/cardsfolder/upcoming/mires_grasp.txt new file mode 100755 index 00000000000..1f1ffa2a267 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mires_grasp.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/naiad_of_hidden_coves.txt b/forge-gui/res/cardsfolder/upcoming/naiad_of_hidden_coves.txt new file mode 100644 index 00000000000..a79f90b9014 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/naiad_of_hidden_coves.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt b/forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt new file mode 100644 index 00000000000..d25eb0d4f10 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyleas_huntmaster.txt @@ -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.) diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt new file mode 100644 index 00000000000..d6fb1c1b0a3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_brute.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Brute +ManaCost:3 R R +Types:Enchantment Creature Cyclops +PT:7/3 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt new file mode 100755 index 00000000000..0f65320bbf6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_colossus.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Colossus +ManaCost:3 G G G +Types:Enchantment Creature Giant +PT:6/7 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt new file mode 100755 index 00000000000..b0c0313bc38 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_courser.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Courser +ManaCost:1 W W +Types:Enchantment Creature Centaur Scout +PT:2/4 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt new file mode 100644 index 00000000000..93842a7b373 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_marauder.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Marauder +ManaCost:2 B B +Types:Enchantment Creature Minotaur +PT:4/3 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt b/forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt new file mode 100644 index 00000000000..6acf482eeaf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nyxborn_seaguard.txt @@ -0,0 +1,5 @@ +Name:Nyxborn Seaguard +ManaCost:2 U U +Types:Enchantment Creature Merfolk Soldier +PT:2/5 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt new file mode 100644 index 00000000000..5ad2f12cf2c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_dead.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt new file mode 100644 index 00000000000..7e44fdc961f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_hunt.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt b/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt new file mode 100644 index 00000000000..bee65b13e7b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/omen_of_the_sea.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt b/forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt new file mode 100644 index 00000000000..0fa5dfd37c5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/phalanx_tactics.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt b/forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt new file mode 100644 index 00000000000..34bfa932987 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/pious_wayfarer.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/rage_scarred_berserker.txt b/forge-gui/res/cardsfolder/upcoming/rage_scarred_berserker.txt new file mode 100644 index 00000000000..c1aa42d68f3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rage_scarred_berserker.txt @@ -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. diff --git a/forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt b/forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt new file mode 100644 index 00000000000..2b0ae2d7494 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/satyrs_cunning.txt @@ -0,0 +1,6 @@ +Name:Satyr's Cunning +ManaCost:R +Types:Sorcery +A:SP$ Token | Cost$ R | TokenAmount$ 1 | TokenScript$ r_1_1_satyr_noblock | TokenOwner$ You | LegacyImage$ r 1 1 satyr noblock thb | SpellDescription$ Create a 1/1 red Satyr creature token with "This creature can't block." +K:Escape:2 R ExileFromGrave<2/Card.Other> +Oracle:Create a 1/1 red Satyr creature token with "This creature can't block."\nEscape — {2}{R}, Exile two other cards from your graveyard. (You may cast this card from your graveyard for its escape cost). \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/serpent_of_yawning_depths.txt b/forge-gui/res/cardsfolder/upcoming/serpent_of_yawning_depths.txt new file mode 100644 index 00000000000..c902315c251 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/serpent_of_yawning_depths.txt @@ -0,0 +1,6 @@ +Name:Serpent of Yawning Depths +ManaCost:4 U U +Types:Enchantment Creature Serpent +PT:6/6 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Kraken+YouCtrl,Creature.Leviathan+YouCtrl,Creature.Octopus+YouCtrl,Creature.Serpent+YouCtrl | ValidBlocker$ Creature.nonKraken+nonLeviathan+nonOctopus+nonSerpent | Description$ Krakens, Leviathans, Octopuses, and Serpents you control can't be blocked except by Krakens, Leviathans, Octopuses, and Serpents. +Oracle:Krakens, Leviathans, Octopuses, and Serpents you control can't be blocked except by Krakens, Leviathans, Octopuses, and Serpents. diff --git a/forge-gui/res/cardsfolder/upcoming/setessan_champion.txt b/forge-gui/res/cardsfolder/upcoming/setessan_champion.txt new file mode 100644 index 00000000000..1afded1fa19 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/setessan_champion.txt @@ -0,0 +1,8 @@ +Name:Setessan Champion +ManaCost:2 G +Types:Creature Human Warrior +PT:1/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, put a +1/+1 counter on CARDNAME and draw a card. +SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | NumCards$ 1 +Oracle:Constellation - Whenever an enchantment enters the battlefield under your control, put a +1/+1 counter on Setessan Champion and draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/setessan_skirmisher.txt b/forge-gui/res/cardsfolder/upcoming/setessan_skirmisher.txt new file mode 100644 index 00000000000..6794213d93f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/setessan_skirmisher.txt @@ -0,0 +1,7 @@ +Name:Setessan Skirmisher +ManaCost:1 G +Types:Creature Human Warrior +PT:2/1 +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, CARDNAME gets +1/+1 until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +1 | NumDef$ +1 +Oracle:Constellation - Whenever an enchantment enters the battlefield under your control, CARDNAME gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/setessan_training.txt b/forge-gui/res/cardsfolder/upcoming/setessan_training.txt new file mode 100644 index 00000000000..624e1bd236b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/setessan_training.txt @@ -0,0 +1,9 @@ +Name:Setessan Training +ManaCost:1 G +Types:Enchantment Aura +K:Enchant creature you control +A:SP$ Attach | Cost$ 1 G | ValidTgts$ Creature.YouCtrl | AILogic$ Pump +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddKeyword$ Trample | Description$ Enchanted creature gets +1/+0 and has trample. +Oracle:Enchant creature you control\nWhen Setessan Training enters the battlefield, draw a card.\nEnchanted creature gets +1/+0 and has trample. diff --git a/forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt b/forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt new file mode 100644 index 00000000000..8b8287aeb2c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skola_grovedancer.txt @@ -0,0 +1,8 @@ +Name:Skola Grovedancer +ManaCost:1 G +Types:Enchantment Creature Satyr Druid +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Land.nonToken+YouOwn | TriggerZones$ Battlefield | Execute$ DBGainLife | TriggerDescription$ Whenever a land card is put into your graveyard from anywhere, you gain 1 life. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +A:AB$ Mill | Cost$ 2 G | Defined$ You | NumCards$ 1 | SpellDescription$ Put the top card of your library into your graveyard. +Oracle:Whenever a land card is put into your graveyard from anywhere, you gain 1 life.\n{2}{G}: Put the top card of your library into your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt b/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt new file mode 100644 index 00000000000..f38b4928da5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sphinx_mindbreaker.txt @@ -0,0 +1,8 @@ +Name:Sphinx Mindbreaker +ManaCost:5 U U +Types:Creature Sphinx +PT:6/6 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBMill | TriggerDescription$ When CARDNAME enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. +SVar:DBMill:DB$ Mill | Defined$ Player.Opponent | NumCards$ 10 +Oracle:When Sphinx Mindbreaker enters the battlefield, each opponent puts the top ten cards of their library into their graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/staggering_insight.txt b/forge-gui/res/cardsfolder/upcoming/staggering_insight.txt new file mode 100644 index 00000000000..c0913131379 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/staggering_insight.txt @@ -0,0 +1,9 @@ +Name:Staggering Insight +ManaCost:W U +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ W U | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Lifelink | AddTrigger$ TriggerDamageDone | Description$ Enchanted creature gets +1/+1 and has lifelink and "Whenever this creature deals combat damage to a player, draw a card." +SVar:TriggerDamageDone:Mode$ DamageDone | ValidSource$ Card.Self | CombatDamage$ True | ValidTarget$ Player | Execute$ DBDraw | TriggerDescription$ Whenever this creature deals combat damage to a player, draw a card. +SVar:DBDraw:DB$ Draw | DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:Enchant creature\nEnchanted creature gets +1/+1 and has lifelink and "Whenever this creature deals combat damage to a player, draw a card." diff --git a/forge-gui/res/cardsfolder/upcoming/terror_of_mount_velus.txt b/forge-gui/res/cardsfolder/upcoming/terror_of_mount_velus.txt new file mode 100644 index 00000000000..fb831bfd924 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/terror_of_mount_velus.txt @@ -0,0 +1,9 @@ +Name:Terror of Mount Velus +ManaCost:5 R R +Types:Creature Dragon +PT:5/5 +K:Flying +K:Double Strike +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, creatures you control gain double strike until end of turn. +SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Double Strike +Oracle:Flying, double strike\nWhen Terror of Mount Velus enters the battlefield, creatures you control gain double strike until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/thaumaturges_familiar.txt b/forge-gui/res/cardsfolder/upcoming/thaumaturges_familiar.txt new file mode 100644 index 00000000000..8cca46af5c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thaumaturges_familiar.txt @@ -0,0 +1,8 @@ +Name:Thaumaturge's Familiar +ManaCost:3 +Types:Artifact Creature Bird +PT:1/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 1. +SVar:TrigScry:DB$ Scry | ScryNum$ 1 +Oracle:Flying\nWhen Thaumaturge's Familiar enters the battlefield, scry 1. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt b/forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt new file mode 100644 index 00000000000..4e86bb85bac --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_akroan_war.txt @@ -0,0 +1,9 @@ +Name:The Akroan War +ManaCost:3 R +Types:Enchantment Saga +K:Saga:3:DBGainControl,DBAllAttack,DBDamageTapped +SVar:DBGainControl:DB$ GainControl | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ LeavesPlay | SpellDescription$ Gain control of target creature for as long as CARDNAME remains on the battlefield. +SVar:DBAllAttack:DB$ PumpAll | ValidCards$ Creature.OppCtrl | UntilYourNextTurn$ True | KW$ HIDDEN CARDNAME attacks each combat if able. | SpellDescription$ Until your next turn, creatures your opponents control attack each turn if able. +SVar:DBDamageTapped:DB$ EachDamage | ValidCards$ Creature.tapped | NumDmg$ X | References$ X | DamageDesc$ damage equal to its power | DefinedCards$ Self | SpellDescription$ Each tapped creature deals damage to itself equal to its power. +SVar:X:Count$CardPower +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Gain control of target creature for as long as The Akroan War remains on the battlefield.\nII — Until your next turn, creatures your opponents control attack each combat if able.\nIII — Each tapped creature deals damage to itself equal to its power. diff --git a/forge-gui/res/cardsfolder/upcoming/the_binding_of_the_titans.txt b/forge-gui/res/cardsfolder/upcoming/the_binding_of_the_titans.txt new file mode 100644 index 00000000000..48cb8445a71 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_binding_of_the_titans.txt @@ -0,0 +1,11 @@ +Name:The Binding of the Titans +ManaCost:1 G +Types:Enchantment Saga +K:Saga:3:DBAllMill,DBExileGain,DBReturn +SVar:DBAllMill:DB$ Mill | Defined$ Player | NumCards$ 3 | SpellDescription$ Each player puts the top three cards of their library into their graveyard. +SVar:DBExileGain:DB$ ChangeZone | ValidTgts$ Card | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target cards in graveyards. | RememberChanged$ True | SubAbility$ DBGainLife | SpellDescription$ Exile up to two target cards from graveyards. For each creature card exiled this way, you gain 1 life. +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature or land card in your graveyard. | ValidTgts$ Creature.YouCtrl,Land.YouCtrl | SpellDescription$ Return target creature or land card from your graveyard to your hand. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$Valid Creature +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI - Each player puts the top three cards of their library into their graveyard.\nII - Exile up to two target cards from graveyards. For each creature card exiled this way, you gain 1 life.\nIII - Return target creature or land card from your graveyard to your hand. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/threnody_singer.txt b/forge-gui/res/cardsfolder/upcoming/threnody_singer.txt new file mode 100644 index 00000000000..baca2e89c7a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/threnody_singer.txt @@ -0,0 +1,10 @@ +Name:Threnody Singer +ManaCost:1 U +Types:Creature Siren +PT:1/3 +K:Flash +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature an opponent controls gets -X/-0 until end of turn, where X is your devotion to blue. (Each {U} in the mana costs of permanents you control counts toward your devotion to blue.) +SVar:DBPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | IsCurse$ True | NumAtt$ -X | References$ X | +SVar:X:Count$Devotion.Blue +Oracle:Flash\nFlying\nWhen Threnody Singer enters the battlefield, target creature an opponent controls gets -X/-0 until end of turn, where X is your devotion to blue. (Each {U} in the mana costs of permanents you control counts toward your devotion to blue.) diff --git a/forge-gui/res/cardsfolder/upcoming/thundering_chariot.txt b/forge-gui/res/cardsfolder/upcoming/thundering_chariot.txt new file mode 100644 index 00000000000..0986a4e5870 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thundering_chariot.txt @@ -0,0 +1,9 @@ +Name:Thundering Chariot +ManaCost:4 +Types:Artifact Vehicle +PT:3/3 +K:First Strike +K:Trample +K:Haste +K:Crew:1 +Oracle:First strike, trample, haste\nCrew 1 diff --git a/forge-gui/res/cardsfolder/upcoming/treacherous_blessing.txt b/forge-gui/res/cardsfolder/upcoming/treacherous_blessing.txt new file mode 100644 index 00000000000..a7fb21241d6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/treacherous_blessing.txt @@ -0,0 +1,10 @@ +Name:Treacherous Blessing +ManaCost:2 B +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw three cards. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 3 +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever you cast a spell, you lose 1 life. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ 1 +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When CARDNAME becomes the target of a spell or ability, sacrifice it. +SVar:TrigSac:DB$ Sacrifice | ValidCard$ Card.Self +Oracle:When Treacherous Blessing enters the battlefield, draw three cards.\nWhenever you cast a spell, you lose 1 life.\nWhen Treacherous Blessing becomes the target of a spell, sacrifice it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/treeshaker_chimera.txt b/forge-gui/res/cardsfolder/upcoming/treeshaker_chimera.txt new file mode 100644 index 00000000000..f08a3fcde81 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/treeshaker_chimera.txt @@ -0,0 +1,8 @@ +Name:Treeshaker Chimera +ManaCost:5 G G +Types:Creature Chimera +PT:8/5 +K:All creatures able to block CARDNAME do so. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, draw three cards. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 3 +Oracle:All creatures able to block Treeshaker Chimera do so.\nWhen Treeshaker Chimera dies, draw three cards. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/triton_waverider.txt b/forge-gui/res/cardsfolder/upcoming/triton_waverider.txt new file mode 100644 index 00000000000..0a1b88e2216 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/triton_waverider.txt @@ -0,0 +1,7 @@ +Name:Triton Waverider +ManaCost:3 U +Types:Creature Merfolk Wizard +PT:3/3 +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, CARDNAME gets flying until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Flying +Oracle:Constellation - Whenever an enchantment enters the battlefield under your control, Triton Waverider gets flying until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/tymaret_calls_the_dead.txt b/forge-gui/res/cardsfolder/upcoming/tymaret_calls_the_dead.txt new file mode 100644 index 00000000000..85fd6f00781 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tymaret_calls_the_dead.txt @@ -0,0 +1,13 @@ +Name:Tymaret Calls the Dead +ManaCost:2 B +Types:Enchantment Saga +K:Saga:3:DBMill,DBMill,DBGainLife +SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 3 | SubAbility$ DBChooseCard | SpellDescription$ Put the top three cards of your library into your graveyard. Then you may exile a creature or enchantment card from your graveyard. If you do, create a 2/2 black Zombie creature token. +SVar:DBChooseCard:DB$ ChooseCard | Choices$ Creature.YouCtrl,Enchantment.YouCtrl | Optional$ Yes | ChoiceTitle$ Choose a creature or enchantment to exile | ChoiceZone$ Graveyard | Amount$ 1 | AILogic$ WorstCard | SubAbility$ DBChangeZone +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ ChosenCard | RememberChanged$ True | SubAbility$ DBToken +SVar:DBToken:DB$ Token | LegacyImage$ b 2 2 zombie thb | TokenScript$ b_2_2_zombie | TokenOwner$ You | TokenAmount$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True | ClearRemembered$ True +SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X | SubAbility$ DBScry | SpellDescription$ You gain X life and scry X, where X is the number of Zombies you control. +SVar:DBScry:DB$ Scry | ScryNum$ X | References$ X +SVar:X:Count$Valid Zombie.YouCtrl +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI,II — Put the top three cards of your library into your graveyard. Then you may exile a creature or enchantment card from your graveyard. If you do, create a 2/2 black Zombie creature token.\nIII — You gain X life and scry X, where X is the number of Zombies you control. diff --git a/forge-gui/res/cardsfolder/upcoming/underworld_rage_hound.txt b/forge-gui/res/cardsfolder/upcoming/underworld_rage_hound.txt new file mode 100644 index 00000000000..0a6acaae5a8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/underworld_rage_hound.txt @@ -0,0 +1,8 @@ +Name:Underworld Rage-Hound +ManaCost:1 R +Types:Creature Elemental Hound +PT:3/1 +K:CARDNAME attacks each combat if able. +K:Escape:3 R ExileFromGrave<3/Card.Other> +K:etbCounter:P1P1:1:ValidCard$ Card.Self+escaped:CARDNAME escapes with a +1/+1 counter on it. +Oracle:Underworld Rage-Hound attacks each combat if able.\nEscape — {3}{R}, Exile three other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).\nUnderworld Rage-Hound escapes with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/underworld_sentinel.txt b/forge-gui/res/cardsfolder/upcoming/underworld_sentinel.txt new file mode 100755 index 00000000000..032b187caba --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/underworld_sentinel.txt @@ -0,0 +1,9 @@ +Name:Underworld Sentinel +ManaCost:3 B B +Types:Creature Skeleton Soldier +PT:4/5 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, exile target creature card from your graveyard. +SVar:TrigExile:DB$ChangeZone | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | RememberChanged$ True +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, put all cards exiled with it onto the battlefield. +SVar:TrigReturn:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered+ExiledWithSource | Origin$ Exile | Destination$ Battlefield +Oracle:Whenever Underworld Sentinel attacks, exile target creature card from your graveyard.\nWhen Underworld Sentinel dies, put all cards exiled with it onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/venomous_hierophant.txt b/forge-gui/res/cardsfolder/upcoming/venomous_hierophant.txt new file mode 100644 index 00000000000..1db65612c67 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/venomous_hierophant.txt @@ -0,0 +1,8 @@ +Name:Venomous Hierophant +ManaCost:3 B +Types:Creature Gorgon Cleric +PT:3/3 +K:Deathtouch +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME enters the battlefield, put the top three cards of your library into your graveyard. +SVar:TrigMill:DB$Mill | NumCards$ 3 | Defined$ You +Oracle:Deathtouch\nWhen Venomous Hierophant enters the battlefield, put the top three cards of your library into your graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt b/forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt new file mode 100755 index 00000000000..f5e7564b017 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/victorys_envoy.txt @@ -0,0 +1,7 @@ +Name:Victory's Envoy +ManaCost:3 W W +Types:Creature Human Cleric +PT:3/3 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on each other creature you control. +SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.Other+YouCtrl | CounterType$ P1P1 | CounterNum$ 1 +Oracle:At the beginning of your upkeep, put a +1/1 counter on each other creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/voracious_typhon.txt b/forge-gui/res/cardsfolder/upcoming/voracious_typhon.txt new file mode 100644 index 00000000000..252dea34905 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/voracious_typhon.txt @@ -0,0 +1,7 @@ +Name:Voracious Typhon +ManaCost:2 G G +Types:Creature Snake Beast +PT:4/4 +K:Escape:5 G G ExileFromGrave<4/Card.Other> +K:etbCounter:P1P1:3:ValidCard$ Card.Self+escaped:CARDNAME escapes with three +1/+1 counters on it. +Oracle:Escape — {5}{G}{G}, Exile four other cards from your graveyard. (You may cast this card from your graveyard for its escape cost).\nVoracious Typhon escapes with three +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/warbriar_blessing.txt b/forge-gui/res/cardsfolder/upcoming/warbriar_blessing.txt new file mode 100644 index 00000000000..bca5082e950 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/warbriar_blessing.txt @@ -0,0 +1,9 @@ +Name:Warbriar Blessing +ManaCost:1 G +Types:Enchantment Aura +K:Enchant creature you control +A:SP$ Attach | Cost$ 1 G | ValidTgts$ Creature.YouCtrl | AILogic$ Pump +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFight | TriggerDescription$ When CARDNAME enters the battlefield, enchanted creature fights up to one target creature you don't control. +SVar:TrigFight:DB$ Fight | Defined$ Enchanted | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose up to one target creature you don't control | TargetMin$ 0 | TargetMax$ 1 +S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddToughness$ 2 | Description$ Enchanted creature gets +0/+2. +Oracle:Enchant creature you control\nWhen Warbriar Blessing enters the battlefield, enchanted creature fights up to one target creature you don't control\nEnchanted creature gets +0/+2. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/warden_of_the_chained.txt b/forge-gui/res/cardsfolder/upcoming/warden_of_the_chained.txt new file mode 100644 index 00000000000..e23b79d2e6a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/warden_of_the_chained.txt @@ -0,0 +1,8 @@ +Name:Warden of the Chained +ManaCost:1 R G +Types:Creature Minotaur Warrior +PT:4/4 +K:Trample +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't attack. | CheckSVar$ X | SVarCompare$ EQ0 | Description$ CARDNAME can't attack unless you control another creature with power 4 or greater. +SVar:X:Count$Valid Creature.powerGE4+YouCtrl+Other +Oracle:Trample\nWarden of the Chained can't attack unless you control another creature with power 4 or greater. diff --git a/forge-gui/res/cardsfolder/upcoming/wolfwillow_haven.txt b/forge-gui/res/cardsfolder/upcoming/wolfwillow_haven.txt new file mode 100644 index 00000000000..a8e726206ad --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wolfwillow_haven.txt @@ -0,0 +1,9 @@ +Name:Wolfwillow Haven +ManaCost:1 G +Types:Enchantment Aura +K:Enchant land +A:SP$ Attach | Cost$ 1 G | ValidTgts$ Land | AILogic$ Pump +T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever enchanted land is tapped for mana, its controller adds an additional {G}. +SVar:TrigMana:DB$ Mana | Produced$ G | Amount$ 1 | Defined$ TriggeredCardController +A:AB$ Token | Cost$ 4 G Sac<1/CARDNAME> | TokenAmount$ 1 | TokenScript$ g_2_2_wolf | TokenOwner$ You | LegacyImage$ g 2 2 wolf thb | PlayerTurn$ True | SpellDescription$ Create a 2/2 green Wolf creature token. Activate this ability only during your turn. +Oracle:Enchant land\nWhenever enchanted land is tapped for mana, its controller adds an additional {G}.\n{4}{G},Sacrifice Wolfwillow Haven: Create a 2/2 green Wolf creature token. Activate this ability only during your turn. diff --git a/forge-gui/res/cardsfolder/v/visage_of_bolas.txt b/forge-gui/res/cardsfolder/v/visage_of_bolas.txt index e7b93034995..0781da4fdd5 100644 --- a/forge-gui/res/cardsfolder/v/visage_of_bolas.txt +++ b/forge-gui/res/cardsfolder/v/visage_of_bolas.txt @@ -2,7 +2,7 @@ Name:Visage of Bolas ManaCost:4 Types:Artifact 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 Nicol Bolas, the Deceiver, 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.namedNicol Bolas; the Deceiver | ChangeNum$ 1 | Optional$ True +SVar:TrigSearch:DB$ ChangeZone | Origin$ 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.namedNicol Bolas; the Deceiver | ChangeNum$ 1 | Optional$ True A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. diff --git a/forge-gui/res/cardsfolder/v/vraskas_scorn.txt b/forge-gui/res/cardsfolder/v/vraskas_scorn.txt index 445cac701e7..5f3742e5133 100644 --- a/forge-gui/res/cardsfolder/v/vraskas_scorn.txt +++ b/forge-gui/res/cardsfolder/v/vraskas_scorn.txt @@ -2,7 +2,7 @@ Name:Vraska's Scorn ManaCost:2 B B Types:Sorcery A:SP$ LoseLife | Cost$ 2 B B | ValidTgts$ Opponent | LifeAmount$ 4 | SubAbility$ DBSearch | SpellDescription$ Target opponent loses 4 life. You may search your library and/or graveyard for a card named Vraska, Scheming Gorgon, 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.namedVraska; Scheming Gorgon | 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.namedVraska; Scheming Gorgon | ChangeNum$ 1 | Optional$ True DeckNeeds:Name$Vraska, Scheming Gorgon SVar:Picture:http://www.wizards.com/global/images/magic/general/vraskas_scorn.jpg Oracle:Target opponent loses 4 life. You may search your library and/or graveyard for a card named Vraska, Scheming Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt b/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt index 1a6c3cb90d1..95a3ebec906 100644 --- a/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt +++ b/forge-gui/res/cardsfolder/v/vraskas_stoneglare.txt @@ -3,7 +3,7 @@ ManaCost:4 B G Types:Sorcery A:SP$ Destroy | Cost$ 4 B G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBGainLife | SpellDescription$ Destroy target creature. You gain life equal to its toughness. You may search your library and/or graveyard from a card named Vraska, Regal Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup | References$ X | SubAbility$ DBSearch -SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedVraska; Regal Gorgon | 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.namedVraska; Regal Gorgon | ChangeNum$ 1 | Optional$ True SVar:X:TargetedLKI$CardToughness DeckNeeds:Name$Vraska, Regal Gorgon Oracle:Destroy target creature. You gain life equal to its toughness. You may search your library and/or graveyard from a card named Vraska, Regal Gorgon, reveal it, and put it in to your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt b/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt index 8514bd32ba1..5754357ec31 100644 --- a/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt +++ b/forge-gui/res/cardsfolder/y/yanlings_harbinger.txt @@ -4,6 +4,6 @@ Types:Creature Bird PT:2/4 K:Flying 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 Mu Yanling, Celestial Wind, 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.namedMu Yanling; Celestial Wind | 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.namedMu Yanling; Celestial Wind | ChangeNum$ 1 | Optional$ True DeckHints:Name$Mu Yanling, Celestial Wind Oracle:Flying\nWhen Yanling's Harbinger enters the battlefield, you may search your library and/or graveyard for a card named Mu Yanling, Celestial Wind, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/deckgendecks/Pioneer.lda.dat b/forge-gui/res/deckgendecks/Pioneer.lda.dat index ca93fcd3304..73455e28c64 100644 Binary files a/forge-gui/res/deckgendecks/Pioneer.lda.dat and b/forge-gui/res/deckgendecks/Pioneer.lda.dat differ diff --git a/forge-gui/res/deckgendecks/Pioneer.raw.dat b/forge-gui/res/deckgendecks/Pioneer.raw.dat index a6708549976..b6ef1958117 100644 Binary files a/forge-gui/res/deckgendecks/Pioneer.raw.dat and b/forge-gui/res/deckgendecks/Pioneer.raw.dat differ diff --git a/forge-gui/res/editions/Theros Beyond Death.txt b/forge-gui/res/editions/Theros Beyond Death.txt index bbfad143cc8..deb406d3411 100644 --- a/forge-gui/res/editions/Theros Beyond Death.txt +++ b/forge-gui/res/editions/Theros Beyond Death.txt @@ -11,32 +11,83 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 4 U Banishing Light 7 U Commanding Presence 9 U Daxos, Blessed by the Sun -23 C Indomitable Will -26 C Karametra’s Blessing +14 M Elspeth, Sun's Nemesis +23 C Hero of the Winds +25 C Indomitable Will +26 C Karametra's Blessing 28 C Leonin of the Lost Pride +29 C Nyxborn Courser +31 U Phalanx Tactics +32 C Pious Wayfarer +34 C Revoke Existence 42 U Alirios, Enraptured 43 R Ashiok's Erasure 48 C Eidolon of Philosophy 51 C Ichthyomorphosis +54 C Memory Drain +53 U Medomai's Prophecy +56 C Naiad of Hidden Coves +57 C Nyxborn Seaguard +58 C Omen of the Sea +75 U Threnody Singer +76 C Triton Waverider +96 C Fruit of Tizerus +99 U Gray Merchant of Asphodel 102 U Inevitable End +104 U Minion's Return +106 C Mire's Grasp +109 C Nyxborn Marauder +110 C Omen of the Dead +113 C Rage-Scarred Berserker +117 R Treacherous Blessing +118 R Tymaret Calls the Dead +121 U Underworld Dreams +122 C Venomous Hierophant +124 R The Akroan War 126 C Arena Trickster 136 U Furious Rise 138 U Heroes of the Revel 140 C Incendiary Oracle 141 C Infuriate -142 C Iroas’s Blessing +142 C Iroas's Blessing 143 C Irreverent Revelers +144 C Nyxborn Brute +149 C Portent of Betrayal +152 C Satyr's Cunning +159 C Thrill of Possibility +163 C Underworld Rage-Hound +164 C Wrap in Flames 164 C Aspect of Lamprey +166 U The Binding of the Titans +167 C Chainweb Aracnir 174 C Ilysian Caryatid 176 U Klothys's Design +187 C Nylea's Huntmaster +191 C Nyxborn Colossus +192 C Omen of the Hunt +198 R Setessan Champion +200 C Setessan Skirmisher +201 C Setessan Training +202 C Skola Grovedancer +203 C Voracious Typhon +204 C Warbriar Blessing +205 U Wolfwillow Haven +207 R Allure of the Unknown 208 M Ashiok, Nightmare Muse +217 R Gallia of the Endless Dance 219 U Hero of the Nyxborn +220 M Klothys, God of Destiny +228 U Staggering Insight +230 U Warden of the Chained +238 C Thaumaturge's Familiar +239 U Thundering Chariot 243 R Labyrinth of Skophos 250 L Plains 251 L Island 252 L Swamp 253 L Mountain 254 L Forest +258 U Daxos, Blessed by the Sun 269 M Athreos, Shroud-Veiled 270 M Elspeth, Undaunted Hero 274 M Ashiok, Sculptor of Fears @@ -50,10 +101,23 @@ Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand 285 L Mountain 286 L Forest 287 L Forest +288 R Grasping Giant +289 R Victory’s Envoy +290 R Sphinx Mindbreaker +291 R Serpent of Yawning Depths +292 R Demon of Loathing +293 R Underworld Sentinel +294 R Deathbellow War Cry +295 R Terror of Mount Velus +296 R Ironscale Hydra +297 R Treeshaker Chimera +331 R Setessan Champion [tokens] -r_2_2_satyr_noblock +b_2_2_zombie +g_2_2_wolf +r_1_1_satyr_noblock u_3_2_reflection ub_2_3_nightmare_mill w_1_1_human_soldier \ No newline at end of file diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index ab4d0edb609..19278413d65 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1113,14 +1113,14 @@ lblSelectBlocker=Select creatures to block lblOrSelectBlockTarget= or select another attacker to declare blockers for. lblMorph=Morph #PlayerControllerHuman.java -lblYouHaveWonTheCoinToss=%s, you have won the coin toss. -lblYouLostTheLastGame=%s, you lost the last game. +lblYouHaveWonTheCoinToss={0}, you have won the coin toss. +lblYouLostTheLastGame={0}, you lost the last game. lblWouldYouLiketoPlayorDraw=Would you like to play or draw? lblWhoWouldYouLiketoStartthisGame=Who would you like to start this game? (Click on the portrait.) lblPlay=Play lblDraw=Draw -lblTooFewCardsMainDeck=Too few cards in your main deck (minimum %s), please make modifications to your deck again. -lblTooManyCardsSideboard=Too many cards in your sideboard (maximum %s), please make modifications to your deck again. +lblTooFewCardsMainDeck=Too few cards in your main deck (minimum {0}), please make modifications to your deck again. +lblTooManyCardsSideboard=Too many cards in your sideboard (maximum {0}), please make modifications to your deck again. lblAssignCombatDamageWerentBlocked=Do you want to assign its combat damage as though it weren't blocked? lblChosenCards=Chosen Cards lblAttacker=Attacker @@ -1169,15 +1169,15 @@ lblSelectCardsToBePutIntoTheGraveyard=Select cards to be put into the graveyard lblCardsToPutInTheGraveyard=Cards to put in the graveyard lblDiscardUpToNCards=Discard up to %d card(s) lblDiscardNCards=Discard %d card(s) -lblSelectNCardsToDiscardUnlessDiscarduType=Select %d card(s) to discard, unless you discard a %s. +lblSelectNCardsToDiscardUnlessDiscarduType=Select %d card(s) to discard, unless you discard a {0}. lblCleanupPhase=Cleanup Phase -lblSelectCardsToDiscardHandDownMaximum=Select %d card(s) to discard to bring your hand down to the maximum of %max cards. +lblSelectCardsToDiscardHandDownMaximum=Select {0} card(s) to discard to bring your hand down to the maximum of {1} cards. lblChooseMinCardToDiscard=Choose %d card(s) to discard lblDiscarded=Discarded -lblChooseDamageOrderFor=Choose Damage Order for %s +lblChooseDamageOrderFor=Choose Damage Order for {0} lblDamagedFirst=Damaged First -lblChooseBlockerAfterWhichToPlaceAttackert=Choose blocker after which to place %s in damage order; cancel to place it first -lblPutCardOnTopOrBottomLibrary=Put %s on the top or bottom of your library? +lblChooseBlockerAfterWhichToPlaceAttackert=Choose blocker after which to place {0} in damage order; cancel to place it first +lblPutCardOnTopOrBottomLibrary=Put {0} on the top or bottom of your library? lblChooseOrderCardsPutIntoLibrary=Choose order of cards to put into the library lblClosestToTop=Closest to top lblChooseOrderCardsPutOntoBattlefield=Choose order of cards to put onto the battlefield @@ -1190,20 +1190,20 @@ lblChooseOrderCopiesCast=Choose order of copies to cast lblDelveHowManyCards=Delve how many cards? lblExileWhichCard=Exile which card? lblDestroy=destroy -lblUpTo=up to +lblSelectUpToNumTargetToAction=Select up to %d {0}(s) to {1}. +lblSelectNumTargetToAction=Select %d {0}(s) to {1}. lblHighestBidder=Highest Bidder lblUseTriggeredAbilityOf=Use triggered ability of lblExertAttackersConfirm=Exert Attackers? -lblThereNoCardIn=There are no cards in -lblPut=Put -lblOnTheTopLibraryOrGraveyard=on the top of library or graveyard? +lblThereNoCardInPlayerZone=There are no cards in {0} {1} +lblPutCardsOnTheTopLibraryOrGraveyard=Put {0} on the top of library or graveyard? lblLibrary=Library lblGraveyard=Graveyard lblTop=Top lblBottom=Bottom -lblManaFrom=mana from +lblNColorManaFromCard={0} {1} mana from {2} lblPayManaFromManaPool=Pay Mana from Mana Pool -lblChooseATargetType=Choose a %s type +lblChooseATargetType=Choose a {0} type lblUntap=Untap lblOdds=Odds lblEvens=Evens @@ -1217,21 +1217,17 @@ lblWinTheFlip=win the flip lblLoseTheFlip=lose the flip lblChooseAResult=Choose a result lblSelectPreventionShieldToUse=select which prevention shield to use -lblChooseAMode=Choose a mode -lblActivated=activated +lblPlayerActivatedCardChooseMode={0} activated {1} - Choose a mode lblNoPlayerHasPriorityCannotAddedManaToPool=No player has priority at the moment, so mana cannot be added to their pool. lblOverwriteExistFileConfirm=Overwrite existing file? lblFileExists=File exists! lblSelectGameStateFile=Select Game State File lblFileNotFound=File not found -lblIn=in -lblOnTheBattlefield=on the battlefield -lblOnTheStackOrInPlay=on the stack / in play -lblPutCard=Put card -lblForWhichPlayer=for which player? -lblShould=Should -lblAffectedWithSummoningSickness=be affected with Summoning Sickness? -lblBeAddedToLibraryTopOrBottom=be added to the top or to the bottom of the library? +lblPutCardInWhichPlayerZone=Put card in {0} for which player? +lblPutCardInWhichPlayerBattlefield=Put card on the battlefield for which player? +lblPutCardInWhichPlayerPlayOrStack=Put card on the stack / in play for which player? +lblCardShouldBeSummoningSicknessConfirm=Should {0} be affected with Summoning Sickness? +lblCardShouldBeAddedToLibraryTopOrBottom=Should {0} be added to the top or to the bottom of the library? lblExileCardsFromPlayerHandConfirm=Exile card(s) from which player's hand? lblChooseCardsExile=Choose cards to exile lblExileCardsFromPlayerBattlefieldConfirm=Exile card(s) from which player's battlefield? @@ -1245,7 +1241,11 @@ lblRestartingActionSequence=Restarting action sequence. lblErrorPleaseCheckID=Error: Check IDs and ensure they're separated by spaces and/or commas. lblErrorEntityWithId=Error: Entity with ID lblNotFound=not found -lblChooseAnnounceFor=Choose %s for %name +lblChooseAnnounceForCard=Choose {0} for {1} +lblSacrifice=Sacrifice +lblLookCardInPlayerZone=Looking at cards in {0} {1} +lblPlayerZone={0} {1} +lblActionFromPlayerDeck={0} from {1} Deck #AbstractGuiGame.java lblConcedeCurrentGame=This will concede the current game and you will lose.\n\nConcede anyway? lblConcedeTitle=Concede Game? @@ -1591,24 +1591,22 @@ lblSelectOrder=Select Order lblIfYouDo=if you do lblOr=or lblDoYouWantPay=Do you want to pay +lblDoYouWantPayNLife=Do you want to pay {0} life? lblDoyouWantTo=Do you want to -lblDoYouWantMill=Do you want to mill -lblDoYouWantFlip=Do you want to flip -lblDoYouWantRemove=Do you want to remove -lblDoYouWantRemoveCounters=Do you want to remove counters from -lblDoYouWantExile=Do you want to exile +lblDoYouWantMillNCardsOrDoAction=Do you want to mill {0} card(s)? {1} +lblDoYouWantFlipNCoinOrDoAction=Do you want to flip {0} coin(s)? {1} +lblDoYouWantRemoveNTargetTypeCounterFromCard=Do you want to remove {0} {1} counter from {2}? +lblDoYouWantRemoveCountersFromCard=Do you want to remove counters from {0}? +lblDoYouWantExileNCardsFromYourLibrary=Do you want to exile {0} card(s) from your library? lblDoYouWantExileAllCardYouGraveyard=Do you want to exile all cards in your graveyard? lblDoYouWantDiscardYourHand=Do you want to discard your hand? -lblDoYouWantSpend=Do you want to spend -lblLetThatPlayer=let that player -lblCoin=coin -lblCounterOfPointer=counter -lblFrom=from -lblFromYourLibrary=from your library? +lblDoYouWantSpendNTargetTypeCounter=Do you want to spend {0} {1} counter? +lblDoYouWantLetThatPlayerDrawNCardOrDoAction=Do you want to let that player draw {0} card(s)?{1} +lblDoYouWantDrawNCardOrDoAction=Do you want to draw {0} card(s)?{1} lblSelectRemoveCounterCard=Select a card to remove a counter lblSelectRemoveCounterType=Select type counters to remove -lblExileFrom=Exile from -lblPutCardFromWhose=Put cards from whose +lblExileFromZone=Exile from {0} +lblPutCardFromWhoseZone=Put cards from whose {0}? lblPutCardToLibrary=Put cards to Library lblPutIntoLibrary=put into library. lblGainControl=gain control. @@ -1617,62 +1615,60 @@ lbldiscard=discard. lblReveal=reveal lblTap=tap lblCurrentCard=Current Card -lblSelectOfCardsTo=Select -lblCardsTo=card(s) to +lblSelectNSpecifyTypeCardsToAction=Select %d {0} card(s) to {1} #AbandonEffect.java -lblWouldYoulikeAbandon=Would you like to abandon the scheme +lblWouldYoulikeAbandonSource=Would you like to abandon the scheme {0}? #ActivateAbilityEffect.java lblChooseManaAbility=Choose a mana ability: #AddTurnEffect.java -lblTakesExtraTurn=takes an extra turn. +lblPlayerTakesExtraTurn={0} takes an extra turn. #AmassEffect.java. lblChooseAnArmy=Choose an army to put counters on #AssignGroupEffect.java -lblChooseAbilityFor=Choose ability for +lblChooseAbilityForObject=Choose ability for {0} #AttachEffect.java -lblDoYouWantAttach=Do you want to attach -lblSelectAPlayerAttachTo=Select a player to attach to. -lblSelectACardAttachTo=Select a card to attach to. +lblDoYouWantAttachSourceToTarget=Do you want to attach {0} to {1}? +lblSelectAPlayerAttachSourceTo={0} - Select a player to attach to. +lblSelectACardAttachSourceTo={0} - Select a card to attach to. #BidLifeEffect.java lblChooseStartingBid=Choose a starting bid lblDoYouWantTopBid=Do you want to top bid? Current Bid \= -lblTopBidWith=topped bid with +lblTopBidWithValueLife=topped bid with {0} life #BondEffect.java lblSelectACardPair=Select a card to pair with #ChangeCombatantsEffect.java -lblChooseDefenderToAttackWith=Choose which defender to attack with +lblChooseDefenderToAttackWithCard=Choose which defender to attack with {0} #ChangeTargetsEffect.java -lblDoYouWantChangeTargets=Do you want to change targets of +lblDoYouWantChangeAbilityTargets=Do you want to change targets of {0}? #ChangeTextEffect.java lblChooseColorReplace=Choose a color word to replace lblChooseNewColor=Choose a new color word #ChangeZoneEffect.java -lblDoYouWantMove=Do you want to move -lblDeclareDefenderFor=Declare a defender for +lblDoYouWantMoveTargetFromOriToDest=Do you want to move {0} from {1} to {2}? +lblPutThatCardFromPlayerOriginToDestination=Put that card from for {0} {1} to {2} +lblSearchPlayerZoneConfirm=Search {0} {1}? lblCardMatchSearchingTypeInAlternateZones=cards match your searching type in Alternate Zones. -lblPutThatCardFrom=Put that card from lblLookingCardIn=Looking at cards in -lblDoYouWantPlay=Do you want to play -lblSelectCardFrom=Select a card from -lblSelectUpTo=Select up to -lblCardsFrom=cards from -lblSelectCardsFrom=Select cards from -lblCancelSearchUpTo=Cancel Search? Up to -lblMoreCard=more card -lblCanBeSelected=can be selected. +lblDoYouWantPlayCard=Do you want to play {0}? +lblSelectCardFromPlayerZone=Select a card from {0} {1} +lblSelectUpToNumCardFromPlayerZone=Select up to {0} cards from {1} {2} +lblSelectCardsFromPlayerZone=Select cards from {0} {1} +lblCancelSearchUpToSelectNumCards=Cancel Search? Up to {0} more card(s) can be selected. +#ChangeZoneAllEffect.java +lblMoveTargetFromOriginToDestination=Move {0} from {1} to {2}? #ChooseCardEffect.java -lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to -lblTotalPower=Total Power +lblChoose=Choose +lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to {0} +lblTotalPowerNum=Total Power: {0} lblCancelChooseConfirm=Cancel Choose? #ChooseCardNameEffect.java lblChooseACardName=Choose a card name -lblChooseA=Choose a -lblCardName=card name -lblPicked=picked +lblChooseASpecificCard=Choose a {0} card name. +lblPlayerPickedChosen={0} picked {1} #ChooseColorEffect.java lblChooseAColor=Choose a color -lblChoose=Choose -lblOrMore=or more +lblAtLastChooseNumColors=Choose {0} or more color +lblChooseSpecifiedRangeColors=Choose {0} to {1} color #ChooseDirectionEffect.java lblLeftClockwise=Left (clockwise) lblRightAntiClockwise=Right (anticlockwise) @@ -1681,7 +1677,7 @@ lblChooseDirection=Choose a direction lblChooseOne=Choose one #ChooseNumberEffect.java lblChooseNumber=Choose a number -lblChose=chose +lblPlayerChoseNum={0} chose {1} #ChoosePlayerEffect.java lblChoosePlayer=Choose a player #ChooseSourceEffect.java @@ -1692,26 +1688,24 @@ lblReveals=reveals lblWinsClash=wins clash lblLosesClash=loses clash #CloneEffect.java -lblDoYouWantCopy=Do you want to copy +lblDoYouWantCopy=Do you want to copy {0}? #ControlExchangeVariantEffect.java lblChooseCards=Choose cards #CopyPermanentEffect.java lblCopyPermanentConfirm=Copy this permanent? lblDefender=defender #CopySpellAbilityEffect.java -lblDoyouWantCopyTheSpell=Do you want to copy the spell -lblSelectMultiSpellCopyToStack=Select %d spell to copy to stack +lblDoyouWantCopyTheSpell=Do you want to copy the spell {0}? +lblSelectMultiSpellCopyToStack=Select {0} spell to copy to stack lblSelectASpellCopy=Select a spell to copy #CounterEffect.java lblRemoveDestination=a destination to remove #CountersMoveEffect.java -lblChooseTakeCountersCard=Choose card to take %s counters from -lblTakeHowMany=Take how many -lblCountersFrom=counters from -lblChooseCardToGet=Choose cards to get -lblPutHowMany=Put how many -lblCountersOn=counters on -lblCounters=counters +lblChooseTakeCountersCard=Choose card to take {0} counters from +lblTakeHowManyTargetCounterFromCard=Take how many {0} counters from {1}? +lblChooseCardToGetCountersFrom=Choose cards to get {0} counters from {1}. +lblPutHowManyTargetCounterOnCard=Put how many {0} counters on {1}? +lblTakeHowManyTargetCounters=Take how many {0} counters? #CountersProliferateEffect.java lblChooseProliferateTarget=Choose any number of permanents and/or players for proliferate #CountersPutEffect.java @@ -1719,41 +1713,40 @@ lblChooseACreatureWithLeastToughness=Choose a creature with the least toughness lblSelectCounterTypeAddTo=Select counter type to add to lblHowManyCounters=How many counters? lblChooseAnOpponent=Choose an opponent -lblDoYouWantPutTargetP1P1CountersOn=Do you want to put %d +1/+1 counters on +lblDoYouWantPutTargetP1P1CountersOnCard=Do you want to put {0} +1/+1 counters on {1}? #CountersPutOrRemoveEffect.java lblSelectCounterTypeToAddOrRemove=Select type of counters to add or remove -lblWhatToDoWithTargetCounter=What to do with that '%s' counter +lblWhatToDoWithTargetCounter=What to do with that '{0}' counter #CountersRemoveEffect.java lblAllCounters=all counters lblACounters=a counter -lblChooseCardtoTakeTargetCounters=Choose cards to take %s counters from -lblSelectRemoveCountersNumberOfTarget=Select the number of %s counters to remove +lblCounters=counters +lblChooseCardsToTakeTargetCounters=Choose cards to take {0} counters from +lblSelectRemoveCountersNumberOfTarget=Select the number of {0} counters to remove lblSelectCountersTypeToRemove=Select type of counters to remove #DamageDealEffect.java -lblDoyouWantDealTargetDamageTo=Do you want to deal %d damage to +lblDoyouWantDealTargetDamageToTarget=Do you want to deal {0} damage to {1}? #DigEffect.java lblWouldYouLikeProceedWithOptionalAbility=Would you like to proceed with the optional ability for -lblChooseACardToLeaveTargetLibraryTop=Choose a card to leave on top of %s library -lblChooseACardLeaveTarget=Choose a card to leave in %s -lblChooseCardsPutInto=Choose card(s) to put into -lblChooseCardPutOnTargetLibarayBottom=Choose card(s) to put on the bottom of %s library -lblChooseCardPutOnTargetLibarayTop=Choose card(s) to put on top of %s library +lblChooseACardToLeaveTargetLibraryTop=Choose a card to leave on top of {0} library +lblChooseACardLeaveTarget=Choose a card to leave in {0} {1} +lblChooseCardsPutIntoZone=Choose card(s) to put into {0} +lblChooseCardPutOnTargetLibarayBottom=Choose card(s) to put on the bottom of {0} library +lblChooseCardPutOnTargetLibarayTop=Choose card(s) to put on top of {0} library +lblPlayerPickedCardFrom={0} picked card(s) from lblNoValidCards=No valid cards -lblThisCard=this card -lblTheseCards=these cards #DigUntilEffect.java lblDoYouWantDigYourLibrary=Do you want to dig your library? -lblDoYouWantPutCardTo=Do you want to put that card to +lblDoYouWantPutCardToZone=Do you want to put that card to {0}? #DiscardEffect.java -lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard %d random card(s)? -lblHasChosen=has chosen +lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard {0} random card(s)? +lblPlayerHasChosenCardsFrom={0} has chosen card(s) from #DrawEffect.java -lblDoYouWantDraw=Do you want to draw +lblDoYouWantDrawCards=Do you want to draw {0}? lblHowMayCardDoYouWantDraw=How may cards do you want to draw? #EncodeEffect.java -lblAndEncodeOntoAYouControlCreature=and encode it onto a creature you control? +lblDoYouWantExileCardAndEncodeOntoYouCreature=Do you want to exile {0} and encode it onto a creature you control? lblChooseACreatureYouControlToEncode=Choose a creature you control to encode -lblEncoding=Encoding #ExploreEffect.java lblRevealedForExplore=Revealed for Explore lblPutThisCardToYourGraveyard=Put this card in your graveyard? @@ -1768,15 +1761,15 @@ lblLifeTotal=Life Total #ManaEffect.java lblDoYouWantAddMana=Do you want to add mana? lblSelectManaProduce=Select Mana to Produce -lblChooseSingleColorFrom=Choose a single color from +lblChooseSingleColorFromTarget=Choose a single color from {0} #ManifestEffect.java lblChooseCardToManifest=Choose cards to manifest #MeldEffect.java lblChooseCardToMeld=Choose card to meld with #MillEffect.java -lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to +lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}? #MultiplePilesEffect.java -lblChooseCardsInPile=Choose cards in Pile +lblChooseCardsInTargetPile=Choose cards in Pile {0}? #PeekAndRevealEffect.java lblRevealingCardFrom=Revealing cards from lblRevealCardToOtherPlayers=Reveal cards to other players? @@ -1786,7 +1779,7 @@ lblSelectCardToPlay=Select a card to play #ProtectAllEffect.java lblChooseAProtection=Choose a protection #PumpEffect.java -lblApplyPumpTo=Apply pump to +lblApplyPumpToTarget=Apply pump to {0}? #RearrangeTopOfLibraryEffect.java lblDoyouWantShuffleTheLibrary=Do you want to shuffle the library? #RepeatEffect.java @@ -1794,22 +1787,20 @@ lblDoYouWantRepeatProcessAgain=Do you want to repeat this process again? #RevealHandEffect.java lblDoYouWantRevealYourHand=Do you want to reveal your hand? #RollPlanarDiceEffect.java -lblRolled=rolled +lblPlayerRolledResult={0} rolled {1} #SacrificeEffect.java lblDoYouWantPayEcho=Do you want to pay Echo lblPayEcho=Pay Echo lblDoYouWantSacrifice=Do you want to sacrifice? -lblSacrifice=Sacrifice -lblDestroys=Destroys #SetStateEffect.java lblFaceDownCardCantTurnFaceUp=Face-down card can't turn face up #ShuffleEffect.java -lblHaveTargetShuffle=Have %s shuffle? +lblHaveTargetShuffle=Have {0} shuffle? #SurveilEffect.java lblDoYouWantSurveil=Do you want to surveil? #TapOrUntapAllEffect.java lblPermanents=Permanents -lblTapOrUntap=Tap or Untap +lblTapOrUntapTarget=Tap or Untap {0}? #TwoPilesEffect.java lblSelectCardForFaceDownPile=Select cards for a face down pile lblDivideCardIntoTwoPiles=Divide cards into two piles @@ -1846,4 +1837,18 @@ lblCastSpellOrPlayLand=Cast Spell/Play Land lblRepeatAddCard=Repeat Last Add Card lblRemoveFromGame=Remove Card from Game lblRiggedRoll=Rigged Planar Roll -lblWalkTo=Planeswalk to \ No newline at end of file +lblWalkTo=Planeswalk to +#ZoneType.java +lblHandZone=hand +lblLibraryZone=library +lblGraveyardZone=graveyard +lblBattlefieldZone=battlefield +lblExileZone=exile +lblFlashbackZone=flashback +lblCommandZone=command +lblStackZone=stack +lblSideboardZone=sideboard +lblAnteZone=ante +lblSchemeDeckZone=schemedeck +lblPlanarDeckZone=planardeck +lblNoneZone=none \ No newline at end of file diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index e2cd6d0aaef..17c9dc4b3dc 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1113,14 +1113,14 @@ lblSelectBlocker=Select creatures to block lblOrSelectBlockTarget= or select another attacker to declare blockers for. lblMorph=Morph #PlayerControllerHuman.java -lblYouHaveWonTheCoinToss=%s, has ganado el lanzamiento de la moneda. -lblYouLostTheLastGame=%s, perdiste la última partida. +lblYouHaveWonTheCoinToss={0}, has ganado el lanzamiento de la moneda. +lblYouLostTheLastGame={0}, perdiste la última partida. lblWouldYouLiketoPlayorDraw=¿Quieres jugar o ceder? lblWhoWouldYouLiketoStartthisGame=¿Quién te gustaría que empezara esta partida? (Haz clic en el retrato) lblPlay=Jugar lblDraw=Ceder -lblTooFewCardsMainDeck=Muy pocas cartas en tu mazo principal (mínimo %s), por favor realiza modificaciones a tu mazo de nuevo. -lblTooManyCardsSideboard=Demasiadas cartas en tu banquillo (máximo %s), por favor realiza modificaciones a tu mazo de nuevo. +lblTooFewCardsMainDeck=Muy pocas cartas en tu mazo principal (mínimo {0}), por favor realiza modificaciones a tu mazo de nuevo. +lblTooManyCardsSideboard=Demasiadas cartas en tu banquillo (máximo {0}), por favor realiza modificaciones a tu mazo de nuevo. lblAssignCombatDamageWerentBlocked=¿Quieres asignar su daño de combate como si no estuviera bloqueado? lblChosenCards=Cartas elegidas lblAttacker=Atacante @@ -1169,15 +1169,15 @@ lblSelectCardsToBePutIntoTheGraveyard=Selecciona las cartas para ponerlas en el lblCardsToPutInTheGraveyard=Cartas para poner en el Cementerio lblDiscardUpToNCards=Descarta hasta %d carta(s) lblDiscardNCards=Descarta %d carta(s) -lblSelectNCardsToDiscardUnlessDiscarduType=Selecciona %d carta(s) para descartar, a menos que descartes un %s. +lblSelectNCardsToDiscardUnlessDiscarduType=Selecciona %d carta(s) para descartar, a menos que descartes un {0}. lblCleanupPhase=Fase de Limpieza -lblSelectCardsToDiscardHandDownMaximum=Selecciona %d carta(s) a descartar para reducir tu mano al máximo de %max cartas. +lblSelectCardsToDiscardHandDownMaximum=Selecciona {0} carta(s) a descartar para reducir tu mano al máximo de {1} cartas. lblChooseMinCardToDiscard=Elige %d carta(s) para descartar lblDiscarded=Descartado -lblChooseDamageOrderFor=Selecciona el Orden de Daños para %s +lblChooseDamageOrderFor=Selecciona el Orden de Daños para {0} lblDamagedFirst=Dañado Primero -lblChooseBlockerAfterWhichToPlaceAttackert=Elige un bloqueador después del cual colocar %s en el orden de daño; cancela para colocarlo primero. -lblPutCardOnTopOrBottomLibrary=¿Poner %s en la parte superior o inferior de tu biblioteca? +lblChooseBlockerAfterWhichToPlaceAttackert=Elige un bloqueador después del cual colocar {0} en el orden de daño; cancela para colocarlo primero. +lblPutCardOnTopOrBottomLibrary=¿Poner {0} en la parte superior o inferior de tu biblioteca? lblChooseOrderCardsPutIntoLibrary=Elige el orden de las cartas para poner en la biblioteca lblClosestToTop=Más cerca de la parte superior lblChooseOrderCardsPutOntoBattlefield=Elige el orden de las cartas que quieres poner en el campo de batalla @@ -1190,20 +1190,20 @@ lblChooseOrderCopiesCast=Elige el orden de las copias que se van a invocar lblDelveHowManyCards=¿Excavar cuántas cartas? lblExileWhichCard=¿Exiliar qué carta? lblDestroy=destroy -lblUpTo=up to +lblSelectUpToNumTargetToAction=Select up to %d {0}(s) to {1}. +lblSelectNumTargetToAction=Select %d {0}(s) to {1}. lblHighestBidder=Highest Bidder lblUseTriggeredAbilityOf=Use triggered ability of lblExertAttackersConfirm=Exert Attackers? -lblThereNoCardIn=There are no cards in -lblPut=Put -lblOnTheTopLibraryOrGraveyard=on the top of library or graveyard? +lblThereNoCardInPlayerZone=There are no cards in {0} {1} +lblPutCardsOnTheTopLibraryOrGraveyard=Put {0} on the top of library or graveyard? lblLibrary=Library lblGraveyard=Graveyard lblTop=Top lblBottom=Bottom -lblManaFrom=mana from +lblNColorManaFromCard={0} {1} mana from {2} lblPayManaFromManaPool=Pay Mana from Mana Pool -lblChooseATargetType=Choose a %s type +lblChooseATargetType=Choose a {0} type lblUntap=Untap lblOdds=Odds lblEvens=Evens @@ -1217,21 +1217,17 @@ lblWinTheFlip=win the flip lblLoseTheFlip=lose the flip lblChooseAResult=Choose a result lblSelectPreventionShieldToUse=select which prevention shield to use -lblChooseAMode=Choose a mode -lblActivated=activated +lblPlayerActivatedCardChooseMode={0} activated {1} - Choose a mode lblNoPlayerHasPriorityCannotAddedManaToPool=No player has priority at the moment, so mana cannot be added to their pool. lblOverwriteExistFileConfirm=Overwrite existing file? lblFileExists=File exists! lblSelectGameStateFile=Select Game State File lblFileNotFound=File not found -lblIn=in -lblOnTheBattlefield=on the battlefield -lblOnTheStackOrInPlay=on the stack / in play -lblPutCard=Put card -lblForWhichPlayer=for which player? -lblShould=Should -lblAffectedWithSummoningSickness=be affected with Summoning Sickness? -lblBeAddedToLibraryTopOrBottom=be added to the top or to the bottom of the library? +lblPutCardInWhichPlayerZone=Put card in {0} for which player? +lblPutCardInWhichPlayerBattlefield=Put card on the battlefield for which player? +lblPutCardInWhichPlayerPlayOrStack=Put card on the stack / in play for which player? +lblCardShouldBeSummoningSicknessConfirm=Should {0} be affected with Summoning Sickness? +lblCardShouldBeAddedToLibraryTopOrBottom=Should {0} be added to the top or to the bottom of the library? lblExileCardsFromPlayerHandConfirm=Exile card(s) from which player's hand? lblChooseCardsExile=Choose cards to exile lblExileCardsFromPlayerBattlefieldConfirm=Exile card(s) from which player's battlefield? @@ -1245,7 +1241,11 @@ lblRestartingActionSequence=Restarting action sequence. lblErrorPleaseCheckID=Error: Check IDs and ensure they're separated by spaces and/or commas. lblErrorEntityWithId=Error: Entity with ID lblNotFound=not found -lblChooseAnnounceFor=Choose %s for %name +lblChooseAnnounceForCard=Choose {0} for {1} +lblSacrifice=Sacrifice +lblLookCardInPlayerZone=Looking at cards in {0} {1} +lblPlayerZone={0} {1} +lblActionFromPlayerDeck={0} from {1} Deck #AbstractGuiGame.java lblConcedeCurrentGame=Esto concederá la partida actual y perderás.\n\n¿Conceder de todos modos? lblConcedeTitle=¿Conceder Partida? @@ -1591,24 +1591,22 @@ lblSelectOrder=Select Order lblIfYouDo=if you do lblOr=or lblDoYouWantPay=Do you want to pay +lblDoYouWantPayNLife=Do you want to pay {0} life? lblDoyouWantTo=Do you want to -lblDoYouWantMill=Do you want to mill -lblDoYouWantFlip=Do you want to flip -lblDoYouWantRemove=Do you want to remove -lblDoYouWantRemoveCounters=Do you want to remove counters from -lblDoYouWantExile=Do you want to exile +lblDoYouWantMillNCardsOrDoAction=Do you want to mill {0} card(s)? {1} +lblDoYouWantFlipNCoinOrDoAction=Do you want to flip {0} coin(s)? {1} +lblDoYouWantRemoveNTargetTypeCounterFromCard=Do you want to remove {0} {1} counter from {2}? +lblDoYouWantRemoveCountersFromCard=Do you want to remove counters from {0}? +lblDoYouWantExileNCardsFromYourLibrary=Do you want to exile {0} card(s) from your library? lblDoYouWantExileAllCardYouGraveyard=Do you want to exile all cards in your graveyard? lblDoYouWantDiscardYourHand=Do you want to discard your hand? -lblDoYouWantSpend=Do you want to spend -lblLetThatPlayer=let that player -lblCoin=coin -lblCounterOfPointer=counter -lblFrom=from -lblFromYourLibrary=from your library? +lblDoYouWantSpendNTargetTypeCounter=Do you want to spend {0} {1} counter? +lblDoYouWantLetThatPlayerDrawNCardOrDoAction=Do you want to let that player draw {0} card(s)?{1} +lblDoYouWantDrawNCardOrDoAction=Do you want to draw {0} card(s)?{1} lblSelectRemoveCounterCard=Select a card to remove a counter lblSelectRemoveCounterType=Select type counters to remove -lblExileFrom=Exile from -lblPutCardFromWhose=Put cards from whose +lblExileFromZone=Exile from {0} +lblPutCardFromWhoseZone=Put cards from whose {0}? lblPutCardToLibrary=Put cards to Library lblPutIntoLibrary=put into library. lblGainControl=gain control. @@ -1617,62 +1615,60 @@ lbldiscard=discard. lblReveal=reveal lblTap=tap lblCurrentCard=Current Card -lblSelectOfCardsTo=Select -lblCardsTo=card(s) to +lblSelectNSpecifyTypeCardsToAction=Select %d {0} card(s) to {1} #AbandonEffect.java -lblWouldYoulikeAbandon=Would you like to abandon the scheme +lblWouldYoulikeAbandonSource=Would you like to abandon the scheme {0}? #ActivateAbilityEffect.java lblChooseManaAbility=Choose a mana ability: #AddTurnEffect.java -lblTakesExtraTurn=takes an extra turn. +lblPlayerTakesExtraTurn={0} takes an extra turn. #AmassEffect.java. lblChooseAnArmy=Choose an army to put counters on #AssignGroupEffect.java -lblChooseAbilityFor=Choose ability for +lblChooseAbilityForObject=Choose ability for {0} #AttachEffect.java -lblDoYouWantAttach=Do you want to attach -lblSelectAPlayerAttachTo=Select a player to attach to. -lblSelectACardAttachTo=Select a card to attach to. +lblDoYouWantAttachSourceToTarget=Do you want to attach {0} to {1}? +lblSelectAPlayerAttachSourceTo={0} - Select a player to attach to. +lblSelectACardAttachSourceTo={0} - Select a card to attach to. #BidLifeEffect.java lblChooseStartingBid=Choose a starting bid lblDoYouWantTopBid=Do you want to top bid? Current Bid \= -lblTopBidWith=topped bid with +lblTopBidWithValueLife=topped bid with {0} life #BondEffect.java lblSelectACardPair=Select a card to pair with #ChangeCombatantsEffect.java -lblChooseDefenderToAttackWith=Choose which defender to attack with +lblChooseDefenderToAttackWithCard=Choose which defender to attack with {0} #ChangeTargetsEffect.java -lblDoYouWantChangeTargets=Do you want to change targets of +lblDoYouWantChangeAbilityTargets=Do you want to change targets of {0}? #ChangeTextEffect.java lblChooseColorReplace=Choose a color word to replace lblChooseNewColor=Choose a new color word #ChangeZoneEffect.java -lblDoYouWantMove=Do you want to move -lblDeclareDefenderFor=Declare a defender for +lblDoYouWantMoveTargetFromOriToDest=Do you want to move {0} from {1} to {2}? +lblPutThatCardFromPlayerOriginToDestination=Put that card from for {0} {1} to {2} +lblSearchPlayerZoneConfirm=Search {0} {1}? lblCardMatchSearchingTypeInAlternateZones=cards match your searching type in Alternate Zones. -lblPutThatCardFrom=Put that card from lblLookingCardIn=Looking at cards in -lblDoYouWantPlay=Do you want to play -lblSelectCardFrom=Select a card from -lblSelectUpTo=Select up to -lblCardsFrom=cards from -lblSelectCardsFrom=Select cards from -lblCancelSearchUpTo=Cancel Search? Up to -lblMoreCard=more card -lblCanBeSelected=can be selected. +lblDoYouWantPlayCard=Do you want to play {0}? +lblSelectCardFromPlayerZone=Select a card from {0} {1} +lblSelectUpToNumCardFromPlayerZone=Select up to {0} cards from {1} {2} +lblSelectCardsFromPlayerZone=Select cards from {0} {1} +lblCancelSearchUpToSelectNumCards=Cancel Search? Up to {0} more card(s) can be selected. +#ChangeZoneAllEffect.java +lblMoveTargetFromOriginToDestination=Move {0} from {1} to {2}? #ChooseCardEffect.java -lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to -lblTotalPower=Total Power +lblChoose=Choose +lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to {0} +lblTotalPowerNum=Total Power: {0} lblCancelChooseConfirm=Cancel Choose? #ChooseCardNameEffect.java lblChooseACardName=Choose a card name -lblChooseA=Choose a -lblCardName=card name -lblPicked=picked +lblChooseASpecificCard=Choose a {0} card name. +lblPlayerPickedChosen={0} picked {1} #ChooseColorEffect.java lblChooseAColor=Choose a color -lblChoose=Choose -lblOrMore=or more +lblAtLastChooseNumColors=Choose {0} or more color +lblChooseSpecifiedRangeColors=Choose {0} to {1} color #ChooseDirectionEffect.java lblLeftClockwise=Left (clockwise) lblRightAntiClockwise=Right (anticlockwise) @@ -1681,7 +1677,7 @@ lblChooseDirection=Choose a direction lblChooseOne=Choose one #ChooseNumberEffect.java lblChooseNumber=Choose a number -lblChose=chose +lblPlayerChoseNum={0} chose {1} #ChoosePlayerEffect.java lblChoosePlayer=Choose a player #ChooseSourceEffect.java @@ -1692,26 +1688,24 @@ lblReveals=reveals lblWinsClash=wins clash lblLosesClash=loses clash #CloneEffect.java -lblDoYouWantCopy=Do you want to copy +lblDoYouWantCopy=Do you want to copy {0}? #ControlExchangeVariantEffect.java lblChooseCards=Choose cards #CopyPermanentEffect.java lblCopyPermanentConfirm=Copy this permanent? lblDefender=defender #CopySpellAbilityEffect.java -lblDoyouWantCopyTheSpell=Do you want to copy the spell -lblSelectMultiSpellCopyToStack=Select %d spell to copy to stack +lblDoyouWantCopyTheSpell=Do you want to copy the spell {0}? +lblSelectMultiSpellCopyToStack=Select {0} spell to copy to stack lblSelectASpellCopy=Select a spell to copy #CounterEffect.java lblRemoveDestination=a destination to remove #CountersMoveEffect.java -lblChooseTakeCountersCard=Choose card to take %s counters from -lblTakeHowMany=Take how many -lblCountersFrom=counters from -lblChooseCardToGet=Choose cards to get -lblPutHowMany=Put how many -lblCountersOn=counters on -lblCounters=counters +lblChooseTakeCountersCard=Choose card to take {0} counters from +lblTakeHowManyTargetCounterFromCard=Take how many {0} counters from {1}? +lblChooseCardToGetCountersFrom=Choose cards to get {0} counters from {1}. +lblPutHowManyTargetCounterOnCard=Put how many {0} counters on {1}? +lblTakeHowManyTargetCounters=Take how many {0} counters? #CountersProliferateEffect.java lblChooseProliferateTarget=Choose any number of permanents and/or players for proliferate #CountersPutEffect.java @@ -1719,41 +1713,40 @@ lblChooseACreatureWithLeastToughness=Choose a creature with the least toughness lblSelectCounterTypeAddTo=Select counter type to add to lblHowManyCounters=How many counters? lblChooseAnOpponent=Choose an opponent -lblDoYouWantPutTargetP1P1CountersOn=Do you want to put %d +1/+1 counters on +lblDoYouWantPutTargetP1P1CountersOnCard=Do you want to put {0} +1/+1 counters on {1}? #CountersPutOrRemoveEffect.java lblSelectCounterTypeToAddOrRemove=Select type of counters to add or remove -lblWhatToDoWithTargetCounter=What to do with that '%s' counter +lblWhatToDoWithTargetCounter=What to do with that '{0}' counter #CountersRemoveEffect.java lblAllCounters=all counters lblACounters=a counter -lblChooseCardtoTakeTargetCounters=Choose cards to take %s counters from -lblSelectRemoveCountersNumberOfTarget=Select the number of %s counters to remove +lblCounters=counters +lblChooseCardsToTakeTargetCounters=Choose cards to take {0} counters from +lblSelectRemoveCountersNumberOfTarget=Select the number of {0} counters to remove lblSelectCountersTypeToRemove=Select type of counters to remove #DamageDealEffect.java -lblDoyouWantDealTargetDamageTo=Do you want to deal %d damage to +lblDoyouWantDealTargetDamageToTarget=Do you want to deal {0} damage to {1}? #DigEffect.java lblWouldYouLikeProceedWithOptionalAbility=Would you like to proceed with the optional ability for -lblChooseACardToLeaveTargetLibraryTop=Choose a card to leave on top of %s library -lblChooseACardLeaveTarget=Choose a card to leave in %s -lblChooseCardsPutInto=Choose card(s) to put into -lblChooseCardPutOnTargetLibarayBottom=Choose card(s) to put on the bottom of %s library -lblChooseCardPutOnTargetLibarayTop=Choose card(s) to put on top of %s library +lblChooseACardToLeaveTargetLibraryTop=Choose a card to leave on top of {0} library +lblChooseACardLeaveTarget=Choose a card to leave in {0} {1} +lblChooseCardsPutIntoZone=Choose card(s) to put into {0} +lblChooseCardPutOnTargetLibarayBottom=Choose card(s) to put on the bottom of {0} library +lblChooseCardPutOnTargetLibarayTop=Choose card(s) to put on top of {0} library +lblPlayerPickedCardFrom={0} picked card(s) from lblNoValidCards=No valid cards -lblThisCard=this card -lblTheseCards=these cards #DigUntilEffect.java lblDoYouWantDigYourLibrary=Do you want to dig your library? -lblDoYouWantPutCardTo=Do you want to put that card to +lblDoYouWantPutCardToZone=Do you want to put that card to {0}? #DiscardEffect.java -lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard %d random card(s)? -lblHasChosen=has chosen +lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard {0} random card(s)? +lblPlayerHasChosenCardsFrom={0} has chosen card(s) from #DrawEffect.java -lblDoYouWantDraw=Do you want to draw +lblDoYouWantDrawCards=Do you want to draw {0}? lblHowMayCardDoYouWantDraw=How may cards do you want to draw? #EncodeEffect.java -lblAndEncodeOntoAYouControlCreature=and encode it onto a creature you control? +lblDoYouWantExileCardAndEncodeOntoYouCreature=Do you want to exile {0} and encode it onto a creature you control? lblChooseACreatureYouControlToEncode=Choose a creature you control to encode -lblEncoding=Encoding #ExploreEffect.java lblRevealedForExplore=Revealed for Explore lblPutThisCardToYourGraveyard=Put this card in your graveyard? @@ -1768,15 +1761,15 @@ lblLifeTotal=Life Total #ManaEffect.java lblDoYouWantAddMana=Do you want to add mana? lblSelectManaProduce=Select Mana to Produce -lblChooseSingleColorFrom=Choose a single color from +lblChooseSingleColorFromTarget=Choose a single color from {0} #ManifestEffect.java lblChooseCardToManifest=Choose cards to manifest #MeldEffect.java lblChooseCardToMeld=Choose card to meld with #MillEffect.java -lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to +lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}? #MultiplePilesEffect.java -lblChooseCardsInPile=Choose cards in Pile +lblChooseCardsInTargetPile=Choose cards in Pile {0}? #PeekAndRevealEffect.java lblRevealingCardFrom=Revealing cards from lblRevealCardToOtherPlayers=Reveal cards to other players? @@ -1786,7 +1779,7 @@ lblSelectCardToPlay=Select a card to play #ProtectAllEffect.java lblChooseAProtection=Choose a protection #PumpEffect.java -lblApplyPumpTo=Apply pump to +lblApplyPumpToTarget=Apply pump to {0}? #RearrangeTopOfLibraryEffect.java lblDoyouWantShuffleTheLibrary=Do you want to shuffle the library? #RepeatEffect.java @@ -1794,22 +1787,20 @@ lblDoYouWantRepeatProcessAgain=Do you want to repeat this process again? #RevealHandEffect.java lblDoYouWantRevealYourHand=Do you want to reveal your hand? #RollPlanarDiceEffect.java -lblRolled=rolled +lblPlayerRolledResult={0} rolled {1} #SacrificeEffect.java lblDoYouWantPayEcho=Do you want to pay Echo lblPayEcho=Pay Echo lblDoYouWantSacrifice=Do you want to sacrifice? -lblSacrifice=Sacrifice -lblDestroys=Destroys #SetStateEffect.java lblFaceDownCardCantTurnFaceUp=Face-down card can't turn face up #ShuffleEffect.java -lblHaveTargetShuffle=Have %s shuffle? +lblHaveTargetShuffle=Have {0} shuffle? #SurveilEffect.java lblDoYouWantSurveil=Do you want to surveil? #TapOrUntapAllEffect.java lblPermanents=Permanents -lblTapOrUntap=Tap or Untap +lblTapOrUntapTarget=Tap or Untap {0}? #TwoPilesEffect.java lblSelectCardForFaceDownPile=Select cards for a face down pile lblDivideCardIntoTwoPiles=Divide cards into two piles @@ -1846,4 +1837,18 @@ lblCastSpellOrPlayLand=Cast Spell/Play Land lblRepeatAddCard=Repeat Last Add Card lblRemoveFromGame=Remove Card from Game lblRiggedRoll=Rigged Planar Roll -lblWalkTo=Planeswalk to \ No newline at end of file +lblWalkTo=Planeswalk to +#ZoneType.java +lblHandZone=hand +lblLibraryZone=library +lblGraveyardZone=graveyard +lblBattlefieldZone=battlefield +lblExileZone=exile +lblFlashbackZone=flashback +lblCommandZone=command +lblStackZone=stack +lblSideboardZone=sideboard +lblAnteZone=ante +lblSchemeDeckZone=schemedeck +lblPlanarDeckZone=planardeck +lblNoneZone=none \ No newline at end of file diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 9d02b163033..bb7d335121e 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -327,7 +327,7 @@ lblOk=确认 lblReset=重置 lblAuto=自动 #VAssignDamage.java -lbLAssignDamageDealtBy=分配对%s造成的伤害 +lbLAssignDamageDealtBy=对%s造成的伤害进行分配 lblLClickDamageMessage=左键单击:分配一点伤害。(左键加Ctrl):分配致命伤害。 lblRClickDamageMessage=右键单击:取消分配一点伤害。(左键加Ctrl):取消分配的所有伤害 lblTotalDamageText=可用的伤害值:未知 @@ -1035,7 +1035,7 @@ lblAny=任意 lblFantasy=幻想 lblGeneric=通用 #MatchController.java -lblChooseAbilityToPlay=选择使用的能力 +lblChooseAbilityToPlay=选择要使用的异能 lblSelected=选择 #ItemManager.java lblAdvancedSearch=高级搜索 @@ -1113,14 +1113,14 @@ lblSelectBlocker=选择进行阻挡的生物 lblOrSelectBlockTarget= 或者为其他进攻者选择阻挡者。 lblMorph=变身 #PlayerControllerHuman.java -lblYouHaveWonTheCoinToss=%s,你赢得了这次掷硬币。 -lblYouLostTheLastGame=%s,最后一场比赛你输了。 +lblYouHaveWonTheCoinToss={0},你赢得了这次掷硬币。 +lblYouLostTheLastGame={0},最后一场比赛你输了。 lblWouldYouLiketoPlayorDraw=你想先手还是后手? lblWhoWouldYouLiketoStartthisGame=你想谁先开始游戏?(单击头像) lblPlay=先手 lblDraw=后手 -lblTooFewCardsMainDeck=主牌中卡牌数过少(最少为%s),请重新修改套牌。 -lblTooManyCardsSideboard=备牌中卡牌数过多(最多为%s),请重新修改套牌。 +lblTooFewCardsMainDeck=主牌中卡牌数过少(最少为{0}),请重新修改套牌。 +lblTooManyCardsSideboard=备牌中卡牌数过多(最多为{0}),请重新修改套牌。 lblAssignCombatDamageWerentBlocked=是否要像没有被阻挡一样分配战斗伤害? lblChosenCards=选择牌 lblAttacker=进攻者 @@ -1169,15 +1169,15 @@ lblSelectCardsToBePutIntoTheGraveyard=选择要放于坟场的卡牌 lblCardsToPutInTheGraveyard=放于坟场的卡牌 lblDiscardUpToNCards=最多弃%d张牌 lblDiscardNCards=弃%d张牌 -lblSelectNCardsToDiscardUnlessDiscarduType=选择要丢弃的%d张牌,除非你丢弃%s。 +lblSelectNCardsToDiscardUnlessDiscarduType=选择要丢弃的%d张牌,除非你丢弃{0}。 lblCleanupPhase=清除步骤 -lblSelectCardsToDiscardHandDownMaximum=选择要丢弃的%d张牌,以使你的手牌数量减少到%max张。 +lblSelectCardsToDiscardHandDownMaximum=选择要丢弃的{0}张牌,以使你的手牌数量减少到{1}张。 lblChooseMinCardToDiscard=选择%d张牌弃掉 lblDiscarded=弃牌 -lblChooseDamageOrderFor=选择%s造成伤害的顺序 +lblChooseDamageOrderFor=选择{0}造成伤害的顺序 lblDamagedFirst=先造成伤害 -lblChooseBlockerAfterWhichToPlaceAttackert=选择%s后造成伤害的阻挡者; cancel to place it first -lblPutCardOnTopOrBottomLibrary=将%s放到牌库顶还是底? +lblChooseBlockerAfterWhichToPlaceAttackert=选择{0}后造成伤害的阻挡者; cancel to place it first +lblPutCardOnTopOrBottomLibrary=将{0}放到牌库顶还是底? lblChooseOrderCardsPutIntoLibrary=选择要放入牌库中的牌的顺序 lblClosestToTop=最接近顶部 lblChooseOrderCardsPutOntoBattlefield=选择要放入战场中的牌的顺序 @@ -1190,20 +1190,20 @@ lblChooseOrderCopiesCast=选择要复制品的释放顺序。 lblDelveHowManyCards=掘穴多少张牌? lblExileWhichCard=放逐哪张牌? lblDestroy=消灭 -lblUpTo=最多 +lblSelectUpToNumTargetToAction=选择最多%d个{0}用于{1}。 +lblSelectNumTargetToAction=选择%d个{0}用于{1}。 lblHighestBidder=最高出价者 lblUseTriggeredAbilityOf=使用触发异能 lblExertAttackersConfirm=进攻者耗竭? -lblThereNoCardIn=里面没有牌 -lblPut=放到 -lblOnTheTopLibraryOrGraveyard=牌库顶或坟场? +lblThereNoCardInPlayerZone={0}的{1}中没有牌 +lblPutCardsOnTheTopLibraryOrGraveyard=将{0}放到牌库顶还是坟场? lblLibrary=牌库 lblGraveyard=坟场 lblTop=顶 lblBottom=底 -lblManaFrom=法术力自 +lblNColorManaFromCard={2}产{0}个{1}法术力 lblPayManaFromManaPool=从法术力池支付法术力 -lblChooseATargetType=选择一个%s类型 +lblChooseATargetType=选择一个{0}类型 lblUntap=重置 lblOdds=赔率 lblEvens=偶数 @@ -1217,21 +1217,17 @@ lblWinTheFlip=赢得此掷 lblLoseTheFlip=输掉此掷 lblChooseAResult=选择一个结果 lblSelectPreventionShieldToUse=选择一个保护罩使用 -lblChooseAMode=选择一种模式 -lblActivated=已启动 +lblPlayerActivatedCardChooseMode={0}激活了{1} - 选择一个模式 lblNoPlayerHasPriorityCannotAddedManaToPool=目前没有牌手具有优先权,因此无法向法术力池中加入法术力。 lblOverwriteExistFileConfirm=覆盖已有的文件? lblFileExists=文件已存在! lblSelectGameStateFile=选择游戏状态文件 lblFileNotFound=文件未找到 -lblIn=在 -lblOnTheBattlefield=在战场上 -lblOnTheStackOrInPlay=在堆叠/在使用 -lblPutCard=放置牌 -lblForWhichPlayer=哪个牌手? -lblShould=应该 -lblAffectedWithSummoningSickness=被召唤失调效应影响? -lblBeAddedToLibraryTopOrBottom=被添加到牌库顶还是底? +lblPutCardInWhichPlayerZone=将牌放于哪个牌手的{0}中? +lblPutCardInWhichPlayerBattlefield=将牌放于哪个牌手的战场? +lblPutCardInWhichPlayerPlayOrStack=将牌放于哪个牌手的堆叠/使哪个牌手使用牌? +lblCardShouldBeSummoningSicknessConfirm={0}是否应该受到召唤失调的影响? +lblCardShouldBeAddedToLibraryTopOrBottom=将{0}添加到牌库顶还是底? lblExileCardsFromPlayerHandConfirm=从哪位玩家手中放逐牌? lblChooseCardsExile=选择要放逐的牌 lblExileCardsFromPlayerBattlefieldConfirm=从哪个玩家的战场放逐牌? @@ -1245,7 +1241,11 @@ lblRestartingActionSequence=重新启动行动序列 lblErrorPleaseCheckID=错误:请检查ID,并确保他们之间用空格和/或逗号分隔。 lblErrorEntityWithId=错误:实体的ID lblNotFound=没有找到 -lblChooseAnnounceFor=为%name选择%s +lblChooseAnnounceForCard=为{1}选择{0} +lblSacrifice=牺牲 +lblLookCardInPlayerZone=查看{0}的{1}中的牌 +lblPlayerZone={0}的{1} +lblActionFromPlayerDeck=从{1}的套牌{0} #AbstractGuiGame.java lblConcedeCurrentGame=这局游戏认输。\n\n确认吗? lblConcedeTitle=这局游戏认输? @@ -1588,27 +1588,25 @@ lblFinalMatch=决赛 #DualListBox.java lblSelectOrder=选择顺序 #HumanPlay.java -lblIfYouDo=如果你 +lblIfYouDo=如果你如此做 lblOr=或 lblDoYouWantPay=你想要支付 +lblDoYouWantPayNLife=你想要支付{0}点生命吗? lblDoyouWantTo=你想要 -lblDoYouWantMill=你想要磨 -lblDoYouWantFlip=你想要抛 -lblDoYouWantRemove=你想要移除 -lblDoYouWantRemoveCounters=你想要删除指示物从 -lblDoYouWantExile=你想要放逐 +lblDoYouWantMillNCardsOrDoAction=你想要磨{0}张牌吗? {1} +lblDoYouWantFlipNCoinOrDoAction=你想要抛{0}个硬币吗? {1} +lblDoYouWantRemoveNTargetTypeCounterFromCard=你想要从{2}移除{0}个{1}指示物吗? +lblDoYouWantRemoveCountersFromCard=你想要从{0}删除指示物吗? +lblDoYouWantExileNCardsFromYourLibrary=你想要从你的牌库放逐{0}张牌吗? lblDoYouWantExileAllCardYouGraveyard=你想要放逐坟场中的所有牌吗? lblDoYouWantDiscardYourHand=你想要弃掉你的手牌吗? -lblDoYouWantSpend=你想要花费 -lblLetThatPlayer=让那个牌手 -lblCoin=硬币 -lblCounterOfPointer=指示物 -lblFrom=从 -lblFromYourLibrary=从你的牌库? +lblDoYouWantSpendNTargetTypeCounter=你想要花费{0}个{1}指示物吗? +lblDoYouWantLetThatPlayerDrawNCardOrDoAction=你想要抓让该牌手{0}张牌吗?{1} +lblDoYouWantDrawNCardOrDoAction=你想要抓{0}张牌吗?{1} lblSelectRemoveCounterCard=选择一张牌删除指示物 lblSelectRemoveCounterType=选择一个指示物类型删除 -lblExileFrom=放逐自 -lblPutCardFromWhose=谁放置牌 +lblExileFromZone=从{0}中放逐 +lblPutCardFromWhoseZone=将牌放入谁的{0}? lblPutCardToLibrary=将牌放入牌库 lblPutIntoLibrary=放入牌库。 lblGainControl=获得控制权。 @@ -1617,62 +1615,60 @@ lbldiscard=弃牌。 lblReveal=展示 lblTap=横置 lblCurrentCard=当前牌 -lblSelectOfCardsTo=选择 -lblCardsTo=牌到 +lblSelectNSpecifyTypeCardsToAction=选择%d张{0}牌用于{1} #AbandonEffect.java -lblWouldYoulikeAbandon=你想要终止阴谋 +lblWouldYoulikeAbandonSource=你想要终止阴谋{0}吗? #ActivateAbilityEffect.java lblChooseManaAbility=选择一个法术力异能: #AddTurnEffect.java -lblTakesExtraTurn=获得一个额外回合。 +lblPlayerTakesExtraTurn={0}获得一个额外回合。 #AmassEffect.java. lblChooseAnArmy=选择一个军队将指示物放置在上面。 #AssignGroupEffect.java -lblChooseAbilityFor=选择一个异能 +lblChooseAbilityForObject=从{0}中选择一个异能 #AttachEffect.java -lblDoYouWantAttach=你想要装备 -lblSelectAPlayerAttachTo=选择一个要结附的牌手。 -lblSelectACardAttachTo=选择一个要结附的牌。 +lblDoYouWantAttachSourceToTarget=你想要将{0}装备到{1}吗? +lblSelectAPlayerAttachSourceTo={0} - 选择一个要结附的牌手。 +lblSelectACardAttachSourceTo={0} - 选择一个要结附的牌。 #BidLifeEffect.java lblChooseStartingBid=选择一个初始价钱 lblDoYouWantTopBid=你想要喊更高的价? 现在价钱 \= -lblTopBidWith=最高喊价 +lblTopBidWithValueLife=最高喊价为{0}生命 #BondEffect.java lblSelectACardPair=选择要组成搭档的牌 #ChangeCombatantsEffect.java lblChooseDefenderToAttackWith=选择守军进行进攻 #ChangeTargetsEffect.java -lblDoYouWantChangeTargets=你是否想要更改目标 +lblDoYouWantChangeAbilityTargets=你是否想要更改{0}的目标 #ChangeTextEffect.java lblChooseColorReplace=选择一个要替换的颜色词 lblChooseNewColor=选择一个新的颜色词 #ChangeZoneEffect.java -lblDoYouWantMove=你想要移动 -lblDeclareDefenderFor=声明阻挡者 +lblDoYouWantMoveTargetFromOriToDest=你想要将{0}从{1}移动到{2}吗? +lblPutThatCardFromPlayerOriginToDestination=将这张牌从{0}的{1}放到{2} +lblSearchPlayerZoneConfirm=搜索{0}的{1}? lblCardMatchSearchingTypeInAlternateZones=在你的备用区域搜索匹配类型的卡牌。 -lblPutThatCardFrom=放置这张牌从 lblLookingCardIn=看牌自 -lblDoYouWantPlay=你想要使用 -lblSelectCardFrom=选择一张牌从 -lblSelectUpTo=最多选择 -lblCardsFrom=牌张来自 -lblSelectCardsFrom=选择牌张来自 -lblCancelSearchUpTo=取消搜索?直到 -lblMoreCard=更多牌 -lblCanBeSelected=可以选择 +lblDoYouWantPlayCard=你想要使用{0}? +lblSelectCardFromPlayerZone=选择一张牌从{0}的{1} +lblSelectUpToNumCardFromPlayerZone=最多选择{0}张牌来自{1}的{2} +lblSelectCardsFromPlayerZone=选择牌张来自{0}的{1} +lblCancelSearchUpToSelectNumCards=取消搜索?最多可以搜索{0}张牌。 +#ChangeZoneAllEffect.java +lblMoveTargetFromOriginToDestination=将{0}从{1}移动到{2}? #ChooseCardEffect.java -lblSelectCreatureWithTotalPowerLessOrEqualTo=选择一些生物其力量合小于或等于 -lblTotalPower=总力量 +lblChoose=选择 +lblSelectCreatureWithTotalPowerLessOrEqualTo=选择一些生物其力量只和需小于或等于{0} +lblTotalPowerNum=总力量:{0} lblCancelChooseConfirm=取消选择? #ChooseCardNameEffect.java lblChooseACardName=选择一个牌名 -lblChooseA=选择一个 -lblCardName=牌名 -lblPicked=选取 +lblChooseASpecificCard=选择一个{0}牌名 +lblPlayerPickedChosen={0}选取了{1} #ChooseColorEffect.java lblChooseAColor=选择一个颜色 -lblChoose=选择 -lblOrMore=或更多 +lblAtLastChooseNumColors=选择{0}或更多颜色 +lblChooseSpecifiedRangeColors=选择{0}到{1}种颜色 #ChooseDirectionEffect.java lblLeftClockwise=左(顺时针) lblRightAntiClockwise=右(逆时针) @@ -1681,7 +1677,7 @@ lblChooseDirection=选择一个方向 lblChooseOne=选择一个 #ChooseNumberEffect.java lblChooseNumber=选择一个数 -lblChose=已选择 +lblPlayerChoseNum={0}已选择{1} #ChoosePlayerEffect.java lblChoosePlayer=选择一个牌手 #ChooseSourceEffect.java @@ -1692,26 +1688,24 @@ lblReveals=展示 lblWinsClash=比点赢了 lblLosesClash=比点输了 #CloneEffect.java -lblDoYouWantCopy=你想要复制 +lblDoYouWantCopy=你想要复制{0}吗? #ControlExchangeVariantEffect.java lblChooseCards=选择牌 #CopyPermanentEffect.java lblCopyPermanentConfirm=复制这个永久物? lblDefender=守军 #CopySpellAbilityEffect.java -lblDoyouWantCopyTheSpell=你想要复制这个咒语 -lblSelectMultiSpellCopyToStack=选择%d个咒语复制到堆叠 +lblDoyouWantCopyTheSpell=你想要复制咒语{0}吗? +lblSelectMultiSpellCopyToStack=选择{0}个咒语复制到堆叠 lblSelectASpellCopy=选择一个咒语进行复制 #CounterEffect.java lblRemoveDestination=要删除的目标 #CountersMoveEffect.java -lblChooseTakeCountersCard=选择牌获得%s指示物自 -lblTakeHowMany=获得几个 -lblCountersFrom=指示物自 -lblChooseCardToGet=选择牌获得 -lblPutHowMany=放置几个 -lblCountersOn=指示物在上面 -lblCounters=指示物 +lblChooseTakeCountersCard=选择牌获得{0}指示物自 +lblTakeHowManyTargetCounterFromCard={1}获得多少个{0}指示物? +lblChooseCardToGetCountersFrom=选择牌从{1}获取{0}指示物 +lblPutHowManyTargetCounterOnCard=放置多少个{0}指示物到{1}? +lblTakeHowManyTargetCounters=获得多少{0}指示物? #CountersProliferateEffect.java lblChooseProliferateTarget=选择任意数量的永久物和或牌手进行增殖 #CountersPutEffect.java @@ -1719,41 +1713,40 @@ lblChooseACreatureWithLeastToughness=选择防御力最小的生物 lblSelectCounterTypeAddTo=选择指示物类型以添加到 lblHowManyCounters=多少指示物? lblChooseAnOpponent=选择一个对手 -lblDoYouWantPutTargetP1P1CountersOn=你想要放置%d个+1+1指示物到 +lblDoYouWantPutTargetP1P1CountersOnCard=你想要放置{0}个+1+1指示物到{1}吗? #CountersPutOrRemoveEffect.java lblSelectCounterTypeToAddOrRemove=选择要添加或移除的指示物的类型 -lblWhatToDoWithTargetCounter=如何使用'%s'指示物 +lblWhatToDoWithTargetCounter=如何使用'{0}'指示物 #CountersRemoveEffect.java lblAllCounters=所有指示物 lblACounters=一个指示物 -lblChooseCardtoTakeTargetCounters=选择牌要获得%s指示物自 -lblSelectRemoveCountersNumberOfTarget=选择要删除的%s指示物的数量 +lblCounters=指示物 +lblChooseCardsToTakeTargetCounters=选择牌要获得{0}指示物自 +lblSelectRemoveCountersNumberOfTarget=选择要删除的{0}指示物的数量 lblSelectCountersTypeToRemove=选择要删除的指示物类型 #DamageDealEffect.java -lblDoyouWantDealTargetDamageTo=你想造成%d伤害给 +lblDoyouWantDealTargetDamageToTarget=你想对{1}造成{0}伤害吗? #DigEffect.java lblWouldYouLikeProceedWithOptionalAbility=你想继续以下可选的异能吗 -lblChooseACardToLeaveTargetLibraryTop=选择一张牌离开%s的牌库顶 -lblChooseACardLeaveTarget=选择一张牌离开%s -lblChooseCardsPutInto=选择牌放到 -lblChooseCardPutOnTargetLibarayBottom=选择牌放到%s的牌库底 -lblChooseCardPutOnTargetLibarayTop=选择牌放到%s的牌库顶 +lblChooseACardToLeaveTargetLibraryTop=选择一张牌离开{0}的牌库顶 +lblChooseACardLeaveTarget=选择一张牌离开{0}的{1} +lblChooseCardsPutIntoZone=选择牌放到{0} +lblChooseCardPutOnTargetLibarayBottom=选择牌放到{0}的牌库底 +lblChooseCardPutOnTargetLibarayTop=选择牌放到}0的牌库顶 +lblPlayerPickedCardFrom={0}选择了牌自 lblNoValidCards=没有有效的牌 -lblThisCard=这张牌 -lblTheseCards=这些牌 #DigUntilEffect.java lblDoYouWantDigYourLibrary=你想要挖掘你的牌库吗? -lblDoYouWantPutCardTo=你想把这张牌放到 +lblDoYouWantPutCardToZone=你想把这张牌放到{0}吗? #DiscardEffect.java lblWouldYouLikeRandomDiscardTargetCard=你想随机弃掉%d张牌吗? -lblHasChosen=选择了 +lblPlayerHasChosenCardsFrom={0}选择了牌自 #DrawEffect.java -lblDoYouWantDraw=你想抓 +lblDoYouWantDrawCards=你想抓{0}张牌吗? lblHowMayCardDoYouWantDraw=你想怎么抓牌? #EncodeEffect.java -lblAndEncodeOntoAYouControlCreature=和赋码到你控制的生物? +lblDoYouWantExileCardAndEncodeOntoYouCreature=你想放逐{0}并将之赋码到你控制的生物吗? lblChooseACreatureYouControlToEncode=选择你控制的生物进场赋码 -lblEncoding=已赋码 #ExploreEffect.java lblRevealedForExplore=勘察所展示 lblPutThisCardToYourGraveyard=把这张牌放到你的坟墓场? @@ -1768,25 +1761,25 @@ lblLifeTotal=生命总数 #ManaEffect.java lblDoYouWantAddMana=你想增加法术力吗? lblSelectManaProduce=选择要产出的法术力 -lblChooseSingleColorFrom=选择一种颜色自 +lblChooseSingleColorFromTarget=从{0}选择一种颜色 #ManifestEffect.java lblChooseCardToManifest=选择要显化的牌 #MeldEffect.java lblChooseCardToMeld=选择要融合的牌 #MillEffect.java -lblDoYouWantPutLibraryCardsTo=你想要从牌库中把牌放入 +lblDoYouWantPutLibraryCardsTo=你想要从牌库中把牌放入{0}吗? #MultiplePilesEffect.java -lblChooseCardsInPile=选择一堆卡 +lblChooseCardsInTargetPile=选择堆{0}中的牌? #PeekAndRevealEffect.java lblRevealingCardFrom=展示牌自 -lblRevealCardToOtherPlayers=想其他玩家展示牌? +lblRevealCardToOtherPlayers=向其他玩家展示牌? #PlayEffect.java -lblChooseUpTo=选择最多 +lblChooseUpTo=最多选择 lblSelectCardToPlay=选择要使用的牌 #ProtectAllEffect.java lblChooseAProtection=选择一个保护 #PumpEffect.java -lblApplyPumpTo=将pump用于 +lblApplyPumpToTarget=将pump用于{0}? #RearrangeTopOfLibraryEffect.java lblDoyouWantShuffleTheLibrary=你想要洗这个牌库吗? #RepeatEffect.java @@ -1794,22 +1787,20 @@ lblDoYouWantRepeatProcessAgain=你是否想再次重复这个过程? #RevealHandEffect.java lblDoYouWantRevealYourHand=你想展示你的手牌吗? #RollPlanarDiceEffect.java -lblRolled=已掷骰 +lblPlayerRolledResult={0}掷骰结果为{1} #SacrificeEffect.java lblDoYouWantPayEcho=你想支付返响费用 lblPayEcho=支付返响费用 lblDoYouWantSacrifice=你想牺牲吗? -lblSacrifice=牺牲 -lblDestroys=消灭 #SetStateEffect.java lblFaceDownCardCantTurnFaceUp=面朝下的牌不能面朝上 #ShuffleEffect.java -lblHaveTargetShuffle=%s洗牌了吗? +lblHaveTargetShuffle={0}洗牌了吗? #SurveilEffect.java lblDoYouWantSurveil=你想刺探吗? #TapOrUntapAllEffect.java lblPermanents=永久物 -lblTapOrUntap=横置或重置 +lblTapOrUntapTarget=横置还是重置{0}? #TwoPilesEffect.java lblSelectCardForFaceDownPile=选择一个面朝下的堆 lblDivideCardIntoTwoPiles=将牌分为两堆 @@ -1847,3 +1838,17 @@ lblRepeatAddCard=重复上一张添加的牌 lblRemoveFromGame=从游戏中删除牌 lblRiggedRoll=触发时空骰 lblWalkTo=时空换入 +#ZoneType.java +lblHandZone=手牌 +lblLibraryZone=牌库 +lblGraveyardZone=坟场 +lblBattlefieldZone=战场 +lblExileZone=放逐区 +lblFlashbackZone=返照 +lblCommandZone=指挥官区 +lblStackZone=堆叠 +lblSideboardZone=备牌 +lblAnteZone=赌注牌区 +lblSchemeDeckZone=魔王套牌 +lblPlanarDeckZone=时空套牌 +lblNoneZone=空 \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/r_2_2_satyr_noblock.txt b/forge-gui/res/tokenscripts/r_1_1_satyr_noblock.txt similarity index 94% rename from forge-gui/res/tokenscripts/r_2_2_satyr_noblock.txt rename to forge-gui/res/tokenscripts/r_1_1_satyr_noblock.txt index 26b583a1347..686eb9da76f 100644 --- a/forge-gui/res/tokenscripts/r_2_2_satyr_noblock.txt +++ b/forge-gui/res/tokenscripts/r_1_1_satyr_noblock.txt @@ -2,6 +2,6 @@ Name:Satyr ManaCost:no cost Types:Creature Satyr Colors:red -PT:2/2 +PT:1/1 K:CARDNAME can't block. Oracle:This creature can't block. diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 26d3734bb17..9fda7312c54 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -25,7 +25,6 @@ import forge.match.input.InputPayMana; import forge.match.input.InputPayManaOfCostPayment; import forge.match.input.InputPayManaSimple; import forge.match.input.InputSelectCardsFromList; -import forge.util.Lang; import forge.util.TextUtil; import forge.util.collect.FCollectionView; import forge.util.gui.SGuiChoose; @@ -312,7 +311,7 @@ public class HumanPlay { return false; } - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantPay") + " " + amount + " " + Localizer.getInstance().getMessage("lblLife") + "?" + orString, sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantPayNLife", String.valueOf(amount)) + orString, sourceAbility)) { return false; } @@ -332,11 +331,15 @@ public class HumanPlay { return false; } - StringBuilder sb = new StringBuilder(Localizer.getInstance().getMessage("lblDoyouWantTo") + " "); - sb.append(res.contains(p) ? "" : Localizer.getInstance().getMessage("lblLetThatPlayer") + " "); - sb.append(Localizer.getInstance().getMessage("lblDraw") + " ").append(Lang.nounWithAmount(amount, " " + Localizer.getInstance().getMessage("lblCard"))).append("?").append(orString); + String message = null; + if (res.contains(p)) { + message = Localizer.getInstance().getMessage("lblDoYouWantLetThatPlayerDrawNCardOrDoAction", String.valueOf(amount), orString); + } + else { + message = Localizer.getInstance().getMessage("lblDoYouWantDrawNCardOrDoAction", String.valueOf(amount), orString); + } - if (!p.getController().confirmPayment(part, sb.toString(), sourceAbility)) { + if (!p.getController().confirmPayment(part, message, sourceAbility)) { return false; } @@ -370,7 +373,7 @@ public class HumanPlay { final int amount = getAmountFromPart(part, source, sourceAbility); final CardCollectionView list = p.getCardsIn(ZoneType.Library); if (list.size() < amount) { return false; } - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lbllblDoYouWantMill") + " " + amount + " " + Localizer.getInstance().getMessage("lblCard") + (amount == 1 ? "" : "s") + "?" + orString, sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantMillNCardsOrDoAction", String.valueOf(amount), orString), sourceAbility)) { return false; } CardCollectionView listmill = p.getCardsIn(ZoneType.Library, amount); @@ -378,7 +381,7 @@ public class HumanPlay { } else if (part instanceof CostFlipCoin) { final int amount = getAmountFromPart(part, source, sourceAbility); - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantFlip") + " " + amount + " " + Localizer.getInstance().getMessage("lblCoin") + (amount == 1 ? "" : "s") + "?" + orString, sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantFlipNCoinOrDoAction", String.valueOf(amount), orString), sourceAbility)) { return false; } final int n = FlipCoinEffect.getFilpMultiplier(p); @@ -412,7 +415,7 @@ public class HumanPlay { } if (!mandatory) { - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantRemove") + " " + Lang.nounWithAmount(amount, counterType.getName() + " " + Localizer.getInstance().getMessage("lblCounterOfPointer")) + " " + Localizer.getInstance().getMessage("lblFrom") + " " + source + "?",sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantRemoveNTargetTypeCounterFromCard", String.valueOf(amount), counterType.getName(), source), sourceAbility)) { return false; } } @@ -432,7 +435,7 @@ public class HumanPlay { if (allCounters < amount) { return false; } if (!mandatory) { - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantRemoveCounters") + " " + part.getDescriptiveType() + " ?",sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantRemoveCountersFromCard", part.getDescriptiveType()), sourceAbility)) { return false; } } @@ -492,8 +495,7 @@ public class HumanPlay { return false; } if (from == ZoneType.Library) { - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantExile") + " " + nNeeded + - " " + Localizer.getInstance().getMessage("lblCard") + (nNeeded == 1 ? "" : "s") + " " + Localizer.getInstance().getMessage("lblFromYourLibrary"), sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantExileNCardsFromYourLibrary", String.valueOf(nNeeded)), sourceAbility)) { return false; } list = list.subList(0, nNeeded); @@ -502,7 +504,7 @@ public class HumanPlay { // replace this with input CardCollection newList = new CardCollection(); for (int i = 0; i < nNeeded; i++) { - final Card c = p.getGame().getCard(SGuiChoose.oneOrNone(Localizer.getInstance().getMessage("lblExileFrom") + " " + from, CardView.getCollection(list))); + final Card c = p.getGame().getCard(SGuiChoose.oneOrNone(Localizer.getInstance().getMessage("lblExileFromZone", from.getTranslatedName()), CardView.getCollection(list))); if (c == null) { return false; } @@ -538,7 +540,7 @@ public class HumanPlay { payableZone.add(player); } } - Player chosen = controller.getGame().getPlayer(SGuiChoose.oneOrNone(TextUtil.concatNoSpace(Localizer.getInstance().getMessage("lblPutCardFromWhose") + " ", from.toString(), "?"), PlayerView.getCollection(payableZone))); + Player chosen = controller.getGame().getPlayer(SGuiChoose.oneOrNone(Localizer.getInstance().getMessage("lblPutCardFromWhoseZone", from.getTranslatedName()), PlayerView.getCollection(payableZone))); if (chosen == null) { return false; } @@ -629,7 +631,7 @@ public class HumanPlay { } if (!mandatory) { - if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantSpend") + " " + Lang.nounWithAmount(amount, counterType.getName() + " " + Localizer.getInstance().getMessage("lblCounterOfPointer")) + "?",sourceAbility)) { + if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantSpendNTargetTypeCounter", String.valueOf(amount), counterType.getName()), sourceAbility)) { return false; } } @@ -675,7 +677,7 @@ public class HumanPlay { if (list.size() < amount) { return false; } // unable to pay (not enough cards) InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, amount, amount, list, sourceAbility); - inp.setMessage(Localizer.getInstance().getMessage("lblSelectOfCardsTo") + " %d " + cpl.getDescriptiveType() + " " + Localizer.getInstance().getMessage("lblCardsTo") + " " + actionName); + inp.setMessage(Localizer.getInstance().getMessage("lblSelectNSpecifyTypeCardsToAction", cpl.getDescriptiveType(), actionName)); inp.setCancelAllowed(true); inp.showAndWait(); diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 6d320a4ffdb..650479a14a7 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -246,10 +246,10 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (newMain != null) { String errMsg; if (newMain.size() < deckMinSize) { - errMsg = TextUtil.concatNoSpace(localizer.getMessage("lblTooFewCardsMainDeck").replace("%s", String.valueOf(deckMinSize))); + errMsg = TextUtil.concatNoSpace(localizer.getMessage("lblTooFewCardsMainDeck", String.valueOf(deckMinSize))); } else { - errMsg = TextUtil.concatNoSpace(localizer.getMessage("lblTooManyCardsSideboard").replace("%s", String.valueOf(sbMax))); + errMsg = TextUtil.concatNoSpace(localizer.getMessage("lblTooManyCardsSideboard", String.valueOf(sbMax))); } getGui().showErrorDialog(errMsg, localizer.getMessage("lblInvalidDeck")); } @@ -313,7 +313,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public Integer announceRequirements(final SpellAbility ability, final String announce, final boolean canChooseZero) { final int min = canChooseZero ? 0 : 1; - return getGui().getInteger(localizer.getMessage("lblChooseAnnounceFor").replace("%s", announce).replace("%name", ability.getHostCard().getName()) , min, + return getGui().getInteger(localizer.getMessage("lblChooseAnnounceForCard", announce, ability.getHostCard().getName()) , min, Integer.MAX_VALUE, min + 9); } @@ -336,14 +336,16 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return CardCollection.EMPTY; } - final StringBuilder builder = new StringBuilder(localizer.getMessage("lblSelectOfCardsTo") + " "); + String inpMessage = null; if (min == 0) { - builder.append(localizer.getMessage("lblUpTo") + " "); + inpMessage = localizer.getMessage("lblSelectUpToNumTargetToAction", message, action); + } + else { + inpMessage = localizer.getMessage("lblSelectNumTargetToAction", message, action); } - builder.append("%d ").append(message).append("(s) " + localizer.getMessage("lblTo") + " ").append(action).append("."); final InputSelectCardsFromList inp = new InputSelectCardsFromList(this, min, max, valid, sa); - inp.setMessage(builder.toString()); + inp.setMessage(inpMessage); inp.setCancelAllowed(min == 0); inp.showAndWait(); return new CardCollection(inp.getSelected()); @@ -654,17 +656,25 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public Player chooseStartingPlayer(final boolean isFirstGame) { if (game.getPlayers().size() == 2) { - String prompt = String.format( - isFirstGame ? localizer.getMessage("lblYouHaveWonTheCoinToss") : localizer.getMessage("lblYouLostTheLastGame"), - player.getName()); + String prompt = null; + if (isFirstGame) { + prompt = localizer.getMessage("lblYouHaveWonTheCoinToss", player.getName()); + } + else { + prompt = localizer.getMessage("lblYouLostTheLastGame", player.getName()); + } prompt += "\n\n" + localizer.getMessage("lblWouldYouLiketoPlayorDraw"); final InputConfirm inp = new InputConfirm(this, prompt, localizer.getMessage("lblPlay"), localizer.getMessage("lblDraw")); inp.showAndWait(); return inp.getResult() ? this.player : this.player.getOpponents().get(0); } else { - String prompt = String.format( - isFirstGame ? localizer.getMessage("lblYouHaveWonTheCoinToss") : localizer.getMessage("lblYouLostTheLastGame"), - player.getName()); + String prompt = null; + if (isFirstGame) { + prompt = localizer.getMessage("lblYouHaveWonTheCoinToss", player.getName()); + } + else { + prompt = localizer.getMessage("lblYouLostTheLastGame", player.getName()); + } prompt += "\n\n" + localizer.getMessage("lblWhoWouldYouLiketoStartthisGame"); final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList<>(this, 1, 1, new FCollection<>(game.getPlayersInTurnOrder())); @@ -678,7 +688,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public CardCollection orderBlockers(final Card attacker, final CardCollection blockers) { final CardView vAttacker = CardView.get(attacker); getGui().setPanelSelection(vAttacker); - return game.getCardList(getGui().order(localizer.getMessage("lblChooseDamageOrderFor").replace("%s", vAttacker.toString()), localizer.getMessage("lblDamagedFirst"), + return game.getCardList(getGui().order(localizer.getMessage("lblChooseDamageOrderFor", vAttacker.toString()), localizer.getMessage("lblDamagedFirst"), CardView.getCollection(blockers), vAttacker)); } @@ -703,7 +713,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final CardView vAttacker = CardView.get(attacker); getGui().setPanelSelection(vAttacker); return game.getCardList(getGui().insertInList( - localizer.getMessage("lblChooseBlockerAfterWhichToPlaceAttackert").replace("%s", vAttacker.toString()), + localizer.getMessage("lblChooseBlockerAfterWhichToPlaceAttackert", vAttacker.toString()), CardView.get(blocker), CardView.getCollection(oldBlockers))); } @@ -711,7 +721,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public CardCollection orderAttackers(final Card blocker, final CardCollection attackers) { final CardView vBlocker = CardView.get(blocker); getGui().setPanelSelection(vBlocker); - return game.getCardList(getGui().order(localizer.getMessage("lblChooseDamageOrderFor").replace("%s", vBlocker.toString()), localizer.getMessage("lblDamagedFirst"), + return game.getCardList(getGui().order(localizer.getMessage("lblChooseDamageOrderFor", vBlocker.toString()), localizer.getMessage("lblDamagedFirst"), CardView.getCollection(attackers), vBlocker)); } @@ -723,9 +733,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public void reveal(final List cards, final ZoneType zone, final PlayerView owner, String message) { if (StringUtils.isBlank(message)) { - message = localizer.getMessage("lblLookingCardIn") + " {player's} " + zone.name().toLowerCase(); + message = localizer.getMessage("lblLookCardInPlayerZone", "{player's}", zone.getTranslatedName().toLowerCase()); } else { - message += "{player's} " + zone.name().toLowerCase(); + message += localizer.getMessage("lblPlayerZone", "{player's}", zone.getTranslatedName().toLowerCase()); } final String fm = MessageUtil.formatMessage(message, getLocalPlayerView(), owner); if (!cards.isEmpty()) { @@ -733,7 +743,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont getGui().reveal(fm, cards); endTempShowCards(); } else { - getGui().message(MessageUtil.formatMessage(localizer.getMessage("lblThereNoCardIn") + " {player's} " + zone.name().toLowerCase(), + getGui().message(MessageUtil.formatMessage(localizer.getMessage("lblThereNoCardInPlayerZone", "{player's}", zone.getTranslatedName().toLowerCase()), player, owner), fm); } } @@ -809,7 +819,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont tempShowCard(c); getGui().setCard(view); boolean result = false; - result = InputConfirm.confirm(this, view, TextUtil.concatNoSpace(localizer.getMessage("lblPut") + " ", view.toString(), " " + localizer.getMessage("lblOnTheTopLibraryOrGraveyard")), + result = InputConfirm.confirm(this, view, localizer.getMessage("lblPutCardsOnTheTopLibraryOrGraveyard", view.toString()), true, ImmutableList.of(localizer.getMessage("lblLibrary"), localizer.getMessage("lblGraveyard"))); if (result) { toTop = topN; @@ -841,7 +851,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont getGui().setCard(c.getView()); boolean result = false; - result = InputConfirm.confirm(this, view, localizer.getMessage("lblPutCardOnTopOrBottomLibrary").replace("%s", view.toString()), + result = InputConfirm.confirm(this, view, localizer.getMessage("lblPutCardOnTopOrBottomLibrary", view.toString()), true, ImmutableList.of(localizer.getMessage("lblTop"), localizer.getMessage("lblBottom"))); endTempShowCards(); @@ -1003,7 +1013,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return super.hasAllTargets(); } }; - target.setMessage(localizer.getMessage("lblSelectNCardsToDiscardUnlessDiscarduType").replace("%s", uType)); + target.setMessage(localizer.getMessage("lblSelectNCardsToDiscardUnlessDiscarduType", uType)); target.showAndWait(); return new CardCollection(target.getSelected()); } @@ -1019,8 +1029,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final List options = Lists.newArrayList(); for (int i = 0; i < manaChoices.size(); i++) { final Mana m = manaChoices.get(i); - options.add(TextUtil.concatNoSpace(String.valueOf(1 + i), ". ", MagicColor.toLongString(m.getColor()), - " " + localizer.getMessage("lblManaFrom") + " ", m.getSourceCard().toString())); + options.add(localizer.getMessage("lblNColorManaFromCard", String.valueOf(1 + i), MagicColor.toLongString(m.getColor()), m.getSourceCard().toString())); } final String chosen = getGui().one(localizer.getMessage("lblPayManaFromManaPool"), options); final String idx = TextUtil.split(chosen, '.')[0]; @@ -1044,9 +1053,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont sortCreatureTypes(types); } if (isOptional) { - return getGui().oneOrNone(localizer.getMessage("lblChooseATargetType").replace("%s", kindOfType.toLowerCase()), types); + return getGui().oneOrNone(localizer.getMessage("lblChooseATargetType", kindOfType.toLowerCase()), types); } - return getGui().one(localizer.getMessage("lblChooseATargetType").replace("%s", kindOfType.toLowerCase()), types); + return getGui().one(localizer.getMessage("lblChooseATargetType", kindOfType.toLowerCase()), types); } // sort creature types such that those most prevalent in player's deck are @@ -1317,7 +1326,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } }; final String message = localizer.getMessage("lblCleanupPhase") + "\n" - + localizer.getMessage("lblSelectCardsToDiscardHandDownMaximum").replace("%d", String.valueOf(nDiscard)).replace("%max", String.valueOf(max)); + + localizer.getMessage("lblSelectCardsToDiscardHandDownMaximum", String.valueOf(nDiscard), String.valueOf(max)); inp.setMessage(message); inp.setCancelAllowed(false); inp.showAndWait(); @@ -1486,8 +1495,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont game.getTracker().freeze(); // refreeze if the tracker was frozen prior to this update } final List choices = new ArrayList<>(spellViewCache.keySet()); - final String modeTitle = TextUtil.concatNoSpace(sa.getActivatingPlayer().toString(), " " + localizer.getMessage("lblActivated") + " ", - sa.getHostCard().toString(), " - " + localizer.getMessage("lblChooseAMode")); + final String modeTitle = localizer.getMessage("PlayerActivatedCardChooseMode", sa.getActivatingPlayer().toString(), sa.getHostCard().toString()); final List chosen = Lists.newArrayListWithCapacity(num); for (int i = 0; i < num; i++) { SpellAbilityView a; @@ -1770,7 +1778,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public void revealAnte(final String message, final Multimap removedAnteCards) { for (final Player p : removedAnteCards.keySet()) { - getGui().reveal(message + " " + localizer.getMessage("lblFrom") + " " + Lang.getPossessedObject(MessageUtil.mayBeYou(player, p), localizer.getMessage("lblDeck")), + getGui().reveal(localizer.getMessage("lblActionFromPlayerDeck", message, Lang.getPossessedObject(MessageUtil.mayBeYou(player, p), "")), ImmutableList.copyOf(removedAnteCards.get(p))); } } @@ -2356,11 +2364,21 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont private void addCardToZone(ZoneType zone, final boolean repeatLast, final boolean noTriggers) { final ZoneType targetZone = repeatLast ? lastAddedZone : zone; - String zoneStr = targetZone != ZoneType.Battlefield ? localizer.getMessage("lblIn") + " " + targetZone.name().toLowerCase() - : noTriggers ? localizer.getMessage("lblOnTheBattlefield") : localizer.getMessage("lblOnTheStackOrInPlay"); + String message = null; + if (targetZone != ZoneType.Battlefield) { + message = localizer.getMessage("lblPutCardInWhichPlayerZone", targetZone.getTranslatedName().toLowerCase()); + } + else { + if (noTriggers) { + message = localizer.getMessage("lblPutCardInWhichPlayerBattlefield"); + } + else { + message = localizer.getMessage("lblPutCardInWhichPlayerPlayOrStack"); + } + } final Player p = repeatLast ? lastAddedPlayer - : game.getPlayer(getGui().oneOrNone(localizer.getMessage("lblPutCard") + " " + zoneStr + " " + localizer.getMessage("lblForWhichPlayer"), + : game.getPlayer(getGui().oneOrNone(message, PlayerView.getCollection(game.getPlayers()))); if (p == null) { return; @@ -2391,7 +2409,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont lastSummoningSickness = true; } else { lastSummoningSickness = getGui().confirm(forgeCard.getView(), - TextUtil.concatWithSpace(localizer.getMessage("lblShould"), forgeCard.toString(), localizer.getMessage("lblAffectedWithSummoningSickness"))); + localizer.getMessage("lblCardShouldBeSummoningSicknessConfirm", forgeCard.toString())); } } } @@ -2440,8 +2458,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } else if (targetZone == ZoneType.Library) { if (!repeatLast) { - lastTopOfTheLibrary = getGui().confirm(forgeCard.getView(), - TextUtil.concatWithSpace(localizer.getMessage("lblShould"), forgeCard.toString(), localizer.getMessage("lblBeAddedToLibraryTopOrBottom")), true, Arrays.asList(localizer.getMessage("lblTop"), localizer.getMessage("lblBottom"))); + lastTopOfTheLibrary = getGui().confirm(forgeCard.getView(), localizer.getMessage("lblCardShouldBeAddedToLibraryTopOrBottom", forgeCard.toString()), + true, Arrays.asList(localizer.getMessage("lblTop"), localizer.getMessage("lblBottom"))); } if (lastTopOfTheLibrary) { game.getAction().moveToLibrary(forgeCard, null);