diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index 9b6e8cc..a42382a 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -32,7 +32,6 @@ public class GameData { @Getter private static DataTable CharGemDataTable = new DataTable<>(); @Getter private static DataTable CharGemSlotControlDataTable = new DataTable<>(); @Getter private static DataTable CharGemAttrGroupDataTable = new DataTable<>(); - @Getter private static DataTable CharGemAttrTypeDataTable = new DataTable<>(); @Getter private static DataTable CharGemAttrValueDataTable = new DataTable<>(); // Character affinity diff --git a/src/main/java/emu/nebula/data/ResourceLoader.java b/src/main/java/emu/nebula/data/ResourceLoader.java index a21a197..3f3243c 100644 --- a/src/main/java/emu/nebula/data/ResourceLoader.java +++ b/src/main/java/emu/nebula/data/ResourceLoader.java @@ -1,5 +1,6 @@ package emu.nebula.data; +import java.io.InputStreamReader; import java.lang.reflect.Field; import java.util.List; import java.util.stream.Collectors; @@ -54,9 +55,26 @@ public class ResourceLoader { int count = 0; try { - var json = JsonUtils.loadToMap(Nebula.getConfig().resourceDir + "/bin/" + type.name(), String.class, resourceClass); + // Init defs collection + Iterable defs = null; + + // Load resource file + if (type.useInternal()) { + // Load from internal resources in jar + try (var in = ResourceLoader.class.getResourceAsStream("/defs/" + type.name()); var reader = new InputStreamReader(in)) { + defs = JsonUtils.loadToList(reader, resourceClass); + } catch (Exception e) { + // Ignored + } + } else { + // Load json from ./resources/bin/ folder + var json = JsonUtils.loadToMap(Nebula.getConfig().resourceDir + "/bin/" + type.name(), String.class, resourceClass); + + // Get json values + defs = json.values(); + } - for (Object o : json.values()) { + for (Object o : defs) { BaseDef res = (BaseDef) o; if (res == null) { diff --git a/src/main/java/emu/nebula/data/ResourceType.java b/src/main/java/emu/nebula/data/ResourceType.java index 30c49a8..eea9711 100644 --- a/src/main/java/emu/nebula/data/ResourceType.java +++ b/src/main/java/emu/nebula/data/ResourceType.java @@ -10,13 +10,15 @@ public @interface ResourceType { String name(); /** - * Load priority - dictates which order to load this resource, with "highest" - * being loaded first + * Load priority - dictates which order to load this resource, with "highest" being loaded first */ LoadPriority loadPriority() default LoadPriority.NORMAL; - Class keyType() default int.class; - + /** + * Loads the resource file from inside the jar (./resources/defs/) if set to true + */ + boolean useInternal() default false; + public enum LoadPriority { HIGHEST(4), HIGH(3), NORMAL(2), LOW(1), LOWEST(0); diff --git a/src/main/java/emu/nebula/data/resources/CharGemAttrGroupDef.java b/src/main/java/emu/nebula/data/resources/CharGemAttrGroupDef.java index 6355436..baad3c6 100644 --- a/src/main/java/emu/nebula/data/resources/CharGemAttrGroupDef.java +++ b/src/main/java/emu/nebula/data/resources/CharGemAttrGroupDef.java @@ -1,32 +1,36 @@ package emu.nebula.data.resources; import java.util.List; +import java.util.Map; import emu.nebula.data.BaseDef; import emu.nebula.data.GameData; import emu.nebula.data.ResourceType; -import emu.nebula.data.ResourceType.LoadPriority; -import emu.nebula.util.JsonUtils; import emu.nebula.util.WeightedList; +import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.Getter; @Getter -@ResourceType(name = "CharGemAttrGroup.json", loadPriority = LoadPriority.HIGH) +@ResourceType(name = "CharGemAttrGroups.json", useInternal = true) public class CharGemAttrGroupDef extends BaseDef { - private int GroupId; - private int GroupType; + private int Id; private int Weight; - private String UniqueAttrNumWeight; + private IntArrayList AttrTypes; + private Map UniqueAttrNumWeights; private transient WeightedList uniqueAttrNum; - private transient List attributeTypes; + private transient List attributeTypes; + + public CharGemAttrGroupDef() { + this.AttrTypes = new IntArrayList(); + } @Override public int getId() { - return GroupId; + return Id; } public int getRandomUniqueAttrNum() { @@ -37,7 +41,7 @@ public class CharGemAttrGroupDef extends BaseDef { return this.uniqueAttrNum.next(); } - public CharGemAttrTypeDef getRandomAttributeType(IntList list) { + public CharGemAttrTypeData getRandomAttributeType(IntList list) { // Setup blacklist to prevent the same attribute from showing up twice var blacklist = new IntOpenHashSet(); @@ -50,7 +54,7 @@ public class CharGemAttrGroupDef extends BaseDef { } // Create random generator - var random = new WeightedList(); + var random = new WeightedList(); for (var type : this.getAttributeTypes()) { if (blacklist.contains(type.getId())) { @@ -65,15 +69,44 @@ public class CharGemAttrGroupDef extends BaseDef { @Override public void onLoad() { + // Init unique attribute weights this.uniqueAttrNum = new WeightedList<>(); - this.attributeTypes = new ObjectArrayList<>(); - if (this.UniqueAttrNumWeight != null) { - var json = JsonUtils.decodeMap(this.UniqueAttrNumWeight, Integer.class, Integer.class); - - for (var entry : json.entrySet()) { + if (this.UniqueAttrNumWeights != null) { + for (var entry : this.UniqueAttrNumWeights.entrySet()) { this.uniqueAttrNum.add(entry.getValue(), entry.getKey()); } } + + // Init attribute types + this.attributeTypes = new ObjectArrayList<>(); + + for (int id : this.getAttrTypes()) { + var type = new CharGemAttrTypeData(id); + this.attributeTypes.add(type); + } + } + + @Getter + public static class CharGemAttrTypeData { + private int id; + private WeightedList values; + + public CharGemAttrTypeData(int id) { + this.id = id; + this.values = new WeightedList<>(); + } + + protected void addValue(CharGemAttrValueDef value) { + this.values.add(value.getRarity(), value); + } + + public CharGemAttrValueDef getRandomValueData() { + return this.getValues().next(); + } + + public int getRandomValue() { + return this.getRandomValueData().getId(); + } } } diff --git a/src/main/java/emu/nebula/data/resources/CharGemAttrTypeDef.java b/src/main/java/emu/nebula/data/resources/CharGemAttrTypeDef.java deleted file mode 100644 index a2a9bbe..0000000 --- a/src/main/java/emu/nebula/data/resources/CharGemAttrTypeDef.java +++ /dev/null @@ -1,39 +0,0 @@ -package emu.nebula.data.resources; - -import emu.nebula.data.BaseDef; -import emu.nebula.data.GameData; -import emu.nebula.data.ResourceType; -import emu.nebula.util.WeightedList; -import lombok.Getter; - -@Getter -@ResourceType(name = "CharGemAttrType.json") -public class CharGemAttrTypeDef extends BaseDef { - private int Id; - private int GroupId; - - private transient WeightedList values; - - @Override - public int getId() { - return Id; - } - - public CharGemAttrValueDef getRandomValueData() { - return this.getValues().next(); - } - - public int getRandomValue() { - return this.getRandomValueData().getId(); - } - - @Override - public void onLoad() { - this.values = new WeightedList<>(); - - var data = GameData.getCharGemAttrGroupDataTable().get(this.GroupId); - if (data != null) { - data.getAttributeTypes().add(this); - } - } -} diff --git a/src/main/java/emu/nebula/data/resources/CharGemAttrValueDef.java b/src/main/java/emu/nebula/data/resources/CharGemAttrValueDef.java index 83c65c5..08e2aa7 100644 --- a/src/main/java/emu/nebula/data/resources/CharGemAttrValueDef.java +++ b/src/main/java/emu/nebula/data/resources/CharGemAttrValueDef.java @@ -12,8 +12,6 @@ public class CharGemAttrValueDef extends BaseDef { private int Id; private int TypeId; private int AttrType; - private int AttrTypeFirstSubtype; - private int AttrTypeSecondSubtype; private int Rarity; @Override @@ -23,9 +21,18 @@ public class CharGemAttrValueDef extends BaseDef { @Override public void onLoad() { - var data = GameData.getCharGemAttrTypeDataTable().get(this.TypeId); - if (data != null) { - data.getValues().add(this.getRarity(), this); + // Cache attribute values into attribute group defs + // Honestly a horrible/inefficient way of doing this + for (var data : GameData.getCharGemAttrGroupDataTable()) { + for (var type : data.getAttributeTypes()) { + // Skip if type id doesnt match + if (type.getId() != this.getTypeId()) { + continue; + } + + // Add + type.addValue(this); + } } } } diff --git a/src/main/java/emu/nebula/data/resources/CharGemSlotControlDef.java b/src/main/java/emu/nebula/data/resources/CharGemSlotControlDef.java index 563fbb8..a5074a0 100644 --- a/src/main/java/emu/nebula/data/resources/CharGemSlotControlDef.java +++ b/src/main/java/emu/nebula/data/resources/CharGemSlotControlDef.java @@ -4,6 +4,7 @@ import emu.nebula.data.BaseDef; import emu.nebula.data.GameData; import emu.nebula.data.ResourceType; import emu.nebula.util.CustomIntArray; +import emu.nebula.util.Utils; import emu.nebula.util.WeightedList; import it.unimi.dsi.fastutil.ints.IntList; import lombok.Getter; @@ -19,16 +20,15 @@ public class CharGemSlotControlDef extends BaseDef { private int GeneratenCostQty; private int RefreshCostQty; - private int UniqueAttrGroupProb; - private int UniqueAttrGroupId; - private int GuaranteeCount; - - private int[] AttrGroupId; - private int LockableNum; private int LockItemTid; private int LockItemQty; + // These have to be hardcoded now + private transient int UniqueAttrGroupProb; + private transient int UniqueAttrGroupId; + private transient int[] AttrGroupId; + @Override public int getId() { return Id; @@ -38,9 +38,15 @@ public class CharGemSlotControlDef extends BaseDef { return this.generateAttributes(new CustomIntArray()); } + // Check if we should add unique attributes based on the probablity + private boolean shouldAddUniqueAttr() { + int random = Utils.randomRange(1, 10000); + return random <= this.UniqueAttrGroupProb; + } + public IntList generateAttributes(CustomIntArray list) { // Add unique attributes - if (this.UniqueAttrGroupId > 0) { + if (this.UniqueAttrGroupId > 0 && this.shouldAddUniqueAttr()) { var group = GameData.getCharGemAttrGroupDataTable().get(this.UniqueAttrGroupId); int num = group.getRandomUniqueAttrNum(); @@ -76,4 +82,25 @@ public class CharGemSlotControlDef extends BaseDef { // Complete return list; } + + @Override + public void onLoad() { + // Hard coded values + switch (this.Id) { + case 3: + this.UniqueAttrGroupProb = 3300; + this.UniqueAttrGroupId = 12; + this.AttrGroupId = new int[] {9, 10}; + break; + case 2: + this.UniqueAttrGroupProb = 4000; + this.UniqueAttrGroupId = 11; + this.AttrGroupId = new int[] {5, 6, 7, 8}; + break; + case 1: + default: + this.AttrGroupId = new int[] {1, 2, 3, 4}; + break; + } + } } diff --git a/src/main/java/emu/nebula/data/resources/StarTowerFloorExpDef.java b/src/main/java/emu/nebula/data/resources/StarTowerFloorExpDef.java index fb5c36e..3e81029 100644 --- a/src/main/java/emu/nebula/data/resources/StarTowerFloorExpDef.java +++ b/src/main/java/emu/nebula/data/resources/StarTowerFloorExpDef.java @@ -7,7 +7,6 @@ import lombok.Getter; @Getter @ResourceType(name = "StarTowerFloorExp.json") public class StarTowerFloorExpDef extends BaseDef { - private int Id; private int StarTowerId; private int Stage; private int NormalExp; diff --git a/src/main/resources/defs/CharGemAttrGroups.json b/src/main/resources/defs/CharGemAttrGroups.json new file mode 100644 index 0000000..7c03305 --- /dev/null +++ b/src/main/resources/defs/CharGemAttrGroups.json @@ -0,0 +1,198 @@ +[ + { + "Id": 5, + "Weight": 3000, + "AttrTypes": [ + 60, + 61, + 62, + 63, + 64, + 65 + ] + }, + { + "Id": 7, + "Weight": 3435, + "AttrTypes": [ + 66, + 68, + 69, + 70, + 71, + 72, + 73, + 80, + 81, + 82, + 83, + 84, + 85 + ] + }, + { + "Id": 3, + "Weight": 3435, + "AttrTypes": [ + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 21, + 22, + 23, + 24, + 25, + 26 + ] + }, + { + "Id": 1, + "Weight": 3000, + "AttrTypes": [ + 1, + 2, + 3, + 4, + 5, + 6 + ] + }, + { + "Id": 10, + "Weight": 4883, + "AttrTypes": [ + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112 + ] + }, + { + "Id": 11, + "Weight": 0, + "AttrTypes": [ + 35, + 36, + 37, + 38 + ], + "UniqueAttrNumWeights": { + "1": 7500, + "2": 2000, + "3": 450, + "4": 50 + } + }, + { + "Id": 9, + "Weight": 5117, + "AttrTypes": [ + 94, + 95, + 96, + 97, + 98, + 99 + ] + }, + { + "Id": 8, + "Weight": 800, + "AttrTypes": [ + 67, + 74, + 75, + 76, + 77, + 78, + 79, + 86, + 87 + ] + }, + { + "Id": 12, + "Weight": 0, + "AttrTypes": [ + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59 + ], + "UniqueAttrNumWeights": { + "1": 6700, + "2": 2650, + "3": 500, + "4": 150 + } + }, + { + "Id": 4, + "Weight": 800, + "AttrTypes": [ + 8, + 15, + 16, + 17, + 18, + 19, + 20, + 27, + 28 + ] + }, + { + "Id": 6, + "Weight": 2765, + "AttrTypes": [ + 88, + 89, + 90, + 91, + 92, + 93 + ] + }, + { + "Id": 2, + "Weight": 2765, + "AttrTypes": [ + 29, + 30, + 31, + 32, + 33, + 34 + ] + } +] \ No newline at end of file