add Bookmark to GameHUD

This commit is contained in:
Anthony Calosa
2023-07-31 03:21:59 +08:00
parent de7cd0d4f6
commit d806745cec
14 changed files with 207 additions and 42 deletions

View File

@@ -200,7 +200,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
return inventoryItems;
}
public Array<Deck> getBoostersOwned(){
public Array<Deck> getBoostersOwned() {
return boostersOwned;
}
@@ -303,7 +303,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
}
}
if (configuredDifficulty != null && (this.difficultyData.shardSellRatio == data.readFloat("shardSellRatio") || data.readFloat("shardSellRatio") == 0))
if (configuredDifficulty != null && (this.difficultyData.shardSellRatio == data.readFloat("shardSellRatio") || data.readFloat("shardSellRatio") == 0))
this.difficultyData.shardSellRatio = configuredDifficulty.shardSellRatio;
else
this.difficultyData.shardSellRatio = data.readFloat("shardSellRatio");
@@ -373,11 +373,10 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
}
if (data.containsKey("boosters")) {
Deck[] decks = (Deck[]) data.readObject("boosters");
for (Deck d : decks){
if (d != null && !d.isEmpty()){
for (Deck d : decks) {
if (d != null && !d.isEmpty()) {
boostersOwned.add(d);
}
else{
} else {
System.err.printf("Null or empty booster %s\n", d);
System.out.println("You have an empty booster pack in your inventory.");
}
@@ -418,9 +417,9 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
events.clear();
Object[] q = (Object[]) data.readObject("events");
if (q != null) {
for (Object itsReallyAnEvent : q){
for (Object itsReallyAnEvent : q) {
events.add((AdventureEventData) itsReallyAnEvent);
}
}
}
}
@@ -587,7 +586,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
case Card:
cards.add(reward.getCard());
newCards.add(reward.getCard());
if (reward.isNoSell()){
if (reward.isNoSell()) {
noSellCards.add(reward.getCard());
}
break;
@@ -1054,9 +1053,9 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
* @return int - index of new copy slot, or -1 if no slot was available
*/
public int copyDeck() {
for (int i = 0; i < decks.length; i++ ){
for (int i = 0; i < decks.length; i++) {
if (isEmptyDeck(i)) {
decks[i] = (Deck)deck.copyTo(deck.getName() + " (" + Forge.getLocalizer().getMessage("lblCopy") + ")");
decks[i] = (Deck) deck.copyTo(deck.getName() + " (" + Forge.getLocalizer().getMessage("lblCopy") + ")");
return i;
}
}
@@ -1075,6 +1074,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
public ItemPool<PaperCard> getAutoSellCards() {
return autoSellCards;
}
public ItemPool<PaperCard> getNoSellCards() {
return noSellCards;
}
@@ -1095,7 +1095,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
int count = cp.getValue() - noSellCards.count(cp.getKey());
if (count <=0) continue;
if (count <= 0) continue;
if (count > maxCardCounts.getOrDefault(cp.getKey(), 0)) {
maxCardCounts.put(cp.getKey(), cp.getValue());
@@ -1112,7 +1112,6 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
}
public CardPool getCollectionCards(boolean allCards) {
CardPool collectionCards = new CardPool();
collectionCards.addAll(cards);
@@ -1124,13 +1123,13 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
return collectionCards;
}
public void loadChanges(PointOfInterestChanges changes){
public void loadChanges(PointOfInterestChanges changes) {
this.currentLocationChanges = changes;
}
public void doAutosell() {
int profit = 0;
for (PaperCard cardToSell: autoSellCards.toFlatList()) {
for (PaperCard cardToSell : autoSellCards.toFlatList()) {
profit += AdventurePlayer.current().cardSellPrice(cardToSell);
autoSellCards.remove(cardToSell);
cards.remove(cardToSell, 1);

View File

@@ -18,6 +18,7 @@ public class PointOfInterestChanges implements SaveFileContent {
private final java.util.Map<Integer, Long> shopSeeds = new HashMap<>();
private final java.util.Map<Integer, Float> shopModifiers = new HashMap<>();
private final java.util.Map<Integer, Integer> reputation = new HashMap<>();
private Boolean isBookmarked;
public static class Map extends HashMap<String,PointOfInterestChanges> implements SaveFileContent {
@Override
@@ -62,6 +63,7 @@ public class PointOfInterestChanges implements SaveFileContent {
mapFlags.putAll((java.util.Map<String, Byte>) data.readObject("mapFlags"));
shopModifiers.clear();
shopModifiers.putAll((java.util.Map<Integer, Float>) data.readObject("shopModifiers"));
isBookmarked = (Boolean) data.readObject("isBookmarked");
}
@Override
@@ -72,6 +74,7 @@ public class PointOfInterestChanges implements SaveFileContent {
data.storeObject("mapFlags", mapFlags);
data.storeObject("shopSeeds", shopSeeds);
data.storeObject("shopModifiers", shopModifiers);
data.storeObject("isBookmarked", isBookmarked);
return data;
}
@@ -159,6 +162,14 @@ public class PointOfInterestChanges implements SaveFileContent {
public boolean hasDeletedObjects() {
return deletedObjects != null && !deletedObjects.isEmpty();
}
public boolean isBookmarked() {
if (isBookmarked == null)
return false;
return isBookmarked;
}
public void setIsBookmarked(boolean val) {
isBookmarked = val;
}
public void clearDeletedObjects() {
// reset map when assigning as a quest target that needs enemies

View File

@@ -5,6 +5,7 @@ import com.badlogic.gdx.graphics.GL20;
import com.google.common.collect.Sets;
import forge.Forge;
import forge.adventure.data.BiomeData;
import forge.adventure.pointofintrest.PointOfInterest;
import forge.adventure.stage.MapStage;
import forge.adventure.stage.WorldStage;
import forge.adventure.util.Current;
@@ -80,6 +81,13 @@ public class GameScene extends HudScene {
return location;
}
public PointOfInterest getMapPOI() {
if (MapStage.getInstance().isInMap()) {
return TileMapScene.instance().rootPoint;
}
return null;
}
public boolean isNotInWorldMap() {
String location = getAdventurePlayerLocation(false, true);
Set<String> locationTypes = Sets.newHashSet("capital", "castle", "cave", "dungeon", "town");

View File

@@ -1,6 +1,7 @@
package forge.adventure.scene;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
@@ -9,6 +10,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.github.tommyettinger.textra.TextraButton;
import com.github.tommyettinger.textra.TypingLabel;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import forge.Forge;
import forge.adventure.data.AdventureQuestData;
import forge.adventure.pointofintrest.PointOfInterest;
@@ -19,6 +21,7 @@ import forge.adventure.util.Current;
import forge.adventure.world.WorldSave;
import java.util.List;
import java.util.Set;
/**
* Displays the rewards of a fight or a treasure
@@ -33,6 +36,8 @@ public class MapViewScene extends UIScene {
private final List<TypingLabel> labels;
private int index = -1;
private float avatarX = 0, avatarY = 0;
private Set<Vector2> positions;
private Set<PointOfInterest> bookmark;
public static MapViewScene instance() {
if (object == null)
@@ -46,6 +51,8 @@ public class MapViewScene extends UIScene {
ui.onButtonPress("quest", this::scroll);
scroll = ui.findActor("map");
labels = Lists.newArrayList();
positions = Sets.newHashSet();
bookmark = Sets.newHashSet();
table = new Group();
scroll.setActor(table);
img = new Image();
@@ -62,11 +69,24 @@ public class MapViewScene extends UIScene {
a.remove();
}
labels.clear();
positions.clear();
index = -1;
Forge.switchToLast();
return true;
}
public void addBookmark(PointOfInterest point) {
if (point == null)
return;
bookmark.add(point);
}
public void removeBookmark(PointOfInterest point) {
if (point == null)
return;
bookmark.remove(point);
}
public boolean scroll() {
if (!labels.isEmpty()) {
index++;
@@ -99,13 +119,22 @@ public class MapViewScene extends UIScene {
for (AdventureQuestData adq : Current.player().getQuests()) {
PointOfInterest poi = adq.getTargetPOI();
if (poi != null) {
if (positions.contains(poi.getPosition()))
continue; //don't map duplicate position to prevent stacking
TypingLabel label = Controls.newTypingLabel("[%?BLACKEN][+GPS]{GRADIENT=RED;WHITE;1;1}>" + adq.name + "{ENDGRADIENT}");
labels.add(label);
table.addActor(label);
label.setPosition(getMapX(poi.getPosition().x) - label.getWidth() / 2, getMapY(poi.getPosition().y) - label.getHeight() / 2);
label.skipToTheEnd();
positions.add(poi.getPosition());
}
}
for (PointOfInterest poi : bookmark) {
TypingLabel label = Controls.newTypingLabel("[%70][+Star]");
table.addActor(label);
label.setPosition(getMapX(poi.getPosition().x) - label.getWidth() / 2, getMapY(poi.getPosition().y) - label.getHeight() / 2);
label.skipToTheEnd();
}
TextraButton questButton = ui.findActor("quest");
if (questButton != null) {
questButton.setDisabled(labels.isEmpty());

View File

@@ -49,7 +49,7 @@ public class GameHUD extends Stage {
private final TextraLabel lifePoints, money, shards, keys;
private final Image miniMap, gamehud, mapborder, avatarborder, blank;
private final InputEvent eventTouchDown, eventTouchUp;
private final TextraButton deckActor, openMapActor, menuActor, logbookActor, inventoryActor, exitToWorldMapActor;
private final TextraButton deckActor, openMapActor, menuActor, logbookActor, inventoryActor, exitToWorldMapActor, bookmarkActor;
public final UIActor ui;
private final Touchpad touchpad;
private final Console console;
@@ -89,6 +89,7 @@ public class GameHUD extends Stage {
inventoryActor = ui.findActor("inventory");
gamehud = ui.findActor("gamehud");
exitToWorldMapActor = ui.findActor("exittoworldmap");
bookmarkActor = ui.findActor("bookmark");
dialog = Controls.newDialog("");
miniMapPlayer = new Image(Forge.getAssets().getTexture(Config.instance().getFile("ui/minimap_player.png")));
@@ -120,6 +121,7 @@ public class GameHUD extends Stage {
ui.onButtonPress("logbook", this::logbook);
ui.onButtonPress("deck", this::openDeck);
ui.onButtonPress("exittoworldmap", this::exitToWorldMap);
ui.onButtonPress("bookmark", this::bookmark);
lifePoints = ui.findActor("lifePoints");
shards = ui.findActor("shards");
money = ui.findActor("money");
@@ -236,6 +238,7 @@ public class GameHUD extends Stage {
&& !(Controls.actorContainsVector(logbookActor, touch)) //not inside stats button
&& !(Controls.actorContainsVector(inventoryActor, touch)) //not inside inventory button
&& !(Controls.actorContainsVector(exitToWorldMapActor, touch)) //not inside exit button
&& !(Controls.actorContainsVector(bookmarkActor, touch)) //not inside bookmark button
&& !(Controls.actorContainsVector(abilityButtonMap, touch)) //not inside abilityButtonMap
&& (Controls.actorContainsVector(ui, touch)) //inside display bounds
&& pointer < 1) { //not more than 1 pointer
@@ -356,6 +359,8 @@ public class GameHUD extends Stage {
openMapActor.setText(val);
openMapActor.layout();
}
if (MapStage.getInstance().isInMap())
updateBookmarkActor(MapStage.getInstance().getChanges().isBookmarked());
}
void clearAbility() {
@@ -370,7 +375,7 @@ public class GameHUD extends Stage {
setAbilityButton(AdventurePlayer.current().getEquippedAbility1());
setAbilityButton(AdventurePlayer.current().getEquippedAbility2());
float x = Forge.isLandscapeMode() ? 426f : 216f;
float y = 10f;
float y = Forge.isLandscapeMode() ? 10f : 60f;
float w = 45f;
float h = 35f;
for (TextraButton button : abilityButtonMap) {
@@ -499,9 +504,9 @@ public class GameHUD extends Stage {
private void setAudio(MusicPlaylist playlist) {
if (playlist.equals(currentAudioPlaylist))
return;
System.out.println("Playlist: "+playlist);
//System.out.println("Playlist: "+playlist);
unloadAudio();
System.out.println("Playlist: "+playlist);
//System.out.println("Playlist: "+playlist);
audio = getMusic(playlist);
}
@@ -561,6 +566,42 @@ public class GameHUD extends Stage {
showDialog();
}
private void bookmark() {
if (console.isVisible())
return;
if (!GameScene.instance().isNotInWorldMap())
return;
if (!MapStage.getInstance().canEscape())
return;
if (Forge.restrictAdvMenus)
return;
if (MapStage.getInstance().isInMap()) {
if (MapStage.getInstance().getChanges().isBookmarked()) {
MapStage.getInstance().getChanges().setIsBookmarked(false);
PointOfInterestMapSprite mapSprite = WorldStage.getInstance().getMapSprite(GameScene.instance().getMapPOI());
if (mapSprite != null) {
MapStage.getInstance().getChanges().save();
mapSprite.setBookmarked(false, mapSprite.getPointOfInterest());
updateBookmarkActor(false);
}
} else {
MapStage.getInstance().getChanges().setIsBookmarked(true);
PointOfInterestMapSprite mapSprite = WorldStage.getInstance().getMapSprite(GameScene.instance().getMapPOI());
if (mapSprite != null) {
MapStage.getInstance().getChanges().save();
mapSprite.setBookmarked(true, mapSprite.getPointOfInterest());
updateBookmarkActor(true);
}
}
}
}
private void updateBookmarkActor(boolean value) {
if (bookmarkActor == null)
return;
bookmarkActor.setText("[%120][+" + (value ? "Bookmark" : "Unmark") + "]");
}
private void exitDungeonCallback() {
hideDialog(true);
}
@@ -582,9 +623,9 @@ public class GameHUD extends Stage {
actor.setVisible(visible);
}
private void setDisabled(Actor actor, boolean enable, String enabled, String disabled) {
private void setDisabled(Actor actor, boolean value, String enabled, String disabled) {
if (actor instanceof TextraButton) {
((TextraButton) actor).setDisabled(enable);
((TextraButton) actor).setDisabled(value);
((TextraButton) actor).setText(((TextraButton) actor).isDisabled() ? disabled : enabled);
}
}
@@ -609,6 +650,7 @@ public class GameHUD extends Stage {
setVisibility(money, visible);
setVisibility(blank, visible);
setDisabled(exitToWorldMapActor, !GameScene.instance().isNotInWorldMap(), "[%120][+ExitToWorldMap]", "---");
setDisabled(bookmarkActor, !GameScene.instance().isNotInWorldMap(), "[%120][+Bookmark]", "---");
setAlpha(avatarborder, visible);
setAlpha(avatar, visible);
setAlpha(deckActor, visible);
@@ -616,6 +658,7 @@ public class GameHUD extends Stage {
setAlpha(logbookActor, visible);
setAlpha(inventoryActor, visible);
setAlpha(exitToWorldMapActor, visible);
setAlpha(bookmarkActor, visible);
for (TextraButton button : abilityButtonMap) {
setAlpha(button, visible);
}
@@ -723,6 +766,7 @@ public class GameHUD extends Stage {
if (exitDungeon) {
MapStage.getInstance().exitDungeon();
setDisabled(exitToWorldMapActor, true, "[%120][+ExitToWorldMap]", "---");
setDisabled(bookmarkActor, true, "[%120][+Bookmark]", "---");
}
return true;
}

View File

@@ -9,6 +9,8 @@ import com.badlogic.gdx.utils.Array;
import com.github.tommyettinger.textra.TextraLabel;
import forge.adventure.data.BiomeSpriteData;
import forge.adventure.pointofintrest.PointOfInterest;
import forge.adventure.pointofintrest.PointOfInterestChanges;
import forge.adventure.scene.MapViewScene;
import forge.adventure.util.Controls;
import forge.adventure.world.WorldSave;
import org.apache.commons.lang3.tuple.Pair;
@@ -24,14 +26,18 @@ public class MapSprite extends Actor {
static public int SpriteLayer = 0;
TextureRegion texture;
TextraLabel searchPost = Controls.newTextraLabel("[%80][+SearchPost]");
boolean isCaveDungeon, isOldorVisited;
Sprite bookmark = Controls.getSprite("Star");
boolean isCaveDungeon, isOldorVisited, isBookmarked;
public MapSprite(Vector2 pos, TextureRegion sprite, PointOfInterest point) {
if (point != null) {
PointOfInterestChanges changes = WorldSave.getCurrentSave().getPointOfInterestChanges(point.getID() + point.getData().map);
setBookmarked(changes.isBookmarked(), point);
isCaveDungeon = "cave".equalsIgnoreCase(point.getData().type) || "dungeon".equalsIgnoreCase(point.getData().type);
if (point.getData().map != null && point.getID() != null) {
isOldorVisited = WorldSave.getCurrentSave().getPointOfInterestChanges(point.getID() + point.getData().map).hasDeletedObjects();
isOldorVisited = changes.hasDeletedObjects();
}
} else {
setBookmarked(false, null);
}
texture = sprite;
setPosition(pos.x, pos.y);
@@ -43,6 +49,15 @@ public class MapSprite extends Actor {
isOldorVisited = true;
}
public void setBookmarked(boolean val, PointOfInterest poi) {
isBookmarked = val;
if (isBookmarked)
MapViewScene.instance().addBookmark(poi);
else
MapViewScene.instance().removeBookmark(poi);
}
public static Array<Actor> getMapSprites(int chunkX, int chunkY, int layer) {
Array<Actor> actorGroup = new Array<>();
List<Pair<Vector2, Integer>> objects = WorldSave.getCurrentSave().getWorld().GetMapObjects(chunkX, chunkY);
@@ -76,6 +91,11 @@ public class MapSprite extends Actor {
searchPost.setPosition(getX() - 7, getY() + 7);
searchPost.draw(batch, parentAlpha);
}
if (isBookmarked && bookmark != null) {
bookmark.setScale(0.7f, 0.7f);
bookmark.setPosition(getRight() - 8, getY() + getHeight() / 1.5f);
bookmark.draw(batch, parentAlpha);
}
//font.draw(batch,String.valueOf(getZIndex()),getX()-(getWidth()/2),getY());
}

View File

@@ -12,6 +12,7 @@ import forge.Forge;
import forge.adventure.character.CharacterSprite;
import forge.adventure.character.EnemySprite;
import forge.adventure.data.*;
import forge.adventure.pointofintrest.PointOfInterest;
import forge.adventure.scene.DuelScene;
import forge.adventure.scene.RewardScene;
import forge.adventure.scene.Scene;
@@ -338,6 +339,19 @@ public class WorldStage extends GameStage implements SaveFileContent {
directlyEnterPOI = true; //On a new game, we want to automatically enter any POI the player overlaps with.
}
public PointOfInterestMapSprite getMapSprite(PointOfInterest poi) {
if (poi == null)
return null;
for (Actor actor : foregroundSprites.getChildren()) {
if (actor.getClass() == PointOfInterestMapSprite.class) {
PointOfInterestMapSprite point = (PointOfInterestMapSprite) actor;
if (poi == point.getPointOfInterest() && poi.getPosition() == point.getPointOfInterest().getPosition())
return point;
}
}
return null;
}
@Override
public void enter() {
getPlayerSprite().LoadPos();

View File

@@ -2,9 +2,7 @@ package forge.adventure.util;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
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.*;
import com.badlogic.gdx.math.Interpolation;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
@@ -431,6 +429,9 @@ public class Controls {
return Forge.getAssets().getTextraFont(name, getSkin().getFont(name), Config.instance().getAtlas(Paths.ITEMS_ATLAS));
}
static public Sprite getSprite(String itemSprite) {
return Config.instance().getAtlas(Paths.ITEMS_ATLAS).createSprite(itemSprite);
}
static public class AccountingLabel extends TextraLabel {
private TextraLabel label;

View File

@@ -18,6 +18,7 @@ public enum KeyBinding {
Map("Map", Input.Keys.M,Input.Keys.BUTTON_SELECT),
Equip("Equip", Input.Keys.E,Input.Keys.BUTTON_X),
ExitToWorldMap("ExitToWorldMap", Input.Keys.F4,Input.Keys.BUTTON_L2),
Bookmark("Bookmark", Input.Keys.B, Input.Keys.BUTTON_R2),
Use("Use", Input.Keys.ENTER,Input.Keys.BUTTON_A),
Back("Back", Input.Keys.ESCAPE,Input.Keys.BUTTON_B),
ScrollUp("ScrollUp", Input.Keys.PAGE_UP,Input.Keys.BUTTON_L1),

View File

@@ -444,6 +444,12 @@ GreenLeaf
GreenLeaf2
xy: 112, 608
size: 16, 16
Bookmark
xy: 432, 63
size: 16, 16
Unmark
xy: 416, 63
size: 16, 16
SearchPost
xy: 384, 63
size: 16, 16
@@ -456,6 +462,9 @@ LogBook
GPS
xy: 464, 0
size: 16, 16
Star
xy: 464, 16
size: 16, 16
UnderworldCookbook
xy: 304, 960
size: 16, 16

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 274 KiB

View File

@@ -89,7 +89,7 @@
"binding": "Deck",
"width": 45,
"height": 25,
"x": 175,
"x": 198,
"y": 0
},
{
@@ -99,7 +99,7 @@
"binding": "Inventory",
"width": 45,
"height": 25,
"x": 220,
"x": 243,
"y": 0
},
{
@@ -109,7 +109,7 @@
"binding": "Status",
"width": 45,
"height": 25,
"x": 265,
"x": 288,
"y": 0
},
{
@@ -119,7 +119,7 @@
"binding": "Menu",
"width": 45,
"height": 25,
"x": 130,
"x": 108,
"y": 0
},
{
@@ -139,7 +139,17 @@
"binding": "ExitToWorldMap",
"width": 45,
"height": 25,
"x": 310,
"x": 333,
"y": 0
},
{
"type": "TextButton",
"name": "bookmark",
"text": "[%120][+Bookmark]",
"binding": "Bookmark",
"width": 45,
"height": 25,
"x": 153,
"y": 0
}
]

View File

@@ -89,7 +89,7 @@
"binding": "Deck",
"width": 45,
"height": 25,
"x": 175,
"x": 198,
"y": 240
},
{
@@ -99,7 +99,7 @@
"binding": "Inventory",
"width": 45,
"height": 25,
"x": 220,
"x": 243,
"y": 240
},
{
@@ -109,7 +109,7 @@
"binding": "Status",
"width": 45,
"height": 25,
"x": 265,
"x": 288,
"y": 240
},
{
@@ -119,7 +119,7 @@
"binding": "Menu",
"width": 45,
"height": 25,
"x": 130,
"x": 108,
"y": 240
},
{
@@ -139,7 +139,17 @@
"binding": "ExitToWorldMap",
"width": 45,
"height": 25,
"x": 310,
"x": 333,
"y": 240
},
{
"type": "TextButton",
"name": "bookmark",
"text": "[%120][+Bookmark]",
"binding": "Bookmark",
"width": 45,
"height": 25,
"x": 153,
"y": 240
}
]

View File

@@ -87,7 +87,7 @@
"text": "[%120][+Deck]",
"width": 25,
"height": 25,
"x": 105,
"x": 118,
"y": 450
},
{
@@ -96,7 +96,7 @@
"text": "[%120][+Item]",
"width": 25,
"height": 25,
"x": 130,
"x": 143,
"y": 450
},
@@ -106,7 +106,7 @@
"text": "[%120][+Logbook]",
"width": 25,
"height": 25,
"x": 155,
"x": 168,
"y": 450
},
{
@@ -115,7 +115,7 @@
"text": "[%120][+Menu]",
"width": 25,
"height": 25,
"x": 80,
"x": 68,
"y": 450
},
{
@@ -133,7 +133,16 @@
"text": "[%120][+ExitToWorldMap]",
"width": 25,
"height": 25,
"x": 180,
"x": 193,
"y": 450
},
{
"type": "TextButton",
"name": "bookmark",
"text": "[%120][+Bookmark]",
"width": 25,
"height": 25,
"x": 93,
"y": 450
}
]