diff --git a/Common/Data/Custom/RogueTournRoomConfig.cs b/Common/Data/Custom/RogueTournRoomConfig.cs index d246950f..aba9ca2b 100644 --- a/Common/Data/Custom/RogueTournRoomConfig.cs +++ b/Common/Data/Custom/RogueTournRoomConfig.cs @@ -13,6 +13,9 @@ public class RogueTournRoomConfig public int AnchorGroup { get; set; } public int AnchorId { get; set; } + public uint SingleRoomId { get; set; } + public uint DoubleRoomId { get; set; } + public uint TripleRoomId { get; set; } public List DefaultLoadBasicGroup { get; set; } = []; public List DefaultLoadGroup { get; set; } = []; @@ -29,6 +32,9 @@ public class RogueTournRoomConfig DefaultLoadBasicGroup = DefaultLoadBasicGroup, DefaultLoadGroup = DefaultLoadGroup, EntranceId = EntranceId, + TripleRoomId = TripleRoomId, + SingleRoomId = SingleRoomId, + DoubleRoomId = DoubleRoomId, SubMonsterGroup = SubMonsterGroup }; } diff --git a/GameServer/Game/RogueTourn/RogueTournInstance.cs b/GameServer/Game/RogueTourn/RogueTournInstance.cs index 86cf3221..90d210ee 100644 --- a/GameServer/Game/RogueTourn/RogueTournInstance.cs +++ b/GameServer/Game/RogueTourn/RogueTournInstance.cs @@ -410,7 +410,7 @@ public class RogueTournInstance : BaseRogueInstance { ENNPJGLCBEM = new FKOCBOOCDNL { - POIIAIAKILF = (uint)TitanType + POIIAIAKILF = 1 } } }; diff --git a/GameServer/Game/RogueTourn/Scene/RogueTournRoomInstance.cs b/GameServer/Game/RogueTourn/Scene/RogueTournRoomInstance.cs index bbe3fa32..12d2f672 100644 --- a/GameServer/Game/RogueTourn/Scene/RogueTournRoomInstance.cs +++ b/GameServer/Game/RogueTourn/Scene/RogueTournRoomInstance.cs @@ -1,8 +1,10 @@ using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Data.Custom; +using EggLink.DanhengServer.Enums.Rogue; using EggLink.DanhengServer.Enums.TournRogue; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; +using System; namespace EggLink.DanhengServer.GameServer.Game.RogueTourn.Scene; @@ -13,6 +15,7 @@ public class RogueTournRoomInstance(int roomIndex, RogueTournLevelInstance level public RogueTournRoomStatus Status { get; set; } = RogueTournRoomStatus.None; public RogueTournLevelInstance LevelInstance { get; set; } = levelInstance; public RogueTournRoomTypeEnum RoomType { get; set; } + public RogueTournVariantTypeEnum VariantType { get; set; } public RogueTournRoomConfig? Config { get; set; } @@ -28,11 +31,21 @@ public class RogueTournRoomInstance(int roomIndex, RogueTournLevelInstance level public void Init(RogueTournRoomTypeEnum type) { - if (Status == RogueTournRoomStatus.Processing || Status == RogueTournRoomStatus.Finish) + if (Status is RogueTournRoomStatus.Processing or RogueTournRoomStatus.Finish) return; // already initialized RoomType = type; + VariantType = type switch + { + RogueTournRoomTypeEnum.Battle => RoomIndex == 1 ? RogueTournVariantTypeEnum.BattleTriple : RogueTournVariantTypeEnum.BattleDouble, + RogueTournRoomTypeEnum.Event => RogueTournVariantTypeEnum.EventTriple, + RogueTournRoomTypeEnum.Encounter => RogueTournVariantTypeEnum.EncounterDouble, + RogueTournRoomTypeEnum.Reward => RogueTournVariantTypeEnum.RewardDouble, + _ => RogueTournVariantTypeEnum.None + }; + Status = RogueTournRoomStatus.Processing; + // get config Config = RoomType == RogueTournRoomTypeEnum.Adventure ? GameData.RogueTournRoomGenData.Where(x => x.RoomType == RoomType).ToList().RandomElement() @@ -46,7 +59,29 @@ public class RogueTournRoomInstance(int roomIndex, RogueTournLevelInstance level return; } - RoomId = GameData.RogueTournRoomData.Where(x => x.Value.RogueRoomType == RoomType).Select(x => x.Key).ToList() + // get room id (unique) + var entryIdSuffix = (Config?.EntranceId ?? 0) % 1000; + var suffix = entryIdSuffix * 100 + 20 + LevelInstance.LevelIndex; + + var sameTypeExcels = GameData.RogueTournRoomData.Where(x => + x.Value.RogueRoomType == RoomType && x.Key.ToString().EndsWith(suffix.ToString())).ToArray(); + + if (sameTypeExcels.Length == 0) + { + suffix -= LevelInstance.LevelIndex; + + sameTypeExcels = GameData.RogueTournRoomData.Where(x => + x.Value.RogueRoomType == RoomType && x.Key.ToString().EndsWith(suffix.ToString())).ToArray(); + } + + sameTypeExcels = sameTypeExcels.Where(x => LevelInstance.Rooms.All(r => r.RoomId != x.Key)).ToArray(); // unique + + var sameVariantTypeExcels = sameTypeExcels.Where(x => x.Value.VariantType == VariantType).ToArray(); + if (sameVariantTypeExcels.Length > 0) + sameTypeExcels = sameVariantTypeExcels; + + RoomId = sameTypeExcels.Select(x => x.Key) + .ToList() .RandomElement(); } @@ -54,7 +89,12 @@ public class RogueTournRoomInstance(int roomIndex, RogueTournLevelInstance level { var groupList = new List(); groupList.AddRange(Config!.DefaultLoadBasicGroup); - groupList.AddRange(Config.DefaultLoadGroup); + if (VariantType.ToString().Contains("Double")) + groupList.AddRange(Config.DefaultLoadGroup.Take(2)); + else if (VariantType.ToString().Contains("Single")) + groupList.AddRange(Config.DefaultLoadGroup.Take(1)); + else + groupList.AddRange(Config.DefaultLoadGroup); //if (RoomIndex == 1) // first room groupList.AddRange(Config.SubMonsterGroup); diff --git a/Program/Generator/TournRoomGenerator.cs b/Program/Generator/TournRoomGenerator.cs index ee30a10a..559bde6a 100644 --- a/Program/Generator/TournRoomGenerator.cs +++ b/Program/Generator/TournRoomGenerator.cs @@ -12,6 +12,26 @@ public static class TournRoomGenerator public static List AllowedFloorIdList { get; set; } = [80601001, 80602001, 80603001, 80604001]; public static List SavedRoomInstanceList { get; set; } = []; + #region Prefix + + public static Dictionary> RoomPrefix { get; set; } = new() + { + { RogueTournRoomTypeEnum.Battle, [0, 120300000, 1120300000] }, + { RogueTournRoomTypeEnum.Event, [620500000, 320500000, 1120500000] }, + { RogueTournRoomTypeEnum.Encounter, [420400000, 120400000, 0] }, + { RogueTournRoomTypeEnum.Reward, [420800000, 120800000, 0] }, + { RogueTournRoomTypeEnum.Coin, [620600000, 0, 0] } // 20 + }; + + public static Dictionary> RoomFloorDiffPrefix { get; set; } = new() + { + { RogueTournRoomTypeEnum.Boss, [320100000, 320100000, 220100000, 220100000] }, + { RogueTournRoomTypeEnum.Respite, [321000000, 321000000, 221000000, 221000000] }, // 20 + { RogueTournRoomTypeEnum.Elite, [320200000, 320200000, 220200000, 220200000] }, + { RogueTournRoomTypeEnum.Shop, [320700000, 320700000, 220700000, 220700000] } // 20 + }; + + #endregion public static void GenerateFile(string path) { // get floor info @@ -31,7 +51,7 @@ public static class TournRoomGenerator { if (areaGroupId > 0 && baseModuleId > 0 && contentGroupId.Count > 0) foreach (var group in contentGroupId) - FlushRoom(GameData.MapEntranceData.First(x => x.Value.FloorID == floorId).Key, areaGroupId, + FlushRoom(GameData.MapEntranceData.First(x => x.Value.FloorID == floorId).Key, floorId, areaGroupId, baseModuleId, group.Value, group.Key); contentGroupId.Clear(); @@ -44,7 +64,7 @@ public static class TournRoomGenerator { if (areaGroupId > 0 && baseModuleId > 0 && contentGroupId.Count > 0) foreach (var group in contentGroupId) - FlushRoom(GameData.MapEntranceData.First(x => x.Value.FloorID == floorId).Key, areaGroupId, + FlushRoom(GameData.MapEntranceData.First(x => x.Value.FloorID == floorId).Key, floorId, areaGroupId, baseModuleId, group.Value, group.Key); contentGroupId.Clear(); @@ -98,6 +118,10 @@ public static class TournRoomGenerator } } + // clear old file + if (File.Exists(path)) + File.WriteAllText(path, "", Encoding.UTF8); + // save File.AppendAllText(path, JsonConvert.SerializeObject(SavedRoomInstanceList, Formatting.Indented), Encoding.UTF8); @@ -106,9 +130,22 @@ public static class TournRoomGenerator Logger.GetByClassName().Info($"Generated in {path} Successfully!"); } - public static void FlushRoom(int entranceId, int areaGroupId, int baseGroupId, List contentGroupIds, + public static void FlushRoom(int entranceId, int floorId, int areaGroupId, int baseGroupId, List contentGroupIds, RogueTournRoomTypeEnum type) { + var prefix = RoomPrefix.GetValueOrDefault(type)?.LastOrDefault(x => x != 0); + if (prefix == null) + prefix = RoomFloorDiffPrefix.GetValueOrDefault(type)?[AllowedFloorIdList.IndexOf(floorId)]; + + var entryIdSuffix = entranceId % 1000; + var roomId = prefix + entryIdSuffix * 100 + 20; + if (roomId == null) + { + roomId = 0; + Logger.GetByClassName().Error( + $"Cannot find prefix for RoomType {type} at Floor {floorId} (EntranceId {entranceId})"); + } + SavedRoomInstanceList.Add(new RogueTournRoomConfig { AnchorGroup = baseGroupId, @@ -116,7 +153,8 @@ public static class TournRoomGenerator DefaultLoadBasicGroup = { areaGroupId, baseGroupId }, DefaultLoadGroup = contentGroupIds, EntranceId = entranceId, - RoomType = type + RoomType = type, + //RoomId = (uint)roomId }); } } \ No newline at end of file