From f70af84e16db0f6a1b03efab7a8a45022f9bdd68 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Wed, 31 Mar 2021 09:32:56 -0400 Subject: [PATCH 1/3] practical_research.txt --- forge-gui/res/cardsfolder/upcoming/practical_research.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/practical_research.txt diff --git a/forge-gui/res/cardsfolder/upcoming/practical_research.txt b/forge-gui/res/cardsfolder/upcoming/practical_research.txt new file mode 100644 index 00000000000..f436698a6a9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/practical_research.txt @@ -0,0 +1,8 @@ +Name:Practical Research +ManaCost:3 U R +Types:Instant +A:SP$ Draw | NumCards$ 4 | SubAbility$ DBDiscard | StackDescription$ SpellDescription | SpellDescription$ Draw four cards. +SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose | UnlessType$ Instant,Sorcery | StackDescription$ SpellDescription | SpellDescription$ Then discard two cards unless you discard an instant or sorcery card. +DeckHas:Ability$Discard +DeckHints:Type$Instant|Sorcery +Oracle:Draw four cards. Then discard two cards unless you discard an instant or sorcery card. From 0033de0831d45768ea9930cf8349b52275834348 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Wed, 31 Mar 2021 09:58:54 -0400 Subject: [PATCH 2/3] human multi UnlessType support --- .../forge/player/PlayerControllerHuman.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 6c9ac4b51cc..8c6bcdd50fa 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1149,6 +1149,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public CardCollectionView chooseCardsToDiscardUnlessType(final int num, final CardCollectionView hand, final String uType, final SpellAbility sa) { + String [] splitUTypes = uType.split(","); final InputSelectEntitiesFromList target = new InputSelectEntitiesFromList(this, num, num, hand, sa) { private static final long serialVersionUID = -5774108410928795591L; @@ -1156,14 +1157,26 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override protected boolean hasAllTargets() { for (final Card c : selected) { - if (c.getType().hasStringType(uType)) { - return true; + for (String part : splitUTypes) { + if (c.getType().hasStringType(part)) { + return true; + } } } return super.hasAllTargets(); } }; - target.setMessage(localizer.getMessage("lblSelectNCardsToDiscardUnlessDiscarduType", uType)); + int n=1; + StringBuilder promptType = new StringBuilder(); + for (String part : splitUTypes) { + if (n==1) { + promptType.append(part); + } else { + promptType.append(" or ").append(part); + } + n++; + } + target.setMessage(localizer.getMessage("lblSelectNCardsToDiscardUnlessDiscarduType", promptType)); target.showAndWait(); return new CardCollection(target.getSelected()); } From 2a841e4ae21e556943519909cd14ab9fc37c09ce Mon Sep 17 00:00:00 2001 From: Northmoc Date: Wed, 31 Mar 2021 09:59:54 -0400 Subject: [PATCH 3/3] AI multi UnlessType support --- forge-ai/src/main/java/forge/ai/PlayerControllerAi.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 93aec373170..920f1a42ca4 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -530,7 +530,14 @@ public class PlayerControllerAi extends PlayerController { @Override public CardCollectionView chooseCardsToDiscardUnlessType(int num, CardCollectionView hand, String uType, SpellAbility sa) { - final CardCollectionView cardsOfType = CardLists.getType(hand, uType); + String [] splitUTypes = uType.split(","); + CardCollection cardsOfType = new CardCollection(); + for (String part : splitUTypes) { + CardCollection partCards = CardLists.getType(hand, part); + if (!partCards.isEmpty()) { + cardsOfType.addAll(partCards); + } + } if (!cardsOfType.isEmpty()) { Card toDiscard = Aggregates.itemWithMin(cardsOfType, CardPredicates.Accessors.fnGetCmc); return new CardCollection(toDiscard);