diff --git a/forge-gui-mobile/src/forge/adventure/data/ItemData.java b/forge-gui-mobile/src/forge/adventure/data/ItemData.java index e7fa777a746..e0c29941c46 100644 --- a/forge-gui-mobile/src/forge/adventure/data/ItemData.java +++ b/forge-gui-mobile/src/forge/adventure/data/ItemData.java @@ -2,14 +2,11 @@ package forge.adventure.data; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.g2d.Sprite; -import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Json; import forge.adventure.util.Config; import forge.adventure.util.Paths; -import static forge.adventure.util.Paths.ITEMS_ATLAS; - /** * Data class that will be used to read Json configuration files * ItemData @@ -49,16 +46,9 @@ public class ItemData { shardsNeeded = cpy.shardsNeeded; } - public Sprite sprite() - { - if(itemAtlas==null) - { - itemAtlas=Config.instance().getAtlas(ITEMS_ATLAS); - } - return itemAtlas.createSprite(iconName); + public Sprite sprite() { + return Config.instance().getItemSprite(iconName); } - - private static TextureAtlas itemAtlas; private static Array itemList; public static Array getAllItems() { if (itemList == null) { diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index d40c3eb7d7d..0564e79cea5 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -200,7 +200,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { return inventoryItems; } - public Array getBoostersOwned(){ + public Array 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 getAutoSellCards() { return autoSellCards; } + public ItemPool 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); diff --git a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java index 4085e290814..116503a118d 100644 --- a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java +++ b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java @@ -18,6 +18,7 @@ public class PointOfInterestChanges implements SaveFileContent { private final java.util.Map shopSeeds = new HashMap<>(); private final java.util.Map shopModifiers = new HashMap<>(); private final java.util.Map reputation = new HashMap<>(); + private Boolean isBookmarked; public static class Map extends HashMap implements SaveFileContent { @Override @@ -62,6 +63,7 @@ public class PointOfInterestChanges implements SaveFileContent { mapFlags.putAll((java.util.Map) data.readObject("mapFlags")); shopModifiers.clear(); shopModifiers.putAll((java.util.Map) 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 diff --git a/forge-gui-mobile/src/forge/adventure/scene/GameScene.java b/forge-gui-mobile/src/forge/adventure/scene/GameScene.java index d9575a5c8f3..e8585361484 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/GameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/GameScene.java @@ -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 locationTypes = Sets.newHashSet("capital", "castle", "cave", "dungeon", "town"); diff --git a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java index 6f5bdc09f81..3c2e41281be 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java @@ -2,7 +2,6 @@ package forge.adventure.scene; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Sprite; -import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.*; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; @@ -24,8 +23,6 @@ import forge.deck.Deck; import java.util.HashMap; import java.util.Map; -import static forge.adventure.util.Paths.ITEMS_ATLAS; - public class InventoryScene extends UIScene { TextraButton leave; Button equipButton; @@ -350,8 +347,7 @@ public class InventoryScene extends UIScene { System.err.print("Can not add null / empty booster " + Current.player().getBoostersOwned().get(i) + "\n"); continue; } - TextureAtlas atlas = Config.instance().getAtlas(ITEMS_ATLAS); - Sprite deckSprite = atlas.createSprite("Deck"); + Sprite deckSprite = Config.instance().getItemSprite("Deck"); Image img = new Image(deckSprite); img.setX((newActor.getWidth() - img.getWidth()) / 2); diff --git a/forge-gui-mobile/src/forge/adventure/scene/MapViewScene.java b/forge-gui-mobile/src/forge/adventure/scene/MapViewScene.java index 303e9feb087..aa15dddc82a 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/MapViewScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/MapViewScene.java @@ -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 labels; private int index = -1; private float avatarX = 0, avatarY = 0; + private Set positions; + private Set 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()); diff --git a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java index 811b95bdb91..8d9a047321e 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/RewardScene.java @@ -518,9 +518,9 @@ public class RewardScene extends UIScene { if (Type.Shop != type) return; if (collectionPool != null && Reward.Type.Card.equals(reward.getType())) - setText("[%75]" + price + " [+Gold]\n" + Forge.getLocalizer().getMessage("lblOwned") + ": " + collectionPool.count(reward.getCard())); + setText("[%75][+GoldCoin] " + price + "\n" + Forge.getLocalizer().getMessage("lblOwned") + ": " + collectionPool.count(reward.getCard())); else if (Reward.Type.Item.equals(reward.getType())) - setText("[%75]" + price + " [+Gold]\n" + Forge.getLocalizer().getMessage("lblOwned") + ": " + AdventurePlayer.current().countItem(reward.getItem().name)); + setText("[%75][+GoldCoin] " + price + "\n" + Forge.getLocalizer().getMessage("lblOwned") + ": " + AdventurePlayer.current().countItem(reward.getItem().name)); } public BuyButton(int id, int i, RewardActor actor, Reward reward, TextraButton style, float shopModifier) { @@ -536,7 +536,7 @@ public class RewardScene extends UIScene { price = CardUtil.getRewardPrice(actor.getReward()); price *= Current.player().goldModifier(); price *= shopModifier; - setText(price + " [+Gold]"); + setText("[+GoldCoin] " + price); updateOwned(); addListener(new ClickListener() { @Override diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index 6dabd1d3365..8682267f016 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -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; } diff --git a/forge-gui-mobile/src/forge/adventure/stage/MapSprite.java b/forge-gui-mobile/src/forge/adventure/stage/MapSprite.java index 5fc4bfaa6cc..453361ac2f1 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/MapSprite.java +++ b/forge-gui-mobile/src/forge/adventure/stage/MapSprite.java @@ -6,10 +6,11 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; 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.util.Controls; +import forge.adventure.pointofintrest.PointOfInterestChanges; +import forge.adventure.scene.MapViewScene; +import forge.adventure.util.Config; import forge.adventure.world.WorldSave; import org.apache.commons.lang3.tuple.Pair; @@ -23,15 +24,19 @@ public class MapSprite extends Actor { static public int BackgroundLayer = -1; static public int SpriteLayer = 0; TextureRegion texture; - TextraLabel searchPost = Controls.newTextraLabel("[%80][+SearchPost]"); - boolean isCaveDungeon, isOldorVisited; - + Sprite bookmark = Config.instance().getItemSprite("Star"); + Sprite magnifier = Config.instance().getItemSprite("Magnifier"); + 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 +48,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 getMapSprites(int chunkX, int chunkY, int layer) { Array actorGroup = new Array<>(); List> objects = WorldSave.getCurrentSave().getWorld().GetMapObjects(chunkX, chunkY); @@ -72,9 +86,15 @@ public class MapSprite extends Actor { if (texture == null) return; batch.draw(texture, getX(), getY()); - if (isCaveDungeon && !isOldorVisited) { - searchPost.setPosition(getX() - 7, getY() + 7); - searchPost.draw(batch, parentAlpha); + if (isCaveDungeon && !isOldorVisited && magnifier != null) { + magnifier.setScale(0.7f, 0.7f); + magnifier.setPosition(getX() - 7, getY() + 2); + magnifier.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()); } diff --git a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java index 6674655c467..61bfcf6935a 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java @@ -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(); diff --git a/forge-gui-mobile/src/forge/adventure/util/Config.java b/forge-gui-mobile/src/forge/adventure/util/Config.java index 9f7b4541239..acdf031e5a8 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Config.java +++ b/forge-gui-mobile/src/forge/adventure/util/Config.java @@ -1,6 +1,7 @@ package forge.adventure.util; import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Json; @@ -50,6 +51,7 @@ public class Config { private SettingData settingsData; private String Lang = "en-us"; private final String plane; + private ObjectMap itemSprites = new ObjectMap<>(); static public Config instance() { if (currentConfig == null) @@ -245,6 +247,15 @@ public class Config { return atlas; } + public Sprite getItemSprite(String itemName) { + Sprite sprite = itemSprites.get(itemName); + if (sprite == null) { + sprite = getAtlas(forge.adventure.util.Paths.ITEMS_ATLAS).createSprite(itemName); + if (sprite != null) + itemSprites.put(itemName, sprite); + } + return sprite; + } public SettingData getSettingData() { return settingsData; } diff --git a/forge-gui-mobile/src/forge/adventure/util/Controls.java b/forge-gui-mobile/src/forge/adventure/util/Controls.java index 6f75b0c299e..4f53cea2fe3 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Controls.java +++ b/forge-gui-mobile/src/forge/adventure/util/Controls.java @@ -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,7 +429,6 @@ public class Controls { return Forge.getAssets().getTextraFont(name, getSkin().getFont(name), Config.instance().getAtlas(Paths.ITEMS_ATLAS)); } - static public class AccountingLabel extends TextraLabel { private TextraLabel label; private final TextraLabel placeholder; diff --git a/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java b/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java index 55a267ceacd..21a00e33f66 100644 --- a/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java +++ b/forge-gui-mobile/src/forge/adventure/util/KeyBinding.java @@ -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), diff --git a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java index 9c2eb2be2cf..399db590ef9 100644 --- a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java @@ -50,8 +50,6 @@ import org.apache.commons.lang3.StringUtils; import java.io.File; -import static forge.adventure.util.Paths.ITEMS_ATLAS; - /** * Render the rewards as a card on the reward scene. */ @@ -296,8 +294,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb break; } case Item: { - TextureAtlas atlas = Config.instance().getAtlas(ITEMS_ATLAS); - Sprite backSprite = atlas.createSprite("CardBack"); + Sprite backSprite = Config.instance().getItemSprite("CardBack"); if (reward.getItem() == null) { needsToBeDisposed = true; processSprite(backSprite, null, null, 0, 0, false); @@ -311,8 +308,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb break; } case CardPack: { - TextureAtlas atlas = Config.instance().getAtlas(ITEMS_ATLAS); - Sprite backSprite = atlas.createSprite("CardBack"); + Sprite backSprite = Config.instance().getItemSprite("CardBack"); if (reward.getDeck() == null) { needsToBeDisposed = true; processSprite(backSprite, null, null, 0, 0, false); @@ -342,7 +338,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb item = new Sprite(new TextureRegion(t)); isBooster = true; } else { - item = atlas.createSprite("Deck"); + item = Config.instance().getItemSprite("Deck"); } setItemTooltips(item, backSprite, isBooster); @@ -356,9 +352,8 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb case Life: case Shards: case Gold: { - TextureAtlas atlas = Config.instance().getAtlas(ITEMS_ATLAS); - Sprite backSprite = atlas.createSprite("CardBack"); - Sprite item = atlas.createSprite(reward.type.toString()); + Sprite backSprite = Config.instance().getItemSprite("CardBack"); + Sprite item = Config.instance().getItemSprite(reward.type.toString()); setItemTooltips(item, backSprite, false); boolean isShop = RewardScene.Type.Shop.equals(type); processSprite(backSprite, item, isShop ? null : diff --git a/forge-gui/res/adventure/common/sprites/items.atlas b/forge-gui/res/adventure/common/sprites/items.atlas index 33167346377..345046947c5 100644 --- a/forge-gui/res/adventure/common/sprites/items.atlas +++ b/forge-gui/res/adventure/common/sprites/items.atlas @@ -444,6 +444,18 @@ GreenLeaf GreenLeaf2 xy: 112, 608 size: 16, 16 +GoldCoin + xy: 464, 63 + size: 16, 16 +Magnifier + xy: 448, 63 + 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 +468,12 @@ LogBook GPS xy: 464, 0 size: 16, 16 +Star + xy: 464, 16 + size: 16, 16 +TreasureChest + xy: 464, 32 + size: 16, 16 UnderworldCookbook xy: 304, 960 size: 16, 16 diff --git a/forge-gui/res/adventure/common/sprites/items.png b/forge-gui/res/adventure/common/sprites/items.png index 5ce676de519..347f50d2c70 100644 Binary files a/forge-gui/res/adventure/common/sprites/items.png and b/forge-gui/res/adventure/common/sprites/items.png differ diff --git a/forge-gui/res/adventure/common/ui/hud.json b/forge-gui/res/adventure/common/ui/hud.json index a18af1a95ac..b1521c98667 100644 --- a/forge-gui/res/adventure/common/ui/hud.json +++ b/forge-gui/res/adventure/common/ui/hud.json @@ -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 } ] diff --git a/forge-gui/res/adventure/common/ui/hud_landscape.json b/forge-gui/res/adventure/common/ui/hud_landscape.json index 8646a3f03ac..ece911e40b7 100644 --- a/forge-gui/res/adventure/common/ui/hud_landscape.json +++ b/forge-gui/res/adventure/common/ui/hud_landscape.json @@ -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 } ] diff --git a/forge-gui/res/adventure/common/ui/hud_portrait.json b/forge-gui/res/adventure/common/ui/hud_portrait.json index 06b5f852570..d345e47c81a 100644 --- a/forge-gui/res/adventure/common/ui/hud_portrait.json +++ b/forge-gui/res/adventure/common/ui/hud_portrait.json @@ -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 } ]