From aece757dde2c9882a8e0e3fa772b724e2f42f185 Mon Sep 17 00:00:00 2001 From: valyrie97 Date: Mon, 26 Dec 2022 20:44:11 -0500 Subject: [PATCH] multiple job locations --- .../xyz/valnet/hadean/gameobjects/Job.java | 25 ++++++++----------- .../valnet/hadean/gameobjects/JobBoard.java | 10 +++++--- .../hadean/gameobjects/ui/tabs/BuildTab.java | 2 ++ .../gameobjects/worldobjects/FarmPlot.java | 2 -- .../hadean/gameobjects/worldobjects/Pawn.java | 18 +++++++------ .../worldobjects/agents/Agent.java | 9 ++++--- .../hadean/pathfinding/AStarPathfinder.java | 3 +++ 7 files changed, 37 insertions(+), 32 deletions(-) diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Job.java b/src/main/java/xyz/valnet/hadean/gameobjects/Job.java index bfff774..e94d93f 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Job.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Job.java @@ -1,6 +1,7 @@ package xyz.valnet.hadean.gameobjects; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import xyz.valnet.engine.math.Vector2f; @@ -13,11 +14,10 @@ import xyz.valnet.hadean.interfaces.IWorkable; public class Job extends GameObject { - private Terrain terrain; private Job that = this; public abstract class JobStep { - public abstract Vector2f getLocation(); + public abstract Vector2i[] getLocations(); public void next() { that.nextStep(); } @@ -32,8 +32,8 @@ public class Job extends GameObject { } @Override - public Vector2f getLocation() { - return item.getWorldPosition(); + public Vector2i[] getLocations() { + return new Vector2i[] { item.getWorldPosition().asInt() }; } } @@ -43,10 +43,10 @@ public class Job extends GameObject { this.item = item; } - public Vector2f getLocation() { + public Vector2i[] getLocations() { Stockpile pile = that.get(Stockpile.class); Vector4f box = pile.getWorldBox(); - return new Vector2f(box.x, box.y); + return new Vector2i[] { new Vector2f(box.x, box.y).asInt() }; } } @@ -56,8 +56,8 @@ public class Job extends GameObject { this.subject = subject; } @Override - public Vector2f getLocation() { - return subject.getWorkablePositions()[0].asFloat(); + public Vector2i[] getLocations() { + return subject.getWorkablePositions(); } public boolean doWork() { return subject.doWork(); @@ -72,11 +72,6 @@ public class Job extends GameObject { step = 0; } - @Override - public void start() { - this.terrain = get(Terrain.class); - } - public Job(String name) { this.steps = new ArrayList(); this.name = name; @@ -86,10 +81,10 @@ public class Job extends GameObject { steps.add(step); } - public Vector2i getLocation() { + public Vector2i[] getLocations() { if(steps.size() == 0) throw new Error("Cannot get location of job with no steps"); JobStep step = steps.get(0); - return step.getLocation().asInt(); + return step.getLocations(); } public void nextStep() { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java b/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java index 85a8c49..2bb5d26 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java @@ -1,12 +1,15 @@ package xyz.valnet.hadean.gameobjects; import java.util.ArrayList; +import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.function.BinaryOperator; +import java.util.stream.Stream; import java.util.Set; import xyz.valnet.engine.math.Vector2f; @@ -60,10 +63,9 @@ public class JobBoard extends GameObject { .stream() .map(job -> new Pair( job, - job.getLocation().distanceTo( - (int) workerLocation.x, - (int) workerLocation.y - ) + Stream.of(job.getLocations()) + .map(v -> v.distanceTo((int) workerLocation.x, (int) workerLocation.y)) + .reduce(Float.MAX_VALUE, (a, b) -> a < b ? a : b) )) // sort the jobs by their distance from the worker .sorted(new Comparator>() { 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 74c42c2..c3ff4ec 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 @@ -5,6 +5,7 @@ import static xyz.valnet.engine.util.Math.lerp; import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; +import java.lang.reflect.Modifier; import java.net.URL; import java.util.ArrayList; import java.util.Collection; @@ -71,6 +72,7 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap if(clazz.isAnonymousClass()) continue; if(!IBuildable.class.isAssignableFrom(clazz)) continue; if(clazz.isInterface()) continue; + if(Modifier.isAbstract(clazz.getModifiers())) continue; Constructor constructor = clazz.getConstructor(); if(constructor.getParameterCount() != 0) { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/FarmPlot.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/FarmPlot.java index 0987dd9..be9ae16 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/FarmPlot.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/FarmPlot.java @@ -70,8 +70,6 @@ public class FarmPlot extends WorldObject implements ISelectable, ITileThing, IB this.y = y; this.w = w; this.h = h; - System.out.println("<" + x + ", " + y + ", " + w + ", " + h + ">"); - System.out.println(inScene()); for(int i = x; i < x + w; i ++) { for(int j = y; j < y + h; j ++) { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Pawn.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Pawn.java index 44cd3af..2429326 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Pawn.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Pawn.java @@ -1,6 +1,7 @@ package xyz.valnet.hadean.gameobjects.worldobjects; import xyz.valnet.engine.math.Vector2f; +import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.hadean.gameobjects.Job; import xyz.valnet.hadean.gameobjects.JobBoard; @@ -51,7 +52,8 @@ public class Pawn extends Agent implements IWorker { @Override public Vector4f getWorldBox() { - return new Vector4f(x, y, x + 1, y + 1); + Vector2f pos = getCalculatedPosition(); + return new Vector4f(pos.x, pos.y, pos.x+1, pos.y+1); } private JobBoard jobboard; @@ -73,26 +75,25 @@ public class Pawn extends Agent implements IWorker { // if we still dont have a job and we're not moving around if(!jobboard.workerHasJob(this) && !isPathing()) { - if(Math.random() > 0.001f) wander(); // have a chance of wandering! + if(Math.random() < 0.001f) wander(); // have a chance of wandering! return; // and dont think about anything else. } } private boolean isPathingToJobLocation() { if(!isPathing()) return false; - return getDestination().equals(jobboard.getJob(this).getCurrentStep().getLocation().asInt()); + return getDestination().isOneOf(jobboard.getJob(this).getCurrentStep().getLocations()); } private boolean isAtJobStepLocation() { - return jobboard.getJob(this).getCurrentStep().getLocation().equals(this.getWorldPosition()); + return this.getWorldPosition().asInt().isOneOf(jobboard.getJob(this).getCurrentStep().getLocations()); } private void goToJobStepLocation() { - goTo(jobboard + goToClosest(jobboard .getJob(this) .getCurrentStep() - .getLocation() - .asInt() + .getLocations() ); } @@ -108,7 +109,8 @@ public class Pawn extends Agent implements IWorker { private boolean doJob() { if(!jobboard.workerHasJob(this)) return false; JobStep step = jobboard.getJob(this).getCurrentStep(); - if(!getWorldPosition().asInt().equals(step.getLocation().asInt())) return false; + // if we're not at the location of the job... + if(!isAtJobStepLocation()) return false; if(step instanceof Job.Work) { Job.Work workStep = (Job.Work)step; 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 4608aaa..86bc497 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 @@ -97,9 +97,13 @@ public abstract class Agent extends WorldObject implements ISelectable { } protected void goTo(int x, int y) { - if(x == (int) this.x && y == (int) this.y) return; - frameCounter = 0; path = pathfinder.getPath((int)this.x, (int)this.y, x, y); + frameCounter = 0; + } + + protected void goToClosest(Vector2i[] destinations) { + path = pathfinder.getBestPath(this.getWorldPosition().asInt(), destinations); + frameCounter = 0; } protected void goTo(Vector2i location) { @@ -107,7 +111,6 @@ public abstract class Agent extends WorldObject implements ISelectable { } protected void wander() { - System.out.println("WANDER!"); int randomX = (int)Math.floor(Math.random() * Terrain.WORLD_SIZE); int randomY = (int)Math.floor(Math.random() * Terrain.WORLD_SIZE); path = pathfinder.getPath((int)x, (int)y, randomX, randomY); diff --git a/src/main/java/xyz/valnet/hadean/pathfinding/AStarPathfinder.java b/src/main/java/xyz/valnet/hadean/pathfinding/AStarPathfinder.java index 9c5cb15..224f5d1 100644 --- a/src/main/java/xyz/valnet/hadean/pathfinding/AStarPathfinder.java +++ b/src/main/java/xyz/valnet/hadean/pathfinding/AStarPathfinder.java @@ -147,6 +147,9 @@ public class AStarPathfinder implements IPathfinder { @Override public Path getBestPath(Vector2i src, Vector2i[] dsts) { + + if(src.isOneOf(dsts)) return null; + int cost = Integer.MAX_VALUE; Path bestPath = null; for(Vector2i dst : dsts) {