From f36254445a0c158d27c2c191a5595e62f83e677f Mon Sep 17 00:00:00 2001 From: magenoxx Date: Fri, 11 Feb 2011 20:37:08 +0300 Subject: [PATCH] [ai-ma] renamed classes (otherwise classloader uses another classes), added additional logging. --- .../config/AIMinimax.properties | 2 +- .../ai/{Attackers.java => Attackers2.java} | 2 +- .../src/mage/player/ai/ComputerPlayer4.java | 125 +++++++++--------- .../src/mage/player/ai/ComputerPlayer5.java | 104 +++++++++------ .../player/ai/{Config.java => Config2.java} | 8 +- ...valuator.java => GameStateEvaluator2.java} | 20 +-- ...kWorker.java => SimulateBlockWorker2.java} | 8 +- ...latedAction.java => SimulatedAction2.java} | 4 +- ...latedPlayer.java => SimulatedPlayer2.java} | 26 ++-- ...mulationNode.java => SimulationNode2.java} | 12 +- ...tionWorker.java => SimulationWorker2.java} | 10 +- Mage.Tests/config/logging.properties | 2 +- Mage.Tests/plugins/mage-player-ai-ma.jar | Bin 40820 -> 41494 bytes 13 files changed, 166 insertions(+), 157 deletions(-) rename Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/{Attackers.java => Attackers2.java} (96%) rename Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/{Config.java => Config2.java} (91%) rename Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/{GameStateEvaluator.java => GameStateEvaluator2.java} (87%) rename Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/{SimulateBlockWorker.java => SimulateBlockWorker2.java} (91%) rename Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/{SimulatedAction.java => SimulatedAction2.java} (96%) rename Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/{SimulatedPlayer.java => SimulatedPlayer2.java} (91%) rename Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/{SimulationNode.java => SimulationNode2.java} (88%) rename Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/{SimulationWorker.java => SimulationWorker2.java} (89%) diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/config/AIMinimax.properties b/Mage.Server.Plugins/Mage.Player.AI.MA/config/AIMinimax.properties index 96b5480294..219e026458 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/config/AIMinimax.properties +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/config/AIMinimax.properties @@ -4,4 +4,4 @@ evaluatorLifeFactor=2 evaluatorPermanentFactor=1 evaluatorCreatureFactor=1 evaluatorHandFactor=1 -maxThinkSeconds=30 \ No newline at end of file +maxThinkSeconds=10 \ No newline at end of file diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Attackers.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Attackers2.java similarity index 96% rename from Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Attackers.java rename to Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Attackers2.java index 51da223cc9..202f865e88 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Attackers.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Attackers2.java @@ -37,7 +37,7 @@ import mage.game.permanent.Permanent; * * @author BetaSteward_at_googlemail.com */ -public class Attackers extends TreeMap> { +public class Attackers2 extends TreeMap> { public List getAttackers() { List attackers = new ArrayList(); diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer4.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer4.java index 5d52139360..a4a99e6819 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer4.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer4.java @@ -96,12 +96,12 @@ public class ComputerPlayer4 extends ComputerPlayer implements protected List choices = new ArrayList(); protected Combat combat; protected int currentScore; - protected SimulationNode root; + protected SimulationNode2 root; public ComputerPlayer4(String name, RangeOfInfluence range) { super(name, range); - maxDepth = Config.maxDepth; - maxNodes = Config.maxNodes; + maxDepth = Config2.maxDepth; + maxNodes = Config2.maxNodes; } public ComputerPlayer4(final ComputerPlayer4 player) { @@ -172,12 +172,12 @@ public class ComputerPlayer4 extends ComputerPlayer implements } protected void calculateActions(Game game) { - currentScore = GameStateEvaluator.evaluate(playerId, game); + currentScore = GameStateEvaluator2.evaluate(playerId, game); if (!getNextAction(game)) { Game sim = createSimulation(game); - SimulationNode.resetCount(); - root = new SimulationNode(sim, maxDepth, playerId); - logger.fine("simulating actions"); + SimulationNode2.resetCount(); + root = new SimulationNode2(sim, maxDepth, playerId); + logger.info("simulating actions"); addActionsTimed(new FilterAbility()); if (root.children.size() > 0) { root = root.children.get(0); @@ -189,15 +189,15 @@ public class ComputerPlayer4 extends ComputerPlayer implements protected boolean getNextAction(Game game) { if (root != null && root.children.size() > 0) { - SimulationNode test = root; + SimulationNode2 test = root; root = root.children.get(0); while (root.children.size() > 0 && !root.playerId.equals(playerId)) { test = root; root = root.children.get(0); } - logger.fine("simlating -- game value:" + game.getState().getValue() + " test value:" + test.gameValue); + logger.info("simlating -- game value:" + game.getState().getValue() + " test value:" + test.gameValue); if (root.playerId.equals(playerId) && root.abilities != null && game.getState().getValue() == test.gameValue) { - logger.fine("simulating -- continuing previous action chain"); + logger.info("simulating -- continuing previous action chain"); actions = new LinkedList(root.abilities); combat = root.combat; return true; @@ -209,16 +209,16 @@ public class ComputerPlayer4 extends ComputerPlayer implements return false; } - protected int minimaxAB(SimulationNode node, FilterAbility filter, int depth, int alpha, int beta) { + protected int minimaxAB(SimulationNode2 node, FilterAbility filter, int depth, int alpha, int beta) { UUID currentPlayerId = node.getGame().getPlayerList().get(); - SimulationNode bestChild = null; - for (SimulationNode child: node.getChildren()) { + SimulationNode2 bestChild = null; + for (SimulationNode2 child: node.getChildren()) { if (alpha >= beta) { - logger.fine("alpha beta pruning"); + logger.info("alpha beta pruning"); break; } - if (SimulationNode.nodeCount > maxNodes) { - logger.fine("simulating -- reached end-state"); + if (SimulationNode2.nodeCount > maxNodes) { + logger.info("simulating -- reached end-state, count=" + SimulationNode2.nodeCount); break; } int val = addActions(child, filter, depth-1, alpha, beta); @@ -243,11 +243,11 @@ public class ComputerPlayer4 extends ComputerPlayer implements if (bestChild != null) node.children.add(bestChild); if (!currentPlayerId.equals(playerId)) { - logger.fine("returning minimax beta: " + beta); + logger.info("returning minimax beta: " + beta); return beta; } else { - logger.fine("returning minimax alpha: " + alpha); + logger.info("returning minimax alpha: " + alpha); return alpha; } } @@ -261,7 +261,7 @@ public class ComputerPlayer4 extends ComputerPlayer implements return null; } - protected void resolve(SimulationNode node, int depth, Game game) { + protected void resolve(SimulationNode2 node, int depth, Game game) { StackObject ability = game.getStack().pop(); if (ability instanceof StackAbility) { SearchEffect effect = getSearchEffect((StackAbility) ability); @@ -274,16 +274,16 @@ public class ComputerPlayer4 extends ComputerPlayer implements SearchEffect newEffect = getSearchEffect((StackAbility) newAbility); newEffect.getTarget().addTarget(targetId, newAbility, sim); sim.getStack().push(newAbility); - SimulationNode newNode = new SimulationNode(sim, depth, ability.getControllerId()); + SimulationNode2 newNode = new SimulationNode2(sim, depth, ability.getControllerId()); node.children.add(newNode); newNode.getTargets().add(targetId); - logger.fine("simulating search -- node#: " + SimulationNode.getCount() + "for player: " + sim.getPlayer(ability.getControllerId()).getName()); + logger.fine("simulating search -- node#: " + SimulationNode2.getCount() + "for player: " + sim.getPlayer(ability.getControllerId()).getName()); } return; } } } - logger.fine("simulating resolve "); + //logger.info("simulating resolve "); ability.resolve(game); game.applyEffects(); game.getPlayers().resetPassed(); @@ -299,9 +299,9 @@ public class ComputerPlayer4 extends ComputerPlayer implements }); pool.execute(task); try { - task.get(Config.maxThinkSeconds, TimeUnit.SECONDS); + task.get(Config2.maxThinkSeconds, TimeUnit.SECONDS); } catch (TimeoutException e) { - logger.fine("simulating - timed out"); + logger.info("simulating - timed out"); task.cancel(true); } catch (ExecutionException e) { @@ -310,25 +310,26 @@ public class ComputerPlayer4 extends ComputerPlayer implements } } - protected int addActions(SimulationNode node, FilterAbility filter, int depth, int alpha, int beta) { + protected int addActions(SimulationNode2 node, FilterAbility filter, int depth, int alpha, int beta) { + logger.info("addActions: " + depth + ", alpha=" + alpha + ", beta=" + beta); Game game = node.getGame(); int val; if (Thread.interrupted()) { Thread.currentThread().interrupt(); - logger.fine("interrupted"); - return GameStateEvaluator.evaluate(playerId, game); + logger.info("interrupted"); + return GameStateEvaluator2.evaluate(playerId, game); } - if (depth <= 0 || SimulationNode.nodeCount > maxNodes || game.isGameOver()) { - logger.fine("simulating -- reached end state"); - val = GameStateEvaluator.evaluate(playerId, game); + if (depth <= 0 || SimulationNode2.nodeCount > maxNodes || game.isGameOver()) { + logger.info("simulating -- reached end state, node count="+ SimulationNode2.nodeCount + ", depth="+depth); + val = GameStateEvaluator2.evaluate(playerId, game); } else if (node.getChildren().size() > 0) { - logger.fine("simulating -- somthing added children:" + node.getChildren().size()); + logger.info("simulating -- somthing added children:" + node.getChildren().size()); val = minimaxAB(node, filter, depth-1, alpha, beta); } else { if (logger.isLoggable(Level.FINE)) - logger.fine("simulating -- alpha: " + alpha + " beta: " + beta + " depth:" + depth + " step:" + game.getTurn().getStepType() + " for player:" + (node.getPlayerId().equals(playerId)?"yes":"no")); + logger.info("simulating -- alpha: " + alpha + " beta: " + beta + " depth:" + depth + " step:" + game.getTurn().getStepType() + " for player:" + (node.getPlayerId().equals(playerId)?"yes":"no")); if (allPassed(game)) { if (!game.getStack().isEmpty()) { resolve(node, depth, game); @@ -337,7 +338,7 @@ public class ComputerPlayer4 extends ComputerPlayer implements // int testScore = GameStateEvaluator.evaluate(playerId, game); // if (testScore < currentScore) { // // if score at end of step is worse than original score don't check any further -// logger.fine("simulating -- abandoning current check, no immediate benefit"); +// logger.info("simulating -- abandoning current check, no immediate benefit"); // return testScore; // } game.getPlayers().resetPassed(); @@ -346,12 +347,13 @@ public class ComputerPlayer4 extends ComputerPlayer implements } if (game.isGameOver()) { - val = GameStateEvaluator.evaluate(playerId, game); + val = GameStateEvaluator2.evaluate(playerId, game); } else if (node.getChildren().size() > 0) { + throw new RuntimeException("This shouldn't happen."); //declared attackers or blockers or triggered abilities - logger.fine("simulating -- attack/block/trigger added children:" + node.getChildren().size()); - val = minimaxAB(node, filter, depth-1, alpha, beta); + ///logger.info("simulating -- attack/block/trigger added children:" + node.getChildren().size()); + ///val = minimaxAB(node, filter, depth-1, alpha, beta); } else { val = simulatePriority(node, game, filter, depth, alpha, beta); @@ -359,24 +361,24 @@ public class ComputerPlayer4 extends ComputerPlayer implements } if (logger.isLoggable(Level.FINE)) - logger.fine("returning -- score: " + val + " depth:" + depth + " step:" + game.getTurn().getStepType() + " for player:" + game.getPlayer(node.getPlayerId()).getName()); + logger.info("returning -- score: " + val + " depth:" + depth + " step:" + game.getTurn().getStepType() + " for player:" + game.getPlayer(node.getPlayerId()).getName()); return val; } - protected int simulatePriority(SimulationNode node, Game game, FilterAbility filter, int depth, int alpha, int beta) { + protected int simulatePriority(SimulationNode2 node, Game game, FilterAbility filter, int depth, int alpha, int beta) { if (Thread.interrupted()) { Thread.currentThread().interrupt(); - logger.fine("interrupted"); - return GameStateEvaluator.evaluate(playerId, game); + logger.info("interrupted"); + return GameStateEvaluator2.evaluate(playerId, game); } node.setGameValue(game.getState().getValue()); - SimulatedPlayer currentPlayer = (SimulatedPlayer) game.getPlayer(game.getPlayerList().get()); - logger.fine("simulating -- player " + currentPlayer.getName()); - SimulationNode bestNode = null; + SimulatedPlayer2 currentPlayer = (SimulatedPlayer2) game.getPlayer(game.getPlayerList().get()); + //logger.info("simulating -- player " + currentPlayer.getName()); + SimulationNode2 bestNode = null; List allActions = currentPlayer.simulatePriority(game, filter); if (logger.isLoggable(Level.FINE)) - logger.fine("simulating -- adding " + allActions.size() + " children:" + allActions); + logger.info("simulating -- adding " + allActions.size() + " children:" + allActions); for (Ability action: allActions) { Game sim = game.copy(); if (sim.getPlayer(currentPlayer.getId()).activateAbility((ActivatedAbility) action.copy(), sim)) { @@ -386,9 +388,9 @@ public class ComputerPlayer4 extends ComputerPlayer implements sim.getPlayer(currentPlayer.getId()).pass(); sim.getPlayerList().getNext(); } - SimulationNode newNode = new SimulationNode(sim, action, depth, currentPlayer.getId()); + SimulationNode2 newNode = new SimulationNode2(sim, action, depth, currentPlayer.getId()); if (logger.isLoggable(Level.FINE)) - logger.fine("simulating -- node #:" + SimulationNode.getCount() + " actions:" + action); + logger.info("simulating -- node #:" + SimulationNode2.getCount() + " actions:" + action); sim.checkStateAndTriggered(); int val = addActions(newNode, filter, depth-1, alpha, beta); if (!currentPlayer.getId().equals(playerId)) { @@ -410,11 +412,11 @@ public class ComputerPlayer4 extends ComputerPlayer implements } } if (alpha >= beta) { - logger.fine("simulating -- pruning"); + //logger.info("simulating -- pruning"); break; } - if (SimulationNode.nodeCount > maxNodes) { - logger.fine("simulating -- reached end-state"); + if (SimulationNode2.nodeCount > maxNodes) { + logger.info("simulating -- reached end-state"); break; } } @@ -424,11 +426,11 @@ public class ComputerPlayer4 extends ComputerPlayer implements node.children.add(bestNode); } if (!currentPlayer.getId().equals(playerId)) { - logger.fine("returning priority beta: " + beta); + //logger.info("returning priority beta: " + beta); return beta; } else { - logger.fine("returning priority alpha: " + alpha); + //logger.info("returning priority alpha: " + alpha); return alpha; } } @@ -492,7 +494,7 @@ public class ComputerPlayer4 extends ComputerPlayer implements return true; } - public void playNext(Game game, UUID activePlayerId, SimulationNode node) { + public void playNext(Game game, UUID activePlayerId, SimulationNode2 node) { boolean skip = false; while (true) { Phase currentPhase = game.getPhase(); @@ -552,7 +554,7 @@ public class ComputerPlayer4 extends ComputerPlayer implements if (game.getTurn().getStepType() == PhaseStep.DECLARE_ATTACKERS) { game.fireEvent(new GameEvent(GameEvent.EventType.DECLARE_ATTACKERS_STEP_PRE, null, null, activePlayerId)); if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.DECLARING_ATTACKERS, activePlayerId, activePlayerId))) { - for (Combat engagement: ((SimulatedPlayer)game.getPlayer(activePlayerId)).addAttackers(game)) { + for (Combat engagement: ((SimulatedPlayer2)game.getPlayer(activePlayerId)).addAttackers(game)) { Game sim = game.copy(); UUID defenderId = game.getOpponents(playerId).iterator().next(); for (CombatGroup group: engagement.getGroups()) { @@ -561,8 +563,8 @@ public class ComputerPlayer4 extends ComputerPlayer implements } } sim.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_ATTACKERS, playerId, playerId)); - SimulationNode newNode = new SimulationNode(sim, node.getDepth()-1, activePlayerId); - logger.fine("simulating -- node #:" + SimulationNode.getCount() + " declare attakers"); + SimulationNode2 newNode = new SimulationNode2(sim, node.getDepth()-1, activePlayerId); + logger.info("simulating -- node #:" + SimulationNode2.getCount() + " declare attakers"); newNode.setCombat(sim.getCombat()); node.children.add(newNode); } @@ -574,7 +576,7 @@ public class ComputerPlayer4 extends ComputerPlayer implements for (UUID defenderId: game.getCombat().getDefenders()) { //check if defender is being attacked if (game.getCombat().isAttacked(defenderId, game)) { - for (Combat engagement: ((SimulatedPlayer)game.getPlayer(defenderId)).addBlockers(game)) { + for (Combat engagement: ((SimulatedPlayer2)game.getPlayer(defenderId)).addBlockers(game)) { Game sim = game.copy(); for (CombatGroup group: engagement.getGroups()) { for (UUID blockerId: group.getBlockers()) { @@ -582,8 +584,8 @@ public class ComputerPlayer4 extends ComputerPlayer implements } } sim.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_BLOCKERS, playerId, playerId)); - SimulationNode newNode = new SimulationNode(sim, node.getDepth()-1, defenderId); - logger.fine("simulating -- node #:" + SimulationNode.getCount() + " declare blockers"); + SimulationNode2 newNode = new SimulationNode2(sim, node.getDepth()-1, defenderId); + logger.info("simulating -- node #:" + SimulationNode2.getCount() + " declare blockers"); newNode.setCombat(sim.getCombat()); node.children.add(newNode); } @@ -606,10 +608,11 @@ public class ComputerPlayer4 extends ComputerPlayer implements @Override public void selectAttackers(Game game) { - logger.fine("selectAttackers"); + logger.info("selectAttackers"); if (combat != null) { UUID opponentId = game.getCombat().getDefenders().iterator().next(); for (UUID attackerId: combat.getAttackers()) { + logger.info("declare attacker: " + game.getCard(attackerId).getName()); this.declareAttacker(attackerId, opponentId, game); } } @@ -617,7 +620,7 @@ public class ComputerPlayer4 extends ComputerPlayer implements @Override public void selectBlockers(Game game) { - logger.fine("selectBlockers"); + logger.info("selectBlockers"); if (combat != null && combat.getGroups().size() > 0) { List groups = game.getCombat().getGroups(); for (int i = 0; i < groups.size(); i++) { @@ -641,7 +644,7 @@ public class ComputerPlayer4 extends ComputerPlayer implements for (Player copyPlayer: sim.getState().getPlayers().values()) { Player origPlayer = game.getState().getPlayers().get(copyPlayer.getId()); - SimulatedPlayer newPlayer = new SimulatedPlayer(copyPlayer.getId(), copyPlayer.getId().equals(playerId)); + SimulatedPlayer2 newPlayer = new SimulatedPlayer2(copyPlayer.getId(), copyPlayer.getId().equals(playerId)); newPlayer.restore(origPlayer); sim.getState().getPlayers().put(copyPlayer.getId(), newPlayer); } diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer5.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer5.java index d4bfe29dfb..cff09a4683 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer5.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer5.java @@ -37,11 +37,13 @@ import mage.Constants.PhaseStep; import mage.Constants.RangeOfInfluence; import mage.Constants.Zone; import mage.abilities.Ability; +import mage.cards.Card; import mage.filter.FilterAbility; import mage.game.Game; import mage.game.combat.Combat; import mage.game.combat.CombatGroup; import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; import mage.game.turn.BeginCombatStep; import mage.game.turn.BeginningPhase; import mage.game.turn.CleanupStep; @@ -80,12 +82,13 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { filterNotLand.setZone(Zone.HAND); filterNotLand.setNotFilter(true); + logger.setLevel(Level.ALL); } public ComputerPlayer5(String name, RangeOfInfluence range) { super(name, range); - maxDepth = Config.maxDepth; - maxNodes = Config.maxNodes; + maxDepth = Config2.maxDepth; + maxNodes = Config2.maxNodes; } public ComputerPlayer5(final ComputerPlayer5 player) { @@ -108,7 +111,22 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { break; case PRECOMBAT_MAIN: if (game.getActivePlayerId().equals(playerId)) { - System.out.println("["+ game.getPlayer(playerId).getName() + "] Precombat Main, life=" + game.getPlayer(playerId).getLife()); + Player player = game.getPlayer(playerId); + System.out.println("[" + game.getPlayer(playerId).getName() + "] Precombat Main, life=" + player.getLife()); + String s = "["; + for (Card card : player.getHand().getCards(game)) { + s += card.getName() + ";"; + } + s += "]"; + System.out.println("Hand: " + s); + s = "["; + for (Permanent permanent : game.getBattlefield().getAllPermanents()) { + if (permanent.getOwnerId().equals(player.getId())) { + s += permanent.getName() + ";"; + } + } + s += "]"; + System.out.println("Permanents: " + s); if (actions.size() == 0) { calculatePreCombatActions(game); } @@ -154,10 +172,10 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { protected void calculatePreCombatActions(Game game) { if (!getNextAction(game)) { - currentScore = GameStateEvaluator.evaluate(playerId, game); + currentScore = GameStateEvaluator2.evaluate(playerId, game); Game sim = createSimulation(game); - SimulationNode.resetCount(); - root = new SimulationNode(sim, maxDepth, playerId); + SimulationNode2.resetCount(); + root = new SimulationNode2(sim, maxDepth, playerId); logger.fine("simulating pre combat actions -----------------------------------------------------------------------------------------"); addActionsTimed(new FilterAbility()); @@ -171,10 +189,10 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { protected void calculatePostCombatActions(Game game) { if (!getNextAction(game)) { - currentScore = GameStateEvaluator.evaluate(playerId, game); + currentScore = GameStateEvaluator2.evaluate(playerId, game); Game sim = createSimulation(game); - SimulationNode.resetCount(); - root = new SimulationNode(sim, maxDepth, playerId); + SimulationNode2.resetCount(); + root = new SimulationNode2(sim, maxDepth, playerId); logger.fine("simulating post combat actions ----------------------------------------------------------------------------------------"); addActionsTimed(new FilterAbility()); if (root.children.size() > 0) { @@ -186,18 +204,18 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { } @Override - protected int addActions(SimulationNode node, FilterAbility filter, int depth, int alpha, int beta) { + protected int addActions(SimulationNode2 node, FilterAbility filter, int depth, int alpha, int beta) { boolean stepFinished = false; int val; Game game = node.getGame(); if (Thread.interrupted()) { Thread.currentThread().interrupt(); logger.fine("interrupted"); - return GameStateEvaluator.evaluate(playerId, game); + return GameStateEvaluator2.evaluate(playerId, game); } - if (depth <= 0 || SimulationNode.nodeCount > maxNodes || game.isGameOver()) { + if (depth <= 0 || SimulationNode2.nodeCount > maxNodes || game.isGameOver()) { logger.fine("simulating -- reached end state"); - val = GameStateEvaluator.evaluate(playerId, game); + val = GameStateEvaluator2.evaluate(playerId, game); } else if (node.getChildren().size() > 0) { logger.fine("simulating -- somthing added children:" + node.getChildren().size()); @@ -216,11 +234,11 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { } if (game.isGameOver()) { - val = GameStateEvaluator.evaluate(playerId, game); + val = GameStateEvaluator2.evaluate(playerId, game); } else if (stepFinished) { logger.fine("step finished"); - int testScore = GameStateEvaluator.evaluate(playerId, game); + int testScore = GameStateEvaluator2.evaluate(playerId, game); if (game.getActivePlayerId().equals(playerId)) { if (testScore < currentScore) { // if score at end of step is worse than original score don't check further @@ -236,7 +254,7 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { val = -simulateCounterAttack(game, node, depth-1, alpha, beta); break; default: - val = -GameStateEvaluator.evaluate(playerId, game); + val = -GameStateEvaluator2.evaluate(playerId, game); break; } } @@ -245,7 +263,7 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { if (game.getTurn().getStepType() == PhaseStep.DECLARE_ATTACKERS) val = simulateBlockers(game, node, playerId, depth-1, alpha, beta, true); else - val = GameStateEvaluator.evaluate(playerId, game); + val = GameStateEvaluator2.evaluate(playerId, game); } } else if (node.getChildren().size() > 0) { @@ -263,12 +281,12 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { } - protected int simulateCombat(Game game, SimulationNode node, int depth, int alpha, int beta, boolean counter) { + protected int simulateCombat(Game game, SimulationNode2 node, int depth, int alpha, int beta, boolean counter) { Integer val = null; if (Thread.interrupted()) { Thread.currentThread().interrupt(); logger.fine("interrupted"); - return GameStateEvaluator.evaluate(playerId, game); + return GameStateEvaluator2.evaluate(playerId, game); } if (game.getTurn().getStepType() != PhaseStep.DECLARE_BLOCKERS) { game.getTurn().setPhase(new CombatPhase()); @@ -297,31 +315,31 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { } else if (!counter) { finishCombat(game); - val = GameStateEvaluator.evaluate(playerId, game); + val = GameStateEvaluator2.evaluate(playerId, game); // val = simulateCounterAttack(game, node, depth, alpha, beta); } } if (val == null) - val = GameStateEvaluator.evaluate(playerId, game); + val = GameStateEvaluator2.evaluate(playerId, game); if (logger.isLoggable(Level.FINE)) logger.fine("returning -- combat score: " + val + " depth:" + depth + " for player:" + game.getPlayer(node.getPlayerId()).getName()); return val; } - protected int simulateAttackers(Game game, SimulationNode node, UUID attackerId, int depth, int alpha, int beta, boolean counter) { + protected int simulateAttackers(Game game, SimulationNode2 node, UUID attackerId, int depth, int alpha, int beta, boolean counter) { if (Thread.interrupted()) { Thread.currentThread().interrupt(); logger.fine("interrupted"); - return GameStateEvaluator.evaluate(playerId, game); + return GameStateEvaluator2.evaluate(playerId, game); } Integer val = null; - SimulationNode bestNode = null; - SimulatedPlayer attacker = (SimulatedPlayer) game.getPlayer(attackerId); + SimulationNode2 bestNode = null; + SimulatedPlayer2 attacker = (SimulatedPlayer2) game.getPlayer(attackerId); for (Combat engagement: attacker.addAttackers(game)) { if (alpha >= beta) { - logger.fine("simulating -- pruning attackers"); + //logger.fine("simulating -- pruning attackers"); break; } Game sim = game.copy(); @@ -332,9 +350,9 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { } } sim.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_ATTACKERS, playerId, playerId)); - SimulationNode newNode = new SimulationNode(sim, depth, game.getActivePlayerId()); + SimulationNode2 newNode = new SimulationNode2(sim, depth, game.getActivePlayerId()); if (logger.isLoggable(Level.FINE)) - logger.fine("simulating attack -- node#: " + SimulationNode.getCount()); + logger.fine("simulating attack -- node#: " + SimulationNode2.getCount()); sim.checkStateAndTriggered(); while (!sim.getStack().isEmpty()) { sim.getStack().resolve(sim); @@ -361,7 +379,7 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { } } if (val == null) - val = GameStateEvaluator.evaluate(playerId, game); + val = GameStateEvaluator2.evaluate(playerId, game); if (bestNode != null) { node.children.clear(); node.children.add(bestNode); @@ -371,17 +389,17 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { return val; } - protected int simulateBlockers(Game game, SimulationNode node, UUID defenderId, int depth, int alpha, int beta, boolean counter) { + protected int simulateBlockers(Game game, SimulationNode2 node, UUID defenderId, int depth, int alpha, int beta, boolean counter) { if (Thread.interrupted()) { Thread.currentThread().interrupt(); logger.fine("interrupted"); - return GameStateEvaluator.evaluate(playerId, game); + return GameStateEvaluator2.evaluate(playerId, game); } Integer val = null; - SimulationNode bestNode = null; + SimulationNode2 bestNode = null; //check if defender is being attacked if (game.getCombat().isAttacked(defenderId, game)) { - SimulatedPlayer defender = (SimulatedPlayer) game.getPlayer(defenderId); + SimulatedPlayer2 defender = (SimulatedPlayer2) game.getPlayer(defenderId); for (Combat engagement: defender.addBlockers(game)) { if (alpha >= beta) { logger.fine("simulating -- pruning blockers"); @@ -395,9 +413,9 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { } } sim.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_BLOCKERS, playerId, playerId)); - SimulationNode newNode = new SimulationNode(sim, depth, defenderId); + SimulationNode2 newNode = new SimulationNode2(sim, depth, defenderId); if (logger.isLoggable(Level.FINE)) - logger.fine("simulating block -- node#: " + SimulationNode.getCount()); + logger.fine("simulating block -- node#: " + SimulationNode2.getCount()); sim.checkStateAndTriggered(); while (!sim.getStack().isEmpty()) { sim.getStack().resolve(sim); @@ -408,13 +426,13 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { Combat simCombat = sim.getCombat().copy(); finishCombat(sim); if (sim.isGameOver()) { - val = GameStateEvaluator.evaluate(playerId, sim); + val = GameStateEvaluator2.evaluate(playerId, sim); } else if (!counter) { val = simulatePostCombatMain(sim, newNode, depth-1, alpha, beta); } else - val = GameStateEvaluator.evaluate(playerId, sim); + val = GameStateEvaluator2.evaluate(playerId, sim); if (!defenderId.equals(playerId)) { if (val < beta) { beta = val; @@ -432,7 +450,7 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { } } if (val == null) - val = GameStateEvaluator.evaluate(playerId, game); + val = GameStateEvaluator2.evaluate(playerId, game); if (bestNode != null) { node.children.clear(); node.children.add(bestNode); @@ -442,11 +460,11 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { return val; } - protected int simulateCounterAttack(Game game, SimulationNode node, int depth, int alpha, int beta) { + protected int simulateCounterAttack(Game game, SimulationNode2 node, int depth, int alpha, int beta) { if (Thread.interrupted()) { Thread.currentThread().interrupt(); logger.fine("interrupted"); - return GameStateEvaluator.evaluate(playerId, game); + return GameStateEvaluator2.evaluate(playerId, game); } Integer val = null; if (!game.isGameOver()) { @@ -465,7 +483,7 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { logger.fine("returning -- counter attack score: " + val + " depth:" + depth + " for player:" + game.getPlayer(node.getPlayerId()).getName()); } if (val == null) - val = GameStateEvaluator.evaluate(playerId, game); + val = GameStateEvaluator2.evaluate(playerId, game); return val; } @@ -500,11 +518,11 @@ public class ComputerPlayer5 extends ComputerPlayer4 implements Player { simulateStep(game, new EndOfCombatStep()); } - protected int simulatePostCombatMain(Game game, SimulationNode node, int depth, int alpha, int beta) { + protected int simulatePostCombatMain(Game game, SimulationNode2 node, int depth, int alpha, int beta) { if (Thread.interrupted()) { Thread.currentThread().interrupt(); logger.fine("interrupted"); - return GameStateEvaluator.evaluate(playerId, game); + return GameStateEvaluator2.evaluate(playerId, game); } logger.fine("simulating -- post combat main"); game.getTurn().setPhase(new PostCombatMainPhase()); diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Config.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Config2.java similarity index 91% rename from Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Config.java rename to Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Config2.java index c0854286f4..2d837e1e37 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Config.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/Config2.java @@ -41,9 +41,9 @@ import mage.util.Logging; * * @author BetaSteward_at_googlemail.com */ -public class Config { +public class Config2 { - private final static Logger logger = Logging.getLogger(Config.class.getName()); + private final static Logger logger = Logging.getLogger(Config2.class.getName()); public static final int maxDepth; public static final int maxNodes; @@ -56,12 +56,12 @@ public class Config { static { Properties p = new Properties(); try { - File file = new File(Config.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); + File file = new File(Config2.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); p.load(new FileInputStream(new File(file.getParent() + File.separator + "AIMinimax.properties"))); } catch (IOException ex) { logger.log(Level.SEVERE, null, ex); } catch (URISyntaxException ex) { - Logger.getLogger(Config.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(Config2.class.getName()).log(Level.SEVERE, null, ex); } maxDepth = Integer.parseInt(p.getProperty("maxDepth")); maxNodes = Integer.parseInt(p.getProperty("maxNodes")); diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator2.java similarity index 87% rename from Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator.java rename to Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator2.java index 26d0c69f07..70a66f20bb 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/GameStateEvaluator2.java @@ -8,13 +8,7 @@ package mage.player.ai; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; -import mage.Constants.CardType; -import mage.Constants.Zone; -import mage.abilities.ActivatedAbility; -import mage.abilities.keyword.DoubleStrikeAbility; -import mage.abilities.keyword.FirstStrikeAbility; -import mage.abilities.keyword.TrampleAbility; -import mage.abilities.mana.ManaAbility; + import mage.game.Game; import mage.game.permanent.Permanent; import mage.player.ai.ma.ArtificialScoringSystem; @@ -28,9 +22,9 @@ import mage.util.Logging; * this evaluator is only good for two player games * */ -public class GameStateEvaluator { +public class GameStateEvaluator2 { - private final static transient Logger logger = Logging.getLogger(GameStateEvaluator.class.getName()); + private final static transient Logger logger = Logging.getLogger(GameStateEvaluator2.class.getName()); static { logger.setLevel(Level.ALL); @@ -40,10 +34,10 @@ public class GameStateEvaluator { public static final int LOSE_GAME_SCORE = -WIN_GAME_SCORE; - private static final int LIFE_FACTOR = Config.evaluatorLifeFactor; - private static final int PERMANENT_FACTOR = Config.evaluatorPermanentFactor; - private static final int CREATURE_FACTOR = Config.evaluatorCreatureFactor; - private static final int HAND_FACTOR = Config.evaluatorHandFactor; + private static final int LIFE_FACTOR = Config2.evaluatorLifeFactor; + private static final int PERMANENT_FACTOR = Config2.evaluatorPermanentFactor; + private static final int CREATURE_FACTOR = Config2.evaluatorCreatureFactor; + private static final int HAND_FACTOR = Config2.evaluatorHandFactor; public static int evaluate(UUID playerId, Game game) { Player player = game.getPlayer(playerId); diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulateBlockWorker.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulateBlockWorker2.java similarity index 91% rename from Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulateBlockWorker.java rename to Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulateBlockWorker2.java index 77fbc41225..d779c311e7 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulateBlockWorker.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulateBlockWorker2.java @@ -38,14 +38,14 @@ import mage.util.Logging; * * @author BetaSteward_at_googlemail.com */ -public class SimulateBlockWorker implements Callable { +public class SimulateBlockWorker2 implements Callable { - private final static Logger logger = Logging.getLogger(SimulationWorker.class.getName()); + private final static Logger logger = Logging.getLogger(SimulationWorker2.class.getName()); - private SimulationNode node; + private SimulationNode2 node; private ComputerPlayer5 player; - public SimulateBlockWorker(ComputerPlayer5 player, SimulationNode node) { + public SimulateBlockWorker2(ComputerPlayer5 player, SimulationNode2 node) { this.player = player; this.node = node; } diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedAction.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedAction2.java similarity index 96% rename from Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedAction.java rename to Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedAction2.java index ab82ee8096..0b0e0ba9eb 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedAction.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedAction2.java @@ -36,12 +36,12 @@ import mage.game.Game; * * @author BetaSteward_at_googlemail.com */ -public class SimulatedAction { +public class SimulatedAction2 { private Game game; private List abilities; - public SimulatedAction(Game game, List abilities) { + public SimulatedAction2(Game game, List abilities) { this.game = game; this.abilities = abilities; } diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java similarity index 91% rename from Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer.java rename to Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java index be3b0c762c..48e494ddbf 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulatedPlayer2.java @@ -31,18 +31,13 @@ package mage.player.ai; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; import mage.abilities.Ability; -import mage.abilities.ActivatedAbility; import mage.abilities.TriggeredAbility; import mage.abilities.common.PassAbility; import mage.abilities.mana.ManaOptions; @@ -54,28 +49,27 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.game.stack.StackAbility; import mage.target.Target; -import mage.util.Copier; import mage.util.Logging; /** * * @author BetaSteward_at_googlemail.com */ -public class SimulatedPlayer extends ComputerPlayer { +public class SimulatedPlayer2 extends ComputerPlayer { - private final static transient Logger logger = Logging.getLogger(SimulatedPlayer.class.getName()); + private final static transient Logger logger = Logging.getLogger(SimulatedPlayer2.class.getName()); private boolean isSimulatedPlayer; private FilterAbility filter; private transient ConcurrentLinkedQueue allActions; private static PassAbility pass = new PassAbility(); - public SimulatedPlayer(UUID id, boolean isSimulatedPlayer) { + public SimulatedPlayer2(UUID id, boolean isSimulatedPlayer) { super(id); pass.setControllerId(playerId); this.isSimulatedPlayer = isSimulatedPlayer; } - public SimulatedPlayer(final SimulatedPlayer player) { + public SimulatedPlayer2(final SimulatedPlayer2 player) { super(player); this.isSimulatedPlayer = player.isSimulatedPlayer; if (player.filter != null) @@ -83,8 +77,8 @@ public class SimulatedPlayer extends ComputerPlayer { } @Override - public SimulatedPlayer copy() { - return new SimulatedPlayer(this); + public SimulatedPlayer2 copy() { + return new SimulatedPlayer2(this); } public List simulatePriority(Game game, FilterAbility filter) { @@ -213,7 +207,7 @@ public class SimulatedPlayer extends ComputerPlayer { game.getPlayers().resetPassed(); } else { - SimulationNode parent = (SimulationNode) game.getCustomData(); + SimulationNode2 parent = (SimulationNode2) game.getCustomData(); int depth = parent.getDepth() - 1; if (depth == 0) return true; logger.fine("simulating -- triggered ability - adding children:" + options.size()); @@ -224,13 +218,13 @@ public class SimulatedPlayer extends ComputerPlayer { return true; } - protected void addAbilityNode(SimulationNode parent, Ability ability, int depth, Game game) { + protected void addAbilityNode(SimulationNode2 parent, Ability ability, int depth, Game game) { Game sim = game.copy(); sim.getStack().push(new StackAbility(ability, playerId)); ability.activate(sim, false); sim.applyEffects(); - SimulationNode newNode = new SimulationNode(sim, depth, playerId); - logger.fine("simulating -- node #:" + SimulationNode.getCount() + " triggered ability option"); + SimulationNode2 newNode = new SimulationNode2(sim, depth, playerId); + logger.fine("simulating -- node #:" + SimulationNode2.getCount() + " triggered ability option"); for (Target target: ability.getTargets()) { for (UUID targetId: target.getTargets()) { newNode.getTargets().add(targetId); diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationNode.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationNode2.java similarity index 88% rename from Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationNode.java rename to Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationNode2.java index 954e4c7097..f32f29c0e3 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationNode.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationNode2.java @@ -40,7 +40,7 @@ import mage.game.combat.Combat; * * @author BetaSteward_at_googlemail.com */ -public class SimulationNode implements Serializable { +public class SimulationNode2 implements Serializable { protected static int nodeCount; @@ -48,13 +48,13 @@ public class SimulationNode implements Serializable { protected int gameValue; protected List abilities; protected int depth; - protected List children = new ArrayList(); + protected List children = new ArrayList(); protected List targets = new ArrayList(); protected List choices = new ArrayList(); protected UUID playerId; protected Combat combat; - public SimulationNode(Game game, int depth, UUID playerId) { + public SimulationNode2(Game game, int depth, UUID playerId) { this.game = game; this.depth = depth; this.playerId = playerId; @@ -62,12 +62,12 @@ public class SimulationNode implements Serializable { nodeCount++; } - public SimulationNode(Game game, List abilities, int depth, UUID playerId) { + public SimulationNode2(Game game, List abilities, int depth, UUID playerId) { this(game, depth, playerId); this.abilities = abilities; } - public SimulationNode(Game game, Ability ability, int depth, UUID playerId) { + public SimulationNode2(Game game, Ability ability, int depth, UUID playerId) { this(game, depth, playerId); this.abilities = new ArrayList(); abilities.add(ability); @@ -97,7 +97,7 @@ public class SimulationNode implements Serializable { return this.abilities; } - public List getChildren() { + public List getChildren() { return this.children; } diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationWorker.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationWorker2.java similarity index 89% rename from Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationWorker.java rename to Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationWorker2.java index b5a5876ef0..f4affdff88 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationWorker.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/SimulationWorker2.java @@ -39,16 +39,16 @@ import mage.util.Logging; * * @author BetaSteward_at_googlemail.com */ -public class SimulationWorker implements Callable { +public class SimulationWorker2 implements Callable { - private final static Logger logger = Logging.getLogger(SimulationWorker.class.getName()); + private final static Logger logger = Logging.getLogger(SimulationWorker2.class.getName()); private Game game; - private SimulatedAction previousActions; + private SimulatedAction2 previousActions; private Ability action; - private SimulatedPlayer player; + private SimulatedPlayer2 player; - public SimulationWorker(Game game, SimulatedPlayer player, SimulatedAction previousActions, Ability action) { + public SimulationWorker2(Game game, SimulatedPlayer2 player, SimulatedAction2 previousActions, Ability action) { this.game = game; this.player = player; this.previousActions = previousActions; diff --git a/Mage.Tests/config/logging.properties b/Mage.Tests/config/logging.properties index 7d350d8575..5774904804 100644 --- a/Mage.Tests/config/logging.properties +++ b/Mage.Tests/config/logging.properties @@ -1,5 +1,5 @@ # Default global logging level. -.level=FINER +.level=ALL # Set the default logging level for new ConsoleHandler instances java.util.logging.ConsoleHandler.level = ALL \ No newline at end of file diff --git a/Mage.Tests/plugins/mage-player-ai-ma.jar b/Mage.Tests/plugins/mage-player-ai-ma.jar index 2bf8e7c4aa3727e092cfa255082e1f523b0af282..0891171fea72cda55c7015bf5602659fb8336e27 100644 GIT binary patch delta 34029 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%0Dqu^+k`aPxGQ2=pD%uy@U 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