From 48bf499e8994c642333bf821881f5ad32067e15d Mon Sep 17 00:00:00 2001 From: drdev Date: Sat, 6 Dec 2014 07:37:33 +0000 Subject: [PATCH] Add targeting arrow support --- .../forge/screens/match/TargetingOverlay.java | 6 ++ .../screens/match/views/VCardDisplayArea.java | 21 +++--- .../planarconquest/ConquestMapScreen.java | 69 ++++++++++++++++--- 3 files changed, 78 insertions(+), 18 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java b/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java index aa7505c7d16..07517845378 100644 --- a/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java @@ -23,6 +23,7 @@ import forge.assets.FSkinColor.Colors; import forge.game.card.CardView; import forge.game.player.PlayerView; import forge.screens.match.views.VCardDisplayArea.CardAreaPanel; +import forge.toolbox.FDisplayObject; import forge.util.Utils; import com.badlogic.gdx.graphics.Color; @@ -64,6 +65,11 @@ public class TargetingOverlay { MatchController.getView().getPlayerPanel(targetPlayer).getAvatar().getTargetingArrowOrigin(), connectsFoes); } + public static void drawArrow(Graphics g, FDisplayObject startCardDisplay, FDisplayObject endCardDisplay, boolean connectsFoes) { + drawArrow(g, CardAreaPanel.getTargetingArrowOrigin(startCardDisplay, false), + CardAreaPanel.getTargetingArrowOrigin(endCardDisplay, false), + connectsFoes); + } public static void drawArrow(Graphics g, Vector2 start, Vector2 end, boolean connectsFoes) { if (start == null || end == null) { return; } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index ee858ee454f..fb612c4f86d 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -15,6 +15,7 @@ import forge.card.CardZoom.ActivateHandler; import forge.game.card.CardView; import forge.match.MatchUtil; import forge.toolbox.FCardPanel; +import forge.toolbox.FDisplayObject; import forge.util.ThreadUtil; public abstract class VCardDisplayArea extends VDisplayArea implements ActivateHandler { @@ -376,21 +377,18 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH return cards; } - public Vector2 getTargetingArrowOrigin() { - //don't show targeting arrow unless in display area that's visible - if (displayArea == null || !displayArea.isVisible()) { return null; } - - Vector2 origin = new Vector2(screenPos.x, screenPos.y); + public static Vector2 getTargetingArrowOrigin(FDisplayObject cardDisplay, boolean isTapped) { + Vector2 origin = new Vector2(cardDisplay.screenPos.x, cardDisplay.screenPos.y); float left = PADDING; float top = PADDING; - float w = getWidth() - 2 * PADDING; - float h = getHeight() - 2 * PADDING; + float w = cardDisplay.getWidth() - 2 * PADDING; + float h = cardDisplay.getHeight() - 2 * PADDING; if (w == h) { //adjust width if needed to make room for tapping w = h / ASPECT_RATIO; } - if (isTapped()) { //rotate box if tapped + if (isTapped) { //rotate box if tapped top += h - w; float temp = w; w = h; @@ -403,6 +401,13 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH return origin; } + public Vector2 getTargetingArrowOrigin() { + //don't show targeting arrow unless in display area that's visible + if (displayArea == null || !displayArea.isVisible()) { return null; } + + return getTargetingArrowOrigin(this, isTapped()); + } + @Override protected float getTappedAngle() { if (displayArea != null && displayArea.rotateCards180) { diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMapScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMapScreen.java index c42263fabd6..68803eed3f6 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMapScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMapScreen.java @@ -31,6 +31,7 @@ import forge.planarconquest.ConquestPlaneData; import forge.planarconquest.ConquestPlaneData.RegionData; import forge.planarconquest.ConquestPreferences.CQPref; import forge.screens.FScreen; +import forge.screens.match.TargetingOverlay; import forge.toolbox.FCardPanel; import forge.toolbox.FContainer; import forge.toolbox.FDisplayObject; @@ -108,6 +109,35 @@ public class ConquestMapScreen extends FScreen { g.drawImage(background, 0, getHeight() - h, w, h); //retain proportions, remaining area will be covered by back color } + @Override + protected void drawOverlay(Graphics g) { + ConquestCommander commander = regionDisplay.deployedCommander.commander; + if (commander == null) { return; } + + int idx; + switch (commander.getCurrentDayAction()) { + case Attack1: + TargetingOverlay.drawArrow(g, regionDisplay.deployedCommander, regionDisplay.opponents[0], true); + break; + case Attack2: + TargetingOverlay.drawArrow(g, regionDisplay.deployedCommander, regionDisplay.opponents[1], true); + break; + case Attack3: + TargetingOverlay.drawArrow(g, regionDisplay.deployedCommander, regionDisplay.opponents[2], true); + break; + case Deploy: + idx = model.getCurrentPlane().getCommanders().indexOf(regionDisplay.deployedCommander.commander); + TargetingOverlay.drawArrow(g, commanderRow.panels[idx], regionDisplay.deployedCommander, false); + break; + case Undeploy: + idx = model.getCurrentPlane().getCommanders().indexOf(regionDisplay.deployedCommander.commander); + TargetingOverlay.drawArrow(g, regionDisplay.deployedCommander, commanderRow.panels[idx], false); + break; + default: + break; + } + } + @Override protected void doLayout(float startY, float width, float height) { btnEndDay.setSize(width / 2, btnEndDay.getAutoSizeBounds().height); @@ -233,24 +263,43 @@ public class ConquestMapScreen extends FScreen { } else if (index > -4) { //opponent panel ConquestCommander commander = regionDisplay.deployedCommander.commander; - if (commander != null && commander.getCurrentDayAction() == null) { - //TODO: Attack opponent + if (commander != null && commander.getCurrentDayAction() != ConquestAction.Deploy) { + ConquestAction action; + switch (index) { + case -1: + action = ConquestAction.Attack1; + break; + case -2: + action = ConquestAction.Attack2; + break; + default: + action = ConquestAction.Attack3; + break; + } + if (commander.getCurrentDayAction() == action) { + action = null; //toggle off set to attack this opponent + } + commander.setCurrentDayAction(action); } } else { //deploy panel - toggle whether selected commander is deployed to current region if (commanderRow.selectedIndex != -1) { ConquestCommander commander = commanderRow.panels[commanderRow.selectedIndex].commander; if (commander.getCurrentDayAction() == null) { - regionDisplay.deployedCommander.setCommander(commander); - regionDisplay.data.setDeployedCommander(commander); - commander.setCurrentDayAction(ConquestAction.Deploy); - commander.setDeployedRegion(regionDisplay.data.getRegion()); + if (regionDisplay.deployedCommander.commander == null) { + regionDisplay.deployedCommander.setCommander(commander); + regionDisplay.data.setDeployedCommander(commander); + commander.setCurrentDayAction(ConquestAction.Deploy); + commander.setDeployedRegion(regionDisplay.data.getRegion()); + } } else if (commander.getCurrentDayAction() == ConquestAction.Deploy) { - regionDisplay.deployedCommander.setCommander(null); - regionDisplay.data.setDeployedCommander(null); - commander.setCurrentDayAction(null); - commander.setDeployedRegion(null); + if (regionDisplay.deployedCommander.commander == commander) { + regionDisplay.deployedCommander.setCommander(null); + regionDisplay.data.setDeployedCommander(null); + commander.setCurrentDayAction(null); + commander.setDeployedRegion(null); + } } } }