mirror of
https://github.com/Melledy/Nebula.git
synced 2025-12-16 14:24:57 +01:00
107 lines
3.2 KiB
Java
107 lines
3.2 KiB
Java
package emu.nebula.data.resources;
|
|
|
|
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;
|
|
|
|
@Getter
|
|
@ResourceType(name = "CharGemSlotControl.json")
|
|
public class CharGemSlotControlDef extends BaseDef {
|
|
private int Id;
|
|
private int Position;
|
|
private int MaxAlterNum;
|
|
private int UnlockLevel;
|
|
|
|
private int GeneratenCostQty;
|
|
private int RefreshCostQty;
|
|
|
|
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;
|
|
}
|
|
|
|
public IntList generateAttributes() {
|
|
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 && this.shouldAddUniqueAttr()) {
|
|
var group = GameData.getCharGemAttrGroupDataTable().get(this.UniqueAttrGroupId);
|
|
int num = group.getRandomUniqueAttrNum();
|
|
|
|
for (int i = 0; i < num; i++) {
|
|
var attributeType = group.getRandomAttributeType(list);
|
|
list.add(attributeType.getRandomValue());
|
|
}
|
|
|
|
if (list.getValueCount() >= this.MaxAlterNum) {
|
|
return list;
|
|
}
|
|
}
|
|
|
|
// Get random attributes
|
|
var random = new WeightedList<CharGemAttrGroupDef>();
|
|
|
|
for (var groupId : this.AttrGroupId) {
|
|
var group = GameData.getCharGemAttrGroupDataTable().get(groupId);
|
|
if (group == null || group.getWeight() == 0) {
|
|
continue;
|
|
}
|
|
|
|
random.add(group.getWeight(), group);
|
|
}
|
|
|
|
// Add up to 4 attributes
|
|
while (list.getValueCount() < this.MaxAlterNum) {
|
|
var group = random.next();
|
|
var attributeType = group.getRandomAttributeType(list);
|
|
list.add(attributeType.getRandomValue());
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
}
|
|
}
|