From e4007a76ab168826c13390edf4f1596bb45b9c4a Mon Sep 17 00:00:00 2001 From: valyrie97 Date: Sun, 25 Dec 2022 11:34:53 -0500 Subject: [PATCH] the best build menu in existence --- res/textures.png | Bin 8240 -> 23769 bytes .../valnet/engine/scenegraph/GameObject.java | 13 +- .../valnet/engine/scenegraph/IRenderable.java | 1 + .../valnet/engine/scenegraph/SceneGraph.java | 15 +- .../valnet/engine/shaders/SimpleShader.java | 4 + .../java/xyz/valnet/hadean/HadeanGame.java | 7 + .../valnet/hadean/gameobjects/JobBoard.java | 2 +- .../hadean/gameobjects/SelectionUI.java | 2 - .../valnet/hadean/gameobjects/Stockpile.java | 11 - .../xyz/valnet/hadean/gameobjects/Tile.java | 3 +- .../gameobjects/inputlayer/BuildLayer.java | 1 - .../hadean/gameobjects/tabs/BuildTab.java | 233 +++++++++++++++--- .../gameobjects/worldobjects/FarmPlot.java | 53 +++- .../hadean/gameobjects/worldobjects/Log.java | 8 +- .../hadean/gameobjects/worldobjects/Pawn.java | 2 +- .../hadean/gameobjects/worldobjects/Rice.java | 8 +- .../gameobjects/worldobjects/Stockpile.java | 136 ++++++++++ .../hadean/gameobjects/worldobjects/Tree.java | 8 +- .../java/xyz/valnet/hadean/input/Button.java | 4 + .../xyz/valnet/hadean/input/GOButton.java | 64 ----- .../hadean/interfaces/BuildableMetadata.java | 10 + .../valnet/hadean/interfaces/IBuildable.java | 7 + .../xyz/valnet/hadean/interfaces/IJob.java | 2 +- .../valnet/hadean/interfaces/ITileThing.java | 1 - .../java/xyz/valnet/hadean/util/Assets.java | 21 +- 25 files changed, 451 insertions(+), 165 deletions(-) create mode 100644 src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Stockpile.java delete mode 100644 src/main/java/xyz/valnet/hadean/input/GOButton.java create mode 100644 src/main/java/xyz/valnet/hadean/interfaces/BuildableMetadata.java create mode 100644 src/main/java/xyz/valnet/hadean/interfaces/IBuildable.java diff --git a/res/textures.png b/res/textures.png index 8a3adc8455194b3a3b097f8b6af3f1c97fd52c50..c7a91112179ae9bfff06090656d36b1722317f25 100644 GIT binary patch literal 23769 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 Wb$YBz<2t8i3S6>tvaPrFN&X)z1Wbqk literal 8240 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 diff --git a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java index 4ab30f1..56688bd 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/GameObject.java @@ -10,7 +10,11 @@ public class GameObject implements IRenderable, ITickable { } public boolean inScene() { - return scene.inScene(this); + return scene != null && scene.inScene(this); + } + + protected void dumpScene() { + scene.dump(); } protected T get(Class clazz) { @@ -22,11 +26,18 @@ public class GameObject implements IRenderable, ITickable { } protected final void add(GameObject obj) { + if(obj.inScene()) { + System.out.println(obj + " is already in the scene. not adding twice..."); + return; + } scene.add(obj); } @Override public void render() {} + + @Override + public void renderAlpha() {} @Override public void update(float dTime) {} diff --git a/src/main/java/xyz/valnet/engine/scenegraph/IRenderable.java b/src/main/java/xyz/valnet/engine/scenegraph/IRenderable.java index 0a39453..e776521 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/IRenderable.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/IRenderable.java @@ -2,4 +2,5 @@ package xyz.valnet.engine.scenegraph; public interface IRenderable { public void render(); + public void renderAlpha(); } diff --git a/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java index f4cafbe..c2a5726 100644 --- a/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java +++ b/src/main/java/xyz/valnet/engine/scenegraph/SceneGraph.java @@ -43,10 +43,6 @@ public abstract class SceneGraph implements IScene { added.add(obj); } newObjects.clear(); - - for(GameObject obj : added) { - obj.start(); - } } // REMOVE OBJECTS @@ -110,6 +106,9 @@ public abstract class SceneGraph implements IScene { for(GameObject obj : objects) { obj.render(); } + for(GameObject obj : objects) { + obj.renderAlpha(); + } } protected abstract void construct(); @@ -123,6 +122,7 @@ public abstract class SceneGraph implements IScene { public void add(GameObject obj) { newObjects.add(obj); obj.link(this); + obj.start(); } public void remove(GameObject obj) { @@ -130,7 +130,12 @@ public abstract class SceneGraph implements IScene { } public boolean inScene(GameObject gameObject) { - return objects.contains(gameObject); + return objects.contains(gameObject) || newObjects.contains(gameObject); + } + + public void dump() { + for(GameObject go : objects) + System.out.println(go); } @Override diff --git a/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java b/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java index 7888428..156d518 100644 --- a/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java +++ b/src/main/java/xyz/valnet/engine/shaders/SimpleShader.java @@ -27,6 +27,10 @@ public class SimpleShader extends Shader { popColor(); pushColor(color); } + + public void clearColorStack() { + colorStack.clear(); + } public void popColor() { colorStack.pop(); diff --git a/src/main/java/xyz/valnet/hadean/HadeanGame.java b/src/main/java/xyz/valnet/hadean/HadeanGame.java index 3b8b643..3f087d9 100644 --- a/src/main/java/xyz/valnet/hadean/HadeanGame.java +++ b/src/main/java/xyz/valnet/hadean/HadeanGame.java @@ -1,5 +1,12 @@ package xyz.valnet.hadean; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + import xyz.valnet.engine.App; import xyz.valnet.engine.Game; import xyz.valnet.engine.graphics.Drawing; diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java b/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java index 2a14164..ab01de6 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/JobBoard.java @@ -83,7 +83,7 @@ public class JobBoard extends GameObject { if(workables.size() > 0) { for(IJob job : workables) { if(!job.hasWork()) continue; - Vector2i[] workablePositions = job.getWorablePositions(); + Vector2i[] workablePositions = job.getWorkablePositions(); Path bestPathToJob = pathfinder.getBestPath( new Vector2i((int)Math.floor(workerLocation.x), (int)Math.floor(workerLocation.y)), workablePositions diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java b/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java index 8e1467c..1281512 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/SelectionUI.java @@ -173,12 +173,10 @@ public class SelectionUI extends GameObject implements ISelectionChangeListener, @Override public void mouseEnter() { - } @Override public void mouseLeave() { - } @Override diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Stockpile.java b/src/main/java/xyz/valnet/hadean/gameobjects/Stockpile.java index 933fd9d..dc4387e 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Stockpile.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Stockpile.java @@ -12,11 +12,6 @@ public class Stockpile extends WorldObject implements ITileThing, ISelectable { private WorldObject thing; - public Stockpile(int x, int y) { - this.x = x; - this.y = y; - } - public boolean isFree() { return thing == null; } @@ -59,11 +54,5 @@ public class Stockpile extends WorldObject implements ITileThing, ISelectable { public String details() { return ""; } - - @Override - public void updatePosition(int x, int y) { - this.x = x; - this.y = y; - } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java b/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java index ac45f52..7bde8ee 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Tile.java @@ -35,7 +35,7 @@ public class Tile extends GameObject { public void start() { camera = get(Camera.class); - if(Math.random() > 0.9) { + if(Math.random() > 0.97) { Tree tree = new Tree(x, y); stuff.add(tree); add(tree); @@ -49,7 +49,6 @@ public class Tile extends GameObject { } public void placeThing(ITileThing thing) { - thing.updatePosition(x, y); stuff.add(thing); if(thing instanceof GameObject) { add((GameObject)thing); 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 7ba83fe..06a467d 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/BuildLayer.java @@ -35,7 +35,6 @@ public class BuildLayer extends GameObject implements IMouseCaptureArea { @Override public void render() { if(mouseDown && active) { - Assets.selectionFrame.draw(screenX, screenY, App.mouseX - screenX, App.mouseY - screenY); camera.screen2world(App.mouseX, App.mouseY); } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/tabs/BuildTab.java b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/BuildTab.java index 85d9c1e..b9e53ef 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/tabs/BuildTab.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/BuildTab.java @@ -2,11 +2,20 @@ package xyz.valnet.hadean.gameobjects.tabs; import static xyz.valnet.engine.util.Math.lerp; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.net.URL; import java.util.ArrayList; +import java.util.Collection; +import java.util.Enumeration; +import java.util.HashMap; import java.util.List; +import java.util.Map; import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.math.Vector4f; +import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.IMouseCaptureArea; import xyz.valnet.hadean.gameobjects.BottomBar; import xyz.valnet.hadean.gameobjects.Camera; @@ -14,15 +23,21 @@ import xyz.valnet.hadean.gameobjects.Terrain; import xyz.valnet.hadean.gameobjects.inputlayer.BuildLayer; import xyz.valnet.hadean.gameobjects.inputlayer.Selection; import xyz.valnet.hadean.gameobjects.worldobjects.FarmPlot; +import xyz.valnet.hadean.input.Button; +import xyz.valnet.hadean.input.IButtonListener; +import xyz.valnet.hadean.input.SimpleButton; +import xyz.valnet.hadean.interfaces.BuildableMetadata; import xyz.valnet.hadean.interfaces.IBuildLayerListener; +import xyz.valnet.hadean.interfaces.IBuildable; import xyz.valnet.hadean.interfaces.ISelectable; import xyz.valnet.hadean.interfaces.ISelectionChangeListener; import xyz.valnet.hadean.interfaces.ITileThing; import xyz.valnet.hadean.util.Assets; import xyz.valnet.hadean.util.Layers; +import xyz.valnet.hadean.util.Pair; import xyz.valnet.hadean.util.SmartBoolean; -public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCaptureArea { +public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCaptureArea, IButtonListener { private Selection selection; private BuildLayer buildLayer; @@ -30,23 +45,70 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap private Terrain terrain; private SmartBoolean opened; - private float progress = 0f; - private float width = 200; + private int width = 200; private int padding = 10; private int x, y; private int w, h; + // private List categories = new ArrayList(); + + private String selectedCategory = "Zones"; + + private List> things = new ArrayList>(); + private Constructor selectedBuildable = null; + + private Map>>> buildables = new HashMap>>>(); + + private int height = 0; + + private void calculateBuildables() { + try { + Class[] maybeBuildables = getClasses("xyz.valnet.hadean"); + + for(Class clazz : maybeBuildables) { + if(clazz.isAnonymousClass()) continue; + if(!IBuildable.class.isAssignableFrom(clazz)) continue; + if(clazz.isInterface()) continue; + + Constructor constructor = clazz.getConstructor(); + if(constructor.getParameterCount() != 0) { + System.out.println(clazz + " has no default constructor (no params)"); + continue; + } + BuildableMetadata annotation = clazz.getAnnotation(BuildableMetadata.class); + if(annotation == null) { + System.out.println(clazz + " has no buildable data annotation"); + continue; + } + String category = annotation.category(); + String name = annotation.name(); + + if(!buildables.containsKey(category)) + buildables.put(category, new ArrayList>>()); + buildables.get(category).add(new Pair>(name, constructor)); + + selectedBuildable = constructor; + + System.out.println("Added " + category + " / " + name); + } + + } catch (Exception e) { + System.out.println(e); + } + + height = Math.max((int)Math.ceil(buildables.size() / 2f) * 24, 24*3); + } + @Override - public void render() { + public void renderAlpha () { Drawing.setLayer(Layers.GENERAL_UI); - float left = lerp(-width - padding, padding, progress); - Assets.uiFrame.draw((int) left, padding, (int) width, 576 - padding * 2 - BottomBar.bottomBarHeight); if(opened.value()) { + Assets.uiFrame.draw(padding, 576 - BottomBar.bottomBarHeight - padding - height, width, height); // draw the currently selected build item - Assets.flat.pushColor(new Vector4f(1f, 1f, 1f, 0.8f)); + Assets.flat.pushColor(new Vector4f(1f, 1f, 1f, 0.5f)); for(int i = 0; i < w; i ++) for(int j = 0; j < h; j ++) {{ camera.draw(Layers.BUILD_INTERACTABLE, Assets.stockpile, x + i, y + j); }} @@ -61,8 +123,32 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap selection = get(Selection.class); camera = get(Camera.class); terrain = get(Terrain.class); - - IBuildLayerListener buildListener = new IBuildLayerListener() { + + opened = new SmartBoolean(false, new SmartBoolean.IListener() { + + @Override + public void rise() { + activate(); + } + + @Override + public void fall() { + deactiveate(); + } + + }); + + if(selection != null) { + selection.subscribe(this); + } + + calculateBuildables(); + } + + private List