From aad9a5da894e425c9d97e821a21c41e3bce24458 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Fri, 14 Nov 2025 18:41:19 -0800 Subject: [PATCH] Vampire survivor now rewards the correct fate cards --- src/main/java/emu/nebula/data/GameData.java | 5 ++- .../nebula/data/resources/FateCardDef.java | 5 +++ .../StarTowerBookFateCardBundleDef.java | 30 +++++++++++++++ .../resources/StarTowerBookFateCardDef.java | 38 +++++++++++++++++++ .../data/resources/VampireSurvivorDef.java | 1 + .../game/vampire/VampireSurvivorGame.java | 29 +++++++++++--- 6 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 src/main/java/emu/nebula/data/resources/StarTowerBookFateCardBundleDef.java create mode 100644 src/main/java/emu/nebula/data/resources/StarTowerBookFateCardDef.java diff --git a/src/main/java/emu/nebula/data/GameData.java b/src/main/java/emu/nebula/data/GameData.java index ea5eed6..3ed8603 100644 --- a/src/main/java/emu/nebula/data/GameData.java +++ b/src/main/java/emu/nebula/data/GameData.java @@ -93,12 +93,15 @@ public class GameData { @Getter private static DataTable PotentialDataTable = new DataTable<>(); @Getter private static DataTable SubNoteSkillPromoteGroupDataTable = new DataTable<>(); + @Getter private static DataTable StarTowerBookFateCardBundleDataTable = new DataTable<>(); + @Getter private static DataTable StarTowerBookFateCardDataTable = new DataTable<>(); + @Getter private static DataTable FateCardDataTable = new DataTable<>(); + // Infinity Tower @Getter private static DataTable InfinityTowerLevelDataTable = new DataTable<>(); // Vampire survivor @Getter private static DataTable VampireSurvivorDataTable = new DataTable<>(); - @Getter private static DataTable FateCardDataTable = new DataTable<>(); // Score boss @Getter private static DataTable ScoreBossControlDataTable = new DataTable<>(); diff --git a/src/main/java/emu/nebula/data/resources/FateCardDef.java b/src/main/java/emu/nebula/data/resources/FateCardDef.java index 1d789fb..9ab0a47 100644 --- a/src/main/java/emu/nebula/data/resources/FateCardDef.java +++ b/src/main/java/emu/nebula/data/resources/FateCardDef.java @@ -2,7 +2,9 @@ package emu.nebula.data.resources; import emu.nebula.data.BaseDef; import emu.nebula.data.ResourceType; +import lombok.AccessLevel; import lombok.Getter; +import lombok.Setter; @Getter @ResourceType(name = "FateCard.json") @@ -14,6 +16,9 @@ public class FateCardDef extends BaseDef { private boolean IsVampireSpecial; private boolean Removable; + @Setter(AccessLevel.PROTECTED) + private transient int bundleId; + @Override public int getId() { return Id; diff --git a/src/main/java/emu/nebula/data/resources/StarTowerBookFateCardBundleDef.java b/src/main/java/emu/nebula/data/resources/StarTowerBookFateCardBundleDef.java new file mode 100644 index 0000000..3a87adb --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/StarTowerBookFateCardBundleDef.java @@ -0,0 +1,30 @@ +package emu.nebula.data.resources; + +import java.util.List; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.ResourceType; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import lombok.Getter; + +@Getter +@ResourceType(name = "StarTowerBookFateCardBundle.json") +public class StarTowerBookFateCardBundleDef extends BaseDef { + private int Id; + private int BundleId; + + private transient List cards; + + public StarTowerBookFateCardBundleDef() { + this.cards = new ObjectArrayList<>(); + } + + @Override + public int getId() { + return Id; + } + + protected void addCard(FateCardDef card) { + this.getCards().add(card); + } +} diff --git a/src/main/java/emu/nebula/data/resources/StarTowerBookFateCardDef.java b/src/main/java/emu/nebula/data/resources/StarTowerBookFateCardDef.java new file mode 100644 index 0000000..e885f5d --- /dev/null +++ b/src/main/java/emu/nebula/data/resources/StarTowerBookFateCardDef.java @@ -0,0 +1,38 @@ +package emu.nebula.data.resources; + +import emu.nebula.data.BaseDef; +import emu.nebula.data.GameData; +import emu.nebula.data.ResourceType; +import emu.nebula.data.ResourceType.LoadPriority; +import lombok.Getter; + +@Getter +@ResourceType(name = "StarTowerBookFateCard.json", loadPriority = LoadPriority.LOW) +public class StarTowerBookFateCardDef extends BaseDef { + private int Id; + private int BundleId; + + @Override + public int getId() { + return Id; + } + + @Override + public void onLoad() { + // Set card bundle id + var card = GameData.getFateCardDataTable().get(this.getId()); + if (card == null) { + return; + } + + card.setBundleId(this.BundleId); + + // Add to bundle + var bundle = GameData.getStarTowerBookFateCardBundleDataTable().get(this.getBundleId()); + if (bundle == null) { + return; + } + + bundle.addCard(card); + } +} diff --git a/src/main/java/emu/nebula/data/resources/VampireSurvivorDef.java b/src/main/java/emu/nebula/data/resources/VampireSurvivorDef.java index 614fd67..4009dc4 100644 --- a/src/main/java/emu/nebula/data/resources/VampireSurvivorDef.java +++ b/src/main/java/emu/nebula/data/resources/VampireSurvivorDef.java @@ -10,6 +10,7 @@ public class VampireSurvivorDef extends BaseDef { private int Id; private int Mode; private int NeedWorldClass; + private int[] FateCardBundle; @Override public int getId() { diff --git a/src/main/java/emu/nebula/game/vampire/VampireSurvivorGame.java b/src/main/java/emu/nebula/game/vampire/VampireSurvivorGame.java index 0125be1..6c889fa 100644 --- a/src/main/java/emu/nebula/game/vampire/VampireSurvivorGame.java +++ b/src/main/java/emu/nebula/game/vampire/VampireSurvivorGame.java @@ -1,6 +1,9 @@ package emu.nebula.game.vampire; +import java.util.Set; + import emu.nebula.data.GameData; +import emu.nebula.data.resources.FateCardDef; import emu.nebula.data.resources.VampireSurvivorDef; import emu.nebula.proto.Public.CardInfo; import emu.nebula.proto.Public.VampireSurvivorLevelReward; @@ -9,6 +12,7 @@ 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.ints.IntSet; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import lombok.Getter; @Getter @@ -23,6 +27,9 @@ public class VampireSurvivorGame { private int rewardLevel; private IntList rewards; + // Cache + private Set randomCards; + public VampireSurvivorGame(VampireSurvivorManager manager, VampireSurvivorDef data, long[] builds) { this.manager = manager; this.data = data; @@ -31,6 +38,10 @@ public class VampireSurvivorGame { this.cards = new IntOpenHashSet(); this.rewards = new IntArrayList(); + // Cache fate cards from bundles + this.cacheRandomCards(); + + // Calculate next rewards this.calcRewards(); } @@ -38,15 +49,23 @@ public class VampireSurvivorGame { return this.getData().getId(); } - private WeightedList getRandom() { - var random = new WeightedList(); + private void cacheRandomCards() { + this.randomCards = new ObjectOpenHashSet<>(); - for (var card : GameData.getFateCardDataTable()) { - // Filter only vampire surv cards - if (!card.isIsVampire()) { + for (int id : this.getData().getFateCardBundle()) { + var bundle = GameData.getStarTowerBookFateCardBundleDataTable().get(id); + if (bundle == null) { continue; } + this.getRandomCards().addAll(bundle.getCards()); + } + } + + private WeightedList getRandom() { + var random = new WeightedList(); + + for (var card : this.getRandomCards()) { // Skip cards we already have if (this.getCards().contains(card.getId())) { continue;