From 6171589330f546192fa346dbfddfa492dde4764f Mon Sep 17 00:00:00 2001 From: Grimm Date: Sun, 10 Apr 2022 20:05:27 +0200 Subject: [PATCH] fixed saving poi data, added date to load screen --- .../adventure/data/PointOfInterestData.java | 6 +- .../pointofintrest/PointOfInterest.java | 2 +- .../PointOfInterestChanges.java | 58 +++++++++++- .../forge/adventure/scene/SaveLoadScene.java | 12 +++ .../forge/adventure/util/SaveFileData.java | 11 +-- .../src/forge/adventure/world/WorldSave.java | 23 ++--- .../Shandalar/maps/main.tiled-session | 88 ++++++++++++++++--- .../res/adventure/Shandalar/ui/save_load.json | 14 +-- .../Shandalar/ui/save_load_mobile.json | 8 ++ 9 files changed, 181 insertions(+), 41 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java b/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java index 830fa1a5a2f..31e0cfaa66d 100644 --- a/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java +++ b/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java @@ -1,11 +1,11 @@ package forge.adventure.data; import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Json; import forge.adventure.util.Config; import forge.adventure.util.Paths; -import forge.util.MyRandom; import java.util.ArrayList; @@ -39,13 +39,13 @@ public class PointOfInterestData { } return pointOfInterestList; } - public static PointOfInterestData getPointOfInterest(String name) { + public static PointOfInterestData getPointOfInterest(String name, Vector2 index) { ArrayList candidates = new ArrayList(); for(PointOfInterestData data: new Array.ArrayIterator<>(getAllPointOfInterest())){ if(data.name.equals(name)) candidates.add(data); //Populate candidates with specified name. } if(candidates.size() > 0){ //If we got any candidates, return a random one. - return candidates.get(MyRandom.getRandom().nextInt(candidates.size())); + return candidates.get(((int)(index.x*6719+index.y)%candidates.size()));//6719 is just a big prime to avoid collisions } return null; } diff --git a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterest.java b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterest.java index 572841c97fb..dd1cf9ad3e7 100644 --- a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterest.java +++ b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterest.java @@ -20,8 +20,8 @@ public class PointOfInterest implements SaveFileContent { @Override public void load(SaveFileData saveFileData) { - data=PointOfInterestData.getPointOfInterest(saveFileData.readString("name")); position.set(saveFileData.readVector2("position")); + data=PointOfInterestData.getPointOfInterest(saveFileData.readString("name"),position); rectangle.set(saveFileData.readRectangle("rectangle")); spriteIndex=saveFileData.readInt("spriteIndex"); diff --git a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java index 769a3c4e7f5..570a5a9fb1d 100644 --- a/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java +++ b/forge-gui-mobile/src/forge/adventure/pointofintrest/PointOfInterestChanges.java @@ -1,14 +1,69 @@ package forge.adventure.pointofintrest; +import forge.adventure.util.SaveFileContent; +import forge.adventure.util.SaveFileData; + +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; /** * Class to save point of interest changes, like sold cards and dead enemies */ -public class PointOfInterestChanges { +public class PointOfInterestChanges implements SaveFileContent { + + public static class Map extends HashMap implements SaveFileContent + { + + @Override + public void load(SaveFileData data) { + + this.clear(); + if(data==null||!data.containsKey("keys")) + return; + String[] keys= (String[]) data.readObject("keys"); + for(int i=0;i keys=new ArrayList<>(); + ArrayList items=new ArrayList<>(); + for (Map.Entry entry : this.entrySet()) { + keys.add(entry.getKey()); + items.add(entry.getValue()); + } + data.storeObject("keys",keys.toArray(new String[0])); + for(int i=0;i) data.readObject("deletedObjects")); + cardsBought.clear(); + cardsBought.putAll((HashMap>) data.readObject("cardsBought")); + } + + @Override + public SaveFileData save() { + SaveFileData data=new SaveFileData(); + data.storeObject("deletedObjects",deletedObjects); + data.storeObject("cardsBought",cardsBought); + return data; + } private final HashSet deletedObjects=new HashSet<>(); private final HashMap> cardsBought=new HashMap<>(); @@ -38,4 +93,5 @@ public class PointOfInterestChanges { } return cardsBought.get(objectID).contains(cardIndex); } + } diff --git a/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java index 871ec590d6f..8a8b8e3d73f 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/SaveLoadScene.java @@ -21,6 +21,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; +import java.text.DateFormat; import java.util.zip.InflaterInputStream; /** @@ -37,6 +38,7 @@ public class SaveLoadScene extends UIScene { Label header; int currentSlot = -3, lastSelectedSlot = 0; Image previewImage; + Label previewDate; Image previewBorder; TextButton saveLoadButton, back; TextButton quickSave; @@ -83,10 +85,17 @@ public class SaveLoadScene extends UIScene { previewImage.setDrawable(new TextureRegionDrawable(new Texture(header.preview))); previewImage.layout(); previewImage.setVisible(true); + previewDate.setVisible(true); + if (header.saveDate != null) + previewDate.setText(DateFormat.getDateInstance().format(header.saveDate)); + else + previewDate.setText(""); } } else { if (previewImage != null) previewImage.setVisible(false); + if (previewDate != null) + previewDate.setVisible(false); } for (IntMap.Entry butt : new IntMap.Entries(buttons)) { butt.value.setColor(defColor); @@ -123,7 +132,9 @@ public class SaveLoadScene extends UIScene { break; case NewGamePlus: if (WorldSave.load(currentSlot)) { + WorldSave.getCurrentSave().clearChanges(); WorldSave.getCurrentSave().getWorld().generateNew(0); + Current.player().setWorldPosY((int) (WorldSave.getCurrentSave().getWorld().getData().playerStartPosY * WorldSave.getCurrentSave().getWorld().getData().height * WorldSave.getCurrentSave().getWorld().getTileSize())); Current.player().setWorldPosX((int) (WorldSave.getCurrentSave().getWorld().getData().playerStartPosX * WorldSave.getCurrentSave().getWorld().getData().width * WorldSave.getCurrentSave().getWorld().getTileSize())); Forge.setTransitionScreen(new TransitionScreen(new Runnable() { @@ -285,6 +296,7 @@ public class SaveLoadScene extends UIScene { //makes dialog hidden immediately when you open saveload scene.. dialog.getColor().a = 0; previewImage = ui.findActor("preview"); + previewDate = ui.findActor("saveDate"); previewBorder = ui.findActor("preview_border"); header = Controls.newLabel(Forge.getLocalizer().getMessage("lblSave")); header.setAlignment(Align.center); diff --git a/forge-gui-mobile/src/forge/adventure/util/SaveFileData.java b/forge-gui-mobile/src/forge/adventure/util/SaveFileData.java index 83b0c29d7f2..ed35e696620 100644 --- a/forge-gui-mobile/src/forge/adventure/util/SaveFileData.java +++ b/forge-gui-mobile/src/forge/adventure/util/SaveFileData.java @@ -6,13 +6,7 @@ import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import forge.Forge; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.ObjectStreamClass; +import java.io.*; import java.util.HashMap; public class SaveFileData extends HashMap @@ -329,6 +323,9 @@ public class SaveFileData extends HashMap return false; } + + + class DecompressibleInputStream extends ObjectInputStream { /*https://stackoverflow.com/questions/1816559/make-java-runtime-ignore-serialversionuids*/ diff --git a/forge-gui-mobile/src/forge/adventure/world/WorldSave.java b/forge-gui-mobile/src/forge/adventure/world/WorldSave.java index 92e645e7ebc..adcd6c0af5b 100644 --- a/forge-gui-mobile/src/forge/adventure/world/WorldSave.java +++ b/forge-gui-mobile/src/forge/adventure/world/WorldSave.java @@ -11,20 +11,15 @@ import forge.deck.Deck; import forge.localinstance.properties.ForgeConstants; import forge.player.GamePlayerUtil; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.util.HashMap; +import java.io.*; +import java.util.Date; import java.util.zip.DeflaterOutputStream; import java.util.zip.InflaterInputStream; /** * Represents everything that will be saved, like the player and the world. */ -public class WorldSave { +public class WorldSave { static final public int AUTO_SAVE_SLOT =-1; static final public int QUICK_SAVE_SLOT =-2; @@ -33,7 +28,7 @@ public class WorldSave { public WorldSaveHeader header = new WorldSaveHeader(); private final AdventurePlayer player=new AdventurePlayer(); private final World world=new World(); - private final HashMap pointOfInterestChanges=new HashMap<>(); + private final PointOfInterestChanges.Map pointOfInterestChanges= new PointOfInterestChanges.Map(); private final SignalList onLoadList=new SignalList(); @@ -73,7 +68,9 @@ public class WorldSave { GamePlayerUtil.getGuiPlayer().setName(currentSave.player.getName()); try { currentSave.world.load(mainData.readSubData("world")); + currentSave.pointOfInterestChanges.load(mainData.readSubData("pointOfInterestChanges")); WorldStage.getInstance().load(mainData.readSubData("worldStage")); + } catch (Exception e) { System.err.println("Generating New World"); currentSave.world.generateNew(0); @@ -124,7 +121,7 @@ public class WorldSave { public static WorldSave generateNewWorld(String name, boolean male, int race, int avatarIndex, int startingDeckIndex, DifficultyData diff, long seed) { currentSave.world.generateNew(seed); - + currentSave.pointOfInterestChanges.clear(); Deck starterDeck = Config.instance().starterDecks()[startingDeckIndex]; currentSave.player.create(name, starterDeck, male, race, avatarIndex,diff); currentSave.player.setWorldPosY((int) (currentSave.world.getData().playerStartPosY * currentSave.world.getData().height * currentSave.world.getTileSize())); @@ -154,11 +151,13 @@ public class WorldSave { DeflaterOutputStream def= new DeflaterOutputStream(fos); ObjectOutputStream oos = new ObjectOutputStream(def)) { + header.saveDate= new Date(); oos.writeObject(header); SaveFileData mainData=new SaveFileData(); mainData.store("player",currentSave.player.save()); mainData.store("world",currentSave.world.save()); mainData.store("worldStage", WorldStage.getInstance().save()); + mainData.store("pointOfInterestChanges",currentSave.pointOfInterestChanges.save()); oos.writeObject(mainData); } @@ -170,4 +169,8 @@ public class WorldSave { return true; } + public void clearChanges() { + pointOfInterestChanges.clear(); + } + } diff --git a/forge-gui/res/adventure/Shandalar/maps/main.tiled-session b/forge-gui/res/adventure/Shandalar/maps/main.tiled-session index fe8cc3609aa..ce1899a8b06 100644 --- a/forge-gui/res/adventure/Shandalar/maps/main.tiled-session +++ b/forge-gui/res/adventure/Shandalar/maps/main.tiled-session @@ -3,12 +3,12 @@ "height": 4300, "width": 2 }, - "activeFile": "map/aerie_1.tmx", + "activeFile": "map/barbariancamp_2.tmx", "automapping.whileDrawing": false, "expandedProjectPaths": [ - "obj", "map/main_story", "tileset", + "obj", "map" ], "file.lastUsedOpenFilter": "All Files (*)", @@ -49,8 +49,8 @@ "scale": 4, "selectedLayer": 4, "viewCenter": { - "x": 201.75, - "y": 167.75 + "x": 370.25, + "y": 101.75 } }, "map/barbariancamp_3.tmx": { @@ -105,7 +105,7 @@ "scale": 3, "selectedLayer": 1, "viewCenter": { - "x": 240, + "x": 239.99999999999997, "y": 136 } }, @@ -529,8 +529,8 @@ "scale": 0.75, "selectedLayer": 4, "viewCenter": { - "x": 312, - "y": 319.9999999999999 + "x": 311.99999999999994, + "y": 320 } }, "map/cave_23B10.tmx": { @@ -673,7 +673,7 @@ "scale": 1.0166158536585366, "selectedLayer": 4, "viewCenter": { - "x": 311.8188633978108, + "x": 311.81886339781073, "y": 320.6717648822912 } }, @@ -1497,7 +1497,7 @@ "scale": 1.5, "selectedLayer": 4, "viewCenter": { - "x": 400, + "x": 399.99999999999994, "y": 400 } }, @@ -1993,7 +1993,7 @@ "scale": 1.3694556451612903, "selectedLayer": 0, "viewCenter": { - "x": 231.4788369525212, + "x": 231.47883695252114, "y": 136.5506072874494 } }, @@ -2465,7 +2465,7 @@ "scale": 1.5, "selectedLayer": 6, "viewCenter": { - "x": 400, + "x": 399.99999999999994, "y": 400 } }, @@ -2497,7 +2497,7 @@ "scale": 3, "selectedLayer": 6, "viewCenter": { - "x": 240, + "x": 239.99999999999997, "y": 136 } }, @@ -2631,7 +2631,7 @@ "scale": 0.75, "selectedLayer": 0, "viewCenter": { - "x": 480, + "x": 479.99999999999994, "y": 320 } }, @@ -2728,7 +2728,67 @@ "map/plains_town.tmx", "map/main_story/colorless_castle.tmx", "map/main_story/blue_castle.tmx", - "map/aerie_1.tmx" + "map/aerie_1.tmx", + "map/cave_13.tmx", + "map/cave_14.tmx", + "map/cave_15.tmx", + "map/cave_16.tmx", + "map/cave_16B.tmx", + "map/cave_23B10.tmx", + "map/cave_23B2.tmx", + "map/cave_23B4.tmx", + "map/cave_23C5.tmx", + "map/cave_3.tmx", + "map/cave_25.tmx", + "map/cave_25B.tmx", + "map/cave_25C.tmx", + "map/cave_9.tmx", + "map/cave_8.tmx", + "map/cave_7.tmx", + "map/cave_4.tmx", + "map/crypt.tmx", + "map/crypt_2.tmx", + "map/crypt_3.tmx", + "map/crypt_4.tmx", + "map/crypt_5.tmx", + "map/djinnpalace_1.tmx", + "map/djinnpalace_2.tmx", + "map/djinnpalace_3.tmx", + "map/djinnpalace_3B.tmx", + "map/elftown.tmx", + "map/evilgrove_1.tmx", + "map/evilgrove_2.tmx", + "map/evilgrove_3.tmx", + "map/factory_1.tmx", + "map/factory_2.tmx", + "map/factory_3.tmx", + "map/factory_4.tmx", + "map/evilgrove_4.tmx", + "map/evilgrove_5.tmx", + "map/magetower_5.tmx", + "map/magetower_6.tmx", + "map/magetower_7.tmx", + "map/vampirecastle_4.tmx", + "map/portal_2.tmx", + "map/portal_2C.tmx", + "map/portal_2C2.tmx", + "map/portal_2D.tmx", + "map/portal_2E.tmx", + "map/portal_2F.tmx", + "map/portal_2G.tmx", + "map/cave_23I2.tmx", + "map/cave_23G4.tmx", + "map/cave_23E6.tmx", + "map/cave_23C8.tmx", + "map/cave_23B1.tmx", + "map/cave_2.tmx", + "map/cave_16BL2U.tmx", + "map/cave_16BL1.tmx", + "map/cave_1.tmx", + "map/catlair_3.tmx", + "map/catlair_2.tmx", + "map/catlair_1.tmx", + "map/barbariancamp_2.tmx" ], "project": "main.tiled-project", "property.type": "object", diff --git a/forge-gui/res/adventure/Shandalar/ui/save_load.json b/forge-gui/res/adventure/Shandalar/ui/save_load.json index ee615dd80d4..f34dd5a6e90 100644 --- a/forge-gui/res/adventure/Shandalar/ui/save_load.json +++ b/forge-gui/res/adventure/Shandalar/ui/save_load.json @@ -24,6 +24,14 @@ "y": 18, "width": 96, "height": 54 + }, + { + "type": "Label", + "name": "saveDate", + "x": 300, + "y": 120, + "width": 96, + "height": 16 }, { "type": "TextButton", @@ -42,10 +50,6 @@ "height": 16, "x": 115, "y": 250 - }, - { - "type": "Table", - "font": "default" - } + } ] } \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/ui/save_load_mobile.json b/forge-gui/res/adventure/Shandalar/ui/save_load_mobile.json index b520787c9fd..e4e112c1a5f 100644 --- a/forge-gui/res/adventure/Shandalar/ui/save_load_mobile.json +++ b/forge-gui/res/adventure/Shandalar/ui/save_load_mobile.json @@ -41,6 +41,14 @@ "height": 48, "x": 376, "y": 33 + }, + { + "type": "Label", + "name": "saveDate", + "x": 376, + "y": 85, + "width": 86, + "height": 32 }, { "type": "TextButton",