diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index a8de37b72f4..ded55baea98 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -153,12 +153,7 @@ public class GuiMobile implements IGuiBase { @Override public void showImageDialog(final ISkinImage image, final String message, final String title) { if (Forge.isMobileAdventureMode) { - FThreads.invokeInEdtNowOrLater(new Runnable() { - @Override - public void run() { - MapStage.getInstance().showImageDialog("Achievement Earned\n"+message, (FBufferedImage)image); - } - }); + FThreads.invokeInEdtNowOrLater(() -> MapStage.getInstance().showImageDialog("Achievement Earned\n"+message, (FBufferedImage)image)); return; } new WaitCallback() { diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 34d4e789cc7..95928256463 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -347,8 +347,8 @@ public class GameHUD extends Stage { restorePlayerCollision(); if (openMapActor != null) { String val = "[%80]" + Forge.getLocalizer().getMessageorUseDefault("lblZoom", "Zoom"); - for (AdventureQuestData adq: Current.player().getQuests()) { - if (adq.getTargetPOI() !=null) { + for (AdventureQuestData adq : Current.player().getQuests()) { + if (adq.getTargetPOI() != null) { val = "[%80][+GPS] " + Forge.getLocalizer().getMessageorUseDefault("lblZoom", "Zoom"); break; } @@ -357,12 +357,14 @@ public class GameHUD extends Stage { openMapActor.layout(); } } + void clearAbility() { for (TextraButton button : abilityButtonMap) { button.remove(); } abilityButtonMap.clear(); } + void updateAbility() { clearAbility(); setAbilityButton(AdventurePlayer.current().getEquippedAbility1()); @@ -406,6 +408,7 @@ public class GameHUD extends Stage { playAudio(); } } + public void playAudio() { switch (GameScene.instance().getAdventurePlayerLocation(false, false)) { case "capital": @@ -435,6 +438,12 @@ public class GameHUD extends Stage { } } + public boolean audioIsPlaying() { + if (audio == null) + return false; + return audio.getRight().isPlaying(); + } + @Override public void act(float delta) { super.act(delta); @@ -610,6 +619,7 @@ public class GameHUD extends Stage { } opacity = visible ? 1f : 0.4f; } + void toggleConsole() { console.toggle(); if (console.isVisible()) { @@ -679,6 +689,7 @@ public class GameHUD extends Stage { public void setDebug(boolean b) { debugMap = b; } + public void playerIdle() { if (MapStage.getInstance().isInMap()) { MapStage.getInstance().startPause(1f); @@ -688,6 +699,7 @@ public class GameHUD extends Stage { WorldStage.getInstance().getPlayerSprite().stop(); } } + private void showDialog() { playerIdle(); dialogButtonMap.clear(); @@ -789,10 +801,11 @@ public class GameHUD extends Stage { } void changeBGM(MusicPlaylist playlist) { - if (!playlist.equals(SoundSystem.instance.getCurrentPlaylist())) { + if (!audioIsPlaying() && !playlist.equals(SoundSystem.instance.getCurrentPlaylist())) { SoundSystem.instance.setBackgroundMusic(playlist); } } + void flicker(CharacterSprite sprite) { if (sprite.getCollisionHeight() == 0f) { SequenceAction flicker = new SequenceAction(Actions.fadeOut(0.25f), Actions.fadeIn(0.25f), Actions.fadeOut(0.25f), Actions.fadeIn(0.25f), new Action() { @@ -810,6 +823,7 @@ public class GameHUD extends Stage { sprite.addAction(flicker); } } + void restorePlayerCollision() { flicker(MapStage.getInstance().getPlayerSprite()); flicker(WorldStage.getInstance().getPlayerSprite()); diff --git a/forge-gui-mobile/src/forge/adventure/util/MapDialog.java b/forge-gui-mobile/src/forge/adventure/util/MapDialog.java index e29296ec7dc..7638fc2fd6e 100644 --- a/forge-gui-mobile/src/forge/adventure/util/MapDialog.java +++ b/forge-gui-mobile/src/forge/adventure/util/MapDialog.java @@ -166,6 +166,7 @@ public class MapDialog { int vol = FModel.getPreferences().getPrefInt(ForgePreferences.FPref.UI_VOL_MUSIC); if (vol > 0) { fadeOut(); + audio.getRight().setOnCompletionListener(music -> fadeIn()); audio.getRight().play(); } } else { diff --git a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java index fd8e614d9f2..b27e814b908 100644 --- a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java @@ -33,6 +33,7 @@ import forge.adventure.scene.RewardScene; import forge.adventure.scene.Scene; import forge.adventure.scene.UIScene; import forge.assets.FSkin; +import forge.assets.FSkinImage; import forge.assets.ImageCache; import forge.card.CardImageRenderer; import forge.card.CardRenderer; @@ -73,7 +74,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb boolean clicked = false; boolean sold = false; boolean flipOnClick; - private boolean hover; + private boolean hover, hasbackface; boolean loaded = true; boolean alternate = false, shown = false; @@ -176,6 +177,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } switch (reward.type) { case Card: { + hasbackface = reward.getCard().hasBackFace(); if (ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false)) && !Forge.enableUIMask.equals("Art")) { int count = 0; PaperCard card = ImageUtil.getPaperCardFromImageKey(reward.getCard().getImageKey(false)); @@ -203,7 +205,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } ImageCache.updateSynqCount(frontFace, count); //preload card back for performance - if (reward.getCard().hasBackFace() && ImageCache.imageKeyFileExists(reward.getCard().getImageKey(true))) { + if (hasbackface && ImageCache.imageKeyFileExists(reward.getCard().getImageKey(true))) { PaperCard cardBack = ImageUtil.getPaperCardFromImageKey(reward.getCard().getImageKey(true)); File backFace = ImageKeys.getImageFile(cardBack.getCardAltImageKey()); if (backFace != null) { @@ -276,14 +278,15 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } ImageCache.updateSynqCount(file, 1); } - } catch (Exception e) {} + } catch (Exception e) { + } } T = renderPlaceholder(new Graphics(), reward.getCard(), false); //Now we can render the card. setCardImage(T); loaded = false; if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) fetcher.fetchImage(reward.getCard().getImageKey(false), this); - if (reward.getCard().hasBackFace()) { + if (hasbackface) { if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(true))) { fetcher.fetchImage(reward.getCard().getImageKey(true), null); } @@ -317,7 +320,6 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } - String imageKey = ""; String editionCode = ""; try { @@ -330,8 +332,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb artIndex = Aggregates.randomInt(1, 2);//MyRandom.getRandom().nextInt(maxIdx) + 1; imageKey = ImageKeys.BOOSTER_PREFIX + editionCode + ((1 >= maxIdx) ? "" : ("_" + artIndex)); } - } - catch (Exception e){ + } catch (Exception e) { //Comment did not contain the edition code, this is not a basic booster pack } boolean isBooster = false; @@ -345,7 +346,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } setItemTooltips(item, backSprite, isBooster); - processSprite(backSprite, item, Controls.newTextraLabel("[%200]" + editionCode + " Booster"), 0, -10, isBooster); + processSprite(backSprite, item, Controls.newTextraLabel("[%200]" + editionCode + " Booster"), 0, -10, isBooster); needsToBeDisposed = true; break; } @@ -471,8 +472,8 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } else if (realY > y) { y *= 1.1f; } - float fW = x > y ? x : y; - float fH = x > y ? y : x; + float fW = Math.max(x, y); + float fH = Math.min(x, y); float mul = fW / fH < AR ? AR / (fW / fH) : (fW / fH) / AR; Float custom = Forge.isLandscapeMode() ? Config.instance().getSettingData().cardTooltipAdjLandscape : Config.instance().getSettingData().cardTooltipAdj; if (custom != null && custom != 1f) { @@ -555,7 +556,8 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } private void processSprite(Sprite sprite, Sprite item, TextraLabel itemText, int modX, int modY, boolean isBooster) { - int pw = 192; int ph = 256; + int pw = 192; + int ph = 256; FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGB888, pw, ph, false); SpriteBatch batch = new SpriteBatch(); @@ -574,9 +576,9 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb if (!isBooster) { float iw = item.getWidth() * 4; float ih = item.getHeight() * 4; - batch.draw(item, pw / 2 - iw / 2, (ph / 2 - ih / 2), iw, ih); + batch.draw(item, pw / 2f - iw / 2f, (ph / 2f - ih / 2f), iw, ih); } else - batch.draw(item, pw / 4, ph / 4, pw / 2, ph / 2); + batch.draw(item, pw / 4f, ph / 4f, pw / 2f, ph / 2f); } if (itemText != null) { itemText.setWrap(true); @@ -612,10 +614,11 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb getGraphics().startClip(); getGraphics().drawImage(backSprite, 0, 0, preview_w, preview_h); if (!isBooster) - getGraphics().drawImage(icon, preview_w / 2 - 75, 160, 160, 160); + getGraphics().drawImage(icon, preview_w / 2f - 75, 160, 160, 160); else getGraphics().drawImage(icon, 0, 0, preview_w, preview_h); - BitmapFont font = Controls.getBitmapFont("default", 4 / (preview_h / preview_w)); + float div = (float) preview_h / preview_w; + BitmapFont font = Controls.getBitmapFont("default", 4 / div); layout.setText(font, itemExists ? item.name : getReward().type.name(), Color.WHITE, preview_w - 64, Align.center, true); getGraphics().drawText(font, layout, 32, preview_h - 70); align = itemExists ? Align.topLeft : Align.top; @@ -627,7 +630,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } else { description = "Adds " + getReward().getCount() + " " + getReward().type; } - if (description.isEmpty() && item.questItem) + if (itemExists && description.isEmpty() && item.questItem) description = "Quest Item"; getGraphics().end(); getGraphics().endClip(); @@ -783,7 +786,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb batch.end(); shaderRoundRect.bind(); shaderRoundRect.setUniformf("u_resolution", image.getWidth(), image.getHeight()); - shaderRoundRect.setUniformf("edge_radius", (image.getHeight() / image.getWidth()) * 20); + shaderRoundRect.setUniformf("edge_radius", (float) (image.getHeight() / image.getWidth()) * 20); shaderRoundRect.setUniformf("u_gray", sold ? 1f : 0f); batch.setShader(shaderRoundRect); batch.begin(); @@ -811,6 +814,11 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb batch.begin(); } } + if (hasbackface) { + TextureRegion icon = FSkinImage.ADV_FLIPICON.getTextureRegion(); + float scale = getHeight() / 4f; + batch.draw(icon, getOriginX() - scale / 2f, getOriginY() - scale / 2f, scale, scale); + } } } @@ -979,8 +987,8 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb if (!frontSideUp()) return; tooltip_actor.setBounds(tooltip_actor.cImage.getX(), tooltip_actor.cImage.getY(), tooltip_actor.cImage.getPrefWidth(), tooltip_actor.cImage.getPrefHeight()); - tooltip_actor.cLabel.setX(Scene.getIntendedWidth() / 2 - tooltip_actor.width / 2); - tooltip_actor.cLabel.setY(Scene.getIntendedHeight() / 2 - tooltip_actor.inset); + tooltip_actor.cLabel.setX(Scene.getIntendedWidth() / 2f - tooltip_actor.width / 2); + tooltip_actor.cLabel.setY(Scene.getIntendedHeight() / 2f - tooltip_actor.inset); getStage().addActor(tooltip_actor); TextraButton done = getStage().getRoot().findActor("done"); if (done != null && Reward.Type.Card.equals(reward.type)) { @@ -1014,15 +1022,15 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb TextureRegion tr = ((TextureRegionDrawable) getDrawable()).getRegion(); Texture t = tr.getTexture(); if (t != null) { - float x = GuiBase.isAndroid() || Forge.hasGamepad() ? Scene.getIntendedWidth() / 2 - holdTooltip.tooltip_actor.getWidth() / 2 : tooltip.getActor().getStoredImage().getImageX(); - float y = GuiBase.isAndroid() || Forge.hasGamepad() ? Scene.getIntendedHeight() / 2 - holdTooltip.tooltip_actor.getHeight() / 2 : tooltip.getActor().getStoredImage().getImageY(); + float x = GuiBase.isAndroid() || Forge.hasGamepad() ? Scene.getIntendedWidth() / 2f - holdTooltip.tooltip_actor.getWidth() / 2f : tooltip.getActor().getStoredImage().getImageX(); + float y = GuiBase.isAndroid() || Forge.hasGamepad() ? Scene.getIntendedHeight() / 2f - holdTooltip.tooltip_actor.getHeight() / 2f : tooltip.getActor().getStoredImage().getImageY(); float w = GuiBase.isAndroid() || Forge.hasGamepad() ? holdTooltip.tooltip_actor.getStoredImage().getPrefWidth() : tooltip.getActor().getStoredImage().getPrefWidth(); float h = GuiBase.isAndroid() || Forge.hasGamepad() ? holdTooltip.tooltip_actor.getStoredImage().getPrefHeight() : tooltip.getActor().getStoredImage().getPrefHeight(); if (t.toString().contains(".fullborder.") && Forge.enableUIMask.equals("Full")) { batch.end(); shaderRoundRect.bind(); shaderRoundRect.setUniformf("u_resolution", t.getWidth(), t.getHeight()); - shaderRoundRect.setUniformf("edge_radius", (t.getHeight() / t.getWidth()) * ImageCache.getRadius(t)); + shaderRoundRect.setUniformf("edge_radius", ((float) (t.getHeight() / t.getWidth())) * ImageCache.getRadius(t)); shaderRoundRect.setUniformf("u_gray", sold ? 0.8f : 0f); batch.setShader(shaderRoundRect); batch.begin(); diff --git a/forge-gui-mobile/src/forge/assets/FSkinImage.java b/forge-gui-mobile/src/forge/assets/FSkinImage.java index 53334b98291..d6e8916280e 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinImage.java +++ b/forge-gui-mobile/src/forge/assets/FSkinImage.java @@ -232,7 +232,8 @@ public enum FSkinImage implements FImage { //adventure MANASHARD (FSkinProp.ICO_MANASHARD, SourceFile.ADVENTURE), MENU_ADVLOGO (FSkinProp.ICO_ADVLOGO, SourceFile.ADVENTURE), - ADV_DECKBOX (FSkinProp.ICO_ADVDECKBOX, SourceFile.ADVENTURE), + ADV_DECKBOX (FSkinProp.ICO_ADVDECKBOX, SourceFile.ADVENTURE), + ADV_FLIPICON (FSkinProp.ICO_ADVFLIP, SourceFile.ADVENTURE), //menu icon MENU_GALAXY (FSkinProp.ICO_MENU_GALAXY, SourceFile.ICONS), diff --git a/forge-gui-mobile/src/forge/sound/AudioMusic.java b/forge-gui-mobile/src/forge/sound/AudioMusic.java index 111a409a6db..ea8ff9531c1 100644 --- a/forge-gui-mobile/src/forge/sound/AudioMusic.java +++ b/forge-gui-mobile/src/forge/sound/AudioMusic.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.audio.Music.OnCompletionListener; import com.badlogic.gdx.files.FileHandle; import forge.Forge; +import forge.adventure.stage.GameHUD; public class AudioMusic implements IAudioMusic { private Music music; @@ -18,6 +19,10 @@ public class AudioMusic implements IAudioMusic { public void play(final Runnable onComplete) { if (music == null) return; + if (Forge.isMobileAdventureMode) { + if (GameHUD.getInstance().audioIsPlaying()) + return; + } music.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(Music music) { diff --git a/forge-gui/res/skins/default/sprite_adventure.png b/forge-gui/res/skins/default/sprite_adventure.png index 49f0f2e8ad6..88da7ca3a15 100644 Binary files a/forge-gui/res/skins/default/sprite_adventure.png and b/forge-gui/res/skins/default/sprite_adventure.png differ diff --git a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java index b56cf612abf..ad9a5ee6fcc 100644 --- a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java +++ b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java @@ -271,6 +271,7 @@ public enum FSkinProp { ICO_MANASHARD (new int[] {2, 304, 100, 100}, PropType.ADVENTURE), ICO_ADVLOGO (new int[] {2, 2, 300, 300}, PropType.ADVENTURE), ICO_ADVDECKBOX (new int[] {111, 365, 192, 240}, PropType.ADVENTURE), + ICO_ADVFLIP (new int[] {10, 504, 80, 80}, PropType.ADVENTURE), //menu icon ICO_MENU_GALAXY (new int[] {0, 1520, 80, 80}, PropType.ICON),