From d754c2c4d3c64b0f1ae99cd5e6618d69addb5bb9 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 26 Apr 2020 15:00:57 +0800 Subject: [PATCH] Update Win/Lose Overlay (mobile) At the end of the match, user can minimize the overlay to see the last battlefield and browse other zones, to bring up the overlay, click game menu, and click Show WinLose Overlay. Also fixes issue #928 --- forge-game/src/main/java/forge/game/Game.java | 18 +++++++++++------- forge-game/src/main/java/forge/game/Match.java | 6 ++++++ .../src/main/java/forge/game/card/Card.java | 6 ++++++ .../main/java/forge/game/card/CardView.java | 6 ------ .../forge/trackable/TrackableProperty.java | 4 ++-- .../src/forge/CachedCardImage.java | 4 ++++ .../src/forge/card/CardImageRenderer.java | 7 +++---- .../src/forge/card/CardRenderer.java | 5 ++--- .../forge/screens/match/MatchController.java | 8 +++++++- .../src/forge/screens/match/MatchScreen.java | 11 +++++++++++ .../forge/screens/match/views/VGameMenu.java | 6 ++++++ .../screens/match/views/VZoneDisplay.java | 4 ++-- .../screens/match/winlose/ViewWinLose.java | 9 ++++++++- .../main/java/forge/match/AbstractGuiGame.java | 3 +++ 14 files changed, 71 insertions(+), 26 deletions(-) diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 8607e9342e2..75df1aa51f2 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -672,21 +672,25 @@ public class Game { // Rule 800.4 Losing a Multiplayer game CardCollectionView cards = this.getCardsInGame(); boolean planarControllerLost = false; + boolean isMultiplayer = this.getPlayers().size() > 2; for(Card c : cards) { if (c.getController().equals(p) && (c.isPlane() || c.isPhenomenon())) { planarControllerLost = true; } - if (c.getOwner().equals(p)) { - c.ceaseToExist(); - } else { - c.removeTempController(p); - if (c.getController().equals(p)) { - this.getAction().exile(c, null); + if(isMultiplayer) { + if (c.getOwner().equals(p)) { + c.ceaseToExist(); + } else { + c.removeTempController(p); + if (c.getController().equals(p)) { + this.getAction().exile(c, null); + } } + } else { + c.forceTurnFaceUp(); } - } // 901.6: If the current planar controller would leave the game, instead the next player diff --git a/forge-game/src/main/java/forge/game/Match.java b/forge-game/src/main/java/forge/game/Match.java index 1ef3b279a23..a7b9822938f 100644 --- a/forge-game/src/main/java/forge/game/Match.java +++ b/forge-game/src/main/java/forge/game/Match.java @@ -285,6 +285,12 @@ public class Match { if (null != cardsComplained) { rAICards.putAll(player, cardsComplained); } + } else { + //reset cards to fix weird issues on netplay nextgame client + for (Card c : player.getCardsIn(ZoneType.Library)) { + c.setTapped(false); + c.resetActivationsPerTurn(); + } } if (myRemovedAnteCards != null && !myRemovedAnteCards.isEmpty()) { diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index e4989484b0c..d16459266bb 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6331,6 +6331,12 @@ public class Card extends GameEntity implements Comparable { getGame().getTriggerHandler().clearSuppression(TriggerType.ChangesZone); } + public void forceTurnFaceUp() { + getGame().getTriggerHandler().suppressMode(TriggerType.TurnFaceUp); + turnFaceUp(false, false); + getGame().getTriggerHandler().clearSuppression(TriggerType.TurnFaceUp); + } + public final void addGoad(Long timestamp, final Player p) { goad.put(timestamp, p); updateAbilityTextForView(); diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 9e89b7ffa07..40933837039 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -886,12 +886,6 @@ public class CardView extends GameEntityView { } public String getImageKey(Iterable viewers) { if (canBeShownToAny(viewers)) { - // Morph cards can only be present on the battlefield and on stack, otherwise show a standard card back - if (getZone() != ZoneType.Battlefield && getZone() != ZoneType.Stack) { - if (isFaceDown() && get(TrackableProperty.ImageKey).equals(ImageKeys.getTokenKey(ImageKeys.MORPH_IMAGE))) { - return ImageKeys.getTokenKey(ImageKeys.HIDDEN_CARD); - } - } return get(TrackableProperty.ImageKey); } return ImageKeys.getTokenKey(ImageKeys.HIDDEN_CARD); diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 039085ee9d0..d5df5b8aef8 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -61,8 +61,8 @@ public enum TrackableProperty { Haunting(TrackableTypes.CardViewType), MustBlockCards(TrackableTypes.CardViewCollectionType), PairedWith(TrackableTypes.CardViewType), - CurrentState(TrackableTypes.CardStateViewType, FreezeMode.IgnoresFreezeIfUnset), - AlternateState(TrackableTypes.CardStateViewType), + CurrentState(TrackableTypes.CardStateViewType, FreezeMode.IgnoresFreeze), + AlternateState(TrackableTypes.CardStateViewType, FreezeMode.IgnoresFreeze), HiddenId(TrackableTypes.IntegerType), ExertedThisTurn(TrackableTypes.BooleanType), diff --git a/forge-gui-mobile/src/forge/CachedCardImage.java b/forge-gui-mobile/src/forge/CachedCardImage.java index a58ffff4a27..d10b1dea577 100644 --- a/forge-gui-mobile/src/forge/CachedCardImage.java +++ b/forge-gui-mobile/src/forge/CachedCardImage.java @@ -37,5 +37,9 @@ public abstract class CachedCardImage implements ImageFetcher.Callback { return ImageCache.getImage(key, true); } + public Texture getImage(String mykey) { + return ImageCache.getImage(mykey, true); + } + public abstract void onImageFetched(); } diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index 8bedd01ae42..969110d178c 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -6,7 +6,6 @@ import com.badlogic.gdx.utils.Align; import com.google.common.collect.ImmutableList; import forge.Forge; import forge.Graphics; -import forge.ImageKeys; import forge.assets.FBufferedImage; import forge.assets.FImage; import forge.assets.FSkin; @@ -334,7 +333,7 @@ public class CardImageRenderer { public static void drawZoom(Graphics g, CardView card, GameView gameView, boolean altState, float x, float y, float w, float h, float dispW, float dispH, boolean isCurrentCard) { boolean canshow = MatchController.instance.mayView(card); - final Texture image = ImageCache.getImage(card.getState(altState).getImageKey(MatchController.instance.getLocalPlayers()), true); + final Texture image = ImageCache.getImage(card.getState(altState).getImageKey(), true); FImage sleeves = MatchController.getPlayerSleeve(card.getOwner()); if (image == null) { //draw details if can't draw zoom drawDetails(g, card, gameView, altState, x, y, w, h); @@ -388,7 +387,7 @@ public class CardImageRenderer { } else g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90); } else { - if (Forge.enableUIMask && canshow && !ImageKeys.getTokenKey(ImageKeys.MORPH_IMAGE).equals(card.getState(altState).getImageKey())) { + if (Forge.enableUIMask && canshow) { if (ImageCache.isExtendedArt(card)) g.drawImage(image, x, y, w, h); else { @@ -396,7 +395,7 @@ public class CardImageRenderer { g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); } } else { - if (canshow && !ImageKeys.getTokenKey(ImageKeys.MORPH_IMAGE).equals(card.getState(altState).getImageKey())) + if (canshow) g.drawImage(image, x, y, w, h); else // sleeve g.drawImage(sleeves, x, y, w, h); diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 6dd24b6d0b8..d0cc8b457b0 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -19,7 +19,6 @@ import forge.CachedCardImage; import forge.Forge; import forge.FThreads; import forge.Graphics; -import forge.ImageKeys; import forge.StaticData; import forge.assets.FImage; import forge.assets.FImageComplex; @@ -482,8 +481,8 @@ public class CardRenderer { } } public static void drawCard(Graphics g, CardView card, float x, float y, float w, float h, CardStackPosition pos, boolean rotate) { - boolean canshow = MatchController.instance.mayView(card) && !ImageKeys.getTokenKey(ImageKeys.MORPH_IMAGE).equals(card.getCurrentState().getImageKey()); - Texture image = new RendererCachedCardImage(card, false).getImage(); + boolean canshow = MatchController.instance.mayView(card); + Texture image = new RendererCachedCardImage(card, false).getImage(card.getCurrentState().getImageKey()); FImage sleeves = MatchController.getPlayerSleeve(card.getOwner()); float radius = (h - w)/8; float croppedArea = isModernFrame(card) ? CROP_MULTIPLIER : 0.97f; diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index bb1a451fa4c..618127e4bd8 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -226,6 +226,11 @@ public class MatchController extends AbstractGuiGame { view.getStack().checkEmptyStack(); } + public void showWinlose() { + if (view.getViewWinLose() != null) + view.getViewWinLose().setVisible(true); + } + @Override public void updateTurn(final PlayerView player) { } @@ -254,7 +259,8 @@ public class MatchController extends AbstractGuiGame { @Override public void finishGame() { if (hasLocalPlayers() || getGameView().isMatchOver()) { - new ViewWinLose(getGameView()).setVisible(true); + view.setViewWinLose(new ViewWinLose(getGameView())); + view.getViewWinLose().setVisible(true); } } diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index b936f316255..ae742e66449 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -9,6 +9,7 @@ import java.util.Set; import com.badlogic.gdx.graphics.Color; +import forge.screens.match.winlose.ViewWinLose; import forge.util.Localizer; import org.apache.commons.lang3.tuple.Pair; @@ -78,6 +79,8 @@ public class MatchScreen extends FScreen { private VPlayerPanel bottomPlayerPanel, topPlayerPanel; private AbilityEffect activeEffect; + private ViewWinLose viewWinLose = null; + public MatchScreen(List playerPanels0) { super(new FMenuBar()); @@ -292,6 +295,14 @@ public class MatchScreen extends FScreen { return topPlayerPanel; } + public void setViewWinLose( ViewWinLose viewWinLose ){ + this.viewWinLose = viewWinLose; + } + + public ViewWinLose getViewWinLose() { + return viewWinLose; + } + public VPlayerPanel getBottomPlayerPanel() { return bottomPlayerPanel; } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java b/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java index 8e3dd1579a6..e64b8046373 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java @@ -92,5 +92,11 @@ public class VGameMenu extends FDropDownMenu { SettingsScreen.show(false); } })); + addItem(new FMenuItem("Show WinLose Overlay", null, new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + MatchController.instance.showWinlose(); + } + })); } } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VZoneDisplay.java b/forge-gui-mobile/src/forge/screens/match/views/VZoneDisplay.java index 1b814d2752f..5421f3affee 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VZoneDisplay.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VZoneDisplay.java @@ -67,8 +67,8 @@ public class VZoneDisplay extends VCardDisplayArea { private void setRevealedPanel(int idx) { try { - revealedPanel = cardPanels.get(idx); //??? on network match, triggered by card ability - } catch (ArrayIndexOutOfBoundsException e) { + revealedPanel = cardPanels.get(idx); //on network match, when zoomed and cast a card would randomly trigger the bug + } catch (Exception e) { //before it was arrayindexoutofbounds, then indexoutofbounds, so just use a general exception e.printStackTrace(); return; } diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java index 296d1f2a6e7..dd0d2c3bebb 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java @@ -36,7 +36,7 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { private static final float GAP_Y_FACTOR = 0.02f; private final FButton btnContinue, btnRestart, btnQuit; - private final FLabel lblTitle, lblLog, lblStats, btnCopyLog; + private final FLabel lblTitle, lblLog, lblStats, btnCopyLog, btnMinimize; private final FTextArea txtLog; private final OutcomesPanel pnlOutcomes; private final GameView game; @@ -114,6 +114,12 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { } }).build()); + btnMinimize = add(new FLabel.ButtonBuilder().text("Minimize").font(FSkinFont.get(12)).command(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + hide(); + } + }).build()); lblTitle.setText(composeTitle(game0)); showGameOutcomeSummary(); @@ -200,6 +206,7 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { float y2 = height - dy - h; btnCopyLog.setBounds(width / 4, y2, width / 2, h); txtLog.setBounds(x, y, w, y2 - y - dy); + btnMinimize.setBounds(0, 0, width, h); } private static class OutcomesPanel extends FContainer { diff --git a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java index d155759e9c7..99207da8cbb 100644 --- a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java @@ -182,6 +182,9 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { return true; //if not in game, card can be shown } if(GuiBase.getInterface().isLibgdxPort()){ + if(gameView.isGameOver()) { + return true; + } if(spectator!=null) { //workaround fix!! this is needed on above code or it will gameControllers.remove(spectator); //bug the UI! remove spectator here since its must not be here... return true;