[Mobile] Deck View on Player Tab

- Deck Viewer is available on Player Tab -> Avatar Image click/tap
This commit is contained in:
Anthony Calosa
2022-01-23 15:48:39 +08:00
parent d5d70b51a7
commit bea0a53cbf
5 changed files with 144 additions and 107 deletions

View File

@@ -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());
} }
} }

View File

@@ -355,19 +355,17 @@ public class MatchScreen extends FScreen {
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);
} }
} }
} }

View File

@@ -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) {

View File

@@ -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

View File

@@ -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,6 +326,7 @@ 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) {
try {
if (icon != null) { if (icon != null) {
float textY = y; float textY = y;
float iconWidth = icon.getWidth(); float iconWidth = icon.getWidth();
@@ -380,8 +386,18 @@ public class FLabel extends FDisplayObject implements IButton {
y += (h - iconHeight) / 2; y += (h - iconHeight) / 2;
} }
float mod = isHovered() && selectable ? iconWidth < iconHeight ? iconWidth/8f : iconHeight/8f : 0; 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); 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()) { if (!text.isEmpty()) {
x += iconOffset; x += iconOffset;
w -= iconOffset; w -= iconOffset;
@@ -397,6 +413,9 @@ public class FLabel extends FDisplayObject implements IButton {
} }
drawText(g, x, y, w, h, alignment); drawText(g, x, y, w, h, alignment);
} }
} catch (Exception e) {
e.printStackTrace();
}
} }
private void drawText(Graphics g, float x, float y, float w, float h, int align) { private void drawText(Graphics g, float x, float y, float w, float h, int align) {