From ebefc963055ed9f72c42b977221efb703f54f9ab Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Mon, 27 May 2013 12:11:04 +0000 Subject: [PATCH] ControlPlayer effect (gui does not update to show hand yet - shall implement soon) --- .gitattributes | 1 + src/main/java/forge/card/ability/ApiType.java | 1 + .../ability/effects/ControlPlayerEffect.java | 53 ++++++++++++++++++ .../java/forge/game/player/LobbyPlayer.java | 1 + .../java/forge/game/player/LobbyPlayerAi.java | 9 ++- .../forge/game/player/LobbyPlayerHuman.java | 9 ++- .../forge/game/player/LobbyPlayerRemote.java | 9 +++ src/main/java/forge/game/player/Player.java | 56 ++++++++----------- .../forge/gui/match/controllers/CDock.java | 5 +- 9 files changed, 106 insertions(+), 38 deletions(-) create mode 100644 src/main/java/forge/card/ability/effects/ControlPlayerEffect.java diff --git a/.gitattributes b/.gitattributes index 2b818c085be..36b68977997 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13934,6 +13934,7 @@ src/main/java/forge/card/ability/effects/CleanUpEffect.java -text src/main/java/forge/card/ability/effects/CloneEffect.java -text src/main/java/forge/card/ability/effects/ControlExchangeEffect.java -text src/main/java/forge/card/ability/effects/ControlGainEffect.java -text +src/main/java/forge/card/ability/effects/ControlPlayerEffect.java -text src/main/java/forge/card/ability/effects/CopyPermanentEffect.java -text src/main/java/forge/card/ability/effects/CopySpellAbilityEffect.java -text src/main/java/forge/card/ability/effects/CounterEffect.java -text diff --git a/src/main/java/forge/card/ability/ApiType.java b/src/main/java/forge/card/ability/ApiType.java index 8c791aa4d0e..6e8bcbe739a 100644 --- a/src/main/java/forge/card/ability/ApiType.java +++ b/src/main/java/forge/card/ability/ApiType.java @@ -132,6 +132,7 @@ public enum ApiType { Clone (CloneEffect.class, CloneAi.class), CopyPermanent (CopyPermanentEffect.class, CopyPermanentAi.class), CopySpellAbility (CopySpellAbilityEffect.class, CanPlayAsDrawbackAi.class), + ControlPlayer(ControlPlayerEffect.class, CannotPlayAi.class), Counter (CounterEffect.class, CounterAi.class), DamageAll (DamageAllEffect.class, DamageAllAi.class), DealDamage (DamageDealEffect.class, DamageDealAi.class), diff --git a/src/main/java/forge/card/ability/effects/ControlPlayerEffect.java b/src/main/java/forge/card/ability/effects/ControlPlayerEffect.java new file mode 100644 index 00000000000..2b32ad30c4c --- /dev/null +++ b/src/main/java/forge/card/ability/effects/ControlPlayerEffect.java @@ -0,0 +1,53 @@ +package forge.card.ability.effects; + +import java.util.List; + +import forge.Command; +import forge.card.ability.SpellAbilityEffect; +import forge.card.spellability.SpellAbility; +import forge.game.GameState; +import forge.game.player.Player; +import forge.util.Lang; + +/** + * TODO: Write javadoc for this type. + * + */ +public class ControlPlayerEffect extends SpellAbilityEffect { + + @Override + protected String getStackDescription(SpellAbility sa) { + + List tgtPlayers = getTargetPlayers(sa); + return String.format("%s controls %s during their next turn", sa.getActivatingPlayer(), Lang.joinHomogenous(tgtPlayers)); + } + + @SuppressWarnings("serial") + @Override + public void resolve(SpellAbility sa) { + final Player activator = sa.getActivatingPlayer(); + final GameState game = activator.getGame(); + + List tgtPlayers = getTargetPlayers(sa); + + for(final Player pTarget: tgtPlayers) { + + // on next untap gain control + game.getUntap().addUntil(pTarget, new Command() { + @Override + public void run() { + pTarget.obeyNewMaster(activator.getLobbyPlayer().createControllerFor(pTarget)); + + // on following cleanup release control + game.getCleanup().addUntil(pTarget, new Command() { + @Override + public void run() { + pTarget.releaseControl(); + } + }); + } + }); + + } + } +} diff --git a/src/main/java/forge/game/player/LobbyPlayer.java b/src/main/java/forge/game/player/LobbyPlayer.java index 73c103810fc..81f5609bd58 100644 --- a/src/main/java/forge/game/player/LobbyPlayer.java +++ b/src/main/java/forge/game/player/LobbyPlayer.java @@ -77,6 +77,7 @@ public abstract class LobbyPlayer implements IHasIcon { } public abstract Player getPlayer(GameState gameState); // factory method to create player + public abstract PlayerController createControllerFor(Player p); public abstract void hear(LobbyPlayer player, String message); } diff --git a/src/main/java/forge/game/player/LobbyPlayerAi.java b/src/main/java/forge/game/player/LobbyPlayerAi.java index fa61b0d1a63..7f7184a2382 100644 --- a/src/main/java/forge/game/player/LobbyPlayerAi.java +++ b/src/main/java/forge/game/player/LobbyPlayerAi.java @@ -25,10 +25,15 @@ public class LobbyPlayerAi extends LobbyPlayer { return PlayerType.COMPUTER; } + @Override + public PlayerController createControllerFor(Player ai) { + return new PlayerControllerAi(ai.getGame(), ai, this); + } + @Override public Player getPlayer(GameState game) { - Player ai = new Player(this, game); - ai.setController(new PlayerControllerAi(game, ai, this)); + Player ai = new Player(getName(), game); + ai.setFirstController(createControllerFor(ai)); String currentAiProfile = Singletons.getModel().getPreferences().getPref(FPref.UI_CURRENT_AI_PROFILE); String lastProfileChosen = game.getMatch().getPlayedGames().isEmpty() ? currentAiProfile : getAiProfile(); diff --git a/src/main/java/forge/game/player/LobbyPlayerHuman.java b/src/main/java/forge/game/player/LobbyPlayerHuman.java index 446d10371c5..468450f3ed9 100644 --- a/src/main/java/forge/game/player/LobbyPlayerHuman.java +++ b/src/main/java/forge/game/player/LobbyPlayerHuman.java @@ -13,10 +13,15 @@ public class LobbyPlayerHuman extends LobbyPlayer { return PlayerType.HUMAN; } + @Override + public PlayerController createControllerFor(Player human) { + return new PlayerControllerHuman(human.getGame(), human, this); + } + @Override public Player getPlayer(GameState game) { - Player player = new Player(this, game); - player.setController(new PlayerControllerHuman(game, player, this)); + Player player = new Player(getName(), game); + player.setFirstController(new PlayerControllerHuman(game, player, this)); return player; } diff --git a/src/main/java/forge/game/player/LobbyPlayerRemote.java b/src/main/java/forge/game/player/LobbyPlayerRemote.java index 65531e41b7a..6529879b6bd 100644 --- a/src/main/java/forge/game/player/LobbyPlayerRemote.java +++ b/src/main/java/forge/game/player/LobbyPlayerRemote.java @@ -33,4 +33,13 @@ public class LobbyPlayerRemote extends LobbyPlayer { public void hear(LobbyPlayer player, String message) { connection.send(new ChatPacketClt(player.getName(), message)); } + + /* (non-Javadoc) + * @see forge.game.player.LobbyPlayer#createControllerFor(forge.game.player.Player) + */ + @Override + public PlayerController createControllerFor(Player p) { + // Cannot create remote players yet + throw new NotImplementedException(); + } } \ No newline at end of file diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 9c70ed8ec50..d1ae22dffb5 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -163,7 +163,8 @@ public class Player extends GameEntity implements Comparable { private PlayerStatistics stats = new PlayerStatistics(); protected PlayerController controller; - private final LobbyPlayer lobbyPlayerCreator; + protected PlayerController controllerCreator = null; + private int teamNumber = -1; private Card activeScheme = null; @@ -191,7 +192,7 @@ public class Player extends GameEntity implements Comparable { * @param myPoisonCounters * a int. */ - public Player(LobbyPlayer lobby, GameState game0) { + public Player(String name, GameState game0) { game = game0; for (final ZoneType z : Player.ALL_ZONES) { final PlayerZone toPut = z == ZoneType.Battlefield @@ -199,12 +200,11 @@ public class Player extends GameEntity implements Comparable { : new PlayerZone(z, this); this.zones.put(z, toPut); } - this.setName(chooseName(lobby)); - this.lobbyPlayerCreator = lobby; + this.setName(chooseName(name)); } - private String chooseName(LobbyPlayer lobby) { - String nameCandidate = lobby.getName(); + private String chooseName(String originalName) { + String nameCandidate = originalName; for( int i = 2; i <= 8; i++) { // several tries, not matter how many boolean haveDuplicates = false; for( Player p : game.getPlayers()) { @@ -215,7 +215,7 @@ public class Player extends GameEntity implements Comparable { } if(!haveDuplicates) return nameCandidate; - nameCandidate = Lang.getOrdinal(i) + " " + lobby.getName(); + nameCandidate = Lang.getOrdinal(i) + " " + originalName; } return nameCandidate; } @@ -236,15 +236,10 @@ public class Player extends GameEntity implements Comparable { return teamNumber; } - - @Deprecated - public boolean isHuman() { return getType() == PlayerType.HUMAN; } + public boolean isHuman() { return getLobbyPlayer().getType() == PlayerType.HUMAN; } @Deprecated - public boolean isComputer() { return getType() == PlayerType.COMPUTER; } - private PlayerType getType() { - return getLobbyPlayer().getType(); - } + public boolean isComputer() { return getLobbyPlayer().getType() == PlayerType.COMPUTER; } public boolean isArchenemy() { @@ -2691,25 +2686,9 @@ public class Player extends GameEntity implements Comparable { return p.getOutcome() == null || p.getOutcome().hasWon(); } }; - - public static Predicate isType(final PlayerType type) { - return new Predicate() { - @Override - public boolean apply(Player input) { - return input.getType() == type; - } - }; - } } public static class Accessors { - public static Function FN_GET_LOBBY_PLAYER = new Function() { - @Override - public LobbyPlayer apply(Player input) { - return input.getLobbyPlayer(); - } - }; - public static Function FN_GET_LIFE = new Function() { @Override public Integer apply(Player input) { @@ -2743,8 +2722,17 @@ public class Player extends GameEntity implements Comparable { } public final boolean isMindSlaved() { - return getController().getLobbyPlayer() != lobbyPlayerCreator; + return controller.getLobbyPlayer() != controllerCreator.getLobbyPlayer(); } + + public final void releaseControl() { + controller = controllerCreator; + } + + public final void obeyNewMaster(PlayerController pc) { + controller = pc; + } + private void setOutcome(PlayerOutcome outcome) { stats.setOutcome(outcome); @@ -2868,8 +2856,10 @@ public class Player extends GameEntity implements Comparable { public final PlayerController getController() { return controller; } - public final void setController(PlayerController ctrlr) { - controller = ctrlr; + public final void setFirstController(PlayerController ctrlr) { + if( null != controllerCreator ) throw new IllegalStateException("Controller creator already assigned"); + controllerCreator = ctrlr; + controller = ctrlr; } /** *

diff --git a/src/main/java/forge/gui/match/controllers/CDock.java b/src/main/java/forge/gui/match/controllers/CDock.java index b7b60118c71..fffd2ade38a 100644 --- a/src/main/java/forge/gui/match/controllers/CDock.java +++ b/src/main/java/forge/gui/match/controllers/CDock.java @@ -41,6 +41,7 @@ import forge.game.phase.PhaseType; import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; +import forge.gui.GuiDialog; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; import forge.gui.framework.SLayoutIO; @@ -81,7 +82,9 @@ public enum CDock implements ICDoc { } final Player p = findAffectedPlayer(); - if( p == null || p.isMindSlaved() ) return; + if( p == null ) return; + if( p.isMindSlaved() ) + GuiDialog.message("You cannot make concede a player you temporary control"); game.getInputQueue().invokeGameAction(new Runnable() { @Override