From a00a208ff82be986af49978cc636fe3ed8dcc967 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 30 Jul 2019 12:05:59 -0400 Subject: [PATCH] Annotation processor for sound asset generation --- .../AssetsAnnotationProcessor.java | 69 ++++++++++++++++++ .../javax.annotation.processing.Processor | 3 +- core/assets/sounds/shoot.mp3 | Bin 3725 -> 0 bytes core/src/io/anuke/mindustry/type/Weapon.java | 3 +- 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java delete mode 100644 core/assets/sounds/shoot.mp3 diff --git a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java new file mode 100644 index 0000000000..314940c76f --- /dev/null +++ b/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java @@ -0,0 +1,69 @@ +package io.anuke.annotations; + +import com.squareup.javapoet.*; + +import javax.annotation.processing.*; +import javax.lang.model.*; +import javax.lang.model.element.*; +import javax.tools.Diagnostic.*; +import java.nio.file.*; +import java.util.*; + +@SupportedSourceVersion(SourceVersion.RELEASE_8) +public class AssetsAnnotationProcessor extends AbstractProcessor{ + /** Name of the base package to put all the generated classes. */ + private static final String packageName = "io.anuke.mindustry.gen"; + private int round; + + @Override + public synchronized void init(ProcessingEnvironment processingEnv){ + super.init(processingEnv); + //put all relevant utils into utils class + Utils.typeUtils = processingEnv.getTypeUtils(); + Utils.elementUtils = processingEnv.getElementUtils(); + Utils.filer = processingEnv.getFiler(); + Utils.messager = processingEnv.getMessager(); + } + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv){ + if(round++ != 0) return false; //only process 1 round + + try{ + TypeSpec.Builder type = TypeSpec.classBuilder("Sounds").addModifiers(Modifier.PUBLIC); + HashSet names = new HashSet<>(); + Files.list(Paths.get("core/assets/sounds/")).forEach(p -> { + String name = p.getFileName().toString(); + name = name.substring(0, name.indexOf(".")); + if(names.contains(name)){ + Utils.messager.printMessage(Kind.ERROR, "Duplicate sound file name: " + p.toString() + "!"); + }else{ + names.add(name); + } + }); + + Files.list(Paths.get("core/assets/sounds/")).forEach(p -> { + String fname = p.getFileName().toString(); + String name = p.getFileName().toString(); + name = name.substring(0, name.indexOf(".")); + if(SourceVersion.isKeyword(name)){ + name = name + "s"; + } + type.addField(FieldSpec.builder(ClassName.bestGuess("io.anuke.arc.audio.Sound"), name, Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL) + .initializer(CodeBlock.builder().add("io.anuke.arc.Core.audio.newSound(io.anuke.arc.Core.files.internal($S))", "sounds/" + fname).build()).build()); + }); + + + JavaFile.builder(packageName, type.build()).build().writeTo(Utils.filer); + return true; + }catch(Exception e){ + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + @Override + public Set getSupportedAnnotationTypes() { + return Collections.singleton("*"); + } +} diff --git a/annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor index 5954bfccb9..0094bb0b52 100644 --- a/annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor +++ b/annotations/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -1,4 +1,5 @@ io.anuke.annotations.RemoteMethodAnnotationProcessor io.anuke.annotations.SerializeAnnotationProcessor io.anuke.annotations.StructAnnotationProcessor -io.anuke.annotations.CallSuperAnnotationProcessor \ No newline at end of file +io.anuke.annotations.CallSuperAnnotationProcessor +io.anuke.annotations.AssetsAnnotationProcessor \ No newline at end of file diff --git a/core/assets/sounds/shoot.mp3 b/core/assets/sounds/shoot.mp3 deleted file mode 100644 index 4a826fdfdd7892dbb5fbf135394c4146a63bd3ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3725 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 RAjwmU8RF;;Y9S981^~nQMiBr2 diff --git a/core/src/io/anuke/mindustry/type/Weapon.java b/core/src/io/anuke/mindustry/type/Weapon.java index d26c9213b0..0f2177bcf8 100644 --- a/core/src/io/anuke/mindustry/type/Weapon.java +++ b/core/src/io/anuke/mindustry/type/Weapon.java @@ -14,6 +14,7 @@ import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.gen.Sounds; import io.anuke.mindustry.net.Net; public class Weapon{ @@ -53,7 +54,7 @@ public class Weapon{ /** whether shooter rotation is ignored when shooting. */ public boolean ignoreRotation = false; - public Sound shootSound = Core.audio.newSound(Core.files.internal("sounds/shoot.ogg")); + public Sound shootSound = Sounds.die; public TextureRegion region;