diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/location/Locationable.java b/api/src/main/java/com/bartlomiejpluta/base/api/location/Locationable.java index af6a96eb..00a5dd71 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/location/Locationable.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/location/Locationable.java @@ -26,7 +26,11 @@ public interface Locationable extends Placeable { int manhattanDistance(Vector2ic coordinates); + double euclideanDistance(Vector2ic coordinates); + int chebyshevDistance(Locationable other); int manhattanDistance(Locationable other); + + double euclideanDistance(Locationable other); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/ai/RandomMovementAI.java b/api/src/main/java/com/bartlomiejpluta/base/lib/ai/RandomMovementAI.java index 795c8bbf..100d670d 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/ai/RandomMovementAI.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/ai/RandomMovementAI.java @@ -4,6 +4,8 @@ import com.bartlomiejpluta.base.api.ai.AI; import com.bartlomiejpluta.base.api.ai.NPC; import com.bartlomiejpluta.base.api.map.layer.object.ObjectLayer; import com.bartlomiejpluta.base.api.move.Direction; +import com.bartlomiejpluta.base.util.math.Distance; +import org.joml.Vector2ic; import java.util.Random; @@ -12,20 +14,37 @@ public class RandomMovementAI implements AI { private final N npc; private final float intervalSeconds; + private final int radius; + private final Vector2ic origin; private float accumulator = 0.0f; private float threshold = 0.0f; public RandomMovementAI(N npc, float intervalSeconds) { this.npc = npc; this.intervalSeconds = intervalSeconds; + this.radius = 0; + origin = null; + } + + public RandomMovementAI(N npc, float intervalSeconds, Vector2ic origin, int radius) { + this.npc = npc; + this.intervalSeconds = intervalSeconds; + this.radius = radius; + this.origin = origin; } @Override public void nextActivity(ObjectLayer layer, float dt) { if (!npc.isMoving()) { if (accumulator > threshold) { - Direction direction = Direction.values()[random.nextInt(4)]; - npc.move(direction); + var direction = Direction.values()[random.nextInt(4)]; + var movement = npc.prepareMovement(direction); + + if (origin != null && Distance.euclidean(origin, movement.getTo()) > radius) { + return; + } + + npc.getLayer().pushMovement(movement); accumulator = 0.0f; threshold = random.nextFloat() * intervalSeconds; } diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java b/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java index 5ea1c66e..cb433677 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/animation/AnimationDelegate.java @@ -179,6 +179,11 @@ public abstract class AnimationDelegate implements Animation { return animation.euclideanDistance(other); } + @Override + public double euclideanDistance(Vector2ic coordinates) { + return animation.euclideanDistance(coordinates); + } + @Override public Matrix4fc getModelMatrix() { return animation.getModelMatrix(); @@ -224,6 +229,11 @@ public abstract class AnimationDelegate implements Animation { return animation.manhattanDistance(other); } + @Override + public double euclideanDistance(Locationable other) { + return animation.euclideanDistance(other); + } + @Override public Vector2fc getPositionOffset() { return animation.getPositionOffset(); diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/character/CharacterDelegate.java b/api/src/main/java/com/bartlomiejpluta/base/lib/character/CharacterDelegate.java index 8e9762cf..0def00c3 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/character/CharacterDelegate.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/character/CharacterDelegate.java @@ -148,6 +148,11 @@ public abstract class CharacterDelegate implements Character { return character.manhattanDistance(other); } + @Override + public double euclideanDistance(Locationable other) { + return character.euclideanDistance(other); + } + @Override public Direction getDirectionTowards(Locationable target) { return character.getDirectionTowards(target); @@ -228,6 +233,11 @@ public abstract class CharacterDelegate implements Character { return character.euclideanDistance(other); } + @Override + public double euclideanDistance(Vector2ic coordinates) { + return character.euclideanDistance(coordinates); + } + @Override public int chebyshevDistance(Vector2ic coordinates) { return character.chebyshevDistance(coordinates); diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java b/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java index 7276a69a..d8684629 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/entity/EntityDelegate.java @@ -68,6 +68,11 @@ public abstract class EntityDelegate implements Entity { return entity.manhattanDistance(other); } + @Override + public double euclideanDistance(Locationable other) { + return entity.euclideanDistance(other); + } + @Override public Direction getDirectionTowards(Locationable target) { return entity.getDirectionTowards(target); @@ -148,6 +153,11 @@ public abstract class EntityDelegate implements Entity { return entity.euclideanDistance(other); } + @Override + public double euclideanDistance(Vector2ic coordinates) { + return entity.euclideanDistance(coordinates); + } + @Override public int chebyshevDistance(Vector2ic coordinates) { return entity.chebyshevDistance(coordinates); diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/icon/IconDelegate.java b/api/src/main/java/com/bartlomiejpluta/base/lib/icon/IconDelegate.java index 4e366c65..0f2f073d 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/icon/IconDelegate.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/icon/IconDelegate.java @@ -94,6 +94,16 @@ public abstract class IconDelegate implements Icon { return icon.manhattanDistance(other); } + @Override + public double euclideanDistance(Vector2ic coordinates) { + return icon.euclideanDistance(coordinates); + } + + @Override + public double euclideanDistance(Locationable other) { + return icon.euclideanDistance(other); + } + @Override public Direction getDirectionTowards(Locationable target) { return icon.getDirectionTowards(target); diff --git a/api/src/main/java/com/bartlomiejpluta/base/util/math/Distance.java b/api/src/main/java/com/bartlomiejpluta/base/util/math/Distance.java index 41fdaa93..55d36e97 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/util/math/Distance.java +++ b/api/src/main/java/com/bartlomiejpluta/base/util/math/Distance.java @@ -71,4 +71,8 @@ public class Distance { public static double euclidean(Vector2dc a, Vector2dc b) { return sqrt((a.x() - b.x()) * (a.x() - b.x()) + (a.y() - b.y()) * (a.y() - b.y())); } + + public static double euclidean(Vector2ic a, Vector2ic b) { + return sqrt((a.x() - b.x()) * (a.x() - b.x()) + (a.y() - b.y()) * (a.y() - b.y())); + } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/location/LocationableModel.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/location/LocationableModel.java index 7014ef0b..991fd9a0 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/location/LocationableModel.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/location/LocationableModel.java @@ -108,5 +108,15 @@ public abstract class LocationableModel extends Model implements Locationable { return Distance.manhattan(this.coordinates, other.getCoordinates()); } + @Override + public double euclideanDistance(Vector2ic coordinates) { + return Distance.euclidean(this.coordinates.x, this.coordinates.y, coordinates.x(), coordinates.y()); + } + + @Override + public double euclideanDistance(Locationable other) { + return Distance.euclidean(this.coordinates.x, this.coordinates.y, other.getCoordinates().x(), other.getCoordinates().y()); + } + private enum PlacingMode {BY_POSITION, BY_COORDINATES} }