diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java index eee1894258b..3644dd69017 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java @@ -244,7 +244,7 @@ public enum TargetingOverlay { }); } for (final CardView attackingCard : combat.getAttackers()) { - final Iterable cards = combat.getBlockers(attackingCard); + final Iterable cards = combat.getPlannedBlockers(attackingCard); if (cards == null) continue; for (final CardView blockingCard : cards) { if (!attackingCard.equals(c) && !blockingCard.equals(c)) { continue; } diff --git a/forge-gui/src/main/java/forge/view/CombatView.java b/forge-gui/src/main/java/forge/view/CombatView.java index d8d4c6c23f0..da2cc22bee4 100644 --- a/forge-gui/src/main/java/forge/view/CombatView.java +++ b/forge-gui/src/main/java/forge/view/CombatView.java @@ -24,6 +24,9 @@ public class CombatView { private Map, GameEntityView> bandsWithDefenders = Maps.newHashMap(); private Map, Iterable> bandsWithBlockers = Maps.newHashMap(); + private Map> attackersWithPlannedBlockers = Maps.newHashMap(); + private Map, Iterable> bandsWithPlannedBlockers = Maps.newHashMap(); + public CombatView() { } @@ -68,6 +71,15 @@ public class CombatView { return attackersWithBlockers.get(attacker); } + /** + * @param attacker + * @return the blockers associated with an attacker, or {@code null} if the + * attacker is unblocked (planning stage, for targeting overlay). + */ + public Iterable getPlannedBlockers(final CardView attacker) { + return attackersWithPlannedBlockers.get(attacker); + } + /** * Get an {@link Iterable} of the blockers of the specified band, or * {@code null} if that band is unblocked. @@ -80,6 +92,18 @@ public class CombatView { return bandsWithBlockers.get(attackingBand); } + /** + * Get an {@link Iterable} of the blockers of the specified band, or + * {@code null} if that band is unblocked (planning stage, for targeting overlay). + * + * @param attackingBand + * an {@link Iterable} representing an attacking band. + * @return an {@link Iterable} of {@link CardView} objects, or {@code null}. + */ + public Iterable getPlannedBlockers(final Iterable attackingBand) { + return bandsWithPlannedBlockers.get(attackingBand); + } + public Iterable getAttackersOf(final GameEntityView defender) { return Maps.filterValues(attackersWithDefenders, Predicates.equalTo(defender)).keySet(); } @@ -87,21 +111,29 @@ public class CombatView { return Maps.filterValues(bandsWithDefenders, Predicates.equalTo(defender)).keySet(); } - public void addAttackingBand(final Iterable attackingBand, final GameEntityView defender, final Iterable blockers) { - final List attackingBandCopy = Lists.newArrayList(attackingBand), - blockersCopy; - if (blockers == null) { - blockersCopy = null; - } else { + public void addPlannedBlockers(final CardView attacker, final Iterable blockers) { + List blockersCopy = null; + if (blockers != null) { blockersCopy = Lists.newArrayList(blockers); } + this.attackersWithPlannedBlockers.put(attacker, blockersCopy); + } + + public void addAttackingBand(final Iterable attackingBand, final GameEntityView defender, final Iterable blockers, final Iterable plannedBlockers) { + final List attackingBandCopy = Lists.newArrayList(attackingBand), + blockersCopy, plannedBlockersCopy; + + blockersCopy = blockers == null ? null : Lists.newArrayList(blockers); + plannedBlockersCopy = plannedBlockers == null ? null : Lists.newArrayList(plannedBlockers); for (final CardView attacker : attackingBandCopy) { this.attackersWithDefenders.put(attacker, defender); this.attackersWithBlockers.put(attacker, blockersCopy); + this.attackersWithPlannedBlockers.put(attacker, plannedBlockersCopy); } this.bandsWithDefenders.put(attackingBandCopy, defender); this.bandsWithBlockers.put(attackingBandCopy, blockersCopy); + this.bandsWithPlannedBlockers.put(attackingBandCopy, plannedBlockersCopy); } } diff --git a/forge-gui/src/main/java/forge/view/LocalGameView.java b/forge-gui/src/main/java/forge/view/LocalGameView.java index edc0a1079aa..2c6ce1824d3 100644 --- a/forge-gui/src/main/java/forge/view/LocalGameView.java +++ b/forge-gui/src/main/java/forge/view/LocalGameView.java @@ -184,7 +184,8 @@ public abstract class LocalGameView implements IGameView { combatView.addAttackingBand( getCardViews(b.getAttackers()), getGameEntityView(defender), - blockers == null || !isBlocked ? null : getCardViews(blockers)); + blockers == null || !isBlocked ? null : getCardViews(blockers), + blockers == null ? null : getCardViews(blockers)); } return combatView; }