diff --git a/core/src/io/anuke/mindustry/ClientLauncher.java b/core/src/io/anuke/mindustry/ClientLauncher.java index 65773ce6dd..a25e7fa1fd 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -11,6 +11,7 @@ import io.anuke.mindustry.core.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.maps.*; import static io.anuke.arc.Core.*; import static io.anuke.mindustry.Vars.*; @@ -35,9 +36,8 @@ public class ClientLauncher extends ApplicationCore{ batch = new SpriteBatch(); assets = new AssetManager(); + assets.setLoader(Texture.class, "." + mapExtension, new MapPreviewLoader()); atlas = TextureAtlas.blankAtlas(); - assets.load("sprites/logo.png", Texture.class); - assets.finishLoading(); UI.loadDefaultFont(); UI.loadSystemCursors(); @@ -139,27 +139,14 @@ public class ClientLauncher extends ApplicationCore{ Draw.proj().setOrtho(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight()); float height = UnitScl.dp.scl(50f); - Texture logo = Core.assets.get("sprites/logo.png"); - float logoscl = UnitScl.dp.scl(1); - float logow = Math.min(logo.getWidth() * logoscl, Core.graphics.getWidth() - UnitScl.dp.scl(20)); - float logoh = logow * (float)logo.getHeight() / logo.getWidth(); - float fx = (int)(Core.graphics.getWidth() / 2f); - float fy = (int)(Core.graphics.getHeight() - 6 - logoh) + logoh / 2 - (Core.graphics.isPortrait() ? UnitScl.dp.scl(30f) : 0f); - - Draw.color(); - - //Draw.rect(Draw.wrap(logo), fx, fy, logow, logoh); - - Lines.stroke(graphics.getWidth()*10, Color.BLACK); - Tmp.v1.set(graphics.getWidth(), graphics.getHeight()).scl(smoothProgress); + Draw.color(Color.BLACK); Fill.poly(graphics.getWidth()/2f, graphics.getHeight()/2f, 6, Mathf.dst(graphics.getWidth()/2f, graphics.getHeight()/2f) * smoothProgress); - //Lines.line(0, 0, Tmp.v1.x, Tmp.v1.y, CapStyle.none); Draw.reset(); float w = graphics.getWidth()*0.6f; - Draw.color(Pal.darkerGray); + Draw.color(Color.BLACK); Fill.rect(graphics.getWidth()/2f, graphics.getHeight()/2f, w, height); Draw.color(Pal.accent); diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index 84d4262650..6d8b8a0b40 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -32,11 +32,6 @@ public class EventType{ } - /** Called when the core app is first loaded. */ - public static class AppLoadEvent{ - - } - public static class DisposeEvent{ } diff --git a/core/src/io/anuke/mindustry/maps/Map.java b/core/src/io/anuke/mindustry/maps/Map.java index 5df1bf056d..92789727dc 100644 --- a/core/src/io/anuke/mindustry/maps/Map.java +++ b/core/src/io/anuke/mindustry/maps/Map.java @@ -61,6 +61,10 @@ public class Map implements Comparable{ return Vars.mapPreviewDirectory.child(file.nameWithoutExtension() + ".png"); } + public FileHandle cacheFile(){ + return Vars.mapPreviewDirectory.child(file.nameWithoutExtension() + "-cache.dat"); + } + public void setHighScore(int score){ Core.settings.put("hiscore" + file.nameWithoutExtension(), score); Vars.data.modified(); @@ -124,11 +128,11 @@ public class Map implements Comparable{ @Override public int compareTo(Map map){ int type = -Boolean.compare(custom, map.custom); - if(type != 0){ - return type; - }else{ - return name().compareTo(map.name()); - } + if(type != 0) return type; + int modes = Boolean.compare(Gamemode.pvp.valid(this), Gamemode.pvp.valid(map)); + if(modes != 0) return modes; + + return name().compareTo(map.name()); } @Override diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/io/anuke/mindustry/maps/Maps.java index b57602e63a..96d0541c68 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/io/anuke/mindustry/maps/Maps.java @@ -3,14 +3,17 @@ package io.anuke.mindustry.maps; import io.anuke.arc.*; import io.anuke.arc.assets.*; import io.anuke.arc.collection.*; +import io.anuke.arc.collection.IntSet.*; import io.anuke.arc.files.*; import io.anuke.arc.function.*; import io.anuke.arc.graphics.*; import io.anuke.arc.util.*; import io.anuke.arc.util.async.*; +import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.maps.MapPreviewLoader.*; import io.anuke.mindustry.maps.filters.*; @@ -50,6 +53,12 @@ public class Maps{ return maps.find(m -> m.name().equals(name)); } + public Maps(){ + Events.on(ClientLoadEvent.class, event -> { + maps.sort(); + }); + } + /** * Loads a map from the map folder and returns it. Should only be used for zone maps. * Does not add this map to the map list. @@ -299,16 +308,23 @@ public class Maps{ } public void loadPreviews(){ - Core.assets.setLoader(Texture.class, "." + mapExtension, new MapPreviewLoader()); + for(Map map : maps){ //try to load preview if(map.previewFile().exists()){ //this may fail, but calls createNewPreview Core.assets.load(new AssetDescriptor<>(map.previewFile().path() + "." + mapExtension, Texture.class, new MapPreviewParameter(map))).loaded = t -> map.texture = (Texture)t; }else{ - createNewPreview(map); + Core.app.post(() -> createNewPreview(map)); + } + + try{ + readCache(map); + }catch(Exception ignored){ } } + + } public void createNewPreview(Map map){ @@ -317,11 +333,41 @@ public class Maps{ //this has to be done synchronously! Pixmap pix = MapIO.generatePreview(map); Core.app.post(() -> map.texture = new Texture(pix)); - executor.submit(() -> map.previewFile().writePNG(pix)); + executor.submit(() -> { + try{ + map.previewFile().writePNG(pix); + writeCache(map); + }catch(Exception e){ + e.printStackTrace(); + } + }); }catch(IOException e){ Log.err("Failed to generate preview!", e); //TODO create error texture instead? - map.texture = new Texture("zones/nomap.png"); + Core.app.post(() -> map.texture = new Texture("zones/nomap.png")); + } + } + + private void writeCache(Map map) throws IOException{ + try(DataOutputStream stream = new DataOutputStream(map.cacheFile().write(false, Streams.DEFAULT_BUFFER_SIZE))){ + stream.write(0); + stream.writeInt(map.spawns); + stream.write(map.teams.size); + IntSetIterator iter = map.teams.iterator(); + while(iter.hasNext){ + stream.write(iter.next()); + } + } + } + + private void readCache(Map map) throws IOException{ + try(DataInputStream stream = new DataInputStream(map.cacheFile().read(Streams.DEFAULT_BUFFER_SIZE))){ + stream.read(); //version + map.spawns = stream.readInt(); + int teamsize = stream.readByte(); + for(int i = 0; i < teamsize; i++){ + map.teams.add(stream.read()); + } } } @@ -343,7 +389,7 @@ public class Maps{ } maps.add(map); - //maps.sort(); + maps.sort(); } private void loadCustomMaps(){ diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index a392b7ba95..f2546a43f0 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -19,6 +19,7 @@ import io.anuke.mindustry.game.Version; import io.anuke.mindustry.graphics.MenuRenderer; import io.anuke.mindustry.ui.MobileButton; +import static io.anuke.arc.Core.assets; import static io.anuke.mindustry.Vars.*; public class MenuFragment extends Fragment{ @@ -27,24 +28,13 @@ public class MenuFragment extends Fragment{ private MenuRenderer renderer; public MenuFragment(){ + assets.load("sprites/logo.png", Texture.class); + assets.finishLoading(); Events.on(DisposeEvent.class, event -> { renderer.dispose(); }); } - public static void drawLogo(){ - Texture logo = Core.assets.get("sprites/logo.png"); - float logoscl = UnitScl.dp.scl(1); - float logow = Math.min(logo.getWidth() * logoscl, Core.graphics.getWidth() - UnitScl.dp.scl(20)); - float logoh = logow * (float)logo.getHeight() / logo.getWidth(); - - float fx = (int)(Core.graphics.getWidth() / 2f); - float fy = (int)(Core.graphics.getHeight() - 6 - logoh) + logoh / 2 - (Core.graphics.isPortrait() ? UnitScl.dp.scl(30f) : 0f); - - Draw.color(); - Draw.rect(Draw.wrap(logo), fx, fy, logow, logoh); - } - @Override public void build(Group parent){ renderer = new MenuRenderer();