diff --git a/res/cardsfolder/h/haunting_misery.txt b/res/cardsfolder/h/haunting_misery.txt index 769cc5d2db8..6ce713eca0e 100644 --- a/res/cardsfolder/h/haunting_misery.txt +++ b/res/cardsfolder/h/haunting_misery.txt @@ -1,7 +1,10 @@ Name:Haunting Misery ManaCost:1 B B Types:Sorcery -Text:As an additional cost, exile X creature cards from your graveyard. Haunting Misery deals X damage to target player. +Text:no text +A:SP$ DealDamage | Cost$ 1 B B ExileFromGrave | Tgt$ TgtP | NumDmg$ ChosenX | SpellDescription$ CARDNAME deals X damage to target player. +SVar:X:XChoice +#ChosenX SVar created by Cost payment SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/haunting_misery.jpg diff --git a/src/main/java/forge/card/cardFactory/CardFactory_Sorceries.java b/src/main/java/forge/card/cardFactory/CardFactory_Sorceries.java index 2729a671d4a..069d55a4c39 100644 --- a/src/main/java/forge/card/cardFactory/CardFactory_Sorceries.java +++ b/src/main/java/forge/card/cardFactory/CardFactory_Sorceries.java @@ -1782,7 +1782,7 @@ public class CardFactory_Sorceries { card.setSVar("PlayMain1", "TRUE"); } //*************** END ************ END ************************** - +/* //*************** START *********** START ************************** else if (cardName.equals("Haunting Misery")) { Cost cost = new Cost("1 B B", cardName, false); @@ -1835,7 +1835,7 @@ public class CardFactory_Sorceries { card.addSpellAbility(spell); }//*************** END ************ END ************************** - +*/ //*************** START *********** START ************************** else if (cardName.equals("Brood Birthing")) { diff --git a/src/main/java/forge/card/cost/CostExile.java b/src/main/java/forge/card/cost/CostExile.java index 63506f2ef9b..52b67e6d3a0 100644 --- a/src/main/java/forge/card/cost/CostExile.java +++ b/src/main/java/forge/card/cost/CostExile.java @@ -101,10 +101,18 @@ public class CostExile extends CostPartWithList { c = AbilityFactory.calculateAmount(source, amount, ability); } } - if (getThis()) + if (getThis()){ CostUtil.setInput(Cost_Input.exileThis(ability, payment, this)); - else + } + else if (from.equals(Constant.Zone.Battlefield) || from.equals(Constant.Zone.Hand)){ CostUtil.setInput(Cost_Input.exileType(ability, this, getType(), payment, c)); + } + else if (from.equals(Constant.Zone.Library)){ + Cost_Input.exileFromTop(ability, this, payment, c); + } + else{ + CostUtil.setInput(Cost_Input.exileFrom(ability, this, getType(), payment, c)); + } return false; } @@ -116,10 +124,22 @@ public class CostExile extends CostPartWithList { else{ Integer c = convertAmount(); if (c == null){ + String sVar = source.getSVar(amount); + // Generalize this + if (sVar.equals("XChoice")){ + return false; + } + c = AbilityFactory.calculateAmount(source, amount, ability); } - list = ComputerUtil.chooseExileFrom(getFrom(), getType(), source, ability.getTargetCard(), c); - if (list == null) + + if (from.equals(Constant.Zone.Library)){ + list = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer(), c); + } + else{ + list = ComputerUtil.chooseExileFrom(getFrom(), getType(), source, ability.getTargetCard(), c); + } + if (list == null || list.size() < c) return false; } return true; diff --git a/src/main/java/forge/card/cost/Cost_Input.java b/src/main/java/forge/card/cost/Cost_Input.java index becc4f9e85e..86bc901d0e2 100644 --- a/src/main/java/forge/card/cost/Cost_Input.java +++ b/src/main/java/forge/card/cost/Cost_Input.java @@ -1,5 +1,7 @@ package forge.card.cost; +import java.util.Iterator; + import javax.swing.JOptionPane; import forge.AllZone; @@ -8,11 +10,13 @@ import forge.ButtonUtil; import forge.Card; import forge.CardList; import forge.Constant; +import forge.GameActionUtil; import forge.Phase; import forge.Player; import forge.PlayerZone; import forge.card.mana.ManaCost; import forge.card.spellability.SpellAbility; +import forge.gui.GuiUtils; import forge.gui.input.Input; import forge.gui.input.Input_PayManaCostUtil; @@ -508,6 +512,80 @@ public class Cost_Input { return target; }//exileType() + public static Input exileFrom(final SpellAbility sa, final CostExile part, final String type, final Cost_Payment payment, final int nNeeded) { + Input target = new Input() { + private static final long serialVersionUID = 734256837615635021L; + + @Override + public void showMessage() { + CardList typeList = AllZoneUtil.getCardsInZone(part.getFrom(), sa.getActivatingPlayer()); + typeList = typeList.getValidCards(type.split(";"), sa.getActivatingPlayer(), sa.getSourceCard()); + + for (int i = 0; i < nNeeded; i++) { + if (typeList.size() == 0) + cancel(); + + Object o = GuiUtils.getChoiceOptional("Exile from "+part.getFrom(), typeList.toArray()); + + if (o != null) { + Card c = (Card) o; + typeList.remove(c); + payment.getAbility().addCostToHashList(c, "Exiled"); + AllZone.getGameAction().exile(c); + if (i == nNeeded - 1) done(); + } + else{ + cancel(); + break; + } + } + } + + @Override + public void selectButtonCancel() { + cancel(); + } + + public void done() { + stop(); + payment.paidCost(part); + } + + public void cancel() { + stop(); + payment.cancelCost(); + } + }; + return target; + }//exileFrom() + + + public static void exileFromTop(final SpellAbility sa, final CostExile part, final Cost_Payment payment, final int nNeeded){ + StringBuilder sb = new StringBuilder(); + sb.append("Exile ").append(nNeeded).append(" cards from the top of your library?"); + CardList list = AllZoneUtil.getPlayerCardsInLibrary(sa.getActivatingPlayer(), nNeeded); + + if (list.size() > nNeeded){ + // I don't believe this is possible + payment.cancelCost(); + return; + } + + boolean doExile = GameActionUtil.showYesNoDialog(sa.getSourceCard(), sb.toString()); + if (doExile){ + Iterator itr = list.iterator(); + while(itr.hasNext()){ + Card c = (Card)itr.next(); + payment.getAbility().addCostToHashList(c, "Exiled"); + AllZone.getGameAction().exile(c); + } + payment.paidCost(part); + } + else{ + payment.cancelCost(); + } + } + /** *

input_tapXCost.

* diff --git a/src/main/java/forge/card/spellability/SpellAbility_Requirements.java b/src/main/java/forge/card/spellability/SpellAbility_Requirements.java index faef3d7f6e1..a0e63699f57 100644 --- a/src/main/java/forge/card/spellability/SpellAbility_Requirements.java +++ b/src/main/java/forge/card/spellability/SpellAbility_Requirements.java @@ -150,6 +150,7 @@ public class SpellAbility_Requirements { if (select != null) select.resetTargets(); + ability.resetOnceResolved(); payment.cancelPayment(); AllZone.getStack().clearFrozen(); }