From 95cf5714504a733030e642f68aa8ada93a7512df Mon Sep 17 00:00:00 2001 From: valyrie97 Date: Sun, 25 Dec 2022 12:09:45 -0500 Subject: [PATCH] tillable soil --- res/textures.png | Bin 23769 -> 23732 bytes .../java/xyz/valnet/engine/math/Vector4f.java | 4 + .../xyz/valnet/hadean/gameobjects/Tile.java | 64 +++++++- .../gameobjects/worldobjects/FarmPlot.java | 145 +++++++++--------- .../xyz/valnet/hadean/interfaces/IJob.java | 2 + 5 files changed, 136 insertions(+), 79 deletions(-) diff --git a/res/textures.png b/res/textures.png index c7a91112179ae9bfff06090656d36b1722317f25..e5324a99bce07cda71eb8d75d783d1ebb252f626 100644 GIT binary patch delta 19797 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 Apa1{> delta 19832 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%0AsA2}RO+4> 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 diff --git a/src/main/java/xyz/valnet/engine/math/Vector4f.java b/src/main/java/xyz/valnet/engine/math/Vector4f.java index b4b2e4a..fb1bd3a 100644 --- a/src/main/java/xyz/valnet/engine/math/Vector4f.java +++ b/src/main/java/xyz/valnet/engine/math/Vector4f.java @@ -22,6 +22,10 @@ public class Vector4f { public static Vector4f black = new Vector4f(0f, 0f, 0f, 1f); public static Vector4f zero = new Vector4f(0f, 0f, 0f, 0f); + public static Vector4f opacity(float w) { + return new Vector4f(1, 1, 1, w); + } + public String toString() { return "(" + this.x + ", " + this.y + ", " + this.z + ", " + this.w + ")"; } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java b/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java index 7bde8ee..f7e614a 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java @@ -7,12 +7,15 @@ import xyz.valnet.engine.graphics.Sprite; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.gameobjects.worldobjects.FarmPlot; import xyz.valnet.hadean.gameobjects.worldobjects.Tree; +import xyz.valnet.hadean.gameobjects.worldobjects.WorldObject; import xyz.valnet.hadean.interfaces.ITileThing; +import xyz.valnet.hadean.interfaces.IWorkable; import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Layers; -public class Tile extends GameObject { +public class Tile extends WorldObject implements IWorkable { private Camera camera; @@ -53,6 +56,10 @@ public class Tile extends GameObject { if(thing instanceof GameObject) { add((GameObject)thing); } + if(thing instanceof FarmPlot) { + desiredTill = true; + get(JobBoard.class).postJob(this); + } } @Override @@ -74,9 +81,16 @@ public class Tile extends GameObject { @Override public void render() { - Assets.flat.pushColor(color); - camera.draw(Layers.TILES, sprite, x, y); - Assets.flat.popColor(); + if(tillLevel < 1f) { + Assets.flat.pushColor(color); + camera.draw(Layers.TILES, sprite, x, y); + Assets.flat.popColor(); + } + if(tillLevel > 0f) { + Assets.flat.pushColor(Vector4f.opacity(tillLevel)); + camera.draw(Layers.TILES, Assets.farmPlot, x, y); + Assets.flat.popColor(); + } } public boolean isWalkable() { @@ -85,4 +99,46 @@ public class Tile extends GameObject { } return true; } + + private boolean desiredTill = false; + private float tillLevel = 0; + + public void setTill(boolean till) { + desiredTill = till; + } + + @Override + public boolean hasWork() { + return desiredTill && tillLevel < 1f; + } + + @Override + public Vector2i[] getWorkablePositions() { + return new Vector2i[] { + new Vector2i(x - 1, y - 1), + new Vector2i(x, y - 1), + new Vector2i(x + 1, y - 1), + new Vector2i(x - 1, y + 0), + new Vector2i(x, y + 0), + new Vector2i(x + 1, y + 0), + new Vector2i(x - 1, y + 1), + new Vector2i(x, y + 1), + new Vector2i(x + 1, y + 1), + }; + } + + @Override + public Vector2i getLocation() { + return new Vector2i(x, y); + } + + @Override + public String getJobName() { + return "Till Soil"; + } + + @Override + public void doWork() { + tillLevel += 0.005f; + } } 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 afe9394..b8cce3c 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/FarmPlot.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/FarmPlot.java @@ -1,43 +1,40 @@ package xyz.valnet.hadean.gameobjects.worldobjects; -import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; -import xyz.valnet.hadean.gameobjects.JobBoard; import xyz.valnet.hadean.interfaces.BuildableMetadata; import xyz.valnet.hadean.interfaces.IBuildable; import xyz.valnet.hadean.interfaces.ISelectable; import xyz.valnet.hadean.interfaces.ITileThing; -import xyz.valnet.hadean.interfaces.IWorkable; import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Layers; @BuildableMetadata(category = "Zones", name = "Farm Plot") -public class FarmPlot extends WorldObject implements IWorkable, ISelectable, ITileThing, IBuildable { +public class FarmPlot extends WorldObject implements ISelectable, ITileThing, IBuildable { - private float progress = 0f; - private int stage = 0; - private boolean planted = false; - private boolean mature = false; + // private float progress = 0f; + // private int stage = 0; + // private boolean planted = false; + // private boolean mature = false; - private static int STAGE_LENGTH = 1000; - private static int MAX_STAGES = 4; + // private static int STAGE_LENGTH = 1000; + // private static int MAX_STAGES = 4; - private JobBoard board; + // private JobBoard board; private int w, h; @Override public void render() { - camera.draw(Layers.TILES, Assets.farmPlot, x, y); + // camera.draw(Layers.TILES, Assets.farmPlot, x, y); - if(planted) { - if(stage > 1) { - camera.draw(Layers.AIR, Assets.growingRice[stage], x, y - 1, 1, 2); - } else { - camera.draw(Layers.AIR, Assets.growingRice[stage], x, y); - } - } + // if(planted) { + // if(stage > 1) { + // camera.draw(Layers.AIR, Assets.growingRice[stage], x, y - 1, 1, 2); + // } else { + // camera.draw(Layers.AIR, Assets.growingRice[stage], x, y); + // } + // } } @Override @@ -52,24 +49,24 @@ public class FarmPlot extends WorldObject implements IWorkable, ISelectable, ITi public void update(float dTime) { super.update(dTime); - if(stage == MAX_STAGES - 1) { - return; - } if(planted) { - if(Math.random() > 0.95f) { - progress += 10; - if(progress >= STAGE_LENGTH) { - stage ++; - progress = 0; - if(stage == MAX_STAGES - 1) { - mature = true; - board.postJob(this); - } - } - } - } else if (progress >= STAGE_LENGTH) { - planted = true; - progress = 0; - } + // if(stage == MAX_STAGES - 1) { + // return; + // } if(planted) { + // if(Math.random() > 0.95f) { + // progress += 10; + // if(progress >= STAGE_LENGTH) { + // stage ++; + // progress = 0; + // if(stage == MAX_STAGES - 1) { + // mature = true; + // board.postJob(this); + // } + // } + // } + // } else if (progress >= STAGE_LENGTH) { + // planted = true; + // progress = 0; + // } } @@ -77,34 +74,34 @@ public class FarmPlot extends WorldObject implements IWorkable, ISelectable, ITi @Override public void start() { super.start(); - board = get(JobBoard.class); - board.postJob(this); + // board = get(JobBoard.class); + // board.postJob(this); } - @Override - public boolean hasWork() { - return !planted || mature; - } + // @Override + // public boolean hasWork() { + // // return !planted || mature; + // } - @Override - public Vector2i[] getWorkablePositions() { - return new Vector2i[] { - new Vector2i((int) x, (int) y + 1), - new Vector2i((int) x, (int) y - 1), - new Vector2i((int) x + 1, (int) y), - new Vector2i((int) x - 1, (int) y) - }; - } + // @Override + // public Vector2i[] getWorkablePositions() { + // return new Vector2i[] { + // new Vector2i((int) x, (int) y + 1), + // new Vector2i((int) x, (int) y - 1), + // new Vector2i((int) x + 1, (int) y), + // new Vector2i((int) x - 1, (int) y) + // }; + // } - @Override - public Vector2i getLocation() { - return new Vector2i((int) x, (int) y); - } + // @Override + // public Vector2i getLocation() { + // return new Vector2i((int) x, (int) y); + // } - @Override - public String getJobName() { - return planted ? "Harvest Rice" : "Plant Rice"; - } + // @Override + // public String getJobName() { + // return planted ? "Harvest Rice" : "Plant Rice"; + // } @Override public Vector4f getWorldBox() { @@ -130,23 +127,21 @@ public class FarmPlot extends WorldObject implements IWorkable, ISelectable, ITi @Override public String details() { - return "Planted | " + planted + "\n" + - "Stage | " + stage + "\n" + - "Progress | " + String.format("%.2f", (progress / STAGE_LENGTH) * 100) + "%"; + return ""; } - @Override - public void doWork() { - progress ++; - if(mature && progress >= STAGE_LENGTH) { - mature = false; - planted = false; - stage = 0; - if(Math.random() < 0.3) { - getTile().placeThing(new Rice((int)x, (int)y)); - } - } - } + // @Override + // public void doWork() { + // // progress ++; + // // if(mature && progress >= STAGE_LENGTH) { + // // mature = false; + // // planted = false; + // // stage = 0; + // // if(Math.random() < 0.3) { + // // getTile().placeThing(new Rice((int)x, (int)y)); + // // } + // // } + // } @Override public boolean isWalkable() { diff --git a/src/main/java/xyz/valnet/hadean/interfaces/IJob.java b/src/main/java/xyz/valnet/hadean/interfaces/IJob.java index 5339038..5e98bbe 100644 --- a/src/main/java/xyz/valnet/hadean/interfaces/IJob.java +++ b/src/main/java/xyz/valnet/hadean/interfaces/IJob.java @@ -5,6 +5,8 @@ import xyz.valnet.engine.math.Vector2i; public interface IJob { public boolean hasWork(); public Vector2i[] getWorkablePositions(); + + @Deprecated // please use the workable positions. public Vector2i getLocation(); public String getJobName(); }