Merge pull request #1994 from kevlahnota/newmaster2

update RewardActor tooltips
This commit is contained in:
Anthony Calosa
2022-12-02 05:20:36 +08:00
committed by GitHub
5 changed files with 245 additions and 110 deletions

View File

@@ -6,6 +6,7 @@ import java.util.Deque;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.*; import com.badlogic.gdx.graphics.*;
import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.ShaderProgram; import com.badlogic.gdx.graphics.glutils.ShaderProgram;
@@ -1286,6 +1287,11 @@ public class Graphics {
bitmapFont.setColor(color.r, color.g, color.b, alpha); bitmapFont.setColor(color.r, color.g, color.b, alpha);
bitmapFont.draw(batch, text, x, y); bitmapFont.draw(batch, text, x, y);
} }
public void drawText(BitmapFont bitmapFont, GlyphLayout layout, float x, float y) {
if (bitmapFont == null || layout == null)
return;
bitmapFont.draw(batch, layout, x, y);
}
public void drawText(String text, FSkinFont font, FSkinColor skinColor, float x, float y, float w, float h, boolean wrap, int horzAlignment, boolean centerVertically) { public void drawText(String text, FSkinFont font, FSkinColor skinColor, float x, float y, float w, float h, boolean wrap, int horzAlignment, boolean centerVertically) {
drawText(text, font, skinColor.getColor(), x, y, w, h, wrap, horzAlignment, centerVertically); drawText(text, font, skinColor.getColor(), x, y, w, h, wrap, horzAlignment, centerVertically);

View File

@@ -32,6 +32,7 @@ import forge.item.IPaperCard;
import forge.player.GamePlayerUtil; import forge.player.GamePlayerUtil;
import forge.player.PlayerControllerHuman; import forge.player.PlayerControllerHuman;
import forge.screens.FScreen; import forge.screens.FScreen;
import forge.screens.LoadingOverlay;
import forge.screens.match.MatchController; import forge.screens.match.MatchController;
import forge.sound.MusicPlaylist; import forge.sound.MusicPlaylist;
import forge.sound.SoundSystem; import forge.sound.SoundSystem;
@@ -65,6 +66,7 @@ public class DuelScene extends ForgeScene {
Deck playerDeck; Deck playerDeck;
boolean chaosBattle = false; boolean chaosBattle = false;
boolean callbackExit = false; boolean callbackExit = false;
private LoadingOverlay matchOverlay;
List<IPaperCard> playerExtras = new ArrayList<>(); List<IPaperCard> playerExtras = new ArrayList<>();
List<IPaperCard> AIExtras = new ArrayList<>(); List<IPaperCard> AIExtras = new ArrayList<>();
@@ -82,7 +84,12 @@ public class DuelScene extends ForgeScene {
} }
public void GameEnd() { public void GameEnd() {
boolean winner = humanPlayer == hostedMatch.getGame().getMatch().getWinner(); boolean winner = false;
try {
winner = humanPlayer == hostedMatch.getGame().getMatch().getWinner();
} catch (Exception e) {
e.printStackTrace();
}
String enemyName = (enemy.nameOverride.isEmpty() ? enemy.getData().name : enemy.nameOverride); String enemyName = (enemy.nameOverride.isEmpty() ? enemy.getData().name : enemy.nameOverride);
boolean showMessages = enemy.getData().copyPlayerDeck && Current.player().isUsingCustomDeck(); boolean showMessages = enemy.getData().copyPlayerDeck && Current.player().isUsingCustomDeck();
Current.player().clearBlessing(); Current.player().clearBlessing();
@@ -101,6 +108,7 @@ public class DuelScene extends ForgeScene {
"Is that all you can do?", "You need to learn more to stand a chance.", "You weren't that bad.", "You made an effort at least.", "Is that all you can do?", "You need to learn more to stand a chance.", "You weren't that bad.", "You made an effort at least.",
"From today, you can call me teacher.", "Hmph, predictable!", "I haven't used a fraction of my REAL power!"); "From today, you can call me teacher.", "Hmph, predictable!", "I haven't used a fraction of my REAL power!");
String message = Aggregates.random(insult); String message = Aggregates.random(insult);
boolean finalWinner = winner;
FThreads.invokeInEdtNowOrLater(() -> FOptionPane.showMessageDialog(message, enemyName, new FBufferedImage(120, 120) { FThreads.invokeInEdtNowOrLater(() -> FOptionPane.showMessageDialog(message, enemyName, new FBufferedImage(120, 120) {
@Override @Override
protected void draw(Graphics g, float w, float h) { protected void draw(Graphics g, float w, float h) {
@@ -111,17 +119,17 @@ public class DuelScene extends ForgeScene {
@Override @Override
public void run(Integer result) { public void run(Integer result) {
if (result == 0) { if (result == 0) {
afterGameEnd(enemyName, winner); afterGameEnd(enemyName, finalWinner, true);
} }
} }
})); }));
} else { } else {
afterGameEnd(enemyName, winner); afterGameEnd(enemyName, winner, false);
} }
} }
void afterGameEnd(String enemyName, boolean winner) { void afterGameEnd(String enemyName, boolean winner, boolean showOverlay) {
Gdx.app.postRunnable(() -> { Runnable runnable = () -> Gdx.app.postRunnable(()-> {
SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music
dungeonEffect = null; dungeonEffect = null;
callbackExit = false; callbackExit = false;
@@ -134,6 +142,14 @@ public class DuelScene extends ForgeScene {
((IAfterMatch) last).setWinner(winner); ((IAfterMatch) last).setWinner(winner);
} }
}); });
if (showOverlay) {
FThreads.invokeInEdtNowOrLater(() -> {
matchOverlay = new LoadingOverlay(runnable, true);
matchOverlay.show();
});
} else {
runnable.run();
}
} }
void addEffects(RegisteredPlayer player, Array<EffectData> effects) { void addEffects(RegisteredPlayer player, Array<EffectData> effects) {
@@ -311,13 +327,17 @@ public class DuelScene extends ForgeScene {
"It's all or nothing!", "It's all on the line!", "You can't back down now!", "Do you have what it takes?", "What will happen next?", "It's all or nothing!", "It's all on the line!", "You can't back down now!", "Do you have what it takes?", "What will happen next?",
"Don't blink!", "You can't lose here!", "There's no turning back!", "It's all or nothing now!"); "Don't blink!", "You can't lose here!", "There's no turning back!", "It's all or nothing now!");
String message = Aggregates.random(list); String message = Aggregates.random(list);
FThreads.delayInEDT(600, () -> FThreads.invokeInEdtNowOrLater(() -> FOptionPane.showMessageDialog(message, enemy.nameOverride.isEmpty() ? enemy.getData().name : enemy.nameOverride, new FBufferedImage(120, 120) { matchOverlay = new LoadingOverlay(() -> FThreads.delayInEDT(300, () -> FThreads.invokeInEdtNowOrLater(() ->
@Override FOptionPane.showMessageDialog(message, enemy.nameOverride.isEmpty() ? enemy.getData().name : enemy.nameOverride,
protected void draw(Graphics g, float w, float h) { new FBufferedImage(120, 120) {
if (FSkin.getAvatars().get(90001) != null) @Override
g.drawImage(FSkin.getAvatars().get(90001), 0, 0, w, h); protected void draw(Graphics g, float w, float h) {
} if (FSkin.getAvatars().get(90001) != null)
}))); g.drawImage(FSkin.getAvatars().get(90001), 0, 0, w, h);
}
}))), false);
} else {
matchOverlay = new LoadingOverlay(null);
} }
for (final Player p : hostedMatch.getGame().getPlayers()) { for (final Player p : hostedMatch.getGame().getPlayers()) {
@@ -329,6 +349,7 @@ public class DuelScene extends ForgeScene {
} }
} }
super.enter(); super.enter();
matchOverlay.show();
} }
@Override @Override

View File

@@ -1,10 +1,7 @@
package forge.adventure.scene; package forge.adventure.scene;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import forge.Forge; import forge.Forge;
import forge.animation.ForgeAnimation;
import forge.assets.ImageCache;
import forge.gamemodes.match.LobbySlotType; import forge.gamemodes.match.LobbySlotType;
import forge.interfaces.IUpdateable; import forge.interfaces.IUpdateable;
import forge.screens.FScreen; import forge.screens.FScreen;
@@ -16,14 +13,15 @@ import java.util.List;
/** /**
* base class to render base forge screens like the deck editor and matches * base class to render base forge screens like the deck editor and matches
*/ */
public abstract class ForgeScene extends Scene implements IUpdateable { public abstract class ForgeScene extends Scene implements IUpdateable {
@Override @Override
public void dispose() { public void dispose() {
} }
@Override @Override
public void render() { public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // Clear the screen. /*Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // Clear the screen.
if (getScreen() == null) { if (getScreen() == null) {
return; return;
} }
@@ -50,30 +48,31 @@ public abstract class ForgeScene extends Scene implements IUpdateable {
} }
} }
} }
Forge.getGraphics().end(); Forge.getGraphics().end();*/
} }
@Override @Override
public void act(float delta) { public void act(float delta) {
/*ImageCache.allowSingleLoad();
ImageCache.allowSingleLoad(); ForgeAnimation.advanceAll();*/
ForgeAnimation.advanceAll();
} }
@Override @Override
public void enter() { public void enter() {
FOverlay.hideAll(); FOverlay.hideAll();
if(getScreen()!=null) if (getScreen() != null)
getScreen().setSize(Forge.getScreenWidth(), Forge.getScreenHeight()); getScreen().setSize(Forge.getScreenWidth(), Forge.getScreenHeight());
//update language for ForgeScene //update language for ForgeScene
Forge.getLocalizer().setEnglish(Forge.forcedEnglishonCJKMissing); Forge.getLocalizer().setEnglish(Forge.forcedEnglishonCJKMissing);
Forge.openScreen(getScreen()); Forge.openScreen(getScreen());
Gdx.input.setInputProcessor(Forge.getInputProcessor()); Gdx.input.setInputProcessor(Forge.getInputProcessor());
} }
public abstract FScreen getScreen(); public abstract FScreen getScreen();
public void buildTouchListeners(int x, int y, List<FDisplayObject> potentialListeners) { public void buildTouchListeners(int x, int y, List<FDisplayObject> potentialListeners) {
if(getScreen()!=null) if (getScreen() != null)
getScreen().buildTouchListeners(x, y, potentialListeners); getScreen().buildTouchListeners(x, y, potentialListeners);
} }

View File

@@ -5,6 +5,8 @@ import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
@@ -30,7 +32,6 @@ import forge.ImageKeys;
import forge.adventure.data.ItemData; import forge.adventure.data.ItemData;
import forge.adventure.scene.Scene; import forge.adventure.scene.Scene;
import forge.assets.FSkin; import forge.assets.FSkin;
import forge.assets.FSkinFont;
import forge.assets.ImageCache; import forge.assets.ImageCache;
import forge.card.CardImageRenderer; import forge.card.CardImageRenderer;
import forge.card.CardRenderer; import forge.card.CardRenderer;
@@ -49,7 +50,7 @@ import static forge.adventure.util.Paths.ITEMS_ATLAS;
* Render the rewards as a card on the reward scene. * Render the rewards as a card on the reward scene.
*/ */
public class RewardActor extends Actor implements Disposable, ImageFetcher.Callback { public class RewardActor extends Actor implements Disposable, ImageFetcher.Callback {
Tooltip<Image> tooltip; ImageToolTip tooltip;
HoldTooltip holdTooltip; HoldTooltip holdTooltip;
Reward reward; Reward reward;
ShaderProgram shaderGrayscale = Forge.getGraphics().getShaderGrayscale(); ShaderProgram shaderGrayscale = Forge.getGraphics().getShaderGrayscale();
@@ -86,15 +87,17 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb
if (T != null) if (T != null)
T.dispose(); T.dispose();
} }
public boolean toolTipIsVisible()
{ public boolean toolTipIsVisible() {
if(holdTooltip!=null) if (holdTooltip != null)
return holdTooltip.tooltip_actor.getStage()!=null; return holdTooltip.tooltip_actor.getStage() != null;
return false; return false;
} }
public Reward getReward() { public Reward getReward() {
return reward; return reward;
} }
@Override @Override
public void onImageFetched() { public void onImageFetched() {
String imageKey = reward.getCard().getImageKey(false); String imageKey = reward.getCard().getImageKey(false);
@@ -109,7 +112,7 @@ public boolean toolTipIsVisible()
if (!Forge.getAssets().manager().contains(imageFile.getPath())) { if (!Forge.getAssets().manager().contains(imageFile.getPath())) {
Forge.getAssets().manager().load(imageFile.getPath(), Texture.class, Forge.getAssets().getTextureFilter()); Forge.getAssets().manager().load(imageFile.getPath(), Texture.class, Forge.getAssets().getTextureFilter());
Forge.getAssets().manager().finishLoadingAsset(imageFile.getPath()); Forge.getAssets().manager().finishLoadingAsset(imageFile.getPath());
count+=1; count += 1;
} }
Texture replacement = Forge.getAssets().manager().get(imageFile.getPath(), Texture.class, false); Texture replacement = Forge.getAssets().manager().get(imageFile.getPath(), Texture.class, false);
if (replacement == null) if (replacement == null)
@@ -122,7 +125,7 @@ public boolean toolTipIsVisible()
} }
toolTipImage.remove(); toolTipImage.remove();
toolTipImage = new Image(processDrawable(image)); toolTipImage = new Image(processDrawable(image));
if (GuiBase.isAndroid()||Forge.hasGamepad()) { if (GuiBase.isAndroid() || Forge.hasGamepad()) {
if (holdTooltip.tooltip_image.getDrawable() instanceof TextureRegionDrawable) { if (holdTooltip.tooltip_image.getDrawable() instanceof TextureRegionDrawable) {
((TextureRegionDrawable) holdTooltip.tooltip_image.getDrawable()).getRegion().getTexture().dispose(); ((TextureRegionDrawable) holdTooltip.tooltip_image.getDrawable()).getRegion().getTexture().dispose();
} }
@@ -155,7 +158,7 @@ public boolean toolTipIsVisible()
if (!Forge.getAssets().manager().contains(frontFace.getPath())) { if (!Forge.getAssets().manager().contains(frontFace.getPath())) {
Forge.getAssets().manager().load(frontFace.getPath(), Texture.class, Forge.getAssets().getTextureFilter()); Forge.getAssets().manager().load(frontFace.getPath(), Texture.class, Forge.getAssets().getTextureFilter());
Forge.getAssets().manager().finishLoadingAsset(frontFace.getPath()); Forge.getAssets().manager().finishLoadingAsset(frontFace.getPath());
count+=1; count += 1;
} }
Texture front = Forge.getAssets().manager().get(frontFace.getPath(), Texture.class, false); Texture front = Forge.getAssets().manager().get(frontFace.getPath(), Texture.class, false);
if (front != null) { if (front != null) {
@@ -164,7 +167,7 @@ public boolean toolTipIsVisible()
loaded = false; loaded = false;
} }
} catch (Exception e) { } catch (Exception e) {
System.err.println("Failed to load image: "+frontFace.getPath()); System.err.println("Failed to load image: " + frontFace.getPath());
loaded = false; loaded = false;
} }
} else { } else {
@@ -183,13 +186,13 @@ public boolean toolTipIsVisible()
ImageCache.updateSynqCount(backFace, 1); ImageCache.updateSynqCount(backFace, 1);
} }
} catch (Exception e) { } catch (Exception e) {
System.err.println("Failed to load image: "+backFace.getPath()); System.err.println("Failed to load image: " + backFace.getPath());
} }
} }
} }
} else { } else {
String imagePath = ImageUtil.getImageRelativePath(reward.getCard(), "", true, false); String imagePath = ImageUtil.getImageRelativePath(reward.getCard(), "", true, false);
File lookup = ImageKeys.hasSetLookup(imagePath) ? ImageKeys.setLookUpFile(imagePath, imagePath+"border") : null; File lookup = ImageKeys.hasSetLookup(imagePath) ? ImageKeys.setLookUpFile(imagePath, imagePath + "border") : null;
int count = 0; int count = 0;
if (lookup != null) { if (lookup != null) {
try { try {
@@ -206,7 +209,7 @@ public boolean toolTipIsVisible()
} }
ImageCache.updateSynqCount(lookup, count); ImageCache.updateSynqCount(lookup, count);
} catch (Exception e) { } catch (Exception e) {
System.err.println("Failed to load image: "+lookup.getPath()); System.err.println("Failed to load image: " + lookup.getPath());
loaded = false; loaded = false;
} }
} else if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) { } else if (!ImageCache.imageKeyFileExists(reward.getCard().getImageKey(false))) {
@@ -225,10 +228,9 @@ public boolean toolTipIsVisible()
Pixmap drawingMap = new Pixmap((int) backSprite.getWidth(), (int) backSprite.getHeight(), Pixmap.Format.RGBA8888); Pixmap drawingMap = new Pixmap((int) backSprite.getWidth(), (int) backSprite.getHeight(), Pixmap.Format.RGBA8888);
DrawOnPixmap.draw(drawingMap, backSprite); DrawOnPixmap.draw(drawingMap, backSprite);
if(reward.getItem()==null) if (reward.getItem() == null) {
{
needsToBeDisposed = true; needsToBeDisposed = true;
image=new Texture(drawingMap); image = new Texture(drawingMap);
break; break;
} }
Sprite item = reward.getItem().sprite(); Sprite item = reward.getItem().sprite();
@@ -236,8 +238,8 @@ public boolean toolTipIsVisible()
DrawOnPixmap.draw(drawingMap, (int) ((backSprite.getWidth() / 2f) - item.getWidth() / 2f), (int) ((backSprite.getHeight() / 4f) * 1.7f), item); DrawOnPixmap.draw(drawingMap, (int) ((backSprite.getWidth() / 2f) - item.getWidth() / 2f), (int) ((backSprite.getHeight() / 4f) * 1.7f), item);
//DrawOnPixmap.drawText(drawingMap, String.valueOf(reward.getItem().name), 0, (int) ((backSprite.getHeight() / 8f) * 1f), backSprite.getWidth(), false); //DrawOnPixmap.drawText(drawingMap, String.valueOf(reward.getItem().name), 0, (int) ((backSprite.getHeight() / 8f) * 1f), backSprite.getWidth(), false);
setItemTooltips(item); setItemTooltips(item, backSprite);
image=new Texture(drawingMap); image = new Texture(drawingMap);
drawingMap.dispose(); drawingMap.dispose();
needsToBeDisposed = true; needsToBeDisposed = true;
break; break;
@@ -250,23 +252,25 @@ public boolean toolTipIsVisible()
Pixmap drawingMap = new Pixmap((int) backSprite.getWidth(), (int) backSprite.getHeight(), Pixmap.Format.RGBA8888); Pixmap drawingMap = new Pixmap((int) backSprite.getWidth(), (int) backSprite.getHeight(), Pixmap.Format.RGBA8888);
DrawOnPixmap.draw(drawingMap, backSprite); DrawOnPixmap.draw(drawingMap, backSprite);
Sprite gold = atlas.createSprite(reward.type.toString()); Sprite item = atlas.createSprite(reward.type.toString());
DrawOnPixmap.draw(drawingMap, (int) ((backSprite.getWidth() / 2f) - gold.getWidth() / 2f), (int) ((backSprite.getHeight() / 4f) * 1f), gold); DrawOnPixmap.draw(drawingMap, (int) ((backSprite.getWidth() / 2f) - item.getWidth() / 2f), (int) ((backSprite.getHeight() / 4f) * 1f), item);
DrawOnPixmap.drawText(drawingMap, String.valueOf(reward.getCount()), 0, (int) ((backSprite.getHeight() / 4f) * 2f)-1, backSprite.getWidth(), true,Color.WHITE); DrawOnPixmap.drawText(drawingMap, String.valueOf(reward.getCount()), 0, (int) ((backSprite.getHeight() / 4f) * 2f) - 1, backSprite.getWidth(), true, Color.WHITE);
image=new Texture(drawingMap); setItemTooltips(item, backSprite);
image = new Texture(drawingMap);
drawingMap.dispose(); drawingMap.dispose();
needsToBeDisposed = true; needsToBeDisposed = true;
break; break;
} }
} }
if (GuiBase.isAndroid()||Forge.hasGamepad()) { if (GuiBase.isAndroid() || Forge.hasGamepad()) {
addListener(new ClickListener() { addListener(new ClickListener() {
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
if (flipOnClick) if (flipOnClick)
flip(); flip();
} }
@Override @Override
public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) { public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
hover = true; hover = true;
@@ -276,6 +280,7 @@ public boolean toolTipIsVisible()
public void exit(InputEvent event, float x, float y, int pointer, Actor fromActor) { public void exit(InputEvent event, float x, float y, int pointer, Actor fromActor) {
hover = false; hover = false;
} }
@Override @Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
hover = true; hover = true;
@@ -311,6 +316,7 @@ public boolean toolTipIsVisible()
}); });
} }
} }
private void switchTooltip() { private void switchTooltip() {
if (!Reward.Type.Card.equals(reward.type)) if (!Reward.Type.Card.equals(reward.type))
return; return;
@@ -318,7 +324,7 @@ public boolean toolTipIsVisible()
return; return;
Texture alt = ImageCache.getImage(reward.getCard().getImageKey(true), false); Texture alt = ImageCache.getImage(reward.getCard().getImageKey(true), false);
PaperCard altCard = ImageUtil.getPaperCardFromImageKey(reward.getCard().getCardAltImageKey()); PaperCard altCard = ImageUtil.getPaperCardFromImageKey(reward.getCard().getCardAltImageKey());
if (GuiBase.isAndroid()||Forge.hasGamepad()) { if (GuiBase.isAndroid() || Forge.hasGamepad()) {
if (alternate) { if (alternate) {
if (alt != null) { if (alt != null) {
holdTooltip.tooltip_actor.clear(); holdTooltip.tooltip_actor.clear();
@@ -352,6 +358,7 @@ public boolean toolTipIsVisible()
} }
} }
} }
private TextureRegionDrawable processDrawable(Texture texture) { private TextureRegionDrawable processDrawable(Texture texture) {
TextureRegionDrawable drawable = new TextureRegionDrawable(ImageCache.croppedBorderImage(texture)); TextureRegionDrawable drawable = new TextureRegionDrawable(ImageCache.croppedBorderImage(texture));
float origW = texture.getWidth(); float origW = texture.getWidth();
@@ -368,7 +375,7 @@ public boolean toolTipIsVisible()
newH = boundH; newH = boundH;
newW = (newH * origW) / origH; newW = (newH * origW) / origH;
} }
float AR = 480f/270f; float AR = 480f / 270f;
int x = Forge.getDeviceAdapter().getRealScreenSize(false).getLeft(); int x = Forge.getDeviceAdapter().getRealScreenSize(false).getLeft();
int y = Forge.getDeviceAdapter().getRealScreenSize(false).getRight(); int y = Forge.getDeviceAdapter().getRealScreenSize(false).getRight();
int realX = Forge.getDeviceAdapter().getRealScreenSize(true).getLeft(); int realX = Forge.getDeviceAdapter().getRealScreenSize(true).getLeft();
@@ -380,25 +387,26 @@ public boolean toolTipIsVisible()
} }
float fW = x > y ? x : y; float fW = x > y ? x : y;
float fH = x > y ? y : x; float fH = x > y ? y : x;
float mul = fW/fH < AR ? AR/(fW/fH) : (fW/fH)/AR; float mul = fW / fH < AR ? AR / (fW / fH) : (fW / fH) / AR;
Float custom = Forge.isLandscapeMode() ? Config.instance().getSettingData().cardTooltipAdjLandscape : Config.instance().getSettingData().cardTooltipAdj; Float custom = Forge.isLandscapeMode() ? Config.instance().getSettingData().cardTooltipAdjLandscape : Config.instance().getSettingData().cardTooltipAdj;
if (custom != null && custom != 1f) { if (custom != null && custom != 1f) {
mul *= custom; mul *= custom;
} else { } else {
if (fW/fH >= 2f) {//tall display if (fW / fH >= 2f) {//tall display
mul = (fW/fH) - ((fW/fH)/AR); mul = (fW / fH) - ((fW / fH) / AR);
if ((fW/fH) >= 2.1f && (fW/fH) < 2.2f) if ((fW / fH) >= 2.1f && (fW / fH) < 2.2f)
mul *= 0.9f; mul *= 0.9f;
else if ((fW/fH) > 2.2f) //ultrawide 21:9 Galaxy Fold, Huawei X2, Xperia 1 else if ((fW / fH) > 2.2f) //ultrawide 21:9 Galaxy Fold, Huawei X2, Xperia 1
mul *= 0.8f; mul *= 0.8f;
} }
} }
if (Forge.isLandscapeMode()) if (Forge.isLandscapeMode())
drawable.setMinSize(newW*mul, newH); drawable.setMinSize(newW * mul, newH);
else else
drawable.setMinSize(newW, newH*mul); drawable.setMinSize(newW, newH * mul);
return drawable; return drawable;
} }
private void setCardImage(Texture img) { private void setCardImage(Texture img) {
if (img == null) if (img == null)
return; return;
@@ -407,41 +415,41 @@ public boolean toolTipIsVisible()
image.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear); image.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear);
if (toolTipImage == null) if (toolTipImage == null)
toolTipImage = new Image(processDrawable(image)); toolTipImage = new Image(processDrawable(image));
if (GuiBase.isAndroid()||Forge.hasGamepad()) { if (GuiBase.isAndroid() || Forge.hasGamepad()) {
if (holdTooltip == null) if (holdTooltip == null)
holdTooltip = new HoldTooltip(toolTipImage); holdTooltip = new HoldTooltip(toolTipImage);
if (frontSideUp()) addListener(holdTooltip);
addListener(holdTooltip);
} else { } else {
if (tooltip == null) if (tooltip == null)
tooltip = new Tooltip<Image>(toolTipImage); tooltip = new ImageToolTip(toolTipImage);
tooltip.setInstant(true); tooltip.setInstant(true);
if (frontSideUp()) addListener(tooltip);
addListener(tooltip);
} }
} }
public void showTooltip() { public void showTooltip() {
if (holdTooltip != null) { if (holdTooltip != null) {
holdTooltip.show(); holdTooltip.show();
} }
} }
public void hideTooltip() { public void hideTooltip() {
if (holdTooltip != null) { if (holdTooltip != null) {
holdTooltip.hide(); holdTooltip.hide();
} }
} }
private Texture renderPlaceholder(Graphics g, PaperCard card){ //Use CardImageRenderer to output a Texture. private Texture renderPlaceholder(Graphics g, PaperCard card) { //Use CardImageRenderer to output a Texture.
if(renderedCount++ == 0) { if (renderedCount++ == 0) {
//The first time we find a card that has no art, render one out of view to fully initialize CardImageRenderer. //The first time we find a card that has no art, render one out of view to fully initialize CardImageRenderer.
g.begin(preview_w, preview_h); g.begin(preview_w, preview_h);
CardImageRenderer.drawCardImage(g, CardView.getCardForUi(reward.getCard()), false, -(preview_w + 20), 0, preview_w, preview_h, CardRenderer.CardStackPosition.Top, Forge.allowCardBG, true); CardImageRenderer.drawCardImage(g, CardView.getCardForUi(reward.getCard()), false, -(preview_w + 20), 0, preview_w, preview_h, CardRenderer.CardStackPosition.Top, Forge.allowCardBG, true);
g.end(); g.end();
} }
Matrix4 m = new Matrix4(); Matrix4 m = new Matrix4();
FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGB888, preview_w, preview_h, false); FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGB888, preview_w, preview_h, false);
frameBuffer.begin(); frameBuffer.begin();
m.setToOrtho2D(0,preview_h, preview_w, -preview_h); //So it renders flipped directly. m.setToOrtho2D(0, preview_h, preview_w, -preview_h); //So it renders flipped directly.
g.begin(preview_w, preview_h); g.begin(preview_w, preview_h);
g.setProjectionMatrix(m); g.setProjectionMatrix(m);
@@ -457,30 +465,38 @@ public boolean toolTipIsVisible()
return result; return result;
} }
private void setItemTooltips(Sprite icon) { private void setItemTooltips(Sprite icon, Sprite backSprite) {
if (generatedTooltip == null) { if (generatedTooltip == null) {
float icon_w = 64f; float icon_h = 64f; //Sizes for the embedded icon. Could be made smaller on smaller resolutions. Matrix4 m = new Matrix4();
Matrix4 m = new Matrix4(); GlyphLayout layout = new GlyphLayout();
ItemData item = getReward().getItem(); ItemData item = getReward().getItem();
FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, preview_w, preview_h, false); FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, preview_w, preview_h, false);
frameBuffer.begin(); frameBuffer.begin();
m.setToOrtho2D(0,preview_h, preview_w, -preview_h); //So it renders flipped directly. try {
getGraphics().begin(preview_w, preview_h); m.setToOrtho2D(0, preview_h, preview_w, -preview_h); //So it renders flipped directly.
getGraphics().setProjectionMatrix(m); getGraphics().begin(preview_w, preview_h);
getGraphics().startClip(); getGraphics().setProjectionMatrix(m);
//Draw item description panel. getGraphics().startClip();
getGraphics().fillRect(new Color(0f, 0f, 0f, 0.96f), 0, 0, preview_w, preview_h); //Translucent background. getGraphics().drawImage(backSprite, 0, 0, preview_w, preview_h);
getGraphics().drawRectLines(2, Color.WHITE, 0, 0, preview_w, preview_h); //Add a border. getGraphics().drawImage(icon, preview_w / 2 - 75, 160, 160, 160);
getGraphics().drawImage(icon, 2, 2, icon_w, icon_h); //Draw the item's icon. BitmapFont font = Controls.getBitmapFont("default", 4 / (preview_h / preview_w));
getGraphics().drawText(item.name, FSkinFont.get(24), Color.WHITE, icon_w + 2, 2, preview_w - (icon_w + 2), icon_h, false, 1, true); //Item name. layout.setText(font, item != null ? item.name : getReward().type.name(), Color.WHITE, preview_w - 64, Align.center, true);
getGraphics().drawRectLines(1, Color.WHITE, 6, icon_h + 2, preview_w - 12, preview_h - (icon_h + 6)); //Description border. getGraphics().drawText(font, layout, 32, preview_h - 70);
getGraphics().drawText(item.getDescription(), FSkinFont.get(18), Color.WHITE, 10, icon_h + 8, preview_w - 10, preview_h - 4, true, Align.left, false); //Description. font = Controls.getBitmapFont("default", 3.5f / (preview_h / preview_w));
getGraphics().end(); layout.setText(font, item != null ? item.getDescription() : "Adds " +
getGraphics().endClip(); String.valueOf(getReward().getCount()) + " " + getReward().type, Color.WHITE, preview_w - 128, item != null ? Align.left : Align.center, true);
generatedTooltip = new Texture(Pixmap.createFromFrameBuffer(0, 0, preview_w, preview_h), Forge.isTextureFilteringEnabled()); getGraphics().drawText(font, layout, 64, preview_h / 2.5f);
frameBuffer.end(); getGraphics().end();
getGraphics().dispose(); getGraphics().endClip();
frameBuffer.dispose(); generatedTooltip = new Texture(Pixmap.createFromFrameBuffer(0, 0, preview_w, preview_h), Forge.isTextureFilteringEnabled());
} catch (Exception e) {
e.printStackTrace();
} finally {
frameBuffer.end();
getGraphics().dispose();
frameBuffer.dispose();
Controls.getBitmapFont("default");
}
} }
//Rendering code ends here. //Rendering code ends here.
@@ -488,18 +504,16 @@ public boolean toolTipIsVisible()
if (toolTipImage == null) if (toolTipImage == null)
toolTipImage = new Image(processDrawable(generatedTooltip)); toolTipImage = new Image(processDrawable(generatedTooltip));
if (frontSideUp()) { if (GuiBase.isAndroid() || Forge.hasGamepad()) {
if (GuiBase.isAndroid()||Forge.hasGamepad()) { if (holdTooltip == null)
if (holdTooltip == null) holdTooltip = new HoldTooltip(toolTipImage);
holdTooltip = new HoldTooltip(toolTipImage); addListener(holdTooltip);
addListener(holdTooltip); } else {
} else { if (tooltip == null) {
if (tooltip == null) { tooltip = new ImageToolTip(toolTipImage);
tooltip = new Tooltip<>(toolTipImage); tooltip.setInstant(true);
tooltip.setInstant(true);
}
addListener(tooltip);
} }
addListener(tooltip);
} }
} }
@@ -510,18 +524,21 @@ public boolean toolTipIsVisible()
public boolean isFlipped() { public boolean isFlipped() {
return (clicked && flipProcess >= 1); return (clicked && flipProcess >= 1);
} }
public void removeTooltip() { public void removeTooltip() {
if (tooltip != null) { if (tooltip != null) {
tooltip.getActor().remove(); tooltip.getActor().remove();
} }
} }
public void clearHoldToolTip() { public void clearHoldToolTip() {
if (holdTooltip != null) { if (holdTooltip != null) {
try { try {
hover = false; hover = false;
holdTooltip.tooltip_actor.clear(); holdTooltip.tooltip_actor.clear();
holdTooltip.tooltip_actor.remove(); holdTooltip.tooltip_actor.remove();
} catch (Exception e){} } catch (Exception e) {
}
} }
} }
@@ -531,6 +548,7 @@ public boolean toolTipIsVisible()
clicked = true; clicked = true;
flipProcess = 0; flipProcess = 0;
} }
public void sold() { public void sold() {
//todo add new card to be sold??? //todo add new card to be sold???
if (sold) if (sold)
@@ -538,6 +556,7 @@ public boolean toolTipIsVisible()
sold = true; sold = true;
getColor().a = 0.5f; getColor().a = 0.5f;
} }
@Override @Override
public void act(float delta) { public void act(float delta) {
super.act(delta); super.act(delta);
@@ -547,12 +566,12 @@ public boolean toolTipIsVisible()
else else
flipProcess = 1; flipProcess = 1;
if (GuiBase.isAndroid()||Forge.hasGamepad()) { if (GuiBase.isAndroid() || Forge.hasGamepad()) {
if (holdTooltip != null && frontSideUp() && !getListeners().contains(holdTooltip, true)) { if (holdTooltip != null && !getListeners().contains(holdTooltip, true)) {
addListener(holdTooltip); addListener(holdTooltip);
} }
} else { } else {
if (tooltip != null && frontSideUp() && !getListeners().contains(tooltip, true)) { if (tooltip != null && !getListeners().contains(tooltip, true)) {
addListener(tooltip); addListener(tooltip);
} }
} }
@@ -569,7 +588,7 @@ public boolean toolTipIsVisible()
applyProjectionMatrix(batch); applyProjectionMatrix(batch);
if (hover|hasKeyboardFocus()) if (hover | hasKeyboardFocus())
batch.setColor(0.5f, 0.5f, 0.5f, 1); batch.setColor(0.5f, 0.5f, 0.5f, 1);
@@ -609,6 +628,7 @@ public boolean toolTipIsVisible()
batch.draw(image, x, -getHeight() / 2, width, getHeight()); batch.draw(image, x, -getHeight() / 2, width, getHeight());
} }
} }
private void drawCard(Batch batch, Texture image, float x, float width) { private void drawCard(Batch batch, Texture image, float x, float width) {
if (image != null) { if (image != null) {
if (!sold) if (!sold)
@@ -629,11 +649,13 @@ public boolean toolTipIsVisible()
} }
} }
} }
private Graphics getGraphics() { private Graphics getGraphics() {
if (graphics == null) if (graphics == null)
graphics = new Graphics(); graphics = new Graphics();
return graphics; return graphics;
} }
private void applyProjectionMatrix(Batch batch) { private void applyProjectionMatrix(Batch batch) {
final Vector3 direction = new Vector3(0, 0, -1); final Vector3 direction = new Vector3(0, 0, -1);
final Vector3 up = new Vector3(0, 1, 0); final Vector3 up = new Vector3(0, 1, 0);
@@ -689,6 +711,19 @@ public boolean toolTipIsVisible()
return computedTransform; return computedTransform;
} }
class ImageToolTip extends Tooltip<Image> {
public ImageToolTip(Image contents) {
super(contents);
}
@Override
public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
if (!frontSideUp())
return;
super.enter(event, x, y, pointer, fromActor);
}
}
class HoldTooltip extends ActorGestureListener { class HoldTooltip extends ActorGestureListener {
Image tooltip_image; Image tooltip_image;
Table tooltip_actor; Table tooltip_actor;
@@ -717,6 +752,8 @@ public boolean toolTipIsVisible()
@Override @Override
public boolean longPress(Actor actor, float x, float y) { public boolean longPress(Actor actor, float x, float y) {
if (!frontSideUp())
return false;
TextraButton done = actor.getStage().getRoot().findActor("done"); TextraButton done = actor.getStage().getRoot().findActor("done");
if (done != null && Reward.Type.Card.equals(reward.type)) { if (done != null && Reward.Type.Card.equals(reward.type)) {
switchButton.setBounds(done.getX(), done.getY(), done.getWidth(), done.getHeight()); switchButton.setBounds(done.getX(), done.getY(), done.getWidth(), done.getHeight());
@@ -728,7 +765,7 @@ public boolean toolTipIsVisible()
//right if poosible, if exceeds width, draw left //right if poosible, if exceeds width, draw left
tooltip_actor.setX(actor.getRight()); tooltip_actor.setX(actor.getRight());
if (tooltip_actor.getX() + tooltip_actor.getWidth() > Scene.getIntendedWidth()) if (tooltip_actor.getX() + tooltip_actor.getWidth() > Scene.getIntendedWidth())
tooltip_actor.setX(Math.max(0,actor.getX() - tooltip_actor.getWidth())); tooltip_actor.setX(Math.max(0, actor.getX() - tooltip_actor.getWidth()));
} else { } else {
//middle //middle
tooltip_actor.setX(Scene.getIntendedWidth() / 2 - tooltip_actor.getWidth() / 2); tooltip_actor.setX(Scene.getIntendedWidth() / 2 - tooltip_actor.getWidth() / 2);
@@ -754,12 +791,16 @@ public boolean toolTipIsVisible()
} }
super.tap(event, x, y, count, button); super.tap(event, x, y, count, button);
} }
public void show() { public void show() {
if (!frontSideUp())
return;
tooltip_actor.setX(Scene.getIntendedWidth() / 2 - tooltip_actor.getWidth() / 2); tooltip_actor.setX(Scene.getIntendedWidth() / 2 - tooltip_actor.getWidth() / 2);
tooltip_actor.setY(Scene.getIntendedHeight() / 2 - tooltip_actor.getHeight() / 2); tooltip_actor.setY(Scene.getIntendedHeight() / 2 - tooltip_actor.getHeight() / 2);
getStage().addActor(tooltip_actor); getStage().addActor(tooltip_actor);
shown = true; shown = true;
} }
public void hide() { public void hide() {
tooltip_actor.remove(); tooltip_actor.remove();
switchButton.remove(); switchButton.remove();

View File

@@ -1,10 +1,12 @@
package forge.screens; package forge.screens;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
import forge.Forge; import forge.Forge;
import forge.Graphics; import forge.Graphics;
import forge.animation.ForgeAnimation;
import forge.assets.FSkin; import forge.assets.FSkin;
import forge.assets.FSkinColor; import forge.assets.FSkinColor;
import forge.assets.FSkinColor.Colors; import forge.assets.FSkinColor.Colors;
@@ -20,19 +22,26 @@ public class LoadingOverlay extends FOverlay {
private static final float LOGO_SIZE_FACTOR = 0.7f; private static final float LOGO_SIZE_FACTOR = 0.7f;
private static final float INSETS_FACTOR = 0.025f; private static final float INSETS_FACTOR = 0.025f;
private static final FSkinFont FONT = FSkinFont.get(22); private static final FSkinFont FONT = FSkinFont.get(22);
private BGAnimation bgAnimation;
private Runnable runnable;
private boolean afterMatch;
private static FSkinColor getOverlayColor() { private static FSkinColor getOverlayColor() {
if (Forge.isMobileAdventureMode) if (Forge.isMobileAdventureMode)
return FSkinColor.get(Colors.ADV_CLR_ACTIVE).alphaColor(0.75f); return FSkinColor.get(Colors.ADV_CLR_ACTIVE).alphaColor(0.75f);
return FSkinColor.get(Colors.CLR_ACTIVE).alphaColor(0.75f); return FSkinColor.get(Colors.CLR_ACTIVE).alphaColor(0.75f);
} }
private static FSkinColor getForeColor() { private static FSkinColor getForeColor() {
if (Forge.isMobileAdventureMode) if (Forge.isMobileAdventureMode)
return FSkinColor.get(Colors.ADV_CLR_TEXT); return FSkinColor.get(Colors.ADV_CLR_TEXT);
return FSkinColor.get(Colors.CLR_TEXT); return FSkinColor.get(Colors.CLR_TEXT);
} }
public static void show(String caption0, final Runnable runnable) { public static void show(String caption0, final Runnable runnable) {
show(caption0, false, runnable); show(caption0, false, runnable);
} }
public static void show(String caption0, boolean textMode, final Runnable runnable) { public static void show(String caption0, boolean textMode, final Runnable runnable) {
final LoadingOverlay loader = new LoadingOverlay(caption0, textMode); final LoadingOverlay loader = new LoadingOverlay(caption0, textMode);
loader.show(); //show loading overlay then delay running remaining logic so UI can respond loader.show(); //show loading overlay then delay running remaining logic so UI can respond
@@ -53,18 +62,27 @@ public class LoadingOverlay extends FOverlay {
} }
private String caption; private String caption;
private boolean textMode = false; private boolean textMode = false, match = false;
private TextureRegion textureRegion;
public LoadingOverlay(String caption0) {
caption = caption0;
textMode = false;
}
public LoadingOverlay(String caption0, boolean textOnly) { public LoadingOverlay(String caption0, boolean textOnly) {
caption = caption0; caption = caption0;
textMode = textOnly; textMode = textOnly;
} }
public LoadingOverlay(Runnable toRunBeforeMatch) {
this(toRunBeforeMatch, false);
}
public LoadingOverlay(Runnable toRunBeforeMatch, boolean aftermatch) {
caption = "";
textMode = true;
textureRegion = Forge.takeScreenshot();
match = true;
bgAnimation = new BGAnimation();
runnable = toRunBeforeMatch;
afterMatch = aftermatch;
}
public void setCaption(String caption0) { public void setCaption(String caption0) {
caption = caption0; caption = caption0;
} }
@@ -80,6 +98,13 @@ public class LoadingOverlay extends FOverlay {
@Override @Override
public void drawOverlay(Graphics g) { public void drawOverlay(Graphics g) {
if (match) {
if (bgAnimation != null) {
bgAnimation.start();
bgAnimation.drawBackground(g);
return;
}
}
if (!textMode) { if (!textMode) {
float x = INSETS; float x = INSETS;
float panelWidth = getWidth() - 2 * INSETS; float panelWidth = getWidth() - 2 * INSETS;
@@ -114,4 +139,47 @@ public class LoadingOverlay extends FOverlay {
g.drawText(caption, FONT, getForeColor(), 0, 0, getWidth(), getHeight(), true, Align.center, true); g.drawText(caption, FONT, getForeColor(), 0, 0, getWidth(), getHeight(), true, Align.center, true);
} }
} }
@Override
public boolean keyDown(int keyCode) {
if (match)
return true;
return super.keyDown(keyCode);
}
private class BGAnimation extends ForgeAnimation {
float DURATION = 0.9f;
private float progress = 0;
public void drawBackground(Graphics g) {
float percentage = progress / DURATION;
float oldAlpha = g.getfloatAlphaComposite();
if (percentage < 0) {
percentage = 0;
} else if (percentage > 1) {
percentage = 1;
}
if (afterMatch) {
g.drawGrayTransitionImage(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), false, percentage);
} else {
g.setAlphaComposite(1 - percentage);
g.drawImage(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight());
g.setAlphaComposite(oldAlpha);
}
}
@Override
protected boolean advance(float dt) {
progress += dt;
return progress < DURATION;
}
@Override
protected void onEnd(boolean endingAll) {
match = false;
hide();
if (runnable != null)
runnable.run();
}
}
} }