From ec29bd36826d12ddb68915ebac8cea5b3722eaf7 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 2 Oct 2019 21:03:56 -0400 Subject: [PATCH] Custom sounds, mod sound loading --- .../io/anuke/mindustry/ClientLauncher.java | 9 +++++- core/src/io/anuke/mindustry/Vars.java | 13 ++++---- .../src/io/anuke/mindustry/core/FileTree.java | 12 ++++++-- .../io/anuke/mindustry/mod/ContentParser.java | 30 +++++++++++++++++++ core/src/io/anuke/mindustry/mod/Mods.java | 2 +- gradle.properties | 2 +- 6 files changed, 57 insertions(+), 11 deletions(-) diff --git a/core/src/io/anuke/mindustry/ClientLauncher.java b/core/src/io/anuke/mindustry/ClientLauncher.java index 2012d59c26..3234b1f9c5 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -2,6 +2,8 @@ package io.anuke.mindustry; import io.anuke.arc.*; import io.anuke.arc.assets.*; +import io.anuke.arc.assets.loaders.*; +import io.anuke.arc.audio.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; @@ -41,10 +43,15 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform batch = new SpriteBatch(); assets = new AssetManager(); assets.setLoader(Texture.class, "." + mapExtension, new MapPreviewLoader()); + + tree = new FileTree(); + assets.setLoader(Sound.class, new SoundLoader(tree)); + assets.setLoader(Music.class, new MusicLoader(tree)); + assets.load("sprites/error.png", Texture.class); atlas = TextureAtlas.blankAtlas(); Vars.net = new Net(platform.getNet()); - Vars.mods = new Mods(); + mods = new Mods(); UI.loadSystemCursors(); diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index c723907b1f..cd2dcd57ae 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -196,10 +196,9 @@ public class Vars implements Loadable{ Version.init(); - tree = new FileTree(); - if(mods == null){ - mods = new Mods(); - } + if(files ==null) tree = new FileTree(); + if(mods == null) mods = new Mods(); + content = new ContentLoader(); loops = new LoopControl(); defaultWaves = new DefaultWaves(); @@ -255,12 +254,16 @@ public class Vars implements Loadable{ maps.load(); } - public static void loadSettings(){ + public static void createDirectories(){ Core.settings.setAppName(appName); if(steam || Version.modifier.equals("steam")){ Core.settings.setDataDirectory(Core.files.local("saves/")); } + } + + public static void loadSettings(){ + createDirectories(); Core.settings.defaults("locale", "default"); Core.keybinds.setDefaults(Binding.values()); diff --git a/core/src/io/anuke/mindustry/core/FileTree.java b/core/src/io/anuke/mindustry/core/FileTree.java index b55b063635..1537c73da3 100644 --- a/core/src/io/anuke/mindustry/core/FileTree.java +++ b/core/src/io/anuke/mindustry/core/FileTree.java @@ -1,15 +1,16 @@ package io.anuke.mindustry.core; import io.anuke.arc.*; +import io.anuke.arc.assets.loaders.*; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; /** Handles files in a modded context. */ -public class FileTree{ +public class FileTree implements FileHandleResolver{ private ObjectMap files = new ObjectMap<>(); - public void addFile(FileHandle f){ - files.put(f.path(), f); + public void addFile(String path, FileHandle f){ + files.put(path, f); } /** Gets an asset file.*/ @@ -20,4 +21,9 @@ public class FileTree{ return Core.files.internal(path); } } + + @Override + public FileHandle resolve(String fileName){ + return get(fileName); + } } diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 79780bbff8..dc8c6b3f28 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -1,5 +1,7 @@ package io.anuke.mindustry.mod; +import io.anuke.arc.*; +import io.anuke.arc.audio.*; import io.anuke.arc.collection.*; import io.anuke.arc.function.*; import io.anuke.arc.graphics.*; @@ -14,6 +16,7 @@ import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.gen.*; import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -27,6 +30,23 @@ public class ContentParser{ put(Effect.class, (type, data) -> field(Fx.class, data)); put(StatusEffect.class, (type, data) -> field(StatusEffects.class, data)); put(Color.class, (type, data) -> Color.valueOf(data.asString())); + put(Music.class, (type, data) -> { + if(fieldOpt(Musics.class, data) != null) return fieldOpt(Musics.class, data); + + String path = "music/" + data.asString() + (Vars.ios ? ".mp3" : ".ogg"); + Core.assets.load(path, Music.class); + Core.assets.finishLoadingAsset(path); + return Core.assets.get(path); + }); + put(Sound.class, (type, data) -> { + if(fieldOpt(Sounds.class, data) != null) return fieldOpt(Sounds.class, data); + + String path = "sounds/" + data.asString() + (Vars.ios ? ".mp3" : ".ogg"); + Core.assets.load(path, Sound.class); + Core.assets.finishLoadingAsset(path); + Log.info(Core.assets.get(path)); + return Core.assets.get(path); + }); }}; /** Stores things that need to be parsed fully, e.g. reading fields of content. * This is done to accomodate binding of content names first.*/ @@ -221,6 +241,16 @@ public class ContentParser{ } } + private Object fieldOpt(Class type, JsonValue value){ + try{ + Object b = type.getField(value.asString()).get(null); + if(b == null) return null; + return b; + }catch(Exception e){ + return null; + } + } + /** Checks all @NonNull fields in this object, recursively. * Throws an exception if any are null.*/ private void checkNulls(Object object){ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 3f4730c74c..daf9687be4 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -180,7 +180,7 @@ public class Mods implements Loadable{ //ignore special folders like bundles or sprites if(file.isDirectory() && !specialFolders.contains(file.name())){ //TODO calling child/parent on these files will give you gibberish; create wrapper class. - file.walk(f -> tree.addFile(f)); + file.walk(f -> tree.addFile(mod.file.isDirectory() ? f.path().substring(1 + mod.file.path().length()) : f.path(), f)); } } diff --git a/gradle.properties b/gradle.properties index d707230c05..e0b0e4aa19 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=840b75daba69d93a5c493e740a573463e03f9ada +archash=2a94f9187de5a7fa0b795ba4725fbc3e929b890c