From 49e7f97257a92d97ea7660d30f3e5b40b738f4f2 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:18:24 -0400 Subject: [PATCH 01/18] elspeth_resplendent.txt --- .../res/cardsfolder/upcoming/elspeth_resplendent.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/elspeth_resplendent.txt diff --git a/forge-gui/res/cardsfolder/upcoming/elspeth_resplendent.txt b/forge-gui/res/cardsfolder/upcoming/elspeth_resplendent.txt new file mode 100644 index 00000000000..401d4ee883d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/elspeth_resplendent.txt @@ -0,0 +1,9 @@ +Name:Elspeth Resplendent +ManaCost:3 W W +Types:Legendary Planeswalker Elspeth +Loyalty:5 +A:AB$ PutCounter | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | CounterTypes$ P1P1,ChosenFromList | TypeList$ Flying,First Strike,Lifelink,Vigilance | SpellDescription$ Choose up to one target creature. Put a +1/+1 counter and a counter from among flying, first strike, lifelink, or vigilance on it. +A:AB$ Dig | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | DigNum$ 7 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Permanent.cmcLE3 | ChangeValidDesc$ permanent card with mana value 3 or less | DestinationZone$ Battlefield | WithCounter$ Shield | PrimaryPrompt$ You may choose a permanent card with mana value 3 or less to put on the battlefield | RestRandomOrder$ True | SpellDescription$ Look at the top seven cards of your library. You may put a permanent card with mana value 3 or less from among them onto the battlefield with a shield counter on it. Put the rest on the bottom of your library in a random order. +A:AB$ Token | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | TokenAmount$ 5 | TokenScript$ w_3_3_angel_flying | SpellDescription$ Create five 3/3 white Angel creature tokens with flying. +DeckHas:Ability$Counters|LifeGain|Token & Type$Angel +Oracle:[+1]: Choose up to one target creature. Put a +1/+1 counter and a counter from among flying, first strike, lifelink, or vigilance on it.\n[−3]: Look at the top seven cards of your library. You may put a permanent card with mana value 3 or less from among them onto the battlefield with a shield counter on it. Put the rest on the bottom of your library in a random order.\n[−7]: Create five 3/3 white Angel creature tokens with flying. From 377a87897b49f61c2c7d88a6f2c85a850a0f5ab1 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:18:41 -0400 Subject: [PATCH 02/18] crystalline_giant.txt big refactor --- .../res/cardsfolder/c/crystalline_giant.txt | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/crystalline_giant.txt b/forge-gui/res/cardsfolder/c/crystalline_giant.txt index 3d41ffafaaa..cc6f8232c54 100644 --- a/forge-gui/res/cardsfolder/c/crystalline_giant.txt +++ b/forge-gui/res/cardsfolder/c/crystalline_giant.txt @@ -2,18 +2,8 @@ Name:Crystalline Giant ManaCost:3 Types:Artifact Creature Giant PT:3/3 -T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigGenericChoice | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, choose a kind of counter at random that CARDNAME doesn't have on it from among flying, first strike, deathtouch, hexproof, lifelink, menace, reach, trample, vigilance, and +1/+1. Put a counter of that kind on CARDNAME. -SVar:TrigGenericChoice:DB$ GenericChoice | AtRandom$ True | Choices$ Flying,FirstStrike,Deathtouch,Hexproof,Lifelink,Menace,Reach,Trample,Vigilance,P1P1 -SVar:Flying:DB$ PutCounter | IsPresent$ Card.Self+counters_EQ0_Flying | CounterType$ Flying | CounterNum$ 1 | SpellDescription$ FLY -SVar:FirstStrike:DB$ PutCounter | IsPresent$ Card.Self+counters_EQ0_First Strike | CounterType$ First Strike | CounterNum$ 1 | SpellDescription$ FIR -SVar:Deathtouch:DB$ PutCounter | IsPresent$ Card.Self+counters_EQ0_Deathtouch | CounterType$ Deathtouch | CounterNum$ 1 | SpellDescription$ DEA -SVar:Hexproof:DB$ PutCounter | IsPresent$ Card.Self+counters_EQ0_Hexproof | CounterType$ Hexproof | CounterNum$ 1 | SpellDescription$ HEX -SVar:Lifelink:DB$ PutCounter | IsPresent$ Card.Self+counters_EQ0_Lifelink | CounterType$ Lifelink | CounterNum$ 1 | SpellDescription$ LIF -SVar:Menace:DB$ PutCounter | IsPresent$ Card.Self+counters_EQ0_Menace | CounterType$ Menace | CounterNum$ 1 | SpellDescription$ MEN -SVar:Reach:DB$ PutCounter | IsPresent$ Card.Self+counters_EQ0_Reach | CounterType$ Reach | CounterNum$ 1 | SpellDescription$ REA -SVar:Trample:DB$ PutCounter | IsPresent$ Card.Self+counters_EQ0_Trample | CounterType$ Trample | CounterNum$ 1 | SpellDescription$ TRA -SVar:Vigilance:DB$ PutCounter | IsPresent$ Card.Self+counters_EQ0_Vigilance | CounterType$ Vigilance | CounterNum$ 1 | SpellDescription$ VIG -SVar:P1P1:DB$ PutCounter | IsPresent$ Card.Self+counters_EQ0_P1P1 | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ P1P1 +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, choose a kind of counter at random that CARDNAME doesn't have on it from among flying, first strike, deathtouch, hexproof, lifelink, menace, reach, trample, vigilance, and +1/+1. Put a counter of that kind on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | UniqueType$ True | RandomType$ True | CounterType$ Flying,First Strike,Deathtouch,Hexproof,Lifelink,Menace,Reach,Trample,Vigilance,P1P1 SVar:PlayMain1:TRUE -DeckHas:Ability$Counters +DeckHas:Ability$Counters|LifeGain Oracle:At the beginning of combat on your turn, choose a kind of counter at random that Crystalline Giant doesn't have on it from among flying, first strike, deathtouch, hexproof, lifelink, menace, reach, trample, vigilance, and +1/+1. Put a counter of that kind on Crystalline Giant. From 7bd694ea5afadf84ec801bff22283b9d2e77f811 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:19:40 -0400 Subject: [PATCH 03/18] DigEffect getStackDesc updates for Elspeth --- .../forge/game/ability/effects/DigEffect.java | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) 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 1e8fb401bc4..92e5be8194c 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 @@ -67,14 +67,34 @@ public class DigEffect extends SpellAbilityEffect { } String verb2 = "put "; - String where = "in their hand "; + String where = " in their hand "; if (destZone1.equals("exile")) { verb2 = "exile "; - where = ""; + where = " "; + } else if (destZone1.equals("battlefield")) { + verb2 = "put "; + where = " onto the battlefield "; } - sb.append(" They ").append(verb2).append(Lang.getNumeral(numToChange)).append(" of them ").append(where); - sb.append(sa.hasParam("ExileFaceDown") ? "face down " : "").append("and put the rest "); - sb.append(destZone2); + + sb.append(" They ").append(sa.hasParam("Optional") ? "may " : "").append(verb2); + if (sa.hasParam("ChangeValid")) { + String what = sa.hasParam("ChangeValidDesc") ? sa.getParam("ChangeValidDesc") : + sa.getParam("ChangeValid"); + sb.append(Lang.nounWithNumeralExceptOne(numToChange, what)).append(" from among them").append(where); + } else { + sb.append(Lang.getNumeral(numToChange)).append(" of them").append(where); + } + sb.append(sa.hasParam("ExileFaceDown") ? "face down " : ""); + if (sa.hasParam("WithCounter") || sa.hasParam("ExileWithCounter")) { + String ctr = sa.hasParam("WithCounter") ? sa.getParam("WithCounter") : + sa.getParam("ExileWithCounter"); + sb.append("with a "); + sb.append(CounterType.getType(ctr).getName().toLowerCase()); + sb.append(" counter on it. They "); + } else { + sb.append("and "); + } + sb.append("put the rest ").append(destZone2); } return sb.toString(); From 9a6bd47ec5f837eb5f77c489c2e6f7466d9425ef Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:20:38 -0400 Subject: [PATCH 04/18] DigEffect add "WithCounter" ETB counters for Battlefield destination --- .../src/main/java/forge/game/ability/effects/DigEffect.java | 3 +++ 1 file changed, 3 insertions(+) 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 92e5be8194c..cccbe92417c 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 @@ -408,6 +408,9 @@ public class DigEffect extends SpellAbilityEffect { if (sa.hasParam("Tapped")) { c.setTapped(true); } + if (destZone1.equals(ZoneType.Battlefield) && sa.hasParam("WithCounter")) { + c.addEtbCounter(CounterType.getType(sa.getParam("WithCounter")), 1, player); + } c = game.getAction().moveTo(zone, c, sa, moveParams); if (destZone1.equals(ZoneType.Battlefield)) { if (addToCombat(c, c.getController(), sa, "Attacking", "Blocking")) { From ac9e0630c72269df3b211242cca485fbc3f02d04 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:28:08 -0400 Subject: [PATCH 05/18] CountersPutEffect getStackDesc support "CounterTypes" --- .../game/ability/effects/CountersPutEffect.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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 3011c5a9e28..1b6e830792a 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 @@ -45,8 +45,16 @@ public class CountersPutEffect extends SpellAbilityEffect { final StringBuilder stringBuilder = new StringBuilder(); final Card card = spellAbility.getHostCard(); - final int amount = AbilityUtils.calculateAmount(card, spellAbility.getParamOrDefault("CounterNum", "1"), - spellAbility); + final int amount = AbilityUtils.calculateAmount(card, + spellAbility.getParamOrDefault("CounterNum", "1"), spellAbility); + if (spellAbility.hasParam("CounterTypes")) { + stringBuilder.append(spellAbility.getActivatingPlayer()).append(" "); + String desc = spellAbility.getDescription(); + desc = desc.substring(desc.indexOf("Put"), desc.indexOf(" on ") + 4) + .replaceFirst("Put", "puts"); + stringBuilder.append(desc).append(Lang.joinHomogenous(getTargets(spellAbility))).append("."); + return stringBuilder.toString(); + } // skip the StringBuilder if no targets are chosen ("up to" scenario) if (spellAbility.usesTargeting()) { final List targetCards = SpellAbilityEffect.getTargetCards(spellAbility); From 07baa60658da59cee45e47bf6db867e01e336788 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:30:13 -0400 Subject: [PATCH 06/18] CountersPutEffect add more reasons to skip the try --- .../java/forge/game/ability/effects/CountersPutEffect.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 1b6e830792a..a94c88457cb 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 @@ -479,7 +479,8 @@ public class CountersPutEffect extends SpellAbilityEffect { } else { CounterType counterType = null; if (!sa.hasParam("EachExistingCounter") && !sa.hasParam("EachFromSource") - && !sa.hasParam("CounterTypePerDefined")) { + && !sa.hasParam("UniqueType") && !sa.hasParam("CounterTypePerDefined") + && !sa.hasParam("CounterTypes") && !sa.hasParam("ChooseDifferent")) { try { List choices = Lists.newArrayList(); for (String s : sa.getParam("CounterType").split(",")) { From 1fd58ed150adc417a7a4d557ba19050cd660c9c7 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:31:49 -0400 Subject: [PATCH 07/18] CountersPutEffect support "ChooseDifferent" and "CounterTypes" --- .../ability/effects/CountersPutEffect.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) 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 a94c88457cb..9f4bfc8f8d4 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 @@ -258,6 +258,51 @@ public class CountersPutEffect extends SpellAbilityEffect { } } + if (sa.hasParam("ChooseDifferent")) { + final int num = Integer.parseInt(sa.getParam("ChooseDifferent")); + final List typesToAdd = Lists.newArrayList(); + String options = sa.getParam("CounterType"); + for (int i = 0; i < num; i++) { + CounterType ct = chooseTypeFromList(sa, options, obj, pc); + typesToAdd.add(ct); + options = options.replace(ct.getName(),""); + } + for (CounterType ct : typesToAdd) { + if (obj instanceof Player) { + ((Player) obj).addCounter(ct, counterAmount, placer, table); + } + if (obj instanceof Card) { + if (etbcounter) { + gameCard.addEtbCounter(ct, counterAmount, placer); + } else { + gameCard.addCounter(ct, counterAmount, placer, table); + } + } + } + continue; + } + + if (sa.hasParam("CounterTypes")) { + final List typesToAdd = Lists.newArrayList(); + String types = sa.getParam("CounterTypes"); + if (types.contains("ChosenFromList")) { + typesToAdd.add(chooseTypeFromList(sa, sa.getParam("TypeList"), obj, pc)); + types = types.replace("ChosenFromList", ""); + } + for (String type : types.split(",")) { + typesToAdd.add(CounterType.getType(type)); + } + for (CounterType ct : typesToAdd) { + if (obj instanceof Player) { + ((Player) obj).addCounter(ct, counterAmount, placer, table); + } + if (obj instanceof Card) { + gameCard.addCounter(ct, counterAmount, placer, table); + } + } + continue; + } + if (existingCounter) { final List choices = Lists.newArrayList(); // get types of counters From eedfa950a9546c2094e483632ab173003ecd04fa Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:45:24 -0400 Subject: [PATCH 08/18] CountersPutEffect : streamline most CounterType choosing into chooseTypeFromList (supporting UniqueType and RandomType) --- .../ability/effects/CountersPutEffect.java | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) 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 9f4bfc8f8d4..b93dc7c9841 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 @@ -348,17 +348,8 @@ public class CountersPutEffect extends SpellAbilityEffect { } continue; } - if (sa.hasParam("CounterTypePerDefined")) { - List choices = Lists.newArrayList(); - for (String s : sa.getParam("CounterType").split(",")) { - choices.add(CounterType.getType(s)); - } - Map params = Maps.newHashMap(); - params.put("Target", obj); - StringBuilder sb = new StringBuilder(); - sb.append(Localizer.getInstance().getMessage("lblSelectCounterTypeAddTo") + " "); - sb.append(obj); - counterType = pc.chooseCounterType(choices, sa, sb.toString(), params); + if (sa.hasParam("CounterTypePerDefined") || sa.hasParam("UniqueType")) { + counterType = chooseTypeFromList(sa, sa.getParam("CounterType"), obj, pc); } if (obj instanceof Card) { @@ -527,14 +518,8 @@ public class CountersPutEffect extends SpellAbilityEffect { && !sa.hasParam("UniqueType") && !sa.hasParam("CounterTypePerDefined") && !sa.hasParam("CounterTypes") && !sa.hasParam("ChooseDifferent")) { try { - List choices = Lists.newArrayList(); - for (String s : sa.getParam("CounterType").split(",")) { - choices.add(CounterType.getType(s)); - } - Map params = Maps.newHashMap(); - StringBuilder sb = new StringBuilder(); - sb.append(Localizer.getInstance().getMessage("lblSelectCounterTypeAddTo")); - counterType = placer.getController().chooseCounterType(choices, sa, sb.toString(), params); + counterType = chooseTypeFromList(sa, sa.getParam("CounterType"), null, + placer.getController()); } catch (Exception e) { System.out.println("Counter type doesn't match, nor does an SVar exist with the type name."); return; @@ -595,6 +580,27 @@ public class CountersPutEffect extends SpellAbilityEffect { } } + protected CounterType chooseTypeFromList(SpellAbility sa, String list, GameEntity obj, PlayerController pc) { + List choices = Lists.newArrayList(); + for (String s : list.split(",")) { + if (!s.equals("") && (!sa.hasParam("UniqueType") || obj.getCounters(CounterType.getType(s)) == 0)) { + choices.add(CounterType.getType(s)); + } + } + if (sa.hasParam("RandomType")) { + return Aggregates.random(choices); + } + Map params = Maps.newHashMap(); + params.put("Target", obj); + StringBuilder sb = new StringBuilder(); + if (obj != null) { + sb.append(Localizer.getInstance().getMessage("lblSelectCounterTypeAddTo")).append(" ").append(obj); + } else { + sb.append(Localizer.getInstance().getMessage("lblSelectCounterType")); + } + return pc.chooseCounterType(choices, sa, sb.toString(), params); + } + protected String logOutput(Map randomMap, Card card) { StringBuilder randomLog = new StringBuilder(); randomLog.append(card.getName()).append(" randomly distributed "); From 6d4557d101a9487e9bdc7de297014a6e5e85e82c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:46:14 -0400 Subject: [PATCH 09/18] languages add lblSelectCounterType --- forge-gui/res/languages/de-DE.properties | 1 + forge-gui/res/languages/en-US.properties | 1 + forge-gui/res/languages/es-ES.properties | 1 + forge-gui/res/languages/it-IT.properties | 1 + forge-gui/res/languages/ja-JP.properties | 1 + forge-gui/res/languages/pt-BR.properties | 1 + forge-gui/res/languages/zh-CN.properties | 1 + 7 files changed, 7 insertions(+) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index a05185ddf50..e6f4dc35737 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1904,6 +1904,7 @@ lblChooseProliferateTarget=Wähle eine beliebige Anzahl bleibender Karten und/od lblDoYouWantPutCounter=Möchtest du die Marke legen? lblChooseACreatureWithLeastToughness=Wähle eine Kreatur mit der geringsten Widerstandskraft lblSelectCounterTypeAddTo=Wähle Markentyp zum Hinzufügen +lblSelectCounterType=Wähle Markentyp lblHowManyCountersThis=Wie viele Marken möchtest du auf {0} legen? lblChooseAnOpponent=Wähle Gegner lblDoYouWantPutTargetP1P1CountersOnCard=Möchtest du {0} +1/+1-Marken auf {1} legen? diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 0f033140032..c91f20e5b62 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1905,6 +1905,7 @@ lblChooseProliferateTarget=Choose any number of permanents and/or players for pr lblDoYouWantPutCounter=Do you want to put the counter? lblChooseACreatureWithLeastToughness=Choose a creature with the least toughness lblSelectCounterTypeAddTo=Select counter type to add to +lblSelectCounterType=Select counter type lblHowManyCountersThis=How many counters do you want to put on {0}? lblChooseAnOpponent=Choose an opponent lblDoYouWantPutTargetP1P1CountersOnCard=Do you want to put {0} +1/+1 counters on {1}? diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 28d17684407..065b70ac98d 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1903,6 +1903,7 @@ lblChooseProliferateTarget=Elige cualquier número de permanentes y/o jugadores lblDoYouWantPutCounter=¿Quieres poner el contador? lblChooseACreatureWithLeastToughness=Elige una criatura con la menor resistencia lblSelectCounterTypeAddTo=Selecciona el tipo de contador para añadirlo a +lblSelectCounterType=Selecciona el tipo de contador lblHowManyCountersThis=¿Cuántos contadores quieres poner en {0}? lblChooseAnOpponent=Elige un adversario lblDoYouWantPutTargetP1P1CountersOnCard=¿Quieres poner {0} contadores +1/+1 en {1}? diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index 0422eef7ddd..3e8ef304d68 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -1902,6 +1902,7 @@ lblChooseProliferateTarget=Scegli un numero qualsiasi di permanenti e/o giocator lblDoYouWantPutCounter=Vuoi aggiungere il segnalino? lblChooseACreatureWithLeastToughness=Scegli una creatura con la minor costituzione lblSelectCounterTypeAddTo=Scegli il tipo di segnalino da aggiungere +lblSelectCounterType=Scegli il tipo di segnalino lblHowManyCountersThis=Quanti segnalini vuoi aggiungere a {0}? lblChooseAnOpponent=Scegli un avversario lblDoYouWantPutTargetP1P1CountersOnCard=Vuoi aggiungere {0} segnalino/i +1/+1 a {1}? diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index 80432daccfc..702f210f30f 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -1902,6 +1902,7 @@ lblChooseProliferateTarget=増殖を行う望む数のパーマネントやプ lblDoYouWantPutCounter=カウンターを置きますか? lblChooseACreatureWithLeastToughness=タフネスが一番低いクリーチャーを選ぶ lblSelectCounterTypeAddTo=置けるカウンターの種類を選ぶ +lblSelectCounterType=Select counter type lblHowManyCounters={0}に何個のカウンターを置きますか? lblChooseAnOpponent=対戦相手一人を選ぶ lblDoYouWantPutTargetP1P1CountersOnCard={1}の上に {0}個の +1/+1 カウンターを置きますか? diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index f0fd321cde0..3102e2e3d4b 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -1964,6 +1964,7 @@ lblChooseProliferateTarget=Escolha qualquer número de permanentes e/ou jogadore lblDoYouWantPutCounter=Você quer colocar o marcador? lblChooseACreatureWithLeastToughness=Escolha uma criatura com a menor resistência lblSelectCounterTypeAddTo=Selecione o tipo de marcador para adicionar a +lblSelectCounterType=Selecione o tipo de marcador lblHowManyCountersThis=Quantos marcadores você quer colocar em {0}? lblChooseAnOpponent=Escolha um adversário lblDoYouWantPutTargetP1P1CountersOnCard=Você quer colocar {0} +1/+1 marcadores em {1}? diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 16c60fe1268..c5b578306a7 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1906,6 +1906,7 @@ lblChooseProliferateTarget=选择任意数量的永久物和或牌手进行增 lblDoYouWantPutCounter=你想要放置指示物吗? lblChooseACreatureWithLeastToughness=选择防御力最小的生物 lblSelectCounterTypeAddTo=选择指示物类型以添加到 +lblSelectCounterType=Select counter type lblHowManyCountersThis=你想要在{0}上放置多少个指示物? lblChooseAnOpponent=选择一个对手 lblDoYouWantPutTargetP1P1CountersOnCard=你想要放置{0}个+1+1指示物到{1}吗? From ab80bf9970e26966fbce98b6309e5b67fc62c563 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:47:14 -0400 Subject: [PATCH 10/18] grimdancer.txt refactor with ChooseDifferent --- forge-gui/res/cardsfolder/g/grimdancer.txt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/g/grimdancer.txt b/forge-gui/res/cardsfolder/g/grimdancer.txt index f2272e5b92f..e3e6b480c1b 100644 --- a/forge-gui/res/cardsfolder/g/grimdancer.txt +++ b/forge-gui/res/cardsfolder/g/grimdancer.txt @@ -3,9 +3,6 @@ ManaCost:1 B B Types:Creature Nightmare PT:3/3 K:ETBReplacement:Other:CounterChoice -SVar:CounterChoice:DB$ GenericChoice | Defined$ You | Choices$ Menace,Deathtouch,Lifelink | ChoiceAmount$ 2 | SpellDescription$ CARDNAME enters the battlefield with your choice of two different counters on it from among menace, deathtouch, and lifelink. -SVar:Menace:DB$ PutCounter | CounterType$ Menace | CounterNum$ 1 | ETB$ True | SpellDescription$ Menace -SVar:Deathtouch:DB$ PutCounter | CounterType$ Deathtouch | CounterNum$ 1 | ETB$ True | SpellDescription$ Deathtouch -SVar:Lifelink:DB$ PutCounter | CounterType$ Lifelink | CounterNum$ 1 | ETB$ True | SpellDescription$ Lifelink -DeckHas:Ability$Counters +SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Menace,Deathtouch,Lifelink | ChooseDifferent$ 2 | SpellDescription$ CARDNAME enters the battlefield with your choice of two different counters on it from among menace, deathtouch, and lifelink. +DeckHas:Ability$Counters|LifeGain Oracle:Grimdancer enters the battlefield with your choice of two different counters on it from among menace, deathtouch, and lifelink. From 4befc5b4cdda11a1e2f48f50f98e771e45dd03c4 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:56:38 -0400 Subject: [PATCH 11/18] unexpected_fangs.txt refactor with CounterTypes --- forge-gui/res/cardsfolder/u/unexpected_fangs.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/u/unexpected_fangs.txt b/forge-gui/res/cardsfolder/u/unexpected_fangs.txt index c33822d4368..0649215eb6c 100644 --- a/forge-gui/res/cardsfolder/u/unexpected_fangs.txt +++ b/forge-gui/res/cardsfolder/u/unexpected_fangs.txt @@ -1,7 +1,6 @@ Name:Unexpected Fangs ManaCost:1 B Types:Instant -A:SP$ PutCounter | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPutCounter | SpellDescription$ Put a +1/+1 counter and a lifelink counter on target creature. -SVar:DBPutCounter:DB$ PutCounter | CounterType$ Lifelink | CounterNum$ 1 | Defined$ Targeted -DeckHas:Ability$Counters +A:SP$ PutCounter | ValidTgts$ Creature | CounterTypes$ P1P1,Lifelink | SpellDescription$ Put a +1/+1 counter and a lifelink counter on target creature. +DeckHas:Ability$Counters|LifeGain Oracle:Put a +1/+1 counter and a lifelink counter on target creature. From 70eca0eb1595d28a0cec264d43d38601e9f35824 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 11:57:37 -0400 Subject: [PATCH 12/18] refactor simpler IKO "ETB with your choice of X or Y counter" cards --- forge-gui/res/cardsfolder/b/boot_nipper.txt | 6 ++---- forge-gui/res/cardsfolder/f/ferocious_tigorilla.txt | 4 +--- forge-gui/res/cardsfolder/f/flycatcher_giraffid.txt | 4 +--- forge-gui/res/cardsfolder/h/helica_glider.txt | 4 +--- forge-gui/res/cardsfolder/w/wingfold_pteron.txt | 4 +--- 5 files changed, 6 insertions(+), 16 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/boot_nipper.txt b/forge-gui/res/cardsfolder/b/boot_nipper.txt index d6e72a278cb..17d062bb993 100644 --- a/forge-gui/res/cardsfolder/b/boot_nipper.txt +++ b/forge-gui/res/cardsfolder/b/boot_nipper.txt @@ -3,8 +3,6 @@ ManaCost:1 B Types:Creature Beast PT:2/1 K:ETBReplacement:Other:CounterChoice -SVar:CounterChoice:DB$ GenericChoice | Defined$ You | Choices$ Deathtouch,Lifelink | SpellDescription$ CARDNAME enters the battlefield with your choice of a deathtouch counter or a lifelink counter on it. -SVar:Deathtouch:DB$ PutCounter | CounterType$ Deathtouch | CounterNum$ 1 | ETB$ True | SpellDescription$ Deathtouch -SVar:Lifelink:DB$ PutCounter | CounterType$ Lifelink | CounterNum$ 1 | ETB$ True | SpellDescription$ Lifelink -DeckHints:Ability$Counters +SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Deathtouch,Lifelink | SpellDescription$ CARDNAME enters the battlefield your choice of a deathtouch counter or a lifelink counter on it. +DeckHints:Ability$Counters|LifeGain Oracle:Boot Nipper enters the battlefield with your choice of a deathtouch counter or a lifelink counter on it. diff --git a/forge-gui/res/cardsfolder/f/ferocious_tigorilla.txt b/forge-gui/res/cardsfolder/f/ferocious_tigorilla.txt index 087c946c41c..21e65e1f295 100644 --- a/forge-gui/res/cardsfolder/f/ferocious_tigorilla.txt +++ b/forge-gui/res/cardsfolder/f/ferocious_tigorilla.txt @@ -3,8 +3,6 @@ ManaCost:3 R Types:Creature Cat Ape PT:4/3 K:ETBReplacement:Other:CounterChoice -SVar:CounterChoice:DB$ GenericChoice | Defined$ You | Choices$ Trample,Menace | SpellDescription$ CARDNAME enters the battlefield with your choice of a trample counter or a menace counter on it. -SVar:Trample:DB$ PutCounter | ETB$ True | CounterType$ Trample | CounterNum$ 1 | SpellDescription$ CARDNAME enters the battlefield with a trample counter -SVar:Menace:DB$ PutCounter | ETB$ True | CounterType$ Menace | CounterNum$ 1 | SpellDescription$ CARDNAME enters the battlefield with a menace counter +SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Trample,Menace | SpellDescription$ CARDNAME enters the battlefield your choice of a trample counter or a menace counter on it. (A creature with menace can't be blocked except by two or more creatures.) DeckHas:Ability$Counters Oracle:Ferocious Tigorilla enters the battlefield with your choice of a trample counter or a menace counter on it. (A creature with menace can't be blocked except by two or more creatures.) diff --git a/forge-gui/res/cardsfolder/f/flycatcher_giraffid.txt b/forge-gui/res/cardsfolder/f/flycatcher_giraffid.txt index f8714bfaad6..9e6375b4e3a 100644 --- a/forge-gui/res/cardsfolder/f/flycatcher_giraffid.txt +++ b/forge-gui/res/cardsfolder/f/flycatcher_giraffid.txt @@ -3,8 +3,6 @@ ManaCost:4 G Types:Creature Antelope Lizard PT:3/5 K:ETBReplacement:Other:CounterChoice -SVar:CounterChoice:DB$ GenericChoice | Defined$ You | Choices$ Vigilance,Reach | SpellDescription$ CARDNAME enters the battlefield with your choice of a vigilance counter or a reach counter on it. -SVar:Vigilance:DB$ PutCounter | ETB$ True | CounterType$ Vigilance | CounterNum$ 1 | SpellDescription$ CARDNAME enters the battlefield with a vigilance counter on it -SVar:Reach:DB$ PutCounter | ETB$ True | CounterType$ Reach | CounterNum$ 1 | SpellDescription$ CARDNAME enters the battlefield with a reach counter on it +SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Vigilance,Reach | SpellDescription$ CARDNAME enters the battlefield your choice of a vigilance counter or a reach counter on it. DeckHas:Ability$Counters Oracle:Flycatcher Giraffid enters the battlefield with your choice of a vigilance counter or a reach counter on it. diff --git a/forge-gui/res/cardsfolder/h/helica_glider.txt b/forge-gui/res/cardsfolder/h/helica_glider.txt index 77b9330ae66..9294326deca 100644 --- a/forge-gui/res/cardsfolder/h/helica_glider.txt +++ b/forge-gui/res/cardsfolder/h/helica_glider.txt @@ -3,8 +3,6 @@ ManaCost:2 W Types:Creature Nightmare Squirrel PT:2/2 K:ETBReplacement:Other:CounterChoice -SVar:CounterChoice:DB$ GenericChoice | Defined$ You | Choices$ Flying,FirstStrike | SpellDescription$ CARDNAME enters the battlefield with your choice of a flying counter or a first strike counter on it. -SVar:Flying:DB$ PutCounter | ETB$ True | CounterType$ Flying | CounterNum$ 1 | SpellDescription$ CARDNAME enters the battlefield with a flying counter on it -SVar:FirstStrike:DB$ PutCounter | ETB$ True | CounterType$ First Strike | CounterNum$ 1 | SpellDescription$ CARDNAME enters the battlefield with a first strike counter on it +SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Flying,First Strike | SpellDescription$ CARDNAME enters the battlefield your choice of a flying counter or a first strike counter on it. DeckHints:Ability$Counters Oracle:Helica Glider enters the battlefield with your choice of a flying counter or a first strike counter on it. diff --git a/forge-gui/res/cardsfolder/w/wingfold_pteron.txt b/forge-gui/res/cardsfolder/w/wingfold_pteron.txt index f5d29b99502..80316990992 100644 --- a/forge-gui/res/cardsfolder/w/wingfold_pteron.txt +++ b/forge-gui/res/cardsfolder/w/wingfold_pteron.txt @@ -3,8 +3,6 @@ ManaCost:5 U Types:Creature Dinosaur PT:3/6 K:ETBReplacement:Other:CounterChoice -SVar:CounterChoice:DB$ GenericChoice | Defined$ You | Choices$ Flying,Hexproof | SpellDescription$ CARDNAME enters the battlefield with your choice of a flying counter or a hexproof counter on it. -SVar:Flying:DB$ PutCounter | ETB$ True | CounterType$ Flying | CounterNum$ 1 | SpellDescription$ CARDNAME enters the battlefield with a flying counter on it -SVar:Hexproof:DB$ PutCounter | ETB$ True | CounterType$ Hexproof | CounterNum$ 1 | SpellDescription$ CARDNAME enters the battlefield with a hexproof counter on it +SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Flying,Hexproof | SpellDescription$ CARDNAME enters the battlefield your choice of a flying counter or a hexproof counter on it. DeckHas:Ability$Counters Oracle:Wingfold Pteron enters the battlefield with your choice of a flying counter or a hexproof counter on it. (A creature with hexproof can't be the target of spells or abilities your opponents control.) From 275a8f1f9c81ecfc21160ae3af81b40e39c2edd6 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 12:17:59 -0400 Subject: [PATCH 13/18] typo fix --- forge-gui/res/cardsfolder/b/boot_nipper.txt | 2 +- forge-gui/res/cardsfolder/f/ferocious_tigorilla.txt | 2 +- forge-gui/res/cardsfolder/f/flycatcher_giraffid.txt | 2 +- forge-gui/res/cardsfolder/h/helica_glider.txt | 2 +- forge-gui/res/cardsfolder/w/wingfold_pteron.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/boot_nipper.txt b/forge-gui/res/cardsfolder/b/boot_nipper.txt index 17d062bb993..f87739a9616 100644 --- a/forge-gui/res/cardsfolder/b/boot_nipper.txt +++ b/forge-gui/res/cardsfolder/b/boot_nipper.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Creature Beast PT:2/1 K:ETBReplacement:Other:CounterChoice -SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Deathtouch,Lifelink | SpellDescription$ CARDNAME enters the battlefield your choice of a deathtouch counter or a lifelink counter on it. +SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Deathtouch,Lifelink | SpellDescription$ CARDNAME enters the battlefield with your choice of a deathtouch counter or a lifelink counter on it. DeckHints:Ability$Counters|LifeGain Oracle:Boot Nipper enters the battlefield with your choice of a deathtouch counter or a lifelink counter on it. diff --git a/forge-gui/res/cardsfolder/f/ferocious_tigorilla.txt b/forge-gui/res/cardsfolder/f/ferocious_tigorilla.txt index 21e65e1f295..3202805a268 100644 --- a/forge-gui/res/cardsfolder/f/ferocious_tigorilla.txt +++ b/forge-gui/res/cardsfolder/f/ferocious_tigorilla.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Creature Cat Ape PT:4/3 K:ETBReplacement:Other:CounterChoice -SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Trample,Menace | SpellDescription$ CARDNAME enters the battlefield your choice of a trample counter or a menace counter on it. (A creature with menace can't be blocked except by two or more creatures.) +SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Trample,Menace | SpellDescription$ CARDNAME enters the battlefield with your choice of a trample counter or a menace counter on it. (A creature with menace can't be blocked except by two or more creatures.) DeckHas:Ability$Counters Oracle:Ferocious Tigorilla enters the battlefield with your choice of a trample counter or a menace counter on it. (A creature with menace can't be blocked except by two or more creatures.) diff --git a/forge-gui/res/cardsfolder/f/flycatcher_giraffid.txt b/forge-gui/res/cardsfolder/f/flycatcher_giraffid.txt index 9e6375b4e3a..058c635e53c 100644 --- a/forge-gui/res/cardsfolder/f/flycatcher_giraffid.txt +++ b/forge-gui/res/cardsfolder/f/flycatcher_giraffid.txt @@ -3,6 +3,6 @@ ManaCost:4 G Types:Creature Antelope Lizard PT:3/5 K:ETBReplacement:Other:CounterChoice -SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Vigilance,Reach | SpellDescription$ CARDNAME enters the battlefield your choice of a vigilance counter or a reach counter on it. +SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Vigilance,Reach | SpellDescription$ CARDNAME enters the battlefield with your choice of a vigilance counter or a reach counter on it. DeckHas:Ability$Counters Oracle:Flycatcher Giraffid enters the battlefield with your choice of a vigilance counter or a reach counter on it. diff --git a/forge-gui/res/cardsfolder/h/helica_glider.txt b/forge-gui/res/cardsfolder/h/helica_glider.txt index 9294326deca..be3acf49151 100644 --- a/forge-gui/res/cardsfolder/h/helica_glider.txt +++ b/forge-gui/res/cardsfolder/h/helica_glider.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Nightmare Squirrel PT:2/2 K:ETBReplacement:Other:CounterChoice -SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Flying,First Strike | SpellDescription$ CARDNAME enters the battlefield your choice of a flying counter or a first strike counter on it. +SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Flying,First Strike | SpellDescription$ CARDNAME enters the battlefield with your choice of a flying counter or a first strike counter on it. DeckHints:Ability$Counters Oracle:Helica Glider enters the battlefield with your choice of a flying counter or a first strike counter on it. diff --git a/forge-gui/res/cardsfolder/w/wingfold_pteron.txt b/forge-gui/res/cardsfolder/w/wingfold_pteron.txt index 80316990992..e3ab0a8d7b3 100644 --- a/forge-gui/res/cardsfolder/w/wingfold_pteron.txt +++ b/forge-gui/res/cardsfolder/w/wingfold_pteron.txt @@ -3,6 +3,6 @@ ManaCost:5 U Types:Creature Dinosaur PT:3/6 K:ETBReplacement:Other:CounterChoice -SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Flying,Hexproof | SpellDescription$ CARDNAME enters the battlefield your choice of a flying counter or a hexproof counter on it. +SVar:CounterChoice:DB$ PutCounter | ETB$ True | CounterType$ Flying,Hexproof | SpellDescription$ CARDNAME enters the battlefield with your choice of a flying counter or a hexproof counter on it. DeckHas:Ability$Counters Oracle:Wingfold Pteron enters the battlefield with your choice of a flying counter or a hexproof counter on it. (A creature with hexproof can't be the target of spells or abilities your opponents control.) From 1b6f8eb8f66229ce9f3f5bba9393afc227522545 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 18 Apr 2022 18:13:25 -0400 Subject: [PATCH 14/18] sizzling_soloist.txt --- .../res/cardsfolder/upcoming/sizzling_soloist.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/sizzling_soloist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sizzling_soloist.txt b/forge-gui/res/cardsfolder/upcoming/sizzling_soloist.txt new file mode 100644 index 00000000000..ef32693eaa3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sizzling_soloist.txt @@ -0,0 +1,13 @@ +Name:Sizzling Soloist +ManaCost:3 R +Types:Creature Human Citizen +PT:3/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigCantBlock | TriggerDescription$ Alliance — Whenever another creature enters the battlefield under your control, target creature an opponent controls can't block this turn. If this is the second time this ability has resolved this turn, that creature attacks during its controller's next combat phase if able. +SVar:TrigCantBlock:DB$ Pump | ValidTgts$ Creature.OppCtrl | KW$ HIDDEN CARDNAME can't block. | TgtPrompt$ Select target creature an opponent controls | IsCurse$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ2 | RememberObjects$ Targeted | Triggers$ MustAttackTrig | Duration$ Permanent | ForgetOnMoved$ Battlefield +SVar:MustAttackTrig:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ Player.controlsCreature.IsRemembered_GE1 | Execute$ TrigAttacks | TriggerDescription$ Target creature an opponent controls attacks during its controller's next combat phase if able. +SVar:TrigAttacks:DB$ Pump | Defined$ Remembered | KW$ HIDDEN CARDNAME attacks each combat if able. | Duration$ UntilEndOfCombat | SubAbility$ ExileSelf +SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self +SVar:X:Count$ResolvedThisTurn +SVar:BuffedBy:Creature +Oracle:Alliance — Whenever another creature enters the battlefield under your control, target creature an opponent controls can't block this turn. If this is the second time this ability has resolved this turn, that creature attacks during its controller's next combat phase if able. From c2d5cdb7e3dbb2c0b81223945a3d10cfe5d0a9f2 Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Tue, 19 Apr 2022 09:21:11 +0100 Subject: [PATCH 15/18] Update ALA and GDY editions --- forge-gui/res/editions/Game Day Promos.txt | 2 + forge-gui/res/editions/Shards of Alara.txt | 411 +++++++++++---------- 2 files changed, 209 insertions(+), 204 deletions(-) diff --git a/forge-gui/res/editions/Game Day Promos.txt b/forge-gui/res/editions/Game Day Promos.txt index 54719ad2272..faabfac9b53 100644 --- a/forge-gui/res/editions/Game Day Promos.txt +++ b/forge-gui/res/editions/Game Day Promos.txt @@ -6,4 +6,6 @@ Type=Promo ScryfallCode=GDY [cards] +1 R Power Word Kill @Andreas Zafiratos +2 R Skyclave Apparition @Mila Pesic 3 M All-Seeing Arbiter @Nicholas Gregory diff --git a/forge-gui/res/editions/Shards of Alara.txt b/forge-gui/res/editions/Shards of Alara.txt index 28c1f2fdb84..1494f4ed136 100644 --- a/forge-gui/res/editions/Shards of Alara.txt +++ b/forge-gui/res/editions/Shards of Alara.txt @@ -6,261 +6,264 @@ Code2=ALA MciCode=ala Type=Expansion BoosterCovers=5 -Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand +Booster=10 Common:fromsheet("ALA cards"), 3 Uncommon:fromSheet("ALA cards"), 1 RareMythic:fromSheet("ALA cards"), 1 BasicLand:fromSheet("ALA cards") FatPack=8 FatPackExtraSlots=40 BasicLands ScryfallCode=ALA [cards] -63 R Ad Nauseam @Jeremy Jarvis -153 C Agony Warp @Dave Allsop -154 M Ajani Vengeant @Wayne Reynolds 1 C Akrasan Squire @Todd Lockwood -123 U Algae Gharial @Michael Ryan 2 U Angel's Herald @Greg Staples 3 U Angelic Benediction @Michael Komarck 4 C Angelsong @Sal Villagran -220 U Arcane Sanctum @Anthony Francisco +5 U Bant Battlemage @Donato Giancola +6 R Battlegrace Angel @Matt Stewart +7 R Cradle of Vitality @Trevor Hairsine +8 C Dispeller's Capsule @Franz Vohwinkel +9 M Elspeth, Knight-Errant @Volkan Baǵa +10 R Ethersworn Canonist @Izzy +11 C Excommunicate @Matt Stewart +12 C Guardians of Akrasa @Alan Pollack +13 C Gustrider Exuberant @Wayne Reynolds +14 R Invincible Hymn @Matt Stewart +15 C Knight of the Skyward Eye @Matt Stewart +16 R Knight of the White Orchid @Mark Zug +17 R Knight-Captain of Eos @Chris Rahn +18 C Marble Chalice @Howard Lyon +19 U Metallurgeon @Warren Mahy +20 C Oblivion Ring @Franz Vohwinkel +21 R Ranger of Eos @Volkan Baǵa +22 C Resounding Silence @Mark Zug +23 U Rockcaster Platoon @David Palumbo +24 C Sanctum Gargoyle @Shelly Wan +25 R Scourglass @Matt Cavotta +26 C Sighted-Caste Sorcerer @Chris Rahn +27 U Sigiled Paladin @Greg Staples +28 C Soul's Grace @Christopher Moeller +29 U Sunseed Nurturer @Steve Argyle +30 C Welkin Guide @David Palumbo +31 C Yoked Plowbeast @Steve Argyle +32 C Call to Heel @Randy Gallegos +33 C Cancel @David Palumbo +34 C Cathartic Adept @Carl Critchlow +35 C Cloudheath Drake @Izzy +36 C Coma Veil @Dan Scott +37 C Courier's Capsule @Andrew Murray +38 R Covenant of Minds @Dan Seagrave +39 U Dawnray Archer @Dan Dos Santos +40 U Esper Battlemage @Matt Cavotta +41 U Etherium Astrolabe @Michael Bruinsma +42 C Etherium Sculptor @Steven Belledin +43 U Fatestitcher @E. M. Gist +44 U Filigree Sages @Dan Scott +45 R Gather Specimens @Michael Bruinsma +46 C Jhessian Lookout @Donato Giancola +47 C Kathari Screecher @Pete Venters +48 R Kederekt Leviathan @Mark Hyzer +49 R Master of Etherium @Matt Cavotta +50 R Memory Erosion @Howard Lyon +51 R Mindlock Orb @rk post +52 C Outrider of Jhess @Alan Pollack +53 U Protomatter Powder @Francis Tsai +54 C Resounding Wave @Izzy +55 R Sharding Sphinx @Michael Bruinsma +56 R Skill Borrower @Shelly Wan +57 C Spell Snip @Michael Sutfin +58 U Sphinx's Herald @Dan Scott +59 C Steelclad Serpent @Carl Critchlow +60 M Tezzeret the Seeker @Anthony Francisco +61 C Tortoise Formation @Mark Zug +62 C Vectis Silencers @Steven Belledin +63 R Ad Nauseam @Jeremy Jarvis 64 R Archdemon of Unx @Dave Allsop 65 C Banewasp Affliction @Dave Allsop -5 U Bant Battlemage @Donato Giancola -155 U Bant Charm @Randy Gallegos -221 C Bant Panorama @Donato Giancola -6 R Battlegrace Angel @Matt Stewart -124 U Behemoth's Herald @Paolo Parente -156 C Blightning @Thomas M. Baxa 66 C Blister Beetle @Anthony S. Waters -157 U Blood Cultist @Karl Kopinski +67 C Bone Splinters @Cole Eastburn +68 U Corpse Connoisseur @Mark Hyzer +69 R Cunning Lethemancer @Paul Bonner +70 R Death Baron @Nils Hamm +71 C Deathgreeter @Dominick Domingo +72 U Demon's Herald @Karl Kopinski +73 C Dreg Reaver @Thomas M. Baxa +74 C Dregscape Zombie @Lars Grant-West +75 C Executioner's Capsule @Warren Mahy +76 U Fleshbag Marauder @Pete Venters +77 C Glaze Fiend @Joshua Hagler +78 U Grixis Battlemage @Nils Hamm +79 R Immortal Coil @Dan Scott +80 U Infest @Karl Kopinski +81 C Onyx Goblet @rk post +82 U Puppet Conjurer @Steven Belledin +83 C Resounding Scream @Thomas M. Baxa +84 R Salvage Titan @Anthony Francisco +85 U Scavenger Drake @Trevor Claxton +86 C Shadowfeed @Dave Kendall +87 C Shore Snapper @Dave Kendall +88 C Skeletal Kathari @Carl Critchlow +89 R Tar Fiend @Anthony S. Waters +90 C Undead Leotau @Carl Critchlow +91 R Vein Drinker @Lars Grant-West +92 C Viscera Dragger @Ralph Horsley 93 C Bloodpyre Elemental @Trevor Claxton 94 C Bloodthorn Taunter @Jesper Ejsing -67 C Bone Splinters @Cole Eastburn +95 R Caldera Hellion @Raymond Swanland +96 R Crucible of Fire @Dominick Domingo +97 C Dragon Fodder @Jaime Jones +98 U Dragon's Herald @Daarken +99 U Exuberant Firestoker @Zoltan Boros & Gabor Szikszai +100 R Flameblast Dragon @Jaime Jones +101 R Goblin Assault @Jaime Jones +102 C Goblin Mountaineer @Michael Ryan +103 R Hell's Thunder @Karl Kopinski +104 C Hissing Iguanar @Brandon Kitkouski +105 C Incurable Ogre @Carl Critchlow +106 U Jund Battlemage @Vance Kovacs +107 C Lightning Talons @Pete Venters +108 C Magma Spray @Jarreau Wimberly +109 R Predator Dragon @Raymond Swanland +110 C Resounding Thunder @Jon Foster +111 C Ridge Rannet @Jim Murray +112 U Rockslide Elemental @Joshua Hagler +113 U Scourge Devil @Dave Kendall +114 U Skeletonize @Karl Kopinski +115 C Soul's Fire @Wayne Reynolds +116 C Thorn-Thrash Viashino @Jon Foster +117 U Thunder-Thrash Elder @Brandon Kitkouski +118 C Viashino Skeleton @Cole Eastburn +119 R Vicious Shadows @Joshua Hagler +120 C Vithian Stinger @Dave Kendall +121 C Volcanic Submersion @Trevor Claxton +122 R Where Ancients Tread @Zoltan Boros & Gabor Szikszai +123 U Algae Gharial @Michael Ryan +124 U Behemoth's Herald @Paolo Parente +125 C Cavern Thoctar @Jean-Sébastien Rossbach +126 C Court Archers @Randy Gallegos +127 C Cylian Elf @Steve Prescott +128 C Druid of the Anima @Jim Murray +129 U Drumhunter @Jim Murray +130 C Elvish Visionary @D. Alexander Gregory +131 R Feral Hydra @Steve Prescott +132 C Gift of the Gargantuan @Jean-Sébastien Rossbach +133 C Godtoucher @Jesper Ejsing +134 C Jungle Weaver @Trevor Hairsine +135 R Keeper of Progenitus @Kev Walker +136 C Lush Growth @Jesper Ejsing +137 U Mighty Emergence @Steve Prescott +138 R Manaplasm @Daarken +139 C Mosstodon @Paolo Parente +140 R Mycoloth @Raymond Swanland +141 C Naturalize @Trevor Hairsine +142 U Naya Battlemage @Steve Argyle +143 R Ooze Garden @Anthony S. Waters +144 C Resounding Roar @Steve Prescott +145 U Rhox Charger @Chris Rahn +146 R Sacellum Godspeaker @Wayne Reynolds +147 C Savage Hunger @Trevor Claxton +148 R Skullmulcher @Michael Ryan +149 C Soul's Might @Kev Walker +150 R Spearbreaker Behemoth @Christopher Moeller +151 U Topan Ascetic @Sal Villagran +152 C Wild Nacatl @Wayne Reynolds +153 C Agony Warp @Dave Allsop +154 M Ajani Vengeant @Wayne Reynolds +155 U Bant Charm @Randy Gallegos +156 C Blightning @Thomas M. Baxa +157 U Blood Cultist @Karl Kopinski 158 C Branching Bolt @Vance Kovacs 159 R Brilliant Ultimatum @Anthony Francisco 160 R Broodmate Dragon @Vance Kovacs 161 U Bull Cerodon @Jesper Ejsing -95 R Caldera Hellion @Raymond Swanland -32 C Call to Heel @Randy Gallegos -33 C Cancel @David Palumbo 162 C Carrion Thrash @Jaime Jones -34 C Cathartic Adept @Carl Critchlow -125 C Cavern Thoctar @Jean-Sébastien Rossbach 163 R Clarion Ultimatum @Michael Komarck -35 C Cloudheath Drake @Izzy -36 C Coma Veil @Dan Scott -68 U Corpse Connoisseur @Mark Hyzer -37 C Courier's Capsule @Andrew Murray -126 C Court Archers @Randy Gallegos -38 R Covenant of Minds @Dan Seagrave -7 R Cradle of Vitality @Trevor Hairsine -96 R Crucible of Fire @Dominick Domingo 164 R Cruel Ultimatum @Ralph Horsley -222 U Crumbling Necropolis @Dave Kendall -69 R Cunning Lethemancer @Paul Bonner -127 C Cylian Elf @Steve Prescott -39 U Dawnray Archer @Dan Dos Santos -70 R Death Baron @Nils Hamm -71 C Deathgreeter @Dominick Domingo 165 C Deft Duelist @David Palumbo -72 U Demon's Herald @Karl Kopinski -8 C Dispeller's Capsule @Franz Vohwinkel -97 C Dragon Fodder @Jaime Jones -98 U Dragon's Herald @Daarken -73 C Dreg Reaver @Thomas M. Baxa -74 C Dregscape Zombie @Lars Grant-West -128 C Druid of the Anima @Jim Murray -129 U Drumhunter @Jim Murray -9 M Elspeth, Knight-Errant @Volkan Baǵa -130 C Elvish Visionary @D. Alexander Gregory 166 M Empyrial Archangel @Greg Staples -40 U Esper Battlemage @Matt Cavotta 167 U Esper Charm @Michael Bruinsma -223 C Esper Panorama @Franz Vohwinkel -41 U Etherium Astrolabe @Michael Bruinsma -42 C Etherium Sculptor @Steven Belledin -10 R Ethersworn Canonist @Izzy -11 C Excommunicate @Matt Stewart -75 C Executioner's Capsule @Warren Mahy -99 U Exuberant Firestoker @Zoltan Boros & Gabor Szikszai -43 U Fatestitcher @E. M. Gist -131 R Feral Hydra @Steve Prescott -44 U Filigree Sages @Dan Scott 168 U Fire-Field Ogre @Mitch Cotie -100 R Flameblast Dragon @Jaime Jones -76 U Fleshbag Marauder @Pete Venters -246 L Forest @Aleksi Briclot -247 L Forest @Zoltan Boros & Gabor Szikszai -248 L Forest @Zoltan Boros & Gabor Szikszai -249 L Forest @Michael Komarck -45 R Gather Specimens @Michael Bruinsma -132 C Gift of the Gargantuan @Jean-Sébastien Rossbach -77 C Glaze Fiend @Joshua Hagler -101 R Goblin Assault @Jaime Jones 169 C Goblin Deathraiders @Raymond Swanland -102 C Goblin Mountaineer @Michael Ryan 170 M Godsire @Jim Murray -133 C Godtoucher @Jesper Ejsing -78 U Grixis Battlemage @Nils Hamm 171 U Grixis Charm @Lars Grant-West -224 C Grixis Panorama @Nils Hamm -12 C Guardians of Akrasa @Alan Pollack -13 C Gustrider Exuberant @Wayne Reynolds -103 R Hell's Thunder @Karl Kopinski 172 M Hellkite Overlord @Justin Sweet 173 C Hindering Light @Chris Rahn -104 C Hissing Iguanar @Brandon Kitkouski -79 R Immortal Coil @Dan Scott -105 C Incurable Ogre @Carl Critchlow -80 U Infest @Karl Kopinski -14 R Invincible Hymn @Matt Stewart -234 L Island @Michael Komarck -235 L Island @Chippy -236 L Island @Chippy -237 L Island @Mark Tedin 174 U Jhessian Infiltrator @Donato Giancola -46 C Jhessian Lookout @Donato Giancola -106 U Jund Battlemage @Vance Kovacs 175 U Jund Charm @Brandon Kitkouski -225 C Jund Panorama @Jaime Jones -226 U Jungle Shrine @Wayne Reynolds -134 C Jungle Weaver @Trevor Hairsine -47 C Kathari Screecher @Pete Venters 176 C Kederekt Creeper @Mark Hyzer -48 R Kederekt Leviathan @Mark Hyzer -135 R Keeper of Progenitus @Kev Walker 177 U Kiss of the Amesha @Todd Lockwood -15 C Knight of the Skyward Eye @Matt Stewart -16 R Knight of the White Orchid @Mark Zug -17 R Knight-Captain of Eos @Chris Rahn 178 M Kresh the Bloodbraided @Raymond Swanland -210 M Lich's Mirror @Ash Wood -107 C Lightning Talons @Pete Venters -136 C Lush Growth @Jesper Ejsing -108 C Magma Spray @Jarreau Wimberly -138 R Manaplasm @Daarken -18 C Marble Chalice @Howard Lyon -49 R Master of Etherium @Matt Cavotta 179 M Mayael the Anima @Jason Chan -50 R Memory Erosion @Howard Lyon -19 U Metallurgeon @Warren Mahy -137 U Mighty Emergence @Steve Prescott -51 R Mindlock Orb @rk post -211 R Minion Reflector @Mark Tedin -139 C Mosstodon @Paolo Parente -242 L Mountain @Mark Tedin -243 L Mountain @Aleksi Briclot -244 L Mountain @Aleksi Briclot -245 L Mountain @Zoltan Boros & Gabor Szikszai -140 R Mycoloth @Raymond Swanland -141 C Naturalize @Trevor Hairsine -142 U Naya Battlemage @Steve Argyle 180 U Naya Charm @Jesper Ejsing -227 C Naya Panorama @Hideaki Takamura 181 U Necrogenesis @Trevor Claxton +182 M Prince of Thralls @Paul Bonner +183 R Punish Ignorance @Shelly Wan +184 U Qasali Ambusher @Kev Walker +185 M Rafiq of the Many @Michael Komarck +186 C Rakeclaw Gargantuan @Jesper Ejsing +187 R Realm Razer @Hideaki Takamura +188 U Rhox War Monk @Dan Dos Santos +189 C Rip-Clan Crasher @Justin Sweet +190 U Sangrite Surge @Jarreau Wimberly +191 M Sarkhan Vol @Daarken +192 R Sedraxis Specter @Cole Eastburn +193 M Sedris, the Traitor King @Paul Bonner +194 M Sharuum the Hegemon @Izzy +195 C Sigil Blessing @Matt Stewart +196 M Sphinx Sovereign @Chippy +197 U Sprouting Thrinax @Jarreau Wimberly +198 C Steward of Valeron @Greg Staples +199 R Stoic Angel @Volkan Baǵa +200 U Swerve @Karl Kopinski +201 U Thoughtcutter Agent @Cyril Van Der Haegen +202 U Tidehollow Sculler @rk post +203 C Tidehollow Strix @Cyril Van Der Haegen +204 R Titanic Ultimatum @Steve Prescott +205 U Tower Gargoyle @Matt Cavotta +206 R Violent Ultimatum @Raymond Swanland +207 C Waveskimmer Aven @Mark Zug +208 C Windwright Mage @Chippy +209 U Woolly Thoctar @Wayne Reynolds +210 M Lich's Mirror @Ash Wood +211 R Minion Reflector @Mark Tedin 212 C Obelisk of Bant @David Palumbo 213 C Obelisk of Esper @Francis Tsai 214 C Obelisk of Grixis @Nils Hamm 215 C Obelisk of Jund @Brandon Kitkouski 216 C Obelisk of Naya @Steve Prescott -20 C Oblivion Ring @Franz Vohwinkel -81 C Onyx Goblet @rk post -143 R Ooze Garden @Anthony S. Waters -52 C Outrider of Jhess @Alan Pollack +217 R Quietus Spike @Mark Brill +218 C Relic of Progenitus @Jean-Sébastien Rossbach +219 R Sigil of Distinction @Alan Pollack +220 U Arcane Sanctum @Anthony Francisco +221 C Bant Panorama @Donato Giancola +222 U Crumbling Necropolis @Dave Kendall +223 C Esper Panorama @Franz Vohwinkel +224 C Grixis Panorama @Nils Hamm +225 C Jund Panorama @Jaime Jones +226 U Jungle Shrine @Wayne Reynolds +227 C Naya Panorama @Hideaki Takamura +228 U Savage Lands @Vance Kovacs +229 U Seaside Citadel @Volkan Baǵa 230 L Plains @Zoltan Boros & Gabor Szikszai 231 L Plains @Michael Komarck 232 L Plains @Michael Komarck 233 L Plains @Chippy -109 R Predator Dragon @Raymond Swanland -182 M Prince of Thralls @Paul Bonner -53 U Protomatter Powder @Francis Tsai -183 R Punish Ignorance @Shelly Wan -82 U Puppet Conjurer @Steven Belledin -184 U Qasali Ambusher @Kev Walker -217 R Quietus Spike @Mark Brill -185 M Rafiq of the Many @Michael Komarck -186 C Rakeclaw Gargantuan @Jesper Ejsing -21 R Ranger of Eos @Volkan Baǵa -187 R Realm Razer @Hideaki Takamura -218 C Relic of Progenitus @Jean-Sébastien Rossbach -144 C Resounding Roar @Steve Prescott -83 C Resounding Scream @Thomas M. Baxa -22 C Resounding Silence @Mark Zug -110 C Resounding Thunder @Jon Foster -54 C Resounding Wave @Izzy -145 U Rhox Charger @Chris Rahn -188 U Rhox War Monk @Dan Dos Santos -111 C Ridge Rannet @Jim Murray -189 C Rip-Clan Crasher @Justin Sweet -23 U Rockcaster Platoon @David Palumbo -112 U Rockslide Elemental @Joshua Hagler -146 R Sacellum Godspeaker @Wayne Reynolds -84 R Salvage Titan @Anthony Francisco -24 C Sanctum Gargoyle @Shelly Wan -190 U Sangrite Surge @Jarreau Wimberly -191 M Sarkhan Vol @Daarken -147 C Savage Hunger @Trevor Claxton -228 U Savage Lands @Vance Kovacs -85 U Scavenger Drake @Trevor Claxton -113 U Scourge Devil @Dave Kendall -25 R Scourglass @Matt Cavotta -229 U Seaside Citadel @Volkan Baǵa -192 R Sedraxis Specter @Cole Eastburn -193 M Sedris, the Traitor King @Paul Bonner -86 C Shadowfeed @Dave Kendall -55 R Sharding Sphinx @Michael Bruinsma -194 M Sharuum the Hegemon @Izzy -87 C Shore Snapper @Dave Kendall -26 C Sighted-Caste Sorcerer @Chris Rahn -195 C Sigil Blessing @Matt Stewart -219 R Sigil of Distinction @Alan Pollack -27 U Sigiled Paladin @Greg Staples -88 C Skeletal Kathari @Carl Critchlow -114 U Skeletonize @Karl Kopinski -56 R Skill Borrower @Shelly Wan -148 R Skullmulcher @Michael Ryan -115 C Soul's Fire @Wayne Reynolds -28 C Soul's Grace @Christopher Moeller -149 C Soul's Might @Kev Walker -150 R Spearbreaker Behemoth @Christopher Moeller -57 C Spell Snip @Michael Sutfin -196 M Sphinx Sovereign @Chippy -58 U Sphinx's Herald @Dan Scott -197 U Sprouting Thrinax @Jarreau Wimberly -59 C Steelclad Serpent @Carl Critchlow -198 C Steward of Valeron @Greg Staples -199 R Stoic Angel @Volkan Baǵa -29 U Sunseed Nurturer @Steve Argyle +234 L Island @Michael Komarck +235 L Island @Chippy +236 L Island @Chippy +237 L Island @Mark Tedin 238 L Swamp @Chippy 239 L Swamp @Mark Tedin 240 L Swamp @Mark Tedin 241 L Swamp @Aleksi Briclot -200 U Swerve @Karl Kopinski -89 R Tar Fiend @Anthony S. Waters -60 M Tezzeret the Seeker @Anthony Francisco -116 C Thorn-Thrash Viashino @Jon Foster -201 U Thoughtcutter Agent @Cyril Van Der Haegen -117 U Thunder-Thrash Elder @Brandon Kitkouski -202 U Tidehollow Sculler @rk post -203 C Tidehollow Strix @Cyril Van Der Haegen -204 R Titanic Ultimatum @Steve Prescott -151 U Topan Ascetic @Sal Villagran -61 C Tortoise Formation @Mark Zug -205 U Tower Gargoyle @Matt Cavotta -90 C Undead Leotau @Carl Critchlow -62 C Vectis Silencers @Steven Belledin -91 R Vein Drinker @Lars Grant-West -118 C Viashino Skeleton @Cole Eastburn -119 R Vicious Shadows @Joshua Hagler -206 R Violent Ultimatum @Raymond Swanland -92 C Viscera Dragger @Ralph Horsley -120 C Vithian Stinger @Dave Kendall -121 C Volcanic Submersion @Trevor Claxton -207 C Waveskimmer Aven @Mark Zug -30 C Welkin Guide @David Palumbo -122 R Where Ancients Tread @Zoltan Boros & Gabor Szikszai -152 C Wild Nacatl @Wayne Reynolds -208 C Windwright Mage @Chippy -209 U Woolly Thoctar @Wayne Reynolds -31 C Yoked Plowbeast @Steve Argyle +242 L Mountain @Mark Tedin +243 L Mountain @Aleksi Briclot +244 L Mountain @Aleksi Briclot +245 L Mountain @Zoltan Boros & Gabor Szikszai +246 L Forest @Aleksi Briclot +247 L Forest @Zoltan Boros & Gabor Szikszai +248 L Forest @Zoltan Boros & Gabor Szikszai +249 L Forest @Michael Komarck + +[showcase] +250 M Rafiq of the Many @Meel Tamphanon [tokens] w_1_1_soldier From 18e6fcdf6de477f64cb929b23ffc9e509a80fa76 Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Tue, 19 Apr 2022 06:28:35 -0400 Subject: [PATCH 16/18] SNC: Make Connive effect (#11) --- .../main/java/forge/game/ability/ApiType.java | 1 + .../game/ability/effects/ConniveEffect.java | 94 +++++++++++++++++++ .../cardsfolder/upcoming/body_launderer.txt | 12 +++ .../cardsfolder/upcoming/echo_inspector.txt | 9 ++ .../cardsfolder/upcoming/hypnotic_grifter.txt | 7 ++ .../upcoming/illuminator_virtuoso.txt | 9 ++ .../upcoming/kamiz_obscura_oculus.txt | 13 +++ .../cardsfolder/upcoming/ledger_shredder.txt | 5 +- .../upcoming/obscura_interceptor.txt | 12 +++ .../cardsfolder/upcoming/psionic_snoop.txt | 8 ++ .../upcoming/psychic_pickpocket.txt | 10 ++ .../upcoming/raffine_scheming_seer.txt | 10 +- .../upcoming/raffines_informant.txt | 8 ++ .../upcoming/raffines_silencer.txt | 11 +++ .../res/cardsfolder/upcoming/revel_ruiner.txt | 9 ++ .../cardsfolder/upcoming/security_bypass.txt | 11 +++ .../upcoming/toluz_clever_conductor.txt | 13 +++ 17 files changed, 231 insertions(+), 11 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/ability/effects/ConniveEffect.java create mode 100644 forge-gui/res/cardsfolder/upcoming/body_launderer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/echo_inspector.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/hypnotic_grifter.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/illuminator_virtuoso.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/kamiz_obscura_oculus.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/obscura_interceptor.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/psionic_snoop.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/psychic_pickpocket.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/raffines_informant.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/raffines_silencer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/revel_ruiner.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/security_bypass.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/toluz_clever_conductor.txt diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index f900b4b4555..9c9684da385 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -52,6 +52,7 @@ public enum ApiType { Cleanup (CleanUpEffect.class), Clone (CloneEffect.class), CompanionChoose (ChooseCompanionEffect.class), + Connive (ConniveEffect.class), CopyPermanent (CopyPermanentEffect.class), CopySpellAbility (CopySpellAbilityEffect.class), ControlSpell (ControlSpellEffect.class), diff --git a/forge-game/src/main/java/forge/game/ability/effects/ConniveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ConniveEffect.java new file mode 100644 index 00000000000..ddc185cc5a5 --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/ConniveEffect.java @@ -0,0 +1,94 @@ +package forge.game.ability.effects; + +import com.google.common.collect.Maps; +import forge.game.Game; +import forge.game.GameActionUtil; +import forge.game.GameEntityCounterTable; +import forge.game.ability.AbilityFactory; +import forge.game.ability.AbilityKey; +import forge.game.ability.AbilityUtils; +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.*; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; +import forge.game.zone.ZoneType; +import forge.util.Lang; + +import java.util.List; +import java.util.Map; + +public class ConniveEffect extends SpellAbilityEffect { + + /* (non-Javadoc) + * @see forge.game.ability.SpellAbilityEffect#getStackDescription(forge.game.spellability.SpellAbility) + * returns the automatically generated stack description string + */ + @Override + protected String getStackDescription(SpellAbility sa) { + final StringBuilder sb = new StringBuilder(); + + List tgt = getTargetCards(sa); + + sb.append(Lang.joinHomogenous(tgt)).append(tgt.size() > 1 ? " connive." : " connives."); + + return sb.toString(); + } + + /* (non-Javadoc) + * @see forge.game.ability.SpellAbilityEffect#resolve(forge.game.spellability.SpellAbility) + */ + @Override + public void resolve(SpellAbility sa) { + final Card host = sa.getHostCard(); + final Player hostCon = host.getController(); + final Game game = host.getGame(); + final int num = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("ConniveNum", "1"), sa); + + GameEntityCounterTable table = new GameEntityCounterTable(); + final CardZoneTable triggerList = new CardZoneTable(); + Map discardedMap = Maps.newHashMap(); + Map moveParams = AbilityKey.newMap(); + moveParams.put(AbilityKey.LastStateBattlefield, sa.getLastStateBattlefield()); + moveParams.put(AbilityKey.LastStateGraveyard, sa.getLastStateGraveyard()); + + for (final Card c : getTargetCards(sa)) { + final Player p = c.getController(); + + p.drawCards(num, sa, moveParams); + + CardCollectionView dPHand = p.getCardsIn(ZoneType.Hand); + dPHand = CardLists.filter(dPHand, CardPredicates.Presets.NON_TOKEN); + if (dPHand.isEmpty()) { // seems unlikely, but just to be safe + continue; // for loop over players + } + + CardCollection validCards = CardLists.getValidCards(dPHand, "Card", hostCon, host, sa); + + if (!p.canDiscardBy(sa, true)) { + continue; + } + + int amt = Math.min(validCards.size(), num); + CardCollectionView toBeDiscarded = amt == 0 ? CardCollection.EMPTY : + p.getController().chooseCardsToDiscardFrom(p, sa, validCards, amt, amt); + + if (toBeDiscarded.size() > 1) { + toBeDiscarded = GameActionUtil.orderCardsByTheirOwners(game, toBeDiscarded, ZoneType.Graveyard, sa); + } + + discardedMap.put(p, toBeDiscarded); + + int numCntrs = CardLists.getValidCardCount(toBeDiscarded, "Card.nonLand", hostCon, host, sa); + + // need to get newest game state to check if it is still on the battlefield and the timestamp didn't change + Card gamec = game.getCardState(c); + // if the card is not in the game anymore, this might still return true, but it's no problem + if (game.getZoneOf(gamec).is(ZoneType.Battlefield) && gamec.equalsWithTimestamp(c)) { + c.addCounter(CounterEnumType.P1P1, numCntrs, p, table); + } + } + discard(sa, triggerList, true, discardedMap, moveParams); + table.replaceCounterEffect(game, sa, true); + triggerList.triggerChangesZoneAll(game, sa); + } +} diff --git a/forge-gui/res/cardsfolder/upcoming/body_launderer.txt b/forge-gui/res/cardsfolder/upcoming/body_launderer.txt new file mode 100644 index 00000000000..0c06a2cbb77 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/body_launderer.txt @@ -0,0 +1,12 @@ +Name:Body Launderer +ManaCost:2 B B +Types:Creature Ogre Rogue +PT:3/3 +K:Deathtouch +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+nonToken+Other | TriggerZones$ Battlefield | Execute$ TrigConnive | TriggerDescription$ Whenever another nontoken creature you control dies, CARDNAME connives. +SVar:TrigConnive:DB$ Connive +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, return another target non-Rogue creature card with equal or lesser power from your graveyard to the battlefield. +SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Creature.powerLEX+YouOwn+nonRogue+Other | TgtPrompt$ Select target non-Rogue creature card with equal or lesser power | Origin$ Graveyard | Destination$ Battlefield +SVar:X:TriggeredCard$CardPower +DeckHas:Ability$Discard|Counters|Graveyard +Oracle:Deathtouch\nWhenever another nontoken creature you control dies, Body Launderer connives.\nWhen Body Launderer dies, return another target non-Rogue creature card with equal or lesser power from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/echo_inspector.txt b/forge-gui/res/cardsfolder/upcoming/echo_inspector.txt new file mode 100644 index 00000000000..21bf78e6145 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/echo_inspector.txt @@ -0,0 +1,9 @@ +Name:Echo Inspector +ManaCost:3 U +Types:Creature Bird Rogue +PT:2/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigConnive | TriggerDescription$ When CARDNAME enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) +SVar:TrigConnive:DB$ Connive +DeckHas:Ability$Discard|Counters +Oracle:Flying\nWhen Echo Inspector enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/hypnotic_grifter.txt b/forge-gui/res/cardsfolder/upcoming/hypnotic_grifter.txt new file mode 100644 index 00000000000..369aca9925c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hypnotic_grifter.txt @@ -0,0 +1,7 @@ +Name:Hypnotic Grifter +ManaCost:U +Types:Creature Human Rogue +PT:1/2 +A:AB$ Connive | Cost$ 3 | SpellDescription$ CARDNAME connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) +DeckHas:Ability$Discard|Counters +Oracle:{3}: Hypnotic Grifter connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/illuminator_virtuoso.txt b/forge-gui/res/cardsfolder/upcoming/illuminator_virtuoso.txt new file mode 100644 index 00000000000..b544e06096a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/illuminator_virtuoso.txt @@ -0,0 +1,9 @@ +Name:Illuminator Virtuoso +ManaCost:1 W +Types:Creature Human Rogue +PT:1/1 +K:Double Strike +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ Card.YouCtrl | SourceType$ Spell | Execute$ TrigConnive | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME becomes the target of a spell you control, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) +SVar:TrigConnive:DB$ Connive +DeckHas:Ability$Discard|Counters +Oracle:Double strike\nWhenever Illuminator Virtuoso becomes the target of a spell you control, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/kamiz_obscura_oculus.txt b/forge-gui/res/cardsfolder/upcoming/kamiz_obscura_oculus.txt new file mode 100644 index 00000000000..a4b3ddec92d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kamiz_obscura_oculus.txt @@ -0,0 +1,13 @@ +Name:Kamiz, Obscura Oculus +ManaCost:1 W U B +Types:Legendary Creature Cephalid Rogue +PT:2/4 +T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, target attacking creature can't be blocked this turn. It connives. Then choose another attacking creature with lesser power. That creature gains double strike until end of turn. (To have a creature connive, draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) +SVar:TrigPump:DB$ Pump | KW$ HIDDEN Unblockable | RememberObjects$ Targeted | TgtPrompt$ Select target attacking creature | ValidTgts$ Creature.attacking | SubAbility$ DBConnive +SVar:DBConnive:DB$ Connive | Defined$ Targeted | SubAbility$ DBChooseCard +SVar:DBChooseCard:DB$ ChooseCard | Defined$ You | Choices$ Creature.attacking+IsNotRemembered+powerLTX | ChoiceTitle$ Choose another attacking creature with lesser power | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | KW$ Double Strike | Defined$ ChosenCard | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +SVar:X:Remembered$CardPower +DeckHas:Ability$Discard|Counters +Oracle:Whenever you attack, target attacking creature can't be blocked this turn. It connives. Then choose another attacking creature with lesser power. That creature gains double strike until end of turn. (To have a creature connive, draw a card, then discard a card. Put a +1/+1 counter on that creature for each nonland card discarded this way.) diff --git a/forge-gui/res/cardsfolder/upcoming/ledger_shredder.txt b/forge-gui/res/cardsfolder/upcoming/ledger_shredder.txt index 4eeeb127e9e..b360f7f8267 100644 --- a/forge-gui/res/cardsfolder/upcoming/ledger_shredder.txt +++ b/forge-gui/res/cardsfolder/upcoming/ledger_shredder.txt @@ -4,9 +4,6 @@ Types:Creature Bird Advisor PT:1/3 K:Flying T:Mode$ SpellCast | ValidActivatingPlayer$ Player | ActivatorThisTurnCast$ EQ2 | NoResolvingCheck$ True | TriggerZones$ Battlefield | Execute$ TrigConnive | TriggerDescription$ Whenever a player casts their second spell each turn, CARDNAME connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) -SVar:TrigConnive:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | RememberDiscarded$ True | SubAbility$ DBPutCounter -SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.nonLand | ConditionCompare$ EQ1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigConnive:DB$ Connive DeckHas:Ability$Discard|Counters Oracle:Flying\nWhenever a player casts their second spell each turn, Ledger Shredder connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/obscura_interceptor.txt b/forge-gui/res/cardsfolder/upcoming/obscura_interceptor.txt new file mode 100644 index 00000000000..ec64d336b6c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/obscura_interceptor.txt @@ -0,0 +1,12 @@ +Name:Obscura Interceptor +ManaCost:1 W U B +Types:Creature Cephalid Wizard +PT:3/1 +K:Flash +K:Lifelink +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigConnive | TriggerDescription$ When CARDNAME enters the battlefield, it connives. When it connives this way, return up to one target spell to its owner's hand. (To have a creature connive, draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) +SVar:TrigConnive:DB$ Connive | SubAbility$ DBImmediateTrigger +SVar:DBImmediateTrigger:DB$ ImmediateTrigger | Execute$ TrigReturn | TriggerDescription$ When it connives this way, return up to one target spell to its owner's hand. +SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Card | TgtPrompt$ Select target spell | TargetMax$ 1 | TargetMin$ 0 | TgtZone$ Stack | Origin$ Stack | Fizzle$ True | Destination$ Hand +DeckHas:Ability$LifeGain|Discard|Counters +Oracle:Flash\nLifelink\nWhen Obscura Interceptor enters the battlefield, it connives. When it connives this way, return up to one target spell to its owner's hand. (To have a creature connive, draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/psionic_snoop.txt b/forge-gui/res/cardsfolder/upcoming/psionic_snoop.txt new file mode 100644 index 00000000000..313afe566f4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/psionic_snoop.txt @@ -0,0 +1,8 @@ +Name:Psionic Snoop +ManaCost:2 U +Types:Creature Human Rogue +PT:0/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigConnive | TriggerDescription$ When CARDNAME enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) +SVar:TrigConnive:DB$ Connive +DeckHas:Ability$Discard|Counters +Oracle:When Psionic Snoop enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/psychic_pickpocket.txt b/forge-gui/res/cardsfolder/upcoming/psychic_pickpocket.txt new file mode 100644 index 00000000000..4d445688fb7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/psychic_pickpocket.txt @@ -0,0 +1,10 @@ +Name:Psychic Pickpocket +ManaCost:4 U +Types:Creature Cephalid Rogue +PT:3/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigConnive | TriggerDescription$ When CARDNAME enters the battlefield, it connives. When it connives this way, return up to one target spell to its owner's hand. (To have a creature connive, draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) +SVar:TrigConnive:DB$ Connive | SubAbility$ DBImmediateTrigger +SVar:DBImmediateTrigger:DB$ ImmediateTrigger | Execute$ TrigReturn | TriggerDescription$ When it connives this way, return up to one target nonland permanent to its owner's hand. +SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | TargetMax$ 1 | TargetMin$ 0 | Origin$ Battlefield | Destination$ Hand +DeckHas:Ability$Discard|Counters +Oracle:When Psychic Pickpocket enters the battlefield, it connives. When it connives this way, return up to one target nonland permanent to its owner's hand. (To have a creature connive, draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on that creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/raffine_scheming_seer.txt b/forge-gui/res/cardsfolder/upcoming/raffine_scheming_seer.txt index 3fcfedd8d6d..8d3488684c8 100644 --- a/forge-gui/res/cardsfolder/upcoming/raffine_scheming_seer.txt +++ b/forge-gui/res/cardsfolder/upcoming/raffine_scheming_seer.txt @@ -4,12 +4,8 @@ Types:Legendary Creature Sphinx Demon PT:1/4 K:Flying K:Ward:1 -T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigConnive | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, target creature connives X, where X is the number of attacking creatures. (Draw X cards, then discard X cards. Put a +1/+1 counter on that creature for each nonland card discarded this way.) -SVar:TrigConnive:DB$ Draw | NumCards$ X | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ X | RememberDiscarded$ True | SubAbility$ DBPutCounter -SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ Y | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigConnive | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, target attacking creature connives X, where X is the number of attacking creatures. (Draw X cards, then discard X cards. Put a +1/+1 counter on that creature for each nonland card discarded this way.) +SVar:TrigConnive:DB$ Connive | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | ConniveNum$ X SVar:X:Count$Valid Creature.attacking -SVar:Y:Remembered$Valid Card.nonLand DeckHas:Ability$Discard|Counters -Oracle:Flying, ward {1}\nWhenever you attack, target creature connives X, where X is the number of attacking creatures. (Draw X cards, then discard X cards. Put a +1/+1 counter on that creature for each nonland card discarded this way.) +Oracle:Flying, ward {1}\nWhenever you attack, target attacking creature connives X, where X is the number of attacking creatures. (Draw X cards, then discard X cards. Put a +1/+1 counter on that creature for each nonland card discarded this way.) diff --git a/forge-gui/res/cardsfolder/upcoming/raffines_informant.txt b/forge-gui/res/cardsfolder/upcoming/raffines_informant.txt new file mode 100644 index 00000000000..6ebb216c856 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/raffines_informant.txt @@ -0,0 +1,8 @@ +Name:Raffine's Informant +ManaCost:1 W +Types:Creature Human Wizard +PT:2/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigConnive | TriggerDescription$ When CARDNAME enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) +SVar:TrigConnive:DB$ Connive +DeckHas:Ability$Discard|Counters +Oracle:When Raffine's Informant enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/raffines_silencer.txt b/forge-gui/res/cardsfolder/upcoming/raffines_silencer.txt new file mode 100644 index 00000000000..e313f7cf5db --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/raffines_silencer.txt @@ -0,0 +1,11 @@ +Name:Raffine's Silencer +ManaCost:2 B +Types:Creature Human Assassin +PT:1/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigConnive | TriggerDescription$ When CARDNAME enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) +SVar:TrigConnive:DB$ Connive +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, target creature an opponent controls gets -X/-X until end of turn, where X is Raffine's Silencer's power. +SVar:TrigReturn:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumAtt$ -X | NumDef$ -X | IsCurse$ True +SVar:X:TriggeredCard$CardPower +DeckHas:Ability$Discard|Counters +Oracle:When Raffine's Silencer enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.)\nWhen Raffine's Silencer dies, target creature an opponent controls gets -X/-X until end of turn, where X is Raffine's Silencer's power. diff --git a/forge-gui/res/cardsfolder/upcoming/revel_ruiner.txt b/forge-gui/res/cardsfolder/upcoming/revel_ruiner.txt new file mode 100644 index 00000000000..4c89c7c5abd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/revel_ruiner.txt @@ -0,0 +1,9 @@ +Name:Revel Ruiner +ManaCost:3 B +Types:Creature Cephalid Rogue +PT:3/1 +K:Menace +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigConnive | TriggerDescription$ When CARDNAME enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) +SVar:TrigConnive:DB$ Connive +DeckHas:Ability$Discard|Counters +Oracle:Menace\nWhen Revel Ruiner enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/security_bypass.txt b/forge-gui/res/cardsfolder/upcoming/security_bypass.txt new file mode 100644 index 00000000000..4beaee223bd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/security_bypass.txt @@ -0,0 +1,11 @@ +Name:Security Bypass +ManaCost:1 U +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy+attacking | AddHiddenKeyword$ Unblockable | IsPresent$ Creature.attacking+!EnchantedBy | PresentCompare$ EQ0 | Description$ As long as enchanted creature is attacking alone, it can't be blocked. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddTrigger$ DamageDone | AddSVar$ TrigConnive | Description$ Enchanted creature has "Whenever this creature deals combat damage to a player, it connives." (Its controller draws a card, then discards a card. If they discarded a nonland card, they put a +1/+1 counter on this creature.) +SVar:DamageDone:Mode$ DamageDone | CombatDamage$ True | ValidSource$ Card.Self | ValidTarget$ Player | TriggerZones$ Battlefield | Execute$ TrigConnive | TriggerDescription$ Whenever this creature deals combat damage to a player, it connives. +SVar:TrigConnive:DB$ Connive +DeckHas:Ability$Discard|Counters +Oracle:Enchant creature\nAs long as enchanted creature is attacking alone, it can't be blocked.\nEnchanted creature has "Whenever this creature deals combat damage to a player, it connives." (Its controller draws a card, then discards a card. If they discarded a nonland card, they put a +1/+1 counter on this creature.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/toluz_clever_conductor.txt b/forge-gui/res/cardsfolder/upcoming/toluz_clever_conductor.txt new file mode 100644 index 00000000000..2bdc438bacd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/toluz_clever_conductor.txt @@ -0,0 +1,13 @@ +Name:Toluz, Clever Conductor +ManaCost:WU U UB +Types:Legendary Creature Human Rogue +PT:3/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigConnive | TriggerDescription$ When CARDNAME enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.) +SVar:TrigConnive:DB$ Connive +T:Mode$ DiscardedAll | ValidPlayer$ You | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Whenever you discard one or more cards, exile them from your graveyard. +SVar:TrigExile:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card.TriggeredCards +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When NICKNAME dies, put the cards exiled with it into their owner's hand. +SVar:TrigReturn:DB$ ChangeZoneAll | ChangeType$ Card.ExiledWithSource | Origin$ Exile | Destination$ Hand +DeckHas:Ability$Discard|Counters +DeckHints:Ability$Discard +Oracle:When Toluz, Clever Conductor enters the battlefield, it connives. (Draw a card, then discard a card. If you discarded a nonland card, put a +1/+1 counter on this creature.)\nWhenever you discard one or more cards, exile them from your graveyard.\nWhen Toluz dies, put the cards exiled with it into their owner's hand. From 3ad039f52e8883980a1bcf971aeef6f1e9e9fecb Mon Sep 17 00:00:00 2001 From: Northmoc Date: Tue, 19 Apr 2022 07:02:07 -0400 Subject: [PATCH 17/18] sizzling_soloist.txt fixup --- forge-gui/res/cardsfolder/upcoming/sizzling_soloist.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/sizzling_soloist.txt b/forge-gui/res/cardsfolder/upcoming/sizzling_soloist.txt index ef32693eaa3..143ac3190d1 100644 --- a/forge-gui/res/cardsfolder/upcoming/sizzling_soloist.txt +++ b/forge-gui/res/cardsfolder/upcoming/sizzling_soloist.txt @@ -4,8 +4,8 @@ Types:Creature Human Citizen PT:3/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigCantBlock | TriggerDescription$ Alliance — Whenever another creature enters the battlefield under your control, target creature an opponent controls can't block this turn. If this is the second time this ability has resolved this turn, that creature attacks during its controller's next combat phase if able. SVar:TrigCantBlock:DB$ Pump | ValidTgts$ Creature.OppCtrl | KW$ HIDDEN CARDNAME can't block. | TgtPrompt$ Select target creature an opponent controls | IsCurse$ True | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ2 | RememberObjects$ Targeted | Triggers$ MustAttackTrig | Duration$ Permanent | ForgetOnMoved$ Battlefield -SVar:MustAttackTrig:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ Player.controlsCreature.IsRemembered_GE1 | Execute$ TrigAttacks | TriggerDescription$ Target creature an opponent controls attacks during its controller's next combat phase if able. +SVar:DBEffect:DB$ Effect | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ2 | RememberObjects$ Targeted | Triggers$ MustAttackTrig | Duration$ Permanent | ExileOnMoved$ Battlefield +SVar:MustAttackTrig:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ Player.controlsCreature.IsRemembered_GE1 | Execute$ TrigAttacks | Static$ True | TriggerDescription$ This creature attacks during its controller's next combat phase if able. SVar:TrigAttacks:DB$ Pump | Defined$ Remembered | KW$ HIDDEN CARDNAME attacks each combat if able. | Duration$ UntilEndOfCombat | SubAbility$ ExileSelf SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self SVar:X:Count$ResolvedThisTurn From 9a88de1d6fe692c8fe2e12466fbaaa157fde1cc2 Mon Sep 17 00:00:00 2001 From: tool4ever Date: Tue, 19 Apr 2022 15:06:08 +0200 Subject: [PATCH 18/18] Fix IsTriggerRemembered for Tokens (#93) Co-authored-by: TRT <> --- .../src/main/java/forge/game/GameAction.java | 79 +++++++++---------- .../t/tatsumasa_the_dragons_fang.txt | 7 +- 2 files changed, 40 insertions(+), 46 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index e1b1fea46fa..01dfb9cf117 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -275,56 +275,51 @@ public class GameAction { lastKnownInfo = CardUtil.getLKICopy(c); } - if (!c.isRealToken()) { - copied = CardFactory.copyCard(c, false); + copied = CardFactory.copyCard(c, false); - if (zoneTo.is(ZoneType.Stack)) { - // when moving to stack, copy changed card information - copied.setChangedCardColors(c.getChangedCardColorsTable()); - copied.setChangedCardColorsCharacterDefining(c.getChangedCardColorsCharacterDefiningTable()); - copied.setChangedCardKeywords(c.getChangedCardKeywords()); - copied.setChangedCardTypes(c.getChangedCardTypesTable()); - copied.setChangedCardTypesCharacterDefining(c.getChangedCardTypesCharacterDefiningTable()); - copied.setChangedCardNames(c.getChangedCardNames()); - copied.setChangedCardTraits(c.getChangedCardTraits()); - copied.setDrawnThisTurn(c.getDrawnThisTurn()); + if (zoneTo.is(ZoneType.Stack)) { + // when moving to stack, copy changed card information + copied.setChangedCardColors(c.getChangedCardColorsTable()); + copied.setChangedCardColorsCharacterDefining(c.getChangedCardColorsCharacterDefiningTable()); + copied.setChangedCardKeywords(c.getChangedCardKeywords()); + copied.setChangedCardTypes(c.getChangedCardTypesTable()); + copied.setChangedCardTypesCharacterDefining(c.getChangedCardTypesCharacterDefiningTable()); + copied.setChangedCardNames(c.getChangedCardNames()); + copied.setChangedCardTraits(c.getChangedCardTraits()); + copied.setDrawnThisTurn(c.getDrawnThisTurn()); - copied.copyChangedTextFrom(c); - copied.setTimestamp(c.getTimestamp()); + copied.copyChangedTextFrom(c); + copied.setTimestamp(c.getTimestamp()); - // clean up changes that come from its own static abilities - copied.cleanupCopiedChangesFrom(c); + // clean up changes that come from its own static abilities + copied.cleanupCopiedChangesFrom(c); - // copy exiled properties when adding to stack - // will be cleanup later in MagicStack - copied.setExiledWith(c.getExiledWith()); - copied.setExiledBy(c.getExiledBy()); + // copy exiled properties when adding to stack + // will be cleanup later in MagicStack + copied.setExiledWith(c.getExiledWith()); + copied.setExiledBy(c.getExiledBy()); - // copy bestow timestamp - copied.setBestowTimestamp(c.getBestowTimestamp()); - } else { - // when a card leaves the battlefield, ensure it's in its original state - // (we need to do this on the object before copying it, or it won't work correctly e.g. - // on Transformed objects) - copied.setState(CardStateName.Original, false); - copied.setBackSide(false); + // copy bestow timestamp + copied.setBestowTimestamp(c.getBestowTimestamp()); + } else { + // when a card leaves the battlefield, ensure it's in its original state + // (we need to do this on the object before copying it, or it won't work correctly e.g. + // on Transformed objects) + copied.setState(CardStateName.Original, false); + copied.setBackSide(false); - // reset timestamp in changezone effects so they have same timestamp if ETB simultaneously - copied.setTimestamp(game.getNextTimestamp()); - } - - copied.setUnearthed(c.isUnearthed()); - copied.setTapped(false); - - // need to copy counters when card enters another zone than hand or library - if (lastKnownInfo.hasKeyword("Counters remain on CARDNAME as it moves to any zone other than a player's hand or library.") && - !(zoneTo.is(ZoneType.Hand) || zoneTo.is(ZoneType.Library))) { - copied.setCounters(Maps.newHashMap(lastKnownInfo.getCounters())); - } - } else { //Token - copied = c; + // reset timestamp in changezone effects so they have same timestamp if ETB simultaneously copied.setTimestamp(game.getNextTimestamp()); } + + copied.setUnearthed(c.isUnearthed()); + copied.setTapped(false); + + // need to copy counters when card enters another zone than hand or library + if (lastKnownInfo.hasKeyword("Counters remain on CARDNAME as it moves to any zone other than a player's hand or library.") && + !(zoneTo.is(ZoneType.Hand) || zoneTo.is(ZoneType.Library))) { + copied.setCounters(Maps.newHashMap(lastKnownInfo.getCounters())); + } } // ensure that any leftover keyword/type changes are cleared in the state view diff --git a/forge-gui/res/cardsfolder/t/tatsumasa_the_dragons_fang.txt b/forge-gui/res/cardsfolder/t/tatsumasa_the_dragons_fang.txt index 31c865fa9b7..8d8dde140db 100644 --- a/forge-gui/res/cardsfolder/t/tatsumasa_the_dragons_fang.txt +++ b/forge-gui/res/cardsfolder/t/tatsumasa_the_dragons_fang.txt @@ -3,8 +3,7 @@ ManaCost:6 Types:Legendary Artifact Equipment K:Equip:3 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 5 | AddToughness$ 5 | Description$ Equipped creature gets +5/+5. -A:AB$ Token | Cost$ 6 Exile<1/CARDNAME> | TokenAmount$ 1 | TokenScript$ u_5_5_dragon_spirit_flying | TokenOwner$ You | RememberTokens$ True | SpellDescription$ Create a 5/5 blue Dragon Spirit creature token with flying. Return CARDNAME to the battlefield under its owner's control when that token dies. -T:Mode$ ChangesZone | ValidCard$ Creature.IsRemembered | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Exile | Execute$ TrigReturn | Secondary$ True | TriggerDescription$ Return CARDNAME to the battlefield under its owner's control when that token dies. -SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ Self | SubAbility$ DBCleanUp -SVar:DBCleanUp:DB$ Cleanup | ClearRemembered$ True +A:AB$ Token | Cost$ 6 Exile<1/CARDNAME> | TokenAmount$ 1 | TokenScript$ u_5_5_dragon_spirit_flying | TokenOwner$ You | RememberTokens$ True | SubAbility$ DelTrig | SpellDescription$ Create a 5/5 blue Dragon Spirit creature token with flying. Return CARDNAME to the battlefield under its owner's control when that token dies. +SVar:DelTrig:DB$ DelayedTrigger | Mode$ ChangesZone | ValidCard$ Card.IsTriggerRemembered | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigReturn | RememberObjects$ Remembered | TriggerDescription$ Return CARDNAME to the battlefield under its owner's control when that token dies. +SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ Self Oracle:Equipped creature gets +5/+5.\n{6}, Exile Tatsumasa, the Dragon's Fang: Create a 5/5 blue Dragon Spirit creature token with flying. Return Tatsumasa to the battlefield under its owner's control when that token dies.\nEquip {3}