mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
Moving Inputs from Cost_Input into specific CostParts
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -9616,7 +9616,6 @@ src/main/java/forge/card/cost/CostTap.java -text
|
|||||||
src/main/java/forge/card/cost/CostTapType.java -text
|
src/main/java/forge/card/cost/CostTapType.java -text
|
||||||
src/main/java/forge/card/cost/CostUntap.java -text
|
src/main/java/forge/card/cost/CostUntap.java -text
|
||||||
src/main/java/forge/card/cost/CostUtil.java -text
|
src/main/java/forge/card/cost/CostUtil.java -text
|
||||||
src/main/java/forge/card/cost/Cost_Input.java -text
|
|
||||||
src/main/java/forge/card/cost/Cost_Payment.java svneol=native#text/plain
|
src/main/java/forge/card/cost/Cost_Payment.java svneol=native#text/plain
|
||||||
src/main/java/forge/card/mana/Mana.java svneol=native#text/plain
|
src/main/java/forge/card/mana/Mana.java svneol=native#text/plain
|
||||||
src/main/java/forge/card/mana/ManaCost.java svneol=native#text/plain
|
src/main/java/forge/card/mana/ManaCost.java svneol=native#text/plain
|
||||||
|
|||||||
@@ -2,13 +2,16 @@ package forge.card.cost;
|
|||||||
|
|
||||||
import forge.AllZone;
|
import forge.AllZone;
|
||||||
import forge.AllZoneUtil;
|
import forge.AllZoneUtil;
|
||||||
|
import forge.ButtonUtil;
|
||||||
import forge.Card;
|
import forge.Card;
|
||||||
import forge.CardList;
|
import forge.CardList;
|
||||||
import forge.CardListUtil;
|
import forge.CardListUtil;
|
||||||
import forge.Constant;
|
import forge.Constant;
|
||||||
import forge.Player;
|
import forge.Player;
|
||||||
|
import forge.PlayerZone;
|
||||||
import forge.card.abilityFactory.AbilityFactory;
|
import forge.card.abilityFactory.AbilityFactory;
|
||||||
import forge.card.spellability.SpellAbility;
|
import forge.card.spellability.SpellAbility;
|
||||||
|
import forge.gui.input.Input;
|
||||||
|
|
||||||
public class CostDiscard extends CostPartWithList {
|
public class CostDiscard extends CostPartWithList {
|
||||||
// Discard<Num/Type{/TypeDescription}>
|
// Discard<Num/Type{/TypeDescription}>
|
||||||
@@ -142,7 +145,7 @@ public class CostDiscard extends CostPartWithList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CostUtil.setInput(Cost_Input.input_discardCost(discType, handList, ability, payment, this, c));
|
CostUtil.setInput(CostDiscard.input_discardCost(discType, handList, ability, payment, this, c));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -191,4 +194,86 @@ public class CostDiscard extends CostPartWithList {
|
|||||||
}
|
}
|
||||||
return list != null;
|
return list != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inputs
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>input_discardCost.</p>
|
||||||
|
* @param discType a {@link java.lang.String} object.
|
||||||
|
* @param handList a {@link forge.CardList} object.
|
||||||
|
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
||||||
|
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
||||||
|
* @param part TODO
|
||||||
|
* @param nNeeded a int.
|
||||||
|
*
|
||||||
|
* @return a {@link forge.gui.input.Input} object.
|
||||||
|
*/
|
||||||
|
public static Input input_discardCost(final String discType, final CardList handList, SpellAbility sa, final Cost_Payment payment, final CostPart part, final int nNeeded) {
|
||||||
|
final SpellAbility sp = sa;
|
||||||
|
Input target = new Input() {
|
||||||
|
private static final long serialVersionUID = -329993322080934435L;
|
||||||
|
|
||||||
|
int nDiscard = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showMessage() {
|
||||||
|
boolean any = discType.equals("Any") ? true : false;
|
||||||
|
if (AllZone.getHumanHand().size() == 0) stop();
|
||||||
|
StringBuilder type = new StringBuilder("");
|
||||||
|
if (any || !discType.equals("Card")) {
|
||||||
|
type.append(" ").append(discType);
|
||||||
|
}
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("Select ");
|
||||||
|
if (any) {
|
||||||
|
sb.append("any ");
|
||||||
|
} else {
|
||||||
|
sb.append("a ").append(type.toString()).append(" ");
|
||||||
|
}
|
||||||
|
sb.append("card to discard.");
|
||||||
|
if (nNeeded > 1) {
|
||||||
|
sb.append(" You have ");
|
||||||
|
sb.append(nNeeded - nDiscard);
|
||||||
|
sb.append(" remaining.");
|
||||||
|
}
|
||||||
|
AllZone.getDisplay().showMessage(sb.toString());
|
||||||
|
ButtonUtil.enableOnlyCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectButtonCancel() {
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectCard(Card card, PlayerZone zone) {
|
||||||
|
if (zone.is(Constant.Zone.Hand) && handList.contains(card)) {
|
||||||
|
// send in CardList for Typing
|
||||||
|
card.getController().discard(card, sp);
|
||||||
|
handList.remove(card);
|
||||||
|
nDiscard++;
|
||||||
|
|
||||||
|
//in case no more cards in hand
|
||||||
|
if (nDiscard == nNeeded)
|
||||||
|
done();
|
||||||
|
else if (AllZone.getHumanHand().size() == 0) // this really shouldn't happen
|
||||||
|
cancel();
|
||||||
|
else
|
||||||
|
showMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancel() {
|
||||||
|
stop();
|
||||||
|
payment.cancelCost();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void done() {
|
||||||
|
stop();
|
||||||
|
payment.paidCost(part);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}//input_discard()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,23 @@
|
|||||||
package forge.card.cost;
|
package forge.card.cost;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
import forge.AllZone;
|
import forge.AllZone;
|
||||||
import forge.AllZoneUtil;
|
import forge.AllZoneUtil;
|
||||||
|
import forge.ButtonUtil;
|
||||||
import forge.Card;
|
import forge.Card;
|
||||||
import forge.CardList;
|
import forge.CardList;
|
||||||
import forge.ComputerUtil;
|
import forge.ComputerUtil;
|
||||||
import forge.Constant;
|
import forge.Constant;
|
||||||
|
import forge.GameActionUtil;
|
||||||
import forge.Player;
|
import forge.Player;
|
||||||
import forge.PlayerZone;
|
import forge.PlayerZone;
|
||||||
import forge.card.abilityFactory.AbilityFactory;
|
import forge.card.abilityFactory.AbilityFactory;
|
||||||
import forge.card.spellability.SpellAbility;
|
import forge.card.spellability.SpellAbility;
|
||||||
|
import forge.gui.GuiUtils;
|
||||||
|
import forge.gui.input.Input;
|
||||||
|
|
||||||
public class CostExile extends CostPartWithList {
|
public class CostExile extends CostPartWithList {
|
||||||
//Exile<Num/Type{/TypeDescription}>
|
//Exile<Num/Type{/TypeDescription}>
|
||||||
@@ -104,16 +112,16 @@ public class CostExile extends CostPartWithList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (getThis()){
|
if (getThis()){
|
||||||
CostUtil.setInput(Cost_Input.exileThis(ability, payment, this));
|
CostUtil.setInput(CostExile.exileThis(ability, payment, this));
|
||||||
}
|
}
|
||||||
else if (from.equals(Constant.Zone.Battlefield) || from.equals(Constant.Zone.Hand)){
|
else if (from.equals(Constant.Zone.Battlefield) || from.equals(Constant.Zone.Hand)){
|
||||||
CostUtil.setInput(Cost_Input.exileType(ability, this, getType(), payment, c));
|
CostUtil.setInput(CostExile.exileType(ability, this, getType(), payment, c));
|
||||||
}
|
}
|
||||||
else if (from.equals(Constant.Zone.Library)){
|
else if (from.equals(Constant.Zone.Library)){
|
||||||
Cost_Input.exileFromTop(ability, this, payment, c);
|
CostExile.exileFromTop(ability, this, payment, c);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
CostUtil.setInput(Cost_Input.exileFrom(ability, this, getType(), payment, c));
|
CostUtil.setInput(CostExile.exileFrom(ability, this, getType(), payment, c));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -146,4 +154,190 @@ public class CostExile extends CostPartWithList {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inputs
|
||||||
|
|
||||||
|
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<Card> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
CardList typeList;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showMessage() {
|
||||||
|
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()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>exileType.</p>
|
||||||
|
*
|
||||||
|
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
||||||
|
* @param costExile TODO
|
||||||
|
* @param type a {@link java.lang.String} object.
|
||||||
|
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
||||||
|
* @return a {@link forge.gui.input.Input} object.
|
||||||
|
*/
|
||||||
|
public static Input exileType(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 = 1403915758082824694L;
|
||||||
|
|
||||||
|
private CardList typeList;
|
||||||
|
private int nExiles = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showMessage() {
|
||||||
|
StringBuilder msg = new StringBuilder("Exile ");
|
||||||
|
int nLeft = nNeeded - nExiles;
|
||||||
|
msg.append(nLeft).append(" ");
|
||||||
|
msg.append(type);
|
||||||
|
if (nLeft > 1) {
|
||||||
|
msg.append("s");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (part.getFrom().equals(Constant.Zone.Hand)){
|
||||||
|
msg.append(" from your Hand");
|
||||||
|
}
|
||||||
|
typeList = AllZoneUtil.getCardsInZone(part.getFrom(), sa.getActivatingPlayer());
|
||||||
|
typeList = typeList.getValidCards(type.split(";"), sa.getActivatingPlayer(), sa.getSourceCard());
|
||||||
|
AllZone.getDisplay().showMessage(msg.toString());
|
||||||
|
ButtonUtil.enableOnlyCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectButtonCancel() {
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectCard(Card card, PlayerZone zone) {
|
||||||
|
if (typeList.contains(card)) {
|
||||||
|
nExiles++;
|
||||||
|
payment.getAbility().addCostToHashList(card, "Exiled");
|
||||||
|
AllZone.getGameAction().exile(card);
|
||||||
|
typeList.remove(card);
|
||||||
|
//in case nothing else to exile
|
||||||
|
if (nExiles == nNeeded)
|
||||||
|
done();
|
||||||
|
else if (typeList.size() == 0) // this really shouldn't happen
|
||||||
|
cancel();
|
||||||
|
else
|
||||||
|
showMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void done() {
|
||||||
|
stop();
|
||||||
|
payment.paidCost(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancel() {
|
||||||
|
stop();
|
||||||
|
payment.cancelCost();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}//exileType()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>exileThis.</p>
|
||||||
|
*
|
||||||
|
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
||||||
|
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
||||||
|
* @param costExile TODO
|
||||||
|
* @return a {@link forge.gui.input.Input} object.
|
||||||
|
*/
|
||||||
|
public static Input exileThis(final SpellAbility sa, final Cost_Payment payment, final CostExile part) {
|
||||||
|
Input target = new Input() {
|
||||||
|
private static final long serialVersionUID = 678668673002725001L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showMessage() {
|
||||||
|
Card card = sa.getSourceCard();
|
||||||
|
if (sa.getActivatingPlayer().isHuman() && AllZoneUtil.isCardInZone(AllZone.getZone(part.getFrom(), sa.getActivatingPlayer()), card)) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(card.getName());
|
||||||
|
sb.append(" - Exile?");
|
||||||
|
Object[] possibleValues = {"Yes", "No"};
|
||||||
|
Object choice = JOptionPane.showOptionDialog(null, sb.toString(), card.getName() + " - Cost",
|
||||||
|
JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,
|
||||||
|
null, possibleValues, possibleValues[0]);
|
||||||
|
if (choice.equals(0)) {
|
||||||
|
payment.getAbility().addCostToHashList(card, "Exiled");
|
||||||
|
AllZone.getGameAction().exile(card);
|
||||||
|
stop();
|
||||||
|
payment.paidCost(part);
|
||||||
|
} else {
|
||||||
|
stop();
|
||||||
|
payment.cancelCost();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}//input_exile()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,18 @@ package forge.card.cost;
|
|||||||
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
|
|
||||||
|
import forge.AllZone;
|
||||||
|
import forge.ButtonUtil;
|
||||||
import forge.Card;
|
import forge.Card;
|
||||||
import forge.ComputerUtil;
|
import forge.ComputerUtil;
|
||||||
|
import forge.Phase;
|
||||||
import forge.Player;
|
import forge.Player;
|
||||||
|
import forge.PlayerZone;
|
||||||
import forge.card.abilityFactory.AbilityFactory;
|
import forge.card.abilityFactory.AbilityFactory;
|
||||||
|
import forge.card.mana.ManaCost;
|
||||||
import forge.card.spellability.SpellAbility;
|
import forge.card.spellability.SpellAbility;
|
||||||
|
import forge.gui.input.Input;
|
||||||
|
import forge.gui.input.Input_PayManaCostUtil;
|
||||||
|
|
||||||
public class CostMana extends CostPart {
|
public class CostMana extends CostPart {
|
||||||
//"Leftover"
|
//"Leftover"
|
||||||
@@ -89,9 +96,9 @@ public class CostMana extends CostPart {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!getMana().equals("0") || manaToAdd > 0)
|
if (!getMana().equals("0") || manaToAdd > 0)
|
||||||
CostUtil.setInput(Cost_Input.input_payMana(ability, payment, this, manaToAdd));
|
CostUtil.setInput(CostMana.input_payMana(ability, payment, this, manaToAdd));
|
||||||
else if (getXMana() > 0)
|
else if (getXMana() > 0)
|
||||||
CostUtil.setInput(Cost_Input.input_payXMana(ability, payment, this, getXMana()));
|
CostUtil.setInput(CostMana.input_payXMana(ability, payment, this, getXMana()));
|
||||||
|
|
||||||
// We return false here because the Inputs set above should recall payment.payCosts()
|
// We return false here because the Inputs set above should recall payment.payCosts()
|
||||||
return false;
|
return false;
|
||||||
@@ -101,4 +108,183 @@ public class CostMana extends CostPart {
|
|||||||
public boolean decideAIPayment(SpellAbility ability, Card source, Cost_Payment payment) {
|
public boolean decideAIPayment(SpellAbility ability, Card source, Cost_Payment payment) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inputs
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>input_payXMana.</p>
|
||||||
|
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
||||||
|
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
||||||
|
* @param costMana TODO
|
||||||
|
* @param numX a int.
|
||||||
|
*
|
||||||
|
* @return a {@link forge.gui.input.Input} object.
|
||||||
|
*/
|
||||||
|
public static Input input_payXMana(final SpellAbility sa, final Cost_Payment payment, final CostMana costMana, final int numX) {
|
||||||
|
Input payX = new Input() {
|
||||||
|
private static final long serialVersionUID = -6900234444347364050L;
|
||||||
|
int xPaid = 0;
|
||||||
|
ManaCost manaCost = new ManaCost(Integer.toString(numX));
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showMessage() {
|
||||||
|
if (manaCost.toString().equals(Integer.toString(numX))) // Can only cancel if partially paid an X value
|
||||||
|
ButtonUtil.enableAll();
|
||||||
|
else
|
||||||
|
ButtonUtil.enableOnlyCancel();
|
||||||
|
|
||||||
|
AllZone.getDisplay().showMessage("Pay X Mana Cost for " + sa.getSourceCard().getName() + "\n" + xPaid + " Paid so far.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// selectCard
|
||||||
|
@Override
|
||||||
|
public void selectCard(Card card, PlayerZone zone) {
|
||||||
|
if (sa.getSourceCard().equals(card) && sa.isTapAbility()) {
|
||||||
|
// this really shouldn't happen but just in case
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
manaCost = Input_PayManaCostUtil.activateManaAbility(sa, card, manaCost);
|
||||||
|
if (manaCost.isPaid()) {
|
||||||
|
manaCost = new ManaCost(Integer.toString(numX));
|
||||||
|
xPaid++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AllZone.getInputControl().getInput() == this)
|
||||||
|
showMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectButtonCancel() {
|
||||||
|
stop();
|
||||||
|
payment.cancelCost();
|
||||||
|
AllZone.getHumanBattlefield().updateObservers();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectButtonOK() {
|
||||||
|
stop();
|
||||||
|
payment.getCard().setXManaCostPaid(xPaid);
|
||||||
|
payment.paidCost(costMana);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
return payX;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>input_payMana.</p>
|
||||||
|
*
|
||||||
|
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
||||||
|
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
||||||
|
* @param manaToAdd a int.
|
||||||
|
* @return a {@link forge.gui.input.Input} object.
|
||||||
|
*/
|
||||||
|
public static Input input_payMana(final SpellAbility sa, final Cost_Payment payment, final CostMana costMana, final int manaToAdd) {
|
||||||
|
final ManaCost manaCost;
|
||||||
|
|
||||||
|
if (Phase.getGameBegins() == 1) {
|
||||||
|
if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) {
|
||||||
|
manaCost = new ManaCost("0");
|
||||||
|
} else {
|
||||||
|
String mana = costMana.getMana();
|
||||||
|
manaCost = new ManaCost(mana);
|
||||||
|
manaCost.increaseColorlessMana(manaToAdd);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.out.println("Is input_payMana ever called when the Game isn't in progress?");
|
||||||
|
manaCost = new ManaCost(sa.getManaCost());
|
||||||
|
}
|
||||||
|
|
||||||
|
Input payMana = new Input() {
|
||||||
|
private ManaCost mana = manaCost;
|
||||||
|
private static final long serialVersionUID = 3467312982164195091L;
|
||||||
|
|
||||||
|
private final String originalManaCost = costMana.getMana();
|
||||||
|
|
||||||
|
private int phyLifeToLose = 0;
|
||||||
|
|
||||||
|
private void resetManaCost() {
|
||||||
|
mana = new ManaCost(originalManaCost);
|
||||||
|
phyLifeToLose = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectCard(Card card, PlayerZone zone) {
|
||||||
|
// prevent cards from tapping themselves if ability is a tapability, although it should already be tapped
|
||||||
|
if (sa.getSourceCard().equals(card) && sa.isTapAbility()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mana = Input_PayManaCostUtil.activateManaAbility(sa, card, mana);
|
||||||
|
|
||||||
|
if (mana.isPaid())
|
||||||
|
done();
|
||||||
|
else if (AllZone.getInputControl().getInput() == this)
|
||||||
|
showMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectPlayer(Player player) {
|
||||||
|
if (player.isHuman()) {
|
||||||
|
if (manaCost.payPhyrexian()) {
|
||||||
|
phyLifeToLose += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
showMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void done() {
|
||||||
|
Card source = sa.getSourceCard();
|
||||||
|
if (phyLifeToLose > 0)
|
||||||
|
AllZone.getHumanPlayer().payLife(phyLifeToLose, source);
|
||||||
|
source.setColorsPaid(mana.getColorsPaid());
|
||||||
|
source.setSunburstValue(mana.getSunburst());
|
||||||
|
resetManaCost();
|
||||||
|
stop();
|
||||||
|
|
||||||
|
if (costMana.hasNoXManaCost() || manaToAdd > 0){
|
||||||
|
payment.paidCost(costMana);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
source.setXManaCostPaid(0);
|
||||||
|
CostUtil.setInput(CostMana.input_payXMana(sa, payment, costMana, costMana.getXMana()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectButtonCancel() {
|
||||||
|
stop();
|
||||||
|
resetManaCost();
|
||||||
|
payment.cancelCost();
|
||||||
|
AllZone.getHumanBattlefield().updateObservers();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showMessage() {
|
||||||
|
ButtonUtil.enableOnlyCancel();
|
||||||
|
String displayMana = mana.toString().replace("X", "").trim();
|
||||||
|
AllZone.getDisplay().showMessage("Pay Mana Cost: " + displayMana);
|
||||||
|
|
||||||
|
StringBuilder msg = new StringBuilder("Pay Mana Cost: " + displayMana);
|
||||||
|
if (phyLifeToLose > 0) {
|
||||||
|
msg.append(" (");
|
||||||
|
msg.append(phyLifeToLose);
|
||||||
|
msg.append(" life paid for phyrexian mana)");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mana.containsPhyrexianMana()) {
|
||||||
|
msg.append("\n(Click on your life total to pay life for phyrexian mana.)");
|
||||||
|
}
|
||||||
|
|
||||||
|
AllZone.getDisplay().showMessage(msg.toString());
|
||||||
|
if (mana.isPaid())
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return payMana;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,18 @@
|
|||||||
package forge.card.cost;
|
package forge.card.cost;
|
||||||
|
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
import forge.AllZone;
|
import forge.AllZone;
|
||||||
import forge.AllZoneUtil;
|
import forge.AllZoneUtil;
|
||||||
|
import forge.ButtonUtil;
|
||||||
import forge.Card;
|
import forge.Card;
|
||||||
import forge.CardList;
|
import forge.CardList;
|
||||||
import forge.ComputerUtil;
|
import forge.ComputerUtil;
|
||||||
import forge.Player;
|
import forge.Player;
|
||||||
|
import forge.PlayerZone;
|
||||||
import forge.card.abilityFactory.AbilityFactory;
|
import forge.card.abilityFactory.AbilityFactory;
|
||||||
import forge.card.spellability.SpellAbility;
|
import forge.card.spellability.SpellAbility;
|
||||||
|
import forge.gui.input.Input;
|
||||||
|
|
||||||
public class CostReturn extends CostPartWithList {
|
public class CostReturn extends CostPartWithList {
|
||||||
// Return<Num/Type{/TypeDescription}>
|
// Return<Num/Type{/TypeDescription}>
|
||||||
@@ -87,9 +92,9 @@ public class CostReturn extends CostPartWithList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (getThis())
|
if (getThis())
|
||||||
CostUtil.setInput(Cost_Input.returnThis(ability, payment, this));
|
CostUtil.setInput(CostReturn.returnThis(ability, payment, this));
|
||||||
else
|
else
|
||||||
CostUtil.setInput(Cost_Input.returnType(ability, getType(), payment, this, c));
|
CostUtil.setInput(CostReturn.returnType(ability, getType(), payment, this, c));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,4 +115,110 @@ public class CostReturn extends CostPartWithList {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inputs
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>returnType.</p>
|
||||||
|
*
|
||||||
|
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
||||||
|
* @param type a {@link java.lang.String} object.
|
||||||
|
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
||||||
|
* @param part TODO
|
||||||
|
* @return a {@link forge.gui.input.Input} object.
|
||||||
|
*/
|
||||||
|
public static Input returnType(final SpellAbility sa, final String type, final Cost_Payment payment, final CostPart part, final int nNeeded) {
|
||||||
|
Input target = new Input() {
|
||||||
|
private static final long serialVersionUID = 2685832214519141903L;
|
||||||
|
private CardList typeList;
|
||||||
|
private int nReturns = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showMessage() {
|
||||||
|
StringBuilder msg = new StringBuilder("Return ");
|
||||||
|
int nLeft = nNeeded - nReturns;
|
||||||
|
msg.append(nLeft).append(" ");
|
||||||
|
msg.append(type);
|
||||||
|
if (nLeft > 1) {
|
||||||
|
msg.append("s");
|
||||||
|
}
|
||||||
|
|
||||||
|
typeList = AllZoneUtil.getPlayerCardsInPlay(sa.getSourceCard().getController());
|
||||||
|
typeList = typeList.getValidCards(type.split(";"), sa.getActivatingPlayer(), sa.getSourceCard());
|
||||||
|
AllZone.getDisplay().showMessage(msg.toString());
|
||||||
|
ButtonUtil.enableOnlyCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectButtonCancel() {
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectCard(Card card, PlayerZone zone) {
|
||||||
|
if (typeList.contains(card)) {
|
||||||
|
nReturns++;
|
||||||
|
AllZone.getGameAction().moveToHand(card);
|
||||||
|
typeList.remove(card);
|
||||||
|
//in case nothing else to return
|
||||||
|
if (nReturns == nNeeded)
|
||||||
|
done();
|
||||||
|
else if (typeList.size() == 0) // this really shouldn't happen
|
||||||
|
cancel();
|
||||||
|
else
|
||||||
|
showMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void done() {
|
||||||
|
stop();
|
||||||
|
payment.paidCost(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancel() {
|
||||||
|
stop();
|
||||||
|
payment.cancelCost();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}//returnType()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>returnThis.</p>
|
||||||
|
*
|
||||||
|
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
||||||
|
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
||||||
|
* @param part TODO
|
||||||
|
* @return a {@link forge.gui.input.Input} object.
|
||||||
|
*/
|
||||||
|
public static Input returnThis(final SpellAbility sa, final Cost_Payment payment, final CostPart part) {
|
||||||
|
Input target = new Input() {
|
||||||
|
private static final long serialVersionUID = 2685832214519141903L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showMessage() {
|
||||||
|
Card card = sa.getSourceCard();
|
||||||
|
if (card.getController().isHuman() && AllZoneUtil.isCardInPlay(card)) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(card.getName());
|
||||||
|
sb.append(" - Return to Hand?");
|
||||||
|
Object[] possibleValues = {"Yes", "No"};
|
||||||
|
Object choice = JOptionPane.showOptionDialog(null, sb.toString(), card.getName() + " - Cost",
|
||||||
|
JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,
|
||||||
|
null, possibleValues, possibleValues[0]);
|
||||||
|
if (choice.equals(0)) {
|
||||||
|
AllZone.getGameAction().moveToHand(card);
|
||||||
|
stop();
|
||||||
|
payment.paidCost(part);
|
||||||
|
} else {
|
||||||
|
stop();
|
||||||
|
payment.cancelCost();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}//input_sacrifice()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,18 @@
|
|||||||
package forge.card.cost;
|
package forge.card.cost;
|
||||||
|
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
import forge.AllZone;
|
import forge.AllZone;
|
||||||
import forge.AllZoneUtil;
|
import forge.AllZoneUtil;
|
||||||
|
import forge.ButtonUtil;
|
||||||
import forge.Card;
|
import forge.Card;
|
||||||
import forge.CardList;
|
import forge.CardList;
|
||||||
import forge.ComputerUtil;
|
import forge.ComputerUtil;
|
||||||
import forge.Player;
|
import forge.Player;
|
||||||
|
import forge.PlayerZone;
|
||||||
import forge.card.abilityFactory.AbilityFactory;
|
import forge.card.abilityFactory.AbilityFactory;
|
||||||
import forge.card.spellability.SpellAbility;
|
import forge.card.spellability.SpellAbility;
|
||||||
|
import forge.gui.input.Input;
|
||||||
|
|
||||||
public class CostSacrifice extends CostPartWithList {
|
public class CostSacrifice extends CostPartWithList {
|
||||||
|
|
||||||
@@ -77,10 +82,10 @@ public class CostSacrifice extends CostPartWithList {
|
|||||||
list = list.getValidCards(type.split(";"), activator, source);
|
list = list.getValidCards(type.split(";"), activator, source);
|
||||||
|
|
||||||
if (getThis()){
|
if (getThis()){
|
||||||
CostUtil.setInput(Cost_Input.sacrificeThis(ability, payment, this));
|
CostUtil.setInput(CostSacrifice.sacrificeThis(ability, payment, this));
|
||||||
}
|
}
|
||||||
else if (amount.equals("All")){
|
else if (amount.equals("All")){
|
||||||
Cost_Input.sacrificeAll(ability, payment, this, list);
|
CostSacrifice.sacrificeAll(ability, payment, this, list);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -96,7 +101,7 @@ public class CostSacrifice extends CostPartWithList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CostUtil.setInput(Cost_Input.sacrificeFromList(ability, payment, this, list, c));
|
CostUtil.setInput(CostSacrifice.sacrificeFromList(ability, payment, this, list, c));
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -129,4 +134,128 @@ public class CostSacrifice extends CostPartWithList {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inputs
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>sacrificeAllType.</p>
|
||||||
|
*
|
||||||
|
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
||||||
|
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
||||||
|
* @param part TODO
|
||||||
|
* @param typeList TODO
|
||||||
|
*/
|
||||||
|
public static void sacrificeAll(final SpellAbility sa, final Cost_Payment payment, CostPart part, CardList typeList) {
|
||||||
|
// TODO Ask First
|
||||||
|
for (Card card : typeList) {
|
||||||
|
payment.getAbility().addCostToHashList(card, "Sacrificed");
|
||||||
|
AllZone.getGameAction().sacrifice(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
payment.setPaidManaPart(part, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>sacrificeFromList.</p>
|
||||||
|
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
||||||
|
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
||||||
|
* @param part TODO
|
||||||
|
* @param typeList TODO
|
||||||
|
* @param num TODO
|
||||||
|
*
|
||||||
|
* @return a {@link forge.gui.input.Input} object.
|
||||||
|
*/
|
||||||
|
public static Input sacrificeFromList(final SpellAbility sa, final Cost_Payment payment, final CostSacrifice part, final CardList typeList, final int nNeeded) {
|
||||||
|
Input target = new Input() {
|
||||||
|
private static final long serialVersionUID = 2685832214519141903L;
|
||||||
|
private int nSacrifices = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showMessage() {
|
||||||
|
StringBuilder msg = new StringBuilder("Sacrifice ");
|
||||||
|
int nLeft = nNeeded - nSacrifices;
|
||||||
|
msg.append(nLeft).append(" ");
|
||||||
|
msg.append(part.getDescriptiveType());
|
||||||
|
if (nLeft > 1) {
|
||||||
|
msg.append("s");
|
||||||
|
}
|
||||||
|
|
||||||
|
AllZone.getDisplay().showMessage(msg.toString());
|
||||||
|
ButtonUtil.enableOnlyCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectButtonCancel() {
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectCard(Card card, PlayerZone zone) {
|
||||||
|
if (typeList.contains(card)) {
|
||||||
|
nSacrifices++;
|
||||||
|
payment.getAbility().addCostToHashList(card, "Sacrificed");
|
||||||
|
AllZone.getGameAction().sacrifice(card);
|
||||||
|
typeList.remove(card);
|
||||||
|
//in case nothing else to sacrifice
|
||||||
|
if (nSacrifices == nNeeded)
|
||||||
|
done();
|
||||||
|
else if (typeList.size() == 0) // this really shouldn't happen
|
||||||
|
cancel();
|
||||||
|
else
|
||||||
|
showMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void done() {
|
||||||
|
stop();
|
||||||
|
payment.paidCost(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancel() {
|
||||||
|
stop();
|
||||||
|
payment.cancelCost();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}//sacrificeType()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>sacrificeThis.</p>
|
||||||
|
*
|
||||||
|
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
||||||
|
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
||||||
|
* @param part TODO
|
||||||
|
* @return a {@link forge.gui.input.Input} object.
|
||||||
|
*/
|
||||||
|
public static Input sacrificeThis(final SpellAbility sa, final Cost_Payment payment, final CostPart part) {
|
||||||
|
Input target = new Input() {
|
||||||
|
private static final long serialVersionUID = 2685832214519141903L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showMessage() {
|
||||||
|
Card card = sa.getSourceCard();
|
||||||
|
if (card.getController().isHuman() && AllZoneUtil.isCardInPlay(card)) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(card.getName());
|
||||||
|
sb.append(" - Sacrifice?");
|
||||||
|
Object[] possibleValues = {"Yes", "No"};
|
||||||
|
Object choice = JOptionPane.showOptionDialog(null, sb.toString(), card.getName() + " - Cost",
|
||||||
|
JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,
|
||||||
|
null, possibleValues, possibleValues[0]);
|
||||||
|
if (choice.equals(0)) {
|
||||||
|
payment.getAbility().addCostToHashList(card, "Sacrificed");
|
||||||
|
AllZone.getGameAction().sacrifice(card);
|
||||||
|
stop();
|
||||||
|
payment.paidCost(part);
|
||||||
|
} else {
|
||||||
|
stop();
|
||||||
|
payment.cancelCost();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}//input_sacrifice()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
package forge.card.cost;
|
package forge.card.cost;
|
||||||
|
|
||||||
|
import forge.AllZone;
|
||||||
import forge.AllZoneUtil;
|
import forge.AllZoneUtil;
|
||||||
|
import forge.ButtonUtil;
|
||||||
import forge.Card;
|
import forge.Card;
|
||||||
import forge.CardList;
|
import forge.CardList;
|
||||||
import forge.ComputerUtil;
|
import forge.ComputerUtil;
|
||||||
|
import forge.Constant;
|
||||||
import forge.Player;
|
import forge.Player;
|
||||||
|
import forge.PlayerZone;
|
||||||
import forge.card.abilityFactory.AbilityFactory;
|
import forge.card.abilityFactory.AbilityFactory;
|
||||||
import forge.card.spellability.SpellAbility;
|
import forge.card.spellability.SpellAbility;
|
||||||
|
import forge.gui.input.Input;
|
||||||
|
|
||||||
public class CostTapType extends CostPartWithList {
|
public class CostTapType extends CostPartWithList {
|
||||||
public CostTapType(String amount, String type, String description){
|
public CostTapType(String amount, String type, String description){
|
||||||
@@ -89,7 +94,7 @@ public class CostTapType extends CostPartWithList {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CostUtil.setInput(Cost_Input.input_tapXCost(this, typeList, ability, payment, c));
|
CostUtil.setInput(CostTapType.input_tapXCost(this, typeList, ability, payment, c));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,4 +115,69 @@ public class CostTapType extends CostPartWithList {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inputs
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>input_tapXCost.</p>
|
||||||
|
*
|
||||||
|
* @param nCards a int.
|
||||||
|
* @param cardType a {@link java.lang.String} object.
|
||||||
|
* @param cardList a {@link forge.CardList} object.
|
||||||
|
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
||||||
|
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
||||||
|
* @return a {@link forge.gui.input.Input} object.
|
||||||
|
*/
|
||||||
|
public static Input input_tapXCost(final CostTapType tapType, final CardList cardList, SpellAbility sa, final Cost_Payment payment, final int nCards) {
|
||||||
|
Input target = new Input() {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 6438988130447851042L;
|
||||||
|
int nTapped = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showMessage() {
|
||||||
|
if (cardList.size() == 0) stop();
|
||||||
|
|
||||||
|
int left = nCards - nTapped;
|
||||||
|
AllZone.getDisplay().showMessage("Select a " + tapType.getDescription() + " to tap (" + left + " left)");
|
||||||
|
ButtonUtil.enableOnlyCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectButtonCancel() {
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectCard(Card card, PlayerZone zone) {
|
||||||
|
if (zone.is(Constant.Zone.Battlefield) && cardList.contains(card) && card.isUntapped()) {
|
||||||
|
// send in CardList for Typing
|
||||||
|
card.tap();
|
||||||
|
tapType.addToList(card);
|
||||||
|
cardList.remove(card);
|
||||||
|
payment.getAbility().addCostToHashList(card, "Tapped");
|
||||||
|
nTapped++;
|
||||||
|
|
||||||
|
if (nTapped == nCards)
|
||||||
|
done();
|
||||||
|
else if (cardList.size() == 0) // this really shouldn't happen
|
||||||
|
cancel();
|
||||||
|
else
|
||||||
|
showMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancel() {
|
||||||
|
stop();
|
||||||
|
payment.cancelCost();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void done() {
|
||||||
|
stop();
|
||||||
|
payment.paidCost(tapType);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}//input_tapXCost()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,760 +0,0 @@
|
|||||||
package forge.card.cost;
|
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
import javax.swing.JOptionPane;
|
|
||||||
|
|
||||||
import forge.AllZone;
|
|
||||||
import forge.AllZoneUtil;
|
|
||||||
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;
|
|
||||||
|
|
||||||
public class Cost_Input {
|
|
||||||
// ******************************************************************************
|
|
||||||
// *********** Inputs used by Cost_Payment below here ***************************
|
|
||||||
// ******************************************************************************
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>input_payMana.</p>
|
|
||||||
*
|
|
||||||
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
|
||||||
* @param manaToAdd a int.
|
|
||||||
* @return a {@link forge.gui.input.Input} object.
|
|
||||||
*/
|
|
||||||
public static Input input_payMana(final SpellAbility sa, final Cost_Payment payment, final CostMana costMana, final int manaToAdd) {
|
|
||||||
final ManaCost manaCost;
|
|
||||||
|
|
||||||
if (Phase.getGameBegins() == 1) {
|
|
||||||
if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) {
|
|
||||||
manaCost = new ManaCost("0");
|
|
||||||
} else {
|
|
||||||
String mana = costMana.getMana();
|
|
||||||
manaCost = new ManaCost(mana);
|
|
||||||
manaCost.increaseColorlessMana(manaToAdd);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
System.out.println("Is input_payMana ever called when the Game isn't in progress?");
|
|
||||||
manaCost = new ManaCost(sa.getManaCost());
|
|
||||||
}
|
|
||||||
|
|
||||||
Input payMana = new Input() {
|
|
||||||
private ManaCost mana = manaCost;
|
|
||||||
private static final long serialVersionUID = 3467312982164195091L;
|
|
||||||
|
|
||||||
private final String originalManaCost = costMana.getMana();
|
|
||||||
|
|
||||||
private int phyLifeToLose = 0;
|
|
||||||
|
|
||||||
private void resetManaCost() {
|
|
||||||
mana = new ManaCost(originalManaCost);
|
|
||||||
phyLifeToLose = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectCard(Card card, PlayerZone zone) {
|
|
||||||
// prevent cards from tapping themselves if ability is a tapability, although it should already be tapped
|
|
||||||
if (sa.getSourceCard().equals(card) && sa.isTapAbility()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mana = Input_PayManaCostUtil.activateManaAbility(sa, card, mana);
|
|
||||||
|
|
||||||
if (mana.isPaid())
|
|
||||||
done();
|
|
||||||
else if (AllZone.getInputControl().getInput() == this)
|
|
||||||
showMessage();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectPlayer(Player player) {
|
|
||||||
if (player.isHuman()) {
|
|
||||||
if (manaCost.payPhyrexian()) {
|
|
||||||
phyLifeToLose += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
showMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void done() {
|
|
||||||
Card source = sa.getSourceCard();
|
|
||||||
if (phyLifeToLose > 0)
|
|
||||||
AllZone.getHumanPlayer().payLife(phyLifeToLose, source);
|
|
||||||
source.setColorsPaid(mana.getColorsPaid());
|
|
||||||
source.setSunburstValue(mana.getSunburst());
|
|
||||||
resetManaCost();
|
|
||||||
stop();
|
|
||||||
|
|
||||||
if (costMana.hasNoXManaCost() || manaToAdd > 0){
|
|
||||||
payment.paidCost(costMana);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
source.setXManaCostPaid(0);
|
|
||||||
CostUtil.setInput(input_payXMana(sa, payment, costMana, costMana.getXMana()));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectButtonCancel() {
|
|
||||||
stop();
|
|
||||||
resetManaCost();
|
|
||||||
payment.cancelCost();
|
|
||||||
AllZone.getHumanBattlefield().updateObservers();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessage() {
|
|
||||||
ButtonUtil.enableOnlyCancel();
|
|
||||||
String displayMana = mana.toString().replace("X", "").trim();
|
|
||||||
AllZone.getDisplay().showMessage("Pay Mana Cost: " + displayMana);
|
|
||||||
|
|
||||||
StringBuilder msg = new StringBuilder("Pay Mana Cost: " + displayMana);
|
|
||||||
if (phyLifeToLose > 0) {
|
|
||||||
msg.append(" (");
|
|
||||||
msg.append(phyLifeToLose);
|
|
||||||
msg.append(" life paid for phyrexian mana)");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mana.containsPhyrexianMana()) {
|
|
||||||
msg.append("\n(Click on your life total to pay life for phyrexian mana.)");
|
|
||||||
}
|
|
||||||
|
|
||||||
AllZone.getDisplay().showMessage(msg.toString());
|
|
||||||
if (mana.isPaid())
|
|
||||||
done();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return payMana;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>input_payXMana.</p>
|
|
||||||
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
|
||||||
* @param costMana TODO
|
|
||||||
* @param numX a int.
|
|
||||||
*
|
|
||||||
* @return a {@link forge.gui.input.Input} object.
|
|
||||||
*/
|
|
||||||
public static Input input_payXMana(final SpellAbility sa, final Cost_Payment payment, final CostMana costMana, final int numX) {
|
|
||||||
Input payX = new Input() {
|
|
||||||
private static final long serialVersionUID = -6900234444347364050L;
|
|
||||||
int xPaid = 0;
|
|
||||||
ManaCost manaCost = new ManaCost(Integer.toString(numX));
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessage() {
|
|
||||||
if (manaCost.toString().equals(Integer.toString(numX))) // Can only cancel if partially paid an X value
|
|
||||||
ButtonUtil.enableAll();
|
|
||||||
else
|
|
||||||
ButtonUtil.enableOnlyCancel();
|
|
||||||
|
|
||||||
AllZone.getDisplay().showMessage("Pay X Mana Cost for " + sa.getSourceCard().getName() + "\n" + xPaid + " Paid so far.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// selectCard
|
|
||||||
@Override
|
|
||||||
public void selectCard(Card card, PlayerZone zone) {
|
|
||||||
if (sa.getSourceCard().equals(card) && sa.isTapAbility()) {
|
|
||||||
// this really shouldn't happen but just in case
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
manaCost = Input_PayManaCostUtil.activateManaAbility(sa, card, manaCost);
|
|
||||||
if (manaCost.isPaid()) {
|
|
||||||
manaCost = new ManaCost(Integer.toString(numX));
|
|
||||||
xPaid++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (AllZone.getInputControl().getInput() == this)
|
|
||||||
showMessage();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectButtonCancel() {
|
|
||||||
stop();
|
|
||||||
payment.cancelCost();
|
|
||||||
AllZone.getHumanBattlefield().updateObservers();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectButtonOK() {
|
|
||||||
stop();
|
|
||||||
payment.getCard().setXManaCostPaid(xPaid);
|
|
||||||
payment.paidCost(costMana);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
return payX;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>input_discardCost.</p>
|
|
||||||
* @param discType a {@link java.lang.String} object.
|
|
||||||
* @param handList a {@link forge.CardList} object.
|
|
||||||
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
|
||||||
* @param part TODO
|
|
||||||
* @param nNeeded a int.
|
|
||||||
*
|
|
||||||
* @return a {@link forge.gui.input.Input} object.
|
|
||||||
*/
|
|
||||||
public static Input input_discardCost(final String discType, final CardList handList, SpellAbility sa, final Cost_Payment payment, final CostPart part, final int nNeeded) {
|
|
||||||
final SpellAbility sp = sa;
|
|
||||||
Input target = new Input() {
|
|
||||||
private static final long serialVersionUID = -329993322080934435L;
|
|
||||||
|
|
||||||
int nDiscard = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessage() {
|
|
||||||
boolean any = discType.equals("Any") ? true : false;
|
|
||||||
if (AllZone.getHumanHand().size() == 0) stop();
|
|
||||||
StringBuilder type = new StringBuilder("");
|
|
||||||
if (any || !discType.equals("Card")) {
|
|
||||||
type.append(" ").append(discType);
|
|
||||||
}
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append("Select ");
|
|
||||||
if (any) {
|
|
||||||
sb.append("any ");
|
|
||||||
} else {
|
|
||||||
sb.append("a ").append(type.toString()).append(" ");
|
|
||||||
}
|
|
||||||
sb.append("card to discard.");
|
|
||||||
if (nNeeded > 1) {
|
|
||||||
sb.append(" You have ");
|
|
||||||
sb.append(nNeeded - nDiscard);
|
|
||||||
sb.append(" remaining.");
|
|
||||||
}
|
|
||||||
AllZone.getDisplay().showMessage(sb.toString());
|
|
||||||
ButtonUtil.enableOnlyCancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectButtonCancel() {
|
|
||||||
cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectCard(Card card, PlayerZone zone) {
|
|
||||||
if (zone.is(Constant.Zone.Hand) && handList.contains(card)) {
|
|
||||||
// send in CardList for Typing
|
|
||||||
card.getController().discard(card, sp);
|
|
||||||
handList.remove(card);
|
|
||||||
nDiscard++;
|
|
||||||
|
|
||||||
//in case no more cards in hand
|
|
||||||
if (nDiscard == nNeeded)
|
|
||||||
done();
|
|
||||||
else if (AllZone.getHumanHand().size() == 0) // this really shouldn't happen
|
|
||||||
cancel();
|
|
||||||
else
|
|
||||||
showMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void cancel() {
|
|
||||||
stop();
|
|
||||||
payment.cancelCost();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void done() {
|
|
||||||
stop();
|
|
||||||
payment.paidCost(part);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}//input_discard()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>sacrificeThis.</p>
|
|
||||||
*
|
|
||||||
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
|
||||||
* @param part TODO
|
|
||||||
* @return a {@link forge.gui.input.Input} object.
|
|
||||||
*/
|
|
||||||
public static Input sacrificeThis(final SpellAbility sa, final Cost_Payment payment, final CostPart part) {
|
|
||||||
Input target = new Input() {
|
|
||||||
private static final long serialVersionUID = 2685832214519141903L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessage() {
|
|
||||||
Card card = sa.getSourceCard();
|
|
||||||
if (card.getController().isHuman() && AllZoneUtil.isCardInPlay(card)) {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append(card.getName());
|
|
||||||
sb.append(" - Sacrifice?");
|
|
||||||
Object[] possibleValues = {"Yes", "No"};
|
|
||||||
Object choice = JOptionPane.showOptionDialog(null, sb.toString(), card.getName() + " - Cost",
|
|
||||||
JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,
|
|
||||||
null, possibleValues, possibleValues[0]);
|
|
||||||
if (choice.equals(0)) {
|
|
||||||
payment.getAbility().addCostToHashList(card, "Sacrificed");
|
|
||||||
AllZone.getGameAction().sacrifice(card);
|
|
||||||
stop();
|
|
||||||
payment.paidCost(part);
|
|
||||||
} else {
|
|
||||||
stop();
|
|
||||||
payment.cancelCost();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}//input_sacrifice()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>sacrificeType.</p>
|
|
||||||
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
|
||||||
* @param part TODO
|
|
||||||
* @param typeList TODO
|
|
||||||
* @param num TODO
|
|
||||||
*
|
|
||||||
* @return a {@link forge.gui.input.Input} object.
|
|
||||||
*/
|
|
||||||
public static Input sacrificeFromList(final SpellAbility sa, final Cost_Payment payment, final CostSacrifice part, final CardList typeList, final int nNeeded) {
|
|
||||||
Input target = new Input() {
|
|
||||||
private static final long serialVersionUID = 2685832214519141903L;
|
|
||||||
private int nSacrifices = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessage() {
|
|
||||||
StringBuilder msg = new StringBuilder("Sacrifice ");
|
|
||||||
int nLeft = nNeeded - nSacrifices;
|
|
||||||
msg.append(nLeft).append(" ");
|
|
||||||
msg.append(part.getDescriptiveType());
|
|
||||||
if (nLeft > 1) {
|
|
||||||
msg.append("s");
|
|
||||||
}
|
|
||||||
|
|
||||||
AllZone.getDisplay().showMessage(msg.toString());
|
|
||||||
ButtonUtil.enableOnlyCancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectButtonCancel() {
|
|
||||||
cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectCard(Card card, PlayerZone zone) {
|
|
||||||
if (typeList.contains(card)) {
|
|
||||||
nSacrifices++;
|
|
||||||
payment.getAbility().addCostToHashList(card, "Sacrificed");
|
|
||||||
AllZone.getGameAction().sacrifice(card);
|
|
||||||
typeList.remove(card);
|
|
||||||
//in case nothing else to sacrifice
|
|
||||||
if (nSacrifices == nNeeded)
|
|
||||||
done();
|
|
||||||
else if (typeList.size() == 0) // this really shouldn't happen
|
|
||||||
cancel();
|
|
||||||
else
|
|
||||||
showMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void done() {
|
|
||||||
stop();
|
|
||||||
payment.paidCost(part);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void cancel() {
|
|
||||||
stop();
|
|
||||||
payment.cancelCost();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}//sacrificeType()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>sacrificeAllType.</p>
|
|
||||||
*
|
|
||||||
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
|
||||||
* @param part TODO
|
|
||||||
* @param typeList TODO
|
|
||||||
*/
|
|
||||||
public static void sacrificeAll(final SpellAbility sa, final Cost_Payment payment, CostPart part, CardList typeList) {
|
|
||||||
// TODO Ask First
|
|
||||||
for (Card card : typeList) {
|
|
||||||
payment.getAbility().addCostToHashList(card, "Sacrificed");
|
|
||||||
AllZone.getGameAction().sacrifice(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
payment.setPaidManaPart(part, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>exileThis.</p>
|
|
||||||
*
|
|
||||||
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
|
||||||
* @param costExile TODO
|
|
||||||
* @return a {@link forge.gui.input.Input} object.
|
|
||||||
*/
|
|
||||||
public static Input exileThis(final SpellAbility sa, final Cost_Payment payment, final CostExile part) {
|
|
||||||
Input target = new Input() {
|
|
||||||
private static final long serialVersionUID = 678668673002725001L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessage() {
|
|
||||||
Card card = sa.getSourceCard();
|
|
||||||
if (sa.getActivatingPlayer().isHuman() && AllZoneUtil.isCardInZone(AllZone.getZone(part.getFrom(), sa.getActivatingPlayer()), card)) {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append(card.getName());
|
|
||||||
sb.append(" - Exile?");
|
|
||||||
Object[] possibleValues = {"Yes", "No"};
|
|
||||||
Object choice = JOptionPane.showOptionDialog(null, sb.toString(), card.getName() + " - Cost",
|
|
||||||
JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,
|
|
||||||
null, possibleValues, possibleValues[0]);
|
|
||||||
if (choice.equals(0)) {
|
|
||||||
payment.getAbility().addCostToHashList(card, "Exiled");
|
|
||||||
AllZone.getGameAction().exile(card);
|
|
||||||
stop();
|
|
||||||
payment.paidCost(part);
|
|
||||||
} else {
|
|
||||||
stop();
|
|
||||||
payment.cancelCost();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}//input_exile()
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>exileType.</p>
|
|
||||||
*
|
|
||||||
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @param costExile TODO
|
|
||||||
* @param type a {@link java.lang.String} object.
|
|
||||||
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
|
||||||
* @return a {@link forge.gui.input.Input} object.
|
|
||||||
*/
|
|
||||||
public static Input exileType(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 = 1403915758082824694L;
|
|
||||||
|
|
||||||
private CardList typeList;
|
|
||||||
private int nExiles = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessage() {
|
|
||||||
StringBuilder msg = new StringBuilder("Exile ");
|
|
||||||
int nLeft = nNeeded - nExiles;
|
|
||||||
msg.append(nLeft).append(" ");
|
|
||||||
msg.append(type);
|
|
||||||
if (nLeft > 1) {
|
|
||||||
msg.append("s");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (part.getFrom().equals(Constant.Zone.Hand)){
|
|
||||||
msg.append(" from your Hand");
|
|
||||||
}
|
|
||||||
typeList = AllZoneUtil.getCardsInZone(part.getFrom(), sa.getActivatingPlayer());
|
|
||||||
typeList = typeList.getValidCards(type.split(";"), sa.getActivatingPlayer(), sa.getSourceCard());
|
|
||||||
AllZone.getDisplay().showMessage(msg.toString());
|
|
||||||
ButtonUtil.enableOnlyCancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectButtonCancel() {
|
|
||||||
cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectCard(Card card, PlayerZone zone) {
|
|
||||||
if (typeList.contains(card)) {
|
|
||||||
nExiles++;
|
|
||||||
payment.getAbility().addCostToHashList(card, "Exiled");
|
|
||||||
AllZone.getGameAction().exile(card);
|
|
||||||
typeList.remove(card);
|
|
||||||
//in case nothing else to exile
|
|
||||||
if (nExiles == nNeeded)
|
|
||||||
done();
|
|
||||||
else if (typeList.size() == 0) // this really shouldn't happen
|
|
||||||
cancel();
|
|
||||||
else
|
|
||||||
showMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void done() {
|
|
||||||
stop();
|
|
||||||
payment.paidCost(part);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void cancel() {
|
|
||||||
stop();
|
|
||||||
payment.cancelCost();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
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;
|
|
||||||
CardList typeList;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessage() {
|
|
||||||
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<Card> 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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>input_tapXCost.</p>
|
|
||||||
*
|
|
||||||
* @param nCards a int.
|
|
||||||
* @param cardType a {@link java.lang.String} object.
|
|
||||||
* @param cardList a {@link forge.CardList} object.
|
|
||||||
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
|
||||||
* @return a {@link forge.gui.input.Input} object.
|
|
||||||
*/
|
|
||||||
public static Input input_tapXCost(final CostTapType tapType, final CardList cardList, SpellAbility sa, final Cost_Payment payment, final int nCards) {
|
|
||||||
Input target = new Input() {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 6438988130447851042L;
|
|
||||||
int nTapped = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessage() {
|
|
||||||
if (cardList.size() == 0) stop();
|
|
||||||
|
|
||||||
int left = nCards - nTapped;
|
|
||||||
AllZone.getDisplay().showMessage("Select a " + tapType.getDescription() + " to tap (" + left + " left)");
|
|
||||||
ButtonUtil.enableOnlyCancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectButtonCancel() {
|
|
||||||
cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectCard(Card card, PlayerZone zone) {
|
|
||||||
if (zone.is(Constant.Zone.Battlefield) && cardList.contains(card) && card.isUntapped()) {
|
|
||||||
// send in CardList for Typing
|
|
||||||
card.tap();
|
|
||||||
tapType.addToList(card);
|
|
||||||
cardList.remove(card);
|
|
||||||
payment.getAbility().addCostToHashList(card, "Tapped");
|
|
||||||
nTapped++;
|
|
||||||
|
|
||||||
if (nTapped == nCards)
|
|
||||||
done();
|
|
||||||
else if (cardList.size() == 0) // this really shouldn't happen
|
|
||||||
cancel();
|
|
||||||
else
|
|
||||||
showMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void cancel() {
|
|
||||||
stop();
|
|
||||||
payment.cancelCost();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void done() {
|
|
||||||
stop();
|
|
||||||
payment.paidCost(tapType);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}//input_tapXCost()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>returnThis.</p>
|
|
||||||
*
|
|
||||||
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
|
||||||
* @param part TODO
|
|
||||||
* @return a {@link forge.gui.input.Input} object.
|
|
||||||
*/
|
|
||||||
public static Input returnThis(final SpellAbility sa, final Cost_Payment payment, final CostPart part) {
|
|
||||||
Input target = new Input() {
|
|
||||||
private static final long serialVersionUID = 2685832214519141903L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessage() {
|
|
||||||
Card card = sa.getSourceCard();
|
|
||||||
if (card.getController().isHuman() && AllZoneUtil.isCardInPlay(card)) {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append(card.getName());
|
|
||||||
sb.append(" - Return to Hand?");
|
|
||||||
Object[] possibleValues = {"Yes", "No"};
|
|
||||||
Object choice = JOptionPane.showOptionDialog(null, sb.toString(), card.getName() + " - Cost",
|
|
||||||
JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,
|
|
||||||
null, possibleValues, possibleValues[0]);
|
|
||||||
if (choice.equals(0)) {
|
|
||||||
AllZone.getGameAction().moveToHand(card);
|
|
||||||
stop();
|
|
||||||
payment.paidCost(part);
|
|
||||||
} else {
|
|
||||||
stop();
|
|
||||||
payment.cancelCost();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}//input_sacrifice()
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>returnType.</p>
|
|
||||||
*
|
|
||||||
* @param sa a {@link forge.card.spellability.SpellAbility} object.
|
|
||||||
* @param type a {@link java.lang.String} object.
|
|
||||||
* @param payment a {@link forge.card.cost.Cost_Payment} object.
|
|
||||||
* @param part TODO
|
|
||||||
* @return a {@link forge.gui.input.Input} object.
|
|
||||||
*/
|
|
||||||
public static Input returnType(final SpellAbility sa, final String type, final Cost_Payment payment, final CostPart part, final int nNeeded) {
|
|
||||||
Input target = new Input() {
|
|
||||||
private static final long serialVersionUID = 2685832214519141903L;
|
|
||||||
private CardList typeList;
|
|
||||||
private int nReturns = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessage() {
|
|
||||||
StringBuilder msg = new StringBuilder("Return ");
|
|
||||||
int nLeft = nNeeded - nReturns;
|
|
||||||
msg.append(nLeft).append(" ");
|
|
||||||
msg.append(type);
|
|
||||||
if (nLeft > 1) {
|
|
||||||
msg.append("s");
|
|
||||||
}
|
|
||||||
|
|
||||||
typeList = AllZoneUtil.getPlayerCardsInPlay(sa.getSourceCard().getController());
|
|
||||||
typeList = typeList.getValidCards(type.split(";"), sa.getActivatingPlayer(), sa.getSourceCard());
|
|
||||||
AllZone.getDisplay().showMessage(msg.toString());
|
|
||||||
ButtonUtil.enableOnlyCancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectButtonCancel() {
|
|
||||||
cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectCard(Card card, PlayerZone zone) {
|
|
||||||
if (typeList.contains(card)) {
|
|
||||||
nReturns++;
|
|
||||||
AllZone.getGameAction().moveToHand(card);
|
|
||||||
typeList.remove(card);
|
|
||||||
//in case nothing else to return
|
|
||||||
if (nReturns == nNeeded)
|
|
||||||
done();
|
|
||||||
else if (typeList.size() == 0) // this really shouldn't happen
|
|
||||||
cancel();
|
|
||||||
else
|
|
||||||
showMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void done() {
|
|
||||||
stop();
|
|
||||||
payment.paidCost(part);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void cancel() {
|
|
||||||
stop();
|
|
||||||
payment.cancelCost();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return target;
|
|
||||||
}//returnType()
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user