diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java index 14a6cdde2c3..ff2e4cc0fdb 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java @@ -449,7 +449,7 @@ public class ComputerPlayer7 extends ComputerPlayer6 implements Player { if (group.getAttackers().size() > 0) { UUID attackerId = group.getAttackers().get(0); for (UUID blockerId: group.getBlockers()) { - sim.getPlayer(defenderId).declareBlocker(blockerId, attackerId, sim); + sim.getPlayer(defenderId).declareBlocker(defenderId, blockerId, attackerId, sim); } } } diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/util/CombatUtil.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/util/CombatUtil.java index 27d70923537..262523582ef 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/util/CombatUtil.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/util/CombatUtil.java @@ -209,7 +209,7 @@ public class CombatUtil { return null; } - sim.getPlayer(defendingPlayerId).declareBlocker(blocker.getId(), attacker.getId(), sim); + sim.getPlayer(defendingPlayerId).declareBlocker(defendingPlayerId, blocker.getId(), attacker.getId(), sim); sim.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_BLOCKERS, defendingPlayerId, defendingPlayerId)); sim.checkStateAndTriggered(); diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java index f0922964fa8..36b9bc806db 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java +++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java @@ -213,7 +213,7 @@ public class ComputerPlayerMCTS extends ComputerPlayer imple for (int i = 0; i < groups.size(); i++) { if (i < combat.getGroups().size()) { for (UUID blockerId: combat.getGroups().get(i).getBlockers()) { - this.declareBlocker(blockerId, groups.get(i).getAttackers().get(0), game); + this.declareBlocker(this.getId(), blockerId, groups.get(i).getAttackers().get(0), game); } } } diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java index 34e3ab323ab..5ac55f69c82 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java +++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java @@ -174,7 +174,7 @@ public class MCTSNode { for (int i = 0; i < groups.size(); i++) { if (i < block.size()) { for (UUID blockerId: block.get(i)) { - simPlayer.declareBlocker(blockerId, groups.get(i).getAttackers().get(0), sim); + simPlayer.declareBlocker(simPlayer.getId(), blockerId, groups.get(i).getAttackers().get(0), sim); } } } diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/SimulatedPlayerMCTS.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/SimulatedPlayerMCTS.java index ab85da55bce..bcc24d5d7ec 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/SimulatedPlayerMCTS.java +++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/SimulatedPlayerMCTS.java @@ -196,15 +196,18 @@ public class SimulatedPlayerMCTS extends MCTSPlayer { public void selectBlockers(Game game, UUID defendingPlayerId) { // logger.info("select blockers"); int numGroups = game.getCombat().getGroups().size(); - if (numGroups == 0) return; + if (numGroups == 0) { + return; + } List blockers = getAvailableBlockers(game); for (Permanent blocker: blockers) { int check = rnd.nextInt(numGroups + 1); if (check < numGroups) { CombatGroup group = game.getCombat().getGroups().get(check); - if (group.getAttackers().size() > 0) - this.declareBlocker(blocker.getId(), group.getAttackers().get(0), game); + if (group.getAttackers().size() > 0) { + this.declareBlocker(this.getId(), blocker.getId(), group.getAttackers().get(0), game); + } } } actionCount++; diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java index fb3c1ce7005..881130ca1fb 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java +++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java @@ -674,7 +674,7 @@ public class ComputerPlayer2 extends ComputerPlayer implements for (int i = 0; i < groups.size(); i++) { if (i < combat.getGroups().size()) { for (UUID blockerId: combat.getGroups().get(i).getBlockers()) { - this.declareBlocker(blockerId, groups.get(i).getAttackers().get(0), game); + this.declareBlocker(defendingPlayerId, blockerId, groups.get(i).getAttackers().get(0), game); if (logger.isDebugEnabled()) { Permanent blocker = game.getPermanent(blockerId); if (blocker != null) diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java index b70b33bce50..ee3e42d2610 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java +++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer3.java @@ -351,14 +351,16 @@ public class ComputerPlayer3 extends ComputerPlayer2 implements Player { } } } - if (val == null) + if (val == null) { val = GameStateEvaluator.evaluate(playerId, game); + } if (bestNode != null) { node.children.clear(); node.children.add(bestNode); } - if (logger.isDebugEnabled()) + if (logger.isDebugEnabled()) { logger.debug(indent(node.depth) + "returning -- combat attacker score: " + val + " depth:" + node.depth + " for player:" + game.getPlayer(node.getPlayerId()).getName()); + } return val; } @@ -373,8 +375,9 @@ public class ComputerPlayer3 extends ComputerPlayer2 implements Player { //check if defender is being attacked if (game.getCombat().isAttacked(defenderId, game)) { SimulatedPlayer defender = (SimulatedPlayer) game.getPlayer(defenderId); - if (logger.isDebugEnabled()) + if (logger.isDebugEnabled()) { logger.debug(indent(node.depth) + defender.getName() + "'s possible blockers: " + defender.getAvailableBlockers(game)); + } for (Combat engagement: defender.addBlockers(game)) { if (alpha >= beta) { logger.debug(indent(node.depth) + "simulating -- pruning blockers"); @@ -385,14 +388,15 @@ public class ComputerPlayer3 extends ComputerPlayer2 implements Player { if (group.getAttackers().size() > 0) { UUID attackerId = group.getAttackers().get(0); for (UUID blockerId: group.getBlockers()) { - sim.getPlayer(defenderId).declareBlocker(blockerId, attackerId, sim); + sim.getPlayer(defenderId).declareBlocker(defenderId, blockerId, attackerId, sim); } } } sim.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_BLOCKERS, defenderId, defenderId)); SimulationNode newNode = new SimulationNode(node, sim, defenderId); - if (logger.isDebugEnabled()) + if (logger.isDebugEnabled()) { logger.debug(indent(node.depth) + "simulating block for player:" + game.getPlayer(defenderId).getName()); + } sim.checkStateAndTriggered(); while (!sim.getStack().isEmpty()) { sim.getStack().resolve(sim); diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index ff526bc26a6..499f33763e1 100644 --- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -621,7 +621,7 @@ public class HumanPlayer extends PlayerImpl { Permanent blocker = game.getPermanent(response.getUUID()); if (blocker != null) { if (filter.match(blocker, null, playerId, game)) { - selectCombatGroup(blocker.getId(), game); + selectCombatGroup(defendingPlayerId, blocker.getId(), game); } else if (filterBlock.match(blocker, null, playerId, game) && game.getStack().isEmpty()) { game.getCombat().removeBlocker(blocker.getId(), game); @@ -666,7 +666,7 @@ public class HumanPlayer extends PlayerImpl { return null; } - protected void selectCombatGroup(UUID blockerId, Game game) { + protected void selectCombatGroup(UUID defenderId, UUID blockerId, Game game) { updateGameStatePriority("selectCombatGroup", game); TargetAttackingCreature target = new TargetAttackingCreature(); game.fireSelectTargetEvent(playerId, "Select attacker to block", target.possibleTargets(null, playerId, game), target.isRequired(), null); @@ -674,7 +674,7 @@ public class HumanPlayer extends PlayerImpl { if (response.getBoolean() != null) { // do nothing } else if (response.getUUID() != null) { - declareBlocker(blockerId, response.getUUID(), game); + declareBlocker(defenderId, blockerId, response.getUUID(), game); } } diff --git a/Mage.Sets/src/mage/sets/magic2013/OdricMasterTactician.java b/Mage.Sets/src/mage/sets/magic2013/OdricMasterTactician.java index f9eb2783edd..3a1f1ac9b72 100644 --- a/Mage.Sets/src/mage/sets/magic2013/OdricMasterTactician.java +++ b/Mage.Sets/src/mage/sets/magic2013/OdricMasterTactician.java @@ -152,8 +152,13 @@ class OdricMasterTacticianEffect extends ReplacementEffectImpl { if (check < numGroups) { CombatGroup group = game.getCombat().getGroups().get(check); if (group.getAttackers().size() > 0) - this.declareBlocker(blocker.getId(), group.getAttackers().get(0), game); + this.declareBlocker(this.getId(), blocker.getId(), group.getAttackers().get(0), game); } } actionCount++; diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 5b8abac74ce..c3afffea621 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -163,7 +163,7 @@ public class TestPlayer extends ComputerPlayer { filterAttacker.add(new NamePredicate(groups[1])); Permanent attacker = findPermanent(filterAttacker, opponentId, game); if (attacker != null) { - this.declareBlocker(blocker.getId(), attacker.getId(), game); + this.declareBlocker(defendingPlayerId, blocker.getId(), attacker.getId(), game); } } } diff --git a/Mage/src/mage/game/combat/Combat.java b/Mage/src/mage/game/combat/Combat.java index 6171031f3b0..b092a7a1d9d 100644 --- a/Mage/src/mage/game/combat/Combat.java +++ b/Mage/src/mage/game/combat/Combat.java @@ -246,6 +246,8 @@ public class Combat implements Serializable, Copyable { public void selectBlockers(Game game) { if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.DECLARING_BLOCKERS, attackerId, attackerId))) { + + // !! Attention: Changes to this block must be also done in card "OdricMaster Tactician". Player player = game.getPlayer(attackerId); //20101001 - 509.1c checkBlockRequirementsBefore(player, game); @@ -314,7 +316,7 @@ public class Combat implements Serializable, Copyable { UUID attackId = effect.mustBlockAttacker(ability, game); Player defender = game.getPlayer(creature.getControllerId()); if (attackId != null && defender != null) { - defender.declareBlocker(creature.getId(), attackId, game); + defender.declareBlocker(defender.getId(), creature.getId(), attackId, game); } } } @@ -345,7 +347,7 @@ public class Combat implements Serializable, Copyable { if (defender != null) { for (UUID attackingCreatureId : getAttackers()) { if (creature.canBlock(attackingCreatureId, game)) { - defender.declareBlocker(creature.getId(), attackingCreatureId, game); + defender.declareBlocker(defender.getId(), creature.getId(), attackingCreatureId, game); break; } } diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java index 007c4f23522..71ed7404676 100644 --- a/Mage/src/mage/players/Player.java +++ b/Mage/src/mage/players/Player.java @@ -272,7 +272,7 @@ public interface Player extends MageItem, Copyable { void pickCard(List cards, Deck deck, Draft draft); void declareAttacker(UUID attackerId, UUID defenderId, Game game); - void declareBlocker(UUID blockerId, UUID attackerId, Game game); + void declareBlocker(UUID defenderId, UUID blockerId, UUID attackerId, Game game); List getAvailableAttackers(Game game); List getAvailableBlockers(Game game); diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index a68b5bac222..25775e5b415 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -1390,10 +1390,10 @@ public abstract class PlayerImpl> implements Player, Ser } @Override - public void declareBlocker(UUID blockerId, UUID attackerId, Game game) { + public void declareBlocker(UUID defenderId, UUID blockerId, UUID attackerId, Game game) { Permanent blocker = game.getPermanent(blockerId); CombatGroup group = game.getCombat().findGroup(attackerId); - if (blocker != null && group != null && group.canBlock(blocker, game) && blocker.getControllerId().equals(playerId)) { + if (blocker != null && group != null && group.canBlock(blocker, game) && blocker.getControllerId().equals(defenderId)) { group.addBlocker(blockerId, playerId, game); game.getCombat().addBlockingGroup(blockerId, attackerId, playerId, game); }