renamed PayMana* classes,

pulled some code up from InputSyncronizedBase to InputBase.java
mulligan method known as startGame
routed selectCard call via InputProxy
This commit is contained in:
Maxmtg
2013-05-28 15:06:10 +00:00
parent c58bb4b130
commit a211222b3e
21 changed files with 60 additions and 96 deletions

3
.gitattributes vendored
View File

@@ -14169,12 +14169,11 @@ src/main/java/forge/control/input/InputBlock.java svneol=native#text/plain
src/main/java/forge/control/input/InputConfirmMulligan.java svneol=native#text/plain src/main/java/forge/control/input/InputConfirmMulligan.java svneol=native#text/plain
src/main/java/forge/control/input/InputLockUI.java -text src/main/java/forge/control/input/InputLockUI.java -text
src/main/java/forge/control/input/InputPassPriority.java svneol=native#text/plain src/main/java/forge/control/input/InputPassPriority.java svneol=native#text/plain
src/main/java/forge/control/input/InputPayManaBase.java -text src/main/java/forge/control/input/InputPayMana.java -text
src/main/java/forge/control/input/InputPayManaExecuteCommands.java svneol=native#text/plain src/main/java/forge/control/input/InputPayManaExecuteCommands.java svneol=native#text/plain
src/main/java/forge/control/input/InputPayManaOfCostPayment.java -text src/main/java/forge/control/input/InputPayManaOfCostPayment.java -text
src/main/java/forge/control/input/InputPayManaSimple.java svneol=native#text/plain src/main/java/forge/control/input/InputPayManaSimple.java svneol=native#text/plain
src/main/java/forge/control/input/InputPayManaX.java -text src/main/java/forge/control/input/InputPayManaX.java -text
src/main/java/forge/control/input/InputPayment.java -text
src/main/java/forge/control/input/InputPlayOrDraw.java -text src/main/java/forge/control/input/InputPlayOrDraw.java -text
src/main/java/forge/control/input/InputProliferate.java -text src/main/java/forge/control/input/InputProliferate.java -text
src/main/java/forge/control/input/InputQueue.java svneol=native#text/plain src/main/java/forge/control/input/InputQueue.java svneol=native#text/plain

View File

@@ -25,9 +25,9 @@ import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostBeingPaid; import forge.card.mana.ManaCostBeingPaid;
import forge.card.mana.ManaCostShard; import forge.card.mana.ManaCostShard;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.InputPayMana;
import forge.control.input.InputPayManaOfCostPayment; import forge.control.input.InputPayManaOfCostPayment;
import forge.control.input.InputPayManaX; import forge.control.input.InputPayManaX;
import forge.control.input.InputPayment;
import forge.game.GameState; import forge.game.GameState;
import forge.game.ai.ComputerUtilMana; import forge.game.ai.ComputerUtilMana;
import forge.game.player.Player; import forge.game.player.Player;
@@ -127,9 +127,10 @@ public class CostPartMana extends CostPart {
toPay.combineManaCost(mkCost); toPay.combineManaCost(mkCost);
} }
InputPayMana inpPayment;
toPay.applySpellCostChange(ability); toPay.applySpellCostChange(ability);
if (!toPay.isPaid()) { if (!toPay.isPaid()) {
InputPayment inpPayment = new InputPayManaOfCostPayment(toPay, ability); inpPayment = new InputPayManaOfCostPayment(toPay, ability);
Singletons.getControl().getInputQueue().setInputAndWait(inpPayment); Singletons.getControl().getInputQueue().setInputAndWait(inpPayment);
if(!inpPayment.isPaid()) if(!inpPayment.isPaid())
return false; return false;
@@ -140,7 +141,7 @@ public class CostPartMana extends CostPart {
if (this.getAmountOfX() > 0) { if (this.getAmountOfX() > 0) {
if( !ability.isAnnouncing("X") && !xWasBilled) { if( !ability.isAnnouncing("X") && !xWasBilled) {
source.setXManaCostPaid(0); source.setXManaCostPaid(0);
InputPayment inpPayment = new InputPayManaX(ability, this.getAmountOfX(), this.canXbe0()); inpPayment = new InputPayManaX(ability, this.getAmountOfX(), this.canXbe0());
Singletons.getControl().getInputQueue().setInputAndWait(inpPayment); Singletons.getControl().getInputQueue().setInputAndWait(inpPayment);
if(!inpPayment.isPaid()) if(!inpPayment.isPaid())
return false; return false;

View File

@@ -10,7 +10,7 @@ import forge.game.player.Player;
public interface Input { public interface Input {
// showMessage() is always the first method called // showMessage() is always the first method called
void showMessage(InputQueue iq); void showMessageInitial();
void selectCard(Card c, boolean isMetaDown); void selectCard(Card c, boolean isMetaDown);

View File

@@ -35,29 +35,44 @@ import forge.gui.match.views.VMessage;
public abstract class InputBase implements java.io.Serializable, Input { public abstract class InputBase implements java.io.Serializable, Input {
/** Constant <code>serialVersionUID=-6539552513871194081L</code>. */ /** Constant <code>serialVersionUID=-6539552513871194081L</code>. */
private static final long serialVersionUID = -6539552513871194081L; private static final long serialVersionUID = -6539552513871194081L;
private InputQueue queue;
private boolean finished = false; private boolean finished = false;
protected final boolean isFinished() { return finished; } protected final boolean isFinished() { return finished; }
protected final void setFinished() { finished = true; } protected final void setFinished() { finished = true; }
// showMessage() is always the first method called // showMessage() is always the first method called
@Override @Override
public final void showMessage(InputQueue iq) { public final void showMessageInitial() {
queue = iq;
finished = false; finished = false;
showMessage(); showMessage();
} }
protected abstract void showMessage(); protected abstract void showMessage();
@Override
public void selectCard(final Card c, boolean isMetaDown) { }
@Override @Override
public void selectPlayer(final Player player) { } public void selectPlayer(final Player player) { }
@Override @Override
public void selectButtonOK() { } public final void selectButtonCancel() {
if( isFinished() ) return;
onCancel();
}
@Override @Override
public void selectButtonCancel() { } public final void selectButtonOK() {
if( isFinished() ) return;
onOk();
}
@Override
public final void selectCard(Card c, boolean isMetaDown) {
if( isFinished() ) return;
onCardSelected(c, isMetaDown);
}
protected void onCardSelected(Card c, boolean isRmb) {}
protected void onCancel() {}
protected void onOk() {}
// to remove need for CMatchUI dependence // to remove need for CMatchUI dependence
protected final void showMessage(String message) { protected final void showMessage(String message) {
@@ -65,16 +80,10 @@ public abstract class InputBase implements java.io.Serializable, Input {
} }
protected void afterStop() { }
protected final void flashIncorrectAction() { protected final void flashIncorrectAction() {
SDisplayUtil.remind(VMessage.SINGLETON_INSTANCE); SDisplayUtil.remind(VMessage.SINGLETON_INSTANCE);
} }
protected InputQueue getQueue() {
return queue;
}
protected String getTurnPhasePriorityMessage(Player player) { protected String getTurnPhasePriorityMessage(Player player) {
final PhaseHandler ph = player.getGame().getPhaseHandler(); final PhaseHandler ph = player.getGame().getPhaseHandler();
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();

View File

@@ -4,6 +4,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import forge.Card; import forge.Card;
import forge.FThreads; import forge.FThreads;
import forge.Singletons;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.match.CMatchUI; import forge.gui.match.CMatchUI;
import forge.view.ButtonUtil; import forge.view.ButtonUtil;
@@ -14,13 +15,11 @@ import forge.view.ButtonUtil;
*/ */
public class InputLockUI implements Input { public class InputLockUI implements Input {
private final AtomicInteger iCall = new AtomicInteger(); private final AtomicInteger iCall = new AtomicInteger();
private final InputQueue iq;
public InputLockUI(InputQueue inputQueue) { public InputLockUI(InputQueue inputQueue) {
iq = inputQueue;
} }
public void showMessage(InputQueue iq) { public void showMessageInitial() {
int ixCall = 1 + iCall.getAndIncrement(); int ixCall = 1 + iCall.getAndIncrement();
FThreads.delay(500, new InputUpdater(ixCall)); FThreads.delay(500, new InputUpdater(ixCall));
} }
@@ -55,7 +54,7 @@ public class InputLockUI implements Input {
}; };
protected final boolean isActive() { protected final boolean isActive() {
return iq.getInput() == this; return Singletons.getControl().getInputQueue().getInput() == this;
} }
protected void showMessage(String message) { protected void showMessage(String message) {

View File

@@ -26,7 +26,7 @@ import forge.view.ButtonUtil;
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.
* *
*/ */
public abstract class InputPayManaBase extends InputSyncronizedBase implements InputPayment { public abstract class InputPayMana extends InputSyncronizedBase {
private static final long serialVersionUID = -9133423708688480255L; private static final long serialVersionUID = -9133423708688480255L;
@@ -39,7 +39,7 @@ public abstract class InputPayManaBase extends InputSyncronizedBase implements I
boolean bPaid = false; boolean bPaid = false;
protected InputPayManaBase(SpellAbility saToPayFor) { protected InputPayMana(SpellAbility saToPayFor) {
this.player = saToPayFor.getActivatingPlayer(); this.player = saToPayFor.getActivatingPlayer();
this.game = player.getGame(); this.game = player.getGame();
this.saPaidFor = saToPayFor; this.saPaidFor = saToPayFor;

View File

@@ -33,7 +33,7 @@ import forge.game.player.Player;
* @author Forge * @author Forge
* @version $Id$ * @version $Id$
*/ */
public class InputPayManaExecuteCommands extends InputPayManaBase { public class InputPayManaExecuteCommands extends InputPayMana {
/** /**
* Constant <code>serialVersionUID=3836655722696348713L</code>. * Constant <code>serialVersionUID=3836655722696348713L</code>.
*/ */

View File

@@ -5,7 +5,7 @@ import forge.card.mana.ManaCostBeingPaid;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.player.Player; import forge.game.player.Player;
public class InputPayManaOfCostPayment extends InputPayManaBase { public class InputPayManaOfCostPayment extends InputPayMana {
public InputPayManaOfCostPayment(ManaCostBeingPaid cost, SpellAbility spellAbility) { public InputPayManaOfCostPayment(ManaCostBeingPaid cost, SpellAbility spellAbility) {
super(spellAbility); super(spellAbility);

View File

@@ -28,7 +28,7 @@ import forge.view.ButtonUtil;
//pays the cost of a card played from the player's hand //pays the cost of a card played from the player's hand
//the card is removed from the players hand if the cost is paid //the card is removed from the players hand if the cost is paid
//CANNOT be used for ABILITIES //CANNOT be used for ABILITIES
public class InputPayManaSimple extends InputPayManaBase { public class InputPayManaSimple extends InputPayMana {
// anything that uses this should be converted to Ability_Cost // anything that uses this should be converted to Ability_Cost
/** Constant <code>serialVersionUID=3467312982164195091L</code>. */ /** Constant <code>serialVersionUID=3467312982164195091L</code>. */
private static final long serialVersionUID = 3467312982164195091L; private static final long serialVersionUID = 3467312982164195091L;

View File

@@ -11,7 +11,7 @@ import forge.card.mana.ManaCostBeingPaid;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.view.ButtonUtil; import forge.view.ButtonUtil;
public class InputPayManaX extends InputPayManaBase { public class InputPayManaX extends InputPayMana {
private static final long serialVersionUID = -6900234444347364050L; private static final long serialVersionUID = -6900234444347364050L;
private int xPaid = 0; private int xPaid = 0;
private byte colorsPaid; private byte colorsPaid;

View File

@@ -1,5 +0,0 @@
package forge.control.input;
public interface InputPayment extends InputSynchronized {
boolean isPaid();
}

View File

@@ -126,9 +126,6 @@ public abstract class InputSelectManyBase<T extends GameEntity> extends InputSyn
for(T c : selected) for(T c : selected)
if( c instanceof Card) if( c instanceof Card)
((Card)c).setUsedToPay(false); ((Card)c).setUsedToPay(false);
super.afterStop(); // It's ultimatelly important to keep call to super class!
} }

View File

@@ -2,17 +2,14 @@ package forge.control.input;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import forge.Card;
import forge.FThreads; import forge.FThreads;
import forge.Singletons;
import forge.error.BugReporter; import forge.error.BugReporter;
public abstract class InputSyncronizedBase extends InputBase implements InputSynchronized { public abstract class InputSyncronizedBase extends InputBase implements InputSynchronized {
private static final long serialVersionUID = 8756177361251703052L; private static final long serialVersionUID = 8756177361251703052L;
private final CountDownLatch cdlDone; private final CountDownLatch cdlDone;
public InputSyncronizedBase() { public InputSyncronizedBase() {
cdlDone = new CountDownLatch(1); cdlDone = new CountDownLatch(1);
} }
@@ -35,30 +32,7 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn
FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { setFinished(); } }); FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { setFinished(); } });
// thread irrelevant // thread irrelevant
getQueue().removeInput(InputSyncronizedBase.this); Singletons.getControl().getInputQueue().removeInput(InputSyncronizedBase.this);
cdlDone.countDown(); cdlDone.countDown();
} }
@Override
public final void selectButtonCancel() {
if( isFinished() ) return;
onCancel();
}
@Override
public final void selectButtonOK() {
if( isFinished() ) return;
onOk();
}
@Override
public final void selectCard(Card c, boolean isMetaDown) {
if( isFinished() ) return;
onCardSelected(c, isMetaDown);
}
protected void onCardSelected(Card c, boolean isRmb) {}
protected void onCancel() {}
protected void onOk() {}
} }

View File

@@ -1479,7 +1479,7 @@ public class GameAction {
game.getAction().checkStateEffects(); game.getAction().checkStateEffects();
} }
public void mulligan(final Player firstPlayer) { public void startGame(final Player firstPlayer) {
performMulligans(firstPlayer, game.getType() == GameType.Commander); performMulligans(firstPlayer, game.getType() == GameType.Commander);
game.setAge(GameAge.Play); game.setAge(GameAge.Play);

View File

@@ -334,9 +334,6 @@ public class GameNew {
// ultimate of Karn the Liberated // ultimate of Karn the Liberated
public static void restartGame(final GameState game, final Player startingTurn, Map<Player, List<Card>> playerLibraries) { public static void restartGame(final GameState game, final Player startingTurn, Map<Player, List<Card>> playerLibraries) {
game.setAge(GameAge.Mulligan);
game.getAction().mulligan(startingTurn);
//Card.resetUniqueNumber(); //Card.resetUniqueNumber();
// need this code here, otherwise observables fail // need this code here, otherwise observables fail
forge.card.trigger.Trigger.resetIDs(); forge.card.trigger.Trigger.resetIDs();
@@ -377,10 +374,14 @@ public class GameNew {
PhaseHandler phaseHandler = game.getPhaseHandler(); PhaseHandler phaseHandler = game.getPhaseHandler();
phaseHandler.setPlayerTurn(startingTurn); phaseHandler.setPlayerTurn(startingTurn);
game.setAge(GameAge.Mulligan);
// Draw <handsize> cards // Draw <handsize> cards
for (final Player p : game.getPlayers()) { for (final Player p : game.getPlayers()) {
p.drawCards(p.getMaxHandSize()); p.drawCards(p.getMaxHandSize());
} }
game.getAction().startGame(startingTurn);
} }

View File

@@ -125,7 +125,7 @@ public class MatchState {
} }
currentGame.setAge(GameAge.Mulligan); currentGame.setAge(GameAge.Mulligan);
currentGame.getAction().mulligan(firstPlayer); currentGame.getAction().startGame(firstPlayer);
} }
}); });
} }

View File

@@ -39,10 +39,9 @@ import forge.card.spellability.Ability;
import forge.card.spellability.HumanPlaySpellAbility; import forge.card.spellability.HumanPlaySpellAbility;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.spellability.Target; import forge.card.spellability.Target;
import forge.control.input.InputPayManaBase; import forge.control.input.InputPayMana;
import forge.control.input.InputPayManaExecuteCommands; import forge.control.input.InputPayManaExecuteCommands;
import forge.control.input.InputPayManaSimple; import forge.control.input.InputPayManaSimple;
import forge.control.input.InputPayment;
import forge.control.input.InputSelectCards; import forge.control.input.InputSelectCards;
import forge.control.input.InputSelectCardsFromList; import forge.control.input.InputSelectCardsFromList;
import forge.game.GameActionUtil; import forge.game.GameActionUtil;
@@ -160,7 +159,7 @@ public class HumanPlay {
boolean isPaid = manaCost.isPaid(); boolean isPaid = manaCost.isPaid();
if( !isPaid ) { if( !isPaid ) {
InputPayManaBase inputPay = new InputPayManaSimple(p.getGame(), sa, manaCost); InputPayMana inputPay = new InputPayManaSimple(p.getGame(), sa, manaCost);
Singletons.getControl().getInputQueue().setInputAndWait(inputPay); Singletons.getControl().getInputQueue().setInputAndWait(inputPay);
isPaid = inputPay.isPaid(); isPaid = inputPay.isPaid();
} }
@@ -454,7 +453,7 @@ public class HumanPlay {
if (!(costPart instanceof CostPartMana )) if (!(costPart instanceof CostPartMana ))
throw new RuntimeException("GameActionUtil.payCostDuringAbilityResolve - The remaining payment type is not Mana."); throw new RuntimeException("GameActionUtil.payCostDuringAbilityResolve - The remaining payment type is not Mana.");
InputPayment toSet = current == null InputPayMana toSet = current == null
? new InputPayManaExecuteCommands(p, source + "\r\n", cost.getCostMana().getManaToPay()) ? new InputPayManaExecuteCommands(p, source + "\r\n", cost.getCostMana().getManaToPay())
: new InputPayManaExecuteCommands(p, source + "\r\n" + "Current Card: " + current + "\r\n" , cost.getCostMana().getManaToPay()); : new InputPayManaExecuteCommands(p, source + "\r\n" + "Current Card: " + current + "\r\n" , cost.getCostMana().getManaToPay());
Singletons.getControl().getInputQueue().setInputAndWait(toSet); Singletons.getControl().getInputQueue().setInputAndWait(toSet);

View File

@@ -51,8 +51,6 @@ public class InputProxy implements Observer {
@Override @Override
public final void update(final Observable observable, final Object obj) { public final void update(final Observable observable, final Object obj) {
synchronized(this) {} // want to update all changes to memory
final Input nextInput = Singletons.getControl().getInputQueue().getActualInput(game); final Input nextInput = Singletons.getControl().getInputQueue().getActualInput(game);
/* if(DEBUG_INPUT) /* if(DEBUG_INPUT)
@@ -65,7 +63,7 @@ public class InputProxy implements Observer {
@Override public void run() { @Override public void run() {
Input current = getInput(); Input current = getInput();
//System.out.printf("\t%s > showMessage @ %s/%s during %s%n", FThreads.debugGetCurrThreadId(), nextInput.getClass().getSimpleName(), current.getClass().getSimpleName(), game.getPhaseHandler().debugPrintState()); //System.out.printf("\t%s > showMessage @ %s/%s during %s%n", FThreads.debugGetCurrThreadId(), nextInput.getClass().getSimpleName(), current.getClass().getSimpleName(), game.getPhaseHandler().debugPrintState());
current.showMessage(Singletons.getControl().getInputQueue()); current.showMessageInitial();
} }
}; };
@@ -117,10 +115,10 @@ public class InputProxy implements Observer {
* @param zone * @param zone
* a {@link forge.game.zone.PlayerZone} object. * a {@link forge.game.zone.PlayerZone} object.
*/ */
public final void selectCard(final Card card) { public final void selectCard(final Card card, boolean isRightButton) {
Input inp = getInput(); Input inp = getInput();
if ( null != inp ) if ( null != inp )
inp.selectCard(card, false); inp.selectCard(card, isRightButton);
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@@ -131,7 +129,7 @@ public class InputProxy implements Observer {
} }
/** @return {@link forge.gui.InputProxy.InputBase} */ /** @return {@link forge.gui.InputProxy.InputBase} */
public Input getInput() { private Input getInput() {
return this.input.get(); return this.input.get();
} }
} }

View File

@@ -116,7 +116,7 @@ public class CCommand implements ICDoc {
if (c != null && c.isInZone(ZoneType.Command)) { if (c != null && c.isInZone(ZoneType.Command)) {
//TODO: Cast commander/activate avatar/roll planar dice here. //TODO: Cast commander/activate avatar/roll planar dice here.
CMessage.SINGLETON_INSTANCE.getInputControl().selectCard(c); CMessage.SINGLETON_INSTANCE.getInputControl().selectCard(c, e.isMetaDown());
} }
} }

View File

@@ -36,7 +36,7 @@ import forge.Constant.Preferences;
import forge.card.cardfactory.CardFactoryUtil; import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.control.input.Input; import forge.control.input.Input;
import forge.control.input.InputPayManaBase; import forge.control.input.InputPayMana;
import forge.game.GameState; import forge.game.GameState;
import forge.game.player.HumanPlay; import forge.game.player.HumanPlay;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
@@ -185,29 +185,21 @@ public class CField implements ICDoc {
// Roujin's bug fix version dated 2-12-2012 // Roujin's bug fix version dated 2-12-2012
final Card c = CField.this.view.getTabletop().getHoveredCard(e); final Card c = CField.this.view.getTabletop().getHoveredCard(e);
final Input input = CMessage.SINGLETON_INSTANCE.getInputControl().getInput();
if (c == null || !c.isInZone(ZoneType.Battlefield)) { if (c == null || !c.isInZone(ZoneType.Battlefield)) {
return; return;
} }
//Yosei, the Morning Star required cards to be chosen on computer side CMessage.SINGLETON_INSTANCE.getInputControl().selectCard(c, e.isMetaDown());
//earlier it was enforced that cards must be in player zone
//this can potentially break some other functionality
//(tapping lands works ok but some custom cards may not...)
if ( input != null ){
input.selectCard(c, e.isMetaDown());
}
} }
/** */ /** */
private void manaAction(byte colorCode) { private void manaAction(byte colorCode) {
if (CField.this.player.getLobbyPlayer() == CField.this.viewer) { if (CField.this.player.getLobbyPlayer() == CField.this.viewer) {
final Input in = Singletons.getControl().getInputQueue().getInput(); final Input in = Singletons.getControl().getInputQueue().getInput();
if (in instanceof InputPayManaBase) { if (in instanceof InputPayMana) {
// Do something // Do something
((InputPayManaBase) in).selectManaPool(colorCode); ((InputPayMana) in).selectManaPool(colorCode);
} }
} }
} }

View File

@@ -105,7 +105,7 @@ public class CHand implements ICDoc, Observer {
public void mousePressed(final MouseEvent e) { public void mousePressed(final MouseEvent e) {
if (e.getButton() != MouseEvent.BUTTON1) { return; } if (e.getButton() != MouseEvent.BUTTON1) { return; }
CMessage.SINGLETON_INSTANCE.getInputControl().selectCard(cardobj); CMessage.SINGLETON_INSTANCE.getInputControl().selectCard(cardobj, e.isMetaDown());
} }
}); });
} }
@@ -116,7 +116,7 @@ public class CHand implements ICDoc, Observer {
} }
final Card c = view.getHandArea().getHoveredCard(e); final Card c = view.getHandArea().getHoveredCard(e);
if (c != null) { if (c != null) {
CMessage.SINGLETON_INSTANCE.getInputControl().selectCard(c); CMessage.SINGLETON_INSTANCE.getInputControl().selectCard(c, e.isMetaDown());
} }
} }