Skip to content

Commit

Permalink
cheats: added default commands to take and remove control over anothe…
Browse files Browse the repository at this point in the history
…r player (related to #12878)
  • Loading branch information
JayDi85 committed Jan 7, 2025
1 parent c076f49 commit 5626c5f
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 4 deletions.
39 changes: 37 additions & 2 deletions Mage.Common/src/main/java/mage/utils/SystemUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import mage.game.permanent.Permanent;
import mage.game.permanent.token.Token;
import mage.players.Player;
import mage.target.Target;
import mage.target.TargetPlayer;
import mage.util.CardUtil;
import mage.util.MultiAmountMessage;
import mage.util.RandomUtil;
Expand Down Expand Up @@ -66,6 +68,8 @@ private SystemUtil() {
// [@mana add] -> MANA ADD
private static final String COMMAND_CARDS_ADD_TO_HAND = "@card add to hand";
private static final String COMMAND_LANDS_ADD_TO_BATTLEFIELD = "@lands add";
private static final String COMMAND_OPPONENT_UNDER_CONTROL_START = "@opponent under control start";
private static final String COMMAND_OPPONENT_UNDER_CONTROL_END = "@opponent under control end";
private static final String COMMAND_MANA_ADD = "@mana add"; // TODO: not implemented
private static final String COMMAND_RUN_CUSTOM_CODE = "@run custom code"; // TODO: not implemented
private static final String COMMAND_SHOW_OPPONENT_HAND = "@show opponent hand";
Expand All @@ -80,6 +84,8 @@ private SystemUtil() {
supportedCommands.put(COMMAND_CARDS_ADD_TO_HAND, "CARDS: ADD TO HAND");
supportedCommands.put(COMMAND_MANA_ADD, "MANA ADD");
supportedCommands.put(COMMAND_LANDS_ADD_TO_BATTLEFIELD, "LANDS: ADD TO BATTLEFIELD");
supportedCommands.put(COMMAND_OPPONENT_UNDER_CONTROL_START, "OPPONENT CONTROL: ENABLE");
supportedCommands.put(COMMAND_OPPONENT_UNDER_CONTROL_END, "OPPONENT CONTROL: DISABLE");
supportedCommands.put(COMMAND_RUN_CUSTOM_CODE, "RUN CUSTOM CODE");
supportedCommands.put(COMMAND_SHOW_OPPONENT_HAND, "SHOW OPPONENT HAND");
supportedCommands.put(COMMAND_SHOW_OPPONENT_LIBRARY, "SHOW OPPONENT LIBRARY");
Expand Down Expand Up @@ -255,7 +261,7 @@ public static CardCommandData parseCardCommand(String commandLine) {
*
* @param game
* @param commandsFilePath file path with commands in init.txt format
* @param feedbackPlayer player to execute that cheats (will see choose dialogs)
* @param feedbackPlayer player to execute that cheats (will see choose dialogs)
*/
public static void executeCheatCommands(Game game, String commandsFilePath, Player feedbackPlayer) {

Expand Down Expand Up @@ -301,6 +307,8 @@ public static void executeCheatCommands(Game game, String commandsFilePath, Play
// add default commands
initLines.add(0, String.format("[%s]", COMMAND_LANDS_ADD_TO_BATTLEFIELD));
initLines.add(1, String.format("[%s]", COMMAND_CARDS_ADD_TO_HAND));
initLines.add(2, String.format("[%s]", COMMAND_OPPONENT_UNDER_CONTROL_START));
initLines.add(3, String.format("[%s]", COMMAND_OPPONENT_UNDER_CONTROL_END));

// collect all commands
CommandGroup currentGroup = null;
Expand Down Expand Up @@ -544,14 +552,41 @@ public static void executeCheatCommands(Game game, String commandsFilePath, Play
break;
}

case COMMAND_OPPONENT_UNDER_CONTROL_START: {
Target target = new TargetPlayer().withNotTarget(true).withChooseHint("to take under your control");
if (feedbackPlayer.chooseTarget(Outcome.GainControl, target, fakeSourceAbilityTemplate, game)) {
Player targetPlayer = game.getPlayer(target.getFirstTarget());
if (targetPlayer != null && targetPlayer != feedbackPlayer) {
CardUtil.takeControlUnderPlayerStart(game, fakeSourceAbilityTemplate, feedbackPlayer, targetPlayer, false);
// allow priority play again in same step (for better cheat UX)
targetPlayer.resetPassed();
}
// workaround for refresh priority dialog like avatar click (cheats called from priority in 99%)
game.firePriorityEvent(feedbackPlayer.getId());
}
break;
}

case COMMAND_OPPONENT_UNDER_CONTROL_END: {
Target target = new TargetPlayer().withNotTarget(true).withChooseHint("to free from your control");
if (feedbackPlayer.chooseTarget(Outcome.GainControl, target, fakeSourceAbilityTemplate, game)) {
Player targetPlayer = game.getPlayer(target.getFirstTarget());
if (targetPlayer != null && targetPlayer != feedbackPlayer && !targetPlayer.isGameUnderControl()) {
CardUtil.takeControlUnderPlayerEnd(game, fakeSourceAbilityTemplate, feedbackPlayer, targetPlayer);
}
// workaround for refresh priority dialog like avatar click (cheats called from priority in 99%)
game.firePriorityEvent(feedbackPlayer.getId());
}
break;
}

default: {
String mes = String.format("Unknown system command: %s", runGroup.name);
errorsList.add(mes);
logger.error(mes);
break;
}
}
sendCheatCommandsFeedback(game, feedbackPlayer, errorsList);
return;
}

Expand Down
1 change: 0 additions & 1 deletion Mage/src/main/java/mage/game/turn/Turn.java
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,6 @@ private void checkTurnIsControlledByOtherPlayer(Game game, UUID activePlayerId)
// add new under control
TurnMod newControllerMod = game.getState().getTurnMods().useNextNewController(activePlayerId);
if (newControllerMod != null && !newControllerMod.getNewControllerId().equals(activePlayerId)) {
// set player under new control
// game logs added in child's call (controlPlayersTurn)
game.getPlayer(newControllerMod.getNewControllerId()).controlPlayersTurn(game, activePlayerId, newControllerMod.getInfo());
}
Expand Down
8 changes: 8 additions & 0 deletions Mage/src/main/java/mage/game/turn/TurnMods.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ public TurnMod useNextSkipTurn(UUID playerId) {
}

public TurnMod useNextNewController(UUID playerId) {
// 720.1a
// Multiple player-controlling effects that affect the same player overwrite each other.
// The last one to be created is the one that works.
//
// 720.1b
// If a turn is skipped, any pending player-controlling effects wait until the player
// who would be affected actually takes a turn.

TurnMod lastNewControllerMod = null;

// find last/actual mod
Expand Down
2 changes: 1 addition & 1 deletion Mage/src/main/java/mage/util/CardUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -1380,7 +1380,7 @@ public static void takeControlUnderPlayerStart(Game game, Ability source, Player
public static void takeControlUnderPlayerEnd(Game game, Ability source, Player controller, Player playerUnderControl) {
playerUnderControl.setGameUnderYourControl(true, false);
if (!playerUnderControl.getTurnControlledBy().equals(controller.getId())) {
game.informPlayers(controller + " return control of the turn to " + playerUnderControl.getLogName() + CardUtil.getSourceLogName(game, source));
game.informPlayers(controller.getLogName() + " return control of the turn to " + playerUnderControl.getLogName() + CardUtil.getSourceLogName(game, source));
controller.getPlayersUnderYourControl().remove(playerUnderControl.getId());
}
}
Expand Down

0 comments on commit 5626c5f

Please sign in to comment.