mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 04:38:00 +00:00
Add targeting arrow support
This commit is contained in:
@@ -23,6 +23,7 @@ import forge.assets.FSkinColor.Colors;
|
|||||||
import forge.game.card.CardView;
|
import forge.game.card.CardView;
|
||||||
import forge.game.player.PlayerView;
|
import forge.game.player.PlayerView;
|
||||||
import forge.screens.match.views.VCardDisplayArea.CardAreaPanel;
|
import forge.screens.match.views.VCardDisplayArea.CardAreaPanel;
|
||||||
|
import forge.toolbox.FDisplayObject;
|
||||||
import forge.util.Utils;
|
import forge.util.Utils;
|
||||||
|
|
||||||
import com.badlogic.gdx.graphics.Color;
|
import com.badlogic.gdx.graphics.Color;
|
||||||
@@ -64,6 +65,11 @@ public class TargetingOverlay {
|
|||||||
MatchController.getView().getPlayerPanel(targetPlayer).getAvatar().getTargetingArrowOrigin(),
|
MatchController.getView().getPlayerPanel(targetPlayer).getAvatar().getTargetingArrowOrigin(),
|
||||||
connectsFoes);
|
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) {
|
public static void drawArrow(Graphics g, Vector2 start, Vector2 end, boolean connectsFoes) {
|
||||||
if (start == null || end == null) { return; }
|
if (start == null || end == null) { return; }
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import forge.card.CardZoom.ActivateHandler;
|
|||||||
import forge.game.card.CardView;
|
import forge.game.card.CardView;
|
||||||
import forge.match.MatchUtil;
|
import forge.match.MatchUtil;
|
||||||
import forge.toolbox.FCardPanel;
|
import forge.toolbox.FCardPanel;
|
||||||
|
import forge.toolbox.FDisplayObject;
|
||||||
import forge.util.ThreadUtil;
|
import forge.util.ThreadUtil;
|
||||||
|
|
||||||
public abstract class VCardDisplayArea extends VDisplayArea implements ActivateHandler {
|
public abstract class VCardDisplayArea extends VDisplayArea implements ActivateHandler {
|
||||||
@@ -376,21 +377,18 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH
|
|||||||
return cards;
|
return cards;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector2 getTargetingArrowOrigin() {
|
public static Vector2 getTargetingArrowOrigin(FDisplayObject cardDisplay, boolean isTapped) {
|
||||||
//don't show targeting arrow unless in display area that's visible
|
Vector2 origin = new Vector2(cardDisplay.screenPos.x, cardDisplay.screenPos.y);
|
||||||
if (displayArea == null || !displayArea.isVisible()) { return null; }
|
|
||||||
|
|
||||||
Vector2 origin = new Vector2(screenPos.x, screenPos.y);
|
|
||||||
|
|
||||||
float left = PADDING;
|
float left = PADDING;
|
||||||
float top = PADDING;
|
float top = PADDING;
|
||||||
float w = getWidth() - 2 * PADDING;
|
float w = cardDisplay.getWidth() - 2 * PADDING;
|
||||||
float h = getHeight() - 2 * PADDING;
|
float h = cardDisplay.getHeight() - 2 * PADDING;
|
||||||
if (w == h) { //adjust width if needed to make room for tapping
|
if (w == h) { //adjust width if needed to make room for tapping
|
||||||
w = h / ASPECT_RATIO;
|
w = h / ASPECT_RATIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isTapped()) { //rotate box if tapped
|
if (isTapped) { //rotate box if tapped
|
||||||
top += h - w;
|
top += h - w;
|
||||||
float temp = w;
|
float temp = w;
|
||||||
w = h;
|
w = h;
|
||||||
@@ -403,6 +401,13 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH
|
|||||||
return origin;
|
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
|
@Override
|
||||||
protected float getTappedAngle() {
|
protected float getTappedAngle() {
|
||||||
if (displayArea != null && displayArea.rotateCards180) {
|
if (displayArea != null && displayArea.rotateCards180) {
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import forge.planarconquest.ConquestPlaneData;
|
|||||||
import forge.planarconquest.ConquestPlaneData.RegionData;
|
import forge.planarconquest.ConquestPlaneData.RegionData;
|
||||||
import forge.planarconquest.ConquestPreferences.CQPref;
|
import forge.planarconquest.ConquestPreferences.CQPref;
|
||||||
import forge.screens.FScreen;
|
import forge.screens.FScreen;
|
||||||
|
import forge.screens.match.TargetingOverlay;
|
||||||
import forge.toolbox.FCardPanel;
|
import forge.toolbox.FCardPanel;
|
||||||
import forge.toolbox.FContainer;
|
import forge.toolbox.FContainer;
|
||||||
import forge.toolbox.FDisplayObject;
|
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
|
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
|
@Override
|
||||||
protected void doLayout(float startY, float width, float height) {
|
protected void doLayout(float startY, float width, float height) {
|
||||||
btnEndDay.setSize(width / 2, btnEndDay.getAutoSizeBounds().height);
|
btnEndDay.setSize(width / 2, btnEndDay.getAutoSizeBounds().height);
|
||||||
@@ -233,20 +263,38 @@ public class ConquestMapScreen extends FScreen {
|
|||||||
}
|
}
|
||||||
else if (index > -4) { //opponent panel
|
else if (index > -4) { //opponent panel
|
||||||
ConquestCommander commander = regionDisplay.deployedCommander.commander;
|
ConquestCommander commander = regionDisplay.deployedCommander.commander;
|
||||||
if (commander != null && commander.getCurrentDayAction() == null) {
|
if (commander != null && commander.getCurrentDayAction() != ConquestAction.Deploy) {
|
||||||
//TODO: Attack opponent
|
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
|
else { //deploy panel - toggle whether selected commander is deployed to current region
|
||||||
if (commanderRow.selectedIndex != -1) {
|
if (commanderRow.selectedIndex != -1) {
|
||||||
ConquestCommander commander = commanderRow.panels[commanderRow.selectedIndex].commander;
|
ConquestCommander commander = commanderRow.panels[commanderRow.selectedIndex].commander;
|
||||||
if (commander.getCurrentDayAction() == null) {
|
if (commander.getCurrentDayAction() == null) {
|
||||||
|
if (regionDisplay.deployedCommander.commander == null) {
|
||||||
regionDisplay.deployedCommander.setCommander(commander);
|
regionDisplay.deployedCommander.setCommander(commander);
|
||||||
regionDisplay.data.setDeployedCommander(commander);
|
regionDisplay.data.setDeployedCommander(commander);
|
||||||
commander.setCurrentDayAction(ConquestAction.Deploy);
|
commander.setCurrentDayAction(ConquestAction.Deploy);
|
||||||
commander.setDeployedRegion(regionDisplay.data.getRegion());
|
commander.setDeployedRegion(regionDisplay.data.getRegion());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if (commander.getCurrentDayAction() == ConquestAction.Deploy) {
|
else if (commander.getCurrentDayAction() == ConquestAction.Deploy) {
|
||||||
|
if (regionDisplay.deployedCommander.commander == commander) {
|
||||||
regionDisplay.deployedCommander.setCommander(null);
|
regionDisplay.deployedCommander.setCommander(null);
|
||||||
regionDisplay.data.setDeployedCommander(null);
|
regionDisplay.data.setDeployedCommander(null);
|
||||||
commander.setCurrentDayAction(null);
|
commander.setCurrentDayAction(null);
|
||||||
@@ -255,6 +303,7 @@ public class ConquestMapScreen extends FScreen {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class CommanderRow extends FContainer {
|
private class CommanderRow extends FContainer {
|
||||||
private int selectedIndex;
|
private int selectedIndex;
|
||||||
|
|||||||
Reference in New Issue
Block a user