From 0c785abb466728c5eac3455a3870c062c911000b Mon Sep 17 00:00:00 2001 From: magenoxx Date: Sun, 17 Jun 2012 13:13:51 +0400 Subject: [PATCH] New way for displaying combat --- .../src/main/java/mage/client/cards/Card.java | 9 +- .../mage/client/combat/CombatManager.java | 114 ++++++++++++++++++ .../java/mage/client/dialog/CombatDialog.java | 16 ++- .../main/java/mage/client/game/GamePanel.java | 7 +- .../plugins/adapters/MageActionCallback.java | 13 +- .../mage/client/util/gui/ArrowBuilder.java | 59 +++++++-- .../src/mage/view/CombatGroupView.java | 13 +- 7 files changed, 198 insertions(+), 33 deletions(-) create mode 100644 Mage.Client/src/main/java/mage/client/combat/CombatManager.java diff --git a/Mage.Client/src/main/java/mage/client/cards/Card.java b/Mage.Client/src/main/java/mage/client/cards/Card.java index 8b74eae6c38..88e3922fca7 100644 --- a/Mage.Client/src/main/java/mage/client/cards/Card.java +++ b/Mage.Client/src/main/java/mage/client/cards/Card.java @@ -361,14 +361,14 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis if (p != null) { Point target = p.getLocationOnScreen(); Point me = this.getLocationOnScreen(); - ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() - 40, Color.red); + ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() - 40, Color.red, ArrowBuilder.Type.TARGET); } else { for (PlayAreaPanel pa : MageFrame.getGame(gameId).getPlayers().values()) { MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(uuid); if (permanent != null) { Point target = permanent.getLocationOnScreen(); Point me = this.getLocationOnScreen(); - ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() + 10, Color.red); + ArrowBuilder.addArrow((int)me.getX() + 35, (int)me.getY(), (int)target.getX() + 40, (int)target.getY() + 10, Color.red, ArrowBuilder.Type.TARGET); } } } @@ -383,7 +383,10 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis if (popup != null) { popup.hide(); popupShowing = false; - ArrowBuilder.removeAllArrows(); + //ArrowBuilder.removeAllArrows(); + ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.TARGET); + ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.PAIRED); + ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.SOURCE); } } diff --git a/Mage.Client/src/main/java/mage/client/combat/CombatManager.java b/Mage.Client/src/main/java/mage/client/combat/CombatManager.java new file mode 100644 index 00000000000..7157b1a2fc0 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/combat/CombatManager.java @@ -0,0 +1,114 @@ +package mage.client.combat; + +import mage.cards.MagePermanent; +import mage.client.MageFrame; +import mage.client.game.PlayAreaPanel; +import mage.client.util.SettingsManager; +import mage.client.util.gui.ArrowBuilder; +import mage.view.CardView; +import mage.view.CombatGroupView; + +import javax.swing.*; +import java.awt.*; +import java.util.List; +import java.util.UUID; + +/** + * @author noxx + */ +public class CombatManager { + + private static CombatManager combatManager; + + public static CombatManager getInstance() { + if (combatManager == null) { + combatManager = new CombatManager(); + } + return combatManager; + } + + private Point parentPoint; + + public void showCombat(List combatView, UUID gameId) { + ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.COMBAT); + displayArrows(combatView, gameId); + } + + public void hideCombat() { + ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.COMBAT); + } + + private void displayArrows(List combatView, UUID gameId) { + parentPoint = null; + for (CombatGroupView group : combatView) { + for (CardView attacker : group.getAttackers().values()) { + drawAttacker(group, attacker, gameId); + } + } + } + + private void drawAttacker(CombatGroupView group, CardView attacker, UUID gameId) { + for (PlayAreaPanel pa2 : MageFrame.getGame(gameId).getPlayers().values()) { + MagePermanent attackerCard = pa2.getBattlefieldPanel().getPermanents().get(attacker.getId()); + if (attackerCard != null) { + drawDefender(group, attackerCard, gameId); + drawBlockers(group, attackerCard, gameId); + } + } + } + + private void drawDefender(CombatGroupView group, MagePermanent attackerCard, UUID gameId) { + UUID defenderId = group.getDefenderId(); + if (defenderId != null) { + parentPoint = getParentPoint(attackerCard); + PlayAreaPanel p = MageFrame.getGame(gameId).getPlayers().get(defenderId); + if (p != null) { + Point target = p.getLocationOnScreen(); + target.translate(-parentPoint.x, -parentPoint.y); + Point attackerPoint = attackerCard.getLocationOnScreen(); + attackerPoint.translate(-parentPoint.x, -parentPoint.y); + ArrowBuilder.addArrow((int) attackerPoint.getX() + 45, (int) attackerPoint.getY() + 25, (int) target.getX() + 40, (int) target.getY() - 20, Color.red, ArrowBuilder.Type.COMBAT); + } else { + for (PlayAreaPanel pa : MageFrame.getGame(gameId).getPlayers().values()) { + MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(defenderId); + if (permanent != null) { + Point target = permanent.getLocationOnScreen(); + target.translate(-parentPoint.x, -parentPoint.y); + Point attackerPoint = attackerCard.getLocationOnScreen(); + attackerPoint.translate(-parentPoint.x, -parentPoint.y); + ArrowBuilder.addArrow((int) attackerPoint.getX() + 45, (int) attackerPoint.getY() + 25, (int) target.getX() + 40, (int) target.getY() + 10, Color.red, ArrowBuilder.Type.COMBAT); + } + } + } + } + } + + private void drawBlockers(CombatGroupView group, MagePermanent attackerCard, UUID gameId) { + for (CardView blocker : group.getBlockers().values()) { + for (PlayAreaPanel pa : MageFrame.getGame(gameId).getPlayers().values()) { + MagePermanent blockerCard = pa.getBattlefieldPanel().getPermanents().get(blocker.getId()); + if (blockerCard != null) { + parentPoint = getParentPoint(blockerCard); + Point blockerPoint = blockerCard.getLocationOnScreen(); + blockerPoint.translate(-parentPoint.x, -parentPoint.y); + Point attackerPoint = attackerCard.getLocationOnScreen(); + attackerPoint.translate(-parentPoint.x, -parentPoint.y); + double yRateA = (attackerCard.getSize().height / SettingsManager.getInstance().getCardSize().height); + double xRateA = (attackerCard.getSize().width / SettingsManager.getInstance().getCardSize().width); + double yRateB = (blockerCard.getSize().height / SettingsManager.getInstance().getCardSize().height); + double xRateB = (blockerCard.getSize().width / SettingsManager.getInstance().getCardSize().width); + ArrowBuilder.addArrow((int) blockerPoint.getX() + (int)(55*xRateB), (int) blockerPoint.getY() + (int)(25*xRateB), + (int) attackerPoint.getX() + (int)(70*xRateA), (int) attackerPoint.getY() + (int)(25*yRateA), Color.blue, ArrowBuilder.Type.COMBAT); + } + } + } + } + + private Point getParentPoint(MagePermanent permanent) { + if (parentPoint == null) { + Component parentComponent = SwingUtilities.getRoot(permanent); + parentPoint = parentComponent.getLocationOnScreen(); + } + return parentPoint; + } +} diff --git a/Mage.Client/src/main/java/mage/client/dialog/CombatDialog.java b/Mage.Client/src/main/java/mage/client/dialog/CombatDialog.java index 46380de5c02..6504c88a1bc 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/CombatDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/CombatDialog.java @@ -34,20 +34,18 @@ package mage.client.dialog; -import java.awt.Color; -import java.awt.Graphics; +import mage.client.cards.BigCard; +import mage.client.game.CombatGroup; +import mage.view.CombatGroupView; + +import javax.swing.*; +import java.awt.*; import java.beans.PropertyVetoException; import java.util.List; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; -import javax.swing.*; - -import mage.client.cards.BigCard; -import mage.client.game.CombatGroup; -import mage.view.CombatGroupView; - /** * * @author BetaSteward_at_googlemail.com @@ -79,7 +77,7 @@ public class CombatDialog extends MageDialog { jScrollPane1.getViewport().setOpaque(false); getRootPane().setOpaque(false); - setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE); + //setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE); } public void init(UUID gameId, BigCard bigCard) { diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index 6cee4e6a96c..56497c1d16c 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -38,6 +38,7 @@ import mage.Constants; import mage.client.MageFrame; import mage.client.cards.BigCard; import mage.client.chat.ChatPanel; +import mage.client.combat.CombatManager; import mage.client.components.MageComponents; import mage.client.components.ext.dlg.DialogManager; import mage.client.dialog.*; @@ -421,9 +422,11 @@ public class GamePanel extends javax.swing.JPanel { showRevealed(game); showLookedAt(game); if (game.getCombat().size() > 0) { - combat.showDialog(game.getCombat()); + //combat.showDialog(game.getCombat()); + CombatManager.getInstance().showCombat(game.getCombat(), gameId); } else { - combat.hideDialog(); + //combat.hideDialog(); + CombatManager.getInstance().hideCombat(); } updatePhases(game.getStep()); this.revalidate(); diff --git a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java index 28d32dc5d56..694031357b6 100644 --- a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java +++ b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java @@ -85,14 +85,14 @@ public class MageActionCallback implements ActionCallback { if (p != null) { Point target = p.getLocationOnScreen(); target.translate(-parentPoint.x, -parentPoint.y); - ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() - 40, Color.red); + ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() - 40, Color.red, ArrowBuilder.Type.TARGET); } else { for (PlayAreaPanel pa : MageFrame.getGame(data.gameId).getPlayers().values()) { MagePermanent permanent = pa.getBattlefieldPanel().getPermanents().get(uuid); if (permanent != null) { Point target = permanent.getLocationOnScreen(); target.translate(-parentPoint.x, -parentPoint.y); - ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.red); + ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.red, ArrowBuilder.Type.TARGET); } } } @@ -109,7 +109,7 @@ public class MageActionCallback implements ActionCallback { if (permanent != null) { Point source = permanent.getLocationOnScreen(); source.translate(-parentPoint.x, -parentPoint.y); - ArrowBuilder.addArrow((int) source.getX() + 40, (int) source.getY() + 10, (int) me.getX() + 35, (int) me.getY() + 20, Color.blue); + ArrowBuilder.addArrow((int) source.getX() + 40, (int) source.getY() + 10, (int) me.getX() + 35, (int) me.getY() + 20, Color.blue, ArrowBuilder.Type.SOURCE); } } } @@ -124,7 +124,7 @@ public class MageActionCallback implements ActionCallback { if (permanent != null) { Point target = permanent.getLocationOnScreen(); target.translate(-parentPoint.x, -parentPoint.y); - ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.green); + ArrowBuilder.addArrow((int) me.getX() + 35, (int) me.getY(), (int) target.getX() + 40, (int) target.getY() + 10, Color.green, ArrowBuilder.Type.PAIRED); } } } @@ -262,7 +262,10 @@ public class MageActionCallback implements ActionCallback { public void mouseExited(MouseEvent e, final TransferData data) { hidePopup(); this.state = false; - ArrowBuilder.removeAllArrows(); + //ArrowBuilder.removeAllArrows(); + ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.TARGET); + ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.PAIRED); + ArrowBuilder.removeArrowsByType(ArrowBuilder.Type.SOURCE); } } diff --git a/Mage.Client/src/main/java/mage/client/util/gui/ArrowBuilder.java b/Mage.Client/src/main/java/mage/client/util/gui/ArrowBuilder.java index a0e36b847cd..b9fe7618bbc 100644 --- a/Mage.Client/src/main/java/mage/client/util/gui/ArrowBuilder.java +++ b/Mage.Client/src/main/java/mage/client/util/gui/ArrowBuilder.java @@ -1,7 +1,10 @@ package mage.client.util.gui; -import java.awt.Color; -import javax.swing.JPanel; +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; /** * Class for dealing with arrows in the game. @@ -10,7 +13,13 @@ import javax.swing.JPanel; */ public class ArrowBuilder { - public static JPanel arrowsPanel; + private static JPanel arrowsPanel; + + private final static Map> map = new HashMap>(); + + public enum Type { + PAIRED, SOURCE, TARGET, COMBAT; + } /** * Get the panel where all arrows are being drawn. @@ -52,13 +61,21 @@ public class ArrowBuilder { * @param endY * @param color */ - public static void addArrow(int startX, int startY, int endX, int endY, Color color) { + public static void addArrow(int startX, int startY, int endX, int endY, Color color, Type type) { JPanel p = getArrowsPanel(); Arrow arrow = new Arrow(); arrow.setColor(color); arrow.setArrowLocation(startX, startY, endX, endY); - arrow.setBounds(0, 0, Math.max(startX, endX) + 30, Math.max(startY, endY) + 30); // 30 is offset for arrow heads (being cut otherwise) - p.add(arrow); + arrow.setBounds(0, 0, Math.max(startX, endX) + 40, Math.max(startY, endY) + 30); // 30 is offset for arrow heads (being cut otherwise) + synchronized (map) { + p.add(arrow); + java.util.List arrows = map.get(type); + if (arrows == null) { + arrows = new ArrayList(); + map.put(type, arrows); + } + arrows.add(arrow); + } p.revalidate(); p.repaint(); } @@ -68,11 +85,31 @@ public class ArrowBuilder { */ public static void removeAllArrows() { JPanel p = getArrowsPanel(); - if (p.getComponentCount() > 0) { - p.removeAll(); - p.revalidate(); - p.repaint(); - } + synchronized (map) { + if (p.getComponentCount() > 0) { + p.removeAll(); + p.revalidate(); + p.repaint(); + } + map.clear(); + } } + public static void removeArrowsByType(Type type) { + java.util.List arrows = map.get(type); + if (arrows != null) { + JPanel p = getArrowsPanel(); + if (arrows.size() > 0) { + synchronized (map) { + for (Arrow arrow : arrows) { + p.remove(arrow); + } + map.put(type, new ArrayList()); + } + p.revalidate(); + p.repaint(); + } + } + } + } diff --git a/Mage.Common/src/mage/view/CombatGroupView.java b/Mage.Common/src/mage/view/CombatGroupView.java index 90465ae4e11..91435e3dd82 100644 --- a/Mage.Common/src/mage/view/CombatGroupView.java +++ b/Mage.Common/src/mage/view/CombatGroupView.java @@ -28,13 +28,14 @@ package mage.view; -import java.io.Serializable; -import java.util.UUID; import mage.game.Game; import mage.game.combat.CombatGroup; import mage.game.permanent.Permanent; import mage.players.Player; +import java.io.Serializable; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -45,6 +46,7 @@ public class CombatGroupView implements Serializable { private CardsView attackers = new CardsView(); private CardsView blockers = new CardsView(); private String defenderName = ""; + private UUID defenderId; public CombatGroupView(CombatGroup combatGroup, Game game) { Player player = game.getPlayer(combatGroup.getDefenderId()); @@ -56,7 +58,8 @@ public class CombatGroupView implements Serializable { if (perm != null) this.defenderName = perm.getName(); } - for (UUID id: combatGroup.getAttackers()) { + this.defenderId = combatGroup.getDefenderId(); + for (UUID id: combatGroup.getAttackers()) { Permanent attacker = game.getPermanent(id); if (attacker != null) attackers.put(id, new PermanentView(attacker, game.getCard(attacker.getId()))); @@ -79,4 +82,8 @@ public class CombatGroupView implements Serializable { public CardsView getBlockers() { return blockers; } + + public UUID getDefenderId() { + return defenderId; + } }