mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-13 01:08:06 +00:00
[Mobile] Deck View on Player Tab
- Deck Viewer is available on Player Tab -> Avatar Image click/tap
This commit is contained in:
@@ -7,6 +7,8 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import forge.ai.GameState;
|
import forge.ai.GameState;
|
||||||
|
import forge.deck.Deck;
|
||||||
|
import forge.game.player.Player;
|
||||||
import forge.item.IPaperCard;
|
import forge.item.IPaperCard;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
@@ -94,14 +96,26 @@ public class MatchController extends AbstractGuiGame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Deck getPlayerDeck(final PlayerView playerView) {
|
||||||
|
try {
|
||||||
|
for (Player p : instance.getGameView().getGame().getPlayers()) {
|
||||||
|
if (p.getView() == playerView) {
|
||||||
|
return p.getRegisteredPlayer().getDeck();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static FImage getPlayerAvatar(final PlayerView p) {
|
public static FImage getPlayerAvatar(final PlayerView p) {
|
||||||
final String lp = p.getLobbyPlayerName();
|
final String lp = p.getLobbyPlayerName();
|
||||||
FImage avatar = avatarImages.get(lp);
|
FImage avatar = avatarImages.get(lp);
|
||||||
if (avatar == null) {
|
if (avatar == null) {
|
||||||
if (StringUtils.isEmpty(p.getAvatarCardImageKey())) {
|
if (StringUtils.isEmpty(p.getAvatarCardImageKey())) {
|
||||||
avatar = new FTextureRegionImage(FSkin.getAvatars().get(p.getAvatarIndex()));
|
avatar = new FTextureRegionImage(FSkin.getAvatars().get(p.getAvatarIndex()));
|
||||||
}
|
} else { //handle lobby players with art from cards
|
||||||
else { //handle lobby players with art from cards
|
|
||||||
avatar = new CardAvatarImage(p.getAvatarCardImageKey());
|
avatar = new CardAvatarImage(p.getAvatarCardImageKey());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -354,26 +354,24 @@ public class MatchScreen extends FScreen {
|
|||||||
final GameView game = MatchController.instance.getGameView();
|
final GameView game = MatchController.instance.getGameView();
|
||||||
if (game == null) { return; }
|
if (game == null) { return; }
|
||||||
|
|
||||||
if(gameMenu!=null) {
|
if (gameMenu!=null) {
|
||||||
if(gameMenu.getChildCount()>3){
|
if (gameMenu.getChildCount()>2){
|
||||||
if(viewWinLose == null) {
|
if (viewWinLose == null) {
|
||||||
gameMenu.getChildAt(0).setEnabled(!game.isMulligan());
|
gameMenu.getChildAt(0).setEnabled(!game.isMulligan());
|
||||||
gameMenu.getChildAt(1).setEnabled(!game.isMulligan());
|
gameMenu.getChildAt(1).setEnabled(!game.isMulligan());
|
||||||
gameMenu.getChildAt(2).setEnabled(!game.isMulligan());
|
gameMenu.getChildAt(2).setEnabled(!game.isMulligan());
|
||||||
gameMenu.getChildAt(3).setEnabled(!game.isMulligan());
|
gameMenu.getChildAt(3).setEnabled(false);
|
||||||
gameMenu.getChildAt(4).setEnabled(false);
|
|
||||||
} else {
|
} else {
|
||||||
gameMenu.getChildAt(0).setEnabled(false);
|
gameMenu.getChildAt(0).setEnabled(false);
|
||||||
gameMenu.getChildAt(1).setEnabled(false);
|
gameMenu.getChildAt(1).setEnabled(false);
|
||||||
gameMenu.getChildAt(2).setEnabled(false);
|
gameMenu.getChildAt(2).setEnabled(false);
|
||||||
gameMenu.getChildAt(3).setEnabled(false);
|
gameMenu.getChildAt(3).setEnabled(true);
|
||||||
gameMenu.getChildAt(4).setEnabled(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(devMenu!=null) {
|
if (devMenu!=null) {
|
||||||
if(devMenu.isVisible()){
|
if (devMenu.isVisible()){
|
||||||
if(viewWinLose == null)
|
if (viewWinLose == null)
|
||||||
devMenu.setEnabled(true);
|
devMenu.setEnabled(true);
|
||||||
else
|
else
|
||||||
devMenu.setEnabled(false);
|
devMenu.setEnabled(false);
|
||||||
|
|||||||
@@ -47,26 +47,6 @@ public class VGameMenu extends FDropDownMenu {
|
|||||||
GameStateDeserializer.loadGameState(MatchUtil.getGame(), ForgeConstants.USER_GAMES_DIR + "GameSave.txt");
|
GameStateDeserializer.loadGameState(MatchUtil.getGame(), ForgeConstants.USER_GAMES_DIR + "GameSave.txt");
|
||||||
}
|
}
|
||||||
}));*/
|
}));*/
|
||||||
addItem(new FMenuItem(localizer.getMessage("lblDeckList"), FSkinImage.DECKLIST, new FEventHandler() {
|
|
||||||
@Override
|
|
||||||
public void handleEvent(FEvent e) {
|
|
||||||
//pause game when spectating AI Match
|
|
||||||
if (!MatchController.instance.hasLocalPlayers()) {
|
|
||||||
if(!MatchController.instance.isGamePaused())
|
|
||||||
MatchController.instance.pauseMatch();
|
|
||||||
}
|
|
||||||
|
|
||||||
final Player player = MatchController.getHostedMatch().getGame().getPhaseHandler().getPlayerTurn();
|
|
||||||
if (player != null) {
|
|
||||||
final Deck deck = player.getRegisteredPlayer().getDeck();
|
|
||||||
if (deck != null) {
|
|
||||||
FDeckViewer.show(deck);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FOptionPane.showMessageDialog(localizer.getMessage("lblNoPlayerPriorityNoDeckListViewed"));
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
addItem(new FMenuItem(localizer.getMessage("lblAutoYields"), Forge.hdbuttons ? FSkinImage.HDYIELD : FSkinImage.WARNING, new FEventHandler() {
|
addItem(new FMenuItem(localizer.getMessage("lblAutoYields"), Forge.hdbuttons ? FSkinImage.HDYIELD : FSkinImage.WARNING, new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
|
|||||||
@@ -2,14 +2,19 @@ package forge.screens.match.views;
|
|||||||
|
|
||||||
import com.badlogic.gdx.utils.Align;
|
import com.badlogic.gdx.utils.Align;
|
||||||
|
|
||||||
|
import forge.Forge;
|
||||||
import forge.Graphics;
|
import forge.Graphics;
|
||||||
import forge.assets.FImage;
|
|
||||||
import forge.assets.FSkinFont;
|
import forge.assets.FSkinFont;
|
||||||
|
import forge.assets.FSkinImage;
|
||||||
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.FDeckViewer;
|
||||||
import forge.game.player.PlayerView;
|
import forge.game.player.PlayerView;
|
||||||
import forge.menu.FDropDown;
|
import forge.menu.FDropDown;
|
||||||
import forge.screens.match.MatchController;
|
import forge.screens.match.MatchController;
|
||||||
import forge.toolbox.FContainer;
|
import forge.toolbox.FContainer;
|
||||||
import forge.toolbox.FDisplayObject;
|
import forge.toolbox.FDisplayObject;
|
||||||
|
import forge.toolbox.FEvent;
|
||||||
|
import forge.toolbox.FLabel;
|
||||||
import forge.toolbox.FList;
|
import forge.toolbox.FList;
|
||||||
import forge.util.Utils;
|
import forge.util.Utils;
|
||||||
|
|
||||||
@@ -42,14 +47,38 @@ public class VPlayers extends FDropDown {
|
|||||||
private static final float PADDING = Utils.scale(5);
|
private static final float PADDING = Utils.scale(5);
|
||||||
private static final float HEIGHT = Utils.AVG_FINGER_HEIGHT * 1.8f;
|
private static final float HEIGHT = Utils.AVG_FINGER_HEIGHT * 1.8f;
|
||||||
private final PlayerView player;
|
private final PlayerView player;
|
||||||
|
private final Deck playerDeck;
|
||||||
|
private final FLabel btnDeck;
|
||||||
|
private boolean btnAdded = false;
|
||||||
|
|
||||||
private PlayerInfoPanel(PlayerView player0) {
|
private PlayerInfoPanel(PlayerView player0) {
|
||||||
player = player0;
|
player = player0;
|
||||||
|
playerDeck = MatchController.getPlayerDeck(player0);
|
||||||
|
btnDeck = new FLabel.ButtonBuilder().opaque(true).iconScaleFactor(0.99f).selectable().alphaComposite(1).iconInBackground(true).build();
|
||||||
|
btnDeck.setCommand(new FEvent.FEventHandler() {
|
||||||
|
@Override
|
||||||
|
public void handleEvent(FEvent e) {
|
||||||
|
if (playerDeck != null) {
|
||||||
|
//pause game when spectating AI Match
|
||||||
|
if (!MatchController.instance.hasLocalPlayers()) {
|
||||||
|
if(!MatchController.instance.isGamePaused())
|
||||||
|
MatchController.instance.pauseMatch();
|
||||||
|
}
|
||||||
|
FDeckViewer.show(playerDeck);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doLayout(float width, float height) {
|
protected void doLayout(float width, float height) {
|
||||||
//TODO: Add FLabels to click to select player in top or bottom panel of Match screen
|
if (!btnAdded) {
|
||||||
|
btnDeck.setBounds(PADDING, PADDING, getHeight() - 2 * PADDING, getHeight() - 2 * PADDING);
|
||||||
|
btnDeck.setIcon(MatchController.getPlayerAvatar(player));
|
||||||
|
btnDeck.setOverlayIcon(Forge.hdbuttons ? FSkinImage.HDSEARCH : FSkinImage.SEARCH);
|
||||||
|
add(btnDeck);
|
||||||
|
btnAdded = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -57,12 +86,9 @@ public class VPlayers extends FDropDown {
|
|||||||
float x = PADDING;
|
float x = PADDING;
|
||||||
float y = PADDING;
|
float y = PADDING;
|
||||||
float h = getHeight() - 2 * y;
|
float h = getHeight() - 2 * y;
|
||||||
|
|
||||||
FImage avatarImage = MatchController.getPlayerAvatar(player);
|
|
||||||
g.drawImage(avatarImage, x, y, h, h);
|
|
||||||
x += h + PADDING;
|
x += h + PADDING;
|
||||||
|
//Draw Player Details
|
||||||
g.drawText(player.getDetails(), FONT, FList.FORE_COLOR, x, y, getWidth() - PADDING - x, h, true, Align.left, true);
|
g.drawText(player.getDetails() + playerDeck.getName(), FONT, FList.FORE_COLOR, x, y, getWidth() - PADDING - x, h, true, Align.left, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import forge.assets.FImage;
|
|||||||
import forge.assets.FSkinColor;
|
import forge.assets.FSkinColor;
|
||||||
import forge.assets.FSkinColor.Colors;
|
import forge.assets.FSkinColor.Colors;
|
||||||
import forge.assets.FSkinFont;
|
import forge.assets.FSkinFont;
|
||||||
|
import forge.assets.FSkinImage;
|
||||||
import forge.assets.TextRenderer;
|
import forge.assets.TextRenderer;
|
||||||
import forge.gui.UiCommand;
|
import forge.gui.UiCommand;
|
||||||
import forge.gui.interfaces.IButton;
|
import forge.gui.interfaces.IButton;
|
||||||
@@ -110,6 +111,7 @@ public class FLabel extends FDisplayObject implements IButton {
|
|||||||
|
|
||||||
private String text;
|
private String text;
|
||||||
private FImage icon;
|
private FImage icon;
|
||||||
|
private FSkinImage overlayIcon;
|
||||||
private FSkinColor textColor, pressedColor;
|
private FSkinColor textColor, pressedColor;
|
||||||
private FEventHandler command;
|
private FEventHandler command;
|
||||||
private TextRenderer textRenderer;
|
private TextRenderer textRenderer;
|
||||||
@@ -172,6 +174,9 @@ public class FLabel extends FDisplayObject implements IButton {
|
|||||||
public void setIcon(final FImage icon0) {
|
public void setIcon(final FImage icon0) {
|
||||||
icon = icon0;
|
icon = icon0;
|
||||||
}
|
}
|
||||||
|
public void setOverlayIcon(final FSkinImage overlayIcon0) {
|
||||||
|
overlayIcon = overlayIcon0;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean getIconScaleAuto() {
|
public boolean getIconScaleAuto() {
|
||||||
return iconScaleAuto;
|
return iconScaleAuto;
|
||||||
@@ -321,81 +326,95 @@ public class FLabel extends FDisplayObject implements IButton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void drawContent(Graphics g, float x, float y, float w, float h) {
|
protected void drawContent(Graphics g, float x, float y, float w, float h) {
|
||||||
if (icon != null) {
|
try {
|
||||||
float textY = y;
|
if (icon != null) {
|
||||||
float iconWidth = icon.getWidth();
|
float textY = y;
|
||||||
float iconHeight = icon.getHeight();
|
float iconWidth = icon.getWidth();
|
||||||
float aspectRatio = iconWidth / iconHeight;
|
float iconHeight = icon.getHeight();
|
||||||
|
float aspectRatio = iconWidth / iconHeight;
|
||||||
|
|
||||||
if (iconScaleWithFont) {
|
if (iconScaleWithFont) {
|
||||||
iconHeight = font.getLineHeight() * iconScaleFactor;
|
iconHeight = font.getLineHeight() * iconScaleFactor;
|
||||||
iconWidth = iconHeight * aspectRatio;
|
iconWidth = iconHeight * aspectRatio;
|
||||||
}
|
|
||||||
else if (iconInBackground || iconScaleAuto) {
|
|
||||||
iconHeight = h * iconScaleFactor;
|
|
||||||
iconWidth = iconHeight * aspectRatio;
|
|
||||||
if (iconWidth > w && iconInBackground) { //ensure background icon stays with label bounds
|
|
||||||
iconWidth = w;
|
|
||||||
iconHeight = iconWidth / aspectRatio;
|
|
||||||
}
|
}
|
||||||
}
|
else if (iconInBackground || iconScaleAuto) {
|
||||||
|
iconHeight = h * iconScaleFactor;
|
||||||
float iconOffset = iconWidth + insets.x + getExtraGapBetweenIconAndText();
|
iconWidth = iconHeight * aspectRatio;
|
||||||
|
if (iconWidth > w && iconInBackground) { //ensure background icon stays with label bounds
|
||||||
if (iconInBackground || text.isEmpty()) {
|
iconWidth = w;
|
||||||
if (alignment == Align.center) {
|
iconHeight = iconWidth / aspectRatio;
|
||||||
x += (w - iconWidth) / 2;
|
|
||||||
}
|
|
||||||
y += (h - iconHeight) / 2;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (alignment == Align.center) {
|
|
||||||
float dx;
|
|
||||||
while (true) {
|
|
||||||
dx = (w - iconOffset - getTextWidth()) / 2;
|
|
||||||
if (dx > 0) {
|
|
||||||
x += dx;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!font.canShrink()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
font = font.shrink();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (alignment == Align.right) {
|
|
||||||
float dx;
|
|
||||||
while (true) {
|
|
||||||
dx = (w - iconWidth - getTextWidth() - insets.x);
|
|
||||||
if (dx > 0) {
|
|
||||||
x += dx;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!font.canShrink()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
font = font.shrink();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
y += (h - iconHeight) / 2;
|
|
||||||
}
|
|
||||||
float mod = isHovered() && selectable ? iconWidth < iconHeight ? iconWidth/8f : iconHeight/8f : 0;
|
|
||||||
g.drawImage(icon, x-mod/2, y-mod/2, iconWidth+mod, iconHeight+mod);
|
|
||||||
|
|
||||||
if (!text.isEmpty()) {
|
float iconOffset = iconWidth + insets.x + getExtraGapBetweenIconAndText();
|
||||||
x += iconOffset;
|
|
||||||
w -= iconOffset;
|
if (iconInBackground || text.isEmpty()) {
|
||||||
drawText(g, x, textY, w, h, Align.left);
|
if (alignment == Align.center) {
|
||||||
|
x += (w - iconWidth) / 2;
|
||||||
|
}
|
||||||
|
y += (h - iconHeight) / 2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (alignment == Align.center) {
|
||||||
|
float dx;
|
||||||
|
while (true) {
|
||||||
|
dx = (w - iconOffset - getTextWidth()) / 2;
|
||||||
|
if (dx > 0) {
|
||||||
|
x += dx;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!font.canShrink()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
font = font.shrink();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (alignment == Align.right) {
|
||||||
|
float dx;
|
||||||
|
while (true) {
|
||||||
|
dx = (w - iconWidth - getTextWidth() - insets.x);
|
||||||
|
if (dx > 0) {
|
||||||
|
x += dx;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!font.canShrink()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
font = font.shrink();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
y += (h - iconHeight) / 2;
|
||||||
|
}
|
||||||
|
float mod = isHovered() && selectable ? iconWidth < iconHeight ? iconWidth/8f : iconHeight/8f : 0;
|
||||||
|
//draw icon
|
||||||
|
g.drawImage(icon, x-mod/2, y-mod/2, iconWidth+mod, iconHeight+mod);
|
||||||
|
//draw overlay
|
||||||
|
if (overlayIcon != null) {
|
||||||
|
float oldAlpha = g.getfloatAlphaComposite();
|
||||||
|
float overlayWidth = isHovered() ? iconWidth/2.5f : iconWidth/3.5f;
|
||||||
|
float overlayHeight = isHovered() ? iconHeight/2.5f : iconHeight/3.5f;
|
||||||
|
if (!isHovered())
|
||||||
|
g.setAlphaComposite(0.4f);
|
||||||
|
g.drawImage(overlayIcon, iconWidth-overlayWidth+mod, iconHeight-overlayHeight+mod, overlayWidth, overlayHeight);
|
||||||
|
g.setAlphaComposite(oldAlpha);
|
||||||
|
}
|
||||||
|
if (!text.isEmpty()) {
|
||||||
|
x += iconOffset;
|
||||||
|
w -= iconOffset;
|
||||||
|
drawText(g, x, textY, w, h, Align.left);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
else if (!text.isEmpty()) {
|
||||||
else if (!text.isEmpty()) {
|
float oldAlpha = g.getfloatAlphaComposite();
|
||||||
float oldAlpha = g.getfloatAlphaComposite();
|
if (isHovered() && selectable) {
|
||||||
if (isHovered() && selectable) {
|
g.setAlphaComposite(0.4f);
|
||||||
g.setAlphaComposite(0.4f);
|
g.fillRect(Color.GRAY, x, y, w, h);
|
||||||
g.fillRect(Color.GRAY, x, y, w, h);
|
g.setAlphaComposite(oldAlpha);
|
||||||
g.setAlphaComposite(oldAlpha);
|
}
|
||||||
|
drawText(g, x, y, w, h, alignment);
|
||||||
}
|
}
|
||||||
drawText(g, x, y, w, h, alignment);
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user