diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 97dc8521d78..923d862b406 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -1064,7 +1064,7 @@ public class PlayerControllerAi extends PlayerController { } } - private boolean prepareSingleSa(final Card host, final SpellAbility sa, boolean isMandatory){ + private boolean prepareSingleSa(final Card host, final SpellAbility sa, boolean isMandatory) { if (sa.hasParam("TargetingPlayer")) { Player targetingPlayer = AbilityUtils.getDefinedPlayers(host, sa.getParam("TargetingPlayer"), sa).get(0); sa.setTargetingPlayer(targetingPlayer); diff --git a/forge-gui/res/cardsfolder/b/balduvian_horde.txt b/forge-gui/res/cardsfolder/b/balduvian_horde.txt index ca337b8a7e5..8a4c851097c 100644 --- a/forge-gui/res/cardsfolder/b/balduvian_horde.txt +++ b/forge-gui/res/cardsfolder/b/balduvian_horde.txt @@ -2,11 +2,8 @@ Name:Balduvian Horde ManaCost:2 R R Types:Creature Human Barbarian PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. -SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ Random | Optional$ True | RememberDiscarded$ True | SubAbility$ DBSacrifice -SVar:DBSacrifice:DB$ Sacrifice | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Remembered$Amount +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Self | UnlessCost$ Discard<1/Random> | UnlessPayer$ You SVar:NeedsToPlayVar:Y GE2 SVar:Y:Count$InYourHand SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_horde.jpg diff --git a/forge-gui/res/cardsfolder/m/minotaur_explorer.txt b/forge-gui/res/cardsfolder/m/minotaur_explorer.txt index 9afb763ddc3..069b819eb1e 100644 --- a/forge-gui/res/cardsfolder/m/minotaur_explorer.txt +++ b/forge-gui/res/cardsfolder/m/minotaur_explorer.txt @@ -2,11 +2,8 @@ Name:Minotaur Explorer ManaCost:1 R Types:Creature Minotaur Scout PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. -SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ Random | Optional$ True | RememberDiscarded$ True | SubAbility$ DBSacrifice -SVar:DBSacrifice:DB$ Sacrifice | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Remembered$Amount +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Self | UnlessCost$ Discard<1/Random> | UnlessPayer$ You SVar:NeedsToPlayVar:Y GE2 SVar:Y:Count$InYourHand SVar:Picture:http://resources.wizards.com/magic/cards/od/en-us/card31786.jpg diff --git a/forge-gui/res/cardsfolder/p/pillaging_horde.txt b/forge-gui/res/cardsfolder/p/pillaging_horde.txt index 2e80cc30580..b049d02ebf1 100644 --- a/forge-gui/res/cardsfolder/p/pillaging_horde.txt +++ b/forge-gui/res/cardsfolder/p/pillaging_horde.txt @@ -2,10 +2,8 @@ Name:Pillaging Horde ManaCost:2 R R Types:Creature Human Barbarian PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. -SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ Random | Optional$ True | RememberDiscarded$ True | SubAbility$ DBSacrifice -SVar:DBSacrifice:DB$ Sacrifice | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Self | UnlessCost$ Discard<1/Random> | UnlessPayer$ You SVar:X:Remembered$Amount SVar:NeedsToPlayVar:Y GE2 SVar:Y:Count$InYourHand diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index ed69cdd0fd2..e49a9a743d1 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -269,8 +269,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { final CardCollection enoughType = CardLists.filter(list, CardPredicates.isOwner(p)); if (enoughType.size() < c) { list.removeAll((CardCollectionView)enoughType); - } - else { + } else { payableZone.add(p); } } @@ -437,9 +436,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (source.getController() == ability.getActivatingPlayer() && source.isInPlay()) { return player.getController().confirmPayment(cost, Localizer.getInstance().getMessage("lblExertCardConfirm", CardTranslation.getTranslatedName(source.getName())), ability) ? PaymentDecision.card(source) : null; } - else { - return null; - } + return null; } Integer c = cost.convertAmount(); @@ -782,8 +779,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { } }; inp.setMessage(Localizer.getInstance().getMessage("lblSelectNCardOfSameColorToReveal", String.valueOf(num))); - } - else { + } else { Integer num = cost.convertAmount(); CardCollectionView hand = player.getCardsIn(cost.getRevealFrom()); @@ -1029,9 +1025,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (source.getController() == ability.getActivatingPlayer() && source.isInPlay()) { return player.getController().confirmPayment(cost, Localizer.getInstance().getMessage("lblSacrificeCardConfirm", CardTranslation.getTranslatedName(source.getName())), ability) ? PaymentDecision.card(source) : null; } - else { - return null; - } + return null; } if (type.equals("OriginalHost")) { @@ -1039,9 +1033,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (host.getController() == ability.getActivatingPlayer() && host.isInPlay()) { return player.getController().confirmPayment(cost, Localizer.getInstance().getMessage("lblSacrificeCardConfirm", CardTranslation.getTranslatedName(host.getName())), ability) ? PaymentDecision.card(host) : null; } - else { - return null; - } + return null; } if (amount.equals("All")) { @@ -1209,8 +1201,6 @@ public class HumanCostDecision extends CostDecisionMakerBase { @Override public PaymentDecision visit(final CostUnattach cost) { - final Card source = ability.getHostCard(); - final Card cardToUnattach = cost.findCardToUnattach(source, player, ability); if (cardToUnattach != null && player.getController().confirmPayment(cost, Localizer.getInstance().getMessage("lblUnattachCardConfirm", CardTranslation.getTranslatedName(cardToUnattach.getName())), ability)) { return PaymentDecision.card(cardToUnattach); diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index a410e3e3006..760c9374e90 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -44,6 +44,7 @@ import forge.gamemodes.match.input.InputPayManaOfCostPayment; import forge.gamemodes.match.input.InputSelectCardsFromList; import forge.gui.FThreads; import forge.gui.util.SGuiChoose; +import forge.util.Aggregates; import forge.util.Localizer; import forge.util.TextUtil; import forge.util.collect.FCollectionView; @@ -565,15 +566,21 @@ public class HumanPlay { if (!hasPaid) { return false; } } else if (part instanceof CostDiscard) { + int amount = getAmountFromPartX(part, source, sourceAbility); if ("Hand".equals(part.getType())) { if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantDiscardYourHand"), sourceAbility)) { return false; } ((CostDiscard)part).payAsDecided(p, PaymentDecision.card(p.getCardsIn(ZoneType.Hand)), sourceAbility); + } else if ("Random".equals(part.getType())) { + if (!part.canPay(sourceAbility, p) || !p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblWouldYouLikeRandomDiscardTargetCard", amount), sourceAbility)) { + return false; + } + + ((CostDiscard)part).payAsDecided(p, (PaymentDecision.card(Aggregates.random(p.getCardsIn(ZoneType.Hand), amount, new CardCollection()))), sourceAbility); } else { CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), part.getType(), p, source, sourceAbility); - int amount = getAmountFromPartX(part, source, sourceAbility); boolean hasPaid = payCostPart(controller, p, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lbldiscard") + orString); if (!hasPaid) { return false; } }