mirror of
https://github.com/correl/mage.git
synced 2025-04-12 17:00:08 -09:00
* Odric Master Tactician - Fixed that the game didn't leave the block phase controlled by the controller of Odric.
This commit is contained in:
parent
1a81c42441
commit
0d37d1593b
14 changed files with 39 additions and 25 deletions
Mage.Server.Plugins
Mage.Player.AI.MA/src/mage/player/ai
Mage.Player.AIMCTS/src/mage/player/ai
Mage.Player.AIMinimax/src/mage/player/ai
Mage.Player.Human/src/mage/player/human
Mage.Sets/src/mage/sets/magic2013
Mage.Tests/src/test/java/org/mage/test/player
Mage/src/mage
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -213,7 +213,7 @@ public class ComputerPlayerMCTS extends ComputerPlayer<ComputerPlayerMCTS> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<Permanent> 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++;
|
||||
|
|
|
@ -674,7 +674,7 @@ public class ComputerPlayer2 extends ComputerPlayer<ComputerPlayer2> 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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -621,7 +621,7 @@ public class HumanPlayer extends PlayerImpl<HumanPlayer> {
|
|||
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<HumanPlayer> {
|
|||
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<HumanPlayer> {
|
|||
if (response.getBoolean() != null) {
|
||||
// do nothing
|
||||
} else if (response.getUUID() != null) {
|
||||
declareBlocker(blockerId, response.getUUID(), game);
|
||||
declareBlocker(defenderId, blockerId, response.getUUID(), game);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -152,8 +152,13 @@ class OdricMasterTacticianEffect extends ReplacementEffectImpl<OdricMasterTactic
|
|||
if (game.isPaused() || game.isGameOver()) {
|
||||
return true;
|
||||
}
|
||||
choose = game.getCombat().checkBlockRestrictions(game.getPlayer(defenderId), game);
|
||||
choose |= !game.getCombat().checkBlockRequirementsAfter(game.getPlayer(defenderId), player, game);
|
||||
if (!game.getCombat().checkBlockRestrictions(game.getPlayer(defenderId), game)) {
|
||||
// only human player can decide to do the block in another way
|
||||
if (player.isHuman()) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
choose = !game.getCombat().checkBlockRequirementsAfter(game.getPlayer(defenderId), player, game);
|
||||
}
|
||||
game.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_BLOCKERS, defenderId, defenderId));
|
||||
}
|
||||
|
|
|
@ -207,7 +207,7 @@ public class RandomPlayer extends ComputerPlayer<RandomPlayer> {
|
|||
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++;
|
||||
|
|
|
@ -163,7 +163,7 @@ public class TestPlayer extends ComputerPlayer<TestPlayer> {
|
|||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -246,6 +246,8 @@ public class Combat implements Serializable, Copyable<Combat> {
|
|||
|
||||
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<Combat> {
|
|||
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<Combat> {
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -272,7 +272,7 @@ public interface Player extends MageItem, Copyable<Player> {
|
|||
void pickCard(List<Card> 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<Permanent> getAvailableAttackers(Game game);
|
||||
List<Permanent> getAvailableBlockers(Game game);
|
||||
|
||||
|
|
|
@ -1390,10 +1390,10 @@ public abstract class PlayerImpl<T extends PlayerImpl<T>> 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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue