Added F5 button to skip priority until end step of opponent. Added PlayerAction handling.

This commit is contained in:
LevelX2 2014-09-24 16:55:51 +02:00
parent ebd21eab1d
commit aa842efacc
17 changed files with 185 additions and 327 deletions

View file

@ -48,6 +48,7 @@ import mage.client.components.MageTextArea;
import mage.client.dialog.MageDialog;
import mage.client.util.audio.AudioManager;
import mage.client.util.gui.ArrowBuilder;
import mage.constants.PlayerAction;
import mage.remote.Session;
import org.apache.log4j.Logger;
@ -304,7 +305,7 @@ public class FeedbackPanel extends javax.swing.JPanel {
}//GEN-LAST:event_btnSpecialActionPerformed
private void btnUndoActionPerformed(java.awt.event.ActionEvent evt) {
session.undo(gameId);
session.sendPlayerAction(PlayerAction.UNDO, gameId);
}
public void setHelperPanel(HelperPanel helper) {

View file

@ -66,6 +66,7 @@ import java.util.*;
import java.util.List;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import mage.constants.PlayerAction;
/**
*
@ -942,6 +943,15 @@ public final class GamePanel extends javax.swing.JPanel {
}
});
ks = KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0);
this.getInputMap(c).put(ks, "F5_PRESS");
this.getActionMap().put("F5_PRESS", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
btnUntilEndOfTurnActionPerformed(null);
}
});
KeyStroke ks9 = KeyStroke.getKeyStroke(KeyEvent.VK_F9, 0);
this.getInputMap(c).put(ks9, "F9_PRESS");
this.getActionMap().put("F9_PRESS", new AbstractAction() {
@ -1345,25 +1355,31 @@ public final class GamePanel extends javax.swing.JPanel {
private void btnConcedeActionPerformed(java.awt.event.ActionEvent evt) {
if (modalQuestion("Are you sure you want to concede?", "Confirm concede") == JOptionPane.YES_OPTION) {
session.concedeGame(gameId);
session.sendPlayerAction(PlayerAction.CONCEDE, gameId);
}
}
private void btnEndTurnActionPerformed(java.awt.event.ActionEvent evt) {
if (feedbackPanel != null && FeedbackMode.SELECT.equals(feedbackPanel.getMode())) {
session.passTurnPriority(gameId);
session.sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_NEXT_TURN, gameId);
}
}
private void btnUntilEndOfTurnActionPerformed(java.awt.event.ActionEvent evt) {
if (feedbackPanel != null && FeedbackMode.SELECT.equals(feedbackPanel.getMode())) {
session.sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_OPPONENTS_TURN_END_STEP, gameId);
}
}
private void btnPassPriorityUntilNextYourTurnActionPerformed(java.awt.event.ActionEvent evt) {
if (feedbackPanel != null && FeedbackMode.SELECT.equals(feedbackPanel.getMode())) {
session.passPriorityUntilNextYourTurn(gameId);
session.sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_MY_NEXT_TURN, gameId);
}
}
private void restorePriorityActionPerformed(java.awt.event.ActionEvent evt) {
if (feedbackPanel != null) {
session.restorePriority(gameId);
session.sendPlayerAction(PlayerAction.PASS_PRIORITY_CANCEL_ALL_ACTIONS, gameId);
}
}

View file

@ -50,6 +50,7 @@ import javax.swing.event.ChangeListener;
import mage.cards.decks.importer.DeckImporterUtil;
import mage.client.MageFrame;
import mage.client.cards.BigCard;
import mage.constants.PlayerAction;
import mage.view.PlayerView;
/**
@ -149,7 +150,7 @@ public class PlayAreaPanel extends javax.swing.JPanel {
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
gamePanel.getSession().restorePriority(gameId);
gamePanel.getSession().sendPlayerAction(PlayerAction.PASS_PRIORITY_CANCEL_ALL_ACTIONS, gameId);
}
});
@ -162,7 +163,18 @@ public class PlayAreaPanel extends javax.swing.JPanel {
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
gamePanel.getSession().passTurnPriority(gameId);
gamePanel.getSession().sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_NEXT_TURN, gameId);
}
});
menuItem = new JMenuItem("F5 - Skip phases until opponent's end step (stop on stack/attack/block)");
popupMenu.add(menuItem);
// Skip to next end step of turn (F5)
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
gamePanel.getSession().sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_OPPONENTS_TURN_END_STEP, gameId);
}
});
@ -173,7 +185,7 @@ public class PlayAreaPanel extends javax.swing.JPanel {
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
gamePanel.getSession().passPriorityUntilNextYourTurn(gameId);
gamePanel.getSession().sendPlayerAction(PlayerAction.PASS_PRIORITY_UNTIL_MY_NEXT_TURN, gameId);
}
});
@ -190,7 +202,7 @@ public class PlayAreaPanel extends javax.swing.JPanel {
public void actionPerformed(ActionEvent e) {
boolean manaPoolAutomatic = ((JCheckBoxMenuItem)e.getSource()).getState();
gamePanel.setMenuStates(manaPoolAutomatic);
gamePanel.getSession().setManaPoolMode(manaPoolAutomatic, gameId);
gamePanel.getSession().sendPlayerAction(manaPoolAutomatic ? PlayerAction.MANA_AUTO_PAYMENT_ON: PlayerAction.MANA_AUTO_PAYMENT_OFF, gameId);
}
});
@ -204,7 +216,7 @@ public class PlayAreaPanel extends javax.swing.JPanel {
@Override
public void actionPerformed(ActionEvent e) {
if (JOptionPane.showConfirmDialog(PlayAreaPanel.this, "Are you sure you want to concede the game?", "Confirm concede game", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
MageFrame.getSession().concedeGame(gameId);
MageFrame.getSession().sendPlayerAction(PlayerAction.CONCEDE, gameId);
}
}
});

View file

@ -374,8 +374,9 @@ public class CallbackClientImpl implements CallbackClient {
.append("<br/>Turn mousewheel down (ALT-s) - enlarge original/alternate image of card the mousepointer hovers over")
.append("<br/><b>F2</b> - Confirm \"Ok\", \"Yes\" or \"Done\" button")
.append("<br/><b>F4</b> - Skip current turn but stop on declare attackers/blockers and something on the stack")
.append("<br/><b>F5</b> - Skip to next end step of opponent's turn but stop on declare attackers/blockers and something on the stack")
.append("<br/><b>F9</b> - Skip everything until your next turn")
.append("<br/><b>F3</b> - Undo F4/F9").toString(),
.append("<br/><b>F3</b> - Undo F4/F5/F9").toString(),
null, MessageType.USER_INFO, ChatMessage.MessageColor.ORANGE);
break;
case TOURNAMENT:

View file

@ -63,7 +63,7 @@ public class PhaseManager {
private static final Preferences prefs = MageFrame.getPreferences();
private static Map<String, String> mapYou = new HashMap<String, String>() {{
private static final Map<String, String> mapYou = new HashMap<String, String>() {{
put("Upkeep - play instants and activated abilities.", UPKEEP_YOU);
put("Draw - play instants and activated abilities.", DRAW_YOU);
put("Precombat Main - play spells and abilities.", MAIN_YOU);
@ -73,7 +73,7 @@ public class PhaseManager {
put("End Turn - play instants and activated abilities.", END_OF_TURN_YOU);
}};
private static Map<String, String> mapOthers = new HashMap<String, String>() {{
private static final Map<String, String> mapOthers = new HashMap<String, String>() {{
put("Upkeep - play instants and activated abilities.", UPKEEP_OTHERS);
put("Draw - play instants and activated abilities.", DRAW_OTHERS);
put("Precombat Main - play instants and activated abilities.", MAIN_OTHERS);

View file

@ -35,6 +35,7 @@ import mage.cards.decks.DeckCardLists;
import mage.cards.repository.CardInfo;
import mage.cards.repository.ExpansionInfo;
import mage.constants.ManaType;
import mage.constants.PlayerAction;
import mage.game.GameException;
import mage.game.match.MatchOptions;
import mage.game.tournament.TournamentOptions;
@ -115,16 +116,10 @@ public interface MageServer {
void sendPlayerBoolean(UUID gameId, String sessionId, Boolean data) throws MageException;
void sendPlayerInteger(UUID gameId, String sessionId, Integer data) throws MageException;
void sendPlayerManaType(UUID gameId, UUID playerId, String sessionId, ManaType data) throws MageException;
void concedeGame(UUID gameId, String sessionId) throws MageException;
void quitMatch(UUID gameId, String sessionId) throws MageException;
void undo(UUID gameId, String sessionId) throws MageException;
void setManaPoolMode(UUID gameId, String sessionId, boolean autoPayment) throws MageException;
GameView getGameView(UUID gameId, String sessionId, UUID playerId) throws MageException;
//priority methods
void passPriorityUntilNextYourTurn(UUID gameId, String sessionId) throws MageException;
void passTurnPriority(UUID gameId, String sessionId) throws MageException;
void restorePriority(UUID gameId, String sessionId) throws MageException;
// priority, undo, concede, mana pool
void sendPlayerAction(PlayerAction playerAction, UUID gameId, String sessionId) throws MageException;
//tournament methods
boolean startTournament(String sessionId, UUID roomId, UUID tableId) throws MageException;

View file

@ -51,6 +51,7 @@ import mage.cards.repository.ExpansionInfo;
import mage.cards.repository.ExpansionRepository;
import mage.constants.Constants.SessionState;
import mage.constants.ManaType;
import mage.constants.PlayerAction;
import mage.game.GameException;
import mage.game.match.MatchOptions;
import mage.game.tournament.TournamentOptions;
@ -1054,21 +1055,6 @@ public class SessionImpl implements Session {
return false;
}
@Override
public boolean concedeGame(UUID gameId) {
try {
if (isConnected()) {
server.concedeGame(gameId, sessionId);
return true;
}
} catch (MageException ex) {
handleMageException(ex);
} catch (Throwable t) {
handleThrowable(t);
}
return false;
}
@Override
public boolean quitMatch(UUID gameId) {
try {
@ -1113,10 +1099,10 @@ public class SessionImpl implements Session {
}
@Override
public boolean undo(UUID gameId) {
public boolean sendPlayerAction(PlayerAction passPriorityAction, UUID gameId) {
try {
if (isConnected()) {
server.undo(gameId, sessionId);
server.sendPlayerAction(passPriorityAction, gameId, sessionId);
return true;
}
} catch (MageException ex) {
@ -1126,52 +1112,7 @@ public class SessionImpl implements Session {
}
return false;
}
@Override
public boolean passPriorityUntilNextYourTurn(UUID gameId) {
try {
if (isConnected()) {
server.passPriorityUntilNextYourTurn(gameId, sessionId);
return true;
}
} catch (MageException ex) {
handleMageException(ex);
} catch (Throwable t) {
handleThrowable(t);
}
return false;
}
@Override
public boolean passTurnPriority(UUID gameId) {
try {
if (isConnected()) {
server.passTurnPriority(gameId, sessionId);
return true;
}
} catch (MageException ex) {
handleMageException(ex);
} catch (Throwable t) {
handleThrowable(t);
}
return false;
}
@Override
public boolean restorePriority(UUID gameId) {
try {
if (isConnected()) {
server.restorePriority(gameId, sessionId);
return true;
}
} catch (MageException ex) {
handleMageException(ex);
} catch (Throwable t) {
handleThrowable(t);
}
return false;
}
@Override
public boolean stopWatching(UUID gameId) {
try {
@ -1262,21 +1203,6 @@ public class SessionImpl implements Session {
return false;
}
@Override
public boolean setManaPoolMode(boolean autoPayment, UUID gameId) {
try {
if (isConnected()) {
server.setManaPoolMode(gameId, sessionId, autoPayment);
return true;
}
} catch (MageException ex) {
handleMageException(ex);
} catch (Throwable t) {
handleThrowable(t);
}
return false;
}
@Override
public boolean cheat(UUID gameId, UUID playerId, DeckCardLists deckList) {
try {

View file

@ -30,6 +30,7 @@ package mage.remote.interfaces;
import java.util.UUID;
import mage.cards.decks.DeckCardLists;
import mage.constants.ManaType;
import mage.constants.PlayerAction;
import mage.view.DraftPickView;
/**
@ -53,8 +54,6 @@ public interface GamePlay {
boolean sendPlayerManaType(UUID gameId, UUID playerId, ManaType data);
boolean concedeGame(UUID gameId);
boolean quitMatch(UUID gameId);
boolean quitTournament(UUID tournamentId);
@ -67,47 +66,18 @@ public interface GamePlay {
DraftPickView sendCardPick(UUID draftId, UUID cardId);
boolean undo(UUID gameId);
/*** Separate methods for priority handling ***/
/**
* magenoxx:
* it should be done separately as sendPlayer* methods calls are injected into the game flow
* - this is similar to concedeGame method
*/
/**
* Pass priority until next your turn.
* Don't stop at all even if something happens.
*
* @param gameId
* @return
*/
boolean passPriorityUntilNextYourTurn(UUID gameId);
/**
* Passes current turn but stop on pre combat phase.
*
* @param gameId
* @return
*/
boolean passTurnPriority(UUID gameId);
/**
* This method cancels all other calls made before.
*
* @param gameId
* @return
*/
boolean restorePriority(UUID gameId);
/**
* This method toggles usage of mana pool
*
* @param automatic true mana in pool will be used automatically
* This method sends player actions for a game
* priority handling, undo
*
* @param passPriorityAction
* @param gameId
* @return
* @return
*/
boolean setManaPoolMode(boolean automatic, UUID gameId);
boolean sendPlayerAction(PlayerAction passPriorityAction, UUID gameId);
}

View file

@ -444,6 +444,11 @@ public class HumanPlayer extends PlayerImpl {
pass(game);
return false;
}
if (passedUntilEndOfTurn && game.getStack().isEmpty() &&
(!game.getTurn().getStepType().equals(PhaseStep.END_TURN) || playerId.equals(game.getActivePlayerId()))) {
pass(game);
return false;
}
updateGameStatePriority("priority", game);
game.firePriorityEvent(playerId);
waitForResponse(game);

View file

@ -66,6 +66,7 @@ import java.util.Locale;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import mage.constants.ManaType;
import mage.constants.PlayerAction;
import mage.constants.TableState;
/**
@ -663,32 +664,6 @@ public class MageServerImpl implements MageServer {
});
}
@Override
public void setManaPoolMode(final UUID gameId, final String sessionId, final boolean autoPayment) throws MageException {
execute("setManaPoolMode", sessionId, new Action() {
@Override
public void execute() {
UUID userId = SessionManager.getInstance().getSession(sessionId).getUserId();
GameManager.getInstance().setManaPoolMode(gameId, userId, autoPayment);
}
});
}
@Override
public void concedeGame(final UUID gameId, final String sessionId) throws MageException {
execute("concedeGame", sessionId, new Action() {
@Override
public void execute() {
Session session = SessionManager.getInstance().getSession(sessionId);
if (session != null) {
GameManager.getInstance().concedeGame(gameId, session.getUserId());
} else{
logger.error("Session not found sessionId: "+ sessionId + " gameId:" +gameId);
}
}
});
}
@Override
public void quitMatch(final UUID gameId, final String sessionId) throws MageException {
execute("quitMatch", sessionId, new Action() {
@ -740,8 +715,8 @@ public class MageServerImpl implements MageServer {
}
@Override
public void undo(final UUID gameId, final String sessionId) throws MageException {
execute("undo", sessionId, new Action() {
public void sendPlayerAction(final PlayerAction playerAction, final UUID gameId, final String sessionId) throws MageException {
execute("setdPlayerAction", sessionId, new Action() {
@Override
public void execute() {
Session session = SessionManager.getInstance().getSession(sessionId);
@ -749,57 +724,11 @@ public class MageServerImpl implements MageServer {
logger.error("Session not found sessionId: "+ sessionId + " gameId:" + gameId);
return;
}
GameManager.getInstance().undo(gameId, session.getUserId());
GameManager.getInstance().sendPlayerAction(playerAction, gameId, session.getUserId());
}
});
}
@Override
public void passPriorityUntilNextYourTurn(final UUID gameId, final String sessionId) throws MageException {
execute("passPriorityUntilNextYourTurn", sessionId, new Action() {
@Override
public void execute() {
Session session = SessionManager.getInstance().getSession(sessionId);
if (session == null) {
logger.error("Session not found sessionId: "+ sessionId + " gameId:" + gameId);
return;
}
GameManager.getInstance().passPriorityUntilNextYourTurn(gameId, session.getUserId());
}
});
}
@Override
public void passTurnPriority(final UUID gameId, final String sessionId) throws MageException {
execute("passTurnPriority", sessionId, new Action() {
@Override
public void execute() {
Session session = SessionManager.getInstance().getSession(sessionId);
if (session == null) {
logger.error("Session not found sessionId: "+ sessionId + " gameId:" + gameId);
return;
}
GameManager.getInstance().passTurnPriority(gameId, session.getUserId());
}
});
}
@Override
public void restorePriority(final UUID gameId, final String sessionId) throws MageException {
execute("restorePriority", sessionId, new Action() {
@Override
public void execute() {
Session session = SessionManager.getInstance().getSession(sessionId);
if (session == null) {
logger.error("Session not found sessionId: "+ sessionId + " gameId:" + gameId);
return;
}
GameManager.getInstance().restorePriority(gameId, session.getUserId());
}
});
}
@Override
public boolean watchTable(final String sessionId, final UUID roomId, final UUID tableId) throws MageException {
return executeWithResult("setUserData", sessionId, new ActionWithBooleanResult() {

View file

@ -65,6 +65,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.zip.GZIPOutputStream;
import mage.constants.PlayerAction;
/**
*
@ -359,14 +360,6 @@ public class GameController implements GameCallback {
}
}
public void concede(UUID userId) {
game.concede(getPlayerId(userId));
}
public void setManaPoolMode(UUID userId, boolean autoPayment) {
game.setManaPoolMode(getPlayerId(userId), autoPayment);
}
// public void removeUser(UUID userId) {
// UUID playerId = userPlayerMap.get(userId);
// if (playerId != null) {
@ -389,22 +382,25 @@ public class GameController implements GameCallback {
game.quit(getPlayerId(userId));
}
public void undo(UUID userId) {
game.undo(getPlayerId(userId));
public void sendPlayerAction(PlayerAction playerAction, UUID userId) {
switch(playerAction) {
case UNDO:
game.undo(getPlayerId(userId));
break;
case CONCEDE:
game.concede(getPlayerId(userId));
break;
case MANA_AUTO_PAYMENT_OFF:
game.setManaPoolMode(getPlayerId(userId), false);
break;
case MANA_AUTO_PAYMENT_ON:
game.setManaPoolMode(getPlayerId(userId), true);
break;
default:
game.sendPlayerAction(playerAction, getPlayerId(userId));
}
}
public void passPriorityUntilNextYourTurn(UUID userId) {
game.passPriorityUntilNextYourTurn(getPlayerId(userId));
}
public void passTurnPriority(UUID userId) {
game.passTurnPriority(getPlayerId(userId));
}
public void restorePriority(UUID userId) {
game.restorePriority(getPlayerId(userId));
}
public void cheat(UUID userId, UUID playerId, DeckCardLists deckList) {
Deck deck;

View file

@ -32,6 +32,7 @@ import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import mage.cards.decks.DeckCardLists;
import mage.constants.ManaType;
import mage.constants.PlayerAction;
import mage.game.Game;
import mage.view.GameView;
@ -106,52 +107,17 @@ public class GameManager {
}
}
public void setManaPoolMode(UUID gameId, UUID userId, boolean autoPayment) {
GameController gameController = gameControllers.get(gameId);
if (gameController != null) {
gameController.setManaPoolMode(userId, autoPayment);
}
}
public void concedeGame(UUID gameId, UUID userId) {
GameController gameController = gameControllers.get(gameId);
if (gameController != null) {
gameController.concede(userId);
}
}
public void quitMatch(UUID gameId, UUID userId) {
GameController gameController = gameControllers.get(gameId);
if (gameController != null) {
gameController.quitMatch(userId);
}
}
public void undo(UUID gameId, UUID userId) {
public void sendPlayerAction(PlayerAction playerAction, UUID gameId, UUID userId) {
GameController gameController = gameControllers.get(gameId);
if (gameController != null) {
gameController.undo(userId);
}
}
public void passPriorityUntilNextYourTurn(UUID gameId, UUID userId) {
GameController gameController = gameControllers.get(gameId);
if (gameController != null) {
gameController.passPriorityUntilNextYourTurn(userId);
}
}
public void passTurnPriority(UUID gameId, UUID userId) {
GameController gameController = gameControllers.get(gameId);
if (gameController != null) {
gameController.passTurnPriority(userId);
}
}
public void restorePriority(UUID gameId, UUID userId) {
GameController gameController = gameControllers.get(gameId);
if (gameController != null) {
gameController.restorePriority(userId);
if (gameController != null) {
gameController.sendPlayerAction(playerAction, userId);
}
}

View file

@ -0,0 +1,44 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.constants;
/**
* Defines player actions for a game
*
* @author LevelX2
*/
public enum PlayerAction {
PASS_PRIORITY_UNTIL_MY_NEXT_TURN,
PASS_PRIORITY_UNTIL_OPPONENTS_TURN_END_STEP,
PASS_PRIORITY_UNTIL_NEXT_TURN,
PASS_PRIORITY_CANCEL_ALL_ACTIONS,
UNDO,
CONCEDE,
MANA_AUTO_PAYMENT_ON,
MANA_AUTO_PAYMENT_OFF
}

View file

@ -68,6 +68,7 @@ import mage.util.functions.ApplyToPermanent;
import java.io.Serializable;
import java.util.*;
import mage.constants.PlayerAction;
public interface Game extends MageItem, Serializable {
@ -233,10 +234,8 @@ public interface Game extends MageItem, Serializable {
void addCommander(Commander commander);
void addPermanent(Permanent permanent);
// priority methods
void passPriorityUntilNextYourTurn(UUID userId);
void passTurnPriority(UUID userId);
void restorePriority(UUID userId);
// priority method
void sendPlayerAction(PlayerAction playerAction, UUID playerId);
/**
* This version supports copying of copies of any depth.

View file

@ -1022,22 +1022,15 @@ public abstract class GameImpl implements Game, Serializable {
}
}
}
@Override
public synchronized void passPriorityUntilNextYourTurn(UUID playerId) {
public void sendPlayerAction(PlayerAction playerAction, UUID playerId) {
Player player = state.getPlayer(playerId);
if (player != null) {
player.passPriorityUntilNextYourTurn(this);
}
}
@Override
public synchronized void passTurnPriority(UUID playerId) {
Player player = state.getPlayer(playerId);
if (player != null) {
player.passTurnPriority(this);
}
player.sendPlayerAction(playerAction, this);
}
}
@Override
public synchronized void setManaPoolMode(UUID playerId, boolean autoPayment) {
@ -1047,14 +1040,6 @@ public abstract class GameImpl implements Game, Serializable {
}
}
@Override
public synchronized void restorePriority(UUID playerId) {
Player player = state.getPlayer(playerId);
if (player != null) {
player.restorePriority(this);
}
}
@Override
public void playPriority(UUID activePlayerId, boolean resuming) {
int bookmark = 0;

View file

@ -59,6 +59,7 @@ import mage.util.Copyable;
import java.io.Serializable;
import java.util.*;
import mage.constants.PlayerAction;
import mage.game.combat.CombatGroup;
/**
@ -256,10 +257,8 @@ public interface Player extends MageItem, Copyable<Player> {
void abort();
void skip();
//priority methods
void passPriorityUntilNextYourTurn(Game game);
void passTurnPriority(Game game);
void restorePriority(Game game);
// priority, undo, ...
void sendPlayerAction(PlayerAction passPriorityAction, Game game);
int getStoredBookmark();
void setStoredBookmark(int bookmark);

View file

@ -81,6 +81,7 @@ import mage.constants.AsThoughEffectType;
import mage.constants.CardType;
import mage.constants.ManaType;
import mage.constants.Outcome;
import mage.constants.PlayerAction;
import mage.constants.PhaseStep;
import mage.constants.RangeOfInfluence;
import mage.constants.SpellAbilityType;
@ -149,17 +150,21 @@ public abstract class PlayerImpl implements Player, Serializable {
protected int maxHandSize = 7;
protected int maxAttackedBy = Integer.MAX_VALUE;
protected ManaPool manaPool;
// priority control
protected boolean passed; // player passed priority
protected boolean passedTurn;
protected boolean passedTurn; // F4
protected boolean passedUntilEndOfTurn; // F5
/**
* This indicates that player passed all turns until his own turn starts (F9).
* Note! This differs from passedTurn as it doesn't care about spells and abilities in the stack and will pass them as well.
*/
protected boolean passedAllTurns;
protected int turns;
protected int storedBookmark = -1;
protected int priorityTimeLeft = Integer.MAX_VALUE;
/**
* This indicates that player passed all turns until his own turn starts.
* Note! This differs from passedTurn as it doesn't care about spells and abilities in the stack and will pass them as well.
*/
protected boolean passedAllTurns;
// conceded or connection lost game
protected boolean left;
@ -279,7 +284,9 @@ public abstract class PlayerImpl implements Player, Serializable {
this.passed = player.passed;
this.passedTurn = player.passedTurn;
this.passedUntilEndOfTurn = player.passedUntilEndOfTurn;
this.passedAllTurns = player.passedAllTurns;
this.priorityTimeLeft = player.getPriorityTimeLeft();
this.reachedNextTurnAfterLeaving = player.reachedNextTurnAfterLeaving;
@ -386,6 +393,7 @@ public abstract class PlayerImpl implements Player, Serializable {
this.playersUnderYourControl.clear();
this.passed = false;
this.passedTurn = false;
this.passedUntilEndOfTurn = false;
this.passedAllTurns = false;
this.canGainLife = true;
this.canLoseLife = true;
@ -533,6 +541,9 @@ public abstract class PlayerImpl implements Player, Serializable {
@Override
public void endOfTurn(Game game) {
this.passedTurn = false;
if (!game.getActivePlayerId().equals(playerId)) {
this.passedUntilEndOfTurn = false;
}
}
@Override
@ -1617,25 +1628,28 @@ public abstract class PlayerImpl implements Player, Serializable {
}
@Override
public void passPriorityUntilNextYourTurn(Game game) {
passedTurn = true;
passedAllTurns = true;
this.skip();
logger.trace("Passed priority for turns");
}
@Override
public void passTurnPriority(Game game) {
passedTurn = true;
this.skip();
logger.trace("Passed priority for turn");
}
@Override
public void restorePriority(Game game) {
passedAllTurns = false;
passedTurn = false;
logger.trace("Restore priority");
public void sendPlayerAction(PlayerAction passPriorityAction, Game game) {
switch(passPriorityAction) {
case PASS_PRIORITY_UNTIL_MY_NEXT_TURN:
passedTurn = true;
passedAllTurns = true;
this.skip();
break;
case PASS_PRIORITY_UNTIL_OPPONENTS_TURN_END_STEP:
passedUntilEndOfTurn = true;
this.skip();
break;
case PASS_PRIORITY_UNTIL_NEXT_TURN:
passedTurn = true;
this.skip();
break;
case PASS_PRIORITY_CANCEL_ALL_ACTIONS:
passedAllTurns = false;
passedTurn = false;
passedUntilEndOfTurn = false;
break;
}
logger.trace("PASS Priority: " + passPriorityAction.toString());
}
@Override