From 92ce6a4fde6d667c0abede677e3fecd1b1133978 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 30 Nov 2022 18:40:29 +0800 Subject: [PATCH] update TransitionScreen - update Shaders - adjust bgmatch y-axis - adjust graytransition bias - add versus bg for ArenaScene --- .../forge/screens/match/TargetingOverlay.java | 80 +++++++++--------- forge-gui-mobile/src/forge/Graphics.java | 6 +- forge-gui-mobile/src/forge/Shaders.java | 28 +++--- .../adventure/character/CharacterSprite.java | 7 ++ .../src/forge/adventure/scene/ArenaScene.java | 20 ++++- .../src/forge/adventure/scene/DuelScene.java | 5 +- .../src/forge/adventure/scene/UIScene.java | 15 ++++ .../src/forge/adventure/stage/MapStage.java | 2 +- .../src/forge/adventure/stage/WorldStage.java | 2 +- .../src/forge/screens/TransitionScreen.java | 70 ++++++++++++--- .../src/forge/screens/match/MatchScreen.java | 3 +- forge-gui/res/adventure/Shandalar/ui/vs.png | Bin 0 -> 6037 bytes 12 files changed, 161 insertions(+), 77 deletions(-) create mode 100644 forge-gui/res/adventure/Shandalar/ui/vs.png 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 0000000000000000000000000000000000000000..5b323161e73700462f7d922049f7f904d2d3c9a3 GIT binary patch literal 6037 zcmeHLc~n!^x(^NvqCm9{6od#7yoJmVLLh*mV3dGfEvN_>k`M!AAPJBV8LV@QqTs+7 z>WEepg-VoJsUTAjX&Gde2qHt6Ljr+!P_*rPw|!l2t^5AES?jFq;oHA&`t5J;bI$B? zcU`gUt7RY%Xa!;W)_;OPYUk%4O?6--rWjKV{Asbb@8^O*+NDwbX)IAaId&v<&WLt`fqXXEUj{^W0R2~V;X9P33I6mIw11=6|&kw^*z#l|-L3oqR z^9sTHh`YefEDjZnfgzw|1Of%Nv4tTqR%i^u5{yEi5O4$vjzmKdNF2fjheClDekOo6 z4kZBh&#f*Cx_}uN#=+s?;o-1wG>pZe!I8GMw(}S$6cmtvas^Bti4SFRO+O)Q zrE!%5hW6F z1SXe9Vv?zZt#}i_C>Whi!C6^hkQB5{0F;EpVxdT^6%uM|MMgr&Rupsq7HjQ~_Q!s( z3s}FEMGl=0-~9TIw571f0LJGC;cO8B))*83ge4)cP>PL}71ZArjf7&+7;77AK$U+0 z@)Mc|hYsu~O}XOL)AIGaf`0sm%=Gb@I4h>V-GcCp%qLA ze;^%>M4sn5-h@1#WGcmEVVM3eqWAag{0JL1 z3Uoe~XDSnb<^aXF(!0kE1p0zY*t&TyKXtH;7z>g6ly|X0YX|OzCp00$Vz<13Y)6JH zTB!!xY#W1ps;1>`3;se!(_M4JhI0oux9Wi*obQ~L9eg|-=6uiz%Sqj;Rr!6$mN!ev z4Z7PVh6=t3c_$hesva7zX8o9dH$UC=tHJ8=;ECv4`S0t$Y4e%8)t?6{*?;yj9t84C zhym>~0fR1TYJxT{TI6)*Kiz*%G%6YhYcWJFwBjbDrJnVOFl5%85{2J^a_1llEeVrx zmUFXNjdf?DOCjQ3cACs%RAmblw(H2u5Ad ztC_gjMq>58S(JM2Ei>ML0CUfp_OER$_4koT!`dW;gB@voRPTCO`cJA9>iK?lV`#?Q zQ`bm{;z+!t{E0)dv1f{%yPf=B{C^_!a>>YF#hHStaT3Auh&qo ztv?tc^sB9!4y&zd*_$;{P_PpZkE?kppCnxkSSp=35$j(VNo!u*d37>i?nP2H?xMPG z&a0MF`_<^QgOWGvErlS^nHbA09R^3#^lxcb8G$V5HyeBRtBs&K#)M6GPf5t)-nVse zq0x^vjMdGfE?E?_^3(&+riU88k&?f9%>qd?MVF%5roI~cZW~6D>D21;ViQ)I1zDm_ z@^mW5pPX?=n}hDw8fmV!D2z;8tw&pjFW&6F&ROQEOm(rW*}*anSbAgsi%kvQ9dQVl zyukjDpdmu{cvqj$1fuNHTVvqr)FT5Nlsyz(adl)ug`mtEMPglT>mWJdkVJL@k_8cb zolq?A(q8qtuQ5X)jhNz2Iw;59LS&W4#`v+EN&K065co#H{fv-@`;|=&2VWF2Cek5_ zHc|Q1c4A{_T+su1(RrzJq;FSyyKippNnukK9V4TsZ|E>f;R_9M^ft-}v!f`j+{j=? zEhcNDqC~Kk^Lko@UmmkZZ@hcSl9-ihYS^VhaJklpeal`p>2z+D9%#psC7oXm95plt zgZjx=Gk*Ev!_d6&4_lo;oBr5!Cv9tYJ=pei`0w+!(yEhIe3~&Tgzfed^Hc`+7g$p~N+VWvqlg_xa_ zG7wq|$%;lbPw#+}g$jeYD{@u!&O*zeOS}%n)G_&;940GSyMD0LQ}miS`o_^paW&kG zm=IfD!FP#H>1mJb9PYS9aJgPl-XfAk7Wb@;AE2N-BAO%j5at+-p~cGE>E3*&Jn!hV z*pvC_snM#^^(_TIiD%8aN8+7})J0MDeKMzVae{aHd;0#031ZvRg6XV6Xke=kAvO zOTErMQ*W+ja7~ak)>NB-|0{X`Y-s{r4`?<$wEiQ>3`(@{i5efMbZAx6Qj*R`8ZI!a z33RX5DRHsd(G{JM$E%OUl&Ci~i+`+l7=b)rY0z@dTLsnD(b623o{8fLhF7fZ6~4JTEt}P`R}I%Qd?QH~jaj++ zae1-jgjYBEb;_Fz9jkwp7F8J|%dDfBRI9d-{`e#PznaxXW%|75pLB6L7c(xcdF3>vZ;Bd&c zKv(+sgogAPzphcU#2$NmDSO#jZqmYHiF8HAgCTDE-VcW!}?nC zygtL13=fYTkBGTtn4`|w(Ni2(51goKw#$5|oo1s-VF*s!d({xQMmEH;6A(h07S6PO z5}9EqFQd}nikESiCr9oShhSuno|D%pQ@v&>6Bkk_TFBPSdx>wE&75q0UdQKEkw~Zw#hEZaOL#yKgvP_9pzQT-1}le z%MC_CY~Bq@0($clY7%m2ReEk>N}8`X)r}~G-PhJ5?ir( zvSl|cw&f=uRA6#adDT#E#bK+;+w=sOzRx?xVKx)4^0~rnSQAJ{w&rW?sjumai5MI1 zw)9G9O|Du!`R=*nfl19Zy~ciSQFHZGM$aRrT8(Xz8kIcXj{Ih6?;JakoRV=htIBai zSY`Co&2J!YNa5=9_?`L?Y)YBfrK;s`xe0eZ>-uIwSzUfj=B2}4UOlPqaO$TsIyxr} zY&;vUEk;dwg))-EO5&3HYVW5c**>6Y|JhB>5(oa)8euBd+(j9C*!B9T=&;T@huEOunTxkA%I+Fpe3`s{a+X$erd@or7UMATtm?Y`$i6E!OltzVKlFaR zq7f}11Ya?&Kh3gHyo(#R(Ju|MNvMsCyeRhT&&G@J+U=^N{CyU){n0{$*JZ*H10w8P zzTtqm2Ax9_SKZV{cN+dw@%)}y%XOGdc*5ZB1UsRRuMn-cnLfY@?l=;O>cxk$1|iXN z&o&t!xm86W7K?`*D-Y+rT0grNt@1?&-saA*1IkYIFlO9h|_w%nf>Vb7vz_Z0nPt0*X?+c1y*t zM!im|+N_PmBfTmpYg;PTTzO6Igpr(0QNdVNBGv6v6A!{)$}X15qGpD3m}h&`2hSaG zC=Ts@fAa}6f_m@i?#HD3hOsoJ{lI!ygw=tO!egP_tL2GV+G$I-F#v&O1voFXencP9A6&?tZFNalCN{=AAS?! z{+tUg&3-$HEo(U39#K>er0eqa)#u57sK)a*f!~h(^S1rdGeKSrJ(fQ{I8Y{W4vz&? zc-FG~+M4@ALzX9sV|A+9k9tct0g6;2k2?|cmNfnztZ?c9_EB}nA{0&b_?2uFhCBWU z>9P#9i7YNh20&7CcCL-jpC$-jQi=y(-KdDNN&1#+pBz~^WL$lxb>sCqif;g>G@Nyg zquP=JOL(%`tUk9rf974|cvg_PIil?=v10ZfH7f_nC|yRkHAsgXC))wYZzfpVpcS!k#v+7|WgH zUh5bl>7PQw3ob~#@s@E>KJW9G@CsiuvHWbQcHaH`G|O?ds?t_TMCMMmnP{=Ca(w7zleCdyFSDNCIlJgVmNDPWzS)Wgvij{xJi3AfvZGyL^7hGNf&})3yIZ&dB{| z>zbG6+!}HCekX7p(BWRIElnV_SNFMJ4KbHvjN}@MVPV!r0WI3uTPuCXs76w?M|%Lu zOMrTUX7)ZU?hntHV-n%{(NSZCeT@vW`W3p(-AVRSd{g<52E%OZak`XE?Wj8Tg|Y?` z-OxSNwA{~a^nzPMN*ctAHZxP#)LP6u7vGxZZm!xTL5{Pth;wbW-E+dG>n|H~1ZoN~ zq(ksR&JqnrOO#@xWP`Y=SyQhfec#(U$Iph@B@DilMEa#acaKjED}S~jQy~m)UcB$y z{c(9oHHQ6r3mEfP%Q5kp@-lqflB&AiF=Mor=GgE#AW(^pYDvX|&5qe&?FS}74Kan- zuY1ORyzQ!YUSXH0GG$jkr|QOBvg-fFt8k@WPgiBO#shUv)i-p@Q@u{0KNhUt^IXyL zbNH9SF{#3K4`y}#_XQ}mBu9fqU$0S~MBLWX>v@`gySCQX@R&JxEd0&I^Fft&+$6Hs z*%~D~4!pzoIQ6hr+1%2`>*U{ZtK9Z{KMicZmU|6e_Q*}-R-90A@@iUCQD8=d;}Hki z#R?g^vhYb|dD4u?W255LGuK>^$Yb;pRoA~$$2{2JtuL>|9@{umm);_Ziah_Tw?!?HFr&*64v6Qk?hw=iU4N>(j%G<0XY%3Pb2Ao&Ru7*yg_V{+2`E F{uld+v=IOR literal 0 HcmV?d00001