aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/github/moulberry/repo
diff options
context:
space:
mode:
authornea <nea@nea.moe>2023-06-03 18:06:26 +0200
committernea <nea@nea.moe>2023-06-03 18:06:26 +0200
commit840b4097c19ac230ee790c0b76cc8bceeed19bfa (patch)
tree53e104a0d370887b5495b9a3c417438dba45bec9 /src/main/java/io/github/moulberry/repo
parent2557516647be58a52bd292a540b74b5b83089949 (diff)
downloadneurepoparsing-840b4097c19ac230ee790c0b76cc8bceeed19bfa.tar.gz
neurepoparsing-840b4097c19ac230ee790c0b76cc8bceeed19bfa.tar.bz2
neurepoparsing-840b4097c19ac230ee790c0b76cc8bceeed19bfa.zip
Add pet numbers
Diffstat (limited to 'src/main/java/io/github/moulberry/repo')
-rw-r--r--src/main/java/io/github/moulberry/repo/NEUConstants.java6
-rw-r--r--src/main/java/io/github/moulberry/repo/constants/PetNumbers.java90
2 files changed, 96 insertions, 0 deletions
diff --git a/src/main/java/io/github/moulberry/repo/NEUConstants.java b/src/main/java/io/github/moulberry/repo/NEUConstants.java
index f0163d4..f60a2fa 100644
--- a/src/main/java/io/github/moulberry/repo/NEUConstants.java
+++ b/src/main/java/io/github/moulberry/repo/NEUConstants.java
@@ -4,6 +4,8 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import io.github.moulberry.repo.constants.*;
+import io.github.moulberry.repo.data.Rarity;
+import io.github.moulberry.repo.util.PetId;
import lombok.Getter;
import java.util.List;
@@ -26,6 +28,8 @@ public class NEUConstants implements IReloadable {
Leveling leveling;
@Getter
PetLevelingData petLevelingData;
+ @Getter
+ Map<@PetId String, Map<Rarity, PetNumbers>> petNumbers;
public void reload(NEURepository repository) throws NEURepositoryException {
bonuses = repository.requireFile("constants/bonuses.json").json(Bonuses.class);
@@ -39,6 +43,8 @@ public class NEUConstants implements IReloadable {
misc = repository.requireFile("constants/misc.json").json(Misc.class);
leveling = repository.requireFile("constants/leveling.json").json(Leveling.class);
petLevelingData = repository.requireFile("constants/pets.json").json(PetLevelingData.class);
+ petNumbers = repository.requireFile("constants/petnums.json").json(new TypeToken<Map<@PetId String, Map<Rarity, PetNumbers>>>() {
+ });
}
diff --git a/src/main/java/io/github/moulberry/repo/constants/PetNumbers.java b/src/main/java/io/github/moulberry/repo/constants/PetNumbers.java
new file mode 100644
index 0000000..c9f9b5b
--- /dev/null
+++ b/src/main/java/io/github/moulberry/repo/constants/PetNumbers.java
@@ -0,0 +1,90 @@
+package io.github.moulberry.repo.constants;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.*;
+
+@Getter
+public class PetNumbers {
+ /**
+ * Stats at the {@link #getLowLevel()} of this curve.
+ */
+ @SerializedName("1")
+ Stats statsAtLowLevel;
+ /**
+ * Stats at the {@link #getHighLevel()} of this curve.
+ */
+ @SerializedName("100")
+ Stats statsAtHighLevel;
+ @SerializedName("stats_levelling_curve")
+ @ApiStatus.Obsolete
+ String levelingCurve;
+ private transient int minLevel, maxLevel;
+
+ /**
+ * The first level at which this pet has stats.
+ */
+ public int getLowLevel() {
+ if (minLevel > 0) return minLevel;
+ if (levelingCurve == null)
+ return 1;
+ String[] split = levelingCurve.split(":");
+ assert split.length == 3;
+ assert Objects.equals(split[2], "1");
+ return minLevel = Integer.parseInt(split[0]);
+ }
+
+ /**
+ * The last level at which this pet has stats.
+ */
+ public int getHighLevel() {
+ if (maxLevel > 0) return maxLevel;
+ if (levelingCurve == null)
+ return 100;
+ String[] split = levelingCurve.split(":");
+ assert split.length == 3;
+ assert Objects.equals(split[2], "1");
+ return maxLevel = Integer.parseInt(split[1]);
+ }
+
+ @Nullable
+ public Stats interpolatedStatsAtLevel(int level) {
+ if (level < getLowLevel()) return null;
+ if (level > getHighLevel()) return null;
+ double progress = (level - getLowLevel()) / (double) (getHighLevel() - getLowLevel());
+
+ Stats stats = new Stats();
+ for (String stat : getStatsAtLowLevel().statNumbers.keySet()) {
+ Double lowStat = getStatsAtLowLevel().getStatNumbers().get(stat);
+ Double highStat = getStatsAtHighLevel().getStatNumbers().get(stat);
+ stats.getStatNumbers().put(stat, lowStat + (highStat - lowStat) * progress);
+ }
+ Iterator<Double> lowStatIt = getStatsAtLowLevel().getOtherNumbers().iterator();
+ Iterator<Double> highStatIt = getStatsAtHighLevel().getOtherNumbers().iterator();
+ while (lowStatIt.hasNext() && highStatIt.hasNext()) {
+ Double lowStat = lowStatIt.next();
+ Double highStat = highStatIt.next();
+ stats.getOtherNumbers().add(lowStat + (highStat - lowStat) * progress);
+ }
+ return stats;
+ }
+
+ @Getter
+ @AllArgsConstructor
+ @ToString
+ @NoArgsConstructor
+ public static class Stats {
+ @SerializedName("otherNums")
+ List<Double> otherNumbers = new ArrayList<>();
+ @SerializedName("statNums")
+ Map<String, Double> statNumbers = new HashMap<>();
+ }
+
+
+}