From 44806757993b548bc85dda916ac91d76c23a11b4 Mon Sep 17 00:00:00 2001 From: Magpie Date: Thu, 7 Apr 2022 07:41:38 +0200 Subject: [PATCH] Added item tooltips with names and descriptions to rewards view in Adventure. Please test on mobile in case the text is too small! Moved item description method to the ItemData class so it can be reached anywhere, and made some minor tweaks for *conveyance*. --- .../src/forge/adventure/data/ItemData.java | 26 ++++++ .../forge/adventure/scene/InventoryScene.java | 26 +----- .../src/forge/adventure/util/RewardActor.java | 92 ++++++++++++++----- 3 files changed, 96 insertions(+), 48 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/data/ItemData.java b/forge-gui-mobile/src/forge/adventure/data/ItemData.java index d85405da6a3..f255d5ca28a 100644 --- a/forge-gui-mobile/src/forge/adventure/data/ItemData.java +++ b/forge-gui-mobile/src/forge/adventure/data/ItemData.java @@ -94,4 +94,30 @@ public class ItemData { } return ret; } + + public String getDescription() { + return getDescription(this); + } + + public String getDescription(ItemData data) { + String description = ""; + if(data.equipmentSlot != null && !data.equipmentSlot.equals("")) + description += "Slot: " + data.equipmentSlot + "\n"; + if(data.lifeModifier != 0) + description += "Life: " + ((data.lifeModifier > 0) ? "+" : "") + data.lifeModifier + "\n"; + if(data.startBattleWithCard != null && data.startBattleWithCard.length != 0) + description+="Cards on battlefield: \n" + data.cardNames() + "\n"; + if(data.moveSpeed!=0 && data.moveSpeed != 1) + description+="Movement speed: " + ((data.lifeModifier > 0) ? "+" : "") + Math.round((data.moveSpeed-1.f)*100) + "%\n"; + if(data.changeStartCards != 0) + description+="Starting hand: " + data.changeStartCards + "\n"; + if(data.opponent != null) { + String oppEffect=getDescription(data.opponent); + if(oppEffect != "") { + description += "Gives Opponent:\n"; + description += oppEffect; + } + } + return description; + } } diff --git a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java index 85254bc9c86..7ad55581600 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java @@ -210,34 +210,10 @@ public class InventoryScene extends UIScene { button.setChecked(false); } } - itemDescription.setText(data.name+"\n"+itemText(data)); + itemDescription.setText(data.name+"\n"+data.getDescription()); } - private String itemText(ItemData data) - { - String description=""; - if(data.equipmentSlot!=null&&data.equipmentSlot!="") - description+="Equipment: "+data.equipmentSlot+"\n"; - if(data.lifeModifier!=0) - description+="Life: "+data.lifeModifier+"\n"; - if(data.startBattleWithCard!=null&&data.startBattleWithCard.length!=0) - description+="Cards: "+data.cardNames()+"\n"; - if(data.moveSpeed!=0&&data.moveSpeed!=1) - description+="Movement speed: "+Math.round((data.moveSpeed-1.f)*100)+"%\n"; - if(data.changeStartCards!=0) - description+="Starting hand: "+data.changeStartCards+"\n"; - if(data.opponent !=null) - { - String oppEffect=itemText(data.opponent); - if(oppEffect!="") - { - description+="Give Opponent:\n"; - description+=oppEffect; - } - } - return description; - } private void updateInventory() { diff --git a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java index 73ff5ab994b..6858aef2645 100644 --- a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java @@ -1,5 +1,6 @@ package forge.adventure.util; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; @@ -23,9 +24,11 @@ import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Disposable; import forge.Forge; import forge.Graphics; +import forge.adventure.data.ItemData; import forge.adventure.scene.RewardScene; import forge.adventure.scene.Scene; import forge.assets.FSkin; +import forge.assets.FSkinFont; import forge.assets.ImageCache; import forge.card.CardImageRenderer; import forge.card.CardRenderer; @@ -50,6 +53,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb static TextureRegion backTexture; Texture image; + Texture generatedTooltip = null; //Storage for a generated tooltip. To dispose of on exit. boolean needsToBeDisposed; float flipProcess = 0; boolean clicked = false; @@ -65,6 +69,8 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb public void dispose() { if (needsToBeDisposed) image.dispose(); + if (generatedTooltip != null) + generatedTooltip.dispose(); } public Reward getReward() { @@ -76,26 +82,6 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb setCardImage(ImageCache.getImage(reward.getCard().getImageKey(false), false)); } - public Texture renderPlaceholder(Graphics G, PaperCard card){ //Use CardImageRenderer to output a Texture. - Matrix4 m = new Matrix4(); - FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGB888, preview_w, preview_h, false); - frameBuffer.begin(); - m.setToOrtho2D(0,preview_h, preview_w, -preview_h); //So it renders flipped directly. - - G.begin(preview_w, preview_h); - G.setProjectionMatrix(m); - G.startClip(); - CardImageRenderer.drawCardImage(G, CardView.getCardForUi(card), false, 0, 0, preview_w, preview_h, CardRenderer.CardStackPosition.Top, Forge.enableUIMask.equals("Art"), true); - G.end(); - G.endClip(); - //Create a new Pixmap to Texture with mipmaps, otherwise will render as full black. - Texture result = new Texture(Pixmap.createFromFrameBuffer(0, 0, preview_w, preview_h), true); - frameBuffer.end(); - G.dispose(); - frameBuffer.dispose(); - return result; - } - public RewardActor(Reward reward, boolean flippable) { this.flipOnClick = flippable; this.reward = reward; @@ -131,9 +117,11 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb DrawOnPixmap.draw(drawingMap, backSprite); Sprite item = reward.getItem().sprite(); - 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.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); + + setItemTooltips(item); image=new Texture(drawingMap); drawingMap.dispose(); needsToBeDisposed = true; @@ -207,6 +195,65 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } } + private Texture renderPlaceholder(Graphics G, PaperCard card){ //Use CardImageRenderer to output a Texture. + Matrix4 m = new Matrix4(); + FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGB888, preview_w, preview_h, false); + frameBuffer.begin(); + m.setToOrtho2D(0,preview_h, preview_w, -preview_h); //So it renders flipped directly. + + G.begin(preview_w, preview_h); + G.setProjectionMatrix(m); + G.startClip(); + CardImageRenderer.drawCardImage(G, CardView.getCardForUi(card), false, 0, 0, preview_w, preview_h, CardRenderer.CardStackPosition.Top, Forge.enableUIMask.equals("Art"), true); + G.end(); + G.endClip(); + //Rendering ends here. Create a new Pixmap to Texture with mipmaps, otherwise will render as full black. + Texture result = new Texture(Pixmap.createFromFrameBuffer(0, 0, preview_w, preview_h), Forge.isTextureFilteringEnabled()); + frameBuffer.end(); + G.dispose(); + frameBuffer.dispose(); + return result; + } + + private void setItemTooltips(Sprite icon) { + float icon_w = 64f; float icon_h = 64f; //Sizes for the embedded icon. Could be made smaller on smaller resolutions. + Matrix4 m = new Matrix4(); + ItemData item = getReward().getItem(); + FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, preview_w, preview_h, false); + frameBuffer.begin(); + m.setToOrtho2D(0,preview_h, preview_w, -preview_h); //So it renders flipped directly. + Graphics G = new Graphics(); + G.begin(preview_w, preview_h); + G.setProjectionMatrix(m); + G.startClip(); + //Draw item description panel. + G.fillRect(new Color(0f, 0f, 0f, 0.96f), 0, 0, preview_w, preview_h); //Translucent background. + G.drawRectLines(2, Color.WHITE, 0, 0, preview_w, preview_h); //Add a border. + G.drawImage(icon, 2, 2, icon_w, icon_h); //Draw the item's icon. + G.drawText(item.name, FSkinFont.get(24), Color.WHITE, icon_w + 2, 2, preview_w - (icon_w + 2), icon_h, false, 1, true); //Item name. + G.drawRectLines(1, Color.WHITE, 6, icon_h + 2, preview_w - 12, preview_h - (icon_h + 6)); //Description border. + G.drawText(item.getDescription(), FSkinFont.get(18), Color.WHITE, 10, icon_h + 8, preview_w - 10, preview_h - 4, false, Align.left, false); //Description. + G.end(); + G.endClip(); + Texture result = new Texture(Pixmap.createFromFrameBuffer(0, 0, preview_w, preview_h), Forge.isTextureFilteringEnabled()); + frameBuffer.end(); + G.dispose(); + frameBuffer.dispose(); + //Rendering code ends here. + + TextureRegionDrawable drawable = new TextureRegionDrawable(result); + drawable.setMinSize((Scene.GetIntendedHeight() / RewardScene.CARD_WIDTH_TO_HEIGHT) * 0.95f, Scene.GetIntendedHeight() * 0.95f); + toolTipImage = new Image(drawable); + tooltip = new Tooltip(toolTipImage); + holdTooltip = new HoldTooltip(new Image(drawable)); + tooltip.setInstant(true); + if (GuiBase.isAndroid()) + addListener(holdTooltip); + else + addListener(tooltip); + generatedTooltip = result; //Dispose of this later. + } + private boolean frontSideUp() { return (flipProcess >= 0.5f) == flipOnClick; } @@ -308,7 +355,6 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb batch.draw(ImageCache.defaultImage, x, -getHeight() / 2, width, getHeight()); switch (reward.getType()) { case Card: - break; case Gold: break;