beginnings of savedata
parent
fa654bac35
commit
e8be8b4089
|
|
@ -1,2 +1,4 @@
|
||||||
target
|
target
|
||||||
out
|
out
|
||||||
|
bin
|
||||||
|
SAVE_DATA.TXT
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
package xyz.valnet.engine.math;
|
package xyz.valnet.engine.math;
|
||||||
|
|
||||||
public class Vector2f {
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class Vector2f implements Serializable {
|
||||||
|
|
||||||
public float x, y;
|
public float x, y;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
package xyz.valnet.engine.math;
|
package xyz.valnet.engine.math;
|
||||||
|
|
||||||
public class Vector2i {
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class Vector2i implements Serializable {
|
||||||
|
|
||||||
public int x, y;
|
public int x, y;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
package xyz.valnet.engine.math;
|
package xyz.valnet.engine.math;
|
||||||
|
|
||||||
public class Vector4f {
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class Vector4f implements Serializable {
|
||||||
|
|
||||||
public float x, y, z, w;
|
public float x, y, z, w;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
package xyz.valnet.engine.math;
|
package xyz.valnet.engine.math;
|
||||||
|
|
||||||
public class Vector4i {
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class Vector4i implements Serializable {
|
||||||
|
|
||||||
public int x, y, z, w;
|
public int x, y, z, w;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package xyz.valnet.engine.scenegraph;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InvalidClassException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectStreamClass;
|
||||||
|
|
||||||
|
public class CustomObjectDeserializer extends ObjectInputStream {
|
||||||
|
|
||||||
|
|
||||||
|
public CustomObjectDeserializer(InputStream in) throws IOException {
|
||||||
|
super(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
|
||||||
|
ObjectStreamClass resultClassDescriptor = super.readClassDescriptor(); // initially streams descriptor
|
||||||
|
Class localClass; // the class in the local JVM that this descriptor represents.
|
||||||
|
try {
|
||||||
|
localClass = Class.forName(resultClassDescriptor.getName());
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
System.out.println("No local class for " + resultClassDescriptor.getName());
|
||||||
|
System.out.println(e);
|
||||||
|
return resultClassDescriptor;
|
||||||
|
}
|
||||||
|
ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookup(localClass);
|
||||||
|
if (localClassDescriptor != null) { // only if class implements serializable
|
||||||
|
final long localSUID = localClassDescriptor.getSerialVersionUID();
|
||||||
|
final long streamSUID = resultClassDescriptor.getSerialVersionUID();
|
||||||
|
if (streamSUID != localSUID) { // check for serialVersionUID mismatch.
|
||||||
|
final StringBuffer s = new StringBuffer("Overriding serialized class version mismatch: ");
|
||||||
|
s.append("local serialVersionUID = ").append(localSUID);
|
||||||
|
s.append(" stream serialVersionUID = ").append(streamSUID);
|
||||||
|
Exception e = new InvalidClassException(s.toString());
|
||||||
|
System.out.println("Potentially Fatal Deserialization Operation.");
|
||||||
|
System.out.println(e);
|
||||||
|
resultClassDescriptor = localClassDescriptor; // Use local class descriptor for deserialization
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return resultClassDescriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
package xyz.valnet.engine.scenegraph;
|
package xyz.valnet.engine.scenegraph;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class GameObject implements IRenderable, ITickable {
|
public class GameObject implements IRenderable, ITickable, Serializable {
|
||||||
private SceneGraph scene;
|
private transient SceneGraph scene;
|
||||||
|
|
||||||
public void link(SceneGraph scene) {
|
public void link(SceneGraph scene) {
|
||||||
this.scene = scene;
|
this.scene = scene;
|
||||||
|
|
@ -47,4 +48,12 @@ public class GameObject implements IRenderable, ITickable {
|
||||||
protected void remove(GameObject obj) {
|
protected void remove(GameObject obj) {
|
||||||
scene.remove(obj);
|
scene.remove(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void save() {
|
||||||
|
scene.queueSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void load() {
|
||||||
|
scene.queueLoad();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
package xyz.valnet.engine.scenegraph;
|
||||||
|
|
||||||
|
public interface ITransient {}
|
||||||
|
|
@ -1,8 +1,17 @@
|
||||||
package xyz.valnet.engine.scenegraph;
|
package xyz.valnet.engine.scenegraph;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.NotSerializableException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import xyz.valnet.engine.App;
|
import xyz.valnet.engine.App;
|
||||||
|
|
||||||
|
|
@ -13,6 +22,9 @@ public abstract class SceneGraph implements IScene {
|
||||||
|
|
||||||
private IMouseCaptureArea hoveredMouseListener = null;
|
private IMouseCaptureArea hoveredMouseListener = null;
|
||||||
|
|
||||||
|
private boolean loadFlag = false;
|
||||||
|
private boolean saveFlag = false;
|
||||||
|
|
||||||
public <T> T get(Class<T> clazz) {
|
public <T> T get(Class<T> clazz) {
|
||||||
for(GameObject obj : objects) {
|
for(GameObject obj : objects) {
|
||||||
if(clazz.isInstance(obj)) {
|
if(clazz.isInstance(obj)) {
|
||||||
|
|
@ -53,6 +65,9 @@ public abstract class SceneGraph implements IScene {
|
||||||
removeObjects.clear();
|
removeObjects.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(saveFlag) save();
|
||||||
|
if(loadFlag) load();
|
||||||
|
|
||||||
// TICK OBJECTS
|
// TICK OBJECTS
|
||||||
for(GameObject obj : objects) {
|
for(GameObject obj : objects) {
|
||||||
obj.update(dTime);
|
obj.update(dTime);
|
||||||
|
|
@ -113,7 +128,6 @@ public abstract class SceneGraph implements IScene {
|
||||||
|
|
||||||
protected abstract void construct();
|
protected abstract void construct();
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disable() {
|
public void disable() {
|
||||||
objects.clear();
|
objects.clear();
|
||||||
|
|
@ -138,6 +152,76 @@ public abstract class SceneGraph implements IScene {
|
||||||
System.out.println(go);
|
System.out.println(go);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void dump(List<GameObject> objects) {
|
||||||
|
Map<Class, Integer> count = new HashMap<Class, Integer>();
|
||||||
|
for(GameObject go : objects) {
|
||||||
|
Class clazz = go.getClass();
|
||||||
|
if(!count.containsKey(clazz))
|
||||||
|
count.put(clazz, 0);
|
||||||
|
count.put(clazz, count.get(clazz) + 1);
|
||||||
|
}
|
||||||
|
for(Entry<Class, Integer> entry : count.entrySet()) {
|
||||||
|
System.out.println("" + entry.getValue() + "x " + entry.getKey().getSimpleName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<GameObject> getNonTransientObjects() {
|
||||||
|
return new ArrayList<GameObject>(objects.stream()
|
||||||
|
.filter(go -> !(go instanceof ITransient))
|
||||||
|
.collect(Collectors.toList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void save() {
|
||||||
|
try {
|
||||||
|
FileOutputStream file = new FileOutputStream("SAVE_DATA.TXT");
|
||||||
|
ObjectOutputStream out = new ObjectOutputStream(file);
|
||||||
|
ArrayList<GameObject> toSave = getNonTransientObjects();
|
||||||
|
|
||||||
|
dump(toSave);
|
||||||
|
out.writeObject(toSave);
|
||||||
|
out.close();
|
||||||
|
file.close();
|
||||||
|
} catch (NotSerializableException e) {
|
||||||
|
System.out.println("HEY");
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println(e);
|
||||||
|
}
|
||||||
|
saveFlag = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void load() {
|
||||||
|
try {
|
||||||
|
FileInputStream file = new FileInputStream("SAVE_DATA.TXT");
|
||||||
|
ObjectInputStream input = new CustomObjectDeserializer(file);
|
||||||
|
List<GameObject> newObjects = (List<GameObject>) input.readObject();
|
||||||
|
input.close();
|
||||||
|
file.close();
|
||||||
|
System.out.println("imported " + newObjects.size() + " objects");
|
||||||
|
ArrayList<GameObject> toRemove = getNonTransientObjects();
|
||||||
|
|
||||||
|
for(GameObject obj : toRemove) {
|
||||||
|
objects.remove(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
objects.addAll(newObjects);
|
||||||
|
|
||||||
|
for(GameObject obj : objects) obj.link(this);
|
||||||
|
for(GameObject obj : objects) obj.start();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
loadFlag = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void queueSave() {
|
||||||
|
saveFlag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void queueLoad() {
|
||||||
|
loadFlag = true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mouseDown(int button) {
|
public void mouseDown(int button) {
|
||||||
for(IMouseCaptureArea iml : getAll(IMouseCaptureArea.class)) {
|
for(IMouseCaptureArea iml : getAll(IMouseCaptureArea.class)) {
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,14 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import xyz.valnet.engine.scenegraph.GameObject;
|
import xyz.valnet.engine.scenegraph.GameObject;
|
||||||
|
import xyz.valnet.engine.scenegraph.ITransient;
|
||||||
import xyz.valnet.hadean.input.Button;
|
import xyz.valnet.hadean.input.Button;
|
||||||
import xyz.valnet.hadean.input.IButtonListener;
|
import xyz.valnet.hadean.input.IButtonListener;
|
||||||
import xyz.valnet.hadean.input.SimpleButton;
|
import xyz.valnet.hadean.input.SimpleButton;
|
||||||
import xyz.valnet.hadean.interfaces.IBottomBarItem;
|
import xyz.valnet.hadean.interfaces.IBottomBarItem;
|
||||||
import xyz.valnet.hadean.util.Layers;
|
import xyz.valnet.hadean.util.Layers;
|
||||||
|
|
||||||
public class BottomBar extends GameObject implements IButtonListener {
|
public class BottomBar extends GameObject implements IButtonListener, ITransient {
|
||||||
public static final int bottomBarHeight = 32;
|
public static final int bottomBarHeight = 32;
|
||||||
private int screenWidth = 1024;
|
private int screenWidth = 1024;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,11 @@
|
||||||
package xyz.valnet.hadean.gameobjects;
|
package xyz.valnet.hadean.gameobjects;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
import xyz.valnet.engine.math.Vector2f;
|
import xyz.valnet.engine.math.Vector2f;
|
||||||
import xyz.valnet.engine.math.Vector2i;
|
import xyz.valnet.engine.math.Vector2i;
|
||||||
import xyz.valnet.engine.math.Vector4f;
|
|
||||||
import xyz.valnet.engine.scenegraph.GameObject;
|
import xyz.valnet.engine.scenegraph.GameObject;
|
||||||
import xyz.valnet.hadean.gameobjects.worldobjects.Stockpile;
|
import xyz.valnet.hadean.gameobjects.worldobjects.Stockpile;
|
||||||
import xyz.valnet.hadean.gameobjects.worldobjects.items.Item;
|
import xyz.valnet.hadean.gameobjects.worldobjects.items.Item;
|
||||||
|
|
@ -18,7 +16,7 @@ public class Job extends GameObject {
|
||||||
private Job that = this;
|
private Job that = this;
|
||||||
private List<Callback> closedListeners = new ArrayList<Callback>();
|
private List<Callback> closedListeners = new ArrayList<Callback>();
|
||||||
|
|
||||||
public abstract class JobStep {
|
public abstract class JobStep implements Serializable {
|
||||||
public abstract Vector2i[] getLocations();
|
public abstract Vector2i[] getLocations();
|
||||||
public void next() {
|
public void next() {
|
||||||
that.nextStep();
|
that.nextStep();
|
||||||
|
|
@ -132,7 +130,7 @@ public class Job extends GameObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface Callback {
|
public interface Callback extends Serializable {
|
||||||
public void apply();
|
public void apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,10 +56,10 @@ public class JobBoard extends GameObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean jobsAvailableForWorker(Pawn worker) {
|
public boolean jobsAvailableForWorker(Pawn worker) {
|
||||||
return availableJobs.size() != 0;
|
return getJobsForWorker(worker).size() != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Job requestJob(Pawn worker) {
|
private List<Job> getJobsForWorker(Pawn worker) {
|
||||||
Vector2f workerLocation = worker.getWorldPosition();
|
Vector2f workerLocation = worker.getWorldPosition();
|
||||||
|
|
||||||
List<Job> workables = availableJobs
|
List<Job> workables = availableJobs
|
||||||
|
|
@ -72,18 +72,22 @@ public class JobBoard extends GameObject {
|
||||||
.reduce(Float.MAX_VALUE, (a, b) -> a < b ? a : b)
|
.reduce(Float.MAX_VALUE, (a, b) -> a < b ? a : b)
|
||||||
))
|
))
|
||||||
// sort the jobs by their distance from the worker
|
// sort the jobs by their distance from the worker
|
||||||
.sorted(new Comparator<Pair<Job, Float>>() {
|
.sorted((Pair<Job, Float> a, Pair<Job, Float> b) -> {
|
||||||
@Override
|
|
||||||
public int compare(Pair<Job, Float> a, Pair<Job, Float> b) {
|
|
||||||
if(a.second() > b.second()) return 1;
|
if(a.second() > b.second()) return 1;
|
||||||
if(b.second() > a.second()) return -1;
|
if(b.second() > a.second()) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
})
|
})
|
||||||
// then convert the stream back to just the jobs
|
// then convert the stream back to just the jobs
|
||||||
.map(workerDistanceTuple -> workerDistanceTuple.first())
|
.map(workerDistanceTuple -> workerDistanceTuple.first())
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
|
return workables;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Job requestJob(Pawn worker) {
|
||||||
|
|
||||||
|
|
||||||
|
List<Job> workables = getJobsForWorker(worker);
|
||||||
|
|
||||||
if(workables.size() > 0) {
|
if(workables.size() > 0) {
|
||||||
Job firstJob = workables.get(0);
|
Job firstJob = workables.get(0);
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import java.util.List;
|
||||||
import xyz.valnet.engine.math.Vector4f;
|
import xyz.valnet.engine.math.Vector4f;
|
||||||
import xyz.valnet.engine.scenegraph.GameObject;
|
import xyz.valnet.engine.scenegraph.GameObject;
|
||||||
import xyz.valnet.engine.scenegraph.IMouseCaptureArea;
|
import xyz.valnet.engine.scenegraph.IMouseCaptureArea;
|
||||||
|
import xyz.valnet.engine.scenegraph.ITransient;
|
||||||
import xyz.valnet.hadean.gameobjects.inputlayer.SelectionLayer;
|
import xyz.valnet.hadean.gameobjects.inputlayer.SelectionLayer;
|
||||||
import xyz.valnet.hadean.input.Button;
|
import xyz.valnet.hadean.input.Button;
|
||||||
import xyz.valnet.hadean.input.IButtonListener;
|
import xyz.valnet.hadean.input.IButtonListener;
|
||||||
|
|
@ -18,7 +19,7 @@ import xyz.valnet.hadean.util.Assets;
|
||||||
import xyz.valnet.hadean.util.Layers;
|
import xyz.valnet.hadean.util.Layers;
|
||||||
import xyz.valnet.hadean.util.detail.Detail;
|
import xyz.valnet.hadean.util.detail.Detail;
|
||||||
|
|
||||||
public class SelectionUI extends GameObject implements ISelectionChangeListener, IButtonListener, IMouseCaptureArea {
|
public class SelectionUI extends GameObject implements ISelectionChangeListener, IButtonListener, IMouseCaptureArea, ITransient {
|
||||||
|
|
||||||
private String name = "";
|
private String name = "";
|
||||||
private int count = 0;
|
private int count = 0;
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,7 @@ public class Tile extends WorldObject implements IWorkable {
|
||||||
|
|
||||||
// private final int x, y;
|
// private final int x, y;
|
||||||
private Vector4f color;
|
private Vector4f color;
|
||||||
private final Sprite sprite = Assets.defaultTerrain[(int)Math.floor(Math.random() * Assets.defaultTerrain.length)];
|
private final int tileSelector = (int)Math.floor(Math.random() * 4);
|
||||||
private final Sprite farmSprite = Assets.farmPlot[(int)Math.floor(Math.random() * Assets.farmPlot.length)];
|
|
||||||
|
|
||||||
private List<ITileThing> stuff = new ArrayList<ITileThing>();
|
private List<ITileThing> stuff = new ArrayList<ITileThing>();
|
||||||
// TODO remove remove queue, cause like, we dont iterate over
|
// TODO remove remove queue, cause like, we dont iterate over
|
||||||
|
|
@ -46,11 +45,11 @@ public class Tile extends WorldObject implements IWorkable {
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
super.start();
|
super.start();
|
||||||
if(Math.random() > 0.97) {
|
// if(Math.random() > 0.97) {
|
||||||
Tree tree = new Tree((int)x, (int)y);
|
// Tree tree = new Tree((int)x, (int)y);
|
||||||
stuff.add(tree);
|
// stuff.add(tree);
|
||||||
add(tree);
|
// add(tree);
|
||||||
}
|
// }
|
||||||
|
|
||||||
float scale = 1;
|
float scale = 1;
|
||||||
|
|
||||||
|
|
@ -58,7 +57,7 @@ public class Tile extends WorldObject implements IWorkable {
|
||||||
float green = (float) terrain.getNoise(greenSeed, x * scale, y * scale);
|
float green = (float) terrain.getNoise(greenSeed, x * scale, y * scale);
|
||||||
float blue = (float) terrain.getNoise(blueSeed, x * scale, y * scale);
|
float blue = (float) terrain.getNoise(blueSeed, x * scale, y * scale);
|
||||||
|
|
||||||
color = new Vector4f(red * 0.1f, 0.4f + green * 0.15f, blue * 0.05f, 1f);
|
if(color == null) color = new Vector4f(red * 0.1f, 0.4f + green * 0.15f, blue * 0.05f, 1f);
|
||||||
// color = new Vector4f(red, green, blue, 1.0f);
|
// color = new Vector4f(red, green, blue, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -112,12 +111,12 @@ public class Tile extends WorldObject implements IWorkable {
|
||||||
public void render() {
|
public void render() {
|
||||||
if(tillLevel < 1f) {
|
if(tillLevel < 1f) {
|
||||||
Assets.flat.pushColor(color);
|
Assets.flat.pushColor(color);
|
||||||
camera.draw(Layers.TILES, sprite, x, y);
|
camera.draw(Layers.TILES, Assets.defaultTerrain[tileSelector], x, y);
|
||||||
Assets.flat.popColor();
|
Assets.flat.popColor();
|
||||||
}
|
}
|
||||||
if(tillLevel > 0f) {
|
if(tillLevel > 0f) {
|
||||||
Assets.flat.pushColor(Vector4f.opacity(tillLevel));
|
Assets.flat.pushColor(Vector4f.opacity(tillLevel));
|
||||||
camera.draw(Layers.TILES, farmSprite, x, y);
|
camera.draw(Layers.TILES, Assets.farmPlot[tileSelector], x, y);
|
||||||
Assets.flat.popColor();
|
Assets.flat.popColor();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,12 @@ import xyz.valnet.engine.math.Vector2i;
|
||||||
import xyz.valnet.engine.math.Vector4f;
|
import xyz.valnet.engine.math.Vector4f;
|
||||||
import xyz.valnet.engine.scenegraph.GameObject;
|
import xyz.valnet.engine.scenegraph.GameObject;
|
||||||
import xyz.valnet.engine.scenegraph.IMouseCaptureArea;
|
import xyz.valnet.engine.scenegraph.IMouseCaptureArea;
|
||||||
|
import xyz.valnet.engine.scenegraph.ITransient;
|
||||||
import xyz.valnet.hadean.gameobjects.Camera;
|
import xyz.valnet.hadean.gameobjects.Camera;
|
||||||
import xyz.valnet.hadean.interfaces.IBuildLayerListener;
|
import xyz.valnet.hadean.interfaces.IBuildLayerListener;
|
||||||
import xyz.valnet.hadean.util.Layers;
|
import xyz.valnet.hadean.util.Layers;
|
||||||
|
|
||||||
public class BuildLayer extends GameObject implements IMouseCaptureArea {
|
public class BuildLayer extends GameObject implements IMouseCaptureArea, ITransient {
|
||||||
|
|
||||||
private boolean hovered = false;
|
private boolean hovered = false;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import xyz.valnet.engine.math.Vector2f;
|
||||||
import xyz.valnet.engine.math.Vector4f;
|
import xyz.valnet.engine.math.Vector4f;
|
||||||
import xyz.valnet.engine.scenegraph.GameObject;
|
import xyz.valnet.engine.scenegraph.GameObject;
|
||||||
import xyz.valnet.engine.scenegraph.IMouseCaptureArea;
|
import xyz.valnet.engine.scenegraph.IMouseCaptureArea;
|
||||||
|
import xyz.valnet.engine.scenegraph.ITransient;
|
||||||
import xyz.valnet.hadean.gameobjects.Camera;
|
import xyz.valnet.hadean.gameobjects.Camera;
|
||||||
import xyz.valnet.hadean.gameobjects.ui.tabs.BuildTab;
|
import xyz.valnet.hadean.gameobjects.ui.tabs.BuildTab;
|
||||||
import xyz.valnet.hadean.interfaces.ISelectable;
|
import xyz.valnet.hadean.interfaces.ISelectable;
|
||||||
|
|
@ -18,7 +19,7 @@ import xyz.valnet.hadean.util.Layers;
|
||||||
|
|
||||||
import static xyz.valnet.engine.util.Math.lerp;
|
import static xyz.valnet.engine.util.Math.lerp;
|
||||||
|
|
||||||
public class SelectionLayer extends GameObject implements IMouseCaptureArea {
|
public class SelectionLayer extends GameObject implements IMouseCaptureArea, ITransient {
|
||||||
|
|
||||||
public Vector2f initialCoords;
|
public Vector2f initialCoords;
|
||||||
private Camera camera;
|
private Camera camera;
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,14 @@ import xyz.valnet.engine.App;
|
||||||
import xyz.valnet.engine.math.Vector2f;
|
import xyz.valnet.engine.math.Vector2f;
|
||||||
import xyz.valnet.engine.math.Vector4f;
|
import xyz.valnet.engine.math.Vector4f;
|
||||||
import xyz.valnet.engine.scenegraph.GameObject;
|
import xyz.valnet.engine.scenegraph.GameObject;
|
||||||
|
import xyz.valnet.engine.scenegraph.ITransient;
|
||||||
import xyz.valnet.hadean.HadeanGame;
|
import xyz.valnet.hadean.HadeanGame;
|
||||||
import xyz.valnet.hadean.gameobjects.Camera;
|
import xyz.valnet.hadean.gameobjects.Camera;
|
||||||
import xyz.valnet.hadean.gameobjects.Tile;
|
import xyz.valnet.hadean.gameobjects.Tile;
|
||||||
import xyz.valnet.hadean.gameobjects.worldobjects.WorldObject;
|
import xyz.valnet.hadean.gameobjects.worldobjects.WorldObject;
|
||||||
import xyz.valnet.hadean.util.Assets;
|
import xyz.valnet.hadean.util.Assets;
|
||||||
|
|
||||||
public class HoverQuery extends GameObject {
|
public class HoverQuery extends GameObject implements ITransient {
|
||||||
|
|
||||||
private Camera camera;
|
private Camera camera;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,17 @@
|
||||||
package xyz.valnet.hadean.gameobjects.ui.tabs;
|
package xyz.valnet.hadean.gameobjects.ui.tabs;
|
||||||
|
|
||||||
import static xyz.valnet.engine.util.Math.lerp;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import xyz.valnet.engine.graphics.Drawing;
|
import xyz.valnet.engine.graphics.Drawing;
|
||||||
import xyz.valnet.engine.math.Vector2f;
|
|
||||||
import xyz.valnet.engine.math.Vector2i;
|
import xyz.valnet.engine.math.Vector2i;
|
||||||
import xyz.valnet.engine.math.Vector4f;
|
import xyz.valnet.engine.math.Vector4f;
|
||||||
import xyz.valnet.engine.scenegraph.GameObject;
|
import xyz.valnet.engine.scenegraph.GameObject;
|
||||||
|
|
@ -25,7 +21,6 @@ import xyz.valnet.hadean.gameobjects.Camera;
|
||||||
import xyz.valnet.hadean.gameobjects.Terrain;
|
import xyz.valnet.hadean.gameobjects.Terrain;
|
||||||
import xyz.valnet.hadean.gameobjects.inputlayer.BuildLayer;
|
import xyz.valnet.hadean.gameobjects.inputlayer.BuildLayer;
|
||||||
import xyz.valnet.hadean.gameobjects.inputlayer.SelectionLayer;
|
import xyz.valnet.hadean.gameobjects.inputlayer.SelectionLayer;
|
||||||
import xyz.valnet.hadean.gameobjects.worldobjects.FarmPlot;
|
|
||||||
import xyz.valnet.hadean.input.Button;
|
import xyz.valnet.hadean.input.Button;
|
||||||
import xyz.valnet.hadean.input.IButtonListener;
|
import xyz.valnet.hadean.input.IButtonListener;
|
||||||
import xyz.valnet.hadean.input.SimpleButton;
|
import xyz.valnet.hadean.input.SimpleButton;
|
||||||
|
|
@ -34,7 +29,6 @@ import xyz.valnet.hadean.interfaces.IBuildLayerListener;
|
||||||
import xyz.valnet.hadean.interfaces.IBuildable;
|
import xyz.valnet.hadean.interfaces.IBuildable;
|
||||||
import xyz.valnet.hadean.interfaces.ISelectable;
|
import xyz.valnet.hadean.interfaces.ISelectable;
|
||||||
import xyz.valnet.hadean.interfaces.ISelectionChangeListener;
|
import xyz.valnet.hadean.interfaces.ISelectionChangeListener;
|
||||||
import xyz.valnet.hadean.interfaces.ITileThing;
|
|
||||||
import xyz.valnet.hadean.util.Assets;
|
import xyz.valnet.hadean.util.Assets;
|
||||||
import xyz.valnet.hadean.util.Layers;
|
import xyz.valnet.hadean.util.Layers;
|
||||||
import xyz.valnet.hadean.util.Pair;
|
import xyz.valnet.hadean.util.Pair;
|
||||||
|
|
@ -55,14 +49,12 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap
|
||||||
private int x, y;
|
private int x, y;
|
||||||
private int w, h;
|
private int w, h;
|
||||||
|
|
||||||
// private List<String> categories = new ArrayList<String>();
|
private String selectedCategory = "";
|
||||||
|
|
||||||
private String selectedCategory = "Zones";
|
private transient Constructor<? extends IBuildable> selectedBuildable = null;
|
||||||
|
private transient Map<String, List<Pair<String, Constructor<? extends IBuildable>>>> buildables = null;
|
||||||
|
private transient Map<Button, Constructor<? extends IBuildable>> buildableButtons = null;
|
||||||
|
|
||||||
private List<Class<ITileThing>> things = new ArrayList<Class<ITileThing>>();
|
|
||||||
private Constructor<? extends IBuildable> selectedBuildable = null;
|
|
||||||
|
|
||||||
private Map<String, List<Pair<String, Constructor<? extends IBuildable>>>> buildables = new HashMap<String, List<Pair<String, Constructor<? extends IBuildable>>>>();
|
|
||||||
|
|
||||||
private int height = 0;
|
private int height = 0;
|
||||||
private String selectedBuildableName = "";
|
private String selectedBuildableName = "";
|
||||||
|
|
@ -150,6 +142,9 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap
|
||||||
selection.subscribe(this);
|
selection.subscribe(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buildables = new HashMap<String, List<Pair<String, Constructor<? extends IBuildable>>>>();
|
||||||
|
buildableButtons = new HashMap<Button, Constructor<? extends IBuildable>>();
|
||||||
|
|
||||||
calculateBuildables();
|
calculateBuildables();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -274,8 +269,6 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap
|
||||||
return Layers.GENERAL_UI;
|
return Layers.GENERAL_UI;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<Button, Constructor<? extends IBuildable>> buildableButtons = new HashMap<Button, Constructor<? extends IBuildable>>();
|
|
||||||
|
|
||||||
private void constructItemButtons() {
|
private void constructItemButtons() {
|
||||||
for(Button btn : buildableButtons.keySet()) {
|
for(Button btn : buildableButtons.keySet()) {
|
||||||
remove(btn);
|
remove(btn);
|
||||||
|
|
@ -286,6 +279,8 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap
|
||||||
if(!opened.value()) return;
|
if(!opened.value()) return;
|
||||||
|
|
||||||
List<Pair<String, Constructor<? extends IBuildable>>> categoryBuildables = buildables.get(selectedCategory);
|
List<Pair<String, Constructor<? extends IBuildable>>> categoryBuildables = buildables.get(selectedCategory);
|
||||||
|
if(categoryBuildables == null) return;
|
||||||
|
|
||||||
int left = width + padding * 2;
|
int left = width + padding * 2;
|
||||||
int buttonHeight = 24;
|
int buttonHeight = 24;
|
||||||
int buttonWidth = 100;
|
int buttonWidth = 100;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
package xyz.valnet.hadean.gameobjects.ui.tabs;
|
||||||
|
|
||||||
|
public class LoadTab extends Tab {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void evoke() {
|
||||||
|
load();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTabName() {
|
||||||
|
return "Load";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
package xyz.valnet.hadean.gameobjects.ui.tabs;
|
||||||
|
|
||||||
|
public class SaveTab extends Tab {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void evoke() {
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTabName() {
|
||||||
|
return "Save";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
package xyz.valnet.hadean.gameobjects.ui.tabs;
|
package xyz.valnet.hadean.gameobjects.ui.tabs;
|
||||||
|
|
||||||
import xyz.valnet.engine.scenegraph.GameObject;
|
import xyz.valnet.engine.scenegraph.GameObject;
|
||||||
|
import xyz.valnet.engine.scenegraph.ITransient;
|
||||||
import xyz.valnet.hadean.gameobjects.BottomBar;
|
import xyz.valnet.hadean.gameobjects.BottomBar;
|
||||||
import xyz.valnet.hadean.interfaces.IBottomBarItem;
|
import xyz.valnet.hadean.interfaces.IBottomBarItem;
|
||||||
|
|
||||||
public abstract class Tab extends GameObject implements IBottomBarItem {
|
public abstract class Tab extends GameObject implements IBottomBarItem, ITransient {
|
||||||
|
|
||||||
private BottomBar bottombar;
|
private BottomBar bottombar;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,13 @@
|
||||||
package xyz.valnet.hadean.gameobjects.worldobjects.pawn;
|
package xyz.valnet.hadean.gameobjects.worldobjects.pawn;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
import xyz.valnet.engine.math.Vector2i;
|
import xyz.valnet.engine.math.Vector2i;
|
||||||
|
|
||||||
public abstract class Activity {
|
public abstract class Activity implements Serializable {
|
||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface ActivityCancellationCallback {
|
public interface ActivityCancellationCallback extends Serializable {
|
||||||
public void apply(Activity activity);
|
public void apply(Activity activity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
package xyz.valnet.hadean.gameobjects.worldobjects.pawn;
|
package xyz.valnet.hadean.gameobjects.worldobjects.pawn;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
import xyz.valnet.hadean.util.detail.Detail;
|
import xyz.valnet.hadean.util.detail.Detail;
|
||||||
import xyz.valnet.hadean.util.detail.PercentDetail;
|
import xyz.valnet.hadean.util.detail.PercentDetail;
|
||||||
|
|
||||||
public class Needs {
|
public class Needs implements Serializable {
|
||||||
|
|
||||||
private float energy = 0.7f + (float)Math.random() * 0.3f;
|
private float energy = 0.7f + (float)Math.random() * 0.3f;
|
||||||
private float recreation = 0.5f + (float)Math.random() * 0.5f;
|
private float recreation = 0.5f + (float)Math.random() * 0.5f;
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,8 @@ public class Pawn extends Agent {
|
||||||
private String name = "Pawn " + (++ pawnCount);
|
private String name = "Pawn " + (++ pawnCount);
|
||||||
private Needs needs = new Needs();
|
private Needs needs = new Needs();
|
||||||
|
|
||||||
|
// private int meaningless = 0;
|
||||||
|
|
||||||
// private float workEthic = (float) Math.random();
|
// private float workEthic = (float) Math.random();
|
||||||
// private float selfWorth = (float) Math.random();
|
// private float selfWorth = (float) Math.random();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,10 @@ import xyz.valnet.engine.math.Vector4f;
|
||||||
import xyz.valnet.engine.math.Vector4i;
|
import xyz.valnet.engine.math.Vector4i;
|
||||||
import xyz.valnet.engine.scenegraph.GameObject;
|
import xyz.valnet.engine.scenegraph.GameObject;
|
||||||
import xyz.valnet.engine.scenegraph.IMouseCaptureArea;
|
import xyz.valnet.engine.scenegraph.IMouseCaptureArea;
|
||||||
|
import xyz.valnet.engine.scenegraph.ITransient;
|
||||||
import xyz.valnet.hadean.util.Assets;
|
import xyz.valnet.hadean.util.Assets;
|
||||||
|
|
||||||
public class Button extends GameObject implements IMouseCaptureArea {
|
public class Button extends GameObject implements IMouseCaptureArea, ITransient {
|
||||||
|
|
||||||
private int x, y, width, height;
|
private int x, y, width, height;
|
||||||
private String text;
|
private String text;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package xyz.valnet.hadean.pathfinding;
|
package xyz.valnet.hadean.pathfinding;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -7,7 +8,7 @@ import java.util.Stack;
|
||||||
|
|
||||||
import xyz.valnet.engine.math.Vector2i;
|
import xyz.valnet.engine.math.Vector2i;
|
||||||
|
|
||||||
public class AStarPathfinder implements IPathfinder {
|
public class AStarPathfinder implements IPathfinder, Serializable {
|
||||||
|
|
||||||
private IPathable pathable;
|
private IPathable pathable;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
package xyz.valnet.hadean.pathfinding;
|
package xyz.valnet.hadean.pathfinding;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
import xyz.valnet.engine.math.Vector2i;
|
import xyz.valnet.engine.math.Vector2i;
|
||||||
|
|
||||||
public class Node {
|
public class Node implements Serializable {
|
||||||
public int x, y, g, h;
|
public int x, y, g, h;
|
||||||
public Node from;
|
public Node from;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
package xyz.valnet.hadean.pathfinding;
|
package xyz.valnet.hadean.pathfinding;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Stack;
|
import java.util.Stack;
|
||||||
|
|
||||||
public class Path implements Iterable<Node> {
|
public class Path implements Iterable<Node>, Serializable {
|
||||||
private Stack<Node> nodes;
|
private Stack<Node> nodes;
|
||||||
public final int cost;
|
public final int cost;
|
||||||
public final Node dst;
|
public final Node dst;
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,9 @@ import xyz.valnet.hadean.gameobjects.inputlayer.SelectionLayer;
|
||||||
import xyz.valnet.hadean.gameobjects.ui.HoverQuery;
|
import xyz.valnet.hadean.gameobjects.ui.HoverQuery;
|
||||||
import xyz.valnet.hadean.gameobjects.ui.tabs.BuildTab;
|
import xyz.valnet.hadean.gameobjects.ui.tabs.BuildTab;
|
||||||
import xyz.valnet.hadean.gameobjects.ui.tabs.JobBoardTab;
|
import xyz.valnet.hadean.gameobjects.ui.tabs.JobBoardTab;
|
||||||
|
import xyz.valnet.hadean.gameobjects.ui.tabs.LoadTab;
|
||||||
import xyz.valnet.hadean.gameobjects.ui.tabs.MenuTab;
|
import xyz.valnet.hadean.gameobjects.ui.tabs.MenuTab;
|
||||||
|
import xyz.valnet.hadean.gameobjects.ui.tabs.SaveTab;
|
||||||
import xyz.valnet.hadean.gameobjects.worldobjects.pawn.Pawn;
|
import xyz.valnet.hadean.gameobjects.worldobjects.pawn.Pawn;
|
||||||
|
|
||||||
// TODO BIG IDEAS
|
// TODO BIG IDEAS
|
||||||
|
|
@ -43,11 +45,15 @@ public class GameScene extends SceneGraph {
|
||||||
|
|
||||||
objects.add(new BuildLayer());
|
objects.add(new BuildLayer());
|
||||||
|
|
||||||
|
|
||||||
|
objects.add(new HoverQuery());
|
||||||
|
|
||||||
objects.add(new BottomBar());
|
objects.add(new BottomBar());
|
||||||
objects.add(new BuildTab());
|
objects.add(new BuildTab());
|
||||||
objects.add(new JobBoardTab());
|
objects.add(new JobBoardTab());
|
||||||
objects.add(new MenuTab());
|
objects.add(new MenuTab());
|
||||||
objects.add(new HoverQuery());
|
objects.add(new SaveTab());
|
||||||
|
objects.add(new LoadTab());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
package xyz.valnet.hadean.util;
|
package xyz.valnet.hadean.util;
|
||||||
|
|
||||||
public class Pair<T, U> {
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class Pair<T, U> implements Serializable {
|
||||||
private final T t;
|
private final T t;
|
||||||
private final U u;
|
private final U u;
|
||||||
public Pair(T t, U u) {
|
public Pair(T t, U u) {
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
package xyz.valnet.hadean.util;
|
package xyz.valnet.hadean.util;
|
||||||
|
|
||||||
public class SmartBoolean {
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class SmartBoolean implements Serializable {
|
||||||
private boolean value;
|
private boolean value;
|
||||||
|
|
||||||
public interface IListener {
|
public interface IListener extends Serializable {
|
||||||
public default void rise() {}
|
public default void rise() {}
|
||||||
public default void fall() {}
|
public default void fall() {}
|
||||||
public default void changed() {}
|
public default void changed() {}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue