mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 18:58:00 +00:00
ControlPlayer effect (gui does not update to show hand yet - shall implement soon)
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user