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;