From 07ac552495b70c0bf640985a9f3f81f9aaaa14f7 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 26 Nov 2017 18:59:03 -0500 Subject: [PATCH] Major refactoring; implemented multi-frame pathfinding --- core/assets-raw/sprites/blocks/blackrock1.png | Bin 0 -> 223 bytes .../sprites/blocks/blackrockshadow1.png | Bin 0 -> 248 bytes .../assets-raw/sprites/blocks/blackstone1.png | Bin 0 -> 186 bytes .../assets-raw/sprites/blocks/blackstone2.png | Bin 0 -> 196 bytes .../assets-raw/sprites/blocks/blackstone3.png | Bin 0 -> 194 bytes .../sprites/blocks/blackstoneblock1.png | Bin 0 -> 207 bytes .../sprites/blocks/blackstoneblock2.png | Bin 0 -> 208 bytes .../sprites/blocks/blackstoneblock3.png | Bin 0 -> 206 bytes .../sprites/blocks/blackstoneedge.png | Bin 0 -> 224 bytes .../sprites/blocks/grassblock-edge-0.png | Bin 0 -> 237 bytes .../sprites/blocks/grassblock-edge-1.png | Bin 0 -> 238 bytes .../sprites/blocks/grassblock-edge-2.png | Bin 0 -> 244 bytes .../sprites/blocks/grassblock-edge-3.png | Bin 0 -> 241 bytes .../{grassblock.png => grassblock1.png} | Bin 237 -> 237 bytes .../sprites/blocks/{rock.png => rock1.png} | Bin .../{rockshadow.png => rockshadow1.png} | Bin .../{rock2shadow.png => rockshadow2.png} | Bin core/assets-raw/sprites/blocks/stone1.png | Bin 189 -> 189 bytes core/assets-raw/sprites/blocks/stone2.png | Bin 189 -> 189 bytes .../sprites/blocks/stoneblock-edge-0.png | Bin 0 -> 219 bytes .../sprites/blocks/stoneblock-edge-1.png | Bin 0 -> 214 bytes .../sprites/blocks/stoneblock-edge-2.png | Bin 0 -> 216 bytes .../sprites/blocks/stoneblock-edge-3.png | Bin 0 -> 215 bytes .../sprites/blocks/stoneblock-smooth1.png | Bin 0 -> 186 bytes core/assets-raw/sprites/blocks/stoneblock.png | Bin 208 -> 0 bytes .../assets-raw/sprites/blocks/stoneblock1.png | Bin 0 -> 208 bytes core/assets/maps/canyon.png | Bin 3846 -> 2875 bytes core/assets/maps/volcano.png | Bin 0 -> 7625 bytes core/assets/sprites/sprites.atlas | 550 +++++++++++------- core/assets/sprites/sprites.png | Bin 49705 -> 50433 bytes core/src/io/anuke/mindustry/Mindustry.java | 2 + core/src/io/anuke/mindustry/Vars.java | 2 + .../src/io/anuke/mindustry/ai/MHueristic.java | 3 +- .../io/anuke/mindustry/ai/PassTileGraph.java | 6 +- core/src/io/anuke/mindustry/ai/Pathfind.java | 73 ++- core/src/io/anuke/mindustry/ai/Raycaster.java | 3 +- core/src/io/anuke/mindustry/core/Control.java | 58 +- .../src/io/anuke/mindustry/core/Renderer.java | 41 +- .../src/io/anuke/mindustry/core/Tutorial.java | 50 +- .../io/anuke/mindustry/entities/Bullet.java | 4 +- .../mindustry/entities/effect/DamageArea.java | 3 +- .../anuke/mindustry/entities/effect/EMP.java | 3 +- .../mindustry/entities/enemies/Enemy.java | 21 +- .../entities/enemies/HealerEnemy.java | 13 +- .../anuke/mindustry/input/AndroidInput.java | 11 +- core/src/io/anuke/mindustry/input/Input.java | 11 +- core/src/io/anuke/mindustry/io/SaveIO.java | 34 +- .../io/anuke/mindustry/ui/LevelDialog.java | 3 +- core/src/io/anuke/mindustry/world/Block.java | 20 +- .../io/anuke/mindustry/world/Generator.java | 38 +- core/src/io/anuke/mindustry/world/Map.java | 16 +- .../io/anuke/mindustry/world/SpawnPoint.java | 14 + core/src/io/anuke/mindustry/world/Tile.java | 11 +- core/src/io/anuke/mindustry/world/World.java | 153 +++-- .../anuke/mindustry/world/blocks/Blocks.java | 64 +- .../world/blocks/types/BlendBlock.java | 31 + .../mindustry/world/blocks/types/Floor.java | 7 +- .../world/blocks/types/defense/Door.java | 11 + .../blocks/types/defense/RepairTurret.java | 4 +- .../blocks/types/production/Generator.java | 5 +- 60 files changed, 767 insertions(+), 498 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/blackrock1.png create mode 100644 core/assets-raw/sprites/blocks/blackrockshadow1.png create mode 100644 core/assets-raw/sprites/blocks/blackstone1.png create mode 100644 core/assets-raw/sprites/blocks/blackstone2.png create mode 100644 core/assets-raw/sprites/blocks/blackstone3.png create mode 100644 core/assets-raw/sprites/blocks/blackstoneblock1.png create mode 100644 core/assets-raw/sprites/blocks/blackstoneblock2.png create mode 100644 core/assets-raw/sprites/blocks/blackstoneblock3.png create mode 100644 core/assets-raw/sprites/blocks/blackstoneedge.png create mode 100644 core/assets-raw/sprites/blocks/grassblock-edge-0.png create mode 100644 core/assets-raw/sprites/blocks/grassblock-edge-1.png create mode 100644 core/assets-raw/sprites/blocks/grassblock-edge-2.png create mode 100644 core/assets-raw/sprites/blocks/grassblock-edge-3.png rename core/assets-raw/sprites/blocks/{grassblock.png => grassblock1.png} (51%) rename core/assets-raw/sprites/blocks/{rock.png => rock1.png} (100%) rename core/assets-raw/sprites/blocks/{rockshadow.png => rockshadow1.png} (100%) rename core/assets-raw/sprites/blocks/{rock2shadow.png => rockshadow2.png} (100%) create mode 100644 core/assets-raw/sprites/blocks/stoneblock-edge-0.png create mode 100644 core/assets-raw/sprites/blocks/stoneblock-edge-1.png create mode 100644 core/assets-raw/sprites/blocks/stoneblock-edge-2.png create mode 100644 core/assets-raw/sprites/blocks/stoneblock-edge-3.png create mode 100644 core/assets-raw/sprites/blocks/stoneblock-smooth1.png delete mode 100644 core/assets-raw/sprites/blocks/stoneblock.png create mode 100644 core/assets-raw/sprites/blocks/stoneblock1.png create mode 100644 core/assets/maps/volcano.png create mode 100644 core/src/io/anuke/mindustry/world/SpawnPoint.java create mode 100644 core/src/io/anuke/mindustry/world/blocks/types/BlendBlock.java create mode 100644 core/src/io/anuke/mindustry/world/blocks/types/defense/Door.java diff --git a/core/assets-raw/sprites/blocks/blackrock1.png b/core/assets-raw/sprites/blocks/blackrock1.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3b7f166beaae0687f3563adff1c66da300e180 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4mJh`h9ms@x)~T4I14-?iy0WWg+Z8+Vb&Z8 z1_lQ95>H=O_J`b(LWZVC9RKq$Ffd4#xJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5r zgg5euGcYhjdb&7;T*rKH2$J%-o3GIoDBC#*YR=6!#rD^cAOZbfM`EMGF=(Yr7Ab~3(O XZDGZKR?~`sfq}u()z4*}Q$iB}$+Srl literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/blackrockshadow1.png b/core/assets-raw/sprites/blocks/blackrockshadow1.png new file mode 100644 index 0000000000000000000000000000000000000000..fcf89d89701c49e0993885950db70992e0e09124 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4mJh`h9ms@x)~T4I14-?iy0WWg+Z8+Vb&Z8 z1_lQ95>H=O_J`b(LWV|Bs#)t97#Ji=Tq8=H^K)}k^GX<;i&7IyQd1PlGfOfQ+&z5* z!W;R-85kIfJY5_^BrfNkGvs15T$uXwo-{*1wrf&oZ&KRDsKe4}Ty~#a*mwM% w?wXi3t5|M|@v$BAQ__q!SHu|^@3gM_xYKG^{*MY<1_lNOPgg&ebxsLQ05j54(*OVf literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/blackstone1.png b/core/assets-raw/sprites/blocks/blackstone1.png new file mode 100644 index 0000000000000000000000000000000000000000..42266645c82021451902d9ab7177064de01c7de4 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4kiW$2Jc+WI}8jAoCO|{#S9GG!XV7ZFl&wk z0|NtliKnkC`$KL?L1TtRP0znDFfd4#xJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5r zgg5euGcYiic)B=-a9mI3;p0m?z&1lc#NOUsjMF5LV>+i(?VlfldR&Q{540*UoJ(~w jZrt!xCqwN3Bg5x^0_oiA*YPqiFfe$!`njxgN@xNA|7|e; literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/blackstone2.png b/core/assets-raw/sprites/blocks/blackstone2.png new file mode 100644 index 0000000000000000000000000000000000000000..e62cc82c15b7c1e30815390442b31579bd2fe0ac GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4kiW$2Jc+WI}8jAoCO|{#S9GG!XV7ZFl&wk z0|NtliKnkC`$KL?L1US1&AWFqFfd4#xJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5r zgg5euGcYjNdAc};a9q#zJ;}?Uz_GgbKi~0x&Kny0)mQ@KY+rV9{OMy*nJL2H;5joh uDPi`~KB4%l7w`7oOH2Lz>1$SxY~McN)C(VUo-i;lFnGH9xvXa{&g48Po`&8fVZHnV$e$R*af_L7_&-CKS$FfcH9y85}Sb4q9e0E+lIo&W#< literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/blackstoneblock1.png b/core/assets-raw/sprites/blocks/blackstoneblock1.png new file mode 100644 index 0000000000000000000000000000000000000000..ceac507a115f7bac7d5ef0606b91a436e5467d84 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4kiW$2Jc+WI}8jAoCO|{#S9GG!XV7ZFl&wk z0|NtliKnkC`$KL?Azc-Zwx-1l3=EPbt`Q~9`MJ5Nc_j?aMX8A;sVNHOnI#zt?w-B@ z;f;La3=9mOo-U3d9M^Mu4Y?Q`Ihc!2i#5If{9k{A$g(|7A1un&PCB9D@3LceU$jH$ zR!PN7Z>D46q2g;cFWGtevGSQWerMPi{+L;1&7Cm=&uPSDn+Y=VV}DVDNPHb6Mw< G&;$ULc|KeK literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/blackstoneblock3.png b/core/assets-raw/sprites/blocks/blackstoneblock3.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe4fb638d929af55189b45dcacde2c1654aa82d GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4kiW$2Jc+WI}8jAoCO|{#S9GG!XV7ZFl&wk z0|NtliKnkC`$KL?AtP&!D~%@@7#Ji=Tq8=H^K)}k^GX<;i&7IyQd1PlGfOfQ+&z5* z!W;R-85kHmJY5_^IIfrWIdU-=axkYaWj`qX>%TdN-lv}_9Gh@N-B`JaTW#g4 zS!bAZ94>vhrgVs*{C``?CfUBb2l=;M*!MG4_WDfy)|Dz@>nlzhFfcGMc)I$ztaD0e F0svZQKg|FD literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/blackstoneedge.png b/core/assets-raw/sprites/blocks/blackstoneedge.png new file mode 100644 index 0000000000000000000000000000000000000000..945f4efdd87f678f474017eec1c7151b11938f3f GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0y~yVBi5^4mJh`hOp9@=L`%CoCO|{#S9GG!XV7ZFl&wk z0|NtliKnkC`$KL?K@&Cmb6?IeFfd4#xJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5r zgg5euGcYhjdAc};Xq?|V(UFfKkj445%*5nx7Vnb7)YN`*i|yB*x=%sHII!sZ`3X}# zsVw~!*Pb YeY$gB?d{#nz`(%Z>FVdQ&MBb@03Ml1{{R30 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/grassblock-edge-0.png b/core/assets-raw/sprites/blocks/grassblock-edge-0.png new file mode 100644 index 0000000000000000000000000000000000000000..637f3bbab0185e87a00ca0fc2e4a38f9e9947a2f GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4mJh`h9ms@x)~T4I14-?iy0WWg+Z8+Vb&Z8 z1_lQ95>H=O_J`b(LX4);>?i*-Ffd4#xJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5r zgg5euGcYiud%8G=NL()MwdQM35MWKu++tujr(yBUDrf&kjB9){I5=5DA{?*XH=DfY zOttpuZJ)|jQ+w|Fd!3pxrTT`2PqHb)M-HnuLJf>F=GJH=O_J`b(LQDeHdVbXm3=EPbt`Q~9`MJ5Nc_j?aMX8A;sVNHOnI#zt?w-B@ z;f;La3=9kzo-U3d5|?v(4Y?W&1X$EFw+J-pf5_bS@51yaj4PQknH=O_J`b(LQKj>{^{p3Ffd4#xJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5r zgg5euGcYjZdAc};NL()MGvsP8;Bk$2x!|ZVZ-IO9*S2{_m`j9WycRlJUv<=8nJ|ri z{`Bc5Hm&{R+t>N-PXDB2rQ=_wnYL#xVdgj|9vjB7gE2Y%rxUNh9Q|YG7UhR~NLM^~ s7MQDG;eWQ+p5X=K#o4zeBtK%xpXvJVMwo~;0|Nttr>mdKI;Vst0KBwNegFUf literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/grassblock-edge-3.png b/core/assets-raw/sprites/blocks/grassblock-edge-3.png new file mode 100644 index 0000000000000000000000000000000000000000..b087d0c2f217d3c66722bd898e2d2a146c8520bf GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4mJh`h9ms@x)~T4I14-?iy0WWg+Z8+Vb&Z8 z1_lQ95>H=O_J`b(LQLlORDKIEFfd4#xJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5r zgg5euGcYh@d%8G=NL()MGvqp;z~j0<_SQm$c?TAkzU8eJ;(wsBqvOE@pO+W3CSKB! zx6{`*JYM=Je}~{S8KE75J1%NeulwD`%8;cKd{dEuKVk202jPI^#;0}cCmFshGb>QO!`$uho&V~7BL)Tr22WQ%mvv4FO#sCaPqF|2 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/grassblock.png b/core/assets-raw/sprites/blocks/grassblock1.png similarity index 51% rename from core/assets-raw/sprites/blocks/grassblock.png rename to core/assets-raw/sprites/blocks/grassblock1.png index 1263fd50b9e8d009f01b2690a667264a5ff93653..9738aee34fa21610bd786ffe392306e79528c57d 100644 GIT binary patch delta 19 acmaFM_?B^k11Gnn5RV*_sNbiFo=X5aSOx0< delta 19 bcmaFM_?B^k11GBplNI|uxlP>@J(mCgKhXxM diff --git a/core/assets-raw/sprites/blocks/rock.png b/core/assets-raw/sprites/blocks/rock1.png similarity index 100% rename from core/assets-raw/sprites/blocks/rock.png rename to core/assets-raw/sprites/blocks/rock1.png diff --git a/core/assets-raw/sprites/blocks/rockshadow.png b/core/assets-raw/sprites/blocks/rockshadow1.png similarity index 100% rename from core/assets-raw/sprites/blocks/rockshadow.png rename to core/assets-raw/sprites/blocks/rockshadow1.png diff --git a/core/assets-raw/sprites/blocks/rock2shadow.png b/core/assets-raw/sprites/blocks/rockshadow2.png similarity index 100% rename from core/assets-raw/sprites/blocks/rock2shadow.png rename to core/assets-raw/sprites/blocks/rockshadow2.png diff --git a/core/assets-raw/sprites/blocks/stone1.png b/core/assets-raw/sprites/blocks/stone1.png index 71457fcffff71a5c8cabd1bf2bc3e76f10005791..ba1dd7c5a778edf5afe5c4967962d083e43c17e1 100644 GIT binary patch delta 19 acmdnXxR-H)11Gnnpb=Zpui}P@o+SV}a|TcV delta 19 bcmdnXxR-H)11F2Ds5aZ-gGGlXdX@kHJopB~ diff --git a/core/assets-raw/sprites/blocks/stone2.png b/core/assets-raw/sprites/blocks/stone2.png index c655c1abd481602a63eb48614f76b5a55c65d7e0..19f4ea319e2e57a05b60312faed080c9666b0997 100644 GIT binary patch delta 19 acmdnXxR-H)11Gm6i=xga=UMR+Jxc&O-3CVh delta 19 acmdnXxR-H)11F2DsJ7aV^+8+{Jxc&Pe+Di9 diff --git a/core/assets-raw/sprites/blocks/stoneblock-edge-0.png b/core/assets-raw/sprites/blocks/stoneblock-edge-0.png new file mode 100644 index 0000000000000000000000000000000000000000..6a3a9bb5fc1929d9ab5a50b876b7a703d6d89c32 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4mJh`h9ms@x)~T4I14-?iy0WWg+Z8+Vb&Z8 z1_lQ95>H=O_J`b(f>!eXJOVu!7#Ji=Tq8=H^K)}k^GX<;i&7IyQd1PlGfOfQ+&z5* z!W;R-85kHsJzX3_BrezX8S))a;9*`LsCwi~@=wFr=}%V9?a~n4t9iH=O_J`b(f>x5^+FxoJ7#Ji=Tq8=H^K)}k^GX<;i&7IyQd1PlGfOfQ+&z5* z!W;R-85kG>JY5_^BrezXS#uq5;9xanv1wTTb>FsY{L+(8^$L`&{lk-=VqE%V6R?QPuO3K`I{>=WQf0r(BzdK=I{^822I}8jA N44$rjF6*2UngH~SM!f(4 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/stoneblock-edge-2.png b/core/assets-raw/sprites/blocks/stoneblock-edge-2.png new file mode 100644 index 0000000000000000000000000000000000000000..f04fc23d9c2c7b71257e91685675160a4b3755c3 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4mJh`h9ms@x)~T4I14-?iy0WWg+Z8+Vb&Z8 z1_lQ95>H=O_J`b(f@)%kkGE`OU|^6eag8W(&d<$F%`0JWE=o--Nlj5G&n(GMaQE~L z2yf&QXJB9m@^oGlRqS!mkKSJ$T90NaUe~Ro&?lCkr&Y3)O zP1d9he~ohQ-`m*a&)l%&q+2d~mOt~0y~p#LmuPmrerCBR&gEcGs~=~ye*O8KD~cHy P7#KWV{an^LB{Ts5b%aEw literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/stoneblock-edge-3.png b/core/assets-raw/sprites/blocks/stoneblock-edge-3.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab05cd11ecca8b311a045820758a4edcb8c80df GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4mJh`h9ms@x)~T4I14-?iy0WWg+Z8+Vb&Z8 z1_lQ95>H=O_J`b(f-34v+}Ai67#Ji=Tq8=H^K)}k^GX<;i&7IyQd1PlGfOfQ+&z5* z!W;R-85kG>JzX3_BrezXZR9T`OyV#08mha~Hx8eB_Rsq4(a|~ujY%HEjPgtwzq;pm)lYxPO N!PC{xWt~$(69Dz~KlA_q literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/stoneblock-smooth1.png b/core/assets-raw/sprites/blocks/stoneblock-smooth1.png new file mode 100644 index 0000000000000000000000000000000000000000..181d85bcd075d02061340e45452b9d8e31a800b0 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4kiW$2Jc+WI}8jAoCO|{#S9GG!XV7ZFl&wk z0|NtliKnkC`$KL?L33fJfMh)e1_sFz*N775{M_8syb=cIqSVBa)D(sC%#sWRcTeAd z@J2py1_lNbPZ!4!j_b)f8X5@)*k(M?DFXu?p^OIBbH9FmRxew8f#*o3h_H+3rbYqd fnFhY?3=C!SdCLWU*H2<#U|{fc^>bP0l+XkK;)pT; literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/stoneblock.png b/core/assets-raw/sprites/blocks/stoneblock.png deleted file mode 100644 index 37510d29e57acdc649c3184d6963307caf1ec3f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4kiW$2Jc+WI}8jAoCO|{#S9GG!XV7ZFl&wk z0|NtliKnkC`$HC4A#LT}t_=(f3=EPbt`Q~9`MJ5Nc_j?aMX8A;sVNHOnI#zt?w-B@ z;f;La3=9ljo-U3d9M^MuH}W2E;9=?%J;_`Vk^iQT@kNkAt=+ExNu3?5cQbmN^2zC% zIdRJ#mD|<*cDxKKg&OBhY+wio{m(lo?sMV|>#ZLDY~S+hWQDr7t_0cb>FVdQ&MBb@ E0Db;GZ2$lO diff --git a/core/assets-raw/sprites/blocks/stoneblock1.png b/core/assets-raw/sprites/blocks/stoneblock1.png new file mode 100644 index 0000000000000000000000000000000000000000..0783b4b26f98b57e4cde2dda96bc0a432bbcfe41 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4kiW$2Jc+WI}8jAoCO|{#S9GG!XV7ZFl&wk z0|NtliKnkC`$KL?Az`Dx({=h87#Ji=Tq8=H^K)}k^GX<;i&7IyQd1PlGfOfQ+&z5* z!W;R-85kJ6JY5_^IIidRZsa}Sz{AujdXl*!BL7Vvp_)>}RP*}mo1$qIFEUCF?}z~JfX=d#Wz Gp$P!P)IRS3 literal 0 HcmV?d00001 diff --git a/core/assets/maps/canyon.png b/core/assets/maps/canyon.png index ab4521e23d14e453bf99450bfedcd5b78cafbc40..7240a5a5f5cdcfd9d36049967d6b41e340d23d7a 100644 GIT binary patch delta 2805 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 delta 3811 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 G5}E*J>>tGd diff --git a/core/assets/maps/volcano.png b/core/assets/maps/volcano.png new file mode 100644 index 0000000000000000000000000000000000000000..77b5212411322a5b0bbd9bc3c3a329766e93adb1 GIT binary patch literal 7625 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 YQ;$de*L}Z)fq{X+)78&qol`;+0B`t*qyPW_ literal 0 HcmV?d00001 diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 4f7cbdb16d..6b1f113a62 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -13,18 +13,81 @@ backgrounds/background index: -1 blank rotate: false - xy: 383, 391 + xy: 473, 386 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 -blocks/block +blocks/blackrock1 + rotate: false + xy: 230, 67 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/blackrockshadow1 rotate: false xy: 240, 67 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 +blocks/blackstone1 + rotate: false + xy: 450, 480 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/blackstone2 + rotate: false + xy: 343, 199 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/blackstone3 + rotate: false + xy: 450, 470 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/blackstoneblock1 + rotate: false + xy: 333, 197 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/blackstoneblock2 + rotate: false + xy: 343, 189 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/blackstoneblock3 + rotate: false + xy: 333, 187 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/blackstoneedge + rotate: false + xy: 499, 499 + size: 12, 12 + orig: 12, 12 + offset: 0, 0 + index: -1 +blocks/block + rotate: false + xy: 443, 303 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 blocks/block-2x2 rotate: false xy: 194, 15 @@ -55,98 +118,98 @@ blocks/chainturret-icon index: -1 blocks/coal1 rotate: false - xy: 343, 199 + xy: 443, 283 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coal2 rotate: false - xy: 450, 470 + xy: 439, 273 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coal3 rotate: false - xy: 333, 197 + xy: 439, 263 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coaldrill rotate: false - xy: 343, 189 + xy: 439, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coalgenerator rotate: false - xy: 333, 187 + xy: 232, 11 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/coalpurifier rotate: false - xy: 457, 355 + xy: 232, 1 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/combustiongenerator rotate: false - xy: 467, 355 + xy: 242, 13 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/compositewall rotate: false - xy: 443, 313 + xy: 242, 3 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduit rotate: false - xy: 443, 303 + xy: 469, 355 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduitbottom rotate: false - xy: 443, 293 + xy: 449, 273 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduitliquid rotate: false - xy: 443, 283 + xy: 449, 263 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conduittop rotate: false - xy: 439, 273 + xy: 449, 253 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conveyor rotate: false - xy: 439, 263 + xy: 476, 415 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/conveyormove rotate: false - xy: 439, 253 + xy: 476, 405 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -160,70 +223,70 @@ blocks/core index: -1 blocks/cross rotate: false - xy: 232, 11 + xy: 476, 395 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/crucible rotate: false - xy: 232, 1 + xy: 476, 385 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/deepwater rotate: false - xy: 242, 13 + xy: 473, 375 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/dirt1 rotate: false - xy: 242, 3 + xy: 473, 365 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/dirt2 rotate: false - xy: 470, 431 + xy: 479, 355 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/dirt3 rotate: false - xy: 480, 431 + xy: 367, 174 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/dirtblock rotate: false - xy: 449, 273 + xy: 483, 375 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/dirtedge rotate: false - xy: 499, 499 + xy: 499, 485 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/doubleturret rotate: false - xy: 470, 453 + xy: 456, 425 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/duriumwall rotate: false - xy: 449, 263 + xy: 483, 365 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -237,112 +300,140 @@ blocks/duriumwall-large index: -1 blocks/duriumwall-large-icon rotate: false - xy: 449, 253 + xy: 489, 355 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/flameturret rotate: false - xy: 456, 425 + xy: 452, 413 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/fluxpump rotate: false - xy: 476, 411 + xy: 415, 198 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grass1 rotate: false - xy: 476, 401 + xy: 427, 217 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grass2 rotate: false - xy: 476, 391 + xy: 425, 207 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grass3 rotate: false - xy: 490, 431 + xy: 425, 197 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 -blocks/grassblock +blocks/grassblock-edge-0 rotate: false - xy: 486, 421 + xy: 413, 178 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/grassblock-edge-1 + rotate: false + xy: 423, 177 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/grassblock-edge-2 + rotate: false + xy: 443, 341 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/grassblock-edge-3 + rotate: false + xy: 453, 343 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/grassblock1 + rotate: false + xy: 415, 188 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grassblock2 rotate: false - xy: 486, 411 + xy: 425, 187 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/grassedge rotate: false - xy: 353, 195 + xy: 353, 181 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/iron1 rotate: false - xy: 473, 369 + xy: 503, 431 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/iron2 rotate: false - xy: 483, 381 + xy: 503, 421 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/iron3 rotate: false - xy: 483, 371 + xy: 503, 411 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/irondrill rotate: false - xy: 493, 381 + xy: 503, 401 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/ironwall rotate: false - xy: 503, 381 + xy: 503, 391 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/junction rotate: false - xy: 493, 371 + xy: 503, 381 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/laserturret rotate: false - xy: 449, 365 + xy: 317, 131 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -356,70 +447,70 @@ blocks/lava index: -1 blocks/lavaedge rotate: false - xy: 353, 181 + xy: 399, 179 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/lavasmelter rotate: false - xy: 415, 215 + xy: 503, 361 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/liquiditemjunction rotate: false - xy: 415, 205 + xy: 503, 351 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/liquidjunction rotate: false - xy: 415, 195 + xy: 503, 341 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/liquidrouter rotate: false - xy: 425, 217 + xy: 493, 443 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/machineturret rotate: false - xy: 445, 353 + xy: 329, 131 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/megarepairturret rotate: false - xy: 317, 131 + xy: 341, 131 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/mortarturret rotate: false - xy: 329, 131 + xy: 230, 21 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/mossblock rotate: false - xy: 425, 197 + xy: 493, 423 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/mossstone rotate: false - xy: 425, 197 + xy: 493, 423 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -433,7 +524,7 @@ blocks/nuclearreactor index: -1 blocks/nuclearreactor-icon rotate: false - xy: 343, 159 + xy: 493, 403 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -447,224 +538,224 @@ blocks/nuclearreactor-small index: -1 blocks/oil rotate: false - xy: 409, 169 + xy: 493, 393 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/oiledge rotate: false - xy: 399, 179 + xy: 460, 465 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/oilrefinery rotate: false - xy: 443, 341 + xy: 493, 383 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/omnidrill rotate: false - xy: 301, 124 + xy: 493, 373 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/plasmaturret rotate: false - xy: 341, 131 + xy: 242, 23 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/powerbooster rotate: false - xy: 439, 243 + xy: 301, 124 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/poweredconveyor rotate: false - xy: 449, 243 + xy: 439, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/poweredconveyormove rotate: false - xy: 433, 233 + xy: 449, 243 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/powerlaser rotate: false - xy: 443, 233 + xy: 433, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/powerlaserrouter rotate: false - xy: 453, 233 + xy: 443, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pulseconduit rotate: false - xy: 435, 223 + xy: 453, 233 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pulseconduitbottom rotate: false - xy: 435, 213 + xy: 437, 223 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pulseconduittop rotate: false - xy: 445, 223 + xy: 447, 223 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/pump rotate: false - xy: 435, 203 + xy: 437, 213 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/repairturret rotate: false - xy: 230, 21 + xy: 464, 413 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 -blocks/rock +blocks/rock1 rotate: false - xy: 445, 203 + xy: 435, 203 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/rock2 - rotate: false - xy: 455, 223 - size: 8, 8 - orig: 8, 8 - offset: 0, 0 - index: -1 -blocks/rock2shadow - rotate: false - xy: 455, 213 - size: 8, 8 - orig: 8, 8 - offset: 0, 0 - index: -1 -blocks/rockshadow - rotate: false - xy: 455, 203 - size: 8, 8 - orig: 8, 8 - offset: 0, 0 - index: -1 -blocks/router rotate: false xy: 435, 193 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 -blocks/rtgenerator +blocks/rockshadow1 + rotate: false + xy: 445, 203 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/rockshadow2 rotate: false xy: 445, 193 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 +blocks/router + rotate: false + xy: 457, 223 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/rtgenerator + rotate: false + xy: 457, 213 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 blocks/shadow - rotate: false - xy: 242, 23 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -blocks/shieldgenerator - rotate: false - xy: 425, 187 - size: 8, 8 - orig: 8, 8 - offset: 0, 0 - index: -1 -blocks/shotgunturret - rotate: false - xy: 464, 413 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -blocks/shrub - rotate: false - xy: 445, 183 - size: 8, 8 - orig: 8, 8 - offset: 0, 0 - index: -1 -blocks/shrubshadow - rotate: false - xy: 455, 183 - size: 8, 8 - orig: 8, 8 - offset: 0, 0 - index: -1 -blocks/smelter - rotate: false - xy: 425, 177 - size: 8, 8 - orig: 8, 8 - offset: 0, 0 - index: -1 -blocks/sniperturret rotate: false xy: 464, 401 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 +blocks/shieldgenerator + rotate: false + xy: 455, 193 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/shotgunturret + rotate: false + xy: 464, 389 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +blocks/shrub + rotate: false + xy: 455, 183 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/shrubshadow + rotate: false + xy: 433, 173 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/smelter + rotate: false + xy: 443, 173 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/sniperturret + rotate: false + xy: 461, 377 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 blocks/sorter rotate: false - xy: 435, 173 + xy: 453, 173 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/steelconveyor rotate: false - xy: 445, 173 + xy: 252, 13 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/steelconveyormove rotate: false - xy: 455, 173 + xy: 252, 3 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/steelwall rotate: false - xy: 252, 13 + xy: 343, 165 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -678,105 +769,140 @@ blocks/steelwall-large index: -1 blocks/steelwall-large-icon rotate: false - xy: 252, 3 + xy: 353, 171 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stone rotate: false - xy: 474, 465 + xy: 456, 451 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/stone1 rotate: false - xy: 457, 345 + xy: 353, 161 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stone2 rotate: false - xy: 467, 345 + xy: 353, 151 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stone3 rotate: false - xy: 477, 359 + xy: 353, 141 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 -blocks/stoneblock +blocks/stoneblock-edge-0 rotate: false - xy: 477, 349 + xy: 363, 144 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/stoneblock-edge-1 + rotate: false + xy: 363, 134 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/stoneblock-edge-2 + rotate: false + xy: 373, 164 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/stoneblock-edge-3 + rotate: false + xy: 373, 154 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/stoneblock-smooth1 + rotate: false + xy: 373, 144 + size: 8, 8 + orig: 8, 8 + offset: 0, 0 + index: -1 +blocks/stoneblock1 + rotate: false + xy: 353, 131 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stoneblock2 rotate: false - xy: 487, 361 + xy: 363, 164 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stoneblock3 rotate: false - xy: 487, 351 + xy: 363, 154 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stonedrill rotate: false - xy: 497, 361 + xy: 373, 134 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stoneedge rotate: false - xy: 456, 451 + xy: 456, 437 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/stoneformer rotate: false - xy: 497, 351 + xy: 383, 167 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/stonewall rotate: false - xy: 477, 339 + xy: 383, 157 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/teleporter rotate: false - xy: 487, 341 + xy: 383, 147 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/teleporter-top rotate: false - xy: 497, 341 + xy: 383, 137 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/thermalgenerator rotate: false - xy: 419, 167 + xy: 393, 167 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -790,56 +916,56 @@ blocks/titancannon index: -1 blocks/titancannon-icon rotate: false - xy: 464, 389 + xy: 461, 365 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/titanium1 rotate: false - xy: 487, 331 + xy: 393, 157 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titanium2 rotate: false - xy: 497, 331 + xy: 393, 147 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titanium3 rotate: false - xy: 246, 121 + xy: 393, 137 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titaniumdrill rotate: false - xy: 256, 122 + xy: 403, 169 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titaniumpurifier rotate: false - xy: 266, 122 + xy: 413, 168 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titaniumshieldwall rotate: false - xy: 276, 122 + xy: 423, 167 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/titaniumwall rotate: false - xy: 286, 122 + xy: 403, 159 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -853,70 +979,70 @@ blocks/titaniumwall-large index: -1 blocks/titaniumwall-large-icon rotate: false - xy: 311, 121 + xy: 403, 149 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/turret rotate: false - xy: 461, 377 + xy: 457, 353 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 blocks/uranium1 rotate: false - xy: 341, 121 + xy: 413, 148 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/uranium2 rotate: false - xy: 351, 121 + xy: 423, 157 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/uranium3 rotate: false - xy: 256, 112 + xy: 433, 163 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/uraniumdrill rotate: false - xy: 266, 112 + xy: 443, 163 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/water rotate: false - xy: 276, 112 + xy: 453, 163 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 blocks/wateredge rotate: false - xy: 456, 437 + xy: 470, 451 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 blocks/waveturret rotate: false - xy: 461, 365 + xy: 468, 425 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 bullet rotate: false - xy: 450, 480 + xy: 443, 293 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1000,14 +1126,14 @@ enemies/targetenemy-t1 index: -1 enemies/enemy-t2 rotate: false - xy: 499, 485 + xy: 499, 471 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 enemies/enemy-t3 rotate: false - xy: 499, 471 + xy: 353, 195 size: 12, 12 orig: 12, 12 offset: 0, 0 @@ -1161,56 +1287,56 @@ enemies/titanenemy-t3 index: -1 enemyarrow rotate: false - xy: 367, 175 + xy: 417, 218 size: 8, 7 orig: 8, 7 offset: 0, 0 index: -1 icon-coal rotate: false - xy: 486, 401 + xy: 463, 343 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-dirium rotate: false - xy: 486, 391 + xy: 473, 345 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-iron rotate: false - xy: 496, 421 + xy: 483, 345 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-steel rotate: false - xy: 496, 411 + xy: 493, 345 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-stone rotate: false - xy: 496, 401 + xy: 503, 461 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-titanium rotate: false - xy: 496, 391 + xy: 503, 451 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 icon-uranium rotate: false - xy: 473, 379 + xy: 503, 441 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1231,35 +1357,35 @@ laserend index: -1 mechs/player rotate: false - xy: 460, 465 + xy: 474, 465 size: 12, 12 orig: 12, 12 offset: 0, 0 index: -1 shell rotate: false - xy: 455, 193 + xy: 455, 203 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shot rotate: false - xy: 415, 185 + xy: 435, 183 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 shot-long rotate: false - xy: 435, 183 + xy: 445, 183 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 titanshell rotate: false - xy: 321, 121 + xy: 413, 158 size: 8, 8 orig: 8, 8 offset: 0, 0 @@ -1358,21 +1484,21 @@ ui/clear index: -1 ui/cursor rotate: false - xy: 468, 425 + xy: 377, 178 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 ui/icon-arrow-left rotate: false - xy: 452, 413 + xy: 470, 439 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icon-arrow-right rotate: false - xy: 470, 441 + xy: 452, 401 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1414,35 +1540,35 @@ ui/icon-close-over index: -1 ui/icon-crafting rotate: false - xy: 452, 401 + xy: 452, 389 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icon-cursor rotate: false - xy: 452, 389 + xy: 449, 377 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icon-defense rotate: false - xy: 449, 377 + xy: 333, 175 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icon-distribution rotate: false - xy: 333, 175 + xy: 435, 323 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icon-info rotate: false - xy: 435, 323 + xy: 431, 311 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1456,21 +1582,21 @@ ui/icon-load index: -1 ui/icon-menu rotate: false - xy: 431, 311 + xy: 431, 299 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icon-pause rotate: false - xy: 431, 299 + xy: 431, 287 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icon-play rotate: false - xy: 431, 287 + xy: 427, 275 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1484,14 +1610,14 @@ ui/icon-play-2 index: -1 ui/icon-power rotate: false - xy: 427, 275 + xy: 427, 263 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 ui/icon-production rotate: false - xy: 427, 263 + xy: 427, 251 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1512,7 +1638,7 @@ ui/icon-rotate-arrow index: -1 ui/icon-settings rotate: false - xy: 427, 251 + xy: 484, 453 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1526,7 +1652,7 @@ ui/icon-tools index: -1 ui/icon-touch rotate: false - xy: 482, 453 + xy: 449, 365 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1540,7 +1666,7 @@ ui/icon-tutorial index: -1 ui/icon-weapon rotate: false - xy: 482, 441 + xy: 445, 353 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -1611,14 +1737,14 @@ ui/scroll-knob-vertical index: -1 ui/selection rotate: false - xy: 311, 131 + xy: 383, 391 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 ui/separator rotate: false - xy: 314, 131 + xy: 194, 35 size: 1, 1 orig: 1, 1 offset: 0, 0 @@ -1755,42 +1881,42 @@ ui/window-empty index: -1 weapons/blaster rotate: false - xy: 230, 67 + xy: 443, 313 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/flamer rotate: false - xy: 476, 421 + xy: 415, 208 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/mortar rotate: false - xy: 425, 207 + xy: 493, 433 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/multigun rotate: false - xy: 399, 169 + xy: 493, 413 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/railgun rotate: false - xy: 445, 213 + xy: 447, 213 size: 8, 8 orig: 8, 8 offset: 0, 0 index: -1 weapons/triblaster rotate: false - xy: 331, 121 + xy: 403, 139 size: 8, 8 orig: 8, 8 offset: 0, 0 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index bd596941316f80a7922cd55134b5c689c381b8b5..19b547ce5179faf24a5d745a12cee85817eed257 100644 GIT binary patch delta 49628 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 z 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 //so this means that the cost of going through solids is 10x going through non solids @@ -23,7 +22,7 @@ public class MHueristic implements Heuristic{ if(other.breakable() && other.block().solid) cost += Vars.tilesize*multiplier; for(int dx = -1; dx <= 1; dx ++){ for(int dy = -1; dy <= 1; dy ++){ - Tile tile = World.tile(node.x + dx, node.y + dy); + Tile tile = Vars.world.tile(node.x + dx, node.y + dy); if(tile != null && tile.solid()){ cost += Vars.tilesize*5; } diff --git a/core/src/io/anuke/mindustry/ai/PassTileGraph.java b/core/src/io/anuke/mindustry/ai/PassTileGraph.java index 161d245390..e04f8471cf 100644 --- a/core/src/io/anuke/mindustry/ai/PassTileGraph.java +++ b/core/src/io/anuke/mindustry/ai/PassTileGraph.java @@ -4,8 +4,8 @@ import com.badlogic.gdx.ai.pfa.Connection; import com.badlogic.gdx.ai.pfa.indexed.IndexedGraph; import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.Vars; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; /**Tilegraph that ignores player-made tiles.*/ public class PassTileGraph implements IndexedGraph{ private Array> tempConnections = new Array>(); @@ -27,11 +27,11 @@ public class PassTileGraph implements IndexedGraph{ @Override public int getIndex(Tile node){ - return node.x+node.y*World.worldsize; + return node.id(); } @Override public int getNodeCount(){ - return World.worldsize*World.worldsize; + return Vars.world.width() * Vars.world.height(); } } diff --git a/core/src/io/anuke/mindustry/ai/Pathfind.java b/core/src/io/anuke/mindustry/ai/Pathfind.java index 4e7b3a6e00..3f2b34cdaf 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfind.java +++ b/core/src/io/anuke/mindustry/ai/Pathfind.java @@ -1,40 +1,41 @@ package io.anuke.mindustry.ai; -import com.badlogic.gdx.ai.pfa.PathFinder; +import com.badlogic.gdx.ai.pfa.PathFinderRequest; import com.badlogic.gdx.ai.pfa.PathSmoother; import com.badlogic.gdx.ai.pfa.indexed.IndexedAStarPathFinder; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.Vars; -import io.anuke.mindustry.entities.effect.Fx; import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.world.SpawnPoint; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; -import io.anuke.ucore.core.Effects; import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Tmp; + public class Pathfind{ - static MHueristic heuristic = new MHueristic(); - static PassTileGraph passgraph = new PassTileGraph(); - static PathFinder passpathfinder; - static Array paths = new Array<>(); - static Tile[][] pathSequences; - static PathSmoother smoother = new PathSmoother(new Raycaster()); - static Vector2 vector = new Vector2(); + private static final long ms = 1000000; - static public Vector2 find(Enemy enemy){ + MHueristic heuristic = new MHueristic(); + PassTileGraph graph = new PassTileGraph(); + PathSmoother smoother = new PathSmoother(new Raycaster()); + Vector2 vector = new Vector2(); + + public Vector2 find(Enemy enemy){ if(enemy.node == -1){ findNode(enemy); } + if(enemy.path == null){ + return vector.set(enemy.x, enemy.y); + } + //-1 is only possible here if both pathfindings failed, which should NOT happen //check graph code Tile[] path = enemy.path; - //REPRODUCE BUG: load in test map, then load save 1 + //REPRODUCE BUG: load in test map, then load save 1? Tile prev = path[enemy.node - 1]; Tile target = path[enemy.node]; @@ -77,19 +78,41 @@ public class Pathfind{ } - static public void reset(){ - paths.clear(); - pathSequences = null; - passpathfinder = new IndexedAStarPathFinder(passgraph); + public void update(){ + + for(SpawnPoint point : Vars.control.getSpawnPoints()){ + if(!point.request.pathFound){ + if(point.finder.search(point.request, ms*2)){ + smoother.smoothPath(point.path); + point.pathTiles = point.path.nodes.toArray(Tile.class); + } + } + } } - static public void updatePath(){ + public void updatePath(){ + for(SpawnPoint point : Vars.control.getSpawnPoints()){ + if(point.finder == null){ + point.finder = new IndexedAStarPathFinder(graph); + } + + point.path.clear(); + + point.pathTiles = null; + + point.request = new PathFinderRequest(point.start, Vars.control.getCore(), heuristic, point.path); + point.request.statusChanged = true; //IMPORTANT! + } + + /* if(paths.size == 0 || paths.size != World.spawnpoints.size){ paths.clear(); + finders.clear(); pathSequences = new Tile[World.spawnpoints.size][0]; for(int i = 0; i < World.spawnpoints.size; i ++){ SmoothGraphPath path = new SmoothGraphPath(); paths.add(path); + finders.add(new IndexedAStarPathFinder(graph)); } } @@ -97,7 +120,7 @@ public class Pathfind{ SmoothGraphPath path = paths.get(i); path.clear(); - passpathfinder.searchNodePath( + finders.get(i).searchNodePath( World.spawnpoints.get(i), World.core, heuristic, path); @@ -117,11 +140,15 @@ public class Pathfind{ Effects.effect(Fx.ind, tile.worldx(), tile.worldy()); } - } + }*/ } - static void findNode(Enemy enemy){ - enemy.path = pathSequences[enemy.spawn]; + void findNode(Enemy enemy){ + if(Vars.control.getSpawnPoints().get(enemy.spawn).pathTiles == null){ + return; + } + + enemy.path = Vars.control.getSpawnPoints().get(enemy.spawn).pathTiles; Tile[] path = enemy.path; Tile closest = null; float ldst = 0f; diff --git a/core/src/io/anuke/mindustry/ai/Raycaster.java b/core/src/io/anuke/mindustry/ai/Raycaster.java index f8b5d3226d..e012820ee9 100644 --- a/core/src/io/anuke/mindustry/ai/Raycaster.java +++ b/core/src/io/anuke/mindustry/ai/Raycaster.java @@ -7,7 +7,6 @@ import com.badlogic.gdx.math.Vector2; import io.anuke.mindustry.Vars; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; import io.anuke.ucore.util.Geometry; import io.anuke.ucore.util.Mathf; @@ -72,7 +71,7 @@ public class Raycaster implements RaycastCollisionDetector{ } private boolean solid(float x, float y){ - Tile tile = World.tile(Mathf.scl2(x, Vars.tilesize), Mathf.scl2(y, Vars.tilesize)); + Tile tile = Vars.world.tile(Mathf.scl2(x, Vars.tilesize), Mathf.scl2(y, Vars.tilesize)); if(tile == null || tile.solid()) return true; diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 61d67248cb..2495cd0f09 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -13,7 +13,6 @@ import com.badlogic.gdx.utils.reflect.Constructor; import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.Vars; -import io.anuke.mindustry.ai.Pathfind; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.Fx; @@ -53,6 +52,9 @@ public class Control extends Module{ float extrawavetime; int enemies = 0; + Tile core; + Array spawnpoints = new Array<>(); + float respawntime; public Control(){ @@ -87,8 +89,6 @@ public class Control extends Module{ Musics.load("1.mp3", "2.mp3", "3.mp3", "4.mp3"); - World.loadMaps(); - KeyBinds.defaults( "up", Keys.W, "left", Keys.A, @@ -178,7 +178,7 @@ public class Control extends Module{ player.heal(); clearItems(); - World.spawnpoints.clear(); + spawnpoints.clear(); respawntime = -1; hiscore = false; @@ -189,8 +189,8 @@ public class Control extends Module{ public void play(){ Vars.renderer.clearTiles(); - player.x = World.core.worldx(); - player.y = World.core.worldy() - Vars.tilesize*2 - ((int)(Gdx.graphics.getWidth() / (float)Core.cameraScale * 2) % 2 == 0 ? 0.5f : 0); + player.x = core.worldx(); + player.y = core.worldy() - Vars.tilesize*2 - ((int)(Gdx.graphics.getWidth() / (float)Core.cameraScale * 2) % 2 == 0 ? 0.5f : 0); Core.camera.position.set(player.x, player.y, 0); @@ -200,17 +200,35 @@ public class Control extends Module{ GameState.set(State.playing); } + public Tile getCore(){ + return core; + } + + public Array getSpawnPoints(){ + return spawnpoints; + } + + public void setCore(Tile tile){ + this.core = tile; + } + + public void addSpawnPoint(Tile tile){ + SpawnPoint point = new SpawnPoint(); + point.start = tile; + spawnpoints.add(point); + } + public void playMap(Map map){ Vars.ui.showLoading(); Timers.run(16, ()->{ - Vars.control.reset(); - World.loadMap(map); - Vars.control.play(); + reset(); + world.loadMap(map); + play(); }); Timers.run(18, ()->{ - Vars.ui.hideLoading(); + ui.hideLoading(); }); } @@ -236,12 +254,12 @@ public class Control extends Module{ public void runWave(){ Sounds.play("spawn"); - Pathfind.updatePath(); + world.pathfinder().updatePath(); for(EnemySpawn spawn : spawns){ - for(int lane = 0; lane < World.spawnpoints.size; lane ++){ + for(int lane = 0; lane < spawnpoints.size; lane ++){ int fl = lane; - Tile tile = World.spawnpoints.get(lane); + Tile tile = spawnpoints.get(lane).start; int spawnamount = spawn.evaluate(wave, lane); for(int i = 0; i < spawnamount; i ++){ @@ -268,10 +286,10 @@ public class Control extends Module{ wave ++; - int last = Settings.getInt("hiscore" + World.getMap().name()); + int last = Settings.getInt("hiscore" + world.getMap().name()); if(wave > last){ - Settings.putInt("hiscore" + World.getMap().name(), wave); + Settings.putInt("hiscore" + world.getMap().name(), wave); Settings.save(); hiscore = true; } @@ -301,7 +319,6 @@ public class Control extends Module{ public void coreDestroyed(){ Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y); Sounds.play("corexplode"); - Tile core = World.core; for(int i = 0; i < 16; i ++){ Timers.run(i*2, ()->{ Effects.effect(Fx.explosion, core.worldx()+Mathf.range(40), core.worldy()+Mathf.range(40)); @@ -401,7 +418,7 @@ public class Control extends Module{ Entities.initPhysics(); Entities.setCollider(tilesize, (x, y)->{ - return World.solid(x, y); + return world.solid(x, y); }); } @@ -454,7 +471,7 @@ public class Control extends Module{ respawntime -= delta(); if(respawntime <= 0){ - player.set(World.core.worldx(), World.core.worldy()-Vars.tilesize*2); + player.set(core.worldx(), core.worldy()-Vars.tilesize*2); player.heal(); player.add(); Effects.sound("respawn"); @@ -497,10 +514,5 @@ public class Control extends Module{ } } } - - @Override - public void dispose(){ - World.disposeMaps(); - } } diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index db0db64071..032012f65c 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -20,8 +20,8 @@ import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.input.AndroidInput; import io.anuke.mindustry.input.Input; import io.anuke.mindustry.input.PlaceMode; +import io.anuke.mindustry.world.SpawnPoint; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.mindustry.world.blocks.ProductionBlocks; import io.anuke.ucore.UCore; @@ -80,7 +80,7 @@ public class Renderer extends RendererModule{ }else{ boolean smoothcam = Settings.getBool("smoothcam"); - if(World.core.block() == ProductionBlocks.core){ + if(control.core.block() == ProductionBlocks.core){ if(!smoothcam){ setCamera(player.x, player.y); @@ -88,7 +88,7 @@ public class Renderer extends RendererModule{ smoothCamera(player.x, player.y, android ? 0.3f : 0.14f); } }else{ - smoothCamera(World.core.worldx(), World.core.worldy(), 0.4f); + smoothCamera(control.core.worldx(), control.core.worldy(), 0.4f); } if(Settings.getBool("pixelate")) @@ -98,7 +98,8 @@ public class Renderer extends RendererModule{ updateShake(0.75f); float prevx = camera.position.x, prevy = camera.position.y; - clampCamera(-tilesize / 2f, -tilesize / 2f + 1, World.pixsize - tilesize / 2f, World.pixsize - tilesize / 2f); + clampCamera(-tilesize / 2f, -tilesize / 2f + 1, world.width() * tilesize - tilesize / 2f, + world.height() * tilesize - tilesize / 2f); float deltax = camera.position.x - prex, deltay = camera.position.y - prey; @@ -212,7 +213,7 @@ public class Renderer extends RendererModule{ } void renderTiles(){ - int chunksx = World.width() / chunksize, chunksy = World.height() / chunksize; + int chunksx = world.width() / chunksize, chunksy = world.height() / chunksize; //render the entire map if(floorCache == null || floorCache.length != chunksx || floorCache[0].length != chunksy){ @@ -271,11 +272,11 @@ public class Renderer extends RendererModule{ int worldx = Mathf.scl(camera.position.x, tilesize) + x; int worldy = Mathf.scl(camera.position.y, tilesize) + y; - if(World.tile(worldx, worldy) != null){ - Tile tile = World.tile(worldx, worldy); + if(world.tile(worldx, worldy) != null){ + Tile tile = world.tile(worldx, worldy); if(l == 0){ - if(tile.block() != Blocks.air && World.isAccessible(worldx, worldy)){ - Draw.rect(tile.block().shadow, worldx * tilesize, worldy * tilesize); + if(tile.block() != Blocks.air && world.isAccessible(worldx, worldy)){ + tile.block().drawShadow(tile); } }else if(l == 1){ tile.block().draw(tile); @@ -315,7 +316,7 @@ public class Renderer extends RendererModule{ for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){ for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize; tiley++){ - Tile tile = World.tile(tilex, tiley); + Tile tile = world.tile(tilex, tiley); tile.floor().drawCache(tile); } @@ -332,8 +333,8 @@ public class Renderer extends RendererModule{ //draw tutorial placement point if(Vars.control.tutorial.showBlock()){ - int x = World.core.x + Vars.control.tutorial.getPlacePoint().x; - int y = World.core.y + Vars.control.tutorial.getPlacePoint().y; + int x = control.core.x + Vars.control.tutorial.getPlacePoint().x; + int y = control.core.y + Vars.control.tutorial.getPlacePoint().y; int rot = Vars.control.tutorial.getPlaceRotation(); Draw.thick(1f); @@ -368,7 +369,7 @@ public class Renderer extends RendererModule{ x = tilex * tilesize; y = tiley * tilesize; - boolean valid = World.validPlace(tilex, tiley, player.recipe.result) && (android || Input.cursorNear()); + boolean valid = world.validPlace(tilex, tiley, player.recipe.result) && (android || Input.cursorNear()); Vector2 offset = player.recipe.result.getPlaceOffset(); @@ -388,8 +389,8 @@ public class Renderer extends RendererModule{ Draw.thickness(1f); Draw.color("scarlet"); - for(Tile spawn : World.spawnpoints){ - Draw.dashcircle(spawn.worldx(), spawn.worldy(), enemyspawnspace); + for(SpawnPoint spawn : control.getSpawnPoints()){ + Draw.dashcircle(spawn.start.worldx(), spawn.start.worldy(), enemyspawnspace); } if(valid) @@ -401,8 +402,8 @@ public class Renderer extends RendererModule{ } //block breaking - if(Inputs.buttonDown(Buttons.RIGHT) && World.validBreak(Input.tilex(), Input.tiley())){ - Tile tile = World.tile(Input.tilex(), Input.tiley()); + if(Inputs.buttonDown(Buttons.RIGHT) && world.validBreak(Input.tilex(), Input.tiley())){ + Tile tile = world.tile(Input.tilex(), Input.tiley()); if(tile.isLinked()) tile = tile.getLinked(); Vector2 offset = tile.block().getPlaceOffset(); @@ -413,8 +414,8 @@ public class Renderer extends RendererModule{ }else if(android && player.breaktime > 0){ //android block breaking Vector2 vec = Graphics.world(Gdx.input.getX(0), Gdx.input.getY(0)); - if(World.validBreak(Mathf.scl2(vec.x, tilesize), Mathf.scl2(vec.y, tilesize))){ - Tile tile = World.tile(Mathf.scl2(vec.x, tilesize), Mathf.scl2(vec.y, tilesize)); + if(world.validBreak(Mathf.scl2(vec.x, tilesize), Mathf.scl2(vec.y, tilesize))){ + Tile tile = world.tile(Mathf.scl2(vec.x, tilesize), Mathf.scl2(vec.y, tilesize)); float fract = player.breaktime / tile.getBreakTime(); Draw.color(Color.YELLOW, Color.SCARLET, fract); @@ -425,7 +426,7 @@ public class Renderer extends RendererModule{ //draw selected block health if(player.recipe == null && !ui.hasMouse()){ - Tile tile = World.tile(Input.tilex(), Input.tiley()); + Tile tile = world.tile(Input.tilex(), Input.tiley()); if(tile != null && tile.block() != Blocks.air){ Tile target = tile; diff --git a/core/src/io/anuke/mindustry/core/Tutorial.java b/core/src/io/anuke/mindustry/core/Tutorial.java index 3401e1f643..5dfb28cd49 100644 --- a/core/src/io/anuke/mindustry/core/Tutorial.java +++ b/core/src/io/anuke/mindustry/core/Tutorial.java @@ -1,12 +1,16 @@ package io.anuke.mindustry.core; +import static io.anuke.mindustry.Vars.*; + import com.badlogic.gdx.math.GridPoint2; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Weapon; -import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Map; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.*; import io.anuke.ucore.core.Timers; import io.anuke.ucore.scene.builders.button; @@ -29,7 +33,7 @@ public class Tutorial{ } public boolean active(){ - return World.getMap() == Map.tutorial && !GameState.is(State.menu); + return world.getMap() == Map.tutorial && !GameState.is(State.menu); } public void buildUI(table table){ @@ -71,7 +75,7 @@ public class Tutorial{ //info.setText(stage.text); if(stage.showBlock){ - Tile tile = World.tile(World.core.x + stage.blockPlaceX, World.core.y + stage.blockPlaceY); + Tile tile = world.tile(control.core.x + stage.blockPlaceX, control.core.y + stage.blockPlaceY); if(tile.block() == stage.targetBlock && (tile.rotation == stage.blockRotation || stage.blockRotation == -1)){ move(true); @@ -151,9 +155,9 @@ public class Tutorial{ } public void setDefaultBlocks(int corex, int corey){ - World.tile(corex, corey - 1).setBlock(Blocks.air); - World.tile(corex, corey - 2).setBlock(Blocks.air); - World.tile(corex, corey - 2).setFloor(Blocks.stone); + world.tile(corex, corey - 1).setBlock(Blocks.air); + world.tile(corex, corey - 2).setBlock(Blocks.air); + world.tile(corex, corey - 2).setFloor(Blocks.stone); } enum Stage{ @@ -288,11 +292,11 @@ public class Tutorial{ void onSwitch(){ for(int flip : new int[]{1, -1}){ - World.tile(World.core.x + flip, World.core.y - 1).setBlock(DistributionBlocks.conveyor, 2 * flip); - World.tile(World.core.x + flip*2, World.core.y - 1).setBlock(DistributionBlocks.conveyor, 2 * flip); - World.tile(World.core.x + flip*2, World.core.y - 2).setBlock(DistributionBlocks.conveyor, 1); - World.tile(World.core.x + flip*2, World.core.y - 3).setFloor(Blocks.stone); - World.tile(World.core.x + flip*2, World.core.y - 3).setBlock(ProductionBlocks.stonedrill); + world.tile(control.core.x + flip, control.core.y - 1).setBlock(DistributionBlocks.conveyor, 2 * flip); + world.tile(control.core.x + flip*2, control.core.y - 1).setBlock(DistributionBlocks.conveyor, 2 * flip); + world.tile(control.core.x + flip*2, control.core.y - 2).setBlock(DistributionBlocks.conveyor, 1); + world.tile(control.core.x + flip*2, control.core.y - 3).setFloor(Blocks.stone); + world.tile(control.core.x + flip*2, control.core.y - 3).setBlock(ProductionBlocks.stonedrill); } } @@ -463,7 +467,7 @@ public class Tutorial{ void onSwitch(){ Vars.ui.find("sectionbuttondistribution").fireClick(); - World.tile(blockPlaceX + World.core.x, blockPlaceY + World.core.y).setBlock(Blocks.air); + world.tile(blockPlaceX + control.core.x, blockPlaceY + control.core.y).setBlock(Blocks.air); } }, conduitUse2{ @@ -480,7 +484,7 @@ public class Tutorial{ } void onSwitch(){ - World.tile(blockPlaceX + World.core.x, blockPlaceY + World.core.y).setBlock(Blocks.air); + world.tile(blockPlaceX + control.core.x, blockPlaceY + control.core.y).setBlock(Blocks.air); } }, conduitUse3{ @@ -497,7 +501,7 @@ public class Tutorial{ } void onSwitch(){ - World.tile(blockPlaceX + World.core.x, blockPlaceY + World.core.y).setBlock(Blocks.air); + world.tile(blockPlaceX + control.core.x, blockPlaceY + control.core.y).setBlock(Blocks.air); } }, extractor{ @@ -513,7 +517,7 @@ public class Tutorial{ } void onSwitch(){ - World.tile(blockPlaceX + World.core.x, blockPlaceY + World.core.y).setBlock(Blocks.air); + world.tile(blockPlaceX + control.core.x, blockPlaceY + control.core.y).setBlock(Blocks.air); Vars.ui.find("sectionbuttonproduction").fireClick(); Vars.control.addItem(Item.steel, 60); Vars.control.addItem(Item.iron, 60); @@ -527,19 +531,19 @@ public class Tutorial{ void onSwitch(){ for(int i = -2; i <= 2; i ++){ - World.tile(World.core.x + i + 4, World.core.y + 2).setBlock(ProductionBlocks.stonedrill); - World.tile(World.core.x + i + 4, World.core.y + 2).setFloor(Blocks.stone); + world.tile(control.core.x + i + 4, control.core.y + 2).setBlock(ProductionBlocks.stonedrill); + world.tile(control.core.x + i + 4, control.core.y + 2).setFloor(Blocks.stone); } for(int i = 0; i < 3; i ++){ - World.tile(World.core.x + 4 - 1 - i, World.core.y).setBlock(DistributionBlocks.conveyor, 2); + world.tile(control.core.x + 4 - 1 - i, control.core.y).setBlock(DistributionBlocks.conveyor, 2); } - World.tile(World.core.x + 2, World.core.y + 1).setBlock(DistributionBlocks.conveyor, 0); - World.tile(World.core.x + 3, World.core.y + 1).setBlock(DistributionBlocks.conveyor, 0); - World.tile(World.core.x + 4, World.core.y + 1).setBlock(DistributionBlocks.conveyor, 3); - World.tile(World.core.x + 5, World.core.y + 1).setBlock(DistributionBlocks.conveyor, 2); - World.tile(World.core.x + 6, World.core.y + 1).setBlock(DistributionBlocks.conveyor, 2); + world.tile(control.core.x + 2, control.core.y + 1).setBlock(DistributionBlocks.conveyor, 0); + world.tile(control.core.x + 3, control.core.y + 1).setBlock(DistributionBlocks.conveyor, 0); + world.tile(control.core.x + 4, control.core.y + 1).setBlock(DistributionBlocks.conveyor, 3); + world.tile(control.core.x + 5, control.core.y + 1).setBlock(DistributionBlocks.conveyor, 2); + world.tile(control.core.x + 6, control.core.y + 1).setBlock(DistributionBlocks.conveyor, 2); } }, diff --git a/core/src/io/anuke/mindustry/entities/Bullet.java b/core/src/io/anuke/mindustry/entities/Bullet.java index 768cfcadb6..15caff6d00 100644 --- a/core/src/io/anuke/mindustry/entities/Bullet.java +++ b/core/src/io/anuke/mindustry/entities/Bullet.java @@ -2,8 +2,8 @@ package io.anuke.mindustry.entities; import static io.anuke.mindustry.Vars.tilesize; +import io.anuke.mindustry.Vars; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; import io.anuke.ucore.entities.*; import io.anuke.ucore.util.Mathf; @@ -29,7 +29,7 @@ public class Bullet extends BulletEntity{ int tilex = Mathf.scl2(x, tilesize); int tiley = Mathf.scl2(y, tilesize); - Tile tile = World.tile(tilex, tiley); + Tile tile = Vars.world.tile(tilex, tiley); TileEntity targetEntity = null; if(tile != null){ diff --git a/core/src/io/anuke/mindustry/entities/effect/DamageArea.java b/core/src/io/anuke/mindustry/entities/effect/DamageArea.java index e90673946d..0a270326c0 100644 --- a/core/src/io/anuke/mindustry/entities/effect/DamageArea.java +++ b/core/src/io/anuke/mindustry/entities/effect/DamageArea.java @@ -5,7 +5,6 @@ import com.badlogic.gdx.math.Vector2; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.util.Mathf; @@ -29,7 +28,7 @@ public class DamageArea{ int trad = (int)(radius / Vars.tilesize); for(int dx = -trad; dx <= trad; dx ++){ for(int dy= -trad; dy <= trad; dy ++){ - Tile tile = World.tile(Mathf.scl2(x, Vars.tilesize) + dx, Mathf.scl2(y, Vars.tilesize) + dy); + Tile tile = Vars.world.tile(Mathf.scl2(x, Vars.tilesize) + dx, Mathf.scl2(y, Vars.tilesize) + dy); if(tile != null && tile.entity != null && Vector2.dst(dx, dy, 0, 0) <= trad){ int amount = calculateDamage(x, y, tile.worldx(), tile.worldy(), radius, damage); tile.entity.damage(amount); diff --git a/core/src/io/anuke/mindustry/entities/effect/EMP.java b/core/src/io/anuke/mindustry/entities/effect/EMP.java index 2f0847c924..a079c7d38d 100644 --- a/core/src/io/anuke/mindustry/entities/effect/EMP.java +++ b/core/src/io/anuke/mindustry/entities/effect/EMP.java @@ -6,7 +6,6 @@ import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.Vars; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; import io.anuke.mindustry.world.blocks.types.PowerAcceptor; import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Effects; @@ -36,7 +35,7 @@ public class EMP extends TimedEntity{ for(int dx = -radius; dx <= radius; dx ++){ for(int dy = -radius; dy <= radius; dy ++){ if(Vector2.dst(dx, dy, 0, 0) < radius){ - Tile tile = World.tile(worldx + dx, worldy + dy); + Tile tile = Vars.world.tile(worldx + dx, worldy + dy); if(tile != null && tile.block().destructible){ array.add(tile); diff --git a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java index 59a1be0e52..e510681f7a 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java @@ -5,14 +5,12 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.reflect.ClassReflection; import io.anuke.mindustry.Vars; -import io.anuke.mindustry.ai.Pathfind; import io.anuke.mindustry.entities.Bullet; import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.effect.Fx; import io.anuke.mindustry.entities.effect.Shaders; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; import io.anuke.ucore.core.*; import io.anuke.ucore.entities.*; import io.anuke.ucore.util.Mathf; @@ -57,15 +55,17 @@ public class Enemy extends DestructibleEntity{ } void move(){ - boolean nearCore = distanceTo(World.core.worldx(), World.core.worldy()) <= range - 18f; + Tile core = Vars.control.getCore(); + + boolean nearCore = distanceTo(core.worldx(), core.worldy()) <= range - 18f; Vector2 vec; if(nearCore){ vec = Tmp.v2.setZero(); - target = World.core.entity; + target = core.entity; }else{ - vec = Pathfind.find(this); + vec = Vars.world.pathfinder().find(this); vec.sub(x, y).setLength(speed); } @@ -94,8 +94,13 @@ public class Enemy extends DestructibleEntity{ move(vec.x * Timers.delta(), vec.y * Timers.delta()); + + updateTargeting(nearCore); + } + + void updateTargeting(boolean nearCore){ if(Timers.get(this, "target", 15) && !nearCore){ - target = World.findTileTarget(x, y, null, range, false); + target = Vars.world.findTileTarget(x, y, null, range, false); //no tile found if(target == null){ @@ -126,7 +131,7 @@ public class Enemy extends DestructibleEntity{ } public void findClosestNode(){ - Pathfind.find(this); + Vars.world.pathfinder().find(this); int index = 0; int cindex = -1; @@ -150,7 +155,7 @@ public class Enemy extends DestructibleEntity{ int x2 = path[node].x, y2 = path[node].y; //if the enemy can't move to that node right now, set its position to it - if(World.raycast(Mathf.scl2(x, Vars.tilesize), Mathf.scl2(y, Vars.tilesize), x2, y2) != null){ + if(Vars.world.raycast(Mathf.scl2(x, Vars.tilesize), Mathf.scl2(y, Vars.tilesize), x2, y2) != null){ Timers.run(Mathf.random(15f), () -> { set(x2 * Vars.tilesize, y2 * Vars.tilesize); }); diff --git a/core/src/io/anuke/mindustry/entities/enemies/HealerEnemy.java b/core/src/io/anuke/mindustry/entities/enemies/HealerEnemy.java index a9591ccc04..7f46b9c607 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/HealerEnemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/HealerEnemy.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.entities.enemies; import com.badlogic.gdx.math.MathUtils; -import com.badlogic.gdx.math.Vector2; -import io.anuke.mindustry.ai.Pathfind; import io.anuke.mindustry.entities.BulletType; +import io.anuke.mindustry.entities.effect.Shaders; import io.anuke.ucore.core.Draw; +import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.graphics.Hue; @@ -28,12 +28,7 @@ public class HealerEnemy extends Enemy{ } @Override - void move(){ - Vector2 vec = Pathfind.find(this); - vec.sub(x, y).setLength(speed); - - move(vec.x*Timers.delta(), vec.y*Timers.delta()); - + void updateTargeting(boolean nearCore){ if(Timers.get(this, "target", 15)){ target = Entities.getClosest(Entities.getGroup(Enemy.class), x, y, range, e -> e instanceof Enemy && e != this && ((Enemy)e).healthfrac() < 1f); @@ -62,12 +57,14 @@ public class HealerEnemy extends Enemy{ Angles.translation(this.angleTo(enemy), 5f); + Graphics.shader(); if(enemy != null && enemy.health < enemy.maxhealth){ Draw.color(Hue.rgb(138, 244, 138, (MathUtils.sin(Timers.time()) + 1f) / 13f)); Draw.alpha(0.9f); Draw.laser("laser", "laserend", x + Angles.x(), y + Angles.y(), enemy.x - Angles.x()/1.5f, enemy.y - Angles.y()/1.5f); Draw.color(); } + Graphics.shader(Shaders.outline); } } diff --git a/core/src/io/anuke/mindustry/input/AndroidInput.java b/core/src/io/anuke/mindustry/input/AndroidInput.java index b6cfc77334..9659f8e3ab 100644 --- a/core/src/io/anuke/mindustry/input/AndroidInput.java +++ b/core/src/io/anuke/mindustry/input/AndroidInput.java @@ -10,7 +10,6 @@ import com.badlogic.gdx.math.Vector2; import io.anuke.mindustry.Vars; import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Timers; import io.anuke.ucore.scene.ui.layout.Unit; @@ -51,7 +50,7 @@ public class AndroidInput extends InputAdapter{ public static Tile selected(){ Vector2 vec = Graphics.world(mousex, mousey); - return World.tile(Mathf.scl2(vec.x, tilesize), Mathf.scl2(vec.y, tilesize)); + return Vars.world.tile(Mathf.scl2(vec.x, tilesize), Mathf.scl2(vec.y, tilesize)); } public static void breakBlock(){ @@ -60,7 +59,7 @@ public class AndroidInput extends InputAdapter{ if(player.breaktime >= tile.block().breaktime){ brokeBlock = true; - World.breakBlock(tile.x, tile.y); + Vars.world.breakBlock(tile.x, tile.y); player.breaktime = 0f; } } @@ -72,9 +71,9 @@ public class AndroidInput extends InputAdapter{ int tiley = Mathf.scl2(vec.y, tilesize); if(player.recipe != null && - World.validPlace(tilex, tiley, player.recipe.result)){ + Vars.world.validPlace(tilex, tiley, player.recipe.result)){ - World.placeBlock(tilex, tiley, player.recipe.result, player.rotation); + Vars.world.placeBlock(tilex, tiley, player.recipe.result, player.rotation); for(ItemStack stack : player.recipe.requirements){ Vars.control.removeItem(stack); @@ -97,7 +96,7 @@ public class AndroidInput extends InputAdapter{ if(sel == null) return; - if(warmup > warmupDelay && World.validBreak(sel.x, sel.y)){ + if(warmup > warmupDelay && Vars.world.validBreak(sel.x, sel.y)){ player.breaktime += Timers.delta(); if(player.breaktime > selected().block().breaktime){ diff --git a/core/src/io/anuke/mindustry/input/Input.java b/core/src/io/anuke/mindustry/input/Input.java index c05aa00d1f..197f10371d 100644 --- a/core/src/io/anuke/mindustry/input/Input.java +++ b/core/src/io/anuke/mindustry/input/Input.java @@ -10,7 +10,6 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.resource.Weapon; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; import io.anuke.mindustry.world.blocks.types.Configurable; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Inputs; @@ -46,13 +45,13 @@ public class Input{ } } - Tile cursor = World.tile(tilex(), tiley()); + Tile cursor = Vars.world.tile(tilex(), tiley()); if(Inputs.buttonUp(Buttons.LEFT) && player.recipe != null && - World.validPlace(tilex(), tiley(), player.recipe.result) && !ui.hasMouse() && cursorNear() && + Vars.world.validPlace(tilex(), tiley(), player.recipe.result) && !ui.hasMouse() && cursorNear() && Vars.control.hasItems(player.recipe.requirements)){ - World.placeBlock(tilex(), tiley(), player.recipe.result, player.rotation); + Vars.world.placeBlock(tilex(), tiley(), player.recipe.result, player.rotation); for(ItemStack stack : player.recipe.requirements){ Vars.control.removeItem(stack); @@ -80,11 +79,11 @@ public class Input{ } //block breaking - if(Inputs.buttonDown(Buttons.RIGHT) && cursor != null && World.validBreak(tilex(), tiley())){ + if(Inputs.buttonDown(Buttons.RIGHT) && cursor != null && Vars.world.validBreak(tilex(), tiley())){ Tile tile = cursor; player.breaktime += Timers.delta(); if(player.breaktime >= tile.getBreakTime()){ - World.breakBlock(cursor.x, cursor.y); + Vars.world.breakBlock(cursor.x, cursor.y); player.breaktime = 0f; } }else{ diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index 5f38483f1a..bdfbf2bddc 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -19,7 +19,9 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.enemies.*; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Weapon; -import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Map; +import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.ucore.core.Core; import io.anuke.ucore.entities.Entities; @@ -203,16 +205,16 @@ public class SaveIO{ //--MAP DATA-- //map ID - stream.writeByte(World.getMap().ordinal()); + stream.writeByte(Vars.world.getMap().ordinal()); //seed - stream.writeInt(World.getSeed()); + stream.writeInt(Vars.world.getSeed()); int totalblocks = 0; - for(int x = 0; x < World.width(); x ++){ - for(int y = 0; y < World.height(); y ++){ - Tile tile = World.tile(x, y); + for(int x = 0; x < Vars.world.width(); x ++){ + for(int y = 0; y < Vars.world.height(); y ++){ + Tile tile = Vars.world.tile(x, y); if(tile.breakable()){ totalblocks ++; @@ -223,13 +225,13 @@ public class SaveIO{ //tile amount stream.writeInt(totalblocks); - for(int x = 0; x < World.width(); x ++){ - for(int y = 0; y < World.height(); y ++){ - Tile tile = World.tile(x, y); + for(int x = 0; x < Vars.world.width(); x ++){ + for(int y = 0; y < Vars.world.height(); y ++){ + Tile tile = Vars.world.tile(x, y); if(tile.breakable()){ - stream.writeInt(x + y*World.width()); //tile pos + stream.writeInt(x + y*Vars.world.width()); //tile pos stream.writeByte(tile.link); stream.writeBoolean(tile.entity != null); //whether it has a tile entity stream.writeInt(tile.block().id); //block ID @@ -349,20 +351,20 @@ public class SaveIO{ int seed = stream.readInt(); int tiles = stream.readInt(); - World.loadMap(Map.values()[mapid], seed); + Vars.world.loadMap(Map.values()[mapid], seed); Vars.renderer.clearTiles(); for(Enemy enemy : enemiesToUpdate){ enemy.findClosestNode(); } - for(int x = 0; x < World.width(); x ++){ - for(int y = 0; y < World.height(); y ++){ - Tile tile = World.tile(x, y); + for(int x = 0; x < Vars.world.width(); x ++){ + for(int y = 0; y < Vars.world.height(); y ++){ + Tile tile = Vars.world.tile(x, y); //remove breakables like rocks if(tile.breakable()){ - World.tile(x, y).setBlock(Blocks.air); + Vars.world.tile(x, y).setBlock(Blocks.air); } } } @@ -373,7 +375,7 @@ public class SaveIO{ boolean hasEntity = stream.readBoolean(); int blockid = stream.readInt(); - Tile tile = World.tile(pos % World.width(), pos / World.width()); + Tile tile = Vars.world.tile(pos % Vars.world.width(), pos / Vars.world.width()); tile.setBlock(Block.getByID(blockid)); tile.link = link; diff --git a/core/src/io/anuke/mindustry/ui/LevelDialog.java b/core/src/io/anuke/mindustry/ui/LevelDialog.java index 65a22ac19e..a6cd5f6c85 100644 --- a/core/src/io/anuke/mindustry/ui/LevelDialog.java +++ b/core/src/io/anuke/mindustry/ui/LevelDialog.java @@ -4,7 +4,6 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.Vars; import io.anuke.mindustry.world.Map; -import io.anuke.mindustry.world.World; import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Timers; @@ -50,7 +49,7 @@ public class LevelDialog extends FloatingDialog{ float images = 154f; - ImageButton image = new ImageButton(new TextureRegion(World.getTexture(map)), "togglemap"); + ImageButton image = new ImageButton(new TextureRegion(Vars.world.getTexture(map)), "togglemap"); image.row(); image.add(inset).width(images+6).units(Unit.dp); image.clicked(()->{ diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 6d2e4dda46..33ae7b7288 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.resource.Liquid; import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; +import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Tmp; public class Block{ private static int lastid; @@ -48,10 +49,12 @@ public class Block{ public int health = 40; /**the shadow drawn under the block*/ public String shadow = "shadow"; + /**whether to display a different shadow per variant*/ + public boolean varyShadow = false; /**edge fallback, used mainly for ores*/ public String edge = "stone"; - /**whether this block has 3 variants*/ - public boolean vary = true; + /**number of block variants, 0 to disable*/ + public int variants = 0; /**stuff that drops when broken*/ public ItemStack drops = null; /**liquids that drop from this block, used for pumps*/ @@ -203,10 +206,12 @@ public class Block{ public void draw(Tile tile){ //note: multiblocks do not support rotation if(!isMultiblock()){ - Draw.rect(name(), tile.worldx(), tile.worldy(), rotate ? tile.rotation * 90 : 0); + Draw.rect(variants > 0 ? (name() + Mathf.randomSeed(tile.id(), 1, variants)) : name(), + tile.worldx(), tile.worldy(), rotate ? tile.rotation * 90 : 0); }else{ //if multiblock, make sure to draw even block sizes offset, since the core block is at the BOTTOM LEFT Vector2 offset = getPlaceOffset(); + Draw.rect(name(), tile.worldx() + offset.x, tile.worldy() + offset.y); } @@ -216,6 +221,15 @@ public class Block{ } } + public void drawShadow(Tile tile){ + + if(varyShadow && variants > 0){ + Draw.rect(shadow + (Mathf.randomSeed(tile.id(), 1, variants)), tile.worldx(), tile.worldy()); + }else{ + Draw.rect(shadow, tile.worldx(), tile.worldy()); + } + } + /**Offset for placing and drawing multiblocks.*/ public Vector2 getPlaceOffset(){ return Tmp.v3.set(((width + 1) % 2) * Vars.tilesize/2, ((height + 1) % 2) * Vars.tilesize/2); diff --git a/core/src/io/anuke/mindustry/world/Generator.java b/core/src/io/anuke/mindustry/world/Generator.java index fe671abef5..9cabc98a47 100644 --- a/core/src/io/anuke/mindustry/world/Generator.java +++ b/core/src/io/anuke/mindustry/world/Generator.java @@ -7,6 +7,7 @@ import com.badlogic.gdx.utils.ObjectMap; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.enemies.TargetEnemy; import io.anuke.mindustry.world.blocks.Blocks; +import io.anuke.mindustry.world.blocks.types.Floor; import io.anuke.ucore.graphics.Hue; import io.anuke.ucore.noise.Noise; import io.anuke.ucore.util.Mathf; @@ -23,14 +24,16 @@ public class Generator{ Hue.rgb(110, 80, 30), Blocks.dirt, Hue.rgb(160, 120, 70), Blocks.dirtblock, Hue.rgb(100, 100, 100), Blocks.stoneblock, + Color.valueOf("414141"), Blocks.blackstoneblock, + Color.valueOf("252525"), Blocks.blackstone, Color.valueOf("ed5334"), Blocks.lava, Color.valueOf("292929"), Blocks.oil ); /**Returns world size.*/ - public static void generate(Pixmap pixmap){ + public static void generate(Pixmap pixmap, Tile[][] tiles){ - Noise.setSeed(World.getSeed()); + Noise.setSeed(Vars.world.getSeed()); for(int x = 0; x < pixmap.getWidth(); x ++){ for(int y = 0; y < pixmap.getHeight(); y ++){ @@ -41,23 +44,29 @@ public class Generator{ if(colors.containsKey(color)){ //TODO less hacky method - if(colors.get(color).name().contains("block")){ + if(!(colors.get(color) instanceof Floor)){ block = colors.get(color); }else{ floor = colors.get(color); } }else if(color == start){ - World.core = World.tile(x, y); + Vars.control.setCore(Vars.world.tile(x, y)); }else if(color == spawn){ - World.spawnpoints.add(World.tile(x, y)); + Vars.control.addSpawnPoint(Vars.world.tile(x, y)); floor = Blocks.dirt; - }else{ - if(Mathf.chance(0.02)){ - block = Mathf.choose(Blocks.rock, Blocks.rock2); + } + + if(block == Blocks.air){ + if(floor == Blocks.stone && Mathf.chance(0.02)){ + block = Blocks.rock; + } + + if(floor == Blocks.blackstone && Mathf.chance(0.03)){ + block = Blocks.blackrock; } } - if(floor == Blocks.stone || floor == Blocks.grass){ + if(floor == Blocks.stone || floor == Blocks.grass || floor == Blocks.blackstone){ if(Noise.nnoise(x, y, 8, 1) > 0.2){ floor = Blocks.iron; } @@ -77,11 +86,6 @@ public class Generator{ if(block == Blocks.grassblock){ floor = Blocks.grass; - block = Mathf.choose(Blocks.grassblock, Blocks.grassblock2); - } - - if(block == Blocks.stoneblock){ - block = Mathf.choose(Blocks.stoneblock, Blocks.stoneblock2, Blocks.stoneblock3); } if(floor == Blocks.grass && Mathf.chance(0.02) && block == Blocks.air){ @@ -98,10 +102,8 @@ public class Generator{ // block = Mathf.choose(ProductionBlocks.stonedrill, DistributionBlocks.conveyor); //} - World.tile(x, y).setBlock(block); - World.tile(x, y).setFloor(floor); - - + tiles[x][y].setBlock(block, 0); + tiles[x][y].setFloor(floor); } } } diff --git a/core/src/io/anuke/mindustry/world/Map.java b/core/src/io/anuke/mindustry/world/Map.java index adbb95431f..e393da1344 100644 --- a/core/src/io/anuke/mindustry/world/Map.java +++ b/core/src/io/anuke/mindustry/world/Map.java @@ -2,27 +2,31 @@ package io.anuke.mindustry.world; public enum Map{ delta("Starting map."), - canyon("Badly drawn map."), pit("Eck."), - maze("it's okay."), - maze2("test"), - maze3("test"), - maze4("test"), - maze5("test"), + maze("it's okay."), + volcano("desc"), tutorial(false), test1(false), test2(false); public final boolean visible; + public final boolean sandbox; public final String description; + public int width, height; private Map(boolean visible){ this.visible = visible; + this.sandbox = false; this.description = "Test map!"; } private Map(String description){ + this(description, false); + } + + private Map(String description, boolean sandbox){ this.visible = true; + this.sandbox = sandbox; this.description = description; } } diff --git a/core/src/io/anuke/mindustry/world/SpawnPoint.java b/core/src/io/anuke/mindustry/world/SpawnPoint.java new file mode 100644 index 0000000000..9735946ecd --- /dev/null +++ b/core/src/io/anuke/mindustry/world/SpawnPoint.java @@ -0,0 +1,14 @@ +package io.anuke.mindustry.world; + +import com.badlogic.gdx.ai.pfa.PathFinder; +import com.badlogic.gdx.ai.pfa.PathFinderRequest; + +import io.anuke.mindustry.ai.SmoothGraphPath; + +public class SpawnPoint{ + public Tile start; + public Tile[] pathTiles; + public PathFinder finder; + public SmoothGraphPath path = new SmoothGraphPath(); + public PathFinderRequest request; +} diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index f84df0edf0..85332d1627 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -5,6 +5,7 @@ import static io.anuke.mindustry.Vars.tilesize; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.ucore.util.Bits; @@ -52,7 +53,7 @@ public class Tile{ float dst = Vector2.dst(dx, dy, 0, 0); if(dst > rad || (dx == 0 && dy == 0)) continue; - Tile other = World.tile(x + dx, y + dy); + Tile other = Vars.world.tile(x + dx, y + dy); if(other.entity != null){ other.entity.damage((int)(amount * Mathf.lerp(1f-dst/rad, 1f, falloff))); } @@ -61,7 +62,7 @@ public class Tile{ } public int id(){ - return x + y * World.worldsize; + return x + y * Vars.world.width(); } public float worldx(){ @@ -139,7 +140,7 @@ public class Tile{ int offsety = -(block.height-1)/2; for(int dx = 0; dx < block.width; dx ++){ for(int dy = 0; dy < block.height; dy ++){ - Tile other = World.tile(x + dx + offsetx, y + dy + offsety); + Tile other = Vars.world.tile(x + dx + offsetx, y + dy + offsety); tmpArray.add(other); } } @@ -154,12 +155,12 @@ public class Tile{ }else{ byte dx = Bits.getLeftByte(link); byte dy = Bits.getRightByte(link); - return World.tile(x - (dx - 8), y - (dy - 8)); + return Vars.world.tile(x - (dx - 8), y - (dy - 8)); } } public Tile[] getNearby(){ - return World.getNearby(x, y); + return Vars.world.getNearby(x, y); } public void changed(){ diff --git a/core/src/io/anuke/mindustry/world/World.java b/core/src/io/anuke/mindustry/world/World.java index e5b6597b0f..34a80075d6 100644 --- a/core/src/io/anuke/mindustry/world/World.java +++ b/core/src/io/anuke/mindustry/world/World.java @@ -18,61 +18,81 @@ import io.anuke.ucore.core.Sounds; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.Entity; import io.anuke.ucore.entities.SolidEntity; +import io.anuke.ucore.modules.Module; import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Tmp; -public class World{ - public static int worldsize = 128; - public static int pixsize = worldsize*tilesize; - private static int seed; +public class World extends Module{ + private int seed; - private static Pixmap[] mapPixmaps; - private static Texture[] mapTextures; - private static Map currentMap; - private static Tile[][] tiles = new Tile[worldsize][worldsize]; - private static Tile[] temptiles = new Tile[4]; + private Pixmap[] mapPixmaps; + private Texture[] mapTextures; + private Map currentMap; + private Tile[][] tiles; + private Tile[] temptiles = new Tile[4]; + private Pathfind pathfind = new Pathfind(); - public static Tile core; - //TODO move this to control? - public static Array spawnpoints = new Array(); + public World(){ + loadMaps(); + } - public static boolean solid(int x, int y){ + @Override + public void update(){ + pathfind.update(); + } + + @Override + public void dispose(){ + for(Texture texture : mapTextures){ + texture.dispose(); + } + + for(Pixmap pix : mapPixmaps){ + pix.dispose(); + } + } + + public Pathfind pathfinder(){ + return pathfind; + } + + public boolean solid(int x, int y){ Tile tile = tile(x, y); return tile == null || tile.block().solid || (tile.floor().solid && (tile.block() == Blocks.air)); } - public static boolean wallSolid(int x, int y){ + public boolean wallSolid(int x, int y){ Tile tile = tile(x, y); return tile == null || tile.block().solid; } - public static boolean isAccessible(int x, int y){ + public boolean isAccessible(int x, int y){ return !wallSolid(x, y-1) || !wallSolid(x, y+1) || !wallSolid(x-1, y) ||!wallSolid(x+1, y); } - public static Map getMap(){ + public Map getMap(){ return currentMap; } - public static int width(){ - return mapPixmaps[currentMap.ordinal()].getWidth(); + public int width(){ + return currentMap.width; } - public static int height(){ - return mapPixmaps[currentMap.ordinal()].getHeight(); + public int height(){ + return currentMap.height; } - public static Tile tile(int x, int y){ + public Tile tile(int x, int y){ if(!Mathf.inBounds(x, y, tiles)) return null; return tiles[x][y]; } - public static Tile tileWorld(float x, float y){ + public Tile tileWorld(float x, float y){ return tile(Mathf.scl2(x, tilesize), Mathf.scl2(y, tilesize)); } - public static Tile[] getNearby(int x, int y){ + public Tile[] getNearby(int x, int y){ temptiles[0] = tile(x+1, y); temptiles[1] = tile(x, y+1); temptiles[2] = tile(x-1, y); @@ -80,11 +100,11 @@ public class World{ return temptiles; } - public static Texture getTexture(Map map){ + public Texture getTexture(Map map){ return mapTextures[map.ordinal()]; } - public static void loadMaps(){ + public void loadMaps(){ Map[] maps = Map.values(); mapPixmaps = new Pixmap[maps.length]; @@ -94,10 +114,12 @@ public class World{ Pixmap pix = new Pixmap(Gdx.files.internal("maps/"+maps[i]+".png")); mapPixmaps[i] = pix; mapTextures[i] = new Texture(pix); + maps[i].width = pix.getWidth(); + maps[i].height = pix.getHeight(); } } - private static void createTiles(){ + private void createTiles(){ for(int x = 0; x < tiles.length; x ++){ for(int y = 0; y < tiles[0].length; y ++){ if(tiles[x][y] == null){ @@ -107,7 +129,7 @@ public class World{ } } - private static void clearTileEntities(){ + private void clearTileEntities(){ for(int x = 0; x < tiles.length; x ++){ for(int y = 0; y < tiles[0].length; y ++){ if(tiles[x][y] != null && tiles[x][y].entity != null){ @@ -117,57 +139,48 @@ public class World{ } } - public static void loadMap(Map map){ + public void loadMap(Map map){ loadMap(map, MathUtils.random(0, 99999)); } - public static void loadMap(Map map, int seed){ - - spawnpoints.clear(); - - int size = mapPixmaps[map.ordinal()].getWidth(); - worldsize = size; - pixsize = worldsize*tilesize; + public void loadMap(Map map, int seed){ currentMap = map; if(tiles != null){ clearTileEntities(); - if(tiles.length != worldsize || tiles[0].length != worldsize){ - tiles = new Tile[worldsize][worldsize]; + if(tiles.length != map.width || tiles[0].length != map.height){ + tiles = new Tile[map.width][map.height]; } createTiles(); }else{ - tiles = new Tile[worldsize][worldsize]; + tiles = new Tile[map.width][map.height]; createTiles(); } - Entities.resizeTree(0, 0, pixsize, pixsize); + Entities.resizeTree(0, 0, map.width * tilesize, map.height * tilesize); - World.seed = seed; - Generator.generate(mapPixmaps[map.ordinal()]); - - Pathfind.reset(); + this.seed = seed; + Generator.generate(mapPixmaps[map.ordinal()], tiles); //TODO multiblock core - placeBlock(core.x, core.y, ProductionBlocks.core, 0); + placeBlock(control.getCore().x, control.getCore().y, ProductionBlocks.core, 0); if(map != Map.tutorial){ setDefaultBlocks(); }else{ - Vars.control.getTutorial().setDefaultBlocks(core.x, core.y); + Vars.control.getTutorial().setDefaultBlocks(control.getCore().x, control.getCore().y); } - Pathfind.updatePath(); + pathfind.updatePath(); } - static void setDefaultBlocks(){ - int x = core.x, y = core.y; + void setDefaultBlocks(){ + int x = control.getCore().x, y = control.getCore().y; - //set(x, y-1, DistributionBlocks.conveyor, 1); set(x, y-2, DistributionBlocks.conveyor, 1); set(x, y-3, DistributionBlocks.conveyor, 1); @@ -183,28 +196,26 @@ public class World{ set(x+2*d, y-3, DistributionBlocks.conveyor, 2*d); set(x+2*d, y-4, DistributionBlocks.conveyor, 1); set(x+2*d, y-5, DistributionBlocks.conveyor, 1); - //set(x+2*d, y-6, DistributionBlocks.conveyor, 1); - //set(x+3*d, y-6, ProductionBlocks.stonedrill, 0); set(x+3*d, y-5, ProductionBlocks.stonedrill, 0); set(x+3*d, y-4, ProductionBlocks.stonedrill, 0); set(x+3*d, y-3, ProductionBlocks.stonedrill, 0); } } - static void set(int x, int y, Block type, int rot){ + void set(int x, int y, Block type, int rot){ if(type == ProductionBlocks.stonedrill){ tiles[x][y].setFloor(Blocks.stone); } tiles[x][y].setBlock(type, rot); } - public static int getSeed(){ + public int getSeed(){ return seed; } //TODO move to control or player? - public static void placeBlock(int x, int y, Block result, int rotation){ + public void placeBlock(int x, int y, Block result, int rotation){ Tile tile = tile(x, y); //just in case @@ -239,10 +250,10 @@ public class World{ } //TODO move this to control? - public static boolean validPlace(int x, int y, Block type){ + public boolean validPlace(int x, int y, Block type){ - for(Tile spawn : spawnpoints){ - if(Vector2.dst(x * tilesize, y * tilesize, spawn.worldx(), spawn.worldy()) < enemyspawnspace){ + for(SpawnPoint spawn : control.getSpawnPoints()){ + if(Vector2.dst(x * tilesize, y * tilesize, spawn.start.worldx(), spawn.start.worldy()) < enemyspawnspace){ return false; } } @@ -270,7 +281,8 @@ public class World{ int rotation = Vars.control.getTutorial().getPlaceRotation(); Block block = Vars.control.getTutorial().getPlaceBlock(); - if(type != block || point.x != x - core.x || point.y != y - core.y || (rotation != -1 && rotation != Vars.player.rotation)){ + if(type != block || point.x != x - control.getCore().x || point.y != y - control.getCore().y + || (rotation != -1 && rotation != Vars.player.rotation)){ return false; } }else if(Vars.control.getTutorial().active()){ @@ -298,7 +310,7 @@ public class World{ } } - public static void breakBlock(int x, int y){ + public void breakBlock(int x, int y){ Tile tile = tile(x, y); if(tile == null) return; @@ -324,7 +336,7 @@ public class World{ } } - public static boolean validBreak(int x, int y){ + public boolean validBreak(int x, int y){ Tile tile = tile(x, y); if(tile == null || tile.block() == ProductionBlocks.core) return false; @@ -340,7 +352,8 @@ public class World{ int rotation = Vars.control.getTutorial().getPlaceRotation(); Block block = Vars.control.getTutorial().getPlaceBlock(); - if(block != Blocks.air || point.x != x - core.x || point.y != y - core.y || (rotation != -1 && rotation != Vars.player.rotation)){ + if(block != Blocks.air || point.x != x - control.getCore().x || point.y != y - control.getCore().y + || (rotation != -1 && rotation != Vars.player.rotation)){ return false; } }else{ @@ -351,11 +364,7 @@ public class World{ return tile.breakable(); } - //public static Rectangle getCollider(int x, int y){ - // return Rectangle.tmp2.setSize(tilesize).setCenter(x * tilesize, y * tilesize); - //} - - public static TileEntity findTileTarget(float x, float y, Tile tile, float range, boolean damaged){ + public TileEntity findTileTarget(float x, float y, Tile tile, float range, boolean damaged){ Entity closest = null; float dst = 0; @@ -389,21 +398,11 @@ public class World{ return (TileEntity) closest; } - public static void disposeMaps(){ - for(Pixmap pixmap : mapPixmaps){ - pixmap.dispose(); - } - - for(Texture texture : mapTextures){ - texture.dispose(); - } - } - /** * Input is in block coordinates, not world coordinates. * @return null if no collisions found, block position otherwise. */ - public static Vector2 raycast(int x0f, int y0f, int x1f, int y1f){ + public Vector2 raycast(int x0f, int y0f, int x1f, int y1f){ int x0 = (int)x0f; int y0 = (int)y0f; int x1 = (int)x1f; diff --git a/core/src/io/anuke/mindustry/world/blocks/Blocks.java b/core/src/io/anuke/mindustry/world/blocks/Blocks.java index 2dc1cd8612..73c50db859 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Blocks.java +++ b/core/src/io/anuke/mindustry/world/blocks/Blocks.java @@ -31,20 +31,20 @@ public class Blocks{ blockpart = new BlockPart(), deepwater = new Floor("deepwater"){{ - vary = false; + variants = 0; solid = true; liquidDrop = Liquid.water; }}, water = new Floor("water"){{ - vary = false; + variants = 0; solid = true; liquidDrop = Liquid.water; }}, lava = new Floor("lava"){ { - vary = false; + variants = 0; solid = true; liquidDrop = Liquid.lava; } @@ -63,7 +63,7 @@ public class Blocks{ oil = new Floor("oil"){ { - vary = false; + variants = 0; solid = true; liquidDrop = Liquid.oil; } @@ -80,6 +80,10 @@ public class Blocks{ drops = new ItemStack(Item.stone, 1); }}, + blackstone = new Floor("blackstone"){{ + drops = new ItemStack(Item.stone, 1); + }}, + iron = new Floor("iron"){{ drops = new ItemStack(Item.iron, 1); }}, @@ -100,24 +104,38 @@ public class Blocks{ grass = new Floor("grass"), - stoneblock = new Block("stoneblock"){{ - solid = true; - }}, + stoneblock = new Block("stoneblock"){ + { + solid = true; + variants = 3; + } + + @Override + public void draw(Tile tile){ + // Draw.colorl(0.9f + Mathf.randomSeed(tile.id()*9999, 1, 10)/10f / 10f); + super.draw(tile); + // Draw.color(); + } + }, - stoneblock2 = new Block("stoneblock2"){{ - solid = true; - }}, - - stoneblock3 = new Block("stoneblock3"){{ - solid = true; - }}, + blackstoneblock = new Block("blackstoneblock"){ + { + solid = true; + variants = 3; + } + + @Override + public void draw(Tile tile){ + // float f = 0.15f; + // Draw.colorl(1f - f + Mathf.randomSeed(tile.id()*9999, 1, 10)/10f / (1f / f)); + super.draw(tile); + // Draw.color(); + } + }, grassblock = new Block("grassblock"){{ solid = true; - }}, - - grassblock2 = new Block("grassblock2"){{ - solid = true; + variants = 2; }}, mossblock = new Block("mossblock"){{ @@ -134,13 +152,17 @@ public class Blocks{ shadow = "rockshadow"; breakable = true; breaktime = 15; + variants = 2; + varyShadow = true; drops = new ItemStack(Item.stone, 3); }}, - - rock2 = new Block("rock2"){{ - shadow = "rock2shadow"; + + blackrock = new Block("blackrock"){{ + shadow = "blackrockshadow"; breakable = true; breaktime = 15; + variants = 1; + varyShadow = true; drops = new ItemStack(Item.stone, 3); }}, diff --git a/core/src/io/anuke/mindustry/world/blocks/types/BlendBlock.java b/core/src/io/anuke/mindustry/world/blocks/types/BlendBlock.java new file mode 100644 index 0000000000..31ea497749 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/types/BlendBlock.java @@ -0,0 +1,31 @@ +package io.anuke.mindustry.world.blocks.types; + +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; +import io.anuke.ucore.core.Draw; +import io.anuke.ucore.function.Predicate; +import io.anuke.ucore.util.Mathf; + +public class BlendBlock extends Block{ + protected String edge; + protected Predicate blend = block -> block == this; + + public BlendBlock(String name) { + super(name); + edge = name + "-edge"; + } + + @Override + public void draw(Tile tile){ + Draw.rect(variants > 0 ? (name() + Mathf.randomSeed(tile.id(), 1, variants)) : name(), + tile.worldx(), tile.worldy()); + + Tile[] nearby = tile.getNearby(); + + for(int i = 0; i < 4; i ++){ + if(nearby[i] != null && !blend.test(nearby[i].block())){ + Draw.rect(edge + "-" + i, tile.worldx(), tile.worldy()); + } + } + } +} diff --git a/core/src/io/anuke/mindustry/world/blocks/types/Floor.java b/core/src/io/anuke/mindustry/world/blocks/types/Floor.java index 68033ccc4c..83f524c0a0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/Floor.java @@ -3,9 +3,9 @@ package io.anuke.mindustry.world.blocks.types; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.MathUtils; +import io.anuke.mindustry.Vars; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; import io.anuke.ucore.core.Draw; import io.anuke.ucore.graphics.Caches; import io.anuke.ucore.util.Mathf; @@ -14,20 +14,21 @@ public class Floor extends Block{ public Floor(String name) { super(name); + variants = 3; } @Override public void drawCache(Tile tile){ MathUtils.random.setSeed(tile.id()); - Caches.draw(vary ? (name() + MathUtils.random(1, 3)) : name(), tile.worldx(), tile.worldy()); + Caches.draw(variants > 0 ? (name() + MathUtils.random(1, variants)) : name(), tile.worldx(), tile.worldy()); for(int dx = -1; dx <= 1; dx ++){ for(int dy = -1; dy <= 1; dy ++){ if(dx == 0 && dy == 0) continue; - Tile other = World.tile(tile.x+dx, tile.y+dy); + Tile other = Vars.world.tile(tile.x+dx, tile.y+dy); if(other == null) continue; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/Door.java b/core/src/io/anuke/mindustry/world/blocks/types/defense/Door.java new file mode 100644 index 0000000000..123b3b44a9 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/types/defense/Door.java @@ -0,0 +1,11 @@ +package io.anuke.mindustry.world.blocks.types.defense; + +import io.anuke.mindustry.world.blocks.types.Wall; + +public class Door extends Wall{ + + public Door(String name) { + super(name); + } + +} diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/RepairTurret.java b/core/src/io/anuke/mindustry/world/blocks/types/defense/RepairTurret.java index ce76ef65a2..13d48f0b07 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/RepairTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/defense/RepairTurret.java @@ -4,8 +4,8 @@ import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.Vars; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Hue; @@ -39,7 +39,7 @@ public class RepairTurret extends PowerTurret{ TurretEntity entity = tile.entity(); if(Timers.get(entity, "blocktarget", targetInterval)){ - entity.blockTarget = World.findTileTarget(tile.worldx(), tile.worldy(), tile, range, true); + entity.blockTarget = Vars.world.findTileTarget(tile.worldx(), tile.worldy(), tile, range, true); } if(entity.blockTarget != null){ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java b/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java index 7f38024cbf..ec2c00fbbe 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java @@ -8,7 +8,6 @@ import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.effect.Fx; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.World; import io.anuke.mindustry.world.blocks.types.PowerAcceptor; import io.anuke.mindustry.world.blocks.types.PowerBlock; import io.anuke.ucore.core.Draw; @@ -140,7 +139,7 @@ public class Generator extends PowerBlock{ int i = 0; for(i = 1; i < laserRange; i++){ - Tile other = World.tile(tile.x + i * point.x, tile.y + i * point.y); + Tile other = Vars.world.tile(tile.x + i * point.x, tile.y + i * point.y); if(other != null && other.block() instanceof PowerAcceptor){ Tile linked = other.getLinked(); @@ -173,7 +172,7 @@ public class Generator extends PowerBlock{ } if(Vector2.dst(x, y, 0, 0) < powerRange){ - Tile dest = World.tile(tile.x + x, tile.y + y); + Tile dest = Vars.world.tile(tile.x + x, tile.y + y); if(dest != null && dest.block() instanceof PowerAcceptor && ((PowerAcceptor) dest.block()).acceptsPower(dest)){ if(i == 1){ PowerAcceptor block = (PowerAcceptor) dest.block();