From 537fbb0491751846c3fa1d22a33e8a2e362b0fc5 Mon Sep 17 00:00:00 2001 From: Doublestrike Date: Fri, 28 Sep 2012 01:53:34 +0000 Subject: [PATCH] Targeting overlay implemented (experimental, for enchantments only). Dock button and preference toggle also enabled. --- .gitattributes | 1 + res/skins/default/sprite_icons.png | Bin 620766 -> 630674 bytes src/main/java/forge/control/FControl.java | 9 +- .../forge/gui/match/TargetingOverlay.java | 157 ++++++++++++++++++ .../forge/gui/match/controllers/CDock.java | 38 ++++- .../java/forge/gui/match/views/VDock.java | 8 + src/main/java/forge/gui/toolbox/FSkin.java | 3 +- .../forge/properties/ForgePreferences.java | 1 + src/main/java/forge/view/FView.java | 8 + 9 files changed, 212 insertions(+), 13 deletions(-) create mode 100644 src/main/java/forge/gui/match/TargetingOverlay.java diff --git a/.gitattributes b/.gitattributes index 6bd5a992322..4589f890809 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12465,6 +12465,7 @@ src/main/java/forge/gui/match/ControlWinLose.java -text src/main/java/forge/gui/match/GauntletWinLose.java -text src/main/java/forge/gui/match/QuestWinLoseCardViewer.java -text src/main/java/forge/gui/match/QuestWinLoseHandler.java -text +src/main/java/forge/gui/match/TargetingOverlay.java -text src/main/java/forge/gui/match/VMatchUI.java -text src/main/java/forge/gui/match/ViewWinLose.java -text src/main/java/forge/gui/match/controllers/CAntes.java -text diff --git a/res/skins/default/sprite_icons.png b/res/skins/default/sprite_icons.png index a0394df0de3f336adb30689e202f837afb9c14b5..d26a57eb9278e788cdd9c2634a0ae743b52ca141 100644 GIT binary patch delta 29663 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

_+A*Jl3^td5!#|k90tlkulFu>1 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 diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index 7d440e49abd..113b5a03237 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -256,11 +256,12 @@ public enum FControl { /** Sizes children of JLayeredPane to fully fit their layers. */ private void sizeChildren() { Component[] children = display.getComponentsInLayer(JLayeredPane.DEFAULT_LAYER); - if (children.length == 0) { return; } - children[0].setSize(display.getSize()); + if (children.length != 0) { children[0].setSize(display.getSize()); } + + children = display.getComponentsInLayer(FView.TARGETING_LAYER); + if (children.length != 0) { children[0].setSize(display.getSize()); } children = display.getComponentsInLayer(JLayeredPane.MODAL_LAYER); - if (children.length == 0) { return; } - children[0].setSize(display.getSize()); + if (children.length != 0) { children[0].setSize(display.getSize()); } } } diff --git a/src/main/java/forge/gui/match/TargetingOverlay.java b/src/main/java/forge/gui/match/TargetingOverlay.java new file mode 100644 index 00000000000..2df29d7e77e --- /dev/null +++ b/src/main/java/forge/gui/match/TargetingOverlay.java @@ -0,0 +1,157 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.gui.match; + +import java.awt.BasicStroke; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.RenderingHints; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.swing.JPanel; + +import forge.Card; +import forge.control.FControl; +import forge.gui.match.nonsingleton.CField; +import forge.gui.toolbox.FSkin; +import forge.model.FModel; +import forge.properties.ForgePreferences.FPref; +import forge.view.FView; +import forge.view.arcane.CardPanel; +import forge.view.arcane.PlayArea; + +/** + * Semi-transparent overlay panel. Should be used with layered panes. + * + */ + +@SuppressWarnings("serial") +public enum TargetingOverlay { + /** */ + SINGLETON_INSTANCE; + + private final JPanel pnl = new OverlayPanel(); + private final List playAreas; + private List cardPanels; + private final List arcs = new ArrayList(); + + /** + * Semi-transparent overlay panel. Should be used with layered panes. + */ + private TargetingOverlay() { + playAreas = new ArrayList(); + cardPanels = new ArrayList(); + + for (CField f : CMatchUI.SINGLETON_INSTANCE.getFieldControls()) { + playAreas.add(f.getView().getTabletop()); + } + + pnl.setOpaque(false); + pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_ZEBRA)); + } + + /** @return {@link javax.swing.JPanel} */ + public JPanel getPanel() { + return this.pnl; + } + + // TODO - this is called every repaint, regardless if card + // positions have changed or not. Could perform better if + // it checked for a state change. Doublestrike 28-09-12 + private void assembleArcs() { + arcs.clear(); + cardPanels.clear(); + cardPanels.addAll(playAreas.get(0).getCardPanels()); + cardPanels.addAll(playAreas.get(1).getCardPanels()); + + final Point docOffsets = FView.SINGLETON_INSTANCE.getLpnDocument().getLocationOnScreen(); + // Locations of arc endpoint, per card, with ID as primary key. + final Map endpoints = new HashMap(); + + // Assemble card locations for easy reference + for (CardPanel c : cardPanels) { + if (!c.isShowing()) { continue; } + endpoints.put(c.getCard().getUniqueNumber(), new Point( + (int) (c.getParent().getLocationOnScreen().getX() + c.getCardLocation().getX() - docOffsets.getX() + c.getWidth() / 4), + (int) (c.getParent().getLocationOnScreen().getY() + c.getCardLocation().getY() - docOffsets.getY() + c.getHeight() / 4) + )); + } + + List temp = new ArrayList(); + for (CardPanel c : cardPanels) { + if (!c.isShowing()) { continue; } + temp = c.getCard().getEnchantedBy(); + for (Card enchantingCard : temp) { + arcs.add(new Point[] { + endpoints.get(c.getCard().getUniqueNumber()), + endpoints.get(enchantingCard.getUniqueNumber()) + }); + } + } + + temp.clear(); + endpoints.clear(); + } + + private class OverlayPanel extends JPanel { + /** + * For some reason, the alpha channel background doesn't work properly on + * Windows 7, so the paintComponent override is required for a + * semi-transparent overlay. + * + * @param g + *   Graphics object + */ + @Override + public void paintComponent(final Graphics g) { + // No need for this except in match view + if (FControl.SINGLETON_INSTANCE.getState() != 1) { + return; + } + else if (!Boolean.valueOf(FModel.SINGLETON_INSTANCE.getPreferences().getPref(FPref.UI_TARGETING_OVERLAY))) { + return; + } + + super.paintComponent(g); + // Arc drawing + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(FSkin.getColor(FSkin.Colors.CLR_ACTIVE)); + g2d.setStroke(new BasicStroke(3F)); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + + assembleArcs(); + int w, h, x, y; + + for (Point[] p : arcs) { + w = Math.abs((int) p[1].getX() - (int) p[0].getX()); + h = Math.abs((int) p[1].getY() - (int) p[0].getY()); + x = (Math.min((int) p[1].getX(), (int) p[0].getX()) - w); + y = (Math.min((int) p[1].getY(), (int) p[0].getY())); + + g2d.drawArc(x, y, 2 * w, 2 * h, 0, 90); + g2d.fillOval((int) p[0].getX() - 4, (int) p[0].getY() - 4, 8, 8); + g2d.fillOval((int) p[1].getX() - 4, (int) p[1].getY() - 4, 8, 8); + } + } + } +} diff --git a/src/main/java/forge/gui/match/controllers/CDock.java b/src/main/java/forge/gui/match/controllers/CDock.java index e4df86cef64..8678e727ec2 100644 --- a/src/main/java/forge/gui/match/controllers/CDock.java +++ b/src/main/java/forge/gui/match/controllers/CDock.java @@ -47,11 +47,14 @@ import forge.gui.ForgeAction; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; import forge.gui.framework.SLayoutIO; +import forge.gui.match.TargetingOverlay; import forge.gui.match.views.VDock; import forge.gui.toolbox.FOverlay; import forge.gui.toolbox.SaveOpenDialog; import forge.gui.toolbox.SaveOpenDialog.Filetypes; import forge.item.CardPrinted; +import forge.model.FModel; +import forge.properties.ForgePreferences.FPref; import forge.properties.NewConstants; import forge.view.FView; @@ -141,25 +144,39 @@ public enum CDock implements ICDoc { private void viewDeckList() { new DeckListAction(NewConstants.Lang.GuiDisplay.HUMAN_DECKLIST).actionPerformed(null); } - - /** Attack with everyone */ + + /** Attack with everyone. */ public void alphaStrike() { - PhaseHandler ph = Singletons.getModel().getGameState().getPhaseHandler(); - - Player human = AllZone.getHumanPlayer(); - + final PhaseHandler ph = Singletons.getModel().getGameState().getPhaseHandler(); + + final Player human = AllZone.getHumanPlayer(); + if (ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS, human)) { - for(Card c : human.getCardsIn(ZoneType.Battlefield).filter(Presets.CREATURES)) { + for (Card c : human.getCardsIn(ZoneType.Battlefield).filter(Presets.CREATURES)) { if (!c.isAttacking() && CombatUtil.canAttack(c, AllZone.getCombat())) { AllZone.getCombat().addAttacker(c); } } //human.updateObservers(); + // TODO Is this redrawing immediately? FView.SINGLETON_INSTANCE.getFrame().repaint(); } } + /** Toggle targeting overlay painting. */ + public void toggleTargeting() { + if (Boolean.valueOf(FModel.SINGLETON_INSTANCE.getPreferences().getPref(FPref.UI_TARGETING_OVERLAY))) { + FModel.SINGLETON_INSTANCE.getPreferences().setPref(FPref.UI_TARGETING_OVERLAY, "false"); + } + else { + FModel.SINGLETON_INSTANCE.getPreferences().setPref(FPref.UI_TARGETING_OVERLAY, "true"); + } + + FModel.SINGLETON_INSTANCE.getPreferences().save(); + TargetingOverlay.SINGLETON_INSTANCE.getPanel().repaint(); + } + /** * Receives click and programmatic requests for viewing a player's library * (typically used in dev mode). Allows copy of the cardlist to clipboard. @@ -282,11 +299,16 @@ public enum CDock implements ICDoc { .addMouseListener(new MouseAdapter() { @Override public void mousePressed(final MouseEvent e) { saveLayout(); } }); - + VDock.SINGLETON_INSTANCE.getBtnAlphaStrike() .addMouseListener(new MouseAdapter() { @Override public void mousePressed(final MouseEvent e) { alphaStrike(); } }); + + VDock.SINGLETON_INSTANCE.getBtnTargeting() + .addMouseListener(new MouseAdapter() { @Override + public void mousePressed(final MouseEvent e) { + toggleTargeting(); } }); } /* (non-Javadoc) diff --git a/src/main/java/forge/gui/match/views/VDock.java b/src/main/java/forge/gui/match/views/VDock.java index bcc5f842bce..59b042f1302 100644 --- a/src/main/java/forge/gui/match/views/VDock.java +++ b/src/main/java/forge/gui/match/views/VDock.java @@ -67,6 +67,8 @@ public enum VDock implements IVDoc { new DockButton(FSkin.getIcon(FSkin.DockIcons.ICO_SAVELAYOUT), "Save Layout"); private final JLabel btnAlphaStrike = new DockButton(FSkin.getIcon(FSkin.DockIcons.ICO_ALPHASTRIKE), "Alpha Strike"); + private final JLabel btnTargeting = + new DockButton(FSkin.getIcon(FSkin.DockIcons.ICO_TARGETING), "Show Targeting Arcs"); //========= Overridden methods @@ -88,6 +90,7 @@ public enum VDock implements IVDoc { pnl.add(btnOpenLayout); pnl.add(btnSaveLayout); pnl.add(btnAlphaStrike); + pnl.add(btnTargeting); } /* (non-Javadoc) @@ -172,6 +175,11 @@ public enum VDock implements IVDoc { return btnAlphaStrike; } + /** @return {@link javax.swing.JLabel} */ + public JLabel getBtnTargeting() { + return btnTargeting; + } + //========= Custom class handling /** * Buttons in Dock. JLabels are used to allow hover effects. diff --git a/src/main/java/forge/gui/toolbox/FSkin.java b/src/main/java/forge/gui/toolbox/FSkin.java index 0f0b0ecf689..e350c86f08a 100644 --- a/src/main/java/forge/gui/toolbox/FSkin.java +++ b/src/main/java/forge/gui/toolbox/FSkin.java @@ -227,7 +227,8 @@ public enum FSkin { ICO_OPENLAYOUT (new int[] {0, 800, 80, 80}), /** */ ICO_SAVELAYOUT (new int[] {80, 800, 80, 80}), /** */ ICO_DECKLIST (new int[] {400, 640, 80, 80}), /** */ - ICO_ALPHASTRIKE (new int[] {160, 800, 80, 80}); + ICO_ALPHASTRIKE (new int[] {160, 800, 80, 80}), /** */ + ICO_TARGETING (new int[] {240, 800, 80, 80}); private int[] coords; /** @param xy   int[] coordinates */ diff --git a/src/main/java/forge/properties/ForgePreferences.java b/src/main/java/forge/properties/ForgePreferences.java index 82a036002a0..03a868d8400 100644 --- a/src/main/java/forge/properties/ForgePreferences.java +++ b/src/main/java/forge/properties/ForgePreferences.java @@ -67,6 +67,7 @@ public class ForgePreferences { UI_MANABURN("false"), /** */ UI_SKIN ("default"), /** */ UI_PREFERRED_AVATARS_ONLY ("false"), /** */ + UI_TARGETING_OVERLAY ("false"), /** */ SUBMENU_CURRENTMENU (EMenuItem.CONSTRUCTED.toString()), /** */ SUBMENU_SANCTIONED ("false"), /** */ diff --git a/src/main/java/forge/view/FView.java b/src/main/java/forge/view/FView.java index 203da9b9389..987e4c2c1ed 100644 --- a/src/main/java/forge/view/FView.java +++ b/src/main/java/forge/view/FView.java @@ -24,6 +24,7 @@ import forge.gui.framework.EDocID; import forge.gui.framework.SLayoutConstants; import forge.gui.home.CMainMenu; import forge.gui.home.VHomeUI; +import forge.gui.match.TargetingOverlay; import forge.gui.match.VMatchUI; import forge.gui.toolbox.FOverlay; import forge.gui.toolbox.FPanel; @@ -33,6 +34,9 @@ import forge.gui.toolbox.FSkin; public enum FView { /** */ SINGLETON_INSTANCE; + + /** */ + public static final Integer TARGETING_LAYER = JLayeredPane.MODAL_LAYER - 1; private final List allCells = new ArrayList(); private SplashFrame splash; @@ -73,6 +77,10 @@ public enum FView { lpnDocument.add(pnlPreview, (Integer) 2); lpnDocument.add(pnlTabOverflow, (Integer) 3); lpnDocument.add(FOverlay.SINGLETON_INSTANCE.getPanel(), JLayeredPane.MODAL_LAYER); + // Note: when adding new panels here, keep in mind that the layered pane + // has a null layout, so new components will be (0,0) - gotcha! + // FControl has a method called "sizeComponents" which will fix this. + lpnDocument.add(TargetingOverlay.SINGLETON_INSTANCE.getPanel(), TARGETING_LAYER); pnlInsets.add(pnlContent, BorderLayout.CENTER); pnlInsets.setBackgroundTexture(FSkin.getIcon(FSkin.Backgrounds.BG_TEXTURE));