mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +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/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
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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 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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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,9 +2722,18 @@ 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,7 +2856,9 @@ 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) {
|
||||||
|
if( null != controllerCreator ) throw new IllegalStateException("Controller creator already assigned");
|
||||||
|
controllerCreator = ctrlr;
|
||||||
controller = ctrlr;
|
controller = ctrlr;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user