From 6de4af727b16d259349ee0be1c3418ee0f4930c9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 3 Apr 2019 22:24:14 -0400 Subject: [PATCH] JSON read/write generation --- .../SerializeAnnotationProcessor.java | 61 +++++++++++++++++-- .../io/anuke/mindustry/content/Bullets.java | 2 +- .../io/anuke/mindustry/game/SpawnGroup.java | 4 +- .../anuke/mindustry/io/SaveFileVersion.java | 2 +- .../anuke/mindustry/io/versions/Save16.java | 4 +- 5 files changed, 63 insertions(+), 10 deletions(-) diff --git a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java index 1f8450cd13..6eb2efa6e9 100644 --- a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java @@ -50,8 +50,21 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning); MethodSpec.Builder method = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC); + TypeName jsonType = ClassName.bestGuess("io.anuke.arc.util.serialization.Json"); + TypeName jsonValueType = ClassName.bestGuess("io.anuke.arc.util.serialization.JsonValue"); + TypeName ubJsonWriterType = ClassName.bestGuess("io.anuke.arc.util.serialization.UBJsonWriter"); + TypeName ubJsonReaderType = ClassName.bestGuess("io.anuke.arc.util.serialization.UBJsonReader"); + + classBuilder.addField(jsonType, "bjson", Modifier.STATIC, Modifier.PRIVATE); + classBuilder.addField(ubJsonReaderType, "bjsonReader", Modifier.STATIC, Modifier.PRIVATE); + classBuilder.addStaticBlock(CodeBlock.builder() + .addStatement("bjson = new " + jsonType + "()") + .addStatement("bjsonReader = new " + ubJsonReaderType + "()") + .build()); + for(TypeElement elem : elements){ TypeName type = TypeName.get(elem.asType()); + String simpleTypeName = type.toString().substring(type.toString().lastIndexOf('.') + 1); TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("") .addSuperinterface(ParameterizedTypeName.get( @@ -70,7 +83,19 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ .addException(IOException.class) .addModifiers(Modifier.PUBLIC); + MethodSpec.Builder jsonWriteMethod = MethodSpec.methodBuilder("write" + simpleTypeName + "Json") + .returns(void.class) + .addParameter(jsonType, "json") + .addParameter(type, "object") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC); + + MethodSpec.Builder jsonReadMethod = MethodSpec.methodBuilder("read" + simpleTypeName + "Json") + .returns(type) + .addParameter(jsonValueType, "value") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC); + readMethod.addStatement("$L object = new $L()", type, type); + jsonReadMethod.addStatement("$L object = new $L()", type, type); List fields = ElementFilter.fieldsIn(Utils.elementUtils.getAllMembers(elem)); for(VariableElement field : fields){ @@ -83,6 +108,9 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ if(field.asType().getKind().isPrimitive()){ writeMethod.addStatement("stream.write" + capName + "(object." + name + ")"); readMethod.addStatement("object." + name + "= stream.read" + capName + "()"); + + jsonWriteMethod.addStatement("json.writeValue(\"" + name + "\", object." + name +")"); + jsonReadMethod.addStatement("if(value.has(\"" + name + "\")) object." + name + "= value.get" + capName + "(\"" + name + "\")"); }else{ writeMethod.addStatement("io.anuke.arc.Core.settings.getSerializer(" + typeName+ ".class).write(stream, object." + name + ")"); readMethod.addStatement("object." + name + " = (" +typeName+")io.anuke.arc.Core.settings.getSerializer(" + typeName+ ".class).read(stream)"); @@ -90,22 +118,47 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ } readMethod.addStatement("return object"); + jsonReadMethod.addStatement("return object"); serializer.addMethod(writeMethod.build()); serializer.addMethod(readMethod.build()); method.addStatement("io.anuke.arc.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build()); - String sname = type.toString().substring(type.toString().lastIndexOf('.') + 1); - - name(writeMethod, "write" + sname); - name(readMethod, "read" + sname); + name(writeMethod, "write" + simpleTypeName); + name(readMethod, "read" + simpleTypeName); writeMethod.addModifiers(Modifier.STATIC); readMethod.addModifiers(Modifier.STATIC); classBuilder.addMethod(writeMethod.build()); classBuilder.addMethod(readMethod.build()); + + classBuilder.addMethod(jsonWriteMethod.build()); + classBuilder.addMethod(jsonReadMethod.build()); + + MethodSpec.Builder binaryJsonWriteMethod = MethodSpec.methodBuilder("write" + simpleTypeName + "StreamJson") + .returns(void.class) + .addParameter(DataOutput.class, "stream") + .addParameter(type, "object") + .addException(IOException.class) + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .addStatement("java.io.StringWriter output = new java.io.StringWriter()") + .addStatement("bjson.setWriter(output)") + .addStatement("bjson.writeObjectStart(" + type + ".class, " + type + ".class)") + .addStatement("write" + simpleTypeName + "Json(bjson, object)") + .addStatement("bjson.writeObjectEnd()") + .addStatement("stream.writeUTF(output.toString())"); + + MethodSpec.Builder binaryJsonReadMethod = MethodSpec.methodBuilder("read" + simpleTypeName + "StreamJson") + .returns(type) + .addParameter(DataInput.class, "stream") + .addException(IOException.class) + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .addStatement("return read" + simpleTypeName + "Json(bjson.fromJson(null, stream.readUTF()))"); + + classBuilder.addMethod(binaryJsonWriteMethod.build()); + classBuilder.addMethod(binaryJsonReadMethod.build()); } classBuilder.addMethod(method.build()); diff --git a/core/src/io/anuke/mindustry/content/Bullets.java b/core/src/io/anuke/mindustry/content/Bullets.java index 4980da2a00..2a749524b0 100644 --- a/core/src/io/anuke/mindustry/content/Bullets.java +++ b/core/src/io/anuke/mindustry/content/Bullets.java @@ -730,7 +730,7 @@ public class Bullets implements ContentList{ lifetime = 23f; speed = 1f; splashDamageRadius = 50f; - splashDamage = 20f; + splashDamage = 28f; } @Override diff --git a/core/src/io/anuke/mindustry/game/SpawnGroup.java b/core/src/io/anuke/mindustry/game/SpawnGroup.java index adcde8f0f3..99a89885ff 100644 --- a/core/src/io/anuke/mindustry/game/SpawnGroup.java +++ b/core/src/io/anuke/mindustry/game/SpawnGroup.java @@ -75,7 +75,7 @@ public class SpawnGroup implements Serializable{ } @Override - public void write (Json json) { + public void write(Json json){ json.writeValue("type", type.name); if(begin != 0) json.writeValue("begin", begin); if(end != never) json.writeValue("end", end); @@ -87,7 +87,7 @@ public class SpawnGroup implements Serializable{ } @Override - public void read (Json json, JsonValue data) { + public void read(Json json, JsonValue data){ type = content.getByName(ContentType.unit, data.getString("type", "dagger")); begin = data.getInt("begin", 0); end = data.getInt("end", never); diff --git a/core/src/io/anuke/mindustry/io/SaveFileVersion.java b/core/src/io/anuke/mindustry/io/SaveFileVersion.java index 289f7b85b1..69f1c3339a 100644 --- a/core/src/io/anuke/mindustry/io/SaveFileVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveFileVersion.java @@ -36,7 +36,7 @@ public abstract class SaveFileVersion{ long playtime = stream.readLong(); int build = stream.readInt(); - Rules rules = Serialization.readRules(stream); + Rules rules = Serialization.readRulesStreamJson(stream); String map = stream.readUTF(); int wave = stream.readInt(); return new SaveMeta(version, time, playtime, build, map, wave, rules); diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index 466da0d648..3b5d8f2116 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -26,7 +26,7 @@ public class Save16 extends SaveFileVersion{ stream.readInt(); //build //general state - state.rules = Serialization.readRules(stream); + state.rules = Serialization.readRulesStreamJson(stream); String mapname = stream.readUTF(); Map map = world.maps.all().find(m -> m.name().equals(mapname)); if(map == null) map = new Map(customMapDirectory.child(mapname), 1, 1, new ObjectMap<>(), true); @@ -56,7 +56,7 @@ public class Save16 extends SaveFileVersion{ stream.writeInt(Version.build); //build //--GENERAL STATE-- - Serialization.writeRules(stream, state.rules); + Serialization.writeRulesStreamJson(stream, state.rules); stream.writeUTF(world.getMap().name()); //map name stream.writeInt(state.wave); //wave