* Fixed a bug that caused creatures forced to attack could prevent to attack by deselecting the forced creature or be able to attack another defender by using the Attack All button.

This commit is contained in:
LevelX2 2015-10-06 22:22:37 +02:00
parent 7f8854aa0f
commit 0176478441
4 changed files with 33 additions and 25 deletions

View file

@ -905,6 +905,15 @@ public class HumanPlayer extends PlayerImpl {
attackedDefender, attacker.getId(), attacker.getControllerId()), game)) { attackedDefender, attacker.getId(), attacker.getControllerId()), game)) {
continue; continue;
} }
// if attacker needs a specific defender to attack so select that one instead
if (game.getCombat().getCreaturesForcedToAttack().containsKey(attacker.getId())) {
Set<UUID> possibleDefenders = game.getCombat().getCreaturesForcedToAttack().get(attacker.getId());
if (!possibleDefenders.isEmpty() && !possibleDefenders.contains(attackedDefender)) {
declareAttacker(attacker.getId(), possibleDefenders.iterator().next(), game, false);
continue;
}
}
// attack selected default defender
declareAttacker(attacker.getId(), attackedDefender, game, false); declareAttacker(attacker.getId(), attackedDefender, game, false);
} }
} else if (response.getBoolean() != null) { } else if (response.getBoolean() != null) {
@ -926,14 +935,18 @@ public class HumanPlayer extends PlayerImpl {
} else { } else {
Permanent creature = game.getPermanent(creatureId); Permanent creature = game.getPermanent(creatureId);
if (creature != null) { if (creature != null) {
sb.append(creature.getName()).append(" "); sb.append(creature.getIdName()).append(" ");
} }
} }
} }
if (game.getCombat().getMaxAttackers() > forcedAttackers) { if (game.getCombat().getMaxAttackers() > forcedAttackers) {
game.informPlayer(this, sb.insert(0, " more attacker(s) that are forced to attack.\nCreatures forced to attack: ") int requireToAttack = Math.min(game.getCombat().getMaxAttackers() - forcedAttackers, game.getCombat().getCreaturesForcedToAttack().size() - forcedAttackers);
.insert(0, Math.min(game.getCombat().getMaxAttackers() - forcedAttackers, game.getCombat().getCreaturesForcedToAttack().size() - forcedAttackers)) String message = (requireToAttack == 1 ? " more attacker that is " : " more attackers that are ")
+ "forced to attack.\nCreature"
+ (requireToAttack == 1 ? "" : "s") + " forced to attack: ";
game.informPlayer(this, sb.insert(0, message)
.insert(0, requireToAttack)
.insert(0, "You have to attack with ").toString()); .insert(0, "You have to attack with ").toString());
continue; continue;
} }
@ -989,7 +1002,7 @@ public class HumanPlayer extends PlayerImpl {
possibleDefender = defenders; possibleDefender = defenders;
} }
if (possibleDefender.size() == 1) { if (possibleDefender.size() == 1) {
declareAttacker(attackerId, defenders.iterator().next(), game, true); declareAttacker(attackerId, possibleDefender.iterator().next(), game, true);
return true; return true;
} else { } else {
TargetDefender target = new TargetDefender(possibleDefender, attackerId); TargetDefender target = new TargetDefender(possibleDefender, attackerId);

View file

@ -32,10 +32,8 @@ import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility; import mage.abilities.LoyaltyAbility;
import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.CountersCount; import mage.abilities.dynamicvalue.common.CountersCount;
import mage.abilities.dynamicvalue.common.PermanentsTargetOpponentControlsCount; import mage.abilities.dynamicvalue.common.PermanentsTargetOpponentControlsCount;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.PreventAllDamageToSourceEffect; import mage.abilities.effects.common.PreventAllDamageToSourceEffect;
import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;

View file

@ -160,10 +160,7 @@ class GideonBattleForgedAttacksIfAbleTargetEffect extends RequirementEffect {
if (nextTurnTargetController == 0 && startingTurn != game.getTurnNum() && game.getActivePlayerId().equals(targetPermanent.getControllerId())) { if (nextTurnTargetController == 0 && startingTurn != game.getTurnNum() && game.getActivePlayerId().equals(targetPermanent.getControllerId())) {
nextTurnTargetController = game.getTurnNum(); nextTurnTargetController = game.getTurnNum();
} }
if (game.getPhase().getType() == TurnPhase.END && nextTurnTargetController > 0 && game.getTurnNum() > nextTurnTargetController) { return game.getPhase().getType() == TurnPhase.END && nextTurnTargetController > 0 && game.getTurnNum() > nextTurnTargetController;
return true;
}
return false;
} }
@Override @Override

View file

@ -294,9 +294,9 @@ public class Combat implements Serializable, Copyable<Combat> {
} }
// force attack only if a defender can be attacked without paying a cost // force attack only if a defender can be attacked without paying a cost
if (!defendersCostlessAttackable.isEmpty()) { if (!defendersCostlessAttackable.isEmpty()) {
creaturesForcedToAttack.put(creature.getId(), defendersForcedToAttack);
// No need to attack a special defender // No need to attack a special defender
if (defendersForcedToAttack.isEmpty()) { if (defendersForcedToAttack.isEmpty()) {
creaturesForcedToAttack.put(creature.getId(), defendersForcedToAttack);
if (defendersForcedToAttack.isEmpty()) { if (defendersForcedToAttack.isEmpty()) {
if (defendersCostlessAttackable.size() == 1) { if (defendersCostlessAttackable.size() == 1) {
player.declareAttacker(creature.getId(), defenders.iterator().next(), game, false); player.declareAttacker(creature.getId(), defenders.iterator().next(), game, false);