From 9b12ee74177c7a1ec79df589a1ac19e7399b1733 Mon Sep 17 00:00:00 2001 From: Ivory Date: Wed, 11 Jan 2023 05:09:35 -0500 Subject: [PATCH] quarrys exist and work, but are a little buggy... --- res/textures.png | Bin 29168 -> 29484 bytes .../java/xyz/valnet/engine/math/Vector2i.java | 16 ++ .../xyz/valnet/hadean/gameobjects/Camera.java | 4 + .../inputlayer/SelectionLayer.java | 15 +- .../hadean/gameobjects/ui/tabs/BuildTab.java | 3 + .../gameobjects/worldobjects/Buildable.java | 25 ++- .../gameobjects/worldobjects/Stockpile.java | 6 +- .../worldobjects/agents/Agent.java | 5 + .../worldobjects/constructions/Bed.java | 2 +- .../worldobjects/constructions/Quarry.java | 143 ++++++++++++++++++ .../worldobjects/constructions/Wall.java | 15 +- .../valnet/hadean/interfaces/ISelectable.java | 20 +++ .../valnet/hadean/interfaces/IWorkable.java | 4 +- 13 files changed, 241 insertions(+), 17 deletions(-) create mode 100644 src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Quarry.java diff --git a/res/textures.png b/res/textures.png index e7b56410bf26b4cfde576e07a8005a23e4965784..311d2587a68f778bb7a7adcca214c3c58dfecd27 100644 GIT binary patch delta 20102 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

g?x9&s;n-)j)Dn$t+O zWJg$@!E2ZN{f&)<-cMg1Gh~wJ>C^7`7>>! zYH~3%9C4YY#>e-r-_L5@g)cD2W=B=eUk&=ot(YU-55szxEtR%$bo5wbqAzs zj4L(asRFp=Ooft&p%mrwk{`jG=q^b0aUB{<8Dy1@!!8q=1kBem6UuO46}Y~X=bt*%+p9^Em?F&z zWz|2q8Yj4ybQBT$P^d`mlcET)L8=JkBe7bixHnoWJ;w;=3=KWFJK&6DWSQbk2Z%yJ zn>@zk%?E>wIyWL3(;`(vPi;MMPILiXg`}n%47`$wZveej`6y09TLdkrs2GWI_(H;` zJnvU^=i~ygfhgo=8`OHebc>hEk$QDZ`Q zgz0|CB=1%?17JUJh7a*BiRzNXFX?mUPufG@ybLUHYqTbKpCoRr;{N0txbNbo`JwZQKDpj zTIgtkvBIAVoL*!WE$fs%4f&Z#JABlt!lG`Cs+34@ovEoZH$-p1DKofJ@=*I^(Z|k* z_2JrHvc@Zn7T#=2YY;VF9z)8Ab-3yng)k@ekK4)jTO4)tbe(Q6^9bF`WfT#P~%QG%Cl%qa5-W*_=Dgga>xbFENV zb;U|Zzl^k`r`t_1MCRp-Gzcf^4@5E|Uju?3EqL{t-OQek-;Uz)w0lvl)> zo1QqL8hVqRl!q55twagSM3A;Cl7LKAcVuNzyF;Qk((fOO(XQBb+7&TSRZ#h?p?zb? zHHC`z+m5gpcfDzJDEzIo-mNj(Ua}B#iunDGM%Coj@eZ3mT zh6-USSmtPaW`5_D(3R!ap>N z#~uffyg!5(Q?h6xmEX?kd%Q83Q!0A*YY~G&aod*2+3O~Q#7A*Ykf09=A;hFCXMTu3 zWq#9fcy#6}Tt#CR<4U4|(Osh=KExr1N$JDX78!SFS26D^d#sfdnPXvZvk|$4*iX(W z_NtJbT#L3+T~|6pQ~|F^bA){s&#n-9r_DLJ`kRnhQcyG4n3evl6B=uhQd)CqaGq&1 zd`X9FQ}|j9oMP){SFcpqVjlGi_c8MJ8X@sYR#1zyqk{x$xbDZnOHAPhtg%{-;iL6h z#GCs|dZ%3Pi+Wdi!=PQ^WPFU@#swDg@G@&23k`?$$OsH@a@TMy`Du)+jVYpG5uuEA z7^+pmQe5K(F-#Y%(qO8*rJ(K@c)P8z(wc&)tYY&5Q@~Xb>mg}|1H8n2KMd+#XB@Wn zCbw%%g}txL4|5@KtS@Un%VR4OL%4R31xe%CDc>+c5nOY~kWQ=8;9bzE5!r~~ii`l! zS+(!XbfaA?;1||cX{j5@b_-7?spbxXuM^tY*>XHEQt4L6oG1IvBLuVI+cQWg8fcsa z&CoN0twLfxsv5h>f9HMG@$ot@_yi3GHvYP(Ja^m8xor;MYpFA?p<>d}DjUJAzz_pX z1ej*nVg)ZZ(JCr*24c8$IF^3Ls$*{r!?^V*nhHUX*A?iBFj(lj>M3YDqDb&C4W)Xu zoXX%cr*}Z7deaf1I%Q{7cRv8j^n5T>rbRWd(?K}{i^ue19Bqe=MjcWmLV7OiuFz&U zZC-t_Lgg&DYCaJ0o_%I8Mua>dHe@z0sKCPY^+Oczs>3J%6)Qt!f%e1{?53%>J|0z3 zsp>B;d7q>nuJGa!{dt7uG3IUeT!C{u8dLKH2e07qJJ6@&q%mxcUQ7fW{JA_^>*pR+j#Z@dt5(ZCIq{%q zViEEhpWgYh!taX0=|0S;1h#HUElmbpNqvcD^E8rXAvK^_{I-C3-I@d7jF~Irbk{-+ zrn<7ih%7+^FLY_KU_3AAC|TpIbz{3XtaY*MST%+Ry|@l^Ih!dtwklwJX~r((QvZvV%giyH zU|a(kwW_rAa03WH^?Ox||C`!u?+$9v{%3YSCSxo__t6N~T!2?oN;-0h#pz%^!v&_a zYnWZtl|cYhfG=o9(j-(r-etu&xpF)k(*_BwdbSS#o{Q?Rf~ zq>2`ofHg})PPi$GKS%cOEMCV17Z%AwJD=fJ1ZE?Vw9Kg=kF?^2_oCFa;=Qu zE}irt-LT@)2tv4VOJEpCON+kCZRuKwnr)&T5mm*LnvAT%l0i?vfse@qr8}IVE2})1 zJBIA@h7>7lANi~ey*FhbwxWpI<{S;ox)u;9b5xE0%}1EZ`LFTpP8lc7+bGPRZ@x~m z^e$|c8`R1%ZM^kh*JD=d;h|d{jB>R-dZ$RHO0F*zW&miAR6o{% z`ax+d9y}SwfSHf#GVBAchZqo_H-JE`9eD28n*Pa_9`i#ORw!>#`AvfYJ~ND4X6KYL zqsNMM(ugUcSH~B3cZ9)=oILg4YMh$Ei;&dlPr3DiD990BYKKH7vDgV$@$*{Xw~w<1 zBwD|0Hij3Bwj=&+xS0z$;t@!X+(#iiur3f&08;$NC;$9@dh`>j+V2+(xVRh*TGY8( zM@3AB0e_3LD`LnEnp7$&Ydxp6zZ)VNR&Gme0_-a*NVTX|yztZ!H-ByliPfzr31pP! zAXlk1p%{Bwmi?wEkQG<;>#6qut9i=AM@|5?5cPsZPm^*VU)vcp;+o`>RXRg;gXMeG zPlqF}d8Eh@&$eSv?VIM;lR$?i5teki(W`Y_p}x7s7Q4Uy*h0E=YzgZtTy`m`wQQyC z1@!p}LU94WE0B5j$QLsYo6~9w%F6XhSsIb0?}rY#)Ify*8dbUrZ89VMYJABt^3^ZuUt5BJ2nJ5C}c=7h3EmY7@@_0)h1 zwf%@u_?>tq-M4)}`Jw?BAzVAryuSZ73A`XNLgvA#bJz}YO8NL$j?P*Ea~;>pdG4Lf zqmdt*%V-eo9jjM$wQdf5b?E+Wz9721$XFDh(F9rBb{~{GK;Ud`6}?GgM5rUpO@hkb z2%6A+%zc?lW+sc)$YWvD(Mf$aZcV%VDM;~;XcOEx23c??go%SwZyi4fVxBtY!o+Xe zAYm1?%kysO5Rf<>wooHz?W}SNi&CG})p-nPX%>R344EMfsJ{_vF8G*g+R_X)_pi0S zA_`#?N$-r_B7S?Qo7O0fB@fC!+*%HPFxYkU6iDGp(bu@cV~AFsQZu==$kIbw8}C0Z z|Ji1uB?~Pl)$s*43ff_7p@V*VGu)jwcPlG+{>irO`aHhDp0=fgBxtMdr65%Om@U7_ z)X@A=2l2f$&g96xFY~kNc38^4NE3Yjbd~sL+<t%syj%bqPSl&WVp3rNVw9*Q{ z=b4w*GA+9`52!?Fn2S`mVJfP`z?!)&`mAXPw*{kynFtB2IHou><1cFJDj$bmP2f(8 zTyP$uKP_6q-N&~!Bk#PpKviag^8-B<55_!4$0$5m3nj+xV_4*x)EMGr#G_0NHggFglMkAiVOLCHA)Jen7WIuDg<{99-V`nI1ijkGSsg_QwyYW}{@I}5

o+n)C~LHLUf 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 GNc=a!PMK-| diff --git a/src/main/java/xyz/valnet/engine/math/Vector2i.java b/src/main/java/xyz/valnet/engine/math/Vector2i.java index 80fe92d..9755b87 100644 --- a/src/main/java/xyz/valnet/engine/math/Vector2i.java +++ b/src/main/java/xyz/valnet/engine/math/Vector2i.java @@ -39,4 +39,20 @@ public class Vector2i implements Serializable { return new Vector2f(x, y); } + public Vector2i north() { + return new Vector2i(x, y - 1); + } + + public Vector2i east() { + return new Vector2i(x + 1, y); + } + + public Vector2i south() { + return new Vector2i(x, y + 1); + } + + public Vector2i west() { + return new Vector2i(x - 1, y); + } + } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java index 4cb7cc6..281757e 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java @@ -76,6 +76,10 @@ public class Camera extends GameObject { draw(layer, sprite, pos.x, pos.y, 1, 1); } + public void draw(float layer, Sprite sprite, Vector4i pos) { + draw(layer, sprite, pos.x, pos.y, pos.z, pos.w); + } + public void draw(float layer, Sprite sprite, float x, float y, float w, float h) { Vector2f screenPos = world2screen(x, y); Drawing.setLayer(layer + (((y + h) - minY) / (maxY - minY))); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java index 417c6d8..75970ff 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/inputlayer/SelectionLayer.java @@ -115,6 +115,8 @@ public class SelectionLayer extends GameObject implements IMouseCaptureArea, ITr List selectables = getAll(ISelectable.class); + int prio = Integer.MIN_VALUE; + for(ISelectable thing : selectables) { Vector4f thingBox = thing.getWorldBox(); if(rectanglesIntersect( @@ -123,7 +125,18 @@ public class SelectionLayer extends GameObject implements IMouseCaptureArea, ITr thingBox.x, thingBox.y, thingBox.z, thingBox.w )) { - newSelection.add(thing); + System.out.println("Considering selecting " + thing); + int thingPrio = thing.getSelectPriority().toValue(); + if(thingPrio > prio) { + newSelection.clear(); + prio = thingPrio; + System.out.println("updated prio to " + prio); + System.out.println("List cleared"); + } + if(thingPrio >= prio) { + System.out.println("added " + thing); + newSelection.add(thing); + } } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java b/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java index fb90606..acf356d 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/ui/tabs/BuildTab.java @@ -20,6 +20,7 @@ import xyz.valnet.hadean.gameobjects.inputlayer.SelectionLayer; import xyz.valnet.hadean.gameobjects.worldobjects.FarmPlot; import xyz.valnet.hadean.gameobjects.worldobjects.Stockpile; import xyz.valnet.hadean.gameobjects.worldobjects.constructions.Bed; +import xyz.valnet.hadean.gameobjects.worldobjects.constructions.Quarry; import xyz.valnet.hadean.gameobjects.worldobjects.constructions.Wall; import xyz.valnet.hadean.input.Button; import xyz.valnet.hadean.input.IButtonListener; @@ -62,6 +63,8 @@ public class BuildTab extends Tab implements ISelectionChangeListener, IMouseCap BuildTab.registerBuildable(Bed.class); BuildTab.registerBuildable(Wall.class); + + BuildTab.registerBuildable(Quarry.class); BuildTab.registerBuildable(FarmPlot.class); BuildTab.registerBuildable(Stockpile.class); diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Buildable.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Buildable.java index 4567862..009bc0e 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Buildable.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Buildable.java @@ -3,11 +3,14 @@ package xyz.valnet.hadean.gameobjects.worldobjects; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.hadean.gameobjects.Tile; import xyz.valnet.hadean.interfaces.IBuildable; +import xyz.valnet.hadean.interfaces.ISelectable; import xyz.valnet.hadean.interfaces.ITileThing; +import xyz.valnet.hadean.util.Action; +import xyz.valnet.hadean.util.detail.Detail; -public abstract class Buildable extends WorldObject implements IBuildable, ITileThing { +public abstract class Buildable extends WorldObject implements IBuildable, ITileThing, ISelectable { - protected Vector2i getDefaultDimensions() { + protected Vector2i getDimensions() { return new Vector2i(1, 1); } @@ -18,10 +21,26 @@ public abstract class Buildable extends WorldObject implements IBuildable, ITile @Override public void buildAt(int x, int y) { - Vector2i dim = getDefaultDimensions(); + Vector2i dim = getDimensions(); setPosition(x, y, dim.x, dim.y); } @Override public void onPlaced(Tile tile) {} + + @Override + public Action[] getActions() { + // TODO Auto-generated method stub + return new Action[] {}; + } + + @Override + public void runAction(Action action) { + + } + + @Override + public Detail[] getDetails() { + return new Detail[] {}; + } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Stockpile.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Stockpile.java index ec318f2..1f40861 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Stockpile.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/Stockpile.java @@ -14,7 +14,7 @@ import xyz.valnet.hadean.util.Layers; import xyz.valnet.hadean.util.detail.Detail; @BuildableMetadata(category = "Zones", name = "Stockpile") -public class Stockpile extends Buildable implements ISelectable { +public class Stockpile extends Buildable { @Override public void render() { @@ -81,4 +81,8 @@ public class Stockpile extends Buildable implements ISelectable { @Override public void onPlaced(Tile tile) {} + @Override + public ISelectable.Priority getSelectPriority() { + return ISelectable.Priority.LOW; + } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java index 44e5d97..67b6653 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/agents/Agent.java @@ -203,6 +203,11 @@ public abstract class Agent extends WorldObject implements ISelectable { return new Action[0]; } + @Override + public ISelectable.Priority getSelectPriority() { + return ISelectable.Priority.HIGH; + } + public Vector2i getDestination() { if(nextPath != null) return nextPath.getDestination().getPosition(); if(path == null) return null; diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Bed.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Bed.java index 15498d8..3c666fb 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Bed.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Bed.java @@ -30,7 +30,7 @@ public class Bed extends Buildable implements IItemReceiver, IWorkable, ISelecta private Job job = null; @Override - protected Vector2i getDefaultDimensions() { + protected Vector2i getDimensions() { return new Vector2i(1, 2); } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Quarry.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Quarry.java new file mode 100644 index 0000000..ef74e1f --- /dev/null +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Quarry.java @@ -0,0 +1,143 @@ +package xyz.valnet.hadean.gameobjects.worldobjects.constructions; + +import xyz.valnet.engine.math.Vector2i; +import xyz.valnet.engine.math.Vector4f; +import xyz.valnet.hadean.gameobjects.Job; +import xyz.valnet.hadean.gameobjects.JobBoard; +import xyz.valnet.hadean.gameobjects.worldobjects.Buildable; +import xyz.valnet.hadean.gameobjects.worldobjects.items.Boulder; +import xyz.valnet.hadean.interfaces.BuildableMetadata; +import xyz.valnet.hadean.interfaces.IWorkable; +import xyz.valnet.hadean.util.Assets; +import xyz.valnet.hadean.util.Layers; + +@BuildableMetadata(category = "Buildings", name = "Quarry", type = BuildableMetadata.Type.SINGLE) +public class Quarry extends Buildable { + + private float work = 0; + private static float MAX_WORK = 10000; + + private Job digJob = null; + + @Override + public void create() { + super.create(); + get(JobBoard.class).postSimpleWorkJob("Build Quarry", new IWorkable() { + @Override + public boolean doWork(float dTime) { + work += dTime; + return isBuilt(); + } + + @Override + public Vector2i[] getWorkablePositions() { + return new Vector2i[] { + getWorldPosition().xy().south().east() + }; + } + + @Override + public String getJobName() { + return "Build Quarry"; + } + }); + } + + @Override + public void render() { + if(isBuilt()) { + camera.draw(Layers.TILES, Assets.quarry, getWorldPosition()); + + if(digJob != null && !digJob.isCompleted()) { + camera.drawProgressBar(digProgress, getWorldBox()); + } + + } else { + float p = work / MAX_WORK; + float b = 4; + + Assets.flat.pushColor(new Vector4f(b, b, b, 0.5f)); + camera.draw(Layers.GROUND, Assets.quarry, getWorldPosition()); + Assets.flat.popColor(); + + camera.drawProgressBar(p, getWorldBox()); + } + } + + @Override + public Vector2i getDimensions() { + return new Vector2i(3, 3); + } + + private float digProgress = 0; + + private void tryCreateDigJob() { + if(!isBuilt()) return; + if (digJob != null) return; + if (terrain.getTile(getWorldPosition().xy().south().east()).has(Boulder.class)) return; + + digJob = get(JobBoard.class) + .postSimpleWorkJob("Mine at Quarry", new IWorkable() { + + private static float MAX_WORK = 5000; + private float work = 0; + + @Override + public boolean doWork(float dTime) { + work += dTime; + digProgress = work / MAX_WORK; + return work >= MAX_WORK; + } + + @Override + public Vector2i[] getWorkablePositions() { + return new Vector2i[] { + getWorldPosition().xy().south().east() + }; + } + + @Override + public String getJobName() { + return "Mine at Quarry"; + } + + }); + digJob.registerClosedListener(() -> { + digProgress = 0; + Vector2i dropPos = getWorldPosition().xy().south().east(); + Boulder boulder = new Boulder(dropPos.x, dropPos.y); + add(boulder); + boulder.runAction(Boulder.HAUL); + digJob = null; + }); + } + + @Override + public void update(float dTime) { + super.update(dTime); + tryCreateDigJob(); + } + + private boolean isBuilt() { + return work >= MAX_WORK; + } + + @Override + public boolean isWalkable() { + return true; + } + + @Override + public boolean shouldRemove() { + return false; + } + + @Override + public void onRemove() { + } + + @Override + public String getName() { + return "Quarry"; + } +} diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java index a606a14..7d629ce 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/worldobjects/constructions/Wall.java @@ -100,15 +100,10 @@ public class Wall extends Buildable implements IItemReceiver, IWorkable, ISelect private Vector2i[] getBorders() { Vector2i pos = getWorldPosition().xy(); return new Vector2i[] { - new Vector2i(pos.x, pos.y - 1), - - new Vector2i(pos.x - 1, pos.y), - new Vector2i(pos.x + 1, pos.y), - - new Vector2i(pos.x - 1, pos.y + 1), - new Vector2i(pos.x + 1, pos.y + 1), - - new Vector2i(pos.x, pos.y + 2), + pos.north(), + pos.east(), + pos.south(), + pos.west() }; } @@ -152,7 +147,7 @@ public class Wall extends Buildable implements IItemReceiver, IWorkable, ISelect @Override public boolean isWalkable() { - return false; + return isBuilt(); } @Override diff --git a/src/main/java/xyz/valnet/hadean/interfaces/ISelectable.java b/src/main/java/xyz/valnet/hadean/interfaces/ISelectable.java index aaaaff5..3a6bccd 100644 --- a/src/main/java/xyz/valnet/hadean/interfaces/ISelectable.java +++ b/src/main/java/xyz/valnet/hadean/interfaces/ISelectable.java @@ -5,9 +5,29 @@ import xyz.valnet.hadean.util.Action; import xyz.valnet.hadean.util.detail.Detail; public interface ISelectable { + + public enum Priority { + LOW(-10), + NORMAL(0), + HIGH(10); + + private int value; + + Priority(int value) { + this.value = value; + } + + public int toValue() { + return value; + } + } + public Vector4f getWorldBox(); public Action[] getActions(); public void runAction(Action action); public Detail[] getDetails(); public default void selectedRender() {} + public default Priority getSelectPriority() { + return Priority.NORMAL; + } } \ No newline at end of file diff --git a/src/main/java/xyz/valnet/hadean/interfaces/IWorkable.java b/src/main/java/xyz/valnet/hadean/interfaces/IWorkable.java index bdcef68..ae59cf4 100644 --- a/src/main/java/xyz/valnet/hadean/interfaces/IWorkable.java +++ b/src/main/java/xyz/valnet/hadean/interfaces/IWorkable.java @@ -1,8 +1,10 @@ package xyz.valnet.hadean.interfaces; +import java.io.Serializable; + import xyz.valnet.engine.math.Vector2i; -public interface IWorkable { +public interface IWorkable extends Serializable { public boolean doWork(float dTime); public Vector2i[] getWorkablePositions(); public String getJobName();