diff --git a/idea.md b/idea.md new file mode 100644 index 0000000..b8f5f0b --- /dev/null +++ b/idea.md @@ -0,0 +1,22 @@ +# Job Board + +A job board is a class whos main function +is a map from pawns (IWorkers?) to jobs (IWorkables) + +the intention is that a pawn or job does not know, itself +what its doing, but contacts the job board each frame +to get what its current job is. + +when a IWorkable begins to have work, it may post itself +to the board, and when it is finished it will remove itself +from the board, by sending messages to the board. + +IWorkers on the other hand, are able to request a job +from the board, and once they have it, will wimply ask +the board for its current job each from, to attempt to do +work. at some point, the board will simply start returning +null instead of the IWorker's current job. to is when the +worker knows it can move on to another action. + +A Worker may also tell a job board, that it no longer +wishes to do work, and the job will be released. \ No newline at end of file diff --git a/src/main/java/xyz/valnet/hadean/HadeanGame.java b/src/main/java/xyz/valnet/hadean/HadeanGame.java index c775375..5ec4452 100644 --- a/src/main/java/xyz/valnet/hadean/HadeanGame.java +++ b/src/main/java/xyz/valnet/hadean/HadeanGame.java @@ -2,6 +2,7 @@ package xyz.valnet.hadean; import xyz.valnet.engine.App; import xyz.valnet.engine.Game; +import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.math.Matrix4f; import xyz.valnet.engine.math.Vector4f; @@ -24,7 +25,9 @@ public class HadeanGame extends Game { @Override public void render() { + Drawing.setLayer(0); super.render(); + Drawing.setLayer(99); renderDebugInfo(); } @@ -32,6 +35,7 @@ public class HadeanGame extends Game { private static Vector4f fontColor = new Vector4f(0, 1, 1, 1); private void renderDebugInfo() { + long allocated = runtime.totalMemory(); long max = runtime.maxMemory(); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/BottomBar.java b/src/main/java/xyz/valnet/hadean/gameobjects/BottomBar.java new file mode 100644 index 0000000..d049aea --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/gameobjects/BottomBar.java @@ -0,0 +1,67 @@ +package xyz.valnet.hadean.gameobjects; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.input.Button; +import xyz.valnet.hadean.input.IButtonListener; +import xyz.valnet.hadean.input.SimpleButton; + +public class BottomBar extends GameObject implements IButtonListener { + public static final int bottomBarHeight = 32; + private int screenWidth = 1024; + + private Map btnItemTable = new HashMap(); + + private List items = new ArrayList(); + + @Override + public void start() { + items.clear(); + btnItemTable.clear(); + } + + public void registerButton(IBottomBarItem newItem) { + btnItemTable.clear(); + items.add(newItem); + int n = items.size(); + + int i = 0; + for(IBottomBarItem item : items) { + int l = (int)((i / (float) n) * screenWidth); + int r = (int)(((i + 1) / (float) n) * screenWidth); + + int w = r - l; + Button btn = new SimpleButton(item.getTabName(), l, 576 - bottomBarHeight, w, bottomBarHeight); + + btn.registerClickListener(this); + + btnItemTable.put(btn, item); + + i++; + } + } + + @Override + public void render() { + for(Button btn : btnItemTable.keySet()) { + btn.draw(); + } + } + @Override + public void tick(float dTime) { + for(Button btn : btnItemTable.keySet()) { + btn.update(); + } + } + + @Override + public void click(Button target) { + if(btnItemTable.containsKey(target)) { + btnItemTable.get(target).evoke(); + } + } +} diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/IBottomBarItem.java b/src/main/java/xyz/valnet/hadean/gameobjects/IBottomBarItem.java new file mode 100644 index 0000000..7914826 --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/gameobjects/IBottomBarItem.java @@ -0,0 +1,7 @@ +package xyz.valnet.hadean.gameobjects; + +public interface IBottomBarItem { + public void evoke(); + + public String getTabName(); +} diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/ISelectable.java b/src/main/java/xyz/valnet/hadean/gameobjects/ISelectable.java index 6b2ecf2..47107d0 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/ISelectable.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/ISelectable.java @@ -8,4 +8,5 @@ public interface ISelectable { public Action[] getActions(); public void runAction(Action action); public String details(); + public default void selectedRender() {} } \ No newline at end of file diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java b/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java index eb8579e..650db6e 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Pawn.java @@ -47,6 +47,26 @@ public class Pawn extends GameObject implements ISelectable { pathfinder = new AStarPathfinder(terrain); } + @Override + public void selectedRender() { + if(path != null) { + for(Node node : path) { + glBegin(GL_LINES); + Vector2f u, v; + + if(node.from == null) u = camera.world2screen(x, y); + else u = camera.world2screen(node.from.x + 0.5f, node.from.y + 0.5f); + + v = camera.world2screen(node.x + 0.5f, node.y + 0.5f); + glVertexAttrib2f(SimpleShader.TEX_COORD, 0, 88 / 256f); + glVertex3f(u.x, u.y, 3f); + glVertexAttrib2f(SimpleShader.TEX_COORD, 0, 88 / 255f); + glVertex3f(v.x, v.y, 3f); + glEnd(); + } + } + } + @Override public void render() { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java b/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java index 0dbedc8..2d96b7b 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Selection.java @@ -85,6 +85,7 @@ public class Selection extends GameObject { Vector2f min = camera.world2screen(box.x - p, box.y - p); Vector2f max = camera.world2screen(box.z + p, box.w + p); Assets.selectedFrame.draw((int)min.x, (int)min.y, (int)(max.x - min.x), (int)(max.y - min.y)); + thing.selectedRender(); } if(initialCoords != null) { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java b/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java index 27ca4d1..e7adc50 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java @@ -1,10 +1,8 @@ package xyz.valnet.hadean.gameobjects; -import xyz.valnet.engine.graphics.Drawing; import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.hadean.Tile; import xyz.valnet.hadean.pathfinding.IPathable; -import xyz.valnet.hadean.scenes.GameScene; // TODO SPLIT PATHABLES. | implements IPathable, the thing that has callbacks for interfacing with a pathfinder. public class Terrain extends GameObject implements IPathable { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/tabs/ArchitectTab.java b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/ArchitectTab.java new file mode 100644 index 0000000..ac061ff --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/ArchitectTab.java @@ -0,0 +1,66 @@ +package xyz.valnet.hadean.gameobjects.tabs; + +import java.util.ArrayList; +import java.util.List; + +import xyz.valnet.hadean.gameobjects.BottomBar; +import xyz.valnet.hadean.gameobjects.ISelectable; +import xyz.valnet.hadean.gameobjects.ISelectionChangeListener; +import xyz.valnet.hadean.gameobjects.Selection; +import xyz.valnet.hadean.util.Assets; + +import static xyz.valnet.engine.util.Math.lerp; + +public class ArchitectTab extends Tab implements ISelectionChangeListener { + + private Selection selection; + + private boolean opened = false; + private float progress = 0f; + private float width = 200; + + private int padding = 10; + + private float toRange(float n, float a, float b) { + float l = b - a; + float p = n * l; + return a + p; + } + + @Override + public void render() { + float x = toRange(progress, -width - padding, padding); + Assets.uiFrame.draw((int) x, padding, (int) width, 576 - padding * 2 - BottomBar.bottomBarHeight); + } + + @Override + public void start() { + super.start(); + selection = get(Selection.class); + selection.subscribe(this); + } + + @Override + public void tick(float dTime) { + progress = lerp(progress, opened ? 1 : 0, 0.05f); + } + + @Override + public void selectionChanged(List selected) { + if(selected.isEmpty()) return; + opened = false; + } + + @Override + public void evoke() { + opened = !opened; + if(opened) { + selection.updateSelection(new ArrayList()); + } + } + + @Override + public String getTabName() { + return "Build"; + } +} diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/tabs/MenuTab.java b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/MenuTab.java new file mode 100644 index 0000000..17f5c30 --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/MenuTab.java @@ -0,0 +1,15 @@ +package xyz.valnet.hadean.gameobjects.tabs; + +public class MenuTab extends Tab { + + @Override + public void evoke() { + + } + + @Override + public String getTabName() { + return "Menu"; + } + +} diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/tabs/Tab.java b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/Tab.java new file mode 100644 index 0000000..e268c5d --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/gameobjects/tabs/Tab.java @@ -0,0 +1,16 @@ +package xyz.valnet.hadean.gameobjects.tabs; + +import xyz.valnet.engine.scenegraph.GameObject; +import xyz.valnet.hadean.gameobjects.BottomBar; +import xyz.valnet.hadean.gameobjects.IBottomBarItem; + +public abstract class Tab extends GameObject implements IBottomBarItem { + + private BottomBar bottombar; + + @Override + public void start() { + bottombar = get(BottomBar.class); + bottombar.registerButton(this); + } +} diff --git a/src/main/java/xyz/valnet/hadean/scenes/GameScene.java b/src/main/java/xyz/valnet/hadean/scenes/GameScene.java index 9294ed6..7e0eae1 100644 --- a/src/main/java/xyz/valnet/hadean/scenes/GameScene.java +++ b/src/main/java/xyz/valnet/hadean/scenes/GameScene.java @@ -5,11 +5,14 @@ import java.util.List; import xyz.valnet.engine.scenegraph.GameObject; import xyz.valnet.engine.scenegraph.IScene; +import xyz.valnet.hadean.gameobjects.BottomBar; import xyz.valnet.hadean.gameobjects.Camera; import xyz.valnet.hadean.gameobjects.Pawn; import xyz.valnet.hadean.gameobjects.Selection; import xyz.valnet.hadean.gameobjects.SelectionUI; import xyz.valnet.hadean.gameobjects.Terrain; +import xyz.valnet.hadean.gameobjects.tabs.ArchitectTab; +import xyz.valnet.hadean.gameobjects.tabs.MenuTab; public class GameScene implements IScene { @@ -84,6 +87,9 @@ public class GameScene implements IScene { objects.add(new Camera()); objects.add(new Selection()); objects.add(new SelectionUI()); + objects.add(new BottomBar()); + objects.add(new ArchitectTab()); + objects.add(new MenuTab()); for(GameObject obj : objects) { obj.link(this);