mirror of
https://github.com/correl/mage.git
synced 2024-12-25 03:00:15 +00:00
splitter. still in progress.
This commit is contained in:
parent
2b44c3ae2b
commit
98d99d01c6
4 changed files with 173 additions and 67 deletions
|
@ -50,7 +50,6 @@ import java.util.zip.GZIPOutputStream;
|
||||||
|
|
||||||
import mage.Constants.Zone;
|
import mage.Constants.Zone;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.Modes;
|
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.Cards;
|
import mage.cards.Cards;
|
||||||
import mage.cards.decks.Deck;
|
import mage.cards.decks.Deck;
|
||||||
|
@ -64,6 +63,7 @@ import mage.game.permanent.Permanent;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.server.ChatManager;
|
import mage.server.ChatManager;
|
||||||
import mage.server.UserManager;
|
import mage.server.UserManager;
|
||||||
|
import mage.server.util.Splitter;
|
||||||
import mage.server.util.ThreadExecutor;
|
import mage.server.util.ThreadExecutor;
|
||||||
import mage.sets.Sets;
|
import mage.sets.Sets;
|
||||||
import mage.view.*;
|
import mage.view.*;
|
||||||
|
@ -344,75 +344,94 @@ public class GameController implements GameCallback {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void ask(UUID playerId, String question) throws MageException {
|
private synchronized void ask(final UUID playerId, final String question) throws MageException {
|
||||||
if (gameSessions.containsKey(playerId))
|
perform(playerId, new Command() {
|
||||||
gameSessions.get(playerId).ask(question);
|
public void execute() {
|
||||||
informOthers(playerId);
|
gameSessions.get(playerId).ask(question);
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void chooseAbility(UUID playerId, Collection<? extends Ability> choices) throws MageException {
|
|
||||||
if (gameSessions.containsKey(playerId))
|
|
||||||
gameSessions.get(playerId).chooseAbility(new AbilityPickerView(choices));
|
|
||||||
informOthers(playerId);
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void chooseMode(UUID playerId, Map<UUID, String> modes) throws MageException {
|
|
||||||
if (gameSessions.containsKey(playerId))
|
|
||||||
gameSessions.get(playerId).chooseAbility(new AbilityPickerView(modes));
|
|
||||||
informOthers(playerId);
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void choose(UUID playerId, String message, Set<String> choices) throws MageException {
|
|
||||||
if (gameSessions.containsKey(playerId))
|
|
||||||
gameSessions.get(playerId).choose(message, choices);
|
|
||||||
informOthers(playerId);
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void target(UUID playerId, String question, Cards cards, List<Permanent> perms, Set<UUID> targets, boolean required, Map<String, Serializable> options) throws MageException {
|
|
||||||
if (gameSessions.containsKey(playerId)) {
|
|
||||||
if (cards != null)
|
|
||||||
gameSessions.get(playerId).target(question, new CardsView(cards.getCards(game)), targets, required, options);
|
|
||||||
else if (perms != null) {
|
|
||||||
CardsView permsView = new CardsView();
|
|
||||||
for (Permanent perm: perms) {
|
|
||||||
permsView.put(perm.getId(), new PermanentView(perm, game.getCard(perm.getId())));
|
|
||||||
}
|
|
||||||
gameSessions.get(playerId).target(question, permsView, targets, required, options);
|
|
||||||
}
|
}
|
||||||
else
|
});
|
||||||
gameSessions.get(playerId).target(question, new CardsView(), targets, required, options);
|
|
||||||
}
|
|
||||||
informOthers(playerId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void target(UUID playerId, String question, Collection<? extends Ability> abilities, boolean required, Map<String, Serializable> options) throws MageException {
|
private synchronized void chooseAbility(final UUID playerId, final Collection<? extends Ability> choices) throws MageException {
|
||||||
if (gameSessions.containsKey(playerId))
|
perform(playerId, new Command() {
|
||||||
gameSessions.get(playerId).target(question, new CardsView(abilities, game), null, required, options);
|
public void execute() {
|
||||||
informOthers(playerId);
|
gameSessions.get(playerId).chooseAbility(new AbilityPickerView(choices));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void select(UUID playerId, String message) throws MageException {
|
private synchronized void chooseMode(final UUID playerId, final Map<UUID, String> modes) throws MageException {
|
||||||
if (gameSessions.containsKey(playerId))
|
perform(playerId, new Command() {
|
||||||
gameSessions.get(playerId).select(message);
|
public void execute() {
|
||||||
informOthers(playerId);
|
gameSessions.get(playerId).chooseAbility(new AbilityPickerView(modes));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void playMana(UUID playerId, String message) throws MageException {
|
private synchronized void choose(final UUID playerId, final String message, final Set<String> choices) throws MageException {
|
||||||
if (gameSessions.containsKey(playerId))
|
perform(playerId, new Command() {
|
||||||
gameSessions.get(playerId).playMana(message);
|
public void execute() {
|
||||||
informOthers(playerId);
|
gameSessions.get(playerId).choose(message, choices);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void playXMana(UUID playerId, String message) throws MageException {
|
private synchronized void target(final UUID playerId, final String question, final Cards cards, final List<Permanent> perms, final Set<UUID> targets, final boolean required, final Map<String, Serializable> options) throws MageException {
|
||||||
if (gameSessions.containsKey(playerId))
|
perform(playerId, new Command() {
|
||||||
gameSessions.get(playerId).playXMana(message);
|
public void execute() {
|
||||||
informOthers(playerId);
|
if (cards != null) {
|
||||||
|
gameSessions.get(playerId).target(question, new CardsView(cards.getCards(game)), targets, required, options);
|
||||||
|
} else if (perms != null) {
|
||||||
|
CardsView permsView = new CardsView();
|
||||||
|
for (Permanent perm: perms) {
|
||||||
|
permsView.put(perm.getId(), new PermanentView(perm, game.getCard(perm.getId())));
|
||||||
|
}
|
||||||
|
gameSessions.get(playerId).target(question, permsView, targets, required, options);
|
||||||
|
} else
|
||||||
|
gameSessions.get(playerId).target(question, new CardsView(), targets, required, options);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void amount(UUID playerId, String message, int min, int max) throws MageException {
|
private synchronized void target(final UUID playerId, final String question, final Collection<? extends Ability> abilities, final boolean required, final Map<String, Serializable> options) throws MageException {
|
||||||
if (gameSessions.containsKey(playerId))
|
perform(playerId, new Command() {
|
||||||
gameSessions.get(playerId).getAmount(message, min, max);
|
public void execute() {
|
||||||
informOthers(playerId);
|
gameSessions.get(playerId).target(question, new CardsView(abilities, game), null, required, options);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void select(final UUID playerId, final String message) throws MageException {
|
||||||
|
perform(playerId, new Command() {
|
||||||
|
public void execute() {
|
||||||
|
gameSessions.get(playerId).select(message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void playMana(final UUID playerId, final String message) throws MageException {
|
||||||
|
perform(playerId, new Command() {
|
||||||
|
public void execute() {
|
||||||
|
gameSessions.get(playerId).playMana(message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void playXMana(final UUID playerId, final String message) throws MageException {
|
||||||
|
perform(playerId, new Command() {
|
||||||
|
public void execute() {
|
||||||
|
gameSessions.get(playerId).playXMana(message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void amount(final UUID playerId, final String message, final int min, final int max) throws MageException {
|
||||||
|
perform(playerId, new Command() {
|
||||||
|
public void execute() {
|
||||||
|
gameSessions.get(playerId).getAmount(message, min, max);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void revealCards(String name, Cards cards) throws MageException {
|
private synchronized void revealCards(String name, Cards cards) throws MageException {
|
||||||
|
@ -421,9 +440,12 @@ public class GameController implements GameCallback {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void lookAtCards(UUID playerId, String name, Cards cards) throws MageException {
|
private synchronized void lookAtCards(final UUID playerId, final String name, final Cards cards) throws MageException {
|
||||||
if (gameSessions.containsKey(playerId))
|
perform(playerId, new Command() {
|
||||||
gameSessions.get(playerId).revealCards(name, new CardsView(cards.getCards(game)));
|
public void execute() {
|
||||||
|
gameSessions.get(playerId).revealCards(name, new CardsView(cards.getCards(game)));
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void informOthers(UUID playerId) throws MageException {
|
private void informOthers(UUID playerId) throws MageException {
|
||||||
|
@ -438,6 +460,24 @@ public class GameController implements GameCallback {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void informOthers(List<UUID> players) throws MageException {
|
||||||
|
// first player is always original controller
|
||||||
|
final String message = "Waiting for " + game.getPlayer(players.get(0)).getName();
|
||||||
|
for (final Entry<UUID, GameSession> entry: gameSessions.entrySet()) {
|
||||||
|
boolean skip = false;
|
||||||
|
for (UUID uuid : players) {
|
||||||
|
if (entry.getKey().equals(uuid)) {
|
||||||
|
skip = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!skip) entry.getValue().inform(message);
|
||||||
|
}
|
||||||
|
for (final GameWatcher watcher: watchers.values()) {
|
||||||
|
watcher.inform(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void error(String message) {
|
private void error(String message) {
|
||||||
for (final Entry<UUID, GameSession> entry: gameSessions.entrySet()) {
|
for (final Entry<UUID, GameSession> entry: gameSessions.entrySet()) {
|
||||||
entry.getValue().gameError(message);
|
entry.getValue().gameError(message);
|
||||||
|
@ -576,4 +616,27 @@ public class GameController implements GameCallback {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void perform(UUID playerId, Command command) throws MageException {
|
||||||
|
perform(playerId, command, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void perform(UUID playerId, Command command, boolean informOthers) throws MageException {
|
||||||
|
if (game.getPlayer(playerId).isGameUnderControl()) {
|
||||||
|
if (gameSessions.containsKey(playerId))
|
||||||
|
command.execute();
|
||||||
|
if (informOthers) informOthers(playerId);
|
||||||
|
} else {
|
||||||
|
List<UUID> players = Splitter.split(game, playerId);
|
||||||
|
for (UUID uuid : players) {
|
||||||
|
if (gameSessions.containsKey(uuid))
|
||||||
|
command.execute();
|
||||||
|
}
|
||||||
|
if (informOthers) informOthers(players);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Command {
|
||||||
|
public void execute();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
24
Mage.Server/src/main/java/mage/server/util/Splitter.java
Normal file
24
Mage.Server/src/main/java/mage/server/util/Splitter.java
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
package mage.server.util;
|
||||||
|
|
||||||
|
import mage.game.Game;
|
||||||
|
import mage.players.Player;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author nantuko
|
||||||
|
*/
|
||||||
|
public class Splitter {
|
||||||
|
|
||||||
|
public static List<UUID> split(Game game, UUID playerId) {
|
||||||
|
List<UUID> players = new ArrayList<UUID>();
|
||||||
|
players.add(playerId); // add original player
|
||||||
|
Player player = game.getPlayer(playerId);
|
||||||
|
if (player != null && player.getTurnControlledBy() != null) {
|
||||||
|
players.add(player.getTurnControlledBy());
|
||||||
|
}
|
||||||
|
return players;
|
||||||
|
}
|
||||||
|
}
|
|
@ -111,24 +111,33 @@ public interface Player extends MageItem, Copyable<Player> {
|
||||||
public Set<UUID> getPlayersUnderYourControl();
|
public Set<UUID> getPlayersUnderYourControl();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines player whose turn you control at the moment.
|
* Defines player whose turn this player controls at the moment.
|
||||||
* @param playerId
|
* @param playerId
|
||||||
*/
|
*/
|
||||||
public void controlPlayersTurn(Game game, UUID playerId);
|
public void controlPlayersTurn(Game game, UUID playerId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets player {@link UUID} who controls this player's turn.
|
||||||
|
*
|
||||||
|
* @param playerId
|
||||||
|
*/
|
||||||
|
public void setTurnControlledBy(UUID playerId);
|
||||||
|
|
||||||
|
public UUID getTurnControlledBy();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets players whose turns you control at the moment.
|
* Resets players whose turns you control at the moment.
|
||||||
*/
|
*/
|
||||||
public void resetOtherTurnsControlled();
|
public void resetOtherTurnsControlled();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns false in case you don't control the game.
|
* Returns false in case player don't control the game.
|
||||||
*
|
*
|
||||||
* Note: For effects like "You control target player during that player's next turn".
|
* Note: For effects like "You control target player during that player's next turn".
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public boolean isGameUnderYourControl();
|
public boolean isGameUnderControl();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns false in case you don't control the game.
|
* Returns false in case you don't control the game.
|
||||||
|
|
|
@ -95,6 +95,7 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
|
||||||
protected boolean isTestMode = false;
|
protected boolean isTestMode = false;
|
||||||
protected boolean lifeTotalCanChange = true;
|
protected boolean lifeTotalCanChange = true;
|
||||||
protected boolean isGameUnderYourControl = true;
|
protected boolean isGameUnderYourControl = true;
|
||||||
|
protected UUID turnController;
|
||||||
protected Set<UUID> playersUnderYourControl = new HashSet<UUID>();
|
protected Set<UUID> playersUnderYourControl = new HashSet<UUID>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -237,11 +238,12 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void controlPlayersTurn(Game game, UUID playerId) {
|
public void controlPlayersTurn(Game game, UUID playerId) {
|
||||||
if (!playerId.equals(getId())) {
|
if (!playerId.equals(this.getId())) {
|
||||||
this.playersUnderYourControl.add(playerId);
|
this.playersUnderYourControl.add(playerId);
|
||||||
Player player = game.getPlayer(playerId);
|
Player player = game.getPlayer(playerId);
|
||||||
if (!player.hasLeft() && !player.hasLost()) {
|
if (!player.hasLeft() && !player.hasLost()) {
|
||||||
player.setGameUnderYourControl(false);
|
player.setGameUnderYourControl(false);
|
||||||
|
player.setTurnControlledBy(this.getId());
|
||||||
}
|
}
|
||||||
DelayedTriggeredAbility ability = new AtTheEndOfTurnDelayedTriggeredAbility(new LoseControlOnOtherPlayersControllerEffect());
|
DelayedTriggeredAbility ability = new AtTheEndOfTurnDelayedTriggeredAbility(new LoseControlOnOtherPlayersControllerEffect());
|
||||||
ability.setSourceId(getId());
|
ability.setSourceId(getId());
|
||||||
|
@ -250,13 +252,21 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> implements Player, Ser
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setTurnControlledBy(UUID playerId) {
|
||||||
|
this.turnController = playerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getTurnControlledBy() {
|
||||||
|
return this.turnController;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void resetOtherTurnsControlled() {
|
public void resetOtherTurnsControlled() {
|
||||||
playersUnderYourControl.clear();
|
playersUnderYourControl.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isGameUnderYourControl() {
|
public boolean isGameUnderControl() {
|
||||||
return isGameUnderYourControl;
|
return isGameUnderYourControl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue