Implement rogue miracles (They are not scripted yet)

This commit is contained in:
Melledy
2023-10-27 11:30:18 -07:00
parent 598f097e99
commit e26ced7169
24 changed files with 4692 additions and 65 deletions

View File

@@ -18,7 +18,8 @@ public class GameDepot {
// Rogue
@Getter private static Int2ObjectMap<int[]> rogueMapGen = new Int2ObjectOpenHashMap<>();
@Getter private static List<RogueBuffExcel> rogueBuffsList = new ArrayList<>();
@Getter private static List<RogueBuffExcel> rogueRandomBuffList = new ArrayList<>();
@Getter private static List<RogueMiracleExcel> rogueRandomMiracleList = new ArrayList<>();
private static Int2ObjectMap<List<RogueMapExcel>> rogueMapDepot = new Int2ObjectOpenHashMap<>();
public static void addRelicMainAffix(RelicMainAffixExcel affix) {

View File

@@ -23,7 +23,7 @@ public class RogueBuffExcel extends GameResource {
@Override
public void onLoad() {
if (RogueBuffType >= 120 && RogueBuffType <= 126 && RogueBuffRarity >= 1 && RogueBuffRarity <= 3 && MazeBuffLevel == 1 && AeonID == 0) {
GameDepot.getRogueBuffsList().add(this);
GameDepot.getRogueRandomBuffList().add(this);
}
}
}

View File

@@ -0,0 +1,27 @@
package emu.lunarcore.data.excel;
import emu.lunarcore.data.GameDepot;
import emu.lunarcore.data.GameResource;
import emu.lunarcore.data.ResourceType;
import lombok.Getter;
@Getter
@ResourceType(name = {"RogueMiracle.json"})
public class RogueMiracleExcel extends GameResource {
private int MiracleID;
private boolean IsShow;
private int MiracleReward;
@Override
public int getId() {
return MiracleID;
}
@Override
public void onLoad() {
if (IsShow && MiracleReward > 0) {
GameDepot.getRogueRandomMiracleList().add(this);
}
}
}

View File

@@ -6,21 +6,21 @@ import lombok.Getter;
@Getter
public class RogueBuffData {
private int buffId;
private int id;
private int level;
public RogueBuffData(int buffId, int level) {
this.buffId = buffId;
this.id = buffId;
this.level = level;
}
public MazeBuff toMazeBuff() {
return new MazeBuff(buffId, level, 0, 0xffffffff);
return new MazeBuff(id, level, 0, 0xffffffff);
}
public RogueBuff toProto() {
var proto = RogueBuff.newInstance()
.setBuffId(this.getBuffId())
.setBuffId(this.getId())
.setLevel(this.getLevel());
return proto;

View File

@@ -36,7 +36,7 @@ public class RogueBuffSelectMenu {
if (this.randomBuffs == null) {
this.randomBuffs = new WeightedList<>();
for (RogueBuffExcel excel : GameDepot.getRogueBuffsList()) {
for (var excel : GameDepot.getRogueRandomBuffList()) {
if (rogue.getBuffs().containsKey(excel.getMazeBuffID())) {
continue;
}
@@ -48,7 +48,7 @@ public class RogueBuffSelectMenu {
this.getBuffs().clear();
while (this.getBuffs().size() < this.getMaxBuffs()) {
RogueBuffExcel excel = this.randomBuffs.next();
var excel = this.randomBuffs.next();
this.getBuffs().add(new RogueBuffData(excel.getMazeBuffID(), 1));
}
}

View File

@@ -13,11 +13,11 @@ import emu.lunarcore.proto.RogueBuffInfoOuterClass.RogueBuffInfo;
import emu.lunarcore.proto.RogueBuffSourceOuterClass.RogueBuffSource;
import emu.lunarcore.proto.RogueCurrentInfoOuterClass.RogueCurrentInfo;
import emu.lunarcore.proto.RogueMapInfoOuterClass.RogueMapInfo;
import emu.lunarcore.proto.RogueMiracleInfoOuterClass.RogueMiracleInfo;
import emu.lunarcore.proto.RogueMiracleSourceOuterClass.RogueMiracleSource;
import emu.lunarcore.proto.RogueRoomStatusOuterClass.RogueRoomStatus;
import emu.lunarcore.proto.RogueStatusOuterClass.RogueStatus;
import emu.lunarcore.server.packet.send.PacketAddRogueBuffScNotify;
import emu.lunarcore.server.packet.send.PacketSyncRogueBuffSelectInfoScNotify;
import emu.lunarcore.server.packet.send.PacketSyncRogueMapRoomScNotify;
import emu.lunarcore.server.packet.send.*;
import emu.lunarcore.util.Utils;
import lombok.Getter;
@@ -34,9 +34,12 @@ public class RogueInstance {
private Set<Integer> baseAvatarIds;
private Map<Integer, RogueBuffData> buffs;
private Map<Integer, RogueMiracleData> miracles;
private RogueBuffSelectMenu buffSelect;
private int pendingBuffSelects;
private RogueBuffSelectMenu buffSelect;
private int pendingMiracleSelects;
private RogueMiracleSelectMenu miracleSelect;
@Deprecated // Morphia only!
public RogueInstance() {}
@@ -48,6 +51,7 @@ public class RogueInstance {
this.currentRoomProgress = 0;
this.baseAvatarIds = new HashSet<>();
this.buffs = new HashMap<>();
this.miracles = new HashMap<>();
this.initRooms();
}
@@ -103,19 +107,56 @@ public class RogueInstance {
RogueBuffData buff = this.getBuffSelect().getBuffs()
.stream()
.filter(b -> b.getBuffId() == buffId)
.filter(b -> b.getId() == buffId)
.findFirst()
.orElse(null);
if (buff == null) return null;
this.buffSelect = null;
this.getBuffs().put(buff.getBuffId(), buff);
this.getBuffs().put(buff.getId(), buff);
getPlayer().sendPacket(new PacketAddRogueBuffScNotify(buff, RogueBuffSource.ROGUE_BUFF_SOURCE_TYPE_SELECT));
return buff;
}
public synchronized void createMiracleSelect(int amount) {
this.pendingMiracleSelects += amount;
RogueMiracleSelectMenu miracleSelect = this.updateMiracleSelect();
if (miracleSelect != null) {
getPlayer().sendPacket(new PacketSyncRogueMiracleSelectInfoScNotify(miracleSelect));
}
}
public synchronized RogueMiracleSelectMenu updateMiracleSelect() {
if (this.pendingMiracleSelects > 0 && this.getMiracleSelect() == null) {
this.miracleSelect = new RogueMiracleSelectMenu(this);
this.pendingMiracleSelects--;
return this.miracleSelect;
}
return null;
}
public synchronized RogueMiracleData selectMiracle(int miracleId) {
if (this.getMiracleSelect() == null) return null;
RogueMiracleData miracle = this.getMiracleSelect().getMiracles()
.stream()
.filter(b -> b.getId() == miracleId)
.findFirst()
.orElse(null);
if (miracle == null) return null;
this.miracleSelect = null;
this.getMiracles().put(miracle.getId(), miracle);
getPlayer().sendPacket(new PacketAddRogueMiracleScNotify(miracle, RogueMiracleSource.ROGUE_MIRACLE_SOURCE_TYPE_SELECT));
return miracle;
}
public synchronized RogueRoomData enterRoom(int siteId) {
// Set status on previous room
RogueRoomData prevRoom = getCurrentRoom();
@@ -184,6 +225,9 @@ public class RogueInstance {
if (this.getBuffSelect() != null) {
this.getBuffSelect().onLoad(this);
}
if (this.getMiracleSelect() != null) {
this.getMiracleSelect().onLoad(this);
}
}
// Serialization
@@ -191,13 +235,13 @@ public class RogueInstance {
public RogueCurrentInfo toProto() {
var proto = RogueCurrentInfo.newInstance()
.setStatus(this.getStatus())
.setRoomMap(this.toMapProto())
.setRogueBuffInfo(this.toBuffProto());
.setRoomMap(this.toMapInfoProto())
.setRogueBuffInfo(this.toBuffInfoProto());
return proto;
}
public RogueMapInfo toMapProto() {
public RogueMapInfo toMapInfoProto() {
var room = this.getCurrentRoom();
var proto = RogueMapInfo.newInstance()
@@ -213,7 +257,7 @@ public class RogueInstance {
return proto;
}
public RogueBuffInfo toBuffProto() {
public RogueBuffInfo toBuffInfoProto() {
var proto = RogueBuffInfo.newInstance();
if (this.getBuffSelect() != null) {
@@ -229,4 +273,23 @@ public class RogueInstance {
return proto;
}
public RogueMiracleInfo toMiracleInfoProto() {
var proto = RogueMiracleInfo.newInstance();
if (this.getMiracleSelect() != null) {
proto.setMiracleSelectInfo(this.getMiracleSelect().toProto());
} else {
proto.getMutableMiracleSelectInfo();
}
// Set flag for this so it gets serialized
proto.getMutableAchivedMiracleInfo();
for (var miracle : this.getMiracles().values()) {
proto.getMutableAchivedMiracleInfo().addRogueMiracleList(miracle.toProto());
}
return proto;
}
}

View File

@@ -0,0 +1,22 @@
package emu.lunarcore.game.rogue;
import emu.lunarcore.proto.RogueMiracleOuterClass.RogueMiracle;
import lombok.Getter;
@Getter
public class RogueMiracleData {
private int id;
private boolean active;
public RogueMiracleData(int miracleId) {
this.id = miracleId;
this.active = true;
}
public RogueMiracle toProto() {
var proto = RogueMiracle.newInstance()
.setMiracleId(this.getId());
return proto;
}
}

View File

@@ -0,0 +1,67 @@
package emu.lunarcore.game.rogue;
import java.util.ArrayList;
import java.util.List;
import emu.lunarcore.data.GameDepot;
import emu.lunarcore.data.excel.RogueMiracleExcel;
import emu.lunarcore.proto.RogueMiracleSelectInfoOuterClass.RogueMiracleSelectInfo;
import emu.lunarcore.util.WeightedList;
import lombok.Getter;
@Getter
public class RogueMiracleSelectMenu {
private transient RogueInstance rogue;
private int maxMiracles;
private List<RogueMiracleData> miracles;
// Cache
private transient WeightedList<RogueMiracleExcel> randomMiracles;
@Deprecated // Morphia only!
public RogueMiracleSelectMenu() {}
public RogueMiracleSelectMenu(RogueInstance rogue) {
this.rogue = rogue;
this.maxMiracles = 3;
this.miracles = new ArrayList<>();
this.generateRandomBuffs();
}
public void generateRandomBuffs() {
if (this.randomMiracles == null) {
this.randomMiracles = new WeightedList<>();
for (var excel : GameDepot.getRogueRandomMiracleList()) {
if (rogue.getBuffs().containsKey(excel.getMiracleID())) {
continue;
}
this.randomMiracles.add(1.0, excel);
};
}
this.getMiracles().clear();
while (this.getMiracles().size() < this.getMaxMiracles()) {
var excel = this.randomMiracles.next();
this.getMiracles().add(new RogueMiracleData(excel.getMiracleID()));
}
}
protected void onLoad(RogueInstance rogue) {
this.rogue = rogue;
}
public RogueMiracleSelectInfo toProto() {
var proto = RogueMiracleSelectInfo.newInstance();
for (var miracle : this.getMiracles()) {
proto.addAllMiracleIdList(miracle.getId());
}
return proto;
}
}

View File

@@ -0,0 +1,30 @@
package emu.lunarcore.server.packet.recv;
import emu.lunarcore.game.rogue.RogueMiracleData;
import emu.lunarcore.game.rogue.RogueMiracleSelectMenu;
import emu.lunarcore.proto.SelectRogueMiracleCsReqOuterClass.SelectRogueMiracleCsReq;
import emu.lunarcore.server.game.GameSession;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.server.packet.Opcodes;
import emu.lunarcore.server.packet.PacketHandler;
import emu.lunarcore.server.packet.send.PacketSelectRogueMiracleScRsp;
@Opcodes(CmdId.SelectRogueMiracleCsReq)
public class HandlerSelectRogueMiracleCsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
var req = SelectRogueMiracleCsReq.parseFrom(data);
if (session.getPlayer().getRogueInstance() != null) {
RogueMiracleData miracle = session.getPlayer().getRogueInstance().selectMiracle(req.getMiracleId());
if (miracle != null) {
RogueMiracleSelectMenu miracleSelect = session.getPlayer().getRogueInstance().updateMiracleSelect();
session.send(new PacketSelectRogueMiracleScRsp(miracle, miracleSelect));
}
}
session.send(CmdId.SelectRogueBuffScRsp);
}
}

View File

@@ -0,0 +1,20 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.game.rogue.RogueMiracleData;
import emu.lunarcore.proto.AddRogueMiracleScNotifyOuterClass.AddRogueMiracleScNotify;
import emu.lunarcore.proto.RogueMiracleSourceOuterClass.RogueMiracleSource;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
public class PacketAddRogueMiracleScNotify extends BasePacket {
public PacketAddRogueMiracleScNotify(RogueMiracleData miracle, RogueMiracleSource rogueMiracleSource) {
super(CmdId.AddRogueMiracleScNotify);
var data = AddRogueMiracleScNotify.newInstance()
.setRogueMiracle(miracle.toProto())
.setSource(rogueMiracleSource);
this.setData(data);
}
}

View File

@@ -12,7 +12,7 @@ public class PacketSelectRogueBuffScRsp extends BasePacket {
super(CmdId.SelectRogueBuffScRsp);
var data = SelectRogueBuffScRsp.newInstance()
.setMazeBuffId(buff.getBuffId())
.setMazeBuffId(buff.getId())
.setMazeBuffLevel(buff.getLevel());
if (buffSelect != null) {

View File

@@ -0,0 +1,24 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.game.rogue.RogueMiracleData;
import emu.lunarcore.game.rogue.RogueMiracleSelectMenu;
import emu.lunarcore.proto.SelectRogueMiracleScRspOuterClass.SelectRogueMiracleScRsp;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
public class PacketSelectRogueMiracleScRsp extends BasePacket {
public PacketSelectRogueMiracleScRsp(RogueMiracleData miracle, RogueMiracleSelectMenu miracleSelect) {
super(CmdId.SelectRogueMiracleScRsp);
var data = SelectRogueMiracleScRsp.newInstance();
if (miracleSelect != null) {
data.setMiracleSelectInfo(miracleSelect.toProto());
} else {
data.getMutableMiracleSelectInfo();
}
this.setData(data);
}
}

View File

@@ -0,0 +1,18 @@
package emu.lunarcore.server.packet.send;
import emu.lunarcore.game.rogue.RogueMiracleSelectMenu;
import emu.lunarcore.proto.SyncRogueMiracleSelectInfoScNotifyOuterClass.SyncRogueMiracleSelectInfoScNotify;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
public class PacketSyncRogueMiracleSelectInfoScNotify extends BasePacket {
public PacketSyncRogueMiracleSelectInfoScNotify(RogueMiracleSelectMenu miracleSelect) {
super(CmdId.SyncRogueMiracleSelectInfoScNotify);
var data = SyncRogueMiracleSelectInfoScNotify.newInstance()
.setMiracleSelectInfo(miracleSelect.toProto());
this.setData(data);
}
}