1
0
Fork 0
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:
LevelX2 2013-08-06 18:26:49 +02:00
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

View file

@ -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);
}
}
}

View file

@ -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();

View file

@ -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);
}
}
}

View file

@ -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);
}
}
}

View file

@ -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++;

View file

@ -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)

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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));
}

View file

@ -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++;

View file

@ -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);
}
}
}

View file

@ -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;
}
}

View file

@ -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);

View file

@ -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);
}