package mage.player.ai; import mage.MageObject; import mage.abilities.*; import mage.abilities.costs.mana.ManaCost; import mage.cards.Card; import mage.cards.Cards; import mage.cards.decks.Deck; import mage.choices.Choice; import mage.constants.ManaType; import mage.constants.MultiAmountType; import mage.constants.Outcome; import mage.constants.RangeOfInfluence; import mage.game.Game; import mage.game.draft.Draft; import mage.game.match.Match; import mage.game.tournament.Tournament; import mage.players.Player; import mage.target.Target; import mage.target.TargetAmount; import mage.target.TargetCard; import mage.util.MultiAmountMessage; import org.apache.log4j.Logger; import java.io.Serializable; import java.util.List; import java.util.Map; import java.util.UUID; /** * AI player that can be taken under control by another player (AI or human). *
* Under control logic on choose dialog (under human):
* - create fake human player and assign it to real human data transfer object (for income answers);
* - call choose dialog from fake human (e.g. send choose data to real player);
* - game will process all sending and answering logic as "human under human" logic;
* - return choose dialog result without AI code processing;
*
* @author JayDi85
*/
public class ComputerPlayerControllableProxy extends ComputerPlayer7 {
private static final Logger logger = Logger.getLogger(ComputerPlayerControllableProxy.class);
Player lastControllingPlayer = null;
public ComputerPlayerControllableProxy(String name, RangeOfInfluence range, int skill) {
super(name, range, skill);
}
public ComputerPlayerControllableProxy(final ComputerPlayerControllableProxy player) {
super(player);
this.lastControllingPlayer = player;
}
@Override
public ComputerPlayerControllableProxy copy() {
return new ComputerPlayerControllableProxy(this);
}
private boolean isUnderMe(Game game) {
return game.isSimulation() || this.isGameUnderControl();
}
private Player getControllingPlayer(Game game) {
Player player = game.getPlayer(this.getTurnControlledBy());
this.lastControllingPlayer = player.prepareControllableProxy(this);
return this.lastControllingPlayer;
}
@Override
public void setResponseString(String responseString) {
if (this.lastControllingPlayer != null) {
this.lastControllingPlayer.setResponseString(responseString);
}
}
@Override
public void setResponseManaType(UUID manaTypePlayerId, ManaType responseManaType) {
if (this.lastControllingPlayer != null) {
this.lastControllingPlayer.setResponseManaType(manaTypePlayerId, responseManaType);
}
}
@Override
public void setResponseUUID(UUID responseUUID) {
if (this.lastControllingPlayer != null) {
this.lastControllingPlayer.setResponseUUID(responseUUID);
}
}
@Override
public void setResponseBoolean(Boolean responseBoolean) {
if (this.lastControllingPlayer != null) {
this.lastControllingPlayer.setResponseBoolean(responseBoolean);
}
}
@Override
public void setResponseInteger(Integer responseInteger) {
if (this.lastControllingPlayer != null) {
this.lastControllingPlayer.setResponseInteger(responseInteger);
}
}
@Override
public void signalPlayerCheat() {
if (this.lastControllingPlayer != null) {
this.lastControllingPlayer.signalPlayerCheat();
}
}
@Override
public void signalPlayerConcede(boolean stopCurrentChooseDialog) {
if (this.lastControllingPlayer != null) {
this.lastControllingPlayer.signalPlayerConcede(stopCurrentChooseDialog);
}
}
@Override
public boolean priority(Game game) {
if (isUnderMe(game)) {
return super.priority(game);
} else {
Player player = getControllingPlayer(game);
try {
return player.priority(game);
} finally {
this.passed = player.isPassed(); // TODO: wtf, no needs?
}
}
}
@Override
public boolean chooseMulligan(Game game) {
if (isUnderMe(game)) {
return super.chooseMulligan(game);
} else {
return getControllingPlayer(game).chooseMulligan(game);
}
}
@Override
public boolean chooseUse(Outcome outcome, String message, Ability source, Game game) {
if (isUnderMe(game)) {
return super.chooseUse(outcome, message, source, game);
} else {
return getControllingPlayer(game).chooseUse(outcome, message, source, game);
}
}
@Override
public boolean chooseUse(Outcome outcome, String message, String secondMessage, String trueText, String falseText, Ability source, Game game) {
if (isUnderMe(game)) {
return super.chooseUse(outcome, message, secondMessage, trueText, falseText, source, game);
} else {
return getControllingPlayer(game).chooseUse(outcome, message, secondMessage, trueText, falseText, source, game);
}
}
@Override
public int chooseReplacementEffect(Map