From 404ec68570bd8181ec273841047ee3abbe97f2bf Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 8 Dec 2017 19:59:04 -0500 Subject: [PATCH] Changed pathfinding algorithm slightly, added debugging for paths --- core/assets/maps/test3.png | Bin 6335 -> 1529 bytes core/assets/shaders/outline.fragment | 2 +- core/src/io/anuke/mindustry/Vars.java | 2 + core/src/io/anuke/mindustry/ai/Pathfind.java | 53 +++++++++++++----- .../src/io/anuke/mindustry/core/Renderer.java | 21 ++++++- core/src/io/anuke/mindustry/core/UI.java | 6 +- .../io/anuke/mindustry/entities/Player.java | 2 + .../mindustry/entities/enemies/Enemy.java | 19 +++++-- .../mindustry/ui/MindustrySettingsDialog.java | 2 +- .../io/anuke/mindustry/world/SpawnPoint.java | 1 + core/src/io/anuke/mindustry/world/World.java | 8 ++- desktop/mindustry-saves/0.mins | Bin 3824 -> 6584 bytes desktop/mindustry-saves/1.mins | Bin 3767 -> 6655 bytes desktop/mindustry-saves/7.mins | Bin 2866 -> 5289 bytes 14 files changed, 91 insertions(+), 25 deletions(-) diff --git a/core/assets/maps/test3.png b/core/assets/maps/test3.png index aa0b38402596e7f2a23edcc1877aab3b0defcfec..34e5a233de22e8ccfe7212f9950f302690c60f34 100644 GIT binary patch literal 1529 zcmeAS@N?(olHy`uVBq!ia0y~yU}OMc4mJh`hM1xiX$%YuY)RhkE(~Ds(|LD20|NtR zfk$L90|U1(2s1Lwnj^u$z`$PO>Fdh=kcWdshUNS0X&)IFSlc{Z978H@y}cWqciTXK zH6VR~sAhCg_|=@1w}O79F3`9Wwe71y<@ukvvu=nyFY?elcl>MB-+c@dPYEF2up*Ke8y4x)y_YDel7i3xOY|zlSB193$yv3Yc6_oFu3N= z$<=0QIAs2=DIs5uCFlyj57p!D$dU3ZYgKziWd-&V$ieOUYVfR z!rH*yr?7#Q!STa%&4)~fwLhyoyb!?7aIm|bq2YmmhB$xG^T3@M8}jUWEtY$Ibj}l) z@~HhzrP)r64QFd!f83U+S$AS?^JK>Mx6f1b?;cq4Bk}&vn?({80vvoC&0*qeUX?l= z+;f$&LBNBHVYR)J13Lo;!v$6j1_35X#s`b%IFRB6wh{)1 z(~JpU+rPc`VrQ^oP}s=5;#$1Ig+TTNKNil{0~;-3&jF5Shu{2fZ!LOP0@7Ogjhn&h zE|W%G0UN^-)`qL{PRtG;ovrV!JRbB16!I4;#Xoq}TCub|cK=&ai-)K`6YQk>TJ`eTD;K3@>gjtd|y$*unha z<^Bge3MM626x?Sk@gZBSQ-3c zT3*i-Um)C2{N}6Axy!N*0u0d%2@QG<3=MqXTvc(zQK6-rA&>je$8B~THPze-ED)1+ zFl^v$_`v7D(V)w)VevA1kq~i)hYj<_$U8XEW=r=R( z{Jfh-=*hX)MiCEq7&u}soLbPxx8S9K087N*!`m607!I9hXkiHZ|A1kGYQqPH3%m(^ zTnu*^masP{9C)SAz{1!S&tM^cfJud+h2h!lEIVO=CUL3#JS+!e({?&cu-?9G3HMf= z?wQ?>{B4 zitK0LxT|*NvyP0&HU^J*HQDM*76iPh{-{x)KKW)#*dHqf;b`{-FIXE+{=4V+_*3@I zGxI;+wvQM1`u=g%-a6^Fe{W-Z*00;J{rcAH$v4947!RCNEO424xBBgWZr)aXhKi)8 wwO_3HvbhBq8F&umI)KYYEX5^AsKM_KTkA@pQ|vw|k3dDZr>mdKI;Vst02XpF6951J literal 6335 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 diff --git a/core/assets/shaders/outline.fragment b/core/assets/shaders/outline.fragment index 3bd3c1c9ce..2ac6ef52be 100644 --- a/core/assets/shaders/outline.fragment +++ b/core/assets/shaders/outline.fragment @@ -30,6 +30,6 @@ void main() { if(any){ gl_FragColor = u_color; }else{ - gl_FragColor = texture2D(u_texture, T); + gl_FragColor = texture2D(u_texture, T) * v_color; } } diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index ad34385288..84a235031e 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -46,6 +46,8 @@ public class Vars{ public static boolean infiniteAmmo = false; //whether to show paths of enemies public static boolean showPaths = true; + //if false, player is always hidden + public static boolean showPlayer = true; //number of save slots-- increasing may lead to layout issues //TODO named save slots, possibly with a scroll dialog public static final int saveSlots = 8; diff --git a/core/src/io/anuke/mindustry/ai/Pathfind.java b/core/src/io/anuke/mindustry/ai/Pathfind.java index 4937c13805..22d7dcb58d 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfind.java +++ b/core/src/io/anuke/mindustry/ai/Pathfind.java @@ -10,7 +10,9 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.world.SpawnPoint; import io.anuke.mindustry.world.Tile; +import io.anuke.ucore.core.Timers; import io.anuke.ucore.util.Angles; +import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Tmp; public class Pathfind{ @@ -30,7 +32,6 @@ public class Pathfind{ return vector.set(enemy.x, enemy.y); }else if(enemy.node == -2){ enemy.node = -1; - enemy.findClosestNode(); } Tile[] path = enemy.path; @@ -43,7 +44,7 @@ public class Pathfind{ if(enemy.node > 1) enemy.node = enemy.node - 1; }else{ - //what's the problem, then? + //must be blocked by a playermade block } enemy.idletime = 0; @@ -100,6 +101,7 @@ public class Pathfind{ if(point.finder.search(point.request, ms * 2)){ smoother.smoothPath(point.path); point.pathTiles = point.path.nodes.toArray(Tile.class); + point.tempTiles = point.path.nodes.toArray(Tile.class); } } } @@ -112,6 +114,7 @@ public class Pathfind{ point.path.clear(); point.pathTiles = null; + point.tempTiles = null; point.request = new PathFinderRequest(point.start, Vars.control.getCore(), heuristic, point.path); point.request.statusChanged = true; //IMPORTANT! @@ -128,22 +131,44 @@ public class Pathfind{ } enemy.path = Vars.control.getSpawnPoints().get(enemy.spawn).pathTiles; - Tile[] path = enemy.path; - Tile closest = null; - float ldst = 0f; - int cindex = -1; - for(int i = 0; i < path.length; i ++){ - Tile tile = path[i]; - float dst = Vector2.dst(tile.worldx(), tile.worldy(), enemy.x, enemy.y); - - if(closest == null || dst < ldst){ - ldst = dst; - closest = tile; + int closest = findClosest(enemy.path, 0, enemy.x, enemy.y); + closest = findClosest(enemy.path, closest + 1, enemy.x, enemy.y); + //closest ++; + + closest = Mathf.clamp(closest, 1, enemy.path.length-1); + Tile end = enemy.path[closest]; + enemy.node = closest; + + //if the enemy can't get to this node, teleport to it + if(enemy.node < enemy.path.length - 2 && Vars.world.raycastWorld(enemy.x, enemy.y, end.worldx(), end.worldy()) != null){ + Timers.run(Mathf.random(20f), () -> enemy.set(end.worldx(), end.worldy())); + } + } + + private static int findClosest(Tile[] tiles, int offset, float x, float y){ + int cindex = -1; + float dst = Float.MAX_VALUE; + + for(int i = offset; i < tiles.length; i ++){ + Tile tile = tiles[i]; + if(Vector2.dst(tile.worldx(), tile.worldy(), x, y) < dst){ + dst = Vector2.dst(tile.worldx(), tile.worldy(), x, y); cindex = i; } } - enemy.node = Math.max(cindex, 1); + + return cindex; + } + + private static int indexOf(Tile tile, Tile[] tiles){ + int i = -1; + for(int j = 0; j < tiles.length; j ++){ + if(tiles[j] == tile){ + return j; + } + } + return i; } private static boolean onLine(Vector2 vector, float x1, float y1, float x2, float y2){ diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index cccd55a5a3..a4cdbe7a6c 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -270,6 +270,11 @@ public class Renderer extends RendererModule{ Graphics.begin(); Draw.reset(); + + if(Vars.showPaths){ + drawPaths(); + } + int rangex = (int) (camera.viewportWidth * camera.zoom / tilesize / 2) + 2; int rangey = (int) (camera.viewportHeight * camera.zoom / tilesize / 2) + 2; @@ -383,6 +388,20 @@ public class Renderer extends RendererModule{ cbatch.dispose(); cbatch = new CacheBatch(256 * 256 * 3); } + + void drawPaths(){ + Draw.color(Color.RED); + for(SpawnPoint point : control.spawnpoints){ + if(point.pathTiles != null){ + for(int i = 1; i < point.pathTiles.length; i ++){ + Draw.line(point.pathTiles[i-1].worldx(), point.pathTiles[i-1].worldy(), + point.pathTiles[i].worldx(), point.pathTiles[i].worldy()); + Draw.circle(point.pathTiles[i-1].worldx(), point.pathTiles[i-1].worldy(), 6f); + } + } + } + Draw.reset(); + } void renderPixelOverlay(){ @@ -503,7 +522,7 @@ public class Renderer extends RendererModule{ drawHealth(entity); } - if(!Vars.android) + if(!Vars.android && Vars.showPlayer) drawHealth(player); } diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 38a4df9b3c..dfdaabbd33 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -112,10 +112,10 @@ public class UI extends SceneModule{ Draw.color(); TextureRegion back = Draw.region("background"); - float backscl = 4f; + float backscl = 4.5f; - Draw.alpha(0.8f); - Core.batch.draw(back, w/2 - back.getRegionWidth()*backscl/2, h/2 - back.getRegionHeight()*backscl/2, + Draw.alpha(0.7f); + Core.batch.draw(back, w/2 - back.getRegionWidth()*backscl/2 +240f, h/2 - back.getRegionHeight()*backscl/2 + 250f, back.getRegionWidth()*backscl, back.getRegionHeight()*backscl); float logoscl = (int)Unit.dp.inPixels(7); diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 09b687c297..3421334dbf 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -56,6 +56,8 @@ public class Player extends DestructibleEntity{ @Override public void draw(){ + if(!Vars.showPlayer) return; + if(Vars.snapCamera && Settings.getBool("smoothcam") && Settings.getBool("pixelate")){ Draw.rect("mech-"+mech.name(), (int)x, (int)y, direction.angle()-90); }else{ diff --git a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java index cb22aefc7f..1d3572a1be 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java @@ -18,7 +18,7 @@ import io.anuke.ucore.util.Tmp; public class Enemy extends DestructibleEntity{ public final static Color[] tierColors = { Color.valueOf("ffe451"), Color.valueOf("f48e20"), Color.valueOf("ff6757"), Color.valueOf("ff2d86") }; public final static int maxtier = 4; - public final static float maxIdle = 60*3f; + public final static float maxIdle = 60*1.5f; protected float speed = 0.4f; protected float reload = 32; @@ -142,11 +142,16 @@ public class Enemy extends DestructibleEntity{ Bullet out = new Bullet(bullet, this, x + Angles.x(), y + Angles.y(), this.angle + rotation).add(); out.damage = (int) (damage * Vars.multiplier); } - + + /* public void findClosestNode(){ int index = 0; int cindex = -1; float dst = Float.MAX_VALUE; + UCore.log("Finding closest."); + + Tile[] clone = path.clone(); + UCore.log(clone.length); //find closest node index for(Tile tile : path){ @@ -171,7 +176,7 @@ public class Enemy extends DestructibleEntity{ set(x2 * Vars.tilesize, y2 * Vars.tilesize); }); } - } + }*/ @Override public void added(){ @@ -221,7 +226,7 @@ public class Enemy extends DestructibleEntity{ xvelocity = (x - lastx) / Timers.delta(); yvelocity = (y - lasty) / Timers.delta(); - float minv = 0.001f; + float minv = 0.0001f; if(xvelocity < minv && yvelocity < minv && node > 0){ idletime += Timers.delta(); @@ -248,6 +253,12 @@ public class Enemy extends DestructibleEntity{ Draw.color(); Draw.rect(region, x, y, this.angle - 90); + if(Vars.showPaths){ + Draw.color(Color.PURPLE); + Draw.line(x, y, x + xvelocity*10f, y + yvelocity*10f); + Draw.color(); + } + Graphics.flush(); } diff --git a/core/src/io/anuke/mindustry/ui/MindustrySettingsDialog.java b/core/src/io/anuke/mindustry/ui/MindustrySettingsDialog.java index f4a13053a1..a0f2ee6d12 100644 --- a/core/src/io/anuke/mindustry/ui/MindustrySettingsDialog.java +++ b/core/src/io/anuke/mindustry/ui/MindustrySettingsDialog.java @@ -21,7 +21,7 @@ public class MindustrySettingsDialog extends SettingsDialog{ content().remove(); buttons().remove(); - ScrollPane pane = new ScrollPane(content()); + ScrollPane pane = new ScrollPane(content(), "clear"); pane.setFadeScrollBars(false); row(); diff --git a/core/src/io/anuke/mindustry/world/SpawnPoint.java b/core/src/io/anuke/mindustry/world/SpawnPoint.java index 9735946ecd..94a0293203 100644 --- a/core/src/io/anuke/mindustry/world/SpawnPoint.java +++ b/core/src/io/anuke/mindustry/world/SpawnPoint.java @@ -8,6 +8,7 @@ import io.anuke.mindustry.ai.SmoothGraphPath; public class SpawnPoint{ public Tile start; public Tile[] pathTiles; + public Tile[] tempTiles; public PathFinder finder; public SmoothGraphPath path = new SmoothGraphPath(); public PathFinderRequest request; diff --git a/core/src/io/anuke/mindustry/world/World.java b/core/src/io/anuke/mindustry/world/World.java index 5769a500b2..48a761e4da 100644 --- a/core/src/io/anuke/mindustry/world/World.java +++ b/core/src/io/anuke/mindustry/world/World.java @@ -68,6 +68,12 @@ public class World extends Module{ return tile == null || tile.solid(); } + public boolean passable(int x, int y){ + Tile tile = tile(x, y); + + return tile != null && tile.passable(); + } + public boolean wallSolid(int x, int y){ Tile tile = tile(x, y); return tile == null || tile.block().solid; @@ -462,7 +468,7 @@ public class World extends Module{ int e2; while(true){ - if(solid(x0, y0)){ + if(!passable(x0, y0)){ return Tmp.g1.set(x0, y0); } if(x0 == x1 && y0 == y1) break; diff --git a/desktop/mindustry-saves/0.mins b/desktop/mindustry-saves/0.mins index 0a4475541e9d05d5042df983403c454447301758..d6822e9442db8d1a9c773e64ee1aa0982d4a7ada 100644 GIT binary patch literal 6584 zcmZQzVBle3U`(*++4`9Q1cY3sF)+B~*QmKv&H2N?z>vbg&cGno+Rw}&*V4cOBG^C# z6Nq315sV;$fq_womBD3Kh__43!zYXk3=DEi49@><7rFHPQeZy zWH6VR$>oq@olD#kW{~1(jLa^YQLkJ&olb$c8cfVCCzic;sg>daD`sSH+5bnyCGMIl zSeAv+`RwInm)S=Tf@I?u8C|*#n7BCfeg(_2GPvya&U1-%E(3Apm>FCq{Ev2N_3s98 zr*Sa3%%A+;#rOJ05cdQVgNsVDu}k+oR*+FFOiV88t0P?+S6>8kS(sc-u^G7(O7?@e zajc9komVwnZ0(nU^vW?ZxoH2aa_KCp0&z817+s{L*CGu1ZX5%nONykJi{YzWkYXEV2A9qbIhU5}Q$XBl9Lz2YHlKI#FMbN*o?vBk z>H0dw#X5-*#Fb-Ua>?{Ca?zFtnap6r#przg+*_Bad}lzimpB+)JUjVax)y4HxF?vI zUFP!0xOlI40OC$#Vst(s9pW;5nm5Q9EUe5fdb-vwT@~3NSveMFmqjA3F8*4TAlW!h zCYNJs)-JU({XpDx%#1FA5qU1%{CXh8AV;2Dxy>ar*Epy+0d<6v+x5UzIVcwhoje1e0?#qrTEm$eh;fVrFuF2djVT{{2Of%LB9 zWOV-1y4Ypaj@4i;3$x4Nbw^y{wyXegK`A!p&9fkYibv*9j54EI5@pi;#kOT?wyaTb`%!RW%o z9plnh4vyawoXjpqwm){Mdk@ZK>lm3_OqI%k0_V$k4Va#=7T+ok!c5lHp~Cxc65 z?roQjS9Tz0tYcwvG4Gx0vU6iz}I84kgr~Ud}a%KF%vaHN5^H%P3X*%l#*2~D?(tYBL zi$k~yh^xWHBz7nDC zvbX@8CP6XCpLEEj+ZtRxPh(9zxv8;mTRjLt91-ncBk`W$4@I!b6J>OHe@)vME(JJff3~2 zLr+p&5`wpZEYjd$bUs-((`C*IP7wD5BeRS4tyM0ar>26q8l227$K4xU>Wrs@jbdeR z>B^RJu{Q@-UUD1^F4kXXx^!Ix2kZ$JM(4*j1YMS|0S8?iC^4w=xuni+2N`vVnb~FC zHer{@n|naqX&j6$a_A;_CGPs<4an2?0 zLJvr<1}n3RZlj4y=PGdd3@VUY`+vB!LMv+yM&}E?0xpYez?J3+E@qeYhkaclX3K%} zUgBhQK7Vz$%i>w8;LzY;aLKGWz~qwg^Nx!~=ynj-1ms`OH!k5dXF*(0 z%JI;d^+_!lR>45z*Tvd&MSFfE(?>3r9h<1 z+CXs1iDPDRS#YM^#b@^?h+anL^JN(>^He~^CO9#?V+(Ovp&Uh z%`OGvY#=VE%+ck@fE9h9GUrr`l}piPP-}!Sj)mFf_*(~;3zlVIa!Hp|bkR988zgJP%Iq>@N3lz*3ph)HYDv{pSC`Ih|3R{# zc24;9442OTT424bj4tyU#a&vKfWujilhOHJ@?Do@n?ThQ<2nuo7yCu3E?p08KzczL zhxf-zmmX+w&Bg3;Qe4<2#{yKCGhAX~biO_%%4M12Kak0w9C|2#$t5NVY!M3=gG=6~ zFD`9X_drHnVq$VR@h;D$=+qmqVh(1PQ+|(K%65RAae{-%<@f|um+HUZ7R3oh2A3o5 zyIm65<3V~g7?@nrVsl;8Q^48ThMCbt*i+i2TN0eDrg1X6tn_np37!@LGI<>nqw{Yj z6PJ}uphAWbR6fTX6mjX41}AS&W%!8^;j*e6 zTmgaNcaO?(m)O;yGKT>auojikE}d1NVuV41iOFS)%VC$Mf}bG0ER4)9aXSNDj2pnM zFCGSFm%Y8SU83t9Kwbb9ZpWY8bxE}cMG9jaBa@3^`AnBCpIabV4Ms+nLcdy5?u$mo)OTE#`>=Xk5M375`&pjv|g)MC`IDs|~n>jNp);9_toN=tQVI}PpvTw-B%Iq_(fOY-Ft zAibcr=%$&qE{*d*B?BWUOWMkmx^&C}r*;hv2A2-K&n_*CKrJW+P*ORuDcL2%Ee>ol zBZJG)8y+snL7+%s0JYoCEPdfJ%?MQFGRAQ+yPP@}8 z1CvY2ZeAB{VNf53!G@91WxnGqm!`~ou&Y>@TPtZ&Sx|GU!%Ezx zwGo_Dyj|GMNSyaXAwj)}pAkMo;Lmm#Qt zVr1c9a@jc1$fZdRoSs1;shxVsrEA7%kWruC^`YJE+aSXZL=W=onD_%LwY!IGqr4 z>Cy*P)(oI_?CHxBT}rJ%X@hYc3#0RMUuKty9N>_QV`6lEwriQoiu;-%FMx9QUe4n# zv3Ed~HG>=rlgo*FaV}Le!EHiNbF1LKluPRma5qhZg~7$zeSu4-n*>NNs8w*#O3x)h z^ft(Y8eEJnikm;Wbi07cX9iHeEH8A2OZ((+AlVbFOfLExd0aa8fbu?r90#NGx7A^!X})+3%w=J4DLPo=()utQ>t9h74O6Yc+%=!N8DU4-;DpVM#DBY;b^yML5A&@y;;T1~(XM zBb-(44i=MOVA$vhW{EQ}Z1I7yI()$_2?mBVKNxE>geA_v5E%p$YYB$2Hb7Y73=AO= zFtM;m7^?-&3XXz_1xCYIT@aQy14CO3SWKLOAt)Bil3-v6Nr17E6JadhWEd+H&I(R} ziDjn3Sj`ZYI0HiqoYf9zb-`I{;H-=^nBL70mN)}LV>(z&oPi-d1I&_OU}%J}#2FZ( zGGSt|Suj>^HjLE@VTm&^birBvISinL2aXF31_p)zG=3l&-#-_u9@L#>0I3I=9e_nF z5Gn?e2diUb*spblfguPY?#9f(0M;K2;iH%rf<-J8A_k6aHIR!z1~dF&VAz%mW{EQ} z1m;1U2I7OQWMW{jKgz(sKbe6cIIkQe%*enHl2-v`h2~X4S)F+x27@>Q!+JO?Fdt$X z$S$a9w)#IA&VpKoLFjS}3=F~f?I1%yHb7);7#J9sK(UCI$x6 zOAP-wH!v^+7fgq$3MrTYWrY^ZgtAf#Kn#!zbK$HlaMo5h%fAp}1Kic1D8(Wc2o;07 zgpt8t`X&QI5JcP!q+f-Bfgz(1W^V(WQSzF<(LU2@qWVcqq^afRfSrQBk84wnz*sB4Hi8C;4 zs)ezV>S3%*IBO%ERo?)UZG^MB8)0ItO)yqFg4GHW>x8p5!ddZcFxf^pD;b<%K(0@L zvo^z7n>t`R;=#!Wq%IN8N`kXm;Vl0yn2ybGR%AC!EE>*Ag|nLBtf(HCx?VUdq!%U@ z0cUN5vr_wDvOD3dfPR?R8aOL=0!(ZZoRu&cCKfvt#_EQ%w!m4r;4A_1`8qf&3!FJX zVw>TtP2g+-5=)&8GjHu&7;7DzwRt{FEPVltm9-GYTD=&?YFz?j#`U+Sb6tTGqi>`RieD~#2&9mdMq4P#~Q zfw8jTtPVJ3TKs^f~jkOvo^w6Tj8wI({OcgR`nT}Sj9OQs|wEA0%zr( Khsl;+gs=cNJwQ7E literal 3824 zcmZQzVBle3U`#M-xc8HRje&uI(Xs6CT$hDsb)CEQk{K8nQW)47801>EF*C@uG_Wwp zH8-+>SWF;-l|iog8Y76s00NBGy&(Mz3|Z13E`t;UL#`~0RRL$EDZs?a;jBVMm{^W7 zjFqPXXQ{$i`RXuMs}_t^p$%h|7{FM^tzoRQ4lvddCm8FhGmJIC6~^*+gR#!RS+?#l zF;`C*>mZzECz+@M|S$E;Ara+kN zDL89R5KJsT7{=;_vou3sV!CivADpEb29q_1vy$Mf{czU4aG1L5a8_CbOl%gMbp+0` zh=j>{z*(>0EU74%tSg-L0M1g6hRJ5ZS=n$_E}Yc~XB~sH)MH?Jd*H0hIGETWIO`^y zbs!!t3ui?qz{JkMS-0V=@cZiy3viY~3rtqK1IF3{XN7da#MHZBEDbm-1kO_LhRLpjvyQ`AZ{RHT9+)~UIBOl8 zwHMCX-wRW>sSn254QDCz!^A4#tkwxIvDI*v>qMAXGn};p&UyuBNlk*O(}%M>;H(BX z%XczNT{E2Z49?P+0+ZE+v+UulZE)68I4f@|OvhR{>lmDsI1MJd2F_X!XKjG9q^HBw zDNSc!WME(b*Bu%R3=GO>d=)gl5nQJOoTW4aY=$1lAdnd#vz4)ksX)a*@-TI(5HUAq z1_lO@m>PtSVwO4j(;=#D7#J9sKy{7AEO1U?WMJ@~1yTYkL{(-(Y-5532S{9P zHaMg~?wbwv63BhC!CqoyV2GLxQUlVv7tT_e12F~eW>Cap5mSMRA={=35p#p-RfF(R zBLs_>21E=kLQXI+*vx@BP<}3qr8F1pKt!rTwHVI23}-1W0lUr{76eLYd}TDg3Njz031s-$B_I+MFN#aS#vwwG zkwMQclYv1AT^tlk=wgfv47=kP7*x>3nHd-yo-!~<+-8Vj;9_7; zU9%V-F6m?VGT}IbVnYQ3!?I-{6F{N9Z8?l}0nXB20TbJ@62_8W1!Hx=S*fdGVlC@n ztjP5+mfA)bOC8R#-2@XmyBWsH+5%%`Y=g1XcEVUra8@jwWw#3^o4OCivfmG5ErGMr z4#30~9)z)y4#QZ};H))p)`}xA*&Rn=ERAC@Rwtab5YE~KXW1Wzsna|GW7)u2u5i|J zIBPSUHSHu!$AMEYmepw(s{+oN1!u*cfypj_vzEbGCTC%?R&Z7yoHZHFaySQ5Hyh5H z3un!TvlhTvJr`g)>Mz1r^Wm(ymtbPvmticID=^mFt1y<=4H(M@&RTFACYF5%###(# UEx8L53w;D*R&-v0R1|%V*mgE diff --git a/desktop/mindustry-saves/1.mins b/desktop/mindustry-saves/1.mins index 86411f17c34e4c89e3e2a7a8e606c83557d2f513..c9e88d8c67f1751963346cf40e518ad41ebe4d65 100644 GIT binary patch literal 6655 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 literal 3767 zcmZQzVBle3U`){G_GDsUXJBApbjk95;Zpv^&3UeQ3j+f~3IjVUgIr4k8;D?GkZZ|d zW{_+C!pI=k!ok2G*Rq5OB*6dzj1g8042(Vu4DrGsE`tOELoS@v4rf(J!epzYV61*P zt3etjHVw{-k%fsR$iY~Z@-Ws^B^Yal3XD~(24gLTvwAdOV)Ha%EN?9sD-+JjgR|=4 ztO;%znW^kA$8eHg0+&MG#5iA{vF=EGTWhA`P0 zIBPzf6>9{OO^363jA3HS;j9D`m{w}r71;H+Xe%hMhv8{`0IIl@?hPB2yyoHYf`nhIxCIK$LUa)Gg8+~6#C z7%RjR#tMhCg1up4`EXV-oE7c^lXVJ!v2uf8tjb^*%Ps`Qx*Q5)C5FLRDR5RvI7}=p z0>-L}gt6+PV65XYFxG)s80!q2bs5fTiHFG^OMtP8lVGe0IBRz@OiUvM#%f80u`1GF ztSfNVbvVm69VQzBXPt+$nlfOrr{OH`Oqf^zoD~LV6~I{)aMrdgm=2e07%K?QItyoA zg|j4b85kKD7{IX%%IK14d?_@(PcF>dcsQ#7&MJqqB=W%K>VXUgnajY);GuMifk6^e z+(&jj1A`P)9Ar9FJ;O>91_o(}xEnJA0|Q802Es=+mtpY>1_oJlaRvqkIfxiIof&}~ z0y3PTf`K6-56qHaV35j(I1|JN84sdm^2PJ2C095T%Bm;?F+h4R!dVhU5L4i8V`SK&WWvB8iA~&|fk6r?4!4z&fnnuL z1_o(}xEstI83-RWa*i`F$fApbA_pRd7CANy430%G2S0$bB#OZfMx;_Sz7!hYssv`n zIXJ7N6ei|V24j`NS!Uok2L+QCoD~LVRl!->;1mH;mjq{BfwQiHQwd1+8k}_t&T_1R z+3N*onN`EYV&JS6I7_<*CL0H5b--CFwct+gBBl-z^9LCQv5(D3tm+j5gK|9D5k1n5mSST!4ns#II0KP z0Sd=JILo^MCZ^U1W7WY~c}*~}LOAOIob?RODr$zQYl5@%Kn*qqkZlHVRt%iw(hAez z4rh75Ss8FvA)NIL&hl)7=}m&Ois39XaLxzW`vT4~?SScMgR^A8DNp-{2wZd6qJutCHy)af$ABSP!z z4bG~Dv+}0EWUJvU)u}MC3UGM_^6x}&c?M!hg3B`yYXO|K2F}W#3)4FZ&RPOzmCb|6 z_QF~9^I>AE;Vi|4FtJ68VXV$2FxEskYYLn-eJMtJF_*TY!TH^5kPHo;guTVSkda8~11nAj#bYuyf**k(AZ zeJ4z8J)E_D7fft7oYlS?CN>4mS`TL}-2;S^1cZZoBR;M0sxXpcys^& diff --git a/desktop/mindustry-saves/7.mins b/desktop/mindustry-saves/7.mins index c4c689f2255ccf23eb75dad5cea5a72acfc3aefe..ea53bde8d4e87d6cb6ef089a7a89bb00348ced3c 100644 GIT binary patch literal 5289 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