diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 4df57f6601b..7ed6cdc9cf2 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -542,11 +542,16 @@ public class AiAttackController { } Player prefDefender = (Player) (defs.contains(this.defendingOpponent) ? this.defendingOpponent : defs.get(0)); - final GameEntity entity = ai.getMustAttackEntity(); + // Attempt to see if there's a defined entity that must be attacked strictly this turn... + GameEntity entity = ai.getMustAttackEntityThisTurn(); + if (entity == null) { + // ...or during the attacking creature controller's turn + entity = ai.getMustAttackEntity(); + } if (null != entity) { int n = defs.indexOf(entity); if (-1 == n) { - System.out.println("getMustAttackEntity() returned something not in defenders."); + System.out.println("getMustAttackEntity() or getMustAttackEntityThisTurn() returned something not in defenders."); return prefDefender; } else { return entity; @@ -649,7 +654,7 @@ public class AiAttackController { } } } - if (mustAttack || attacker.getController().getMustAttackEntity() != null) { + if (mustAttack || attacker.getController().getMustAttackEntity() != null || attacker.getController().getMustAttackEntityThisTurn() != null) { combat.addAttacker(attacker, defender); attackersLeft.remove(attacker); numForcedAttackers++; diff --git a/forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java index 07ca9671b61..5d8e95be4ed 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java @@ -61,14 +61,21 @@ public class MustAttackEffect extends SpellAbilityEffect { for (final Player p : tgtPlayers) { if ((tgt == null) || p.canBeTargetedBy(sa)) { - p.setMustAttackEntity(entity); - p.setMustAttackEntityThisTurn(thisTurn); + if (thisTurn) { + p.setMustAttackEntityThisTurn(entity); + } else { + p.setMustAttackEntity(entity); + } + } } for (final Card c : getTargetCards(sa)) { if ((tgt == null) || c.canBeTargetedBy(sa)) { - c.setMustAttackEntity(entity); - c.setMustAttackEntityThisTurn(thisTurn); + if (thisTurn) { + c.setMustAttackEntityThisTurn(entity); + } else { + c.setMustAttackEntity(entity); + } } } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index a50ae1d3c57..d4be17dcc8f 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -108,7 +108,7 @@ public class Card extends GameEntity implements Comparable { private GameEntity enchanting = null; private GameEntity mustAttackEntity = null; - private boolean mustAttackEntityThisTurn = false; + private GameEntity mustAttackEntityThisTurn = null; private final Map mayPlay = Maps.newTreeMap(); private int mayPlayTurn = 0; @@ -950,13 +950,13 @@ public class Card extends GameEntity implements Comparable { return mustAttackEntity; } public final void clearMustAttackEntity(final Player playerturn) { - if (getController().equals(playerturn) || mustAttackEntityThisTurn) { + if (getController().equals(playerturn)) { mustAttackEntity = null; - mustAttackEntityThisTurn = false; } + mustAttackEntityThisTurn = null; } - public final boolean getMustAttackEntityThisTurn() { return mustAttackEntityThisTurn; } - public final void setMustAttackEntityThisTurn(boolean thisTurnOnly) { mustAttackEntityThisTurn = thisTurnOnly; } + public final GameEntity getMustAttackEntityThisTurn() { return mustAttackEntityThisTurn; } + public final void setMustAttackEntityThisTurn(GameEntity entThisTurn) { mustAttackEntityThisTurn = entThisTurn; } public final CardCollectionView getClones() { return CardCollection.getView(clones); diff --git a/forge-game/src/main/java/forge/game/combat/AttackRequirement.java b/forge-game/src/main/java/forge/game/combat/AttackRequirement.java index eb698d3b7b2..d12ddae0183 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackRequirement.java +++ b/forge-game/src/main/java/forge/game/combat/AttackRequirement.java @@ -32,6 +32,10 @@ public class AttackRequirement { if (mustAttack != null) { defenderSpecific.add(mustAttack); } + final GameEntity mustAttackThisTurn = attacker.getController().getMustAttackEntityThisTurn(); + if (mustAttackThisTurn != null) { + defenderSpecific.add(mustAttackThisTurn); + } int nAttackAnything = 0; @@ -54,6 +58,10 @@ public class AttackRequirement { if (mustAttack3 != null) { defenderSpecific.add(mustAttack3); } + final GameEntity mustAttackThisTurn3 = attacker.getMustAttackEntityThisTurn(); + if (mustAttackThisTurn3 != null) { + defenderSpecific.add(mustAttackThisTurn3); + } final Game game = attacker.getGame(); for (final GameEntity defender : possibleDefenders) { diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 83efd916141..714695bd5c1 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -152,7 +152,7 @@ public class Player extends GameEntity implements Comparable { private Map changedKeywords = new ConcurrentSkipListMap(); private ManaPool manaPool = new ManaPool(this); private GameEntity mustAttackEntity = null; - private boolean mustAttackEntityThisTurn = false; + private GameEntity mustAttackEntityThisTurn = null; private boolean attackedWithCreatureThisTurn = false; private boolean activateLoyaltyAbilityThisTurn = false; private boolean tappedLandForManaThisTurn = false; @@ -2191,8 +2191,8 @@ public class Player extends GameEntity implements Comparable { public final void setMustAttackEntity(final GameEntity o) { mustAttackEntity = o; } - public final boolean getMustAttackEntityThisTurn() { return mustAttackEntityThisTurn; } - public final void setMustAttackEntityThisTurn(boolean thisTurnOnly) { mustAttackEntityThisTurn = thisTurnOnly; } + public final GameEntity getMustAttackEntityThisTurn() { return mustAttackEntityThisTurn; } + public final void setMustAttackEntityThisTurn(GameEntity entThisTurn) { mustAttackEntityThisTurn = entThisTurn; } @Override public int compareTo(Player o) {