mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-14 09:48:02 +00:00
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
This commit is contained in:
@@ -672,12 +672,14 @@ 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(isMultiplayer) {
|
||||
if (c.getOwner().equals(p)) {
|
||||
c.ceaseToExist();
|
||||
} else {
|
||||
@@ -686,7 +688,9 @@ public class Game {
|
||||
this.getAction().exile(c, null);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
c.forceTurnFaceUp();
|
||||
}
|
||||
}
|
||||
|
||||
// 901.6: If the current planar controller would leave the game, instead the next player
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -6331,6 +6331,12 @@ public class Card extends GameEntity implements Comparable<Card> {
|
||||
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();
|
||||
|
||||
@@ -886,12 +886,6 @@ public class CardView extends GameEntityView {
|
||||
}
|
||||
public String getImageKey(Iterable<PlayerView> 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);
|
||||
|
||||
@@ -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),
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<VPlayerPanel> 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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ public class ViewWinLose extends FOverlay implements IWinLoseView<FButton> {
|
||||
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<FButton> {
|
||||
}
|
||||
}).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<FButton> {
|
||||
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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user