From 1af8f12a9939c64031e05f1c0b5a35b7a8d8343d Mon Sep 17 00:00:00 2001 From: Ivory Date: Wed, 4 Jan 2023 03:33:20 -0500 Subject: [PATCH] beds are slightly better. --- Serialization Notes.md | 3 ++ .../xyz/valnet/hadean/gameobjects/Job.java | 49 +++++++++++++++++++ .../xyz/valnet/hadean/gameobjects/Tile.java | 14 +++++- .../hadean/gameobjects/worldobjects/Bed.java | 9 ++-- .../gameobjects/worldobjects/items/Item.java | 5 ++ .../gameobjects/worldobjects/items/Log.java | 3 ++ .../worldobjects/pawn/JobActivity.java | 14 +++++- .../gameobjects/worldobjects/pawn/Pawn.java | 29 ++++++++++- .../hadean/interfaces/IItemPredicate.java | 10 ++++ 9 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 Serialization Notes.md create mode 100644 src/main/java/xyz/valnet/hadean/interfaces/IItemPredicate.java diff --git a/Serialization Notes.md b/Serialization Notes.md new file mode 100644 index 0000000..2cc127d --- /dev/null +++ b/Serialization Notes.md @@ -0,0 +1,3 @@ + +0 1 2 3 4 +| 0xACED | short version | \ No newline at end of file diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Job.java b/src/main/java/xyz/valnet/hadean/gameobjects/Job.java index de0e96e..a71204b 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Job.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Job.java @@ -2,12 +2,15 @@ package xyz.valnet.hadean.gameobjects; import java.io.Serializable; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.hadean.gameobjects.worldobjects.Stockpile; import xyz.valnet.hadean.gameobjects.worldobjects.items.Item; +import xyz.valnet.hadean.interfaces.IItemPredicate; import xyz.valnet.hadean.interfaces.IItemReceiver; import xyz.valnet.hadean.interfaces.IWorkable; @@ -42,6 +45,52 @@ public class Job extends GameObject { } } + public class DropoffPredicateAtItemReceiver extends JobStep { + + public IItemReceiver receiver; + public IItemPredicate predicate; + + public DropoffPredicateAtItemReceiver(IItemReceiver receiver, IItemPredicate predicate) { + this.receiver = receiver; + this.predicate = predicate; + } + + @Override + public Vector2i[] getLocations() { + return receiver.getItemDropoffLocations(); + } + + @Override + public boolean isValid() { + return true; + } + } + + public class PickupItemByPredicate extends JobStep { + public IItemPredicate predicate; + + public PickupItemByPredicate(IItemPredicate predicate) { + this.predicate = predicate; + } + + @Override + public Vector2i[] getLocations() { + Set positionSet = new HashSet(); + for(Item item : that.getAll(Item.class)) { + if(!item.matches(predicate)) continue; + positionSet.add(item.getWorldPosition().asInt()); + } + Vector2i[] positions = new Vector2i[positionSet.size()]; + positionSet.toArray(positions); + return positions; + } + + @Override + public boolean isValid() { + return getLocations().length > 0; + } + } + public class DropoffAtItemReceiver extends JobStep { public IItemReceiver receiver; diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java b/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java index 3166cd7..6a0f059 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java @@ -12,6 +12,7 @@ import xyz.valnet.hadean.gameobjects.worldobjects.Tree; import xyz.valnet.hadean.gameobjects.worldobjects.WorldObject; import xyz.valnet.hadean.gameobjects.worldobjects.items.Boulder; import xyz.valnet.hadean.gameobjects.worldobjects.items.Item; +import xyz.valnet.hadean.interfaces.IItemPredicate; import xyz.valnet.hadean.interfaces.ITileThing; import xyz.valnet.hadean.interfaces.IWorkable; import xyz.valnet.hadean.util.Assets; @@ -23,7 +24,6 @@ public class Tile extends WorldObject implements IWorkable { private static int greenSeed = (int)(Math.random() * 10000); private static int blueSeed = (int)(Math.random() * 10000); - // private final int x, y; private Vector4f color; private final int tileSelector = (int)Math.floor(Math.random() * 4); private boolean rocks = false; @@ -80,6 +80,18 @@ public class Tile extends WorldObject implements IWorkable { return true; } + public Item pickupByItemPredicate(IItemPredicate itemPredicate) { + for(ITileThing thing : stuff) { + if(thing instanceof Item) { + Item item = (Item) thing; + if(item.matches(itemPredicate)) { + return removeThing(item); + } + } + } + return null; + } + public void placeThing(ITileThing thing) { stuff.add(thing); if(thing instanceof GameObject) { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Bed.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Bed.java index 50b9f9c..755cc8b 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Bed.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Bed.java @@ -33,13 +33,10 @@ public class Bed extends WorldObject implements IBuildable, IItemReceiver, IWork @Override protected void create() { super.create(); - // TODO eventually we're going to need a serializable ItemPredicate to select valid items. - // it will be useful for stockpile filters, pickup items, etc. basically a placeholder - // for "any item that matches X" as a data type. job = add(new Job("Build Bed")); Log log = get(Log.class); - job.addStep(job.new PickupItem(log)); - job.addStep(job.new DropoffAtItemReceiver(this, log)); + job.addStep(job.new PickupItemByPredicate(Log.LOG_PREDICATE)); + job.addStep(job.new DropoffPredicateAtItemReceiver(this, Log.LOG_PREDICATE)); job.addStep(job.new Work(this)); get(JobBoard.class).postJob(job); } @@ -76,6 +73,8 @@ public class Bed extends WorldObject implements IBuildable, IItemReceiver, IWork @Override public boolean receive(Item item) { + if(item == null) return false; + if(!item.matches(Log.LOG_PREDICATE)) return false; remove(item); logs ++; return true; 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 cc894ce..e6653fb 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 @@ -5,6 +5,7 @@ import xyz.valnet.hadean.gameobjects.Job; import xyz.valnet.hadean.gameobjects.JobBoard; import xyz.valnet.hadean.gameobjects.Tile; import xyz.valnet.hadean.gameobjects.worldobjects.WorldObject; +import xyz.valnet.hadean.interfaces.IItemPredicate; import xyz.valnet.hadean.interfaces.ISelectable; import xyz.valnet.hadean.interfaces.ITileThing; import xyz.valnet.hadean.util.Action; @@ -92,4 +93,8 @@ public abstract class Item extends WorldObject implements ISelectable, ITileThin this.x = tile.getCoords().x; this.y = tile.getCoords().y; } + + public boolean matches(IItemPredicate itemPredicate) { + return itemPredicate.matches(this); + } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/items/Log.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/items/Log.java index 224734d..f3aec4b 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/items/Log.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/items/Log.java @@ -1,5 +1,6 @@ package xyz.valnet.hadean.gameobjects.worldobjects.items; +import xyz.valnet.hadean.interfaces.IItemPredicate; import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Layers; import xyz.valnet.hadean.util.detail.Detail; @@ -11,6 +12,8 @@ import xyz.valnet.hadean.util.detail.Detail; // when placed in a non stockpile, not just on create. public class Log extends Item { + public static IItemPredicate LOG_PREDICATE = (item) -> (item instanceof Log); + public Log(int x, int y) { this.x = x; this.y = y; diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/JobActivity.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/JobActivity.java index e3b54b2..45e66c9 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/JobActivity.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/JobActivity.java @@ -82,7 +82,8 @@ public class JobActivity extends Activity { jobboard.quitJob(worker, job); job = null; } - + // TODO pawns should keep tabs of what job step an item is picked up from + // so dropoff steps can reference the pickup step. private boolean doJob(float dTime) { if(!jobboard.workerHasJob(worker)) return false; JobStep step = job.getCurrentStep(); @@ -108,6 +109,17 @@ public class JobActivity extends Activity { Job.DropoffAtItemReceiver dropoffStep = (Job.DropoffAtItemReceiver) step; worker.dropoffItem(dropoffStep.item, dropoffStep.receiver); step.next(); + return true; + } else if(step instanceof Job.DropoffPredicateAtItemReceiver) { + Job.DropoffPredicateAtItemReceiver dropoffStep = (Job.DropoffPredicateAtItemReceiver) step; + worker.dropoffPredicate(dropoffStep.predicate, dropoffStep.receiver); + step.next(); + return true; + } else if(step instanceof Job.PickupItemByPredicate) { + Job.PickupItemByPredicate pickupStep = (Job.PickupItemByPredicate) step; + worker.pickupItemByPredicate(pickupStep.predicate); + step.next(); + return true; } return false; diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/Pawn.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/Pawn.java index 203a57d..6359979 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/Pawn.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/pawn/Pawn.java @@ -13,6 +13,7 @@ import xyz.valnet.hadean.gameobjects.JobBoard; import xyz.valnet.hadean.gameobjects.Terrain; import xyz.valnet.hadean.gameobjects.worldobjects.agents.Agent; import xyz.valnet.hadean.gameobjects.worldobjects.items.Item; +import xyz.valnet.hadean.interfaces.IItemPredicate; import xyz.valnet.hadean.interfaces.IItemReceiver; import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Assets; @@ -37,6 +38,15 @@ public class Pawn extends Agent { private transient List activities = new ArrayList(); private Activity currentActivity = null; + private Item heldItem = null; + + public void pickupItemByPredicate(IItemPredicate itemPredicate) { + Item item = getTile().pickupByItemPredicate(itemPredicate); + if(item == null) return; + remove(item); + inventory.add(item); + } + public void pickupItem(Item i) { Item item = getTile().removeThing(i); if(item == null) return; @@ -62,6 +72,22 @@ public class Pawn extends Agent { receiver.receive(item); } + private Item getInventoryItemByPredicate(IItemPredicate predicate) { + for(Item item : inventory) { + if(!item.matches(predicate)) continue; + return item; + } + return null; + } + + public void dropoffPredicate(IItemPredicate predicate, IItemReceiver receiver) { + Item item = getInventoryItemByPredicate(predicate); + if(!inventory.contains(item)) { + return; + } + dropoffItem(item, receiver); + } + @Override protected void ready() { super.ready(); @@ -102,7 +128,8 @@ public class Pawn extends Agent { return mergeDetails(needs.getDetails(), new Detail[] { new ObjectDetail("Activity", currentActivity), new PercentDetail("Sleep Value", activities.get(1).getBenefit(), 2), - new BooleanDetail("Pathing", isPathing()) + new BooleanDetail("Pathing", isPathing()), + new ObjectDetail("Inventory", inventory.size()) }); } diff --git a/src/main/java/xyz/valnet/hadean/interfaces/IItemPredicate.java b/src/main/java/xyz/valnet/hadean/interfaces/IItemPredicate.java new file mode 100644 index 0000000..985c4b7 --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/interfaces/IItemPredicate.java @@ -0,0 +1,10 @@ +package xyz.valnet.hadean.interfaces; + +import java.io.Serializable; + +import xyz.valnet.hadean.gameobjects.worldobjects.items.Item; + +@FunctionalInterface +public interface IItemPredicate extends Serializable { + public boolean matches(Item item); +}