Basic path resonance implementation

This commit is contained in:
Melledy
2023-11-29 22:09:23 -08:00
parent 942986d5b3
commit 0db2eab1e8
7 changed files with 138 additions and 7 deletions

View File

@@ -48,6 +48,7 @@ public class GameData {
@Getter private static Int2ObjectMap<RogueRoomExcel> rogueRoomExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<RogueMapExcel> rogueMapExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<RogueMonsterExcel> rogueMonsterExcelMap = new Int2ObjectOpenHashMap<>();
private static Int2ObjectMap<RogueBuffExcel> rogueBuffExcelMap = new Int2ObjectOpenHashMap<>();
private static Int2ObjectMap<AvatarPromotionExcel> avatarPromotionExcelMap = new Int2ObjectOpenHashMap<>();
private static Int2ObjectMap<AvatarSkillTreeExcel> 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);
}
}

View File

@@ -23,6 +23,8 @@ public class GameDepot {
// Rogue
@Getter private static Int2ObjectMap<int[]> rogueMapGen = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<RogueBuffExcel> rogueAeonBuffs = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<List<RogueBuffExcel>> rogueAeonEnhanceBuffs = new Int2ObjectOpenHashMap<>();
@Getter private static List<RogueBuffExcel> rogueRandomBuffList = new ArrayList<>();
@Getter private static List<RogueMiracleExcel> rogueRandomMiracleList = new ArrayList<>();
@Getter private static List<RogueNPCExcel> rogueRandomNpcList = new ArrayList<>();

View File

@@ -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);
}
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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));