Skip to content

Commit 840b409

Browse files
committed
Add pet numbers
1 parent 2557516 commit 840b409

File tree

3 files changed

+99
-0
lines changed

3 files changed

+99
-0
lines changed

src/main/java/io/github/moulberry/repo/NEUConstants.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.google.gson.JsonObject;
55
import com.google.gson.reflect.TypeToken;
66
import io.github.moulberry.repo.constants.*;
7+
import io.github.moulberry.repo.data.Rarity;
8+
import io.github.moulberry.repo.util.PetId;
79
import lombok.Getter;
810

911
import java.util.List;
@@ -26,6 +28,8 @@ public class NEUConstants implements IReloadable {
2628
Leveling leveling;
2729
@Getter
2830
PetLevelingData petLevelingData;
31+
@Getter
32+
Map<@PetId String, Map<Rarity, PetNumbers>> petNumbers;
2933

3034
public void reload(NEURepository repository) throws NEURepositoryException {
3135
bonuses = repository.requireFile("constants/bonuses.json").json(Bonuses.class);
@@ -39,6 +43,8 @@ public void reload(NEURepository repository) throws NEURepositoryException {
3943
misc = repository.requireFile("constants/misc.json").json(Misc.class);
4044
leveling = repository.requireFile("constants/leveling.json").json(Leveling.class);
4145
petLevelingData = repository.requireFile("constants/pets.json").json(PetLevelingData.class);
46+
petNumbers = repository.requireFile("constants/petnums.json").json(new TypeToken<Map<@PetId String, Map<Rarity, PetNumbers>>>() {
47+
});
4248
}
4349

4450

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package io.github.moulberry.repo.constants;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import lombok.ToString;
8+
import org.jetbrains.annotations.ApiStatus;
9+
import org.jetbrains.annotations.Nullable;
10+
11+
import java.util.*;
12+
13+
@Getter
14+
public class PetNumbers {
15+
/**
16+
* Stats at the {@link #getLowLevel()} of this curve.
17+
*/
18+
@SerializedName("1")
19+
Stats statsAtLowLevel;
20+
/**
21+
* Stats at the {@link #getHighLevel()} of this curve.
22+
*/
23+
@SerializedName("100")
24+
Stats statsAtHighLevel;
25+
@SerializedName("stats_levelling_curve")
26+
@ApiStatus.Obsolete
27+
String levelingCurve;
28+
private transient int minLevel, maxLevel;
29+
30+
/**
31+
* The first level at which this pet has stats.
32+
*/
33+
public int getLowLevel() {
34+
if (minLevel > 0) return minLevel;
35+
if (levelingCurve == null)
36+
return 1;
37+
String[] split = levelingCurve.split(":");
38+
assert split.length == 3;
39+
assert Objects.equals(split[2], "1");
40+
return minLevel = Integer.parseInt(split[0]);
41+
}
42+
43+
/**
44+
* The last level at which this pet has stats.
45+
*/
46+
public int getHighLevel() {
47+
if (maxLevel > 0) return maxLevel;
48+
if (levelingCurve == null)
49+
return 100;
50+
String[] split = levelingCurve.split(":");
51+
assert split.length == 3;
52+
assert Objects.equals(split[2], "1");
53+
return maxLevel = Integer.parseInt(split[1]);
54+
}
55+
56+
@Nullable
57+
public Stats interpolatedStatsAtLevel(int level) {
58+
if (level < getLowLevel()) return null;
59+
if (level > getHighLevel()) return null;
60+
double progress = (level - getLowLevel()) / (double) (getHighLevel() - getLowLevel());
61+
62+
Stats stats = new Stats();
63+
for (String stat : getStatsAtLowLevel().statNumbers.keySet()) {
64+
Double lowStat = getStatsAtLowLevel().getStatNumbers().get(stat);
65+
Double highStat = getStatsAtHighLevel().getStatNumbers().get(stat);
66+
stats.getStatNumbers().put(stat, lowStat + (highStat - lowStat) * progress);
67+
}
68+
Iterator<Double> lowStatIt = getStatsAtLowLevel().getOtherNumbers().iterator();
69+
Iterator<Double> highStatIt = getStatsAtHighLevel().getOtherNumbers().iterator();
70+
while (lowStatIt.hasNext() && highStatIt.hasNext()) {
71+
Double lowStat = lowStatIt.next();
72+
Double highStat = highStatIt.next();
73+
stats.getOtherNumbers().add(lowStat + (highStat - lowStat) * progress);
74+
}
75+
return stats;
76+
}
77+
78+
@Getter
79+
@AllArgsConstructor
80+
@ToString
81+
@NoArgsConstructor
82+
public static class Stats {
83+
@SerializedName("otherNums")
84+
List<Double> otherNumbers = new ArrayList<>();
85+
@SerializedName("statNums")
86+
Map<String, Double> statNumbers = new HashMap<>();
87+
}
88+
89+
90+
}

src/test/java/TestMain.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.github.moulberry.repo.data.NEUForgeRecipe;
66
import io.github.moulberry.repo.data.NEUMobDropRecipe;
77
import io.github.moulberry.repo.data.NEUUnknownRecipe;
8+
import io.github.moulberry.repo.data.Rarity;
89

910
import java.nio.file.Paths;
1011
import java.util.stream.Collectors;
@@ -24,6 +25,8 @@ public static void main(String[] args) throws NEURepositoryException {
2425
.map(NEUUnknownRecipe::getType)
2526
.collect(Collectors.toSet()));
2627
System.out.println("pet exp type for ROCK: " + repository.getConstants().getPetLevelingData().getPetExpTypes().get("ROCK"));
28+
System.out.println("stats of level 1 legendary sheep " + repository.getConstants().getPetNumbers().get("SHEEP").get(Rarity.LEGENDARY).interpolatedStatsAtLevel(1));
29+
System.out.println("stats of level 150 golden dragon " + repository.getConstants().getPetNumbers().get("GOLDEN_DRAGON").get(Rarity.LEGENDARY).interpolatedStatsAtLevel(150));
2730
System.out.println("max level of golden dragon: " + repository.getConstants().getPetLevelingData().getPetLevelingBehaviourOverrides().get("GOLDEN_DRAGON").getMaxLevel());
2831
System.out.println("amount of people with rainbow names: " + repository.getConstants().getMisc().getRainbowNames().size());
2932
System.out.println("display name for dynamic zone: " + repository.getConstants().getMisc().getAreaNames().get("dynamic"));

0 commit comments

Comments
 (0)