update PlayerStatisticScene

- add toggable Achievements buttons (Shared with Constructed GameType except variants)
- set avatar to stretch (to match different scaling)
- fix Ooze avatar region
This commit is contained in:
Anthony Calosa
2023-03-12 21:07:56 +08:00
parent 2a82a51fab
commit 97bb4d0fbb
6 changed files with 113 additions and 19 deletions

View File

@@ -2,12 +2,15 @@ package forge.adventure.scene;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane; import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.Window; import com.badlogic.gdx.scenes.scene2d.ui.Window;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Scaling;
import com.github.tommyettinger.textra.TextraButton; import com.github.tommyettinger.textra.TextraButton;
import com.github.tommyettinger.textra.TextraLabel; import com.github.tommyettinger.textra.TextraLabel;
import forge.Forge; import forge.Forge;
@@ -20,7 +23,12 @@ import forge.adventure.util.Controls;
import forge.adventure.util.Current; import forge.adventure.util.Current;
import forge.adventure.util.Paths; import forge.adventure.util.Paths;
import forge.adventure.world.WorldSave; import forge.adventure.world.WorldSave;
import forge.assets.FBufferedImage;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.game.GameType;
import forge.localinstance.achievements.Achievement;
import forge.localinstance.achievements.AchievementCollection;
import forge.model.FModel;
import forge.player.GamePlayerUtil; import forge.player.GamePlayerUtil;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
@@ -33,15 +41,20 @@ public class PlayerStatisticScene extends UIScene {
TextraLabel wins, totalWins; TextraLabel wins, totalWins;
TextraLabel loss, totalLoss; TextraLabel loss, totalLoss;
TextraLabel winloss, lossWinRatio; TextraLabel winloss, lossWinRatio;
TextraLabel playerName; TextraLabel playerName, headerAchievements, headerAvatar, headerName, headerWinLoss;
TextraButton back; TextraButton back, toggleAward;
private final Table scrollContainer; private final Table scrollContainer, achievementContainer;
TextraLabel blessingScroll; TextraLabel blessingScroll;
ScrollPane scroller;
Table root;
boolean toggle = false;
AchievementCollection achievements;
private PlayerStatisticScene() { private PlayerStatisticScene() {
super(Forge.isLandscapeMode() ? "ui/statistic.json" : "ui/statistic_portrait.json"); super(Forge.isLandscapeMode() ? "ui/statistic.json" : "ui/statistic_portrait.json");
scrollContainer = new Table(Controls.getSkin()); scrollContainer = new Table(Controls.getSkin());
scrollContainer.row(); scrollContainer.row();
achievementContainer = new Table(Controls.getSkin());
blessingScroll = Controls.newTextraLabel(""); blessingScroll = Controls.newTextraLabel("");
blessingScroll.setColor(Color.BLACK); blessingScroll.setColor(Color.BLACK);
blessingScroll.setAlignment(Align.topLeft); blessingScroll.setAlignment(Align.topLeft);
@@ -62,13 +75,25 @@ public class PlayerStatisticScene extends UIScene {
winloss = ui.findActor("winloss"); winloss = ui.findActor("winloss");
lossWinRatio = ui.findActor("lossWinRatio"); lossWinRatio = ui.findActor("lossWinRatio");
back = ui.findActor("return"); back = ui.findActor("return");
toggleAward = ui.findActor("toggleAward");
headerAchievements = Controls.newTextraLabel("[%110]" + Forge.getLocalizer().getMessage("lblAchievements"));
headerAvatar = Controls.newTextraLabel("[%110]" + Forge.getLocalizer().getMessage("lblAvatar"));
headerName = Controls.newTextraLabel("[%110]" + Forge.getLocalizer().getMessage("lblName"));
headerWinLoss = Controls.newTextraLabel("[%110]" + Forge.getLocalizer().getMessage("lblWinProper") + "/" + Forge.getLocalizer().getMessage("lblLossProper"));
toggleAward.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
toggleScroller();
}
});
Window window = ui.findActor("scrollWindow"); Window window = ui.findActor("scrollWindow");
Table root = ui.findActor("enemies"); root = ui.findActor("enemies");
root.add(Forge.getLocalizer().getMessage("lblAvatar")).pad(3, 10, 3, 10).center(); root.add(headerAvatar).pad(5).center();
root.add(Forge.getLocalizer().getMessage("lblName")).fillX().pad(3, 10, 3, 60).center(); root.add(headerName).fillX().pad(5).width(100).center();
root.add(Forge.getLocalizer().getMessage("lblWinProper") + "/" + Forge.getLocalizer().getMessage("lblLossProper")).pad(3, 5, 3, 10).center(); root.add(headerWinLoss).pad(5).center();
root.row(); root.row();
ScrollPane scroller = new ScrollPane(scrollContainer); scroller = new ScrollPane(scrollContainer);
root.add(scroller).colspan(3); root.add(scroller).colspan(3);
ScrollPane blessing = ui.findActor("blessingInfo"); ScrollPane blessing = ui.findActor("blessingInfo");
blessing.setActor(blessingScroll); blessing.setActor(blessingScroll);
@@ -89,6 +114,27 @@ public class PlayerStatisticScene extends UIScene {
} }
private void toggleScroller() {
toggle = !toggle;
if (toggle) {
root.clear();
root.add(headerAchievements).pad(5).colspan(2).center().expand();
root.row();
root.add(scroller).expand();
scroller.setActor(achievementContainer);
toggleAward.setText("[%125][+VS]");
} else {
root.clear();
root.add(headerAvatar).pad(5).center();
root.add(headerName).fillX().pad(5).width(100).center();
root.add(headerWinLoss).pad(5).center();
root.row();
root.add(scroller).colspan(3);
scroller.setActor(scrollContainer);
toggleAward.setText("[%125][+AWARD]");
}
performTouch(scroller);
}
private TextureRegion getColorFrame(ColorSet color) { private TextureRegion getColorFrame(ColorSet color) {
String colorName = "color_"; String colorName = "color_";
@@ -108,6 +154,27 @@ public class PlayerStatisticScene extends UIScene {
@Override @Override
public void enter() { public void enter() {
super.enter(); super.enter();
achievements = FModel.getAchievements(GameType.Constructed);
achievementContainer.clear();
for (Achievement a : achievements) {
GameType g = GameType.smartValueOf(a.getKey());
if (g != null) //skip variants
continue;
TextureRegion textureRegion = new TextureRegion(((FBufferedImage) a.getImage()).getTexture());
textureRegion.flip(true, true);
Image image = new Image(textureRegion);
float alpha = a.isActive() ? 1f : 0.25f;
image.getColor().a = alpha;
achievementContainer.add(image).height(50).width(40).center().pad(5);
String value = "[%105]" + a.getDisplayName() + "[%98]";
String subTitle = a.getSubTitle(true);
if (subTitle != null)
value += "\n" + subTitle;
TextraLabel label = Controls.newTextraLabel(value);
label.getColor().a = alpha;
achievementContainer.add(label).left().pad(5);
achievementContainer.row();
}
scrollContainer.clear(); scrollContainer.clear();
if (playerName != null) { if (playerName != null) {
@@ -145,13 +212,12 @@ public class PlayerStatisticScene extends UIScene {
for (Map.Entry<String, Pair<Integer, Integer>> entry : Current.player().getStatistic().getWinLossRecord().entrySet()) { for (Map.Entry<String, Pair<Integer, Integer>> entry : Current.player().getStatistic().getWinLossRecord().entrySet()) {
EnemyData data = WorldData.getEnemy(entry.getKey()); EnemyData data = WorldData.getEnemy(entry.getKey());
if (data == null) continue; if (data == null) continue;
Image enemyImage = new Image(); Image enemyImage = new Image(new EnemySprite(data).getAvatar());
enemyImage.setDrawable(new TextureRegionDrawable(new EnemySprite(data).getAvatar())); enemyImage.setScaling(Scaling.stretch);
enemyImage.setSize(8, 8); scrollContainer.add(enemyImage).pad(5).size(16).fillY();
scrollContainer.add().width(16);
scrollContainer.add(enemyImage).pad(3, 10, 3, 10).center(); scrollContainer.add((data.name)).fillX().pad(5).width(120);
scrollContainer.add((data.name)).fillX().pad(3, 10, 3, 40).center(); scrollContainer.add(entry.getValue().getLeft().toString() + "/" + entry.getValue().getRight().toString()).pad(5);
scrollContainer.add(entry.getValue().getLeft().toString() + "/" + entry.getValue().getRight().toString()).pad(3, 5, 3, 10).center();
scrollContainer.row(); scrollContainer.row();
} }
performTouch(scrollPaneOfActor(scrollContainer)); //can use mouse wheel if available to scroll performTouch(scrollPaneOfActor(scrollContainer)); //can use mouse wheel if available to scroll

View File

@@ -4,8 +4,8 @@ format: RGBA8888
filter: Nearest, Nearest filter: Nearest, Nearest
repeat: none repeat: none
Avatar Avatar
xy: 36, 4 xy: 178, 10
size: 32, 32 size: 19, 19
Idle Idle
xy: 172, 4 xy: 172, 4
size: 32, 32 size: 32, 32

View File

@@ -45,6 +45,12 @@ ExitToWorldMap
MovementSpeed MovementSpeed
xy: 48, 80 xy: 48, 80
size: 16, 16 size: 16, 16
VS
xy: 208, 928
size: 16, 16
AWARD
xy: 144, 496
size: 16, 16
Item Item
xy: 0, 64 xy: 0, 64
size: 16, 16 size: 16, 16

View File

@@ -124,7 +124,16 @@
"binding": "Back", "binding": "Back",
"width": 100, "width": 100,
"height": 30, "height": 30,
"x": 335, "x": 345,
"y": 224
},
{
"type": "TextButton",
"name": "toggleAward",
"text": "[%125][+AWARD]",
"width": 30,
"height": 30,
"x": 315,
"y": 224 "y": 224
}, },
{ {

View File

@@ -113,7 +113,16 @@
"name": "return", "name": "return",
"text": "tr(lblBack)", "text": "tr(lblBack)",
"binding": "Back", "binding": "Back",
"width": 260, "width": 230,
"height": 30,
"x": 35,
"y": 440
},
{
"type": "TextButton",
"name": "toggleAward",
"text": "[%125][+AWARD]",
"width": 30,
"height": 30, "height": 30,
"x": 5, "x": 5,
"y": 440 "y": 440

View File

@@ -123,6 +123,10 @@ public abstract class Achievement {
protected abstract int evaluate(Player player, Game game); protected abstract int evaluate(Player player, Game game);
public boolean isActive() {
return earnedSpecial() || earnedMythic() || earnedRare() || earnedUncommon() || earnedCommon();
}
private void updateTrophyImage() { private void updateTrophyImage() {
FSkinProp background; FSkinProp background;
float opacity = 1; float opacity = 1;