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/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

View File

@@ -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),

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 PlayerController createControllerFor(Player p);
public abstract void hear(LobbyPlayer player, String message);
}

View File

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

View File

@@ -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;
}

View File

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

View File

@@ -163,7 +163,8 @@ public class Player extends GameEntity implements Comparable<Player> {
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<Player> {
* @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<Player> {
: 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<Player> {
}
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<Player> {
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<Player> {
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 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>() {
@Override
public Integer apply(Player input) {
@@ -2743,9 +2722,18 @@ public class Player extends GameEntity implements Comparable<Player> {
}
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,7 +2856,9 @@ public class Player extends GameEntity implements Comparable<Player> {
public final PlayerController getController() {
return controller;
}
public final void setController(PlayerController ctrlr) {
public final void setFirstController(PlayerController ctrlr) {
if( null != controllerCreator ) throw new IllegalStateException("Controller creator already assigned");
controllerCreator = ctrlr;
controller = ctrlr;
}
/**

View File

@@ -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