diff --git a/pom.xml b/pom.xml
index 6976bab..c4f1d3f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,8 +14,8 @@
UTF-8
- 16
- 16
+ 17
+ 17
3.3.1
${project.name}
@@ -143,6 +143,7 @@
maven-jar-plugin
output/${platform.name}/raw
+
true
@@ -207,7 +208,10 @@
maven-compiler-plugin
- 3.8.0
+ 3.10.1
+
+ true
+
maven-install-plugin
diff --git a/src/main/java/xyz/valnet/hadean/designation/CutTreesDesignation.java b/src/main/java/xyz/valnet/hadean/designations/CutTreesDesignation.java
similarity index 90%
rename from src/main/java/xyz/valnet/hadean/designation/CutTreesDesignation.java
rename to src/main/java/xyz/valnet/hadean/designations/CutTreesDesignation.java
index bae82ec..1cb601d 100644
--- a/src/main/java/xyz/valnet/hadean/designation/CutTreesDesignation.java
+++ b/src/main/java/xyz/valnet/hadean/designations/CutTreesDesignation.java
@@ -1,4 +1,4 @@
-package xyz.valnet.hadean.designation;
+package xyz.valnet.hadean.designations;
import xyz.valnet.hadean.gameobjects.worldobjects.Tree;
diff --git a/src/main/java/xyz/valnet/hadean/designation/Designation.java b/src/main/java/xyz/valnet/hadean/designations/Designation.java
similarity index 91%
rename from src/main/java/xyz/valnet/hadean/designation/Designation.java
rename to src/main/java/xyz/valnet/hadean/designations/Designation.java
index 9e78994..4a5676f 100644
--- a/src/main/java/xyz/valnet/hadean/designation/Designation.java
+++ b/src/main/java/xyz/valnet/hadean/designations/Designation.java
@@ -1,11 +1,11 @@
-package xyz.valnet.hadean.designation;
+package xyz.valnet.hadean.designations;
import java.util.List;
import xyz.valnet.engine.math.Box;
import xyz.valnet.engine.math.TileBox;
import xyz.valnet.engine.scenegraph.GameObject;
-import xyz.valnet.hadean.interfaces.BuildType;
+import xyz.valnet.hadean.enums.BuildType;
import xyz.valnet.hadean.interfaces.IBuildable;
import xyz.valnet.hadean.interfaces.ISelectable;
diff --git a/src/main/java/xyz/valnet/hadean/designation/HaulItemDesignation.java b/src/main/java/xyz/valnet/hadean/designations/HaulItemDesignation.java
similarity index 90%
rename from src/main/java/xyz/valnet/hadean/designation/HaulItemDesignation.java
rename to src/main/java/xyz/valnet/hadean/designations/HaulItemDesignation.java
index 8865197..09ede88 100644
--- a/src/main/java/xyz/valnet/hadean/designation/HaulItemDesignation.java
+++ b/src/main/java/xyz/valnet/hadean/designations/HaulItemDesignation.java
@@ -1,4 +1,4 @@
-package xyz.valnet.hadean.designation;
+package xyz.valnet.hadean.designations;
import xyz.valnet.hadean.gameobjects.worldobjects.items.Item;
diff --git a/src/main/java/xyz/valnet/hadean/interfaces/BuildType.java b/src/main/java/xyz/valnet/hadean/enums/BuildType.java
similarity index 56%
rename from src/main/java/xyz/valnet/hadean/interfaces/BuildType.java
rename to src/main/java/xyz/valnet/hadean/enums/BuildType.java
index 89951bc..74f057f 100644
--- a/src/main/java/xyz/valnet/hadean/interfaces/BuildType.java
+++ b/src/main/java/xyz/valnet/hadean/enums/BuildType.java
@@ -1,4 +1,4 @@
-package xyz.valnet.hadean.interfaces;
+package xyz.valnet.hadean.enums;
public enum BuildType {
AREA,
diff --git a/src/main/java/xyz/valnet/hadean/enums/WorkType.java b/src/main/java/xyz/valnet/hadean/enums/WorkType.java
new file mode 100644
index 0000000..ff67d22
--- /dev/null
+++ b/src/main/java/xyz/valnet/hadean/enums/WorkType.java
@@ -0,0 +1,13 @@
+package xyz.valnet.hadean.enums;
+
+public enum WorkType {
+ Construct("Construct"),
+ Farm("Till"),
+ Chop("Chop");
+
+ public final String verb;
+
+ private WorkType(String verb) {
+ this.verb = verb;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java
index 19952b4..d54d1a1 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java
@@ -9,8 +9,8 @@ import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.scenegraph.GameObject;
import xyz.valnet.engine.scenegraph.IMouseCaptureArea;
import xyz.valnet.engine.scenegraph.ITransient;
+import xyz.valnet.hadean.enums.BuildType;
import xyz.valnet.hadean.gameobjects.Camera;
-import xyz.valnet.hadean.interfaces.BuildType;
import xyz.valnet.hadean.interfaces.IBuildLayerListener;
import xyz.valnet.hadean.util.Assets;
import xyz.valnet.hadean.util.Layers;
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/jobs/Job.java b/src/main/java/xyz/valnet/hadean/gameobjects/jobs/Job.java
index 2200022..f70b4ca 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/jobs/Job.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/jobs/Job.java
@@ -4,13 +4,16 @@ import xyz.valnet.hadean.gameobjects.worldobjects.items.Item;
import xyz.valnet.hadean.interfaces.IItemReceiver;
import xyz.valnet.hadean.interfaces.IWorkable;
-public interface Job {
+// TODO create a subtype of job for jobs with
+// locations so pawn can generically path to it
+
+public sealed interface Job {
record Work(
IWorkable workable
) implements Job {
@Override
public String getShortDescription() {
- return workable.getWorkType().verb + " " + workable.getName();
+ return workable.getWorkType().verb + " " + workable.getWorkableName();
}
}
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/jobs/JobBoard.java b/src/main/java/xyz/valnet/hadean/gameobjects/jobs/JobBoard.java
index 168babc..f283784 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/jobs/JobBoard.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/jobs/JobBoard.java
@@ -9,6 +9,7 @@ import java.util.Set;
import java.util.Map.Entry;
import xyz.valnet.engine.scenegraph.GameObject;
+import xyz.valnet.hadean.gameobjects.ui.tabs.DebugTab;
import xyz.valnet.hadean.gameobjects.worldobjects.agents.pawn.Pawn;
import xyz.valnet.hadean.interfaces.IWorkable;
@@ -25,8 +26,7 @@ public class JobBoard extends GameObject {
public Job post(IWorkable workable) {
var job = new Job.Work(workable);
- availableJobs.add(job);
- return job;
+ return postJob(job);
}
@@ -81,6 +81,21 @@ public class JobBoard extends GameObject {
}
}
-
+ public class ENoJobsAvailable extends Error {}
+
+ public Job takeJob(Pawn worker) {
+ if(availableJobs.size() == 0) return null;
+
+ Job[] jobs = new Job[availableJobs.size()];
+ availableJobs.toArray(jobs);
+ Job job = jobs[(int) (Math.floor(Math.random() * jobs.length))];
+
+ DebugTab.log("" + worker.getName() + " took job: " + job.getShortDescription());
+
+ allocations.put(worker, job);
+ availableJobs.remove(job);
+
+ return job;
+ }
}
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/jobs/SimpleWorkable.java b/src/main/java/xyz/valnet/hadean/gameobjects/jobs/SimpleWorkable.java
index 80e1b8b..152586a 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/jobs/SimpleWorkable.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/jobs/SimpleWorkable.java
@@ -12,6 +12,7 @@ public class SimpleWorkable implements IWorkable {
private float MAX_WORK = 0;
private IProgressUpdateCallback callback;
private IGetPositionsFunction positions;
+ private final WorkType workType;
@FunctionalInterface
public interface IGetPositionsFunction extends Serializable {
@@ -23,11 +24,12 @@ public class SimpleWorkable implements IWorkable {
public void progress(float progress);
}
- public SimpleWorkable(String name, float maxWork, IGetPositionsFunction positionsFunction, IProgressUpdateCallback callback) {
+ public SimpleWorkable(String name, float maxWork, WorkType type, IGetPositionsFunction positionsFunction, IProgressUpdateCallback callback) {
this.name = name;
this.MAX_WORK = maxWork;
this.positions = positionsFunction;
this.callback = callback;
+ this.workType = type;
}
@Override
@@ -43,8 +45,13 @@ public class SimpleWorkable implements IWorkable {
}
@Override
- public final String getJobName() {
+ public final String getWorkableName() {
return name;
}
+
+ @Override
+ public WorkType getWorkType() {
+ return workType;
+ }
}
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/terrain/Tile.java b/src/main/java/xyz/valnet/hadean/gameobjects/terrain/Tile.java
index 4025e77..143e21a 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/terrain/Tile.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/terrain/Tile.java
@@ -4,7 +4,6 @@ import java.util.HashSet;
import java.util.Set;
import xyz.valnet.engine.graphics.Color;
-import xyz.valnet.engine.math.TileBox;
import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.math.Vector4i;
import xyz.valnet.engine.scenegraph.GameObject;
@@ -61,7 +60,7 @@ public class Tile extends WorldObject implements IWorkable {
rocks = true;
}
if(Math.random() > 0.97) {
- // add(new Tree(pos.x, pos.y));
+ add(new Tree(pos.x, pos.y));
} else if(Math.random() > 0.98) {
rocks = false;
add(new Boulder(pos.x, pos.y));
@@ -89,7 +88,7 @@ public class Tile extends WorldObject implements IWorkable {
}
public void pingThings() {
- // TODO this is a quick lil workaround for a concurerncy issue.
+ // this is a quick lil workaround for a concurerncy issue.
// just clone the items
for(var thing : new HashSet(stuff)) {
if(thing instanceof IPingable) {
@@ -239,4 +238,9 @@ public class Tile extends WorldObject implements IWorkable {
public WorkType getWorkType() {
return WorkType.Farm;
}
+
+ @Override
+ public String getWorkableName() {
+ return "Soil";
+ }
}
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/ui/SelectionUI.java b/src/main/java/xyz/valnet/hadean/gameobjects/ui/SelectionUI.java
index 94a883a..1a67cec 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/ui/SelectionUI.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/ui/SelectionUI.java
@@ -77,11 +77,12 @@ public class SelectionUI extends ImmediateUI implements ISelectionChangeListener
private void updateActions() {
actions.clear();
updateActionsFlag = false;
- for(ISelectable selectable : selected)
+ for(ISelectable selectable : selected) {
for(Action action : selectable.getActions()) {
DebugTab.log(action.name);
actions.add(action);
}
+ }
}
@Override
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java b/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java
index 7906bb7..2ba4df6 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java
@@ -11,9 +11,10 @@ import xyz.valnet.engine.graphics.Drawing;
import xyz.valnet.engine.math.TileBox;
import xyz.valnet.engine.math.Vector2i;
import xyz.valnet.engine.scenegraph.GameObject;
-import xyz.valnet.hadean.designation.CutTreesDesignation;
-import xyz.valnet.hadean.designation.HaulItemDesignation;
import xyz.valnet.hadean.gameobjects.ui.BottomBar;
+import xyz.valnet.hadean.designations.CutTreesDesignation;
+import xyz.valnet.hadean.designations.HaulItemDesignation;
+import xyz.valnet.hadean.enums.BuildType;
import xyz.valnet.hadean.gameobjects.Camera;
import xyz.valnet.hadean.gameobjects.inputlayer.BuildLayer;
import xyz.valnet.hadean.gameobjects.inputlayer.SelectionLayer;
@@ -23,7 +24,6 @@ import xyz.valnet.hadean.gameobjects.worldobjects.constructions.Bed;
import xyz.valnet.hadean.gameobjects.worldobjects.constructions.MasonWorkshop;
import xyz.valnet.hadean.gameobjects.worldobjects.constructions.Quarry;
import xyz.valnet.hadean.gameobjects.worldobjects.constructions.Wall;
-import xyz.valnet.hadean.interfaces.BuildType;
import xyz.valnet.hadean.interfaces.IBuildLayerListener;
import xyz.valnet.hadean.interfaces.IBuildable;
import xyz.valnet.hadean.interfaces.ISelectable;
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Tree.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Tree.java
index 9804e7f..f090e7c 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Tree.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Tree.java
@@ -2,6 +2,7 @@ package xyz.valnet.hadean.gameobjects.worldobjects;
import xyz.valnet.engine.math.Box;
import xyz.valnet.engine.math.Vector2i;
+import xyz.valnet.hadean.enums.WorkType;
import xyz.valnet.hadean.gameobjects.jobs.Job;
import xyz.valnet.hadean.gameobjects.jobs.JobBoard;
import xyz.valnet.hadean.gameobjects.terrain.Tile;
@@ -125,4 +126,9 @@ public class Tree extends WorldObject implements ISelectable, IWorkable {
public WorkType getWorkType() {
return WorkType.Chop;
}
+
+ @Override
+ public String getWorkableName() {
+ return "Tree";
+ }
}
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/WorldObject.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/WorldObject.java
index ca8a0b9..db7687e 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/WorldObject.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/WorldObject.java
@@ -67,16 +67,6 @@ public abstract class WorldObject extends GameObject implements IWorldObject {
linkedTiles.add(tile);
tile.placeThing(this);
}
-
- // ?? this shouldnt bew pivotal to anything?
- // if(linkedTiles.size() == 0 && inScene()) {
- // remove(this);
- // }
-
- // if(linkedTiles.size() != 0 && !inScene()) {
- // add(this);
- // }
-
}
protected void setPosition(Vector4i vector) {
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java
index a19e1b9..28490c6 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java
@@ -16,6 +16,7 @@ import xyz.valnet.engine.shaders.SimpleShader;
import xyz.valnet.hadean.HadeanGame;
import xyz.valnet.hadean.gameobjects.ui.tabs.DebugTab;
import xyz.valnet.hadean.gameobjects.worldobjects.WorldObject;
+import xyz.valnet.hadean.interfaces.IDestinationProvider;
import xyz.valnet.hadean.interfaces.ISelectable;
import xyz.valnet.hadean.pathfinding.AStarPathfinder;
import xyz.valnet.hadean.pathfinding.IPathfinder;
@@ -58,11 +59,11 @@ public abstract class Agent extends WorldObject implements ISelectable {
// if we're STILL doing jack, but we have a destination
// try to path to that place
- if(dst != null) goTo(dst);
+ if(dsts != null) goTo(dsts);
if(isAnimating()) return;
// if all fails, tell the agent we're idle
- idle();
+ idle(dTime);
}
// public void goTo(int x, int y) {
@@ -77,14 +78,14 @@ public abstract class Agent extends WorldObject implements ISelectable {
path.pop();
if(path.isComplete()) {
DebugTab.log("Finished Pathing");
- if(path.getDestination().getPosition().equals(dst)) {
- dst = null;
+ if(path.getDestination().getPosition().equals(dsts)) {
+ dsts = null;
}
path = null;
return;
}
if(!getTile(path.peek().getPosition()).isWalkable()) {
- goTo(dst);
+ goTo(dsts);
return;
}
updatePath();
@@ -99,24 +100,25 @@ public abstract class Agent extends WorldObject implements ISelectable {
}
private Path path;
- private Vector2i dst;
+ private IDestinationProvider dsts;
public void stopPathing() {
path = null;
- dst = null;
+ dsts = null;
}
- public void goTo(Vector2i location) {
+ public boolean goTo(IDestinationProvider location) {
if(isAnimating()) {
stopPathing();
- dst = location;
- return;
+ dsts = location;
+ return true;
}
- Path newPath = pathfinder.getPath(getWorldPosition().xy(), location);
+ Path newPath = pathfinder.getBestPath(getWorldPosition().xy(), location);
path = newPath;
- if(path == null) return;
- dst = location;
+ if(path == null) return false;
+ dsts = location;
updatePath();
+ return true;
}
public void wander() {
@@ -131,7 +133,7 @@ public abstract class Agent extends WorldObject implements ISelectable {
} while (terrain.isOutOfBounds(random.x, random.y));
- goTo(random);
+ goTo(new IDestinationProvider.SingleDestination(random));
}
@Override
@@ -173,7 +175,8 @@ public abstract class Agent extends WorldObject implements ISelectable {
}
Assets.flat.swapColor(Color.yellow);
- if(dst != null) {
+ if(dsts != null) {
+ for(Vector2i dst : dsts.getDestinations())
camera.draw(
Layers.GROUND_MARKERS,
Assets.selectionFrame,
@@ -207,7 +210,7 @@ public abstract class Agent extends WorldObject implements ISelectable {
return new Box(getCalculatedPosition(), 1, 1);
}
- protected abstract void idle();
+ protected abstract void idle(float dTime);
public Vector2f getCalculatedPosition() {
if(!isAnimating())
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/pawn/Desire.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/pawn/Desire.java
deleted file mode 100644
index c4cbd3f..0000000
--- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/pawn/Desire.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package xyz.valnet.hadean.gameobjects.worldobjects.agents.pawn;
-
-import xyz.valnet.engine.math.Vector2i;
-import xyz.valnet.hadean.gameobjects.worldobjects.items.Item;
-import xyz.valnet.hadean.interfaces.IItemPredicate;
-
-public interface Desire {
- record BeAtLocation(
- Vector2i dest,
- Reason reason
- ) implements Desire {}
-
- record BeAtDynamicLocation(
- Vector2i dest,
- Reason reason
- ) implements Desire {}
-
- record HoldItemByPredicate(
- IItemPredicate item,
- Reason reason
- ) implements Desire {}
-
- record HoldExplicitItem(
- Item item,
- Reason reason
- ) implements Desire {}
-
- public Reason reason();
-}
\ No newline at end of file
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/pawn/Pawn.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/pawn/Pawn.java
index 6f7bd68..bda037e 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/pawn/Pawn.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/pawn/Pawn.java
@@ -10,6 +10,8 @@ import xyz.valnet.engine.math.Vector2f;
import xyz.valnet.engine.util.Names;
import xyz.valnet.hadean.HadeanGame;
import xyz.valnet.hadean.gameobjects.jobs.Job;
+import xyz.valnet.hadean.gameobjects.jobs.JobBoard;
+import xyz.valnet.hadean.gameobjects.jobs.JobBoard.ENoJobsAvailable;
import xyz.valnet.hadean.gameobjects.terrain.Terrain;
import xyz.valnet.hadean.gameobjects.worldobjects.agents.Agent;
import xyz.valnet.hadean.gameobjects.worldobjects.items.Item;
@@ -22,30 +24,66 @@ public class Pawn extends Agent {
private String name = Names.getRandomName();
- private Set desires = new HashSet<>();
+ private Set- inventory = new HashSet<>();
+
+ private Job currentJob = null;
+
+ private void doWorkJob(Job.Work workJob, float dTime) {
+ if(!this.getWorldPosition().xy().isOneOf(workJob.workable().getDestinations())) {
+ if(goTo(workJob.workable())) {
+ return;
+ } else {
+ cancelJob(currentJob);
+ }
+ }
+ workJob.workable().doWork(dTime);
+ }
+
+ private void doHaulJob(Job.Haul haulJob, float dTime) {
+
+ }
+
+ private void doJob(float dTime) {
+ if(currentJob instanceof Job.Haul haul) {
+ doHaulJob(haul, dTime);
+ } else if (currentJob instanceof Job.Work work) {
+ doWorkJob(work, dTime);
+ }
+ }
@Override
- protected void ready() {
- super.ready();
+ public void idle(float dTime) {
+ if(currentJob != null) {
+ doJob(dTime);
+ return;
+ }
+
+ // TODO implement some sort of negotiating pattern between pawn and jobboard
+ // such that a pawn can decide if its capable of a job (imagine a pawn stuck
+ // in a place where it cant reach the job location. or in future, where it
+ // may lack a skill)
+
+ if((currentJob = get(JobBoard.class).takeJob(this)) != null) {
+ doJob(dTime);
+ return;
+ }
+ }
+
+ public void cancelJob(Job job) {
+ currentJob = null;
}
protected void create() {
setPosition(
- Terrain.WORLD_SIZE / 2,
- Terrain.WORLD_SIZE / 2
- // (int) (Math.random() * Terrain.WORLD_SIZE),
- // (int) (Math.random() * Terrain.WORLD_SIZE)
+ (int) (Math.random() * Terrain.WORLD_SIZE),
+ (int) (Math.random() * Terrain.WORLD_SIZE)
);
}
@Override
public void render() {
super.render();
- // if(currentActivity instanceof SleepActivity) {
- // Assets.flat.pushColor(Color.grey(0.5f));
- // } else {
Assets.flat.pushColor(Color.white);
- // }
float shake = 0.0f;
camera.draw(
@@ -74,86 +112,13 @@ public class Pawn extends Agent {
return "Pawn";
}
- private Set
- inventory = new HashSet<>();
-
- public void cancelJob(Job job) {
-
- }
-
- // private float restlessness = 0;
- // private final
-
-
-
- @Override
- public void idle() {
- switch(currentWanderState) {
- case On:
- wander();
- break;
- case Off: break;
- case Random:
- if(Math.random() < 0.005) wander();
- break;
- }
- }
-
- private enum WanderState {
- Off,
- Random,
- On
- }
-
- private WanderState currentWanderState = WanderState.Off;
-
- public static final Action CYCLE_WANDER_STATE_ON = new Action("Wander\nON");
- public static final Action CYCLE_WANDER_STATE_RANDOM = new Action("Wander\nRANDOM");
- public static final Action CYCLE_WANDER_STATE_OFF = new Action("Wander\nOFF");
-
- public static final Action FORCE_WANDER = new Action("Wander");
- public static final Action CANCEL_PATH = new Action("Cancel\n Path");
-
@Override
public Action[] getActions() {
- Action wanderAction = null;
- switch(currentWanderState) {
- case Off: {
- wanderAction = CYCLE_WANDER_STATE_OFF;
- break;
- }
- case Random: {
- wanderAction = CYCLE_WANDER_STATE_RANDOM;
- break;
- }
- case On: {
- wanderAction = CYCLE_WANDER_STATE_ON;
- break;
- }
- }
- if(HadeanGame.debugView) {
- return new Action[] {
- wanderAction,
- FORCE_WANDER,
- CANCEL_PATH
- };
- }
- return new Action[] {
-
- };
+ return new Action[] {};
}
@Override
public void runAction(Action action) {
- if(action == CYCLE_WANDER_STATE_ON) {
- currentWanderState = WanderState.Off;
- } else if (action == CYCLE_WANDER_STATE_RANDOM) {
- currentWanderState = WanderState.On;
- } else if (action == CYCLE_WANDER_STATE_OFF) {
- currentWanderState = WanderState.Random;
- } else if (action == FORCE_WANDER) {
- wander();
- } else if (action == CANCEL_PATH) {
- stopPathing();
- }
+
}
}
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/pawn/Reason.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/pawn/Reason.java
deleted file mode 100644
index 78eb96b..0000000
--- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/pawn/Reason.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package xyz.valnet.hadean.gameobjects.worldobjects.agents.pawn;
-
-public interface Reason {
- record Job(
- xyz.valnet.hadean.gameobjects.jobs.Job job
- ) implements Reason {}
-
- record Need(
- ) implements Reason {}
-
- record Desire(
- Desire desire
- ) implements Reason {}
-}
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Construction.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Construction.java
index 65fd093..cb82c98 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Construction.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Construction.java
@@ -6,11 +6,11 @@ import java.util.List;
import xyz.valnet.engine.graphics.Color;
import xyz.valnet.engine.graphics.Sprite;
import xyz.valnet.engine.math.Vector2i;
+import xyz.valnet.hadean.enums.BuildType;
import xyz.valnet.hadean.gameobjects.jobs.Job;
import xyz.valnet.hadean.gameobjects.jobs.JobBoard;
import xyz.valnet.hadean.gameobjects.worldobjects.Buildable;
import xyz.valnet.hadean.gameobjects.worldobjects.items.Item;
-import xyz.valnet.hadean.interfaces.BuildType;
import xyz.valnet.hadean.interfaces.IItemPredicate;
import xyz.valnet.hadean.interfaces.IItemReceiver;
import xyz.valnet.hadean.interfaces.IWorkable;
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java
index e268ac6..a3c62a7 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java
@@ -5,9 +5,9 @@ import java.util.EnumSet;
import xyz.valnet.engine.graphics.Sprite;
import xyz.valnet.engine.graphics.Tile16.Direction;
import xyz.valnet.engine.math.Vector2i;
+import xyz.valnet.hadean.enums.BuildType;
import xyz.valnet.hadean.gameobjects.terrain.Tile;
import xyz.valnet.hadean.gameobjects.worldobjects.items.Boulder;
-import xyz.valnet.hadean.interfaces.BuildType;
import xyz.valnet.hadean.interfaces.IItemPredicate;
import xyz.valnet.hadean.interfaces.IPingable;
import xyz.valnet.hadean.util.Action;
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/items/Item.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/items/Item.java
index bbd6f70..f35540d 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/items/Item.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/items/Item.java
@@ -82,6 +82,10 @@ public abstract class Item extends WorldObject implements ISelectable {
jobboard.postJob(haulJob);
}
+ public void destroy() {
+ remove(this);
+ }
+
public boolean matches(IItemPredicate itemPredicate) {
return itemPredicate.matches(this);
}
diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/zones/Zone.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/zones/Zone.java
index 5c4b83c..a6b0a9f 100644
--- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/zones/Zone.java
+++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/zones/Zone.java
@@ -1,7 +1,7 @@
package xyz.valnet.hadean.gameobjects.worldobjects.zones;
+import xyz.valnet.hadean.enums.BuildType;
import xyz.valnet.hadean.gameobjects.worldobjects.Buildable;
-import xyz.valnet.hadean.interfaces.BuildType;
public abstract class Zone extends Buildable {
diff --git a/src/main/java/xyz/valnet/hadean/interfaces/IBuildable.java b/src/main/java/xyz/valnet/hadean/interfaces/IBuildable.java
index e70eec1..cf88b9a 100644
--- a/src/main/java/xyz/valnet/hadean/interfaces/IBuildable.java
+++ b/src/main/java/xyz/valnet/hadean/interfaces/IBuildable.java
@@ -2,6 +2,7 @@ package xyz.valnet.hadean.interfaces;
import xyz.valnet.engine.math.TileBox;
import xyz.valnet.engine.math.Vector2i;
+import xyz.valnet.hadean.enums.BuildType;
public interface IBuildable {
diff --git a/src/main/java/xyz/valnet/hadean/interfaces/IDestinationProvider.java b/src/main/java/xyz/valnet/hadean/interfaces/IDestinationProvider.java
new file mode 100644
index 0000000..58d22f3
--- /dev/null
+++ b/src/main/java/xyz/valnet/hadean/interfaces/IDestinationProvider.java
@@ -0,0 +1,16 @@
+package xyz.valnet.hadean.interfaces;
+
+import xyz.valnet.engine.math.Vector2i;
+
+public interface IDestinationProvider {
+ public Vector2i[] getDestinations();
+
+ record SingleDestination(Vector2i dst) implements IDestinationProvider {
+
+ @Override
+ public Vector2i[] getDestinations() {
+ return new Vector2i[] { dst };
+ }
+
+ }
+}
diff --git a/src/main/java/xyz/valnet/hadean/interfaces/IItemReceiver.java b/src/main/java/xyz/valnet/hadean/interfaces/IItemReceiver.java
index 09898f2..775edc4 100644
--- a/src/main/java/xyz/valnet/hadean/interfaces/IItemReceiver.java
+++ b/src/main/java/xyz/valnet/hadean/interfaces/IItemReceiver.java
@@ -9,4 +9,12 @@ public interface IItemReceiver extends Serializable {
public boolean receive(Item item);
public Vector2i[] getItemDropoffLocations();
public String getName();
+
+ public default boolean give(Item item) {
+ if(receive(item)) {
+ item.destroy();
+ return true;
+ }
+ return false;
+ }
}
diff --git a/src/main/java/xyz/valnet/hadean/interfaces/IWorkable.java b/src/main/java/xyz/valnet/hadean/interfaces/IWorkable.java
index d52b086..81f3fe6 100644
--- a/src/main/java/xyz/valnet/hadean/interfaces/IWorkable.java
+++ b/src/main/java/xyz/valnet/hadean/interfaces/IWorkable.java
@@ -3,23 +3,17 @@ package xyz.valnet.hadean.interfaces;
import java.io.Serializable;
import xyz.valnet.engine.math.Vector2i;
+import xyz.valnet.hadean.enums.WorkType;
-public interface IWorkable extends Serializable {
-
- public enum WorkType {
- Construct("Construct"),
- Farm("Till"),
- Chop("Chop");
-
- public final String verb;
-
- private WorkType(String verb) {
- this.verb = verb;
- }
- }
-
+public interface IWorkable extends Serializable, IDestinationProvider {
public WorkType getWorkType();
public boolean doWork(float dTime);
public Vector2i[] getWorkablePositions();
- public String getName();
+ public String getWorkableName();
+
+ @Override
+ public default Vector2i[] getDestinations() {
+ return getWorkablePositions();
+ }
+
}
diff --git a/src/main/java/xyz/valnet/hadean/pathfinding/AStarPathfinder.java b/src/main/java/xyz/valnet/hadean/pathfinding/AStarPathfinder.java
index fd75509..1c81765 100644
--- a/src/main/java/xyz/valnet/hadean/pathfinding/AStarPathfinder.java
+++ b/src/main/java/xyz/valnet/hadean/pathfinding/AStarPathfinder.java
@@ -7,6 +7,7 @@ import java.util.List;
import java.util.Stack;
import xyz.valnet.engine.math.Vector2i;
+import xyz.valnet.hadean.interfaces.IDestinationProvider;
public class AStarPathfinder implements IPathfinder, Serializable {
@@ -162,7 +163,9 @@ public class AStarPathfinder implements IPathfinder, Serializable {
}
@Override
- public Path getBestPath(Vector2i src, Vector2i[] dsts) {
+ public Path getBestPath(Vector2i src, IDestinationProvider provider) {
+
+ var dsts = provider.getDestinations();
if(src.isOneOf(dsts)) return null;
diff --git a/src/main/java/xyz/valnet/hadean/pathfinding/IPathfinder.java b/src/main/java/xyz/valnet/hadean/pathfinding/IPathfinder.java
index 16061c0..5707e25 100644
--- a/src/main/java/xyz/valnet/hadean/pathfinding/IPathfinder.java
+++ b/src/main/java/xyz/valnet/hadean/pathfinding/IPathfinder.java
@@ -1,6 +1,7 @@
package xyz.valnet.hadean.pathfinding;
import xyz.valnet.engine.math.Vector2i;
+import xyz.valnet.hadean.interfaces.IDestinationProvider;
public interface IPathfinder {
public Path getPath(int x1, int y1, int x2, int y2);
@@ -13,5 +14,5 @@ public interface IPathfinder {
public default Path getPath(Vector2i u, Vector2i v) {
return getPath(u.x, u.y, v.x, v.y);
}
- public Path getBestPath(Vector2i src, Vector2i[] dsts);
+ public Path getBestPath(Vector2i src, IDestinationProvider dsts);
}