mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Merge pull request #3 from TrueFuFLeaderG/adventure
adventure: fixed saving poi data, added date to load screen
This commit is contained in:
@@ -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<PointOfInterestData> candidates = new ArrayList<PointOfInterestData>();
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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<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 HashMap<Integer, HashSet<Integer>> cardsBought=new HashMap<>();
|
||||
@@ -38,4 +93,5 @@ public class PointOfInterestChanges {
|
||||
}
|
||||
return cardsBought.get(objectID).contains(cardIndex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<TextButton> butt : new IntMap.Entries<TextButton>(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);
|
||||
|
||||
@@ -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<String,byte[]>
|
||||
@@ -329,6 +323,9 @@ public class SaveFileData extends HashMap<String,byte[]>
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
class DecompressibleInputStream extends ObjectInputStream {
|
||||
|
||||
/*https://stackoverflow.com/questions/1816559/make-java-runtime-ignore-serialversionuids*/
|
||||
|
||||
@@ -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<String, PointOfInterestChanges> 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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -25,6 +25,14 @@
|
||||
"width": 96,
|
||||
"height": 54
|
||||
},
|
||||
{
|
||||
"type": "Label",
|
||||
"name": "saveDate",
|
||||
"x": 300,
|
||||
"y": 120,
|
||||
"width": 96,
|
||||
"height": 16
|
||||
},
|
||||
{
|
||||
"type": "TextButton",
|
||||
"name": "return",
|
||||
@@ -42,10 +50,6 @@
|
||||
"height": 16,
|
||||
"x": 115,
|
||||
"y": 250
|
||||
},
|
||||
{
|
||||
"type": "Table",
|
||||
"font": "default"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -42,6 +42,14 @@
|
||||
"x": 376,
|
||||
"y": 33
|
||||
},
|
||||
{
|
||||
"type": "Label",
|
||||
"name": "saveDate",
|
||||
"x": 376,
|
||||
"y": 85,
|
||||
"width": 86,
|
||||
"height": 32
|
||||
},
|
||||
{
|
||||
"type": "TextButton",
|
||||
"name": "return",
|
||||
|
||||
Reference in New Issue
Block a user