diff --git a/src/main/java/emu/lunarcore/data/GameData.java b/src/main/java/emu/lunarcore/data/GameData.java index 4d17eb2..f7fa101 100644 --- a/src/main/java/emu/lunarcore/data/GameData.java +++ b/src/main/java/emu/lunarcore/data/GameData.java @@ -48,6 +48,7 @@ public class GameData { @Getter private static Int2ObjectMap rogueRoomExcelMap = new Int2ObjectOpenHashMap<>(); @Getter private static Int2ObjectMap rogueMapExcelMap = new Int2ObjectOpenHashMap<>(); @Getter private static Int2ObjectMap rogueMonsterExcelMap = new Int2ObjectOpenHashMap<>(); + private static Int2ObjectMap rogueBuffExcelMap = new Int2ObjectOpenHashMap<>(); private static Int2ObjectMap avatarPromotionExcelMap = new Int2ObjectOpenHashMap<>(); private static Int2ObjectMap avatarSkillTreeExcelMap = new Int2ObjectOpenHashMap<>(); @@ -245,4 +246,8 @@ public class GameData { public static RogueMapExcel getRogueMapExcel(int rogueMapId, int siteId) { return rogueMapExcelMap.get((rogueMapId << 8) + siteId); } + + public static RogueBuffExcel getRogueBuffExcel(int rogueBuffId, int level) { + return rogueBuffExcelMap.get((rogueBuffId << 4) + level); + } } diff --git a/src/main/java/emu/lunarcore/data/GameDepot.java b/src/main/java/emu/lunarcore/data/GameDepot.java index fe167f2..b5b32a9 100644 --- a/src/main/java/emu/lunarcore/data/GameDepot.java +++ b/src/main/java/emu/lunarcore/data/GameDepot.java @@ -23,6 +23,8 @@ public class GameDepot { // Rogue @Getter private static Int2ObjectMap rogueMapGen = new Int2ObjectOpenHashMap<>(); + @Getter private static Int2ObjectMap rogueAeonBuffs = new Int2ObjectOpenHashMap<>(); + @Getter private static Int2ObjectMap> rogueAeonEnhanceBuffs = new Int2ObjectOpenHashMap<>(); @Getter private static List rogueRandomBuffList = new ArrayList<>(); @Getter private static List rogueRandomMiracleList = new ArrayList<>(); @Getter private static List rogueRandomNpcList = new ArrayList<>(); diff --git a/src/main/java/emu/lunarcore/data/excel/RogueBuffExcel.java b/src/main/java/emu/lunarcore/data/excel/RogueBuffExcel.java index 0b9e5a8..d2b356d 100644 --- a/src/main/java/emu/lunarcore/data/excel/RogueBuffExcel.java +++ b/src/main/java/emu/lunarcore/data/excel/RogueBuffExcel.java @@ -1,29 +1,45 @@ package emu.lunarcore.data.excel; +import java.util.ArrayList; + import emu.lunarcore.data.GameDepot; import emu.lunarcore.data.GameResource; import emu.lunarcore.data.ResourceType; - +import emu.lunarcore.data.ResourceType.LoadPriority; +import emu.lunarcore.game.enums.RogueBuffAeonType; import lombok.Getter; @Getter -@ResourceType(name = {"RogueBuff.json"}) +@ResourceType(name = {"RogueBuff.json"}, loadPriority = LoadPriority.LOW) public class RogueBuffExcel extends GameResource { private int MazeBuffID; private int MazeBuffLevel; private int RogueBuffType; private int RogueBuffRarity; private int AeonID; + private RogueBuffAeonType BattleEventBuffType = RogueBuffAeonType.Normal; @Override public int getId() { - return MazeBuffID; + return (MazeBuffID << 4) + MazeBuffLevel; + } + + public boolean isAeonBuff() { + return this.BattleEventBuffType != RogueBuffAeonType.Normal; } @Override public void onLoad() { + // Add to random buff list if (RogueBuffType >= 120 && RogueBuffType <= 126 && RogueBuffRarity >= 1 && RogueBuffRarity <= 3 && MazeBuffLevel == 1 && AeonID == 0) { GameDepot.getRogueRandomBuffList().add(this); } + + // Add to aeon buff list + if (BattleEventBuffType == RogueBuffAeonType.BattleEventBuff) { + GameDepot.getRogueAeonBuffs().put(this.getAeonID(), this); + } else if (BattleEventBuffType == RogueBuffAeonType.BattleEventBuffEnhance) { + GameDepot.getRogueAeonEnhanceBuffs().computeIfAbsent(this.getAeonID(), e -> new ArrayList<>()).add(this); + } } } diff --git a/src/main/java/emu/lunarcore/game/enums/RogueBuffAeonType.java b/src/main/java/emu/lunarcore/game/enums/RogueBuffAeonType.java new file mode 100644 index 0000000..059461c --- /dev/null +++ b/src/main/java/emu/lunarcore/game/enums/RogueBuffAeonType.java @@ -0,0 +1,17 @@ +package emu.lunarcore.game.enums; + +import lombok.Getter; + +@Getter +public enum RogueBuffAeonType { + Normal (0), + BattleEventBuff (1), + BattleEventBuffEnhance (2), + BattleEventBuffCross (3); + + private final int val; + + private RogueBuffAeonType(int value) { + this.val = value; + } +} diff --git a/src/main/java/emu/lunarcore/game/rogue/RogueBuffData.java b/src/main/java/emu/lunarcore/game/rogue/RogueBuffData.java index 995423a..e1478d4 100644 --- a/src/main/java/emu/lunarcore/game/rogue/RogueBuffData.java +++ b/src/main/java/emu/lunarcore/game/rogue/RogueBuffData.java @@ -1,5 +1,7 @@ package emu.lunarcore.game.rogue; +import emu.lunarcore.data.GameData; +import emu.lunarcore.data.excel.RogueBuffExcel; import emu.lunarcore.game.battle.MazeBuff; import emu.lunarcore.proto.RogueBuffOuterClass.RogueBuff; import lombok.Getter; @@ -9,11 +11,21 @@ public class RogueBuffData { private int id; private int level; + private transient RogueBuffExcel excel; + public RogueBuffData(int buffId, int level) { this.id = buffId; this.level = level; } + public RogueBuffExcel getExcel() { + if (this.excel == null) { + this.excel = GameData.getRogueBuffExcel(this.getId(), this.getLevel()); + } + + return this.excel; + } + public MazeBuff toMazeBuff() { return new MazeBuff(id, level, 0, 0xffffffff); } diff --git a/src/main/java/emu/lunarcore/game/rogue/RogueBuffSelectMenu.java b/src/main/java/emu/lunarcore/game/rogue/RogueBuffSelectMenu.java index 32f4ebf..5d527bc 100644 --- a/src/main/java/emu/lunarcore/game/rogue/RogueBuffSelectMenu.java +++ b/src/main/java/emu/lunarcore/game/rogue/RogueBuffSelectMenu.java @@ -25,12 +25,20 @@ public class RogueBuffSelectMenu { public RogueBuffSelectMenu() {} public RogueBuffSelectMenu(RogueInstance rogue) { + this(rogue, false); + } + + public RogueBuffSelectMenu(RogueInstance rogue, boolean generateAeonBuffs) { this.rogue = rogue; this.maxBuffs = 3; this.maxRerolls = rogue.getBaseRerolls(); this.buffs = new ArrayList<>(); - this.generateRandomBuffs(); + if (generateAeonBuffs) { + this.generateAeonBuffs(); + } else { + this.generateRandomBuffs(); + } } public void setMaxRerolls(int i) { @@ -74,6 +82,26 @@ public class RogueBuffSelectMenu { } } + private void generateAeonBuffs() { + this.getBuffs().clear(); + + var aeonBuffExcel = GameDepot.getRogueAeonBuffs().get(getRogue().getAeonId()); + if (aeonBuffExcel == null) return; + + // Check for rogue aeon buffs + if (!this.getRogue().getBuffs().containsKey(aeonBuffExcel.getMazeBuffID())) { + // We dont have the first aeon buff yet + this.getBuffs().add(new RogueBuffData(aeonBuffExcel.getMazeBuffID(), 1)); + } else { + // Add path resonances that we currently dont have + for (var aeonEnhanceExcel : GameDepot.getRogueAeonEnhanceBuffs().get(getRogue().getAeonId())) { + if (!this.getRogue().getBuffs().containsKey(aeonEnhanceExcel.getMazeBuffID())) { + this.getBuffs().add(new RogueBuffData(aeonEnhanceExcel.getMazeBuffID(), 1)); + } + } + } + } + protected void onLoad(RogueInstance rogue) { this.rogue = rogue; } diff --git a/src/main/java/emu/lunarcore/game/rogue/RogueInstance.java b/src/main/java/emu/lunarcore/game/rogue/RogueInstance.java index f4016d1..0f8ab26 100644 --- a/src/main/java/emu/lunarcore/game/rogue/RogueInstance.java +++ b/src/main/java/emu/lunarcore/game/rogue/RogueInstance.java @@ -53,6 +53,7 @@ public class RogueInstance { private int baseRerolls; private int aeonId; private int aeonBuffType; + private int maxAeonBuffs; private boolean isWin; @Deprecated // Morphia only! @@ -66,6 +67,7 @@ public class RogueInstance { this.baseAvatarIds = new HashSet<>(); this.buffs = new HashMap<>(); this.miracles = new HashMap<>(); + this.maxAeonBuffs = 4; if (aeonExcel != null) { this.aeonId = aeonExcel.getAeonID(); @@ -114,6 +116,42 @@ public class RogueInstance { return this.getRoomBySiteId(this.getCurrentSiteId()); } + private boolean shouldAddAeonBuff() { + int pathBuffs = 0; // Buffs on the current path + int aeonBuffs = 0; + + for (var b : this.getBuffs().values()) { + var excel = b.getExcel(); + if (excel == null) continue; + + if (excel.getRogueBuffType() == this.getAeonBuffType()) { + if (excel.isAeonBuff()) { + aeonBuffs++; + } else { + pathBuffs++; + } + } + } + + // Skip if we are already at max aeon buffs + if (aeonBuffs >= this.maxAeonBuffs) { + return false; + } + + switch (aeonBuffs) { + case 0: + return pathBuffs >= 3; + case 1: + return pathBuffs >= 6; + case 2: + return pathBuffs >= 10; + case 3: + return pathBuffs >= 14; + default: + return false; + } + } + public synchronized void createBuffSelect(int amount) { this.pendingBuffSelects += amount; @@ -124,9 +162,19 @@ public class RogueInstance { } public synchronized RogueBuffSelectMenu updateBuffSelect() { - if (this.pendingBuffSelects > 0 && this.getBuffSelect() == null) { - this.buffSelect = new RogueBuffSelectMenu(this); - this.pendingBuffSelects--; + if (this.getBuffSelect() == null) { + // Creates a new blessing selection menu if we have any pending buff selects + if (this.pendingBuffSelects > 0) { + // Regular blessing selection with 3 random blessings + this.buffSelect = new RogueBuffSelectMenu(this, false); + this.pendingBuffSelects--; + } else if (this.getAeonId() != 0) { + // Check if we should add aeon blessings + if (shouldAddAeonBuff()) { + this.buffSelect = new RogueBuffSelectMenu(this, true); + } + } + return this.buffSelect; } @@ -143,8 +191,10 @@ public class RogueInstance { } public synchronized RogueBuffData selectBuff(int buffId) { + // Sanity if (this.getBuffSelect() == null) return null; + // Validate buff from buff select menu RogueBuffData buff = this.getBuffSelect().getBuffs() .stream() .filter(b -> b.getId() == buffId) @@ -153,6 +203,7 @@ public class RogueInstance { if (buff == null) return null; + // Add buff this.buffSelect = null; this.getBuffs().put(buff.getId(), buff); getPlayer().sendPacket(new PacketAddRogueBuffScNotify(buff, RogueBuffSource.ROGUE_BUFF_SOURCE_TYPE_SELECT));