ControlPlayer effect (gui does not update to show hand yet - shall implement soon)

This commit is contained in:
Maxmtg
2013-05-27 12:11:04 +00:00
parent 8f774edc0a
commit ebefc96305
9 changed files with 106 additions and 38 deletions

1
.gitattributes vendored
View File

@@ -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/CloneEffect.java -text
src/main/java/forge/card/ability/effects/ControlExchangeEffect.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/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/CopyPermanentEffect.java -text
src/main/java/forge/card/ability/effects/CopySpellAbilityEffect.java -text src/main/java/forge/card/ability/effects/CopySpellAbilityEffect.java -text
src/main/java/forge/card/ability/effects/CounterEffect.java -text src/main/java/forge/card/ability/effects/CounterEffect.java -text

View File

@@ -132,6 +132,7 @@ public enum ApiType {
Clone (CloneEffect.class, CloneAi.class), Clone (CloneEffect.class, CloneAi.class),
CopyPermanent (CopyPermanentEffect.class, CopyPermanentAi.class), CopyPermanent (CopyPermanentEffect.class, CopyPermanentAi.class),
CopySpellAbility (CopySpellAbilityEffect.class, CanPlayAsDrawbackAi.class), CopySpellAbility (CopySpellAbilityEffect.class, CanPlayAsDrawbackAi.class),
ControlPlayer(ControlPlayerEffect.class, CannotPlayAi.class),
Counter (CounterEffect.class, CounterAi.class), Counter (CounterEffect.class, CounterAi.class),
DamageAll (DamageAllEffect.class, DamageAllAi.class), DamageAll (DamageAllEffect.class, DamageAllAi.class),
DealDamage (DamageDealEffect.class, DamageDealAi.class), DealDamage (DamageDealEffect.class, DamageDealAi.class),

View File

@@ -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<Player> 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<Player> 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();
}
});
}
});
}
}
}

View File

@@ -77,6 +77,7 @@ public abstract class LobbyPlayer implements IHasIcon {
} }
public abstract Player getPlayer(GameState gameState); // factory method to create player 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); public abstract void hear(LobbyPlayer player, String message);
} }

View File

@@ -25,10 +25,15 @@ public class LobbyPlayerAi extends LobbyPlayer {
return PlayerType.COMPUTER; return PlayerType.COMPUTER;
} }
@Override
public PlayerController createControllerFor(Player ai) {
return new PlayerControllerAi(ai.getGame(), ai, this);
}
@Override @Override
public Player getPlayer(GameState game) { public Player getPlayer(GameState game) {
Player ai = new Player(this, game); Player ai = new Player(getName(), game);
ai.setController(new PlayerControllerAi(game, ai, this)); ai.setFirstController(createControllerFor(ai));
String currentAiProfile = Singletons.getModel().getPreferences().getPref(FPref.UI_CURRENT_AI_PROFILE); String currentAiProfile = Singletons.getModel().getPreferences().getPref(FPref.UI_CURRENT_AI_PROFILE);
String lastProfileChosen = game.getMatch().getPlayedGames().isEmpty() ? currentAiProfile : getAiProfile(); String lastProfileChosen = game.getMatch().getPlayedGames().isEmpty() ? currentAiProfile : getAiProfile();

View File

@@ -13,10 +13,15 @@ public class LobbyPlayerHuman extends LobbyPlayer {
return PlayerType.HUMAN; return PlayerType.HUMAN;
} }
@Override
public PlayerController createControllerFor(Player human) {
return new PlayerControllerHuman(human.getGame(), human, this);
}
@Override @Override
public Player getPlayer(GameState game) { public Player getPlayer(GameState game) {
Player player = new Player(this, game); Player player = new Player(getName(), game);
player.setController(new PlayerControllerHuman(game, player, this)); player.setFirstController(new PlayerControllerHuman(game, player, this));
return player; return player;
} }

View File

@@ -33,4 +33,13 @@ public class LobbyPlayerRemote extends LobbyPlayer {
public void hear(LobbyPlayer player, String message) { public void hear(LobbyPlayer player, String message) {
connection.send(new ChatPacketClt(player.getName(), 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();
}
} }

View File

@@ -163,7 +163,8 @@ public class Player extends GameEntity implements Comparable<Player> {
private PlayerStatistics stats = new PlayerStatistics(); private PlayerStatistics stats = new PlayerStatistics();
protected PlayerController controller; protected PlayerController controller;
private final LobbyPlayer lobbyPlayerCreator; protected PlayerController controllerCreator = null;
private int teamNumber = -1; private int teamNumber = -1;
private Card activeScheme = null; private Card activeScheme = null;
@@ -191,7 +192,7 @@ public class Player extends GameEntity implements Comparable<Player> {
* @param myPoisonCounters * @param myPoisonCounters
* a int. * a int.
*/ */
public Player(LobbyPlayer lobby, GameState game0) { public Player(String name, GameState game0) {
game = game0; game = game0;
for (final ZoneType z : Player.ALL_ZONES) { for (final ZoneType z : Player.ALL_ZONES) {
final PlayerZone toPut = z == ZoneType.Battlefield final PlayerZone toPut = z == ZoneType.Battlefield
@@ -199,12 +200,11 @@ public class Player extends GameEntity implements Comparable<Player> {
: new PlayerZone(z, this); : new PlayerZone(z, this);
this.zones.put(z, toPut); this.zones.put(z, toPut);
} }
this.setName(chooseName(lobby)); this.setName(chooseName(name));
this.lobbyPlayerCreator = lobby;
} }
private String chooseName(LobbyPlayer lobby) { private String chooseName(String originalName) {
String nameCandidate = lobby.getName(); String nameCandidate = originalName;
for( int i = 2; i <= 8; i++) { // several tries, not matter how many for( int i = 2; i <= 8; i++) { // several tries, not matter how many
boolean haveDuplicates = false; boolean haveDuplicates = false;
for( Player p : game.getPlayers()) { for( Player p : game.getPlayers()) {
@@ -215,7 +215,7 @@ public class Player extends GameEntity implements Comparable<Player> {
} }
if(!haveDuplicates) if(!haveDuplicates)
return nameCandidate; return nameCandidate;
nameCandidate = Lang.getOrdinal(i) + " " + lobby.getName(); nameCandidate = Lang.getOrdinal(i) + " " + originalName;
} }
return nameCandidate; return nameCandidate;
} }
@@ -236,15 +236,10 @@ public class Player extends GameEntity implements Comparable<Player> {
return teamNumber; return teamNumber;
} }
@Deprecated @Deprecated
public boolean isHuman() { return getType() == PlayerType.HUMAN; } public boolean isHuman() { return getLobbyPlayer().getType() == PlayerType.HUMAN; }
@Deprecated @Deprecated
public boolean isComputer() { return getType() == PlayerType.COMPUTER; } public boolean isComputer() { return getLobbyPlayer().getType() == PlayerType.COMPUTER; }
private PlayerType getType() {
return getLobbyPlayer().getType();
}
public boolean isArchenemy() { public boolean isArchenemy() {
@@ -2691,25 +2686,9 @@ public class Player extends GameEntity implements Comparable<Player> {
return p.getOutcome() == null || p.getOutcome().hasWon(); return p.getOutcome() == null || p.getOutcome().hasWon();
} }
}; };
public static Predicate<Player> isType(final PlayerType type) {
return new Predicate<Player>() {
@Override
public boolean apply(Player input) {
return input.getType() == type;
}
};
}
} }
public static class Accessors { public static class Accessors {
public static Function<Player, LobbyPlayer> FN_GET_LOBBY_PLAYER = new Function<Player, LobbyPlayer>() {
@Override
public LobbyPlayer apply(Player input) {
return input.getLobbyPlayer();
}
};
public static Function<Player, Integer> FN_GET_LIFE = new Function<Player, Integer>() { public static Function<Player, Integer> FN_GET_LIFE = new Function<Player, Integer>() {
@Override @Override
public Integer apply(Player input) { public Integer apply(Player input) {
@@ -2743,8 +2722,17 @@ public class Player extends GameEntity implements Comparable<Player> {
} }
public final boolean isMindSlaved() { 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) { private void setOutcome(PlayerOutcome outcome) {
stats.setOutcome(outcome); stats.setOutcome(outcome);
@@ -2868,8 +2856,10 @@ public class Player extends GameEntity implements Comparable<Player> {
public final PlayerController getController() { public final PlayerController getController() {
return controller; return controller;
} }
public final void setController(PlayerController ctrlr) { public final void setFirstController(PlayerController ctrlr) {
controller = ctrlr; if( null != controllerCreator ) throw new IllegalStateException("Controller creator already assigned");
controllerCreator = ctrlr;
controller = ctrlr;
} }
/** /**
* <p> * <p>

View File

@@ -41,6 +41,7 @@ import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiDialog;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.gui.framework.SLayoutIO; import forge.gui.framework.SLayoutIO;
@@ -81,7 +82,9 @@ public enum CDock implements ICDoc {
} }
final Player p = findAffectedPlayer(); 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() { game.getInputQueue().invokeGameAction(new Runnable() {
@Override @Override