Implement gacha banners (not newbie)

This commit is contained in:
Melledy
2025-11-01 04:17:44 -07:00
parent e9f991355a
commit 37b74c9b35
20 changed files with 697 additions and 40 deletions
@@ -50,6 +50,9 @@ public class GameData {
@Getter private static DataTable<CharGemInstanceDef> CharGemInstanceDataTable = new DataTable<>();
@Getter private static DataTable<WeekBossLevelDef> WeekBossLevelDataTable = new DataTable<>();
@Getter private static DataTable<GachaDef> GachaDataTable = new DataTable<>();
@Getter private static DataTable<GachaStorageDef> GachaStorageDataTable = new DataTable<>();
@Getter private static DataTable<WorldClassDef> WorldClassDataTable = new DataTable<>();
@Getter private static DataTable<GuideGroupDef> GuideGroupDataTable = new DataTable<>();
@Getter private static DataTable<HandbookDef> HandbookDataTable = new DataTable<>();
@@ -0,0 +1,113 @@
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 = "Gacha.json")
public class GachaDef extends BaseDef {
private int Id;
private int StorageId;
private int GachaType;
private int GuaranteeTimes;
private int GuaranteeTid;
private int GuaranteeQty;
// Packages
private int ATypePkg;
private int BTypePkg;
private int CTypePkg;
private int ATypeUpPkg;
private int BTypeUpPkg;
private int CTypeUpPkg;
private int BGuaranteePkg;
private transient WeightedList<GachaPackage> packageA;
private transient WeightedList<GachaPackage> packageB;
private transient WeightedList<GachaPackage> packageC;
@Override
public int getId() {
return Id;
}
public GachaStorageDef getStorageData() {
return GameData.getGachaStorageDataTable().get(this.getStorageId());
}
@Override
public void onLoad() {
// Get storage
var storage = this.getStorageData();
// Package A
this.packageA = new WeightedList<GachaPackage>();
if (this.ATypePkg > 0) {
packageA.add(
10000 - storage.getATypeUpProb(),
new GachaPackage(GachaPackageType.A, this.ATypePkg)
);
} if (this.ATypeUpPkg > 0) {
packageA.add(
storage.getATypeUpProb(),
new GachaPackage(GachaPackageType.A_UP, this.ATypeUpPkg)
);
}
// Package B
this.packageB = new WeightedList<GachaPackage>();
if (this.BTypePkg > 0) {
packageB.add(
10000 - storage.getBTypeUpProb(),
new GachaPackage(GachaPackageType.B, this.BTypePkg)
);
} else if (this.BGuaranteePkg > 0) {
packageB.add(
10000 - storage.getBTypeUpProb(),
new GachaPackage(GachaPackageType.B, this.BGuaranteePkg)
);
} if (this.BTypeUpPkg > 0) {
packageB.add(
storage.getBTypeUpProb(),
new GachaPackage(GachaPackageType.B_UP, this.BTypeUpPkg)
);
}
// Package C
this.packageC = new WeightedList<GachaPackage>();
if (this.CTypePkg > 0) {
packageC.add(
10000,
new GachaPackage(GachaPackageType.C, this.CTypePkg)
);
}
}
@Getter
public static class GachaPackage {
private GachaPackageType type;
private int id;
public GachaPackage(GachaPackageType type, int id) {
this.type = type;
this.id = id;
}
}
public enum GachaPackageType {
A,
A_UP,
B,
B_UP,
C;
}
}
@@ -0,0 +1,35 @@
package emu.nebula.data.resources;
import emu.nebula.data.BaseDef;
import emu.nebula.data.ResourceType;
import emu.nebula.data.ResourceType.LoadPriority;
import emu.nebula.util.WeightedList;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import lombok.Getter;
@Getter
@ResourceType(name = "GachaPkg.json", loadPriority = LoadPriority.LOW)
public class GachaPkgDef extends BaseDef {
private int PkgId;
private int GoodsId;
private int Weight;
private static final Int2ObjectMap<WeightedList<Integer>> packages = new Int2ObjectOpenHashMap<>();
@Override @Deprecated
public int getId() {
return PkgId;
}
public static WeightedList<Integer> getPackageById(int packageId) {
return packages.get(packageId);
}
@Override
public void onLoad() {
// Add to package
var list = packages.computeIfAbsent(this.getPkgId(), i -> new WeightedList<Integer>());
list.add(this.getWeight(), this.getGoodsId());
}
}
@@ -0,0 +1,26 @@
package emu.nebula.data.resources;
import emu.nebula.data.BaseDef;
import emu.nebula.data.ResourceType;
import emu.nebula.data.ResourceType.LoadPriority;
import lombok.Getter;
@Getter
@ResourceType(name = "GachaStorage.json", loadPriority = LoadPriority.HIGH)
public class GachaStorageDef extends BaseDef {
private int Id;
private int DefaultId;
private int DefaultQty;
private int CostId;
private int CostQty;
private int ATypeUpProb;
private int BTypeUpProb;
private int BTypeGuaranteeProb;
@Override
public int getId() {
return Id;
}
}