package forge; import forge.card.spellability.SpellAbility; import forge.gui.input.Input; /** * <p>PlayerUtil class.</p> * * @author Forge * @version $Id: $ */ public class PlayerUtil { /** * <p>worshipFlag.</p> * * @param player a {@link forge.Player} object. * @return a boolean. */ public static boolean worshipFlag(Player player) { // Instead of hardcoded Ali from Cairo like cards, it is now a Keyword CardList list = AllZoneUtil.getPlayerCardsInPlay(player); list = list.getKeyword("Damage that would reduce your life total to less than 1 reduces it to 1 instead."); list = list.filter(new CardListFilter() { public boolean addCard(Card c) { return !c.isFaceDown(); } }); return list.size() > 0; } /** * <p>input_discardNumUnless.</p> * * @param nCards a int. * @param uType a {@link java.lang.String} object. * @param sa a {@link forge.card.spellability.SpellAbility} object. * @return a {@link forge.gui.input.Input} object. * @since 1.0.15 */ public static Input input_discardNumUnless(final int nCards, final String uType, SpellAbility sa) { final SpellAbility sp = sa; Input target = new Input() { private static final long serialVersionUID = 8822292413831640944L; int n = 0; @Override public void showMessage() { if (AllZone.getHumanHand().size() == 0) stop(); AllZone.getDisplay().showMessage("Select " + (nCards - n) + " cards to discard, unless you discard a " + uType + "."); ButtonUtil.disableAll(); } @Override public void selectButtonCancel() { stop(); } @Override public void selectCard(Card card, PlayerZone zone) { if (zone.is(Constant.Zone.Hand)) { card.getController().discard(card, sp); n++; if (card.isType(uType.toString())) stop(); else { if (n == nCards || AllZone.getHumanHand().size() == 0) stop(); else showMessage(); } } } }; return target; }//input_discardNumUnless /** * <p>input_discard.</p> * * @param nCards a int. * @param sa a {@link forge.card.spellability.SpellAbility} object. * @return a {@link forge.gui.input.Input} object. * @since 1.0.15 */ public static Input input_discard(final int nCards, SpellAbility sa) { final SpellAbility sp = sa; Input target = new Input() { private static final long serialVersionUID = -329993322080934435L; int n = 0; @Override public void showMessage() { if (AllZone.getHumanHand().size() == 0) stop(); if (nCards == 0) stop(); AllZone.getDisplay().showMessage("Select a card to discard"); ButtonUtil.disableAll(); } @Override public void selectCard(Card card, PlayerZone zone) { if (zone.is(Constant.Zone.Hand)) { card.getController().discard(card, sp); n++; //in case no more cards in hand if (n == nCards || AllZone.getHumanHand().size() == 0) stop(); else showMessage(); } } }; return target; }//input_discard() /** * <p>input_chainsDiscard.</p> * * @return a {@link forge.gui.input.Input} object. * @since */ public static Input input_chainsDiscard() { Input target = new Input() { private static final long serialVersionUID = 2856894846224546303L; @Override public void showMessage() { if (AllZone.getHumanHand().size() == 0) stop(); AllZone.getDisplay().showMessage("Chains of Mephistopheles:\n"+"Select a card to discard"); ButtonUtil.disableAll(); } @Override public void selectCard(Card card, PlayerZone zone) { if (zone.is(Constant.Zone.Hand)) { card.getController().discard(card, null); done(); } } private void done() { stop(); //hack to not trigger Chains of Mephistopheles recursively AllZone.getHumanPlayer().drawCards(1, true); } }; return target; }//input_chainsDiscard() /** * <p>input_sacrificePermanent.</p> * * @param choices a {@link forge.CardList} object. * @param message a {@link java.lang.String} object. * @return a {@link forge.gui.input.Input} object. * @since 1.0.15 */ public static Input input_sacrificePermanent(final CardList choices, final String message) { return input_sacrificePermanentsFromList(1, choices, message); }//input_sacrifice() /** * <p>input_sacrificePermanents.</p> * * @param nCards a int. * @return a {@link forge.gui.input.Input} object. * @since 1.0.15 */ public static Input input_sacrificePermanents(final int nCards) { CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); list.remove("Mana Pool"); // is this needed? return input_sacrificePermanentsFromList(nCards, list, "Select a permanent to sacrifice"); }//input_sacrificePermanents() /** * <p>input_sacrificePermanents.</p> * * @param nCards a int. * @param type a {@link java.lang.String} object. * @return a {@link forge.gui.input.Input} object. * @since 1.0.15 */ public static Input input_sacrificePermanents(final int nCards, final String type) { CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); list.remove("Mana Pool"); // is this needed? list = list.getType(type); return input_sacrificePermanentsFromList(nCards, list, "Select a " + type + " to sacrifice"); }//input_sacrificePermanents() /** * <p>input_sacrificePermanentsFromList.</p> * * @param nCards a int. * @param list a {@link forge.CardList} object. * @param message a {@link java.lang.String} object. * @return a {@link forge.gui.input.Input} object. * @since 1.0.15 */ public static Input input_sacrificePermanentsFromList(final int nCards, final CardList list, final String message) { Input target = new Input() { private static final long serialVersionUID = 1981791992623774490L; int n = 0; @Override public void showMessage() { //in case no more {type}s in play if (n == nCards || list.size() == 0) { stop(); return; } AllZone.getDisplay().showMessage(message + " (" + (nCards - n) + " left)"); ButtonUtil.disableAll(); } @Override public void selectCard(Card card, PlayerZone zone) { if (zone.equals(AllZone.getHumanBattlefield()) && list.contains(card)) { AllZone.getGameAction().sacrifice(card); n++; list.remove(card); //in case no more {type}s in play if (n == nCards || list.size() == 0) { stop(); return; } else showMessage(); } } }; return target; }//input_sacrificePermanents() /** * <p>input_putFromHandToLibrary.</p> * * @param TopOrBottom a {@link java.lang.String} object. * @param num a int. * @return a {@link forge.gui.input.Input} object. * @since 1.0.15 */ public static Input input_putFromHandToLibrary(final String TopOrBottom, final int num) { Input target = new Input() { private static final long serialVersionUID = 5178077952030689103L; public int n = 0; @Override public void showMessage() { AllZone.getDisplay().showMessage("Select a card to put on the " + TopOrBottom + " of your library."); ButtonUtil.disableAll(); if (n == num || AllZone.getHumanHand().size() == 0) stop(); } @Override public void selectButtonCancel() { stop(); } @Override public void selectCard(Card card, PlayerZone zone) { if (zone.is(Constant.Zone.Hand)) { int position = 0; if (TopOrBottom.equalsIgnoreCase("bottom")) position = -1; AllZone.getGameAction().moveToLibrary(card, position); n++; if (n == num) stop(); showMessage(); } } }; return target; } }//end class PlayerUtil