From c13396f9843f71ba0f030cd53b7602fbbee7111e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 25 Aug 2024 22:51:15 +0800 Subject: [PATCH] update GameHUD --- .../adventure/player/AdventurePlayer.java | 27 ++++++++ .../src/forge/adventure/stage/GameHUD.java | 64 +++++++++---------- .../src/forge/adventure/stage/MapStage.java | 39 ++++++++--- forge-gui/res/adventure/common/ui/hud.json | 6 +- .../adventure/common/ui/hud_landscape.json | 6 +- .../res/adventure/common/ui/hud_portrait.json | 6 +- 6 files changed, 99 insertions(+), 49 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index 8b179250c95..6f0f774ffc0 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -2,15 +2,20 @@ package forge.adventure.player; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Null; +import com.github.tommyettinger.textra.TextraLabel; import com.google.common.collect.Lists; import forge.Forge; import forge.adventure.data.*; import forge.adventure.pointofintrest.PointOfInterestChanges; import forge.adventure.scene.AdventureDeckEditor; import forge.adventure.scene.DeckEditScene; +import forge.adventure.stage.GameHUD; +import forge.adventure.stage.GameStage; import forge.adventure.stage.MapStage; +import forge.adventure.stage.WorldStage; import forge.adventure.util.*; import forge.adventure.world.WorldSave; import forge.card.ColorSet; @@ -598,6 +603,28 @@ public class AdventurePlayer implements Serializable, SaveFileContent { return HeroListData.getRaces().get(Current.player().heroRace); } + public GameStage getCurrentGameStage() { + if (MapStage.getInstance().isInMap()) + return MapStage.getInstance(); + return WorldStage.getInstance(); + } + public void addStatusMessage(String iconName, String message, Integer itemCount, float x, float y) { + String symbol = itemCount == null || itemCount < 0 ? "" : " +"; + String icon = iconName == null ? "" : "[+" + iconName + "]"; + String count = itemCount == null ? "" : String.valueOf(itemCount); + TextraLabel actor = Controls.newTextraLabel("[%95]" + icon + "[WHITE]" + symbol + count + " " + message); + actor.setPosition(x, y); + actor.addAction(Actions.after( + Actions.sequence( + Actions.parallel( + Actions.moveBy(0f, 5f, 4f), + Actions.fadeIn(2f) + ), + Actions.fadeOut(3f), + Actions.removeActor() + ))); + GameHUD.getInstance().addActor(actor); + } public void addCard(PaperCard card) { cards.add(card); newCards.add(card); diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index db9f695e05d..5090afb5876 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -47,9 +47,9 @@ public class GameHUD extends Stage { static public GameHUD instance; private final GameStage gameStage; private final Image avatar, miniMapPlayer; - private final TextraLabel lifePoints; - private final TextraLabel money; - private final TextraLabel shards; + private final TypingLabel lifePoints; + private final TypingLabel money; + private final TypingLabel shards; private final TextraLabel keys; private final TextraLabel notificationText = Controls.newTextraLabel(""); private final Image miniMap, gamehud, mapborder, avatarborder, blank; @@ -60,7 +60,7 @@ public class GameHUD extends Stage { private final Console console; float TOUCHPAD_SCALE = 70f, referenceX; float opacity = 1f; - private boolean debugMap, updatelife; + private boolean debugMap; private final Dialog dialog; private boolean dialogOnlyInput; @@ -129,8 +129,11 @@ public class GameHUD extends Stage { ui.onButtonPress("exittoworldmap", this::exitToWorldMap); ui.onButtonPress("bookmark", this::bookmark); lifePoints = ui.findActor("lifePoints"); + lifePoints.skipToTheEnd(); shards = ui.findActor("shards"); + shards.skipToTheEnd(); money = ui.findActor("money"); + money.skipToTheEnd(); shards.setText("[%95][+Shards] 0"); money.setText("[%95][+Gold] "); lifePoints.setText("[%95][+Life] 20/20"); @@ -139,11 +142,31 @@ public class GameHUD extends Stage { scrollPane.setPosition(2, 2); scrollPane.setStyle(Controls.getSkin().get("translucent", ScrollPane.ScrollPaneStyle.class)); addActor(scrollPane); - AdventurePlayer.current().onLifeChange(() -> lifePoints.setText("[%95][+Life]" + lifepointsTextColor + " " + AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife())); - AdventurePlayer.current().onShardsChange(() -> shards.setText("[%95][+Shards] " + AdventurePlayer.current().getShards())); - AdventurePlayer.current().onEquipmentChanged(this::updateAbility); + AdventurePlayer.current().onLifeChange(() -> { + String effect = "{EMERGE}"; + String heartbeat = ""; + //colored lifepoints + if (Current.player().getLife() >= Current.player().getMaxLife()) { + //color green if max life + lifepointsTextColor = "[GREEN]"; + } else if (Current.player().getLife() <= 5) { + //color red if critical + effect = ""; + heartbeat = "{HEARTBEAT=0.5;0.5}"; + lifepointsTextColor = "{ENDHEARTBEAT}[RED]"; + } + else { + lifepointsTextColor = "[WHITE]"; + } + lifePoints.restart("[%95]" + heartbeat + "[+Life]" + lifepointsTextColor + effect + " " + AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife()); - WorldSave.getCurrentSave().getPlayer().onGoldChange(() -> money.setText("[%95][+Gold] " + AdventurePlayer.current().getGold())); + }); + AdventurePlayer.current().onShardsChange(() -> { + + shards.restart("[%95][+Shards] {EMERGE}" + AdventurePlayer.current().getShards()); + }); + AdventurePlayer.current().onGoldChange(() -> money.restart("[%95][+Gold] {EMERGE}" + AdventurePlayer.current().getGold())); + AdventurePlayer.current().onEquipmentChanged(this::updateAbility); addActor(ui); addActor(miniMapPlayer); console = new Console(); @@ -268,7 +291,6 @@ public class GameHUD extends Stage { @Override public void draw() { - updatelife = false; int yPos = (int) gameStage.player.getY(); int xPos = (int) gameStage.player.getX(); act(Gdx.graphics.getDeltaTime()); //act the Hud @@ -281,29 +303,7 @@ public class GameHUD extends Stage { !Controls.actorContainsVector(notificationPane, new Vector2(miniMapPlayer.getX(),miniMapPlayer.getY())) && (!Controls.actorContainsVector(console, new Vector2(miniMapPlayer.getX(),miniMapPlayer.getY())) || !console.isVisible())); // prevent drawing on top of console or notifications - //colored lifepoints - if (Current.player().getLife() >= Current.player().getMaxLife()) { - //color green if max life - if (!lifepointsTextColor.equals("[GREEN]")) { - lifepointsTextColor = "[GREEN]"; - updatelife = true; - } - } else if (Current.player().getLife() <= 5) { - //color red if critical - if (!lifepointsTextColor.equals("[RED]")) { - lifepointsTextColor = "[RED]"; - updatelife = true; - } - } else { - if (!lifepointsTextColor.isEmpty()) { - lifepointsTextColor = ""; - updatelife = true; - } - } - if (updatelife) { - updatelife = false; - lifePoints.setText("[%95][+Life]" + lifepointsTextColor + " " + AdventurePlayer.current().getLife() + "/" + AdventurePlayer.current().getMaxLife()); - } + if (!MapStage.getInstance().isInMap()) updateMusic(); else diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java index eb71fabadf7..42928ee39f8 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapStage.java @@ -27,6 +27,7 @@ import com.github.tommyettinger.textra.TypingLabel; import forge.Forge; import forge.adventure.character.*; import forge.adventure.data.*; +import forge.adventure.player.AdventurePlayer; import forge.adventure.pointofintrest.PointOfInterestChanges; import forge.adventure.scene.*; import forge.adventure.util.*; @@ -1026,20 +1027,42 @@ public class MapStage extends GameStage { Gdx.input.vibrate(50); if (Controllers.getCurrent() != null && Controllers.getCurrent().canVibrate()) Controllers.getCurrent().startVibration(100, 1); - startPause(0.1f, () -> { //Switch to item pickup scene. - RewardSprite RS = (RewardSprite) actor; - RewardScene.instance().loadRewards(RS.getRewards(), RewardScene.Type.Loot, null); - RS.remove(); - actors.removeValue(RS, true); - changes.deleteObject(RS.getId()); - Forge.switchScene(RewardScene.instance()); - }); + RewardSprite RS = (RewardSprite) actor; + Array rewards = RS.getRewards(); + + if (rewards.size == 1) { + Reward reward = rewards.get(0); + switch (reward.getType()) { + case Life: + case Shards: + case Gold: + String message = Forge.getLocalizer().getMessageorUseDefault("lbl" + reward.getType().name(), reward.getType().name()); + AdventurePlayer.current().addStatusMessage(reward.getType().name(), message, reward.getCount(), actor.getX(), actor.getY() + player.getHeight()); + AdventurePlayer.current().addReward(reward); + break; + default: + showRewardScene(rewards); + break; + } + } else { + showRewardScene(rewards); + } + RS.remove(); + actors.removeValue(RS, true); + changes.deleteObject(RS.getId()); break; } } } } + private void showRewardScene(Array rewards) { + startPause(0.1f, () -> { + RewardScene.instance().loadRewards(rewards, RewardScene.Type.Loot, null); + Forge.switchScene(RewardScene.instance()); + }); + } + boolean started = false; public void beginDuel(EnemySprite mob) { if (mob == null) return; diff --git a/forge-gui/res/adventure/common/ui/hud.json b/forge-gui/res/adventure/common/ui/hud.json index b1521c98667..8650ab30893 100644 --- a/forge-gui/res/adventure/common/ui/hud.json +++ b/forge-gui/res/adventure/common/ui/hud.json @@ -56,7 +56,7 @@ "y": 10 }, { - "type": "Label", + "type": "TypingLabel", "name": "lifePoints", "font": "default", "width": 64, @@ -65,7 +65,7 @@ "y": 56 }, { - "type": "Label", + "type": "TypingLabel", "name": "shards", "font": "default", "width": 64, @@ -74,7 +74,7 @@ "y": 70 }, { - "type": "Label", + "type": "TypingLabel", "name": "money", "font": "default", "width": 64, diff --git a/forge-gui/res/adventure/common/ui/hud_landscape.json b/forge-gui/res/adventure/common/ui/hud_landscape.json index ece911e40b7..3bf3db4726d 100644 --- a/forge-gui/res/adventure/common/ui/hud_landscape.json +++ b/forge-gui/res/adventure/common/ui/hud_landscape.json @@ -56,7 +56,7 @@ "y": 10 }, { - "type": "Label", + "type": "TypingLabel", "name": "lifePoints", "font": "default", "width": 64, @@ -65,7 +65,7 @@ "y": 56 }, { - "type": "Label", + "type": "TypingLabel", "name": "shards", "font": "default", "width": 64, @@ -74,7 +74,7 @@ "y": 70 }, { - "type": "Label", + "type": "TypingLabel", "name": "money", "font": "default", "width": 64, diff --git a/forge-gui/res/adventure/common/ui/hud_portrait.json b/forge-gui/res/adventure/common/ui/hud_portrait.json index d345e47c81a..c3363b314b3 100644 --- a/forge-gui/res/adventure/common/ui/hud_portrait.json +++ b/forge-gui/res/adventure/common/ui/hud_portrait.json @@ -56,7 +56,7 @@ "y": 10 }, { - "type": "Label", + "type": "TypingLabel", "name": "lifePoints", "width": 48, "height": 3, @@ -64,7 +64,7 @@ "y": 62 }, { - "type": "Label", + "type": "TypingLabel", "name": "shards", "font": "default", "width": 48, @@ -73,7 +73,7 @@ "y": 76 }, { - "type": "Label", + "type": "TypingLabel", "name": "money", "font": "default", "width": 48,