From 0f8168324fac173b03d98a74117014663fc0694c Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 18 Mar 2018 22:30:33 -0400 Subject: [PATCH] Removed old maps, re-added map editor, broke compilation again --- core/assets/maps/arena.png | Bin 2085 -> 0 bytes core/assets/maps/blankmap.png | Bin 757 -> 0 bytes core/assets/maps/caldera.png | Bin 6852 -> 0 bytes core/assets/maps/canyon.png | Bin 2875 -> 0 bytes core/assets/maps/caves.png | Bin 5411 -> 0 bytes core/assets/maps/delta.png | Bin 2506 -> 0 bytes core/assets/maps/desert.png | Bin 7489 -> 0 bytes core/assets/maps/fortress.png | Bin 6521 -> 0 bytes core/assets/maps/grassland.png | Bin 3511 -> 0 bytes core/assets/maps/island.png | Bin 8238 -> 0 bytes core/assets/maps/maps.json | 95 ---- core/assets/maps/maze.png | Bin 4312 -> 0 bytes core/assets/maps/oilrush.png | Bin 7871 -> 0 bytes core/assets/maps/pit.png | Bin 2502 -> 0 bytes core/assets/maps/scorch.png | Bin 10118 -> 0 bytes core/assets/maps/sinkhole.png | Bin 7466 -> 0 bytes core/assets/maps/spiral.png | Bin 2519 -> 0 bytes core/assets/maps/test1.png | Bin 744 -> 0 bytes core/assets/maps/test2.png | Bin 547 -> 0 bytes core/assets/maps/test3.png | Bin 1535 -> 0 bytes core/assets/maps/tundra.png | Bin 5020 -> 0 bytes core/assets/maps/tutorial.png | Bin 1311 -> 0 bytes core/assets/maps/volcano.png | Bin 8102 -> 0 bytes core/assets/version.properties | 2 +- core/src/io/anuke/mindustry/core/UI.java | 5 +- .../anuke/mindustry/editor/DrawOperation.java | 39 ++ .../io/anuke/mindustry/editor/EditorTool.java | 94 ++++ .../io/anuke/mindustry/editor/MapEditor.java | 81 ++++ .../mindustry/editor/MapEditorDialog.java | 421 ++++++++++++++++++ .../io/anuke/mindustry/editor/MapFilter.java | 244 ++++++++++ .../mindustry/editor/MapGenerateDialog.java | 105 +++++ .../anuke/mindustry/editor/MapLoadDialog.java | 73 +++ .../anuke/mindustry/editor/MapRenderer.java | 103 +++++ .../mindustry/editor/MapResizeDialog.java | 67 +++ .../anuke/mindustry/editor/MapSaveDialog.java | 75 ++++ .../io/anuke/mindustry/editor/MapView.java | 328 ++++++++++++++ .../mindustry/editor/OperationStack.java | 54 +++ .../io/anuke/mindustry/io/MapTileData.java | 25 +- core/src/io/anuke/mindustry/io/Maps.java | 64 ++- .../anuke/mindustry/world/WorldGenerator.java | 4 +- .../anuke/mindustry/server/ServerControl.java | 19 +- .../mindustry/server/mapgen/ProcGen.java | 2 +- 42 files changed, 1770 insertions(+), 130 deletions(-) delete mode 100644 core/assets/maps/arena.png delete mode 100644 core/assets/maps/blankmap.png delete mode 100644 core/assets/maps/caldera.png delete mode 100644 core/assets/maps/canyon.png delete mode 100644 core/assets/maps/caves.png delete mode 100644 core/assets/maps/delta.png delete mode 100644 core/assets/maps/desert.png delete mode 100644 core/assets/maps/fortress.png delete mode 100644 core/assets/maps/grassland.png delete mode 100644 core/assets/maps/island.png delete mode 100644 core/assets/maps/maps.json delete mode 100644 core/assets/maps/maze.png delete mode 100644 core/assets/maps/oilrush.png delete mode 100644 core/assets/maps/pit.png delete mode 100644 core/assets/maps/scorch.png delete mode 100644 core/assets/maps/sinkhole.png delete mode 100644 core/assets/maps/spiral.png delete mode 100644 core/assets/maps/test1.png delete mode 100644 core/assets/maps/test2.png delete mode 100644 core/assets/maps/test3.png delete mode 100644 core/assets/maps/tundra.png delete mode 100644 core/assets/maps/tutorial.png delete mode 100644 core/assets/maps/volcano.png create mode 100755 core/src/io/anuke/mindustry/editor/DrawOperation.java create mode 100644 core/src/io/anuke/mindustry/editor/EditorTool.java create mode 100644 core/src/io/anuke/mindustry/editor/MapEditor.java create mode 100644 core/src/io/anuke/mindustry/editor/MapEditorDialog.java create mode 100644 core/src/io/anuke/mindustry/editor/MapFilter.java create mode 100644 core/src/io/anuke/mindustry/editor/MapGenerateDialog.java create mode 100644 core/src/io/anuke/mindustry/editor/MapLoadDialog.java create mode 100644 core/src/io/anuke/mindustry/editor/MapRenderer.java create mode 100644 core/src/io/anuke/mindustry/editor/MapResizeDialog.java create mode 100644 core/src/io/anuke/mindustry/editor/MapSaveDialog.java create mode 100644 core/src/io/anuke/mindustry/editor/MapView.java create mode 100755 core/src/io/anuke/mindustry/editor/OperationStack.java diff --git a/core/assets/maps/arena.png b/core/assets/maps/arena.png deleted file mode 100644 index 9755ab4f8a019a56c7a70d44a44b42bf520d8447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2085 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 F697ToaXJ71 diff --git a/core/assets/maps/caldera.png b/core/assets/maps/caldera.png deleted file mode 100644 index c10907aadbd8d08aef7a5b46bf90b25324ea7267..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6852 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 diff --git a/core/assets/maps/canyon.png b/core/assets/maps/canyon.png deleted file mode 100644 index 7240a5a5f5cdcfd9d36049967d6b41e340d23d7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2875 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 diff --git a/core/assets/maps/caves.png b/core/assets/maps/caves.png deleted file mode 100644 index 1fc4865796976d1d98c6e39f5f84731ad723a023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5411 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 diff --git a/core/assets/maps/delta.png b/core/assets/maps/delta.png deleted file mode 100644 index c04d38eb493075cfcc22720868db13191b9ed623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2506 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 diff --git a/core/assets/maps/desert.png b/core/assets/maps/desert.png deleted file mode 100644 index 99488439a3b852dbf09aac9dd0c527e78bbe38f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7489 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 diff --git a/core/assets/maps/grassland.png b/core/assets/maps/grassland.png deleted file mode 100644 index 1c7e8060fe5c1f860680938f30c819fbcec6ef9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3511 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 diff --git a/core/assets/maps/island.png b/core/assets/maps/island.png deleted file mode 100644 index 1e5d911afc74a52a191b3d1ab066aeb35bb500d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8238 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 E0E2n6@c;k- diff --git a/core/assets/maps/oilrush.png b/core/assets/maps/oilrush.png deleted file mode 100644 index 43d4e2f851899e91e7ce3ceee758cc2e9d0e858d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7871 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 Rj)8%J!PC{xWt~$(698DC_cH(h diff --git a/core/assets/maps/pit.png b/core/assets/maps/pit.png deleted file mode 100644 index 58cc2fcc295cb25889f4634c86b39ca23458f9e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2502 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 diff --git a/core/assets/maps/sinkhole.png b/core/assets/maps/sinkhole.png deleted file mode 100644 index ebaffda376e722e26f222f7cb808598ce3b0a7e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7466 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 diff --git a/core/assets/maps/spiral.png b/core/assets/maps/spiral.png deleted file mode 100644 index dfe43fcbb441bb0fa5151024f1a37b479b053120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2519 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 diff --git a/core/assets/maps/test1.png b/core/assets/maps/test1.png deleted file mode 100644 index 88ab4328255de66c351269db3dda75367cfdf231..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 744 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_R+*pj^6T^Rm@;DWu&Co?cG za29w(7Bet#3xhBt!>l<_sm1mxA*kDDYjFfd4#xJHyX=jZ08=9Mrw z7o{eaq^2m8XO?6rxO@5rgg5euGcYg(c)B=-RNQ)d_n_}#2LZQ4^;=vTsh1hIKJhUW zabYji+`^!)(o&@Gab5ZG&wG|84E%EE?E;OeJkG8|vl&Hf3b{mBr!#cT zvS2;eHNX06aoC?bHw0Z6Qu3H*v&^VmEv&-uO~8TcNFKA015*Qo$8EM*90`0A7*6Ol zh;(?K@LiZcU;eWEFVaiekMiqz` zr!}!KFiyzQ^kCp*V3J_roUm*8y)dSfWpP@JTNs%d7*3SwHZTY+_}q}ncY$d_41=b@ zdl|6ihAp`X=3w)LH@!Z)aO<@^|J_|R&1v0cA94X^c7}w}C-Lfq_GTb=QY8N4I7QHLyf6aGqgMF<_b0z+f*VaL{N1$6U_O z-HQ8FU;NCzC8W^76QsD2!9{^VP-^YGQ-S^smWm4*W~LUT2Rstn_;mMFRl$1yD}s{} zSKnCqo!P~|P3(A_Sj%kjC@=4Z1fwl}I!r7xC9Ae-G5P4Zyq9ccn7p-nZ+j3E&$PrZ rS}hEW$-7nGaeMGFVu^MOv-{Phd)y}^9*AIIU|{fc^>bP0l+XkKR=@q1 diff --git a/core/assets/maps/test2.png b/core/assets/maps/test2.png deleted file mode 100644 index 0596dd6a00ac37d5d216524912f91a1fe3aaa311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_R+I14-?iy0WWg+Z8+Vb&Z8 z1_lQ95>H=O_J`cu!s`0>GToXO7#Ji=Tq8=H^K)}k^GX<;i&7IyQd1PlGfOfQ+&z5* z!W;R-85kJndb&7Y5kn-Z|56P4e?7@o?Ip^X})d{0shm_qBY> z?XQ>C+KSwMqRQaFz`?+%z`)YLAi%(c%-I#bdHRFk?6)8Guhn9>B)5z8!v@9=7Z^e0 z0Wjmj@$>AC3>*xf`9XT0*}u)$#31HyQk$WHRe+((mQ7864XXfySFARJP6I>08$*T$ z)(>~5{3(rQ;8tJ|spetWu)VeJ3(tXjMU&&dvpF#AU}pfkqkx~mfgwYJp-$oo6Ig5t z`+=YNj4TfAPj5;woV*%@$x1jBt_kU0+|z#(v)fr074{_q1r5exz{j0$sd_g$`kCf#Un zCCS0S_MS;bQ0&2vbdG6?e~KAS3v6R}$IWnnp~0G&!JfhJ)Lo_q?!NAcdeazUw(#9! gH=O_J=&20-T1Xd^h+R7+8BeT^vIyZoR!5TXf4y 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 MUHx3vIVCg!08@_wfdBvi diff --git a/core/assets/maps/tutorial.png b/core/assets/maps/tutorial.png deleted file mode 100644 index 88b8a8af046900fb69d315580a6beec95b69ed91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1311 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4kiW$2A`O3a~K#H*pj^6T^Rm@;DWu&Co?cG za29w(7Bet#3xhBt!>l<@Xk8FVBx6Mok-Ffd4#xJHyX=jZ08=9Mrw z7o{eaq^2m8XO?6rxO@5rgg5euGcd5Ud%8G=RNQ(yN4Na8fkf+78Rf&W$rszM?Z`;5 z*l}aaZF`Ly_Ak7e+nd?jyq*V5m-@{k#jkNy#Cuz6^m-l3@AH_~4)}4H8_M3^}b;SC8LKbZnUIEn! zZx3Gk`#ji|hm9d4`Ty<4#hkmh{b*7135)Lex2^qich=Lu{?*Hk&KJ+-60YFq*vQGf zSbxp>=*k%R)s5fn=4b6?nVOnu6R8jrZtiGn9`b(6s;^ee4-+D%ecxkP_aJ+2Z{5pX z5@i>6o|kxhG_I{IzT|fHPxYLIETwneZ@#yT%a^Nu>OrlQ6Mk&DVKL(+@1Iu>|9k(Q ze@tb9O5E!;!L4uZUJpK~-kI`sg}?u@x@cR2W4D&2^(>XNKYYQUL`Ixv$=C0DW;Px) z=B#H(`BA?5tfRJd*Y8IPXMYrkzKYl%qjdOGvgg@^?Os=;|)OOv7ebK*~f}3?$g*K*q$>d*r^0r#OGV_FayIxy{1^$0nI;(K;Z}Fpz z5qoZYPSO`{YH}2cdehHmzEpYIWyAJLhen%^FY8WSKDo3$^kvW7@6B`B@88~4`g(W! zqsMQ(JsDOkjhFp)MD*X{n*t@m^MZdd`!QYY-EJV<=Y6T%^v~VC)(plAS7qiqD+IaD zWW4u`@$1G#YQEeKu^(1FgFx&}S=ulJsFa6D;6E}NZZ7mrdm({(pY}|gd^H+qW zPu?M(0t@vGIeVVYpLDDC`FzhEme=dntH&x{nto~7yo4!-&pHX3ByLnNKL7Xo^zGlL zoBuu`n*K}X<)nP?$c+*Hr?e{ny^y~9ZtCsI&2@2q1DWfC61vRq+1-pykhz z%@EGu@Mfdzoy^?=K5uvr*fy-2YWwc=+}CD2Hg9+(P3OMzGyE=W_&D@O_pxfD^Vg49 z&i%g5f<fP$FF(c;fTbR;ly32X3!DWa2FtoVDv;h{(2Yb6M>2uas5V z9!UFn`A5nuJD#46uU6if@wi1&A*<^6DbH}$5}x1hEm_+H7yO?=;Q~XX9m7j^kOogzKbLh*2~7Y{1w1bR diff --git a/core/assets/maps/volcano.png b/core/assets/maps/volcano.png deleted file mode 100644 index dc4f6ba8665b4accd22f5395e93e92117be35040..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8102 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 QU|?YIboFyt=akR{0N%Em!~g&Q diff --git a/core/assets/version.properties b/core/assets/version.properties index 278f49ba23..52321f5850 100644 --- a/core/assets/version.properties +++ b/core/assets/version.properties @@ -1,5 +1,5 @@ #Autogenerated file. Do not modify. -#Sat Mar 17 21:20:30 EDT 2018 +#Sat Mar 17 21:49:13 EDT 2018 version=release androidBuildCode=538 name=Mindustry diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index a54252e78f..5aa8279761 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -7,6 +7,7 @@ import com.badlogic.gdx.graphics.Colors; import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.utils.Align; import io.anuke.mindustry.Vars; +import io.anuke.mindustry.editor.MapEditorDialog; import io.anuke.mindustry.io.Platform; import io.anuke.mindustry.ui.dialogs.*; import io.anuke.mindustry.ui.fragments.*; @@ -43,7 +44,7 @@ public class UI extends SceneModule{ public PausedDialog paused; public SettingsMenuDialog settings; public ControlsDialog controls; - public FloatingDialog editor; //TODO change back to map editor dialog + public MapEditorDialog editor; public LanguageDialog language; public BansDialog bans; public AdminsDialog admins; @@ -143,7 +144,7 @@ public class UI extends SceneModule{ @Override public void init(){ - (editor = new FloatingDialog("The editor is currently broken.")).addCloseButton(); + editor = new MapEditorDialog(); controls = new ControlsDialog(); restart = new RestartDialog(); join = new JoinDialog(); diff --git a/core/src/io/anuke/mindustry/editor/DrawOperation.java b/core/src/io/anuke/mindustry/editor/DrawOperation.java new file mode 100755 index 0000000000..c2472e718d --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/DrawOperation.java @@ -0,0 +1,39 @@ +package io.anuke.mindustry.editor; + +import com.badlogic.gdx.utils.Disposable; +import io.anuke.mindustry.io.MapTileData; +import io.anuke.mindustry.io.MapTileData.TileDataWriter; + +import java.nio.ByteBuffer; + +public class DrawOperation implements Disposable{ + /**Data to apply operation to.*/ + MapTileData data; + /**Format: + * position (int) + * packed data FROM (use TileDataWriter's read/write methods) + * packed data TO (use TileDataWriter's read/write methods) + */ + ByteBuffer operation; + TileDataWriter writer = new TileDataWriter(); + + public DrawOperation(MapTileData data){ + this.data = data; + } + + public void set(ByteBuffer operation) { + this.operation = operation; + } + + public void undo() { + //TODO implement + } + + public void redo() { + //TODO implement + } + + @Override + public void dispose() {} + +} diff --git a/core/src/io/anuke/mindustry/editor/EditorTool.java b/core/src/io/anuke/mindustry/editor/EditorTool.java new file mode 100644 index 0000000000..31c2cee5b5 --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/EditorTool.java @@ -0,0 +1,94 @@ +package io.anuke.mindustry.editor; + +import com.badlogic.gdx.utils.IntArray; +import com.badlogic.gdx.utils.IntSet; +import io.anuke.mindustry.io.MapTileData.TileDataWriter; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.blocks.types.Floor; + +import static io.anuke.mindustry.Vars.ui; + +public enum EditorTool{ + pick{ + public void touched(MapEditor editor, int x, int y){ + TileDataWriter writer = editor.getMap().readAt(x, y); + Block block = Block.getByID(writer.wall == 0 ? writer.floor : writer.wall); + editor.setDrawBlock(block); + ui.editor.updateSelectedBlock(); + } + }, + pencil{ + { + edit = true; + } + + public void touched(MapEditor editor, int x, int y){ + editor.draw(x, y); + } + }, + line{ + { + + } + + }, + fill{ + { + edit = true; + } + + public void touched(MapEditor editor, int x, int y){ + //TODO select floor/block properly instead of using this method! + boolean floor = editor.getDrawBlock() instanceof Floor; + + TileDataWriter writer = editor.getMap().readAt(x, y); + + byte dest = floor ? writer.floor : writer.wall; + + int width = editor.getMap().width(); + int height = editor.getMap().height(); + + IntSet set = new IntSet(); + IntArray points = new IntArray(); + points.add(asInt(x, y, editor.getMap().width())); + + while(points.size != 0){ + int pos = points.pop(); + int px = pos % width; + int py = pos / width; + set.add(pos); + + writer = editor.getMap().readAt(px, py); + + if((floor ? writer.floor : writer.wall) == dest){ + if(floor) + writer.floor = dest; + else + writer.wall = dest; + + editor.getMap().write(px, py, writer); + editor.renderer().updatePoint(px, py); + + if(px > 0 && !set.contains(asInt(px - 1, py, width))) points.add(asInt(px - 1, py, width)); + if(py > 0 && !set.contains(asInt(px, py - 1, width))) points.add(asInt(px, py - 1, width)); + if(px < width - 1 && !set.contains(asInt(px + 1, py, width))) points.add(asInt(px + 1, py, width)); + if(py < height - 1 && !set.contains(asInt(px, py + 1, width))) points.add(asInt(px, py + 1, width)); + } + } + } + + int asInt(int x, int y, int width){ + return x+y*width; + } + + boolean colorEquals(int a, int b){ + return a == b; + } + }, + zoom; + boolean edit; + + public void touched(MapEditor editor, int x, int y){ + + } +} diff --git a/core/src/io/anuke/mindustry/editor/MapEditor.java b/core/src/io/anuke/mindustry/editor/MapEditor.java new file mode 100644 index 0000000000..2f14dd0056 --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/MapEditor.java @@ -0,0 +1,81 @@ +package io.anuke.mindustry.editor; + +import io.anuke.mindustry.io.MapTileData; +import io.anuke.mindustry.io.MapTileData.TileDataWriter; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.blocks.Blocks; +import io.anuke.mindustry.world.blocks.types.Floor; +import io.anuke.ucore.util.Mathf; + +public class MapEditor{ + public static final int minMapSize = 128, maxMapSize = 512; + public static final int[] brushSizes = {1, 2, 3, 4, 5, 9, 15}; + + private MapTileData map; + private MapRenderer renderer = new MapRenderer(this); + + private int brushSize = 1; + private Block drawBlock = Blocks.stone; + + public MapEditor(){ + + } + + public MapTileData getMap(){ + return map; + } + + public void beginEdit(MapTileData map){ + drawBlock = Blocks.stone; + this.map = map; + this.brushSize = 1; + } + + public Block getDrawBlock(){ + return drawBlock; + } + + public void setDrawBlock(Block block){ + this.drawBlock = block; + } + + public void setBrushSize(int size){ + this.brushSize = size; + } + + public int getBrushSize() { + return brushSize; + } + + public void draw(int dx, int dy){ + if(dx < 0 || dy < 0 || dx >= map.width() || dy >= map.height()){ + return; + } + + TileDataWriter writer = map.readAt(dx, dy); + if(drawBlock instanceof Floor){ + writer.floor = (byte)drawBlock.id; + }else{ + writer.wall = (byte)drawBlock.id; + } + + for(int rx = -brushSize + 1; rx <= brushSize - 1; rx ++){ + for(int ry = -brushSize + 1; ry <= brushSize - 1; ry ++){ + if(Mathf.dst(rx, ry) < brushSize){ + map.write(dx + rx, dy + ry, writer); + renderer.updatePoint(dx + rx, dy + ry); + } + } + } + + } + + public MapRenderer renderer() { + return renderer; + } + + public void resize(int width, int height){ + map = new MapTileData(width, height); + renderer.resize(width, height); + } +} diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java new file mode 100644 index 0000000000..8988e71272 --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -0,0 +1,421 @@ +package io.anuke.mindustry.editor; + +import com.badlogic.gdx.Input.Keys; +import com.badlogic.gdx.graphics.Color; +import io.anuke.mindustry.io.MapTileData; +import io.anuke.mindustry.io.Platform; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.ColorMapper; +import io.anuke.mindustry.world.ColorMapper.BlockPair; +import io.anuke.mindustry.world.blocks.Blocks; +import io.anuke.ucore.core.Core; +import io.anuke.ucore.core.Graphics; +import io.anuke.ucore.core.Inputs; +import io.anuke.ucore.core.Timers; +import io.anuke.ucore.graphics.Draw; +import io.anuke.ucore.scene.Element; +import io.anuke.ucore.scene.builders.build; +import io.anuke.ucore.scene.builders.imagebutton; +import io.anuke.ucore.scene.builders.label; +import io.anuke.ucore.scene.builders.table; +import io.anuke.ucore.scene.ui.*; +import io.anuke.ucore.scene.ui.layout.Table; +import io.anuke.ucore.util.Bundles; + +import static io.anuke.mindustry.Vars.gwt; +import static io.anuke.mindustry.Vars.ui; + +public class MapEditorDialog extends Dialog{ + private MapEditor editor; + private MapView view; + private MapGenerateDialog dialog; + private MapLoadDialog loadDialog; + private MapSaveDialog saveDialog; + private MapResizeDialog resizeDialog; + private ScrollPane pane; + //private FileChooser openFile, saveFile; + private boolean saved = false; + + private ButtonGroup blockgroup; + + public MapEditorDialog(){ + super("$text.mapeditor", "dialog"); + if(gwt) return; + + editor = new MapEditor(); + dialog = new MapGenerateDialog(editor); + view = new MapView(editor); + /* + openFile = new FileChooser("$text.loadimage", FileChooser.pngFilter, true, file -> { + ui.loadfrag.show(); + Timers.run(3f, () -> { + try{ + Pixmap pixmap = new Pixmap(file); + if(verifySize(pixmap)){ + editor.setPixmap(pixmap); + view.clearStack(); + }else{ + ui.showError(Bundles.format("text.editor.badsize", Arrays.toString(MapEditor.validMapSizes))); + } + }catch (Exception e){ + ui.showError(Bundles.format("text.editor.errorimageload", Strings.parseException(e, false))); + Log.err(e); + } + ui.loadfrag.hide(); + }); + }); + + saveFile = new FileChooser("$saveimage", false, file -> { + if(!file.extension().toLowerCase().equals(".png")){ + file = file.parent().child(file.nameWithoutExtension() + ".png"); + } + FileHandle result = file; + ui.loadfrag.show(); + Timers.run(3f, () -> { + try{ + Pixmaps.write(editor.pixmap(), result); + }catch (Exception e){ + ui.showError(Bundles.format("text.editor.errorimagesave", Strings.parseException(e, false))); + if(!android) Log.err(e); + } + ui.loadfrag.hide(); + }); + });*/ + /* + loadDialog = new MapLoadDialog(map -> { + saveDialog.setFieldText(map.name); + ui.loadfrag.show(); + + Timers.run(3f, () -> { + Map copy = new Map(); + copy.name = map.name; + copy.id = -1; + copy.pixmap = Pixmaps.copy(map.pixmap); + copy.texture = new Texture(copy.pixmap); + copy.oreGen = map.oreGen; + editor.beginEdit(copy); + ui.loadfrag.hide(); + view.clearStack(); + }); + });*/ + + resizeDialog = new MapResizeDialog(editor, (x, y) -> { + if(!(editor.getMap().width() == x && editor.getMap().height() == y)){ + ui.loadfrag.show(); + Timers.run(10f, () -> { + editor.resize(x, y); + view.clearStack(); + ui.loadfrag.hide(); + }); + } + }); + + /* + saveDialog = new MapSaveDialog(name -> { + ui.loadfrag.show(); + if(verifyMap()){ + saved = true; + String before = editor.getMap().name; + editor.getMap().name = name; + Timers.run(10f, () -> { + world.maps().saveAndReload(editor.getMap(), editor.pixmap()); + loadDialog.rebuild(); + ui.loadfrag.hide(); + view.clearStack(); + + if(!name.equals(before)) { + Map map = new Map(); + map.name = editor.getMap().name; + map.oreGen = editor.getMap().oreGen; + map.pixmap = Pixmaps.copy(editor.getMap().pixmap); + map.texture = new Texture(map.pixmap); + map.custom = true; + editor.beginEdit(map); + } + }); + + }else{ + ui.loadfrag.hide(); + } + });*/ + + setFillParent(true); + + clearChildren(); + margin(0); + build.begin(this); + build(); + build.end(); + + tapped(() -> { + Element e = Core.scene.hit(Graphics.mouse().x, Graphics.mouse().y, true); + if(e == null || !e.isDescendantOf(pane)) Core.scene.setScrollFocus(null); + }); + + update(() -> { + if(Core.scene != null && Core.scene.getKeyboardFocus() == this){ + doInput(); + } + }); + + shown(() -> { + saved = true; + editor.beginEdit(new MapTileData(256, 256)); + blockgroup.getButtons().get(2).setChecked(true); + Core.scene.setScrollFocus(view); + view.clearStack(); + + Timers.runTask(10f, Platform.instance::updateRPC); + }); + + hidden(() -> Platform.instance.updateRPC()); + } + + public MapView getView() { + return view; + } + + public void resetSaved(){ + saved = false; + } + + public void updateSelectedBlock(){ + Block block = editor.getDrawBlock(); + int i = 0; + for(BlockPair pair : ColorMapper.getPairs()){ + if(pair.wall == block || (pair.wall == Blocks.air && pair.floor == block)){ + blockgroup.getButtons().get(i).setChecked(true); + break; + } + i++; + } + } + + public boolean hasPane(){ + return Core.scene.getScrollFocus() == pane; + } + + public void build(){ + + new table(){{ + float isize = 16*2f; + aleft(); + + new table(){{ + + defaults().growY().width(130f).padBottom(-6); + + new imagebutton("icon-terrain", isize, () -> + dialog.show() + ).text("$text.editor.generate"); + + row(); + + new imagebutton("icon-resize", isize, () -> + resizeDialog.show() + ).text("$text.editor.resize").padTop(4f); + + row(); + + new imagebutton("icon-load-map", isize, () -> + loadDialog.show() + ).text("$text.editor.loadmap"); + + row(); + + new imagebutton("icon-save-map", isize, ()-> + saveDialog.show() + ).text("$text.editor.savemap"); + + row(); + /* + new imagebutton("icon-load-image", isize, () -> + openFile.show() + ).text("$text.editor.loadimage"); + + row(); + + new imagebutton("icon-save-image", isize, () -> + saveFile.show() + ).text("$text.editor.saveimage");*/ + + row(); + + new imagebutton("icon-back", isize, () -> { + if(!saved){ + ui.showConfirm("$text.confirm", "$text.editor.unsaved", + MapEditorDialog.this::hide); + }else{ + hide(); + } + }).padBottom(0).text("$text.back"); + + }}.left().growY().end(); + + new table("button"){{ + add(view).grow(); + }}.grow().end(); + + new table(){{ + Table tools = new Table("button"); + tools.top(); + tools.marginTop(0).marginBottom(6); + + ButtonGroup group = new ButtonGroup<>(); + int i = 1; + + tools.defaults().size(53f, 58f).padBottom(-6); + + ImageButton undo = tools.addImageButton("icon-undo", 16*2f, () -> view.undo()).get(); + ImageButton redo = tools.addImageButton("icon-redo", 16*2f, () -> view.redo()).get(); + ImageButton grid = tools.addImageButton("icon-grid", "toggle", 16*2f, () -> view.setGrid(!view.isGrid())).get(); + + undo.setDisabled(() -> !view.getStack().canUndo()); + redo.setDisabled(() -> !view.getStack().canRedo()); + + undo.update(() -> undo.getImage().setColor(undo.isDisabled() ? Color.GRAY : Color.WHITE)); + redo.update(() -> redo.getImage().setColor(redo.isDisabled() ? Color.GRAY : Color.WHITE)); + grid.update(() -> grid.setChecked(view.isGrid())); + + for(EditorTool tool : EditorTool.values()){ + ImageButton button = new ImageButton("icon-" + tool.name(), "toggle"); + button.clicked(() -> view.setTool(tool)); + button.resizeImage(16*2f); + button.update(() -> button.setChecked(view.getTool() == tool)); + group.add(button); + if (tool == EditorTool.pencil) + button.setChecked(true); + + tools.add(button).padBottom(-6f); + if(i++ % 4 == 1) tools.row(); + } + + add(tools).width(53*4).padBottom(-6); + + row(); + + new table("button"){{ + margin(10f); + Slider slider = new Slider(0, MapEditor.brushSizes.length-1, 1, false); + slider.moved(f -> editor.setBrushSize(MapEditor.brushSizes[(int)(float)f])); + new label(() -> Bundles.format("text.editor.brushsize", MapEditor.brushSizes[(int)slider.getValue()])).left(); + row(); + add(slider).growX().padTop(4f); + }}.growX().padBottom(-6).end(); + + row(); + + /* + new table("button"){{ + get().addCheck("$text.oregen", b -> editor.getMap().oreGen = b) + .update(c -> c.setChecked(editor.getMap().oreGen)).padTop(3).padBottom(3); + }}.growX().padBottom(-6).end();*/ + + row(); + + addBlockSelection(get()); + + row(); + + }}.right().growY().end(); + }}.grow().end(); + } + + private void doInput(){ + //tool select + for(int i = 0; i < EditorTool.values().length; i ++){ + int code = i == 0 ? 5 : i; + if(Inputs.keyTap("weapon_" + code)){ + view.setTool(EditorTool.values()[i]); + break; + } + } + + //ctrl keys (undo, redo, save) + if(Inputs.keyDown(Keys.CONTROL_LEFT)){ + if(Inputs.keyTap(Keys.Z)){ + view.undo(); + } + + if(Inputs.keyTap(Keys.Y)){ + view.redo(); + } + + if(Inputs.keyTap(Keys.S)){ + saveDialog.save(); + } + + if(Inputs.keyTap(Keys.G)){ + view.setGrid(!view.isGrid()); + } + } + } + + private boolean verifyMap(){ + //TODO make sure both teams have cores or something + /* + int psc = ColorMapper.getColor(SpecialBlocks.playerSpawn); + int esc = ColorMapper.getColor(SpecialBlocks.enemySpawn); + + int playerSpawns = 0; + int enemySpawns = 0; + Pixmap pix = editor.pixmap(); + + for(int x = 0; x < pix.getWidth(); x ++){ + for(int y = 0; y < pix.getHeight(); y ++){ + int i = pix.getPixel(x, y); + if(i == psc) playerSpawns ++; + if(i == esc) enemySpawns ++; + } + } + + if(playerSpawns == 0){ + ui.showError("$text.editor.noplayerspawn"); + return false; + }else if(playerSpawns > 1){ + ui.showError("$text.editor.manyplayerspawns"); + return false; + } + + if(enemySpawns > MapEditor.maxSpawnpoints){ + ui.showError(Bundles.format("text.editor.manyenemyspawns", MapEditor.maxSpawnpoints)); + return false; + }*/ + + return true; + } + + private void addBlockSelection(Table table){ + Table content = new Table(); + pane = new ScrollPane(content, "volume"); + pane.setScrollingDisabled(true, false); + pane.setFadeScrollBars(false); + pane.setOverscroll(true, false); + ButtonGroup group = new ButtonGroup<>(); + blockgroup = group; + + int i = 0; + + for(BlockPair pair : ColorMapper.getPairs()){ + Block block = pair.wall == Blocks.air ? pair.floor : pair.wall; + + ImageButton button = new ImageButton(Draw.hasRegion(block.name) ? Draw.region(block.name) : Draw.region(block.name + "1"), "toggle"); + button.clicked(() -> editor.setDrawBlock(block)); + button.resizeImage(8*4f); + group.add(button); + content.add(button).pad(4f).size(53f, 58f); + + if(i++ % 2 == 1){ + content.row(); + } + } + + group.getButtons().get(2).setChecked(true); + + Table extra = new Table("button"); + extra.labelWrap(() -> editor.getDrawBlock().formalName).width(180f).center(); + table.add(extra).padBottom(-6).growX(); + table.row(); + table.add(pane).growY().fillX(); + } +} diff --git a/core/src/io/anuke/mindustry/editor/MapFilter.java b/core/src/io/anuke/mindustry/editor/MapFilter.java new file mode 100644 index 0000000000..a01b082a43 --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/MapFilter.java @@ -0,0 +1,244 @@ +package io.anuke.mindustry.editor; + +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.OrderedMap; + +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.ColorMapper; +import io.anuke.mindustry.world.ColorMapper.BlockPair; +import io.anuke.mindustry.world.blocks.Blocks; +import io.anuke.mindustry.world.blocks.types.Floor; +import io.anuke.ucore.graphics.Pixmaps; +import io.anuke.ucore.noise.RidgedPerlin; +import io.anuke.ucore.noise.Simplex; +import io.anuke.ucore.util.Mathf; + +public class MapFilter{ + private ObjectMap prefs = map( + pref("replace", "whether to replace blocks"), + pref("terrain", "generate new terrain"), + pref("circle", "generate terrain in a circle"), + pref("distort", "distort the map image"), + pref("sand", "add patches of sand"), + pref("grass", "add patches of grass"), + pref("stone", "add patches of stone"), + pref("blackstone", "add patches of black stone"), + pref("allgrass", "fill map with grass"), + pref("allsnow", "fill map with snow"), + pref("allsand", "fill map with sand"), + pref("water", "add lakes"), + pref("oil", "add oil lakes"), + pref("lavariver", "add lava rivers"), + pref("slavariver", "ad small lava rivers"), + pref("river", "add rivers"), + pref("iceriver", "add frozen rivers"), + pref("oilriver", "add oil rivers") + ); + + private Simplex sim = new Simplex(); + private RidgedPerlin rid = new RidgedPerlin(1, 10, 20f); + private RidgedPerlin rid2 = new RidgedPerlin(1, 6, 1f); + private RidgedPerlin rid3 = new RidgedPerlin(1, 6, 1f); + + public MapFilter(){ + prefs.get("replace").enabled = true; + prefs.get("terrain").enabled = true; + randomize(); + } + + public void randomize(){ + sim.setSeed(Mathf.random(999999)); + rid.setSeed(Mathf.random(999999)); + rid2.setSeed(Mathf.random(999999)); + rid3.setSeed(Mathf.random(999999)); + } + + public ObjectMap getPrefs(){ + return prefs; + } + + public Pixmap process(Pixmap pixmap){ + if(prefs.get("terrain").enabled){ + for(int x = 0; x < pixmap.getWidth(); x++){ + for(int y = 0; y < pixmap.getHeight(); y++){ + float dist = Vector2.dst((float) x / pixmap.getWidth(), (float) y / pixmap.getHeight(), 0.5f, 0.5f) * 2f; + double noise = sim.octaveNoise2D(6, 0.6, 1 / 180.0, x, y + 9999) / (prefs.get("circle").enabled ? 1.7 : 1f) + dist / 10f; + + if(dist > 0.8){ + noise += 2 * (dist - 0.8); + } + + Block block = noise > 0.6 ? Blocks.stoneblock : Blocks.stone; + + pixmap.drawPixel(x, y, ColorMapper.getColor(block)); + } + } + } + + Pixmap src = Pixmaps.copy(pixmap); + + for(int x = 0; x < pixmap.getWidth(); x++){ + for(int y = 0; y < pixmap.getHeight(); y++){ + int dx = 0, dy = 0; + + if(prefs.get("distort").enabled){ + double intensity = 12; + double scale = 80; + double octaves = 4; + double falloff = 0.6; + double nx = (sim.octaveNoise2D(octaves, falloff, 1 / scale, x, y) - 0.5f) * intensity; + double ny = (sim.octaveNoise2D(octaves, falloff, 1 / scale, x, y + 99999) - 0.5f) * intensity; + dx = (int) nx; + dy = (int) ny; + } + + int pix = src.getPixel(x + dx, y + dy); + + BlockPair pair = ColorMapper.get(pix); + Block block = pair == null ? null : pair.wall == Blocks.air ? pair.floor : pair.wall; + + if(block == null) + continue; + + boolean floor = block instanceof Floor; + + double noise = sim.octaveNoise2D(4, 0.6, 1 / 170.0, x, y) + sim.octaveNoise2D(1, 1.0, 1 / 5.0, x, y) / 18.0; + double nwater = sim.octaveNoise2D(1, 1.0, 1 / 130.0, x, y); + noise += nwater / 5.0; + + double noil = sim.octaveNoise2D(1, 1.0, 1 / 150.0, x + 9999, y) + sim.octaveNoise2D(1, 1.0, 1 / 2.0, x, y) / 290.0; + + if(!floor || prefs.get("replace").enabled){ + + if(prefs.get("allgrass").enabled){ + block = floor ? Blocks.grass : Blocks.grassblock; + }else if(prefs.get("allsnow").enabled){ + block = floor ? Blocks.snow : Blocks.snowblock; + }else if(prefs.get("allsand").enabled){ + block = floor ? Blocks.sand : Blocks.sandblock; + }else if(prefs.get("replace").enabled){ + block = floor ? Blocks.stone : Blocks.stoneblock; + } + + if(noise > 0.7 && prefs.get("grass").enabled){ + block = floor ? Blocks.grass : Blocks.grassblock; + } + if(noise > 0.7 && prefs.get("blackstone").enabled){ + block = floor ? Blocks.blackstone : Blocks.blackstoneblock; + } + if(noise > 0.7 && prefs.get("sand").enabled){ + block = floor ? Blocks.sand : Blocks.sandblock; + } + if(noise > 0.8 && prefs.get("stone").enabled){ + block = floor ? Blocks.stone : Blocks.stoneblock; + } + } + + if(floor){ + if(nwater > 0.93 && prefs.get("water").enabled){ + block = Blocks.water; + if(nwater > 0.943){ + block = Blocks.deepwater; + } + } + + if(noil > 0.95 && prefs.get("oil").enabled){ + block = Blocks.dirt; + if(noil > 0.955){ + block = Blocks.oil; + } + } + } + + if(floor && prefs.get("lavariver").enabled){ + double lava = rid.getValue(x, y, 1 / 100f); + double t = 0.6; + if(lava > t){ + block = Blocks.lava; + }else if(lava > t - 0.2){ + block = Blocks.blackstone; + } + } + + if(floor && prefs.get("slavariver").enabled){ + double lava = rid.getValue(x, y, 1 / 40f); + double t = 0.7; + if(lava > t){ + block = Blocks.lava; + }else if(lava > t - 0.3){ + block = Blocks.blackstone; + } + } + + if(floor && prefs.get("oilriver").enabled){ + double lava = rid3.getValue(x, y, 1 / 100f); + double t = 0.9; + if(lava > t){ + block = Blocks.oil; + }else if(lava > t - 0.2){ + block = Blocks.dirt; + } + } + + if(floor && prefs.get("river").enabled){ + double riv = rid2.getValue(x, y, 1 / 140f); + double t = 0.4; + + if(riv > t + 0.1){ + block = Blocks.deepwater; + }else if(riv > t){ + block = Blocks.water; + }else if(riv > t - 0.2){ + block = Blocks.grass; + } + } + + if(floor && prefs.get("iceriver").enabled){ + double riv = rid2.getValue(x, y, 1 / 140f); + double t = 0.4; + + if(riv > t + 0.1){ + block = Blocks.ice; + }else if(riv > t){ + block = Blocks.ice; + }else if(riv > t - 0.2){ + block = Blocks.snow; + } + } + + pixmap.drawPixel(x, y, ColorMapper.getColor(block)); + } + } + + src.dispose(); + + return pixmap; + } + + private static OrderedMap map(GenPref...objects){ + OrderedMap prefs = new OrderedMap<>(); + + for(int i = 0; i < objects.length; i ++){ + GenPref pref = (GenPref)objects[i]; + prefs.put(pref.name, pref); + } + return prefs; + } + + private GenPref pref(String name, String desc){ + return new GenPref(name, desc); + } + + class GenPref{ + public final String name; + public final String description; + public boolean enabled; + + GenPref(String name, String description){ + this.name = name; + this.description = description; + } + } +} diff --git a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java new file mode 100644 index 0000000000..4ed34dbd56 --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java @@ -0,0 +1,105 @@ +package io.anuke.mindustry.editor; + +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.Scaling; + +import static io.anuke.mindustry.Vars.*; +import io.anuke.mindustry.editor.MapFilter.GenPref; +import io.anuke.mindustry.ui.BorderImage; +import io.anuke.mindustry.ui.dialogs.FloatingDialog; +import io.anuke.ucore.core.Timers; +import io.anuke.ucore.graphics.Pixmaps; +import io.anuke.ucore.scene.style.TextureRegionDrawable; +import io.anuke.ucore.scene.ui.CheckBox; +import io.anuke.ucore.scene.ui.Image; +import io.anuke.ucore.scene.ui.ScrollPane; +import io.anuke.ucore.scene.ui.layout.Stack; +import io.anuke.ucore.scene.ui.layout.Table; + +public class MapGenerateDialog extends FloatingDialog{ + private MapEditor editor; + private Image image; + private boolean loading; + + public MapGenerateDialog(MapEditor editor) { + super("$text.editor.generate"); + this.editor = editor; + + Stack stack = new Stack(); + stack.add(image = new BorderImage()); + + Image loadImage = new Image("icon-loading"); + loadImage.setScaling(Scaling.none); + loadImage.setScale(3f); + loadImage.update(() -> loadImage.setOrigin(Align.center)); + loadImage.setVisible(() -> loading); + Image next = new Image("white"); + next.setScaling(Scaling.fit); + next.setColor(0, 0, 0, 0.6f); + next.setVisible(() -> loading); + + stack.add(next); + stack.add(loadImage); + + content().add(stack).grow(); + image.setScaling(Scaling.fit); + Table preft = new Table(); + preft.left(); + preft.margin(4f).marginRight(25f); + + for(GenPref pref : editor.getFilter().getPrefs().values()){ + CheckBox box = new CheckBox(pref.name); + box.setChecked(pref.enabled); + box.changed(() -> pref.enabled = box.isChecked()); + preft.add(box).pad(4f).left(); + preft.row(); + } + + ScrollPane pane = new ScrollPane(preft, "volume"); + pane.setFadeScrollBars(false); + pane.setScrollingDisabled(true, false); + + content().add(pane).fillY(); + + buttons().defaults().size(170f, 50f).pad(4f); + buttons().addButton("$text.back", this::hide); + buttons().addButton("$text.randomize", () ->{ + editor.getFilter().randomize(); + apply(); + }); + buttons().addButton("$text.update", this::apply); + buttons().addButton("$text.apply", () ->{ + ui.loadfrag.show(); + + Timers.run(3f, () ->{ + Pixmap copy = Pixmaps.copy(editor.pixmap()); + editor.applyFilter(); + ui.editor.getView().push(copy, Pixmaps.copy(editor.pixmap())); + ui.loadfrag.hide(); + ui.editor.resetSaved(); + hide(); + }); + }); + + shown(() ->{ + loading = true; + Timers.run(30f, () -> { + editor.applyFilterPreview(); + image.setDrawable(new TextureRegionDrawable(new TextureRegion(editor.getFilterTexture()))); + loading = false; + }); + }); + } + + private void apply(){ + loading = true; + Timers.run(3f, () -> { + editor.applyFilterPreview(); + loading = false; + }); + + } + +} diff --git a/core/src/io/anuke/mindustry/editor/MapLoadDialog.java b/core/src/io/anuke/mindustry/editor/MapLoadDialog.java new file mode 100644 index 0000000000..7a7495db4a --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/MapLoadDialog.java @@ -0,0 +1,73 @@ +package io.anuke.mindustry.editor; + +import io.anuke.mindustry.ui.BorderImage; +import io.anuke.mindustry.ui.dialogs.FloatingDialog; +import io.anuke.mindustry.world.Map; +import io.anuke.ucore.function.Consumer; +import io.anuke.ucore.scene.ui.ButtonGroup; +import io.anuke.ucore.scene.ui.ScrollPane; +import io.anuke.ucore.scene.ui.TextButton; +import io.anuke.ucore.scene.ui.layout.Table; + +import static io.anuke.mindustry.Vars.world; + +public class MapLoadDialog extends FloatingDialog{ + private Map selected = world.maps().getMap(0); + + public MapLoadDialog(Consumer loader) { + super("$text.editor.loadmap"); + + shown(this::rebuild); + rebuild(); + + TextButton button = new TextButton("$text.load"); + button.setDisabled(() -> selected == null); + button.clicked(() -> { + if (selected != null) { + loader.accept(selected); + hide(); + } + }); + + buttons().defaults().size(200f, 50f); + buttons().addButton("$text.cancel", this::hide); + buttons().add(button); + } + + public void rebuild(){ + content().clear(); + + selected = world.maps().getMap(0); + + ButtonGroup group = new ButtonGroup<>(); + + int maxcol = 3; + + int i = 0; + + Table table = new Table(); + table.defaults().size(200f, 90f).pad(4f); + table.margin(10f); + + ScrollPane pane = new ScrollPane(table, "horizontal"); + pane.setFadeScrollBars(false); + + for (Map map : world.maps().list()) { + if (!map.visible) continue; + + TextButton button = new TextButton(map.localized(), "toggle"); + button.add(new BorderImage(map.texture, 2f)).size(16 * 4f); + button.getCells().reverse(); + button.clicked(() -> selected = map); + button.getLabelCell().grow().left().padLeft(5f); + group.add(button); + table.add(button); + if (++i % maxcol == 0) table.row(); + } + + content().add("$text.editor.loadmap"); + content().row(); + content().add(pane); + } + +} diff --git a/core/src/io/anuke/mindustry/editor/MapRenderer.java b/core/src/io/anuke/mindustry/editor/MapRenderer.java new file mode 100644 index 0000000000..857575ec66 --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/MapRenderer.java @@ -0,0 +1,103 @@ +package io.anuke.mindustry.editor; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.utils.IntSet; +import com.badlogic.gdx.utils.IntSet.IntSetIterator; +import io.anuke.mindustry.io.MapTileData.TileDataWriter; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.blocks.Blocks; +import io.anuke.ucore.core.Graphics; +import io.anuke.ucore.graphics.CacheBatch; +import io.anuke.ucore.graphics.Draw; + +import static io.anuke.mindustry.Vars.tilesize; + +public class MapRenderer { + private static final int chunksize = 32; + private CacheBatch batch; + private int[][] chunks; + private IntSet updates = new IntSet(); + private MapEditor editor; + + public MapRenderer(MapEditor editor){ + this.editor = editor; + } + + public void resize(int width, int height){ + batch = new CacheBatch(width * height * 3); + chunks = new int[width / chunksize][height / chunksize]; + updates.clear(); + updateAll(); + } + + public void draw(){ + Graphics.end(); + Graphics.useBatch(batch); + + IntSetIterator it = updates.iterator(); + int i = it.next(); + for(; it.hasNext; i = it.next()){ + int x = i % chunks.length; + int y = i / chunks.length; + render(x, y, chunks[x][y]); + } + updates.clear(); + + Graphics.popBatch(); + + Gdx.gl.glEnable(GL20.GL_BLEND); + + batch.beginDraw(); + + for(int x = 0; x < chunks.length; x ++){ + for(int y = 0; y < chunks[0].length; y ++){ + int id = chunks[x][y]; + batch.drawCache(id); + } + } + + batch.endDraw(); + + Graphics.begin(); + } + + public void updatePoint(int x, int y){ + x /= chunksize; + y /= chunksize; + updates.add(x + y * chunks.length); + } + + public void updateAll(){ + for(int x = 0; x < chunks.length; x ++){ + for(int y = 0; y < chunks[0].length; y ++){ + render(x, y, chunks[x][y]); + } + } + } + + private void render(int chunkx, int chunky, int previousID){ + if(previousID == -1){ + batch.begin(); + }else{ + batch.begin(previousID); + } + + for(int x = 0; x < chunkx; x ++){ + for(int y = 0; y < chunky; y ++){ + int wx = chunkx*chunksize + x; + int wy = chunky*chunksize + y; + + TileDataWriter data = editor.getMap().readAt(wx, wy); + Block floor = Block.getByID(data.floor); + Block wall = Block.getByID(data.wall); + + if(floor != Blocks.air) Draw.rect(floor.name, wx * tilesize, wy * tilesize); + if(floor != Blocks.air) Draw.rect(wall.name, wx * tilesize, wy * tilesize); + } + } + + batch.end(); + chunks[chunkx][chunky] = batch.getLastCache(); + } +} diff --git a/core/src/io/anuke/mindustry/editor/MapResizeDialog.java b/core/src/io/anuke/mindustry/editor/MapResizeDialog.java new file mode 100644 index 0000000000..719b567463 --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/MapResizeDialog.java @@ -0,0 +1,67 @@ +package io.anuke.mindustry.editor; + +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.utils.Align; + +import io.anuke.mindustry.ui.dialogs.FloatingDialog; +import io.anuke.ucore.function.BiConsumer; +import io.anuke.ucore.scene.ui.ButtonGroup; +import io.anuke.ucore.scene.ui.TextButton; +import io.anuke.ucore.scene.ui.layout.Table; + +public class MapResizeDialog extends FloatingDialog{ + int width, height; + + public MapResizeDialog(MapEditor editor, BiConsumer cons){ + super("$text.editor.resizemap"); + shown(() -> { + content().clear(); + Pixmap pix = editor.pixmap(); + width = pix.getWidth(); + height = pix.getHeight(); + + Table table = new Table(); + + for(int d = 0; d < 2; d ++){ + boolean w = d == 0; + int curr = d == 0 ? pix.getWidth() : pix.getHeight(); + int idx = 0; + for(int i = 0; i < MapEditor.validMapSizes.length; i ++) + if(MapEditor.validMapSizes[i] == curr) idx = i; + + table.add(d == 0 ? "$text.width": "$text.height").padRight(8f); + ButtonGroup group = new ButtonGroup<>(); + for(int i = 0; i < MapEditor.validMapSizes.length; i ++){ + int size = MapEditor.validMapSizes[i]; + TextButton button = new TextButton(size + "", "toggle"); + button.clicked(() -> { + if(w) + width = size; + else + height = size; + }); + group.add(button); + if(i == idx) button.setChecked(true); + table.add(button).size(100f, 54f).pad(2f); + } + + table.row(); + } + + content().label(() -> + width + height > 512 ? "$text.editor.resizebig" : "" + ).get().setAlignment(Align.center, Align.center); + content().row(); + content().add(table); + + }); + + buttons().defaults().size(200f, 50f); + buttons().addButton("$text.cancel", this::hide); + buttons().addButton("$text.editor.resize", () -> { + cons.accept(width, height); + hide(); + }); + + } +} diff --git a/core/src/io/anuke/mindustry/editor/MapSaveDialog.java b/core/src/io/anuke/mindustry/editor/MapSaveDialog.java new file mode 100644 index 0000000000..acabbfa970 --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/MapSaveDialog.java @@ -0,0 +1,75 @@ +package io.anuke.mindustry.editor; + +import io.anuke.mindustry.io.Map; +import io.anuke.mindustry.io.Platform; +import io.anuke.mindustry.ui.dialogs.FloatingDialog; +import io.anuke.ucore.function.Consumer; +import io.anuke.ucore.scene.ui.TextButton; +import io.anuke.ucore.scene.ui.TextField; + +import static io.anuke.mindustry.Vars.ui; +import static io.anuke.mindustry.Vars.world; + +public class MapSaveDialog extends FloatingDialog{ + private TextField field; + private Consumer listener; + + public MapSaveDialog(Consumer cons){ + super("$text.editor.savemap"); + field = new TextField(); + listener = cons; + + Platform.instance.addDialog(field); + + shown(() -> { + content().clear(); + content().label(() ->{ + Map map = world.maps().getByName(field.getText()); + if(map != null){ + if(map.custom){ + return "$text.editor.overwrite"; + }else{ + return "$text.editor.failoverwrite"; + } + } + return ""; + }).colspan(2); + content().row(); + content().add("$text.editor.mapname").padRight(14f); + content().add(field).size(220f, 48f); + }); + + buttons().defaults().size(200f, 50f).pad(2f); + buttons().addButton("$text.cancel", this::hide); + + TextButton button = new TextButton("$text.save"); + button.clicked(() -> { + if(!invalid()){ + cons.accept(field.getText()); + hide(); + } + }); + button.setDisabled(this::invalid); + buttons().add(button); + } + + public void save(){ + if(!invalid()){ + listener.accept(field.getText()); + }else{ + ui.showError("$text.editor.failoverwrite"); + } + } + + public void setFieldText(String text){ + field.setText(text); + } + + private boolean invalid(){ + if(field.getText().isEmpty()){ + return true; + } + Map map = world.maps().getByName(field.getText()); + return map != null && !map.custom; + } +} diff --git a/core/src/io/anuke/mindustry/editor/MapView.java b/core/src/io/anuke/mindustry/editor/MapView.java new file mode 100644 index 0000000000..75f73e4267 --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/MapView.java @@ -0,0 +1,328 @@ +package io.anuke.mindustry.editor; + +import com.badlogic.gdx.Input.Keys; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Colors; +import com.badlogic.gdx.graphics.Pixmap; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.input.GestureDetector; +import com.badlogic.gdx.input.GestureDetector.GestureListener; +import com.badlogic.gdx.math.Bresenham2; +import com.badlogic.gdx.math.GridPoint2; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.utils.ScissorStack; +import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.ui.GridImage; +import io.anuke.mindustry.world.ColorMapper; +import io.anuke.ucore.core.Core; +import io.anuke.ucore.core.Graphics; +import io.anuke.ucore.core.Inputs; +import io.anuke.ucore.graphics.Draw; +import io.anuke.ucore.graphics.Lines; +import io.anuke.ucore.graphics.Pixmaps; +import io.anuke.ucore.scene.Element; +import io.anuke.ucore.scene.event.InputEvent; +import io.anuke.ucore.scene.event.InputListener; +import io.anuke.ucore.scene.event.Touchable; +import io.anuke.ucore.scene.ui.TextField; +import io.anuke.ucore.scene.ui.layout.Unit; +import io.anuke.ucore.util.Mathf; +import io.anuke.ucore.util.Tmp; + +import static io.anuke.mindustry.Vars.ui; + +public class MapView extends Element implements GestureListener{ + private MapEditor editor; + private EditorTool tool = EditorTool.pencil; + private OperationStack stack = new OperationStack(); + private DrawOperation op; + private Pixmap current; + private Bresenham2 br = new Bresenham2(); + private boolean updated = false; + private float offsetx, offsety; + private float zoom = 1f; + private boolean grid = false; + private GridImage image = new GridImage(0, 0); + private Vector2 vec = new Vector2(); + private Rectangle rect = new Rectangle(); + + private boolean drawing; + private int lastx, lasty; + private int startx, starty; + + public void setTool(EditorTool tool){ + this.tool = tool; + } + + public EditorTool getTool() { + return tool; + } + + public void clearStack(){ + stack.clear(); + current = null; + } + + public OperationStack getStack() { + return stack; + } + + public void setGrid(boolean grid) { + this.grid = grid; + } + + public boolean isGrid() { + return grid; + } + + public void push(Pixmap previous, Pixmap add){ + DrawOperation op = new DrawOperation(editor.pixmap()); + op.add(previous, add); + stack.add(op); + this.current = add; + } + + public void undo(){ + if(stack.canUndo()){ + stack.undo(); + editor.updateTexture(); + } + } + + public void redo(){ + if(stack.canRedo()){ + stack.redo(); + editor.updateTexture(); + } + } + + public MapView(MapEditor editor){ + this.editor = editor; + + Inputs.addProcessor(0, new GestureDetector(20, 0.5f, 2, 0.15f, this)); + setTouchable(Touchable.enabled); + + addListener(new InputListener(){ + + @Override + public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { + if(pointer != 0){ + return false; + } + + if(current == null){ + current = Pixmaps.copy(editor.pixmap()); + } + updated = false; + + GridPoint2 p = project(x, y); + lastx = p.x; + lasty = p.y; + startx = p.x; + starty = p.y; + tool.touched(editor, p.x, p.y); + + if(tool.edit){ + updated = true; + ui.editor.resetSaved(); + } + + op = new DrawOperation(editor.pixmap()); + + drawing = true; + return true; + } + + @Override + public void touchUp (InputEvent event, float x, float y, int pointer, int button) { + drawing = false; + + GridPoint2 p = project(x, y); + + if(tool == EditorTool.line){ + ui.editor.resetSaved(); + Array points = br.line(startx, starty, p.x, p.y); + for(GridPoint2 point : points){ + editor.draw(point.x, point.y); + } + updated = true; + } + + if(updated){ + if(op == null) op = new DrawOperation(editor.pixmap()); + Pixmap next = Pixmaps.copy(editor.pixmap()); + op.add(current, next); + current = null; + stack.add(op); + op = null; + } + } + + @Override + public void touchDragged (InputEvent event, float x, float y, int pointer) { + GridPoint2 p = project(x, y); + + if(drawing && tool == EditorTool.pencil){ + ui.editor.resetSaved(); + Array points = br.line(lastx, lasty, p.x, p.y); + for(GridPoint2 point : points){ + editor.draw(point.x, point.y); + } + updated = true; + } + lastx = p.x; + lasty = p.y; + } + }); + } + + @Override + public void act(float delta){ + super.act(delta); + + if(Core.scene.getKeyboardFocus() == null || !(Core.scene.getKeyboardFocus() instanceof TextField) && + !Inputs.keyDown(Keys.CONTROL_LEFT)) { + float ax = Inputs.getAxis("move_x"); + float ay = Inputs.getAxis("move_y"); + offsetx -= ax * 15f / zoom; + offsety -= ay * 15f / zoom; + } + + if(ui.editor.hasPane()) return; + + zoom += Inputs.scroll()/10f * zoom; + clampZoom(); + } + + private void clampZoom(){ + zoom = Mathf.clamp(zoom, 0.2f, 12f); + } + + private GridPoint2 project(float x, float y){ + float ratio = 1f / ((float)editor.pixmap().getWidth() / editor.pixmap().getHeight()); + float size = Math.min(width, height); + float sclwidth = size * zoom; + float sclheight = size * zoom * ratio; + x = (x - getWidth()/2 + sclwidth/2 - offsetx*zoom) / sclwidth * editor.texture().getWidth(); + y = (y - getHeight()/2 + sclheight/2 - offsety*zoom) / sclheight * editor.texture().getHeight(); + return Tmp.g1.set((int)x, editor.texture().getHeight() - 1 - (int)y); + } + + private Vector2 unproject(int x, int y){ + float ratio = 1f / ((float)editor.pixmap().getWidth() / editor.pixmap().getHeight()); + float size = Math.min(width, height); + float sclwidth = size * zoom; + float sclheight = size * zoom * ratio; + float px = ((float)x / editor.texture().getWidth()) * sclwidth + offsetx*zoom - sclwidth/2 + getWidth()/2; + float py = (float)((float)(editor.texture().getHeight() - 1 - y) / editor.texture().getHeight()) * sclheight + + offsety*zoom - sclheight/2 + getHeight()/2; + return vec.set(px, py); + } + + @Override + public void draw(Batch batch, float alpha){ + float ratio = 1f / ((float)editor.pixmap().getWidth() / editor.pixmap().getHeight()); + float size = Math.min(width, height); + float sclwidth = size * zoom; + float sclheight = size * zoom * ratio; + float centerx = x + width/2 + offsetx * zoom; + float centery = y + height/2 + offsety * zoom; + + image.setImageSize(editor.pixmap().getWidth(), editor.pixmap().getHeight()); + + batch.flush(); + boolean pop = ScissorStack.pushScissors(rect.set(x + width/2 - size/2, y + height/2 - size/2, size, size)); + + batch.draw(editor.texture(), centerx - sclwidth/2, centery - sclheight/2, sclwidth, sclheight); + + if(grid){ + Draw.color(Color.GRAY); + image.setBounds(centerx - sclwidth/2, centery - sclheight/2, sclwidth, sclheight); + image.draw(batch, alpha); + Draw.color(); + } + + if(tool == EditorTool.line && drawing){ + Vector2 v1 = unproject(startx, starty).add(x, y); + float sx = v1.x, sy = v1.y; + Vector2 v2 = unproject(lastx, lasty).add(x, y); + + Draw.color(Tmp.c1.set(ColorMapper.getColor(editor.getDrawBlock()))); + Lines.stroke(Unit.dp.scl(3f * zoom)); + Lines.line(sx, sy, v2.x, v2.y); + + Lines.poly(sx, sy, 40, editor.getBrushSize() * zoom * 3); + + Lines.poly(v2.x, v2.y, 40, editor.getBrushSize() * zoom * 3); + } + + batch.flush(); + + if(pop) ScissorStack.popScissors(); + + Draw.color(Colors.get("accent")); + Lines.stroke(Unit.dp.scl(3f)); + Lines.rect(x + width/2 - size/2, y + height/2 - size/2, size, size); + Draw.reset(); + } + + private boolean active(){ + return Core.scene.getKeyboardFocus() != null + && Core.scene.getKeyboardFocus().isDescendantOf(ui.editor) + && ui.editor.isShown() && tool == EditorTool.zoom && + Core.scene.hit(Graphics.mouse().x, Graphics.mouse().y, true) == this; + } + + @Override + public boolean touchDown(float x, float y, int pointer, int button){ + return false; + } + + @Override + public boolean tap(float x, float y, int count, int button){ + return false; + } + + @Override + public boolean longPress(float x, float y){ + return false; + } + + @Override + public boolean fling(float velocityX, float velocityY, int button){ + return false; + } + + @Override + public boolean pan(float x, float y, float deltaX, float deltaY){ + if(!active()) return false; + offsetx += deltaX / zoom; + offsety -= deltaY / zoom; + return false; + } + + @Override + public boolean panStop(float x, float y, int pointer, int button){ + return false; + } + + @Override + public boolean zoom(float initialDistance, float distance){ + if(!active()) return false; + float nzoom = distance - initialDistance; + zoom += nzoom / 10000f / Unit.dp.scl(1f) * zoom; + clampZoom(); + return false; + } + + @Override + public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2, Vector2 pointer1, Vector2 pointer2){ + return false; + } + + @Override + public void pinchStop(){ + + } +} diff --git a/core/src/io/anuke/mindustry/editor/OperationStack.java b/core/src/io/anuke/mindustry/editor/OperationStack.java new file mode 100755 index 0000000000..b09e4c48d9 --- /dev/null +++ b/core/src/io/anuke/mindustry/editor/OperationStack.java @@ -0,0 +1,54 @@ +package io.anuke.mindustry.editor; + +import com.badlogic.gdx.utils.Array; + +public class OperationStack{ + private final static int maxSize = 10; + private Array stack = new Array<>(); + private int index = 0; + + public OperationStack(){ + + } + + public void clear(){ + for(DrawOperation op : stack){ + op.dispose(); + } + stack.clear(); + index = 0; + } + + public void add(DrawOperation action){ + stack.truncate(stack.size + index); + index = 0; + stack.add(action); + + if(stack.size > maxSize){ + stack.removeIndex(0); + } + } + + public boolean canUndo(){ + return !(stack.size - 1 + index < 0); + } + + public boolean canRedo(){ + return !(index > -1 || stack.size + index < 0); + } + + public void undo(){ + if(!canUndo()) return; + + stack.get(stack.size - 1 + index).undo(); + index --; + } + + public void redo(){ + if(!canRedo()) return; + + index ++; + stack.get(stack.size - 1 + index).redo(); + + } +} diff --git a/core/src/io/anuke/mindustry/io/MapTileData.java b/core/src/io/anuke/mindustry/io/MapTileData.java index 95f75b2d23..effacfec94 100644 --- a/core/src/io/anuke/mindustry/io/MapTileData.java +++ b/core/src/io/anuke/mindustry/io/MapTileData.java @@ -12,7 +12,7 @@ public class MapTileData { private final static int TILE_SIZE = 3; private final ByteBuffer buffer; - private final TileData tile = new TileData(); + private final TileDataWriter tile = new TileDataWriter(); private final int width, height; public MapTileData(int width, int height){ @@ -36,15 +36,22 @@ public class MapTileData { } /**Reads and returns the next tile data.*/ - public TileData read(){ - tile.read(); + public TileDataWriter read(){ + tile.read(buffer); return tile; } - /**Writes tile data at a specified position. Uses the tile data returned by read().*/ - public void write(int x, int y){ + /**Reads and returns the next tile data.*/ + public TileDataWriter readAt(int x, int y){ position(x, y); - tile.write(); + tile.read(buffer); + return tile; + } + + /**Writes tile data at a specified position.*/ + public void write(int x, int y, TileDataWriter writer){ + position(x, y); + writer.write(buffer); } /**Sets read position to the specified coordinates*/ @@ -52,12 +59,12 @@ public class MapTileData { buffer.position((x + width * y) * TILE_SIZE); } - public class TileData{ + public static class TileDataWriter { public byte floor, wall; public byte rotation; public byte team; - private void read(){ + public void read(ByteBuffer buffer){ floor = buffer.get(); wall = buffer.get(); byte rt = buffer.get(); @@ -65,7 +72,7 @@ public class MapTileData { team = Bits.getRightByte(rt); } - private void write(){ + public void write(ByteBuffer buffer){ buffer.put(floor); buffer.put(wall); byte rt = Bits.packByte(rotation, team); diff --git a/core/src/io/anuke/mindustry/io/Maps.java b/core/src/io/anuke/mindustry/io/Maps.java index 92b23ecb94..4f0c793108 100644 --- a/core/src/io/anuke/mindustry/io/Maps.java +++ b/core/src/io/anuke/mindustry/io/Maps.java @@ -1,9 +1,11 @@ package io.anuke.mindustry.io; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.ObjectMap; +import io.anuke.ucore.util.Log; import java.io.DataInputStream; import java.io.IOException; @@ -13,30 +15,43 @@ import static io.anuke.mindustry.Vars.customMapDirectory; import static io.anuke.mindustry.Vars.mapExtension; public class Maps implements Disposable{ + /**List of all built-in maps.*/ + private static final String[] defaultMapNames = {}; + private ObjectMap maps = new ObjectMap<>(); private Array allMaps = new Array<>(); - private Array customMaps = new Array<>(); - private Array defaultMaps = new Array<>(); - - public void load(){ - //TODO - } - - public void save(){ - //TODO? - } + private Array returnArray = new Array<>(); /**Returns a list of all maps, including custom ones.*/ public Array all(){ return allMaps; } + /**Returns a list of only custo maps.*/ + public Array customMaps(){ + returnArray.clear(); + for(Map map : allMaps){ + if(map.custom) returnArray.add(map); + } + return returnArray; + } + + /**Returns a list of only default maps.*/ + public Array defaultMaps(){ + returnArray.clear(); + for(Map map : allMaps){ + if(!map.custom) returnArray.add(map); + } + return returnArray; + } + /**Returns map by internal name.*/ public Map getByName(String name){ return maps.get(name); } //TODO GWT support: read from prefs string if custom + /**Reads all tile data from a map. Should be used sparingly.*/ public MapTileData readTileData(Map map){ try { InputStream stream; @@ -56,6 +71,35 @@ public class Maps implements Disposable{ } } + /**Load all maps. Should be called at application start.*/ + public void load(){ + try { + for (String name : defaultMapNames) { + loadMap(Gdx.files.internal("maps/" + name + "." + mapExtension), false); + } + }catch (IOException e){ + throw new RuntimeException(e); + } + + for(FileHandle file : customMapDirectory.list()){ + try{ + loadMap(file, true); + }catch (IOException e){ + Log.err("Failed to load custom map file '{0}'!", file); + Log.err(e); + } + } + } + + private void loadMap(FileHandle file, boolean custom) throws IOException{ + DataInputStream ds = new DataInputStream(file.read()); + MapMeta meta = readMapMeta(ds); + Map map = new Map(file.nameWithoutExtension(), meta, custom); + + maps.put(map.name, map); + allMaps.add(map); + } + private MapTileData readTileData(DataInputStream stream) throws IOException{ MapMeta meta = readMapMeta(stream); byte[] bytes = new byte[stream.available()]; diff --git a/core/src/io/anuke/mindustry/world/WorldGenerator.java b/core/src/io/anuke/mindustry/world/WorldGenerator.java index 488679416a..c41ac84694 100644 --- a/core/src/io/anuke/mindustry/world/WorldGenerator.java +++ b/core/src/io/anuke/mindustry/world/WorldGenerator.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.world; import com.badlogic.gdx.utils.ObjectMap; import io.anuke.mindustry.io.MapTileData; -import io.anuke.mindustry.io.MapTileData.TileData; +import io.anuke.mindustry.io.MapTileData.TileDataWriter; import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.ucore.noise.Noise; @@ -23,7 +23,7 @@ public class WorldGenerator { for(int x = 0; x < data.width(); x ++){ for(int y = 0; y < data.height(); y ++){ - TileData tile = data.read(); + TileDataWriter tile = data.read(); tiles[x][y] = new Tile(x, y, tile.floor, tile.wall, tile.rotation, tile.team); //TODO ores, plants, extra decoration? diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index 7299696239..4256303087 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -8,6 +8,7 @@ import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.game.Difficulty; import io.anuke.mindustry.game.EventType.GameOverEvent; import io.anuke.mindustry.game.GameMode; +import io.anuke.mindustry.io.Map; import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.io.Version; import io.anuke.mindustry.net.Net; @@ -17,7 +18,6 @@ import io.anuke.mindustry.net.Packets.ChatPacket; import io.anuke.mindustry.net.Packets.KickReason; import io.anuke.mindustry.net.TraceInfo; import io.anuke.mindustry.ui.fragments.DebugFragment; -import io.anuke.mindustry.world.Map; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.*; import io.anuke.ucore.modules.Module; @@ -34,8 +34,6 @@ import java.util.Scanner; import static io.anuke.mindustry.Vars.*; import static io.anuke.ucore.util.Log.*; -; - public class ServerControl extends Module { private final CommandHandler handler = new CommandHandler(""); private ShuffleMode mode; @@ -81,12 +79,12 @@ public class ServerControl extends Module { } if (mode != ShuffleMode.off) { - Array maps = mode == ShuffleMode.both ? world.maps().getAllMaps() : - mode == ShuffleMode.normal ? world.maps().getDefaultMaps() : world.maps().getCustomMaps(); + Array maps = mode == ShuffleMode.both ? world.maps().all() : + mode == ShuffleMode.normal ? world.maps().defaultMaps() : world.maps().customMaps(); Map previous = world.getMap(); Map map = previous; - while (map == previous || !map.visible) map = maps.random(); + while (map == previous) map = maps.random(); info("Selected next map to be {0}.", map.name); state.set(State.playing); @@ -134,7 +132,7 @@ public class ServerControl extends Module { String search = arg[0]; Map result = null; - for(Map map : world.maps().list()){ + for(Map map : world.maps().all()){ if(map.name.equalsIgnoreCase(search)) result = map; } @@ -165,8 +163,8 @@ public class ServerControl extends Module { handler.register("maps", "Display all available maps.", arg -> { Log.info("Maps:"); - for(Map map : world.maps().getAllMaps()){ - Log.info(" &ly{0}: &lb&fi{1} / {2}x{3}", map.name, map.custom ? "Custom" : "Default", map.getWidth(), map.getHeight()); + for(Map map : world.maps().all()){ + Log.info(" &ly{0}: &lb&fi{1} / {2}x{3}", map.name, map.custom ? "Custom" : "Default", map.meta.width, map.meta.height); } }); @@ -505,7 +503,8 @@ public class ServerControl extends Module { return; } - world.removeBlock(world.getCore()); + Events.fire(GameOverEvent.class); + info("Core destroyed."); }); diff --git a/server/src/io/anuke/mindustry/server/mapgen/ProcGen.java b/server/src/io/anuke/mindustry/server/mapgen/ProcGen.java index b50ceeafbb..8e374d24d9 100644 --- a/server/src/io/anuke/mindustry/server/mapgen/ProcGen.java +++ b/server/src/io/anuke/mindustry/server/mapgen/ProcGen.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.server.mapgen; -import io.anuke.mindustry.world.Map; +import io.anuke.mindustry.io.Map; import io.anuke.ucore.noise.RidgedPerlin; import io.anuke.ucore.noise.Simplex;