Merge pull request #3 from TrueFuFLeaderG/adventure

adventure: fixed saving poi data, added date to load screen
This commit is contained in:
Anthony Calosa
2022-04-11 03:17:27 +08:00
committed by GitHub
9 changed files with 181 additions and 41 deletions

View File

@@ -1,11 +1,11 @@
package forge.adventure.data; package forge.adventure.data;
import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.Json;
import forge.adventure.util.Config; import forge.adventure.util.Config;
import forge.adventure.util.Paths; import forge.adventure.util.Paths;
import forge.util.MyRandom;
import java.util.ArrayList; import java.util.ArrayList;
@@ -39,13 +39,13 @@ public class PointOfInterestData {
} }
return pointOfInterestList; return pointOfInterestList;
} }
public static PointOfInterestData getPointOfInterest(String name) { public static PointOfInterestData getPointOfInterest(String name, Vector2 index) {
ArrayList<PointOfInterestData> candidates = new ArrayList<PointOfInterestData>(); ArrayList<PointOfInterestData> candidates = new ArrayList<PointOfInterestData>();
for(PointOfInterestData data: new Array.ArrayIterator<>(getAllPointOfInterest())){ for(PointOfInterestData data: new Array.ArrayIterator<>(getAllPointOfInterest())){
if(data.name.equals(name)) candidates.add(data); //Populate candidates with specified name. 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. 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; return null;
} }

View File

@@ -20,8 +20,8 @@ public class PointOfInterest implements SaveFileContent {
@Override @Override
public void load(SaveFileData saveFileData) { public void load(SaveFileData saveFileData) {
data=PointOfInterestData.getPointOfInterest(saveFileData.readString("name"));
position.set(saveFileData.readVector2("position")); position.set(saveFileData.readVector2("position"));
data=PointOfInterestData.getPointOfInterest(saveFileData.readString("name"),position);
rectangle.set(saveFileData.readRectangle("rectangle")); rectangle.set(saveFileData.readRectangle("rectangle"));
spriteIndex=saveFileData.readInt("spriteIndex"); spriteIndex=saveFileData.readInt("spriteIndex");

View File

@@ -1,14 +1,69 @@
package forge.adventure.pointofintrest; 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.HashMap;
import java.util.HashSet; import java.util.HashSet;
/** /**
* Class to save point of interest changes, like sold cards and dead enemies * 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<String,PointOfInterestChanges> 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.length;i++)
{
SaveFileData elementData = data.readSubData("value_"+i);
PointOfInterestChanges newChanges=new PointOfInterestChanges();
newChanges.load(elementData);
this.put(keys[i],newChanges);
}
}
@Override
public SaveFileData save() {
SaveFileData data=new SaveFileData();
ArrayList<String> keys=new ArrayList<>();
ArrayList<PointOfInterestChanges> items=new ArrayList<>();
for (Map.Entry<String,PointOfInterestChanges> entry : this.entrySet()) {
keys.add(entry.getKey());
items.add(entry.getValue());
}
data.storeObject("keys",keys.toArray(new String[0]));
for(int i=0;i<items.size();i++)
data.store("value_"+i,items.get(0).save());
return data;
}
}
@Override
public void load(SaveFileData data) {
deletedObjects.clear();
deletedObjects.addAll((HashSet<Integer>) data.readObject("deletedObjects"));
cardsBought.clear();
cardsBought.putAll((HashMap<Integer, HashSet<Integer>>) data.readObject("cardsBought"));
}
@Override
public SaveFileData save() {
SaveFileData data=new SaveFileData();
data.storeObject("deletedObjects",deletedObjects);
data.storeObject("cardsBought",cardsBought);
return data;
}
private final HashSet<Integer> deletedObjects=new HashSet<>(); private final HashSet<Integer> deletedObjects=new HashSet<>();
private final HashMap<Integer, HashSet<Integer>> cardsBought=new HashMap<>(); private final HashMap<Integer, HashSet<Integer>> cardsBought=new HashMap<>();
@@ -38,4 +93,5 @@ public class PointOfInterestChanges {
} }
return cardsBought.get(objectID).contains(cardIndex); return cardsBought.get(objectID).contains(cardIndex);
} }
} }

View File

@@ -21,6 +21,7 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
import java.text.DateFormat;
import java.util.zip.InflaterInputStream; import java.util.zip.InflaterInputStream;
/** /**
@@ -37,6 +38,7 @@ public class SaveLoadScene extends UIScene {
Label header; Label header;
int currentSlot = -3, lastSelectedSlot = 0; int currentSlot = -3, lastSelectedSlot = 0;
Image previewImage; Image previewImage;
Label previewDate;
Image previewBorder; Image previewBorder;
TextButton saveLoadButton, back; TextButton saveLoadButton, back;
TextButton quickSave; TextButton quickSave;
@@ -83,10 +85,17 @@ public class SaveLoadScene extends UIScene {
previewImage.setDrawable(new TextureRegionDrawable(new Texture(header.preview))); previewImage.setDrawable(new TextureRegionDrawable(new Texture(header.preview)));
previewImage.layout(); previewImage.layout();
previewImage.setVisible(true); previewImage.setVisible(true);
previewDate.setVisible(true);
if (header.saveDate != null)
previewDate.setText(DateFormat.getDateInstance().format(header.saveDate));
else
previewDate.setText("");
} }
} else { } else {
if (previewImage != null) if (previewImage != null)
previewImage.setVisible(false); previewImage.setVisible(false);
if (previewDate != null)
previewDate.setVisible(false);
} }
for (IntMap.Entry<TextButton> butt : new IntMap.Entries<TextButton>(buttons)) { for (IntMap.Entry<TextButton> butt : new IntMap.Entries<TextButton>(buttons)) {
butt.value.setColor(defColor); butt.value.setColor(defColor);
@@ -123,7 +132,9 @@ public class SaveLoadScene extends UIScene {
break; break;
case NewGamePlus: case NewGamePlus:
if (WorldSave.load(currentSlot)) { if (WorldSave.load(currentSlot)) {
WorldSave.getCurrentSave().clearChanges();
WorldSave.getCurrentSave().getWorld().generateNew(0); 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().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())); Current.player().setWorldPosX((int) (WorldSave.getCurrentSave().getWorld().getData().playerStartPosX * WorldSave.getCurrentSave().getWorld().getData().width * WorldSave.getCurrentSave().getWorld().getTileSize()));
Forge.setTransitionScreen(new TransitionScreen(new Runnable() { Forge.setTransitionScreen(new TransitionScreen(new Runnable() {
@@ -285,6 +296,7 @@ public class SaveLoadScene extends UIScene {
//makes dialog hidden immediately when you open saveload scene.. //makes dialog hidden immediately when you open saveload scene..
dialog.getColor().a = 0; dialog.getColor().a = 0;
previewImage = ui.findActor("preview"); previewImage = ui.findActor("preview");
previewDate = ui.findActor("saveDate");
previewBorder = ui.findActor("preview_border"); previewBorder = ui.findActor("preview_border");
header = Controls.newLabel(Forge.getLocalizer().getMessage("lblSave")); header = Controls.newLabel(Forge.getLocalizer().getMessage("lblSave"));
header.setAlignment(Align.center); header.setAlignment(Align.center);

View File

@@ -6,13 +6,7 @@ import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import forge.Forge; import forge.Forge;
import java.io.ByteArrayInputStream; import java.io.*;
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.util.HashMap; import java.util.HashMap;
public class SaveFileData extends HashMap<String,byte[]> public class SaveFileData extends HashMap<String,byte[]>
@@ -329,6 +323,9 @@ public class SaveFileData extends HashMap<String,byte[]>
return false; return false;
} }
class DecompressibleInputStream extends ObjectInputStream { class DecompressibleInputStream extends ObjectInputStream {
/*https://stackoverflow.com/questions/1816559/make-java-runtime-ignore-serialversionuids*/ /*https://stackoverflow.com/questions/1816559/make-java-runtime-ignore-serialversionuids*/

View File

@@ -11,20 +11,15 @@ import forge.deck.Deck;
import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgeConstants;
import forge.player.GamePlayerUtil; import forge.player.GamePlayerUtil;
import java.io.File; import java.io.*;
import java.io.FileInputStream; import java.util.Date;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.zip.DeflaterOutputStream; import java.util.zip.DeflaterOutputStream;
import java.util.zip.InflaterInputStream; import java.util.zip.InflaterInputStream;
/** /**
* Represents everything that will be saved, like the player and the world. * 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 AUTO_SAVE_SLOT =-1;
static final public int QUICK_SAVE_SLOT =-2; static final public int QUICK_SAVE_SLOT =-2;
@@ -33,7 +28,7 @@ public class WorldSave {
public WorldSaveHeader header = new WorldSaveHeader(); public WorldSaveHeader header = new WorldSaveHeader();
private final AdventurePlayer player=new AdventurePlayer(); private final AdventurePlayer player=new AdventurePlayer();
private final World world=new World(); private final World world=new World();
private final HashMap<String, PointOfInterestChanges> pointOfInterestChanges=new HashMap<>(); private final PointOfInterestChanges.Map pointOfInterestChanges= new PointOfInterestChanges.Map();
private final SignalList onLoadList=new SignalList(); private final SignalList onLoadList=new SignalList();
@@ -73,7 +68,9 @@ public class WorldSave {
GamePlayerUtil.getGuiPlayer().setName(currentSave.player.getName()); GamePlayerUtil.getGuiPlayer().setName(currentSave.player.getName());
try { try {
currentSave.world.load(mainData.readSubData("world")); currentSave.world.load(mainData.readSubData("world"));
currentSave.pointOfInterestChanges.load(mainData.readSubData("pointOfInterestChanges"));
WorldStage.getInstance().load(mainData.readSubData("worldStage")); WorldStage.getInstance().load(mainData.readSubData("worldStage"));
} catch (Exception e) { } catch (Exception e) {
System.err.println("Generating New World"); System.err.println("Generating New World");
currentSave.world.generateNew(0); 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) { public static WorldSave generateNewWorld(String name, boolean male, int race, int avatarIndex, int startingDeckIndex, DifficultyData diff, long seed) {
currentSave.world.generateNew(seed); currentSave.world.generateNew(seed);
currentSave.pointOfInterestChanges.clear();
Deck starterDeck = Config.instance().starterDecks()[startingDeckIndex]; Deck starterDeck = Config.instance().starterDecks()[startingDeckIndex];
currentSave.player.create(name, starterDeck, male, race, avatarIndex,diff); currentSave.player.create(name, starterDeck, male, race, avatarIndex,diff);
currentSave.player.setWorldPosY((int) (currentSave.world.getData().playerStartPosY * currentSave.world.getData().height * currentSave.world.getTileSize())); 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); DeflaterOutputStream def= new DeflaterOutputStream(fos);
ObjectOutputStream oos = new ObjectOutputStream(def)) ObjectOutputStream oos = new ObjectOutputStream(def))
{ {
header.saveDate= new Date();
oos.writeObject(header); oos.writeObject(header);
SaveFileData mainData=new SaveFileData(); SaveFileData mainData=new SaveFileData();
mainData.store("player",currentSave.player.save()); mainData.store("player",currentSave.player.save());
mainData.store("world",currentSave.world.save()); mainData.store("world",currentSave.world.save());
mainData.store("worldStage", WorldStage.getInstance().save()); mainData.store("worldStage", WorldStage.getInstance().save());
mainData.store("pointOfInterestChanges",currentSave.pointOfInterestChanges.save());
oos.writeObject(mainData); oos.writeObject(mainData);
} }
@@ -170,4 +169,8 @@ public class WorldSave {
return true; return true;
} }
public void clearChanges() {
pointOfInterestChanges.clear();
}
} }

View File

@@ -3,12 +3,12 @@
"height": 4300, "height": 4300,
"width": 2 "width": 2
}, },
"activeFile": "map/aerie_1.tmx", "activeFile": "map/barbariancamp_2.tmx",
"automapping.whileDrawing": false, "automapping.whileDrawing": false,
"expandedProjectPaths": [ "expandedProjectPaths": [
"obj",
"map/main_story", "map/main_story",
"tileset", "tileset",
"obj",
"map" "map"
], ],
"file.lastUsedOpenFilter": "All Files (*)", "file.lastUsedOpenFilter": "All Files (*)",
@@ -49,8 +49,8 @@
"scale": 4, "scale": 4,
"selectedLayer": 4, "selectedLayer": 4,
"viewCenter": { "viewCenter": {
"x": 201.75, "x": 370.25,
"y": 167.75 "y": 101.75
} }
}, },
"map/barbariancamp_3.tmx": { "map/barbariancamp_3.tmx": {
@@ -105,7 +105,7 @@
"scale": 3, "scale": 3,
"selectedLayer": 1, "selectedLayer": 1,
"viewCenter": { "viewCenter": {
"x": 240, "x": 239.99999999999997,
"y": 136 "y": 136
} }
}, },
@@ -529,8 +529,8 @@
"scale": 0.75, "scale": 0.75,
"selectedLayer": 4, "selectedLayer": 4,
"viewCenter": { "viewCenter": {
"x": 312, "x": 311.99999999999994,
"y": 319.9999999999999 "y": 320
} }
}, },
"map/cave_23B10.tmx": { "map/cave_23B10.tmx": {
@@ -673,7 +673,7 @@
"scale": 1.0166158536585366, "scale": 1.0166158536585366,
"selectedLayer": 4, "selectedLayer": 4,
"viewCenter": { "viewCenter": {
"x": 311.8188633978108, "x": 311.81886339781073,
"y": 320.6717648822912 "y": 320.6717648822912
} }
}, },
@@ -1497,7 +1497,7 @@
"scale": 1.5, "scale": 1.5,
"selectedLayer": 4, "selectedLayer": 4,
"viewCenter": { "viewCenter": {
"x": 400, "x": 399.99999999999994,
"y": 400 "y": 400
} }
}, },
@@ -1993,7 +1993,7 @@
"scale": 1.3694556451612903, "scale": 1.3694556451612903,
"selectedLayer": 0, "selectedLayer": 0,
"viewCenter": { "viewCenter": {
"x": 231.4788369525212, "x": 231.47883695252114,
"y": 136.5506072874494 "y": 136.5506072874494
} }
}, },
@@ -2465,7 +2465,7 @@
"scale": 1.5, "scale": 1.5,
"selectedLayer": 6, "selectedLayer": 6,
"viewCenter": { "viewCenter": {
"x": 400, "x": 399.99999999999994,
"y": 400 "y": 400
} }
}, },
@@ -2497,7 +2497,7 @@
"scale": 3, "scale": 3,
"selectedLayer": 6, "selectedLayer": 6,
"viewCenter": { "viewCenter": {
"x": 240, "x": 239.99999999999997,
"y": 136 "y": 136
} }
}, },
@@ -2631,7 +2631,7 @@
"scale": 0.75, "scale": 0.75,
"selectedLayer": 0, "selectedLayer": 0,
"viewCenter": { "viewCenter": {
"x": 480, "x": 479.99999999999994,
"y": 320 "y": 320
} }
}, },
@@ -2728,7 +2728,67 @@
"map/plains_town.tmx", "map/plains_town.tmx",
"map/main_story/colorless_castle.tmx", "map/main_story/colorless_castle.tmx",
"map/main_story/blue_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", "project": "main.tiled-project",
"property.type": "object", "property.type": "object",

View File

@@ -24,6 +24,14 @@
"y": 18, "y": 18,
"width": 96, "width": 96,
"height": 54 "height": 54
},
{
"type": "Label",
"name": "saveDate",
"x": 300,
"y": 120,
"width": 96,
"height": 16
}, },
{ {
"type": "TextButton", "type": "TextButton",
@@ -42,10 +50,6 @@
"height": 16, "height": 16,
"x": 115, "x": 115,
"y": 250 "y": 250
}, }
{
"type": "Table",
"font": "default"
}
] ]
} }

View File

@@ -41,6 +41,14 @@
"height": 48, "height": 48,
"x": 376, "x": 376,
"y": 33 "y": 33
},
{
"type": "Label",
"name": "saveDate",
"x": 376,
"y": 85,
"width": 86,
"height": 32
}, },
{ {
"type": "TextButton", "type": "TextButton",