update GameHUD

This commit is contained in:
Anthony Calosa
2024-08-25 22:51:15 +08:00
parent 2dc025bf67
commit c13396f984
6 changed files with 99 additions and 49 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -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<Reward> 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<Reward> 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;

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,