diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 7a7e633dc4a..4cd9d11dcf3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -280,12 +280,13 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } else { changed = Lang.nounWithNumeralExceptOne(num, type + cardTag); } - final boolean battlefield = destination.equals("Battlefield"); + final boolean toField = destination.equals("Battlefield"); + final boolean toHand = destination.equals("Hand"); sb.append(chooserNames).append(" returns ").append(mandatory || changeNumDesc ? "" : "up to "); sb.append(changed); // so far, it seems non-targeted only lets you return from your own graveyard sb.append(" from their graveyard").append(choosers.size() > 1 ? "s" : ""); - sb.append(battlefield ? " to the " : " into their ").append(destination.toLowerCase()); + sb.append(toField ? " to the " : toHand ? " to their " : " into their ").append(destination.toLowerCase()); if (sa.hasParam("WithCountersType")) { final CounterType cType = CounterType.getType(sa.getParam("WithCountersType")); if (cType != null) { @@ -1068,7 +1069,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { searchedLibrary = false; } - if (!defined && changeType != null) { + if (!defined && changeType != null && !changeType.startsWith("EACH")) { fetchList = (CardCollection)AbilityUtils.filterListByType(fetchList, sa.getParam("ChangeType"), sa); } @@ -1090,8 +1091,21 @@ public class ChangeZoneEffect extends SpellAbilityEffect { fetchList.sort(); CardCollection chosenCards = new CardCollection(); - // only multi-select if player can select more than one - if (changeNum > 1 && allowMultiSelect(decider, sa)) { + if (changeType.startsWith("EACH")) { + String[] eachTypes = changeType.substring(5).split(" & "); + for (String thisType : eachTypes) { + for (int i = 0; i < changeNum && destination != null; i++) { + CardCollection thisList = (CardCollection) AbilityUtils.filterListByType(fetchList, thisType, sa); + if (!chosenCards.isEmpty()) { + thisList.removeAll(chosenCards); + } + Card c = decider.getController().chooseSingleCardForZoneChange(destination, origin, sa, + thisList, delayedReveal, selectPrompt, !sa.hasParam("Mandatory"), decider); + chosenCards.add(c); + } + } + } else if (changeNum > 1 && allowMultiSelect(decider, sa)) { + // only multi-select if player can select more than one List selectedCards; if (!sa.hasParam("SelectPrompt")) { // new default messaging for multi select diff --git a/forge-game/src/main/java/forge/game/card/CounterEnumType.java b/forge-game/src/main/java/forge/game/card/CounterEnumType.java index 01280aa110b..6bd9a2fb41b 100644 --- a/forge-game/src/main/java/forge/game/card/CounterEnumType.java +++ b/forge-game/src/main/java/forge/game/card/CounterEnumType.java @@ -289,6 +289,8 @@ public enum CounterEnumType { RITUAL("RITUAL", 155, 17, 30), + ROPE("ROPE", 239, 223, 187), + RUST("RUST", 255, 181, 116), SCREAM("SCREM", 0, 220, 255), diff --git a/forge-gui/res/cardsfolder/b/barrowin_of_clan_undurr.txt b/forge-gui/res/cardsfolder/b/barrowin_of_clan_undurr.txt index 8d32aadb2ba..4ef1b1502c3 100644 --- a/forge-gui/res/cardsfolder/b/barrowin_of_clan_undurr.txt +++ b/forge-gui/res/cardsfolder/b/barrowin_of_clan_undurr.txt @@ -4,8 +4,9 @@ Types:Legendary Creature Dwarf Cleric PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBVenture | TriggerDescription$ When CARDNAME enters the battlefield, venture into the dungeon. (Enter the first room or advance to the next room.) T:Mode$ Attacks | ValidCard$ Card.Self | CheckSVar$ X | SVarCompare$ GE1 | Execute$ DBChangeZone | TriggerDescription$ Whenever CARDNAME attacks, return up to one creature card with mana value 3 or less from your graveyard to the battlefield if you've completed a dungeon. -SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature in your graveyard | ValidTgts$ Creature.YouOwn+cmcLE3 +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Hidden$ True | ChangeType$ Creature.YouOwn+cmcLE3 SVar:DBVenture:DB$ Venture | Defined$ You SVar:X:PlayerCountPropertyYou$DungeonsCompleted -DeckHints:Ability$Graveyard +DeckHints:Ability$Mill|Discard +DeckHas:Ability$Graveyard Oracle:When Barrowin of Clan Undurr enters the battlefield, venture into the dungeon. (Enter the first room or advance to the next room.)\nWhenever Barrowin of Clan Undurr attacks, return up to one creature card with mana value 3 or less from your graveyard to the battlefield if you've completed a dungeon. diff --git a/forge-gui/res/cardsfolder/upcoming/drillworks_mole.txt b/forge-gui/res/cardsfolder/upcoming/drillworks_mole.txt new file mode 100644 index 00000000000..fab9bef4500 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/drillworks_mole.txt @@ -0,0 +1,7 @@ +Name:Drillworks Mole +ManaCost:1 +Types:Artifact Creature Mole +PT:1/1 +A:AB$ PutCounter | Cost$ 2 T | Defined$ Self & Targeted | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature.IsCommander+YouCtrl | TgtPrompt$ Select up to one target commander creature you control | CounterType$ P1P1 | SpellDescription$ Put a +1/+1 counter on CARDNAME and a +1/+1 counter on up to one target commander creature you control. +DeckHas:Ability$Counters +Oracle:{2}, {T}: Put a +1/+1 counter on Drillworks Mole and a +1/+1 counter on up to one target commander creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/druidic_ritual.txt b/forge-gui/res/cardsfolder/upcoming/druidic_ritual.txt new file mode 100644 index 00000000000..6529e1d8fe2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/druidic_ritual.txt @@ -0,0 +1,7 @@ +Name:Druidic Ritual +ManaCost:2 G +Types:Sorcery +A:SP$ Mill | NumCards$ 3 | Optional$ True | SubAbility$ DBReturn | SpellDescription$ You may mill three cards. +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Hidden$ True | ChangeType$ EACH Creature.YouOwn & Land.YouOwn | ChangeTypeDesc$ creature card they own and up to one land card they own | SubAbility$ DBReturn2 | SpellDescription$ Then return up to one creature card and up to one land card from your graveyard to your hand. (To mill a card, put the top card of your library into your graveyard.) +DeckHas:Ability$Mill|Graveyard +Oracle:You may mill three cards. Then return up to one creature card and up to one land card from your graveyard to your hand. (To mill a card, put the top card of your library into your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/emerald_dragon_dissonant_wave.txt b/forge-gui/res/cardsfolder/upcoming/emerald_dragon_dissonant_wave.txt new file mode 100644 index 00000000000..573276475f5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/emerald_dragon_dissonant_wave.txt @@ -0,0 +1,16 @@ +Name:Emerald Dragon +ManaCost:4 G G +Types:Creature Dragon +PT:4/4 +K:Flying +K:Trample +AlternateMode:Adventure +Oracle:Flying, trample + +ALTERNATE + +Name:Dissonant Wave +ManaCost:2 G +Types:Instant Adventure +A:SP$ Counter | TargetType$ Activated,Triggered | TgtPrompt$ Select target activated or triggered ability from a noncreature source | ValidTgts$ Card.nonCreature | SpellDescription$ Counter target activated or triggered ability from a noncreature source. (Then exile this card. You may cast the creature later from exile.) +Oracle:Counter target activated or triggered ability from a noncreature source. (Then exile this card. You may cast the creature later from exile.) diff --git a/forge-gui/res/cardsfolder/upcoming/flaming_fist.txt b/forge-gui/res/cardsfolder/upcoming/flaming_fist.txt new file mode 100644 index 00000000000..55514468c4e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flaming_fist.txt @@ -0,0 +1,9 @@ +Name:Flaming Fist +ManaCost:2 W +Types:Legendary Enchantment Background +S:Mode$ Continuous | Affected$ Creature.IsCommander+YouOwn | AddTrigger$ Attacks | AddSVar$ AE | Description$ Commander creatures you own have "Whenever this creature attacks, it gains double strike until end of turn." +SVar:Attacks:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever this creature attacks, it gains double strike until end of turn. +SVar:TrigPump:DB$ Pump | KW$ Double Strike +SVar:AE:SVar:HasAttackEffect:TRUE +AI:RemoveDeck:NonCommander +Oracle:Commander creatures you own have "Whenever this creature attacks, it gains double strike until end of turn." diff --git a/forge-gui/res/cardsfolder/upcoming/fraying_line.txt b/forge-gui/res/cardsfolder/upcoming/fraying_line.txt new file mode 100644 index 00000000000..fef473eb5a5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fraying_line.txt @@ -0,0 +1,10 @@ +Name:Fraying Line +ManaCost:4 +Types:Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a rope counter on target creature you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ ROPE +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigRope | TriggerDescription$ At the beginning of each player's upkeep, that player may pay {2}. If they do, they put a rope counter on a creature they control. Otherwise, exile CARDNAME and each creature without a rope counter on it, then remove all rope counters from all creatures. +SVar:TrigRope:DB$ PutCounter | UnlessCost$ 2 | UnlessPayer$ TriggeredPlayer | UnlessSwitched$ True | Chooser$ TriggeredPlayer | Choices$ Creature.ControlledBy TriggeredPlayer | CounterType$ ROPE | UnlessResolveSubs$ WhenNotPaid | SubAbility$ CostNotPaid +SVar:CostNotPaid:DB$ ChangeZoneAll | ChangeType$ Card.Self,Creature.counters_EQ0_ROPE | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBRemoveRope +SVar:DBRemoveRope:DB$ RemoveCounterAll | ValidCards$ Creature | CounterType$ ROPE | AllCounters$ True +Oracle:When Fraying Line enters the battlefield, put a rope counter on target creature you control.\nAt the beginning of each player's upkeep, that player may pay {2}. If they do, they put a rope counter on a creature they control. Otherwise, exile Fraying Line and each creature without a rope counter on it, then remove all rope counters from all creatures. diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index fb0bb721444..a6e33c102e0 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1989,7 +1989,7 @@ lblChooseCardToManifest=Choose cards to manifest #MeldEffect.java lblChooseCardToMeld=Choose card to meld with #MillEffect.java -lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}? +lblDoYouWantPutLibraryCardsTo=Do you want to mill? (to {0}) #MultiplePilesEffect.java lblChooseCardsInTargetPile=Choose cards in Pile {0}? #MutateEffect.java