diff --git a/.gitattributes b/.gitattributes index 5c838165ae5..12af723a008 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6363,6 +6363,7 @@ forge-gui/res/cardsfolder/f/fortitude.txt svneol=native#text/plain forge-gui/res/cardsfolder/f/fortress_crab.txt -text forge-gui/res/cardsfolder/f/fortress_cyclops.txt -text forge-gui/res/cardsfolder/f/fortune_thief.txt svneol=native#text/plain +forge-gui/res/cardsfolder/f/fortunes_favor.txt -text forge-gui/res/cardsfolder/f/fossil_find.txt -text forge-gui/res/cardsfolder/f/foster.txt -text forge-gui/res/cardsfolder/f/foul_emissary.txt -text svneol=unset#text/plain diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 98b1ac8c783..7b0c0e145bb 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -741,11 +741,14 @@ public class PlayerControllerAi extends PlayerController { } @Override - public boolean chooseCardsPile(SpellAbility sa, CardCollectionView pile1, CardCollectionView pile2, boolean faceUp) { - if (!faceUp) { + public boolean chooseCardsPile(SpellAbility sa, CardCollectionView pile1, CardCollectionView pile2, String faceUp) { + if (faceUp.equals("True")) { // AI will choose the first pile if it is larger or the same // TODO Improve this to be slightly more random to not be so predictable return pile1.size() >= pile2.size(); + } else if (faceUp.equals("One")) { + // Probably want to see if the face up pile has anything "worth it", then potentially take face down pile + return pile1.size() >= pile2.size(); } else { boolean allCreatures = Iterables.all(Iterables.concat(pile1, pile2), CardPredicates.Presets.CREATURES); int cmc1 = allCreatures ? ComputerUtilCard.evaluateCreatureList(pile1) : ComputerUtilCard.evaluatePermanentList(pile1); diff --git a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java index a1328865354..fe26927ce39 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java @@ -54,9 +54,4 @@ public class TwoPilesAi extends SpellAbilityAi { int size = pool.size(); return size > 2; } - - @Override - protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) { - return false; - } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 7c6ebeef375..394615a931a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -268,11 +268,7 @@ public class PumpEffect extends SpellAbilityEffect { } if (sa.hasParam("RememberObjects")) { - pumpRemembered = sa.getParam("RememberObjects"); - } - - if (pumpRemembered != null) { - for (final Object o : AbilityUtils.getDefinedObjects(host, pumpRemembered, sa)) { + for (final Object o : AbilityUtils.getDefinedObjects(host, sa.getParam("RememberObjects"), sa)) { host.addRemembered(o); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java index 52530d6945f..2af67023335 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java @@ -89,16 +89,21 @@ public class TwoPilesEffect extends SpellAbilityEffect { return; } + String title = "One".equals(sa.getParamOrDefault("FaceDown", "False")) ? "Select cards for a face down pile" : + "Divide cards into two piles"; + + card.clearRemembered(); + // first, separate the cards into piles - final CardCollectionView pile1 = separator.getController().chooseCardsForEffect(pool, sa, "Divide cards into two piles", 0, size, false); + final CardCollectionView pile1 = separator.getController().chooseCardsForEffect(pool, sa, title, 0, size, false); final CardCollection pile2 = new CardCollection(pool); pile2.removeAll(pile1); - System.out.println("Pile 1:" + pile1); - System.out.println("Pile 2:" + pile2); - card.clearRemembered(); + //System.out.println("Pile 1:" + pile1); + //System.out.println("Pile 2:" + pile2); - pile1WasChosen = chooser.getController().chooseCardsPile(sa, pile1, pile2, !sa.hasParam("FaceDown")); + + pile1WasChosen = chooser.getController().chooseCardsPile(sa, pile1, pile2, sa.getParamOrDefault("FaceDown", "False")); CardCollectionView chosenPile = pile1WasChosen ? pile1 : pile2; CardCollectionView unchosenPile = !pile1WasChosen ? pile1 : pile2; diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index 48b3c2d8219..b11efb395b1 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -205,7 +205,7 @@ public abstract class PlayerController { public abstract boolean playSaFromPlayEffect(SpellAbility tgtSA); public abstract Map chooseProliferation(); - public abstract boolean chooseCardsPile(SpellAbility sa, CardCollectionView pile1, CardCollectionView pile2, boolean faceUp); + public abstract boolean chooseCardsPile(SpellAbility sa, CardCollectionView pile1, CardCollectionView pile2, String faceUp); public abstract void revealAnte(String message, Multimap removedAnteCards); diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index 30f36c75bef..56abff9a67d 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -585,7 +585,7 @@ public class PlayerControllerForTests extends PlayerController { } @Override - public boolean chooseCardsPile(SpellAbility sa, CardCollectionView pile1, CardCollectionView pile2, boolean faceUp) { + public boolean chooseCardsPile(SpellAbility sa, CardCollectionView pile1, CardCollectionView pile2, String faceUp) { return MyRandom.getRandom().nextBoolean(); } diff --git a/forge-gui/res/cardsfolder/f/fortunes_favor.txt b/forge-gui/res/cardsfolder/f/fortunes_favor.txt new file mode 100644 index 00000000000..46d19a4449b --- /dev/null +++ b/forge-gui/res/cardsfolder/f/fortunes_favor.txt @@ -0,0 +1,10 @@ +Name:Fortune's Favor +ManaCost:3 U +Types:Instant +A:SP$ PeekAndReveal | Cost$ 3 U | Defined$ You | PeekAmount$ 4 | NoPeek$ True | NoReveal$ True | RememberPeeked$ True | SubAbility$ Separate | SpellDescription$ Target opponent looks at the top four cards of your library and separates them into a face-down pile and a face-up pile. Put one pile into your hand and the other into your graveyard. +SVar:Separate:DB$ TwoPiles | Defined$ You | Separator$ TargetedPlayer | Chooser$ You | ValidTgts$ Opponent | DefinedCards$ Remembered | ChosenPile$ DBHand | UnchosenPile$ DBGrave | Zone$ Library | FaceDown$ One | StackDescription$ None +SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup +SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Picture:http://www.wizards.com/global/images/magic/general/fortunes_favor.jpg +Oracle:Target opponent looks at the top four cards of your library and separates them into a face-down pile and a face-up pile. Put one pile into your hand and the other into your graveyard. diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 4bf2933f6f0..95b989564bb 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1289,25 +1289,33 @@ public class PlayerControllerHuman } @Override - public boolean chooseCardsPile(final SpellAbility sa, final CardCollectionView pile1, final CardCollectionView pile2, final boolean faceUp) { - if (!faceUp) { - final String p1Str = String.format("Pile 1 (%s cards)", pile1.size()); - final String p2Str = String.format("Pile 2 (%s cards)", pile2.size()); + public boolean chooseCardsPile(final SpellAbility sa, final CardCollectionView pile1, final CardCollectionView pile2, final String faceUp) { + final String p1Str = String.format("-- Pile 1 (%s cards) --", pile1.size()); + final String p2Str = String.format("-- Pile 2 (%s cards) --", pile2.size()); + + /* + if (faceUp.equals("True")) { final List possibleValues = ImmutableList.of(p1Str , p2Str); return getGui().confirm(CardView.get(sa.getHostCard()), "Choose a Pile", possibleValues); } - - tempShowCards(pile1); - tempShowCards(pile2); + */ final List cards = Lists.newArrayListWithCapacity(pile1.size() + pile2.size() + 2); - final CardView pileView1 = new CardView(Integer.MIN_VALUE, null, "--- Pile 1 ---"); - cards.add(pileView1); - cards.addAll(CardView.getCollection(pile1)); + final CardView pileView1 = new CardView(Integer.MIN_VALUE, null, p1Str); - final CardView pileView2 = new CardView(Integer.MIN_VALUE + 1, null, "--- Pile 2 ---"); + cards.add(pileView1); + if (faceUp.equals("False")) { + tempShowCards(pile1); + cards.addAll(CardView.getCollection(pile1)); + } + + final CardView pileView2 = new CardView(Integer.MIN_VALUE + 1, null, p2Str); cards.add(pileView2); - cards.addAll(CardView.getCollection(pile2)); + if (!faceUp.equals("True")) { + tempShowCards(pile2); + cards.addAll(CardView.getCollection(pile2)); + } + // make sure Pile 1 or Pile 2 is clicked on boolean result;