diff --git a/src/main/java/emu/grasscutter/GameConstants.java b/src/main/java/emu/grasscutter/GameConstants.java index a4bc2c8cb..f26abc97c 100644 --- a/src/main/java/emu/grasscutter/GameConstants.java +++ b/src/main/java/emu/grasscutter/GameConstants.java @@ -6,7 +6,7 @@ import emu.grasscutter.utils.Position; import emu.grasscutter.utils.Utils; public final class GameConstants { - public static String VERSION = "3.3.0"; + public static String VERSION = "3.4.0"; public static final int DEFAULT_TEAMS = 4; public static final int MAX_TEAMS = 10; diff --git a/src/main/java/emu/grasscutter/data/common/DynamicFloat.java b/src/main/java/emu/grasscutter/data/common/DynamicFloat.java index 7dfd6a83e..4fc3fdca6 100644 --- a/src/main/java/emu/grasscutter/data/common/DynamicFloat.java +++ b/src/main/java/emu/grasscutter/data/common/DynamicFloat.java @@ -1,20 +1,25 @@ package emu.grasscutter.data.common; import java.util.List; +import java.util.Optional; import it.unimi.dsi.fastutil.floats.FloatArrayList; import it.unimi.dsi.fastutil.objects.Object2FloatArrayMap; import it.unimi.dsi.fastutil.objects.Object2FloatMap; import lombok.val; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.luaj.vm2.ast.Str; public class DynamicFloat { public static DynamicFloat ZERO = new DynamicFloat(0f); public static class StackOp { - enum Op {CONSTANT, KEY, ADD, SUB, MUL, DIV}; + enum Op { CONSTANT, KEY, ADD, SUB, MUL, DIV, NEXBOOLEAN }; public Op op; public float fValue; public String sValue; + public boolean bValue; public StackOp(String s) { switch (s.toUpperCase()) { @@ -28,12 +33,17 @@ public class DynamicFloat { } } } + public StackOp(boolean b) { + this.op = Op.NEXBOOLEAN; + this.bValue = Boolean.parseBoolean(String.valueOf(b)); + } public StackOp(float f) { this.op = Op.CONSTANT; this.fValue = f; } } + private List ops; private boolean dynamic = false; private float constant = 0f; @@ -42,11 +52,22 @@ public class DynamicFloat { this.constant = constant; } + public String toString(boolean nextBoolean) { + String key = String.valueOf(nextBoolean); + this.ops = List.of(new StackOp(key)); + return ops.toString(); + } + public DynamicFloat(String key) { this.dynamic = true; this.ops = List.of(new StackOp(key)); } + public DynamicFloat(boolean b) { + this.dynamic = true; + this.ops = List.of(new StackOp(String.valueOf(b))); + } + public DynamicFloat(List ops) { this.dynamic = true; this.ops = ops; @@ -69,8 +90,10 @@ public class DynamicFloat { case SUB -> fl.push(-fl.popFloat() + fl.popFloat()); // [f0, f1, f2] -> [f0, f1-f2] (opposite of RPN order) case MUL -> fl.push(fl.popFloat() * fl.popFloat()); case DIV -> fl.push((1f/fl.popFloat()) * fl.popFloat()); // [f0, f1, f2] -> [f0, f1/f2] + case NEXBOOLEAN -> fl.push(props.getOrDefault(Optional.of(op.bValue), 0f)); } } + return fl.popFloat(); // well-formed data will always have only one value left at this point } } diff --git a/src/main/java/emu/grasscutter/utils/JsonAdapters.java b/src/main/java/emu/grasscutter/utils/JsonAdapters.java index ca3380287..5ffb55aba 100644 --- a/src/main/java/emu/grasscutter/utils/JsonAdapters.java +++ b/src/main/java/emu/grasscutter/utils/JsonAdapters.java @@ -19,6 +19,10 @@ import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import lombok.val; +import static com.google.gson.stream.JsonToken.BEGIN_ARRAY; +import static com.google.gson.stream.JsonToken.BEGIN_OBJECT; +import static emu.grasscutter.utils.JsonUtils.gson; + public class JsonAdapters { static class DynamicFloatAdapter extends TypeAdapter { @Override @@ -28,6 +32,8 @@ public class JsonAdapters { return new DynamicFloat(reader.nextString()); case NUMBER: return new DynamicFloat((float) reader.nextDouble()); + case BOOLEAN: + return new DynamicFloat(reader.nextBoolean()); case BEGIN_ARRAY: reader.beginArray(); val opStack = new ArrayList(); @@ -35,6 +41,7 @@ public class JsonAdapters { opStack.add(switch (reader.peek()) { case STRING -> new DynamicFloat.StackOp(reader.nextString()); case NUMBER -> new DynamicFloat.StackOp((float) reader.nextDouble()); + case BOOLEAN -> new DynamicFloat.StackOp(reader.nextBoolean()); default -> throw new IOException("Invalid DynamicFloat definition - " + reader.peek().name()); }); } @@ -122,7 +129,7 @@ public class JsonAdapters { public TypeAdapter create(Gson gson, TypeToken type) { Class enumClass = (Class) type.getRawType(); if (!enumClass.isEnum()) return null; - + // Make mappings of (string) names to enum constants val map = new HashMap(); val enumConstants = enumClass.getEnumConstants();