blockers = localCombat.getBlockers(band);
+ boolean blocked = (blockers == null);
+ boolean isBand = bandSize > 1;
+ if (isBand) {
+ // Only print Band data if it's actually a band
+ display.append(" > BAND");
+ display.append(blocked ? " (blocked)" : " >>>");
+ display.append("\n");
+ }
+
+ for (final CardView attacker : band) {
+ display.append(" > ");
+ display.append(combatantToString(attacker)).append("\n");
+ }
+
+ if (!isBand) {
+ if (blockers != null && Iterables.isEmpty(blockers)) {
+ // if single creature is blocked, but no longer has blockers, tell the user!
+ display.append(" (blocked)\n");
+ } else {
+ display.append(" >>>\n");
+ }
+ }
+
+ for (final CardView blocker : blockers) {
+ display.append(" < ").append(combatantToString(blocker)).append("\n");
+ }
+ previousBand = isBand;
+ }
+
+ return display.toString();
+ }
+
/**
*
* combatantToString.
@@ -131,15 +139,15 @@ public enum CCombat implements ICDoc {
* a {@link forge.game.card.Card} object.
* @return a {@link java.lang.String} object.
*/
- private static String combatantToString(final Card c) {
+ private static String combatantToString(final CardView c) {
final StringBuilder sb = new StringBuilder();
+ final CardStateView state = c.getState();
- final String name = (c.isFaceDown()) ? "Morph" : c.getName();
-
- sb.append("( ").append(c.getNetAttack()).append(" / ").append(c.getNetDefense()).append(" ) ... ");
+ final String name = state.getName();
+
+ sb.append("( ").append(state.getPower()).append(" / ").append(state.getToughness()).append(" ) ... ");
sb.append(name);
- sb.append(" [").append(c.getUniqueNumber()).append("] ");
-
+ sb.append(" [").append(c.getId()).append("] ");
return sb.toString();
}
diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java
index 40552274f50..8f97298170f 100644
--- a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java
+++ b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java
@@ -17,7 +17,6 @@ import forge.deck.CardPool;
import forge.events.UiEvent;
import forge.game.GameType;
import forge.game.Match;
-import forge.game.combat.Combat;
import forge.game.phase.PhaseType;
import forge.game.player.IHasIcon;
import forge.game.player.RegisteredPlayer;
@@ -29,6 +28,7 @@ import forge.sound.IAudioClip;
import forge.sound.IAudioMusic;
import forge.util.ITriggerEvent;
import forge.view.CardView;
+import forge.view.CombatView;
import forge.view.GameEntityView;
import forge.view.IGameView;
import forge.view.PlayerView;
@@ -57,7 +57,7 @@ public interface IGuiBase {
boolean showBoxedProduct(final String title, final String message, final List list);
void fireEvent(UiEvent e);
void setCard(CardView card);
- void showCombat(Combat combat);
+ void showCombat(CombatView combat);
void setUsedToPay(CardView card, boolean b);
void setHighlighted(PlayerView player, boolean b);
void showPromptMessage(String message);
diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java
index abbfb00044e..37b0f756f12 100644
--- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java
+++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java
@@ -47,6 +47,7 @@ import forge.game.card.Card;
import forge.game.card.CardFactoryUtil;
import forge.game.card.CardShields;
import forge.game.card.CounterType;
+import forge.game.combat.AttackingBand;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.cost.Cost;
@@ -1355,10 +1356,11 @@ public class PlayerControllerHuman extends PlayerController implements IGameView
}
private final void updateCombatView(final Combat combat) {
- for (final Card c : combat.getAttackers()) {
- final GameEntity defender = combat.getDefenderByAttacker(c);
- final List blockers = combat.getBlockers(c);
- combatView.addAttacker(getCardView(c), getGameEntityView(defender), getCardViews(blockers));
+ combatView.reset();
+ for (final AttackingBand b : combat.getAttackingBands()) {
+ final GameEntity defender = combat.getDefenderByAttacker(b);
+ final List blockers = b.isBlocked() ? combat.getBlockers(b) : null;
+ combatView.addAttackingBand(getCardViews(b.getAttackers()), getGameEntityView(defender), getCardViews(blockers));
}
}
diff --git a/forge-gui/src/main/java/forge/view/CombatView.java b/forge-gui/src/main/java/forge/view/CombatView.java
index 15c545bd9c9..717d25eeeb9 100644
--- a/forge-gui/src/main/java/forge/view/CombatView.java
+++ b/forge-gui/src/main/java/forge/view/CombatView.java
@@ -4,19 +4,30 @@ import java.util.Map;
import com.google.common.base.Predicates;
import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
public class CombatView {
private Map attackersWithDefenders;
private Map> attackersWithBlockers;
+ private Map, GameEntityView> bandsWithDefenders;
+ private Map, Iterable> bandsWithBlockers;
public CombatView() {
}
+ public int getNumAttackers() {
+ return attackersWithDefenders.size();
+ }
+
public Iterable getAttackers() {
return attackersWithDefenders.keySet();
}
+ public Iterable getDefenders() {
+ return Sets.newHashSet(attackersWithDefenders.values());
+ }
+
public GameEntityView getDefender(final CardView attacker) {
return attackersWithDefenders.get(attacker);
}
@@ -25,13 +36,38 @@ public class CombatView {
return attackersWithBlockers.get(attacker);
}
+ /**
+ * Get an {@link Iterable} of the blockers of the specified band, or
+ * {@code null} if that band is unblocked.
+ *
+ * @param attackingBand
+ * an {@link Iterable} representing an attacking band.
+ * @return an {@link Iterable} of {@link CardView} objects, or {@code null}.
+ */
+ public Iterable getBlockers(final Iterable attackingBand) {
+ return bandsWithBlockers.get(attackingBand);
+ }
+
public Iterable getAttackersOf(final GameEntityView defender) {
return Maps.filterValues(attackersWithDefenders, Predicates.equalTo(defender)).keySet();
}
-
- public void addAttacker(final CardView attacker, final GameEntityView defender, final Iterable blockers) {
- this.attackersWithDefenders.put(attacker, defender);
- this.attackersWithBlockers.put(attacker, blockers);
+ public Iterable> getAttackingBandsOf(final GameEntityView defender) {
+ return Maps.filterValues(bandsWithDefenders, Predicates.equalTo(defender)).keySet();
}
+ public void addAttackingBand(final Iterable attackingBand, final GameEntityView defender, final Iterable blockers) {
+ for (final CardView attacker : attackingBand) {
+ this.attackersWithDefenders.put(attacker, defender);
+ this.attackersWithBlockers.put(attacker, blockers);
+ }
+ this.bandsWithDefenders.put(attackingBand, defender);
+ this.bandsWithBlockers.put(attackingBand, blockers);
+ }
+
+ public void reset() {
+ this.attackersWithDefenders = Maps.newHashMap();
+ this.attackersWithBlockers = Maps.newHashMap();
+ this.bandsWithDefenders = Maps.newHashMap();
+ this.bandsWithBlockers = Maps.newHashMap();
+ }
}