diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java index 2556bda8b2d..11790e70ee5 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java @@ -257,49 +257,53 @@ public class TargetingOverlay { cardPanels.clear(); cardsVisualized.clear(); - switch (matchUI.getCDock().getArcState()) { - case OFF: - return true; - case MOUSEOVER: - // Draw only hovered card - activePanel = null; - for (final VField f : matchUI.getFieldViews()) { - cardPanels.addAll(f.getTabletop().getCardPanels()); - final List cPanels = f.getTabletop().getCardPanels(); - for (final CardPanel c : cPanels) { - if (c.isSelected()) { - activePanel = c; - break; + try { + switch (matchUI.getCDock().getArcState()) { + case OFF: + return true; + case MOUSEOVER: + // Draw only hovered card + activePanel = null; + for (final VField f : matchUI.getFieldViews()) { + cardPanels.addAll(f.getTabletop().getCardPanels()); + final List cPanels = f.getTabletop().getCardPanels(); + for (final CardPanel c : cPanels) { + if (c.isSelected()) { + activePanel = c; + break; + } } } - } - if (activePanel == null) { return true; } - break; - case ON: - // Draw all - for (final VField f : matchUI.getFieldViews()) { - cardPanels.addAll(f.getTabletop().getCardPanels()); - } - } - - //final Point docOffsets = FView.SINGLETON_INSTANCE.getLpnDocument().getLocationOnScreen(); - // Locations of arc endpoint, per card, with ID as primary key. - final Map endpoints = getCardEndpoints(); - - if (matchUI.getCDock().getArcState() == ArcState.MOUSEOVER) { - // Only work with the active panel - if (activePanel != null) { - addArcsForCard(activePanel.getCard(), endpoints, combat); + if (activePanel == null) { return true; } + break; + case ON: + // Draw all + for (final VField f : matchUI.getFieldViews()) { + cardPanels.addAll(f.getTabletop().getCardPanels()); + } } - } - else { - // Work with all card panels currently visible - for (final CardPanel c : cardPanels) { - if (!c.isShowing()) { - continue; + + //final Point docOffsets = FView.SINGLETON_INSTANCE.getLpnDocument().getLocationOnScreen(); + // Locations of arc endpoint, per card, with ID as primary key. + final Map endpoints = getCardEndpoints(); + + if (matchUI.getCDock().getArcState() == ArcState.MOUSEOVER) { + // Only work with the active panel + if (activePanel != null) { + addArcsForCard(activePanel.getCard(), endpoints, combat); } - addArcsForCard(c.getCard(), endpoints, combat); } + else { + // Work with all card panels currently visible + for (final CardPanel c : cardPanels) { + if (!c.isShowing()) { + continue; + } + addArcsForCard(c.getCard(), endpoints, combat); + } + } + } catch (Exception e) { + e.printStackTrace(); } return true; diff --git a/forge-gui-mobile/src/forge/Graphics.java b/forge-gui-mobile/src/forge/Graphics.java index e1d6605f222..4d7d51241bb 100644 --- a/forge-gui-mobile/src/forge/Graphics.java +++ b/forge-gui-mobile/src/forge/Graphics.java @@ -774,7 +774,7 @@ public class Graphics { batch.end(); shaderGrayscale.bind(); shaderGrayscale.setUniformf("u_grayness", percentage); - shaderGrayscale.setUniformf("u_bias", 0.5f); + shaderGrayscale.setUniformf("u_bias", 0.6f); batch.setShader(shaderGrayscale); batch.begin(); //draw gray @@ -788,7 +788,7 @@ public class Graphics { batch.end(); shaderGrayscale.bind(); shaderGrayscale.setUniformf("u_grayness", percentage); - shaderGrayscale.setUniformf("u_bias", withDarkOverlay ? 0.4f : 1f); + shaderGrayscale.setUniformf("u_bias", withDarkOverlay ? 0.5f : 1f); batch.setShader(shaderGrayscale); batch.begin(); //draw gray @@ -802,7 +802,7 @@ public class Graphics { batch.end(); shaderGrayscale.bind(); shaderGrayscale.setUniformf("u_grayness", percentage); - shaderGrayscale.setUniformf("u_bias", withDarkOverlay ? 0.4f : 1f); + shaderGrayscale.setUniformf("u_bias", withDarkOverlay ? 0.5f : 1f); batch.setShader(shaderGrayscale); batch.begin(); //draw gray diff --git a/forge-gui-mobile/src/forge/Shaders.java b/forge-gui-mobile/src/forge/Shaders.java index 5cbdea3b442..18d75c22913 100644 --- a/forge-gui-mobile/src/forge/Shaders.java +++ b/forge-gui-mobile/src/forge/Shaders.java @@ -43,13 +43,11 @@ public class Shaders { " gl_Position = u_projTrans * a_position;\n" + "}"; public static final String fragRipple="#ifdef GL_ES\n" + - "#define PRECISION mediump\n" + - "precision PRECISION float;\n" + - "precision PRECISION int;\n" + + "#define LOWP lowp\n" + + "precision mediump float;\n" + "#else\n" + - "#define PRECISION\n" + + "#define LOWP \n" + "#endif\n" + - "\n" + "uniform sampler2D u_texture;\n" + "varying vec2 v_texCoords;\n" + "uniform float u_time;\n" + @@ -77,13 +75,11 @@ public class Shaders { "\tgl_FragColor = mix(vec4(0.0, 0.0, 0.0, 1.0), vec4(color.rgba * dist), u_bias);\n" + "}"; public static final String fragChromaticAbberation="#ifdef GL_ES\n" + - "#define PRECISION mediump\n" + - "precision PRECISION float;\n" + - "precision PRECISION int;\n" + + "#define LOWP lowp\n" + + "precision mediump float;\n" + "#else\n" + - "#define PRECISION\n" + + "#define LOWP \n" + "#endif\n" + - "\n" + "varying vec2 v_texCoords;\n" + "uniform sampler2D u_texture;\n" + "uniform float u_time;\n" + @@ -105,13 +101,11 @@ public class Shaders { " gl_FragColor = vec4(col,1.0);\n" + "}"; public static final String fragPixelateShader = "#ifdef GL_ES\n" + - "#define PRECISION mediump\n" + - "precision PRECISION float;\n" + - "precision PRECISION int;\n" + + "#define LOWP lowp\n" + + "precision mediump float;\n" + "#else\n" + - "#define PRECISION\n" + + "#define LOWP \n" + "#endif\n" + - "\n" + "uniform sampler2D u_texture;\n" + "uniform float u_cellSize;\n" + "uniform vec2 u_resolution;\n" + @@ -129,9 +123,11 @@ public class Shaders { "\tgl_FragColor = mix(vec4(0.0, 0.0, 0.0, 1.0), texColor, u_bias);\n" + "}"; public static final String fragPixelateShaderWarp = "#ifdef GL_ES\n" + + "#define LOWP lowp\n" + "precision mediump float;\n" + + "#else\n" + + "#define LOWP \n" + "#endif\n" + - "\n" + "varying vec2 v_texCoords;\n" + "uniform sampler2D u_texture;\n" + "\n" + diff --git a/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java b/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java index 4604d138c5d..e22b9e892a3 100644 --- a/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java @@ -22,10 +22,12 @@ public class CharacterSprite extends MapActor { private AnimationDirections currentAnimationDir = AnimationDirections.None; private final Array avatar=new Array<>(); public boolean hidden = false; + private String atlasPath; public CharacterSprite(int id,String path) { super(id); collisionHeight=0.4f; + atlasPath = path; load(path); } public CharacterSprite(String path) { @@ -234,8 +236,13 @@ public class CharacterSprite extends MapActor { public Sprite getAvatar() { + if (avatar == null || avatar.isEmpty()) + return null; return avatar.first(); } + public String getAtlasPath() { + return atlasPath; + } public Sprite getAvatar(int index) { return avatar.get(index); } diff --git a/forge-gui-mobile/src/forge/adventure/scene/ArenaScene.java b/forge-gui-mobile/src/forge/adventure/scene/ArenaScene.java index 0baa4a81e29..7eb9a0c8d29 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/ArenaScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/ArenaScene.java @@ -1,7 +1,10 @@ package forge.adventure.scene; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Group; import com.badlogic.gdx.scenes.scene2d.ui.*; @@ -12,6 +15,7 @@ import forge.Forge; import forge.adventure.character.EnemySprite; import forge.adventure.data.ArenaData; import forge.adventure.data.WorldData; +import forge.adventure.player.AdventurePlayer; import forge.adventure.stage.GameHUD; import forge.adventure.stage.IAfterMatch; import forge.adventure.stage.WorldStage; @@ -25,6 +29,8 @@ import java.util.Random; * Displays the rewards of a fight or a treasure */ public class ArenaScene extends UIScene implements IAfterMatch { + private FileHandle vsIcon = Config.instance().getFile("ui/vs.png"); + private TextureRegion vsTextureRegion = vsIcon.exists() ? new TextureRegion(new Texture(vsIcon)) : null; private static ArenaScene object; private final float gridSize; private ArenaData arenaData; @@ -101,6 +107,7 @@ public class ArenaScene extends UIScene implements IAfterMatch { private void loose() { doneButton.setText(Forge.getLocalizer().getMessage("lblLeave")); + doneButton.layout(); startButton.setDisabled(true); arenaStarted=false; } @@ -123,7 +130,9 @@ public class ArenaScene extends UIScene implements IAfterMatch { goldLabel.setVisible(false); arenaStarted=true; startButton.setText(Forge.getLocalizer().getMessage("lblContinue")); + startButton.layout(); doneButton.setText(Forge.getLocalizer().getMessage("lblConcede")); + doneButton.layout(); Forge.setCursor(null, Forge.magnifyToggle ? "1" : "2"); Current.player().takeGold(arenaData.entryFee); startRound(); @@ -172,6 +181,7 @@ public class ArenaScene extends UIScene implements IAfterMatch { arenaStarted=false; startButton.setDisabled(true); doneButton.setText(Forge.getLocalizer().getMessage("lblDone")); + doneButton.layout(); } } @@ -207,11 +217,12 @@ public class ArenaScene extends UIScene implements IAfterMatch { private void startRound() { DuelScene duelScene = DuelScene.instance(); + EnemySprite enemy = enemies.get(enemies.size-1); FThreads.invokeInEdtNowOrLater(() -> { Forge.setTransitionScreen(new TransitionScreen(() -> { - duelScene.initDuels(WorldStage.getInstance().getPlayerSprite(), enemies.get(enemies.size-1)); - Forge.switchScene(DuelScene.instance()); - }, Forge.takeScreenshot(), true, false)); + duelScene.initDuels(WorldStage.getInstance().getPlayerSprite(), enemy); + Forge.switchScene(duelScene); + }, Forge.takeScreenshot(), true, false, false, false, "", vsTextureRegion, AdventurePlayer.current().avatar(), enemy.getAtlasPath())); }); } @@ -253,7 +264,9 @@ public class ArenaScene extends UIScene implements IAfterMatch { public void loadArenaData(ArenaData data,long seed) { startButton.setText(Forge.getLocalizer().getMessage("lblStart")); + startButton.layout(); doneButton.setText(Forge.getLocalizer().getMessage("lblDone")); + doneButton.layout(); arenaData=data; //rand.setSeed(seed); allow to reshuffle arena enemies for now @@ -275,6 +288,7 @@ public class ArenaScene extends UIScene implements IAfterMatch { goldLabel.setText(data.entryFee +" [+Gold]"); + goldLabel.layout(); goldLabel.setVisible(true); startButton.setDisabled(data.entryFee>Current.player().getGold()); diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index beb9aeef972..0f8685df73a 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -1,6 +1,7 @@ package forge.adventure.scene; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.utils.Array; import com.google.common.collect.Lists; import forge.Forge; @@ -250,7 +251,9 @@ public class DuelScene extends ForgeScene { LobbyPlayer enemyPlayer = GamePlayerUtil.createAiPlayer(currentEnemy.name, selectAI(currentEnemy.ai)); if (!enemy.nameOverride.isEmpty()) enemyPlayer.setName(enemy.nameOverride); //Override name if defined in the map.(only supported for 1 enemy atm) - FSkin.getAvatars().put(90001 + i, enemy.getAvatar(i)); + TextureRegion enemyAvatar = enemy.getAvatar(i); + enemyAvatar.flip(true, false); //flip facing left + FSkin.getAvatars().put(90001 + i, enemyAvatar); enemyPlayer.setAvatarIndex(90001 + i); aiPlayer.setPlayer(enemyPlayer); aiPlayer.setTeamNumber(currentEnemy.teamNumber); diff --git a/forge-gui-mobile/src/forge/adventure/scene/UIScene.java b/forge-gui-mobile/src/forge/adventure/scene/UIScene.java index 353f5e61e63..821c034968c 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/UIScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/UIScene.java @@ -8,6 +8,7 @@ import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.*; +import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Null; @@ -673,4 +674,18 @@ public class UIScene extends Scene { Gdx.input.setInputProcessor(stage); super.enter(); } + public TextureRegion getUIBackground() { + try { + Actor a = ui.getChild(0); + if (a instanceof Image) { + Drawable d = ((Image) a).getDrawable(); + if (d instanceof TextureRegionDrawable) { + return ((TextureRegionDrawable) d).getRegion(); + } + } + } catch (Exception e) { + return null; + } + return null; + } } diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index dca4e703134..d03b2db8740 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -695,7 +695,7 @@ public class MapStage extends GameStage { duelScene.initDuels(player, mob); if (isInMap && effect != null) duelScene.setDungeonEffect(effect); - Forge.switchScene(DuelScene.instance()); + Forge.switchScene(duelScene); }, Forge.takeScreenshot(), true, false)); } }); diff --git a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java index 80def36d02f..79785b31e39 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java @@ -129,7 +129,7 @@ public class WorldStage extends GameStage implements SaveFileContent { FThreads.invokeInEdtNowOrLater(() -> { Forge.setTransitionScreen(new TransitionScreen(() -> { duelScene.initDuels(player, mob); - Forge.switchScene(DuelScene.instance()); + Forge.switchScene(duelScene); }, Forge.takeScreenshot(), true, false)); currentMob = mob; WorldSave.getCurrentSave().autoSave(); diff --git a/forge-gui-mobile/src/forge/screens/TransitionScreen.java b/forge-gui-mobile/src/forge/screens/TransitionScreen.java index 36319f81c2a..d002762df58 100644 --- a/forge-gui-mobile/src/forge/screens/TransitionScreen.java +++ b/forge-gui-mobile/src/forge/screens/TransitionScreen.java @@ -4,6 +4,8 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureRegion; import forge.Forge; import forge.Graphics; +import forge.adventure.scene.ArenaScene; +import forge.adventure.util.Config; import forge.animation.ForgeAnimation; import forge.assets.FSkin; import forge.assets.FSkinImage; @@ -19,20 +21,21 @@ public class TransitionScreen extends FContainer { private BGAnimation bgAnimation; private FProgressBar progressBar; Runnable runnable; - TextureRegion textureRegion; + TextureRegion textureRegion, screenUIBackground, playerAvatar, vsTexture; + String enemyAtlasPath; private String message = ""; - boolean matchTransition, isloading, isIntro, isFadeMusic; + boolean matchTransition, isloading, isIntro, isFadeMusic, isArenaScene; public TransitionScreen(Runnable proc, TextureRegion screen, boolean enterMatch, boolean loading) { this(proc, screen, enterMatch, loading, false, false); } public TransitionScreen(Runnable proc, TextureRegion screen, boolean enterMatch, boolean loading, String loadingMessage) { - this(proc, screen, enterMatch, loading, false, false, loadingMessage); + this(proc, screen, enterMatch, loading, false, false, loadingMessage, null, null, ""); } public TransitionScreen(Runnable proc, TextureRegion screen, boolean enterMatch, boolean loading, boolean intro, boolean fadeMusic) { - this(proc, screen, enterMatch, loading, intro, fadeMusic, ""); + this(proc, screen, enterMatch, loading, intro, fadeMusic, "", null, null, ""); } - public TransitionScreen(Runnable proc, TextureRegion screen, boolean enterMatch, boolean loading, boolean intro, boolean fadeMusic, String loadingMessage) { + public TransitionScreen(Runnable proc, TextureRegion screen, boolean enterMatch, boolean loading, boolean intro, boolean fadeMusic, String loadingMessage, TextureRegion vsIcon, TextureRegion player, String enemy) { progressBar = new FProgressBar(); progressBar.setMaximum(100); progressBar.setPercentMode(true); @@ -46,6 +49,16 @@ public class TransitionScreen extends FContainer { isFadeMusic = fadeMusic; message = loadingMessage; Forge.advStartup = intro && Forge.selector.equals("Adventure"); + if (Forge.getCurrentScene() instanceof ArenaScene) { + isArenaScene = true; + screenUIBackground = ((ArenaScene) Forge.getCurrentScene()).getUIBackground(); + } else { + isArenaScene = false; + screenUIBackground = null; + } + playerAvatar = player; + enemyAtlasPath = enemy; + vsTexture = vsIcon; } public FProgressBar getProgressBar() { @@ -63,7 +76,7 @@ public class TransitionScreen extends FContainer { } private class BGAnimation extends ForgeAnimation { - float DURATION = 0.6f; + float DURATION = isArenaScene ? 1.2f : 0.6f; private float progress = 0; public void drawBackground(Graphics g) { @@ -91,7 +104,7 @@ public class TransitionScreen extends FContainer { g.setAlphaComposite(oldAlpha); } float xmod = Forge.getScreenHeight() > 2000 ? 1.5f : 1f; - xmod *= percentage; + xmod *= 1f;//static logo only float ymod; if (FSkin.getLogo() != null) { ymod = Forge.getScreenHeight()/2 + (FSkin.getLogo().getHeight()*xmod)/2; @@ -116,13 +129,44 @@ public class TransitionScreen extends FContainer { } } else if (matchTransition) { if (textureRegion != null) { - if (GuiBase.isAndroid()) { - g.drawChromatic(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), percentage); + if (isArenaScene) { + float screenW = Forge.isLandscapeMode() ? Forge.getScreenWidth() : Forge.getScreenHeight(); + float screenH = Forge.isLandscapeMode() ? Forge.getScreenHeight() : Forge.getScreenWidth(); + float scale = screenW/4; + float centerX = screenW/2; + float centerY = screenH/2; + TextureRegion enemyAvatar = Config.instance().getAtlas(enemyAtlasPath).createSprite("Avatar"); + enemyAvatar.flip(true, false); + g.setColorRGBA(1f, 1f, 1f, 1.8f - percentage); + g.drawImage(screenUIBackground, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight()); + g.resetColorRGBA(oldAlpha); + if (Forge.isLandscapeMode()) { + g.drawImage(playerAvatar, scale / 3 * percentage, centerY - scale / 2, scale, scale); + g.drawImage(enemyAvatar, screenW - scale - (percentage * scale / 3), centerY - scale / 2, scale, scale); + float vsScale = (screenW / 3.2f) * percentage; + g.startRotateTransform(screenW/2, screenH/2, 180-(180*percentage)); + g.drawImage(vsTexture, centerX - vsScale / 2, centerY - vsScale / 2, vsScale, vsScale); + g.endTransform(); + } else { + g.drawImage(playerAvatar, centerY - scale / 2, scale / 3 * percentage, scale, scale); + g.drawImage(enemyAvatar,centerY - scale / 2 ,screenW - scale - (percentage * scale / 3), scale, scale); + float vsScale = (screenW / 3.2f) * percentage; + g.startRotateTransform(screenH/2, screenW/2, 180-(180*percentage)); + g.drawImage(vsTexture, centerY - vsScale / 2, centerX - vsScale / 2, vsScale, vsScale); + g.endTransform(); + } + g.setAlphaComposite(1-(percentage+0.6f)); + g.drawImage(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight()); + g.setAlphaComposite(oldAlpha); } else { - int max = Forge.isLandscapeMode() ? Forge.getScreenHeight() / 32 : Forge.getScreenWidth() / 32; - int min = Forge.isLandscapeMode() ? Forge.getScreenHeight() / 64 : Forge.getScreenWidth() / 64; - int val = MyRandom.getRandom().nextInt(max - min) + min; - g.drawPixelatedWarp(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), val * percentage); + if (GuiBase.isAndroid()) { + g.drawChromatic(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), percentage); + } else { + int max = Forge.isLandscapeMode() ? Forge.getScreenHeight() / 32 : Forge.getScreenWidth() / 32; + int min = Forge.isLandscapeMode() ? Forge.getScreenHeight() / 64 : Forge.getScreenWidth() / 64; + int val = MyRandom.getRandom().nextInt(max - min) + min; + g.drawPixelatedWarp(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), val * percentage); + } } } } else if (isIntro) { diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 012b3f23938..3620f29edb4 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -903,8 +903,9 @@ public class MatchScreen extends FScreen { boolean isGameFast = MatchController.instance.isGameFast(); float midField = topPlayerPanel.getBottom(); + float promptHeight = !Forge.isLandscapeMode() || bottomPlayerPrompt == null ? 0f : bottomPlayerPrompt.getHeight()/1.3f; float x = topPlayerPanel.getField().getLeft(); - float y = midField - topPlayerPanel.getField().getHeight(); + float y = midField - topPlayerPanel.getField().getHeight() - promptHeight; float w = getWidth() - x; float bgFullWidth, scaledbgHeight; int multiplier = playerPanels.keySet().size() - 1; //fix scaling of background when zoomed in multiplayer diff --git a/forge-gui/res/adventure/Shandalar/ui/vs.png b/forge-gui/res/adventure/Shandalar/ui/vs.png new file mode 100644 index 00000000000..5b323161e73 Binary files /dev/null and b/forge-gui/res/adventure/Shandalar/ui/vs.png differ