diff --git a/Common/Data/Excel/MonsterConfigExcel.cs b/Common/Data/Excel/MonsterConfigExcel.cs index c29366ad..0720bab4 100644 --- a/Common/Data/Excel/MonsterConfigExcel.cs +++ b/Common/Data/Excel/MonsterConfigExcel.cs @@ -4,6 +4,8 @@ public class MonsterConfigExcel : ExcelResource { public int MonsterID { get; set; } + public int MonsterTemplateID { get; set; } + public int HardLevelGroup { get; set; } public override int GetId() { diff --git a/Common/Data/Excel/MonsterTemplateConfigExcel.cs b/Common/Data/Excel/MonsterTemplateConfigExcel.cs new file mode 100644 index 00000000..32d29549 --- /dev/null +++ b/Common/Data/Excel/MonsterTemplateConfigExcel.cs @@ -0,0 +1,19 @@ +namespace EggLink.DanhengServer.Data.Excel; + +[ResourceEntity("MonsterTemplateConfig.json")] +public class MonsterTemplateConfigExcel : ExcelResource +{ + public int MonsterTemplateID { get; set; } + public List NPCMonsterList { get; set; } = []; + public int MonsterCampID { get; set; } + + public override int GetId() + { + return MonsterTemplateID; + } + + public override void Loaded() + { + GameData.MonsterTemplateConfigData.Add(MonsterTemplateID, this); + } +} \ No newline at end of file diff --git a/Common/Data/Excel/RogueTournAreaExcel.cs b/Common/Data/Excel/RogueTournAreaExcel.cs index 9f335ac7..a89d6750 100644 --- a/Common/Data/Excel/RogueTournAreaExcel.cs +++ b/Common/Data/Excel/RogueTournAreaExcel.cs @@ -19,6 +19,7 @@ public class RogueTournAreaExcel : ExcelResource public int ExpScoreID { get; set; } public int UnlockID { get; set; } public int AreaID { get; set; } + public int DivisionLevel { get; set; } public HashName AreaNameID { get; set; } = new(); public bool IsHard { get; set; } diff --git a/Common/Data/Excel/RogueTournDivisionExcel.cs b/Common/Data/Excel/RogueTournDivisionExcel.cs new file mode 100644 index 00000000..8c9999c3 --- /dev/null +++ b/Common/Data/Excel/RogueTournDivisionExcel.cs @@ -0,0 +1,18 @@ +namespace EggLink.DanhengServer.Data.Excel; + +[ResourceEntity("RogueTournDivision.json")] +public class RogueTournDivisionExcel : ExcelResource +{ + public int DivisionLevel { get; set; } + public int DivisionProgress { get; set; } + + public override int GetId() + { + return DivisionLevel; + } + + public override void Loaded() + { + GameData.RogueTournDivisionData.Add(DivisionLevel, this); + } +} \ No newline at end of file diff --git a/Common/Data/Excel/RogueTournLayerRoomExcel.cs b/Common/Data/Excel/RogueTournLayerRoomExcel.cs new file mode 100644 index 00000000..749a5baa --- /dev/null +++ b/Common/Data/Excel/RogueTournLayerRoomExcel.cs @@ -0,0 +1,22 @@ +namespace EggLink.DanhengServer.Data.Excel; + +[ResourceEntity("RogueTournLayerRoom.json")] +public class RogueTournLayerRoomExcel : ExcelResource +{ + public int LayerID { get; set; } + public int RoomIndex { get; set; } + public Dictionary Door1 { get; set; } = []; + public Dictionary Door2 { get; set; } = []; + public Dictionary Door3 { get; set; } = []; + + public override int GetId() + { + return LayerID; + } + + public override void Loaded() + { + GameData.RogueTournLayerRoomData.TryAdd(LayerID, []); + GameData.RogueTournLayerRoomData[LayerID][RoomIndex] = this; + } +} \ No newline at end of file diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index 257fd240..70dcbc1c 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -95,6 +95,7 @@ public static class GameData public static Dictionary InteractConfigData { get; private set; } = []; public static Dictionary NpcMonsterDataData { get; private set; } = []; public static Dictionary MonsterConfigData { get; private set; } = []; + public static Dictionary MonsterTemplateConfigData { get; private set; } = []; public static Dictionary MonsterDropData { get; private set; } = []; public static Dictionary BattleCollegeConfigData { get; private set; } = []; public static Dictionary BattleTargetConfigData { get; private set; } = []; @@ -322,7 +323,9 @@ public static class GameData #region TournRogue public static Dictionary RogueTournAreaData { get; private set; } = []; + public static Dictionary> RogueTournLayerRoomData { get; private set; } = []; public static Dictionary RogueTournWorkbenchData { get; private set; } = []; + public static Dictionary RogueTournDivisionData { get; private set; } = []; public static Dictionary RogueTournWorkbenchFuncData { get; private set; } = []; public static Dictionary RogueTournFormulaData { get; private set; } = []; public static Dictionary RogueTournMiracleData { get; private set; } = []; diff --git a/GameServer/Game/Battle/BattleInstance.cs b/GameServer/Game/Battle/BattleInstance.cs index 4be84aa6..bdf621cb 100644 --- a/GameServer/Game/Battle/BattleInstance.cs +++ b/GameServer/Game/Battle/BattleInstance.cs @@ -67,6 +67,7 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List BattleTargets { get; set; } = []; public BattleCollegeConfigExcel? CollegeConfigExcel { get; set; } public PVEBattleResultCsReq? BattleResult { get; set; } + public bool IsTournRogue { get; set; } public ItemList GetDropItemList() { @@ -220,6 +221,7 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List 0) foreach (var item in protoWave) item.MonsterParam.Level = (uint)CustomLevel; + proto.MonsterWaveList.AddRange(protoWave); } @@ -302,6 +304,9 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List buff.ToProto(this))); return proto; } diff --git a/GameServer/Game/RogueTourn/RogueTournInstance.cs b/GameServer/Game/RogueTourn/RogueTournInstance.cs index 6af93c4f..9a8e10c1 100644 --- a/GameServer/Game/RogueTourn/RogueTournInstance.cs +++ b/GameServer/Game/RogueTourn/RogueTournInstance.cs @@ -1,4 +1,5 @@ using EggLink.DanhengServer.Data; +using EggLink.DanhengServer.Data.Custom; using EggLink.DanhengServer.Data.Excel; using EggLink.DanhengServer.Enums.Rogue; using EggLink.DanhengServer.Enums.Scene; @@ -69,11 +70,9 @@ public class RogueTournInstance : BaseRogueInstance public Dictionary RoomTypeWeight { get; set; } = new() { { RogueTournRoomTypeEnum.Battle, 15 }, - { RogueTournRoomTypeEnum.Coin, 4 }, - { RogueTournRoomTypeEnum.Shop, 4 }, { RogueTournRoomTypeEnum.Event, 7 }, { RogueTournRoomTypeEnum.Reward, 5 }, - { RogueTournRoomTypeEnum.Hidden, 1 } + { RogueTournRoomTypeEnum.Encounter, 5 }, }; public RogueTournLevelInstance? CurLevel => Levels.GetValueOrDefault(CurLayerId); @@ -84,7 +83,12 @@ public class RogueTournInstance : BaseRogueInstance public async ValueTask EnterNextLayer(int roomIndex, RogueTournRoomTypeEnum type) { - CurLayerId += 100; + var curInd = Levels.Keys.ToList().IndexOf(CurLayerId); + var nextLayerId = Levels.Keys.ToList()[curInd + 1]; + var nextLayer = Levels[nextLayerId]; + CurLevel!.LevelStatus = RogueTournLayerStatus.Finish; + + CurLayerId = nextLayer.LayerId; await EnterRoom(1, type); } @@ -311,6 +315,13 @@ public class RogueTournInstance : BaseRogueInstance return res; } + public override async ValueTask AddBuffList(List excel) + { + await base.AddBuffList(excel); + + await ExpandFormula(); + } + public async ValueTask ExpandFormula() { // expand formula @@ -375,6 +386,7 @@ public class RogueTournInstance : BaseRogueInstance RogueActions.Remove(action.QueuePosition); } + await ExpandFormula(); await UpdateMenu(); await Player.SendPacket( @@ -426,11 +438,36 @@ public class RogueTournInstance : BaseRogueInstance } }; + Dictionary divisionBuffs = + new() { + { 1, 651031 }, + { 2, 651032 }, + { 3, 651033 }, + { 4, 651034 }, + { 5, 651035 }, + { 6, 651036 }, + }; + + var divisionLevel = AreaExcel.DivisionLevel; + foreach (var buff in divisionBuffs.Where(x => divisionLevel >= x.Key)) + { + battle.Buffs.Add(new MazeBuff(buff.Value, 1, -1) + { + WaveFlag = -1, + DynamicValues = + { + { "_RogueLayer", CurLevel?.LevelIndex ?? 1 } + } + }); + } + + battle.IsTournRogue = true; + if (DifficultyExcels.Count > 0) { - var diff = DifficultyExcels.RandomElement(); + var diff = DifficultyExcels[Math.Min(DifficultyExcels.Count, CurLevel!.LevelIndex) - 1]; if (diff.LevelList.Count > 0) - battle.CustomLevel = diff.LevelList.RandomElement(); + battle.CustomLevel = diff.LevelList.First(); } foreach (var formula in RogueFormulas.Where(formula => @@ -442,6 +479,11 @@ public class RogueTournInstance : BaseRogueInstance WaveFlag = -1 }); + battle.Buffs.Add(new MazeBuff(634000, 1, -1) // day and night + { + WaveFlag = -1 + }); + RogueTitanBlessInstance.OnBattleStart(battle); } diff --git a/GameServer/Game/RogueTourn/RogueTournManager.cs b/GameServer/Game/RogueTourn/RogueTournManager.cs index 273896f5..d528af28 100644 --- a/GameServer/Game/RogueTourn/RogueTournManager.cs +++ b/GameServer/Game/RogueTourn/RogueTournManager.cs @@ -46,6 +46,8 @@ public class RogueTournManager(PlayerInstance player) : BasePlayerManager(player public RogueTournInfo ToProto() { + var maxDivision = GameData.RogueTournDivisionData.Values.MaxBy(x => x.DivisionLevel) ?? new RogueTournDivisionExcel(); + var proto = new RogueTournInfo { ExtraScoreInfo = ToExtraScoreProto(), @@ -60,7 +62,11 @@ public class RogueTournManager(PlayerInstance player) : BasePlayerManager(player Capacity = 0 }, SeasonTalentInfo = ToSeasonTalentProto(), - LKCEFCLJCBM = new KCLCHJMNPGL() + RogueDivisionInfo = new RogueTournDivisionInfo + { + DivisionLevel = (uint)maxDivision.DivisionLevel, + DivisionProgress = (uint)maxDivision.DivisionProgress + } }; return proto; @@ -166,11 +172,11 @@ public class RogueTournManager(PlayerInstance player) : BasePlayerManager(player foreach (var formulaId in GameData.RogueTournFormulaData.Keys) proto.HandbookFormulaList.Add((uint)formulaId); foreach (var miracleId in GameData.RogueTournHandbookMiracleData.Keys) - proto.HandbookMiracleList.Add((uint)miracleId); + proto.HandbookTournMiracleList.Add((uint)miracleId); foreach (var blessId in GameData.RogueTournTitanBlessData.Keys) proto.HandbookTitanBlessList.Add((uint)blessId); - //foreach (var eventId in GameData.RogueTournHandBookEventData.Keys) proto.HandbookEventList.Add((uint)eventId); + foreach (var eventId in GameData.RogueTournHandBookEventData.Keys) proto.HandbookMiracleList.Add((uint)eventId); // TODO edit field name return proto; } diff --git a/GameServer/Game/RogueTourn/Scene/RogueTournEntityLoader.cs b/GameServer/Game/RogueTourn/Scene/RogueTournEntityLoader.cs index 10569a3c..bb4e0245 100644 --- a/GameServer/Game/RogueTourn/Scene/RogueTournEntityLoader.cs +++ b/GameServer/Game/RogueTourn/Scene/RogueTournEntityLoader.cs @@ -8,14 +8,16 @@ using EggLink.DanhengServer.GameServer.Game.Rogue.Scene.Entity; using EggLink.DanhengServer.GameServer.Game.Scene; using EggLink.DanhengServer.GameServer.Game.Scene.Entity; using EggLink.DanhengServer.Util; +using EggLink.DanhengServer.Util.Security; namespace EggLink.DanhengServer.GameServer.Game.RogueTourn.Scene; public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) : SceneEntityLoader(scene) { public List ExistTypes = []; - public List FinalRoomBossIds = [3007091, 3007101, 3007111, 3007121, 3007131, 3007141]; - public List LayerNormalBossIds = [3007011, 3007021, 3007031, 3007041, 3007051, 3007061, 3007071, 3007081]; + public List FinalRoomBossIds = [5004141, 3004171, 3004161, 3004151]; + public List Layer1NormalBossIds { get; set; } = [3013081, 3013161, 3013041, 3013241, 3013131, 3013201, 3013231, 3013181, 3013191, 3013251, 3013121]; + public List Layer2NormalBossIds { get; set; } = [5004071, 5004051, 5004021, 5004081]; public PlayerInstance Player = player; public List RogueDoorPropIds = [1033, 1034, 1035, 1036, 1037, 1000]; @@ -43,7 +45,7 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) foreach (var npc in info.NPCList) try { - if (await LoadNpc(npc, info) is EntityNpc entity) entityList.Add(entity); + if (await LoadNpc(npc, info) is { } entity) entityList.Add(entity); } catch { @@ -52,7 +54,7 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) foreach (var monster in info.MonsterList) try { - if (await LoadMonster(monster, info) is EntityMonster entity) entityList.Add(entity); + if (await LoadMonster(monster, info) is { } entity) entityList.Add(entity); } catch { @@ -61,7 +63,7 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) foreach (var prop in info.PropList) try { - if (await LoadProp(prop, info) is EntityProp entity) entityList.Add(entity); + if (await LoadProp(prop, info) is { } entity) entityList.Add(entity); } catch { @@ -120,28 +122,52 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) { if (rogueInstance.CurLevel?.LevelIndex == 3) rogueMonster = GameData.RogueMonsterData[FinalRoomBossIds.RandomElement()]; + else if (rogueInstance.CurLevel?.LevelIndex == 2) + rogueMonster = GameData.RogueMonsterData[Layer2NormalBossIds.RandomElement()]; else - rogueMonster = GameData.RogueMonsterData[LayerNormalBossIds.RandomElement()]; + rogueMonster = GameData.RogueMonsterData[Layer1NormalBossIds.RandomElement()]; } else { NPCMonsterDataExcel? data; + MonsterTemplateConfigExcel? templateConfigExcel; do { rogueMonster = GameData.RogueMonsterData.Values.ToList().RandomElement(); GameData.NpcMonsterDataData.TryGetValue(rogueMonster.NpcMonsterID, out data); - } while (data == null || !allowedRank.Contains(data.Rank)); + templateConfigExcel = GameData.MonsterTemplateConfigData.Values.FirstOrDefault(x => + x.NPCMonsterList.Contains(rogueMonster.NpcMonsterID)); + + } while (data == null || !allowedRank.Contains(data.Rank) || templateConfigExcel == null || + templateConfigExcel.MonsterCampID < 12 || templateConfigExcel.MonsterCampID > 15); } GameData.NpcMonsterDataData.TryGetValue(rogueMonster.NpcMonsterID, out var excel); + var template = GameData.MonsterTemplateConfigData.Values.FirstOrDefault(x => + x.NPCMonsterList.Contains(rogueMonster.NpcMonsterID)); if (excel == null) return null; + var level = 10; + + if (rogueInstance.DifficultyExcels.Count > 0) + { + var diff = rogueInstance.DifficultyExcels[ + Math.Min(rogueInstance.DifficultyExcels.Count, rogueInstance.CurLevel!.LevelIndex) - 1]; + if (diff.LevelList.Count > 0) + level = diff.LevelList.First(); + } + + var monsterConf = + GameData.MonsterConfigData.Values.FirstOrDefault(x => x.MonsterTemplateID == template?.MonsterTemplateID); + EntityMonster entity = new(Scene, info.ToPositionProto(), info.ToRotationProto(), group.Id, info.ID, excel, info) { EventId = rogueMonster.EventID, CustomStageId = rogueMonster.EventID, - RogueMonsterId = rogueMonster.RogueMonsterID + RogueMonsterId = rogueMonster.RogueMonsterID, + CustomLevel = level, + HardLevelGroup = monsterConf?.HardLevelGroup ?? 1 }; await Scene.AddEntity(entity, sendPacket); @@ -151,8 +177,9 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) public override async ValueTask LoadProp(PropInfo info, GroupInfo group, bool sendPacket = false) { + var rogue = Player.RogueTournManager?.RogueTournInstance; var room = Player.RogueTournManager?.RogueTournInstance?.CurLevel?.CurRoom; - if (room == null) return null; + if (room == null || rogue == null) return null; GameData.MazePropData.TryGetValue(info.PropID, out var propExcel); if (propExcel == null) return null; @@ -163,9 +190,12 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) if (RogueDoorPropIds.Contains(prop.PropInfo.PropID)) { - if (room is { RoomIndex: 4, LevelInstance.LevelIndex: 3 }) // last room + if (rogue.CurLevel?.LayerId == rogue.Levels.Last().Key && + rogue.CurLevel?.Rooms.Last().RoomIndex == room.RoomIndex) // last room + { // exit prop.CustomPropId = 1033; + } else do // find next room { @@ -200,13 +230,13 @@ public class RogueTournEntityLoader(SceneInstance scene, PlayerInstance player) RogueTournRoomTypeEnum.Reward => 1035, RogueTournRoomTypeEnum.Adventure => 1035, RogueTournRoomTypeEnum.Hidden => 1037, - RogueTournRoomTypeEnum.Respite => 1034, + RogueTournRoomTypeEnum.Respite => 1036, _ => 1034 }; - if (room.LevelInstance.Rooms.Last() == room) // last room prop.EnterNextLayer = true; + prop.RoomType = nextRoom; prop.IsTournRogue = true; diff --git a/GameServer/Game/RogueTourn/Scene/RogueTournLevelInstance.cs b/GameServer/Game/RogueTourn/Scene/RogueTournLevelInstance.cs index 6b0654ac..349731ce 100644 --- a/GameServer/Game/RogueTourn/Scene/RogueTournLevelInstance.cs +++ b/GameServer/Game/RogueTourn/Scene/RogueTournLevelInstance.cs @@ -14,12 +14,26 @@ public class RogueTournLevelInstance EntranceId = GameData.RogueTournRoomGenData.Where(x => x.RoomType != RogueTournRoomTypeEnum.Adventure) .Select(x => x.EntranceId).ToHashSet().ToList() .RandomElement(); - if (levelIndex == 2) - foreach (var index in Enumerable.Range(1, 5)) - Rooms.Add(new RogueTournRoomInstance(index, this)); + + if (levelIndex == 3) + EntranceId = 8060101; + + var roomExcel = GameData.RogueTournLayerRoomData.GetValueOrDefault(layerId); + + if (roomExcel == null) + { + if (levelIndex == 2) + foreach (var index in Enumerable.Range(1, 5)) + Rooms.Add(new RogueTournRoomInstance(index, this)); + else + foreach (var index in Enumerable.Range(1, 4)) + Rooms.Add(new RogueTournRoomInstance(index, this)); + } else - foreach (var index in Enumerable.Range(1, 4)) + { + foreach (var index in Enumerable.Range(1, roomExcel.Count)) Rooms.Add(new RogueTournRoomInstance(index, this)); + } } public List Rooms { get; set; } = []; diff --git a/GameServer/Game/Scene/Entity/EntityMonster.cs b/GameServer/Game/Scene/Entity/EntityMonster.cs index e0039cbb..b9763a57 100644 --- a/GameServer/Game/Scene/Entity/EntityMonster.cs +++ b/GameServer/Game/Scene/Entity/EntityMonster.cs @@ -34,6 +34,7 @@ public class EntityMonster( public int RogueMonsterId { get; set; } = 0; public int CustomLevel { get; set; } = 0; + public int HardLevelGroup { get; set; } = 0; public override int EntityId { get; set; } = 0; public override int GroupId { get; set; } = groupId; @@ -125,7 +126,8 @@ public class EntityMonster( RogueGameInfo = new NpcMonsterRogueInfo { RogueMonsterId = (uint)RogueMonsterId, - Level = (uint)CustomLevel + Level = (uint)CustomLevel, + HardLevelGroup = (uint)HardLevelGroup } }; diff --git a/GameServer/Server/Packet/Send/RogueTourn/PacketRogueTournSettleScRsp.cs b/GameServer/Server/Packet/Send/RogueTourn/PacketRogueTournSettleScRsp.cs index 5c777f1e..8bd2ec03 100644 --- a/GameServer/Server/Packet/Send/RogueTourn/PacketRogueTournSettleScRsp.cs +++ b/GameServer/Server/Packet/Send/RogueTourn/PacketRogueTournSettleScRsp.cs @@ -1,4 +1,6 @@ -using EggLink.DanhengServer.GameServer.Game.RogueTourn; +using EggLink.DanhengServer.Data; +using EggLink.DanhengServer.Data.Excel; +using EggLink.DanhengServer.GameServer.Game.RogueTourn; using EggLink.DanhengServer.Kcp; using EggLink.DanhengServer.Proto; @@ -8,6 +10,8 @@ public class PacketRogueTournSettleScRsp : BasePacket { public PacketRogueTournSettleScRsp(RogueTournInstance instance) : base(CmdIds.RogueTournSettleScRsp) { + var maxDivision = GameData.RogueTournDivisionData.Values.MaxBy(x => x.DivisionLevel) ?? new RogueTournDivisionExcel(); + var proto = new RogueTournSettleScRsp { RogueTournCurSceneInfo = instance.ToCurSceneInfo(), @@ -16,7 +20,11 @@ public class PacketRogueTournSettleScRsp : BasePacket RogueTournCurInfo = instance.ToProto(), RogueLineupInfo = instance.Player.LineupManager!.GetCurLineup()!.ToProto(), CJCOJAMLEEL = new(), - CLKHPONDDDO = new(), + NewDivisionInfo = new RogueTournDivisionInfo + { + DivisionLevel = (uint)maxDivision.DivisionLevel, + DivisionProgress = (uint)maxDivision.DivisionProgress + }, GCGLNKFDKKN = new(), KGCIAIAFIBE = new(), PFOEPFPHFNJ = new()