From e514af7678f1de3e0e24ff31a14e2ecc9e2244c2 Mon Sep 17 00:00:00 2001 From: Somebody Date: Sun, 7 Jul 2024 17:15:21 +0800 Subject: [PATCH] Feature: Better Chess Rogue Room & Fix Bugs - The room in chess rogue will be more - Fix a res bug ( recommend to use Andy's res ) --- Common/Data/Config/FloorInfo.cs | 2 + Common/Data/Config/GroupInfo.cs | 2 + Common/Data/Config/TaskInfo.cs | 3 +- Common/Data/Custom/ChessRogueCellConfig.cs | 23 - Common/Data/Custom/ChessRogueRoomConfig.cs | 24 +- Common/Data/GameData.cs | 5 +- Common/Data/ResourceManager.cs | 82 +- Common/Enums/Scene/GroupCategoryEnum.cs | 12 + Common/Util/GameConstants.cs | 1 + Config/ChessRogueContentGen.json | 14 - Config/ChessRogueLayerGen.json | 24 - Config/ChessRogueMapGen.json | 54 - Config/ChessRogueRoomGen.json | 1777 +++++++++++++++-- .../ChessRogue/Cell/ChessRogueCellInstance.cs | 61 +- .../ChessRogue/Cell/ChessRogueEntityLoader.cs | 37 +- .../Game/ChessRogue/ChessRogueInstance.cs | 28 +- .../Game/Rogue/Event/RogueEventManager.cs | 2 + ...RogueCommonDialogueOptionFinishScNotify.cs | 27 + Program/Handbook/HandbookGenerator.cs | 5 +- 19 files changed, 1769 insertions(+), 414 deletions(-) delete mode 100644 Common/Data/Custom/ChessRogueCellConfig.cs create mode 100644 Common/Enums/Scene/GroupCategoryEnum.cs delete mode 100644 Config/ChessRogueContentGen.json delete mode 100644 Config/ChessRogueLayerGen.json delete mode 100644 Config/ChessRogueMapGen.json create mode 100644 GameServer/Server/Packet/Send/Rogue/PacketSyncRogueCommonDialogueOptionFinishScNotify.cs diff --git a/Common/Data/Config/FloorInfo.cs b/Common/Data/Config/FloorInfo.cs index e319ff49..e6a273ff 100644 --- a/Common/Data/Config/FloorInfo.cs +++ b/Common/Data/Config/FloorInfo.cs @@ -1,6 +1,7 @@ using EggLink.DanhengServer.Enums.Scene; using EggLink.DanhengServer.Util; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace EggLink.DanhengServer.Data.Config { @@ -86,6 +87,7 @@ namespace EggLink.DanhengServer.Data.Config public string GroupPath { get; set; } = ""; public bool IsDelete { get; set; } public int ID { get; set; } + public string Name { get; set; } = ""; } diff --git a/Common/Data/Config/GroupInfo.cs b/Common/Data/Config/GroupInfo.cs index 414a1381..dc73e5e2 100644 --- a/Common/Data/Config/GroupInfo.cs +++ b/Common/Data/Config/GroupInfo.cs @@ -13,6 +13,8 @@ namespace EggLink.DanhengServer.Data.Config public int Id; [JsonConverter(typeof(StringEnumConverter))] public GroupLoadSideEnum LoadSide { get; set; } + [JsonConverter(typeof(StringEnumConverter))] + public GroupCategoryEnum Category { get; set; } public bool LoadOnInitial { get; set; } public string GroupName { get; set; } = ""; public LoadCondition LoadCondition { get; set; } = new(); diff --git a/Common/Data/Config/TaskInfo.cs b/Common/Data/Config/TaskInfo.cs index b97785f2..6b2b2e1f 100644 --- a/Common/Data/Config/TaskInfo.cs +++ b/Common/Data/Config/TaskInfo.cs @@ -18,7 +18,8 @@ namespace EggLink.DanhengServer.Data.Config public int ID { get; set; } public int SummonUnitID { get; set; } - public bool TriggerBattle { get; set; } = true; + // Here's a conflict between Dimbreath's res and Andy's res ( we recommend to use the one from Andy's res ) + public bool TriggerBattle { get; set; } = false; public List OnAttack { get; set; } = []; public List OnBattle { get; set; } = []; diff --git a/Common/Data/Custom/ChessRogueCellConfig.cs b/Common/Data/Custom/ChessRogueCellConfig.cs deleted file mode 100644 index a43b579a..00000000 --- a/Common/Data/Custom/ChessRogueCellConfig.cs +++ /dev/null @@ -1,23 +0,0 @@ -using EggLink.DanhengServer.Util; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace EggLink.DanhengServer.Data.Custom -{ - public class ChessRogueCellConfig - { - public double PosX { get; set; } - public double PosY { get; set; } - public double PosZ { get; set; } - public double RotY { get; set; } - - public List Groups { get; set; } = []; - - public Position ToPosition() => new((int) (PosX * 10000), (int) (PosY * 10000), (int) (PosZ * 10000)); - - public Position ToRotation() => new(0, (int) RotY * 10000, 0); - } -} diff --git a/Common/Data/Custom/ChessRogueRoomConfig.cs b/Common/Data/Custom/ChessRogueRoomConfig.cs index 5663df0e..799f62d8 100644 --- a/Common/Data/Custom/ChessRogueRoomConfig.cs +++ b/Common/Data/Custom/ChessRogueRoomConfig.cs @@ -1,4 +1,7 @@ -using System; +using EggLink.DanhengServer.Enums.Rogue; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -9,14 +12,17 @@ namespace EggLink.DanhengServer.Data.Custom public class ChessRogueRoomConfig { public int EntranceId { get; set; } - public List Groups { get; set; } = []; - public Dictionary CellGroup { get; set; } = []; - } + public int RoomPrefix { get; set; } + [JsonConverter(typeof(StringEnumConverter))] + public RogueDLCBlockTypeEnum BlockType { get; set; } + public int AnchorGroup { get; set; } + public int AnchorId { get; set; } - public class ChessRogueRoom - { - public List Groups { get; set; } = []; - public bool IsBoss { get; set; } = false; - public bool IsLastBoss { get; set; } = false; + public List DefaultLoadBasicGroup { get; set; } = []; + public List DefaultLoadGroup { get; set; } = []; + public List DoubleEventLoadGroup { get; set; } = []; // override DefaultLoadGroup + public List SelectEventLoadGroup { get; set; } = []; // override DefaultLoadGroup + + public List SubMonsterGroup { get; set; } = []; // combine with DefaultLoadGroup } } diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index e4ba84cc..a0cadddb 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -1,6 +1,7 @@ using EggLink.DanhengServer.Data.Config; using EggLink.DanhengServer.Data.Custom; using EggLink.DanhengServer.Data.Excel; +using EggLink.DanhengServer.Enums.Rogue; namespace EggLink.DanhengServer.Data { @@ -49,9 +50,7 @@ namespace EggLink.DanhengServer.Data #region ChessRogue public static Dictionary ActionPointOverdrawData { get; private set; } = []; - public static Dictionary> ChessRogueContentGenData { get; set; } = []; - public static Dictionary ChessRogueCellGenData { get; set; } = []; - public static Dictionary ChessRogueRoomGenData { get; set; } = []; + public static Dictionary> ChessRogueRoomData { get; private set; } = []; public static Dictionary RogueDLCAreaData { get; private set; } = []; public static Dictionary RogueDLCBossDecayData { get; private set; } = []; public static Dictionary RogueDLCBossBpData { get; private set; } = []; diff --git a/Common/Data/ResourceManager.cs b/Common/Data/ResourceManager.cs index 7cf566f9..3db70799 100644 --- a/Common/Data/ResourceManager.cs +++ b/Common/Data/ResourceManager.cs @@ -9,6 +9,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using EggLink.DanhengServer.Data.Custom; using EggLink.DanhengServer.Data.Excel; +using EggLink.DanhengServer.Enums.Rogue; namespace EggLink.DanhengServer.Data { @@ -29,9 +30,7 @@ namespace EggLink.DanhengServer.Data GameData.RogueMapGenData = LoadCustomFile>>("Rogue Map", "RogueMapGen") ?? []; GameData.RogueMiracleGroupData = LoadCustomFile>>("Rogue Miracle Group", "RogueMiracleGroup") ?? []; GameData.RogueMiracleEffectData = LoadCustomFile("Rogue Miracle Effect", "RogueMiracleEffectGen") ?? new(); - GameData.ChessRogueRoomGenData = LoadCustomFile>("Chess Rogue Map", "ChessRogueMapGen") ?? []; - GameData.ChessRogueContentGenData = LoadCustomFile>>("Chess Rogue Content", "ChessRogueContentGen") ?? []; - GameData.ChessRogueCellGenData = LoadCustomFile>("Chess Rogue Cell", "ChessRogueRoomGen") ?? []; + LoadChessRogueRoomData(); } public static void LoadExcel() @@ -476,5 +475,82 @@ namespace EggLink.DanhengServer.Data Logger.Info("Loaded " + count + " board infos."); } + + public static void LoadChessRogueRoomData() + { + var count = 0; + + FileInfo file = new(ConfigManager.Config.Path.ConfigPath + $"/ChessRogueRoomGen.json"); + List? customFile = default; + if (!file.Exists) + { + Logger.Warn($"Banner infos are missing, please check your resources folder: {ConfigManager.Config.Path.ConfigPath}/ChessRogueRoomGen.json. Chess Rogue may not work!"); + return; + } + try + { + using var reader = file.OpenRead(); + using StreamReader reader2 = new(reader); + var text = reader2.ReadToEnd(); + var json = JsonConvert.DeserializeObject>(text); + customFile = json; + + foreach (var room in customFile!) + { + if (room.BlockType == RogueDLCBlockTypeEnum.MonsterNormal) + { + AddRoomToGameData(RogueDLCBlockTypeEnum.MonsterNormal, room); + AddRoomToGameData(RogueDLCBlockTypeEnum.MonsterSwarm, room); + count += 2; + } + else if (room.BlockType == RogueDLCBlockTypeEnum.MonsterBoss) + { + AddRoomToGameData(RogueDLCBlockTypeEnum.MonsterBoss, room); + AddRoomToGameData(RogueDLCBlockTypeEnum.MonsterNousBoss, room); + AddRoomToGameData(RogueDLCBlockTypeEnum.MonsterSwarmBoss, room); + count += 3; + } + else if (room.BlockType == RogueDLCBlockTypeEnum.Event) + { + AddRoomToGameData(RogueDLCBlockTypeEnum.Event, room); + AddRoomToGameData(RogueDLCBlockTypeEnum.Reward, room); + AddRoomToGameData(RogueDLCBlockTypeEnum.Adventure, room); // adventure is not this type + AddRoomToGameData(RogueDLCBlockTypeEnum.NousSpecialEvent, room); + AddRoomToGameData(RogueDLCBlockTypeEnum.SwarmEvent, room); + AddRoomToGameData(RogueDLCBlockTypeEnum.NousEvent, room); + count += 6; + } + else if (room.BlockType == RogueDLCBlockTypeEnum.Trade) + { + AddRoomToGameData(RogueDLCBlockTypeEnum.Trade, room); + AddRoomToGameData(RogueDLCBlockTypeEnum.BlackMarket, room); + count += 2; + } + else + { + AddRoomToGameData(room.BlockType, room); + count++; + } + } + } + catch (Exception ex) + { + Logger.Error("Error in reading " + file.Name, ex); + } + + Logger.Info("Loaded " + count + " room infos."); + } + + public static void AddRoomToGameData(RogueDLCBlockTypeEnum type, ChessRogueRoomConfig room) + { + if (GameData.ChessRogueRoomData.TryGetValue(type, out var list)) + { + list.Add(room); + } + else + { + GameData.ChessRogueRoomData.Add(type, [room]); + } + } } } diff --git a/Common/Enums/Scene/GroupCategoryEnum.cs b/Common/Enums/Scene/GroupCategoryEnum.cs new file mode 100644 index 00000000..ca2205af --- /dev/null +++ b/Common/Enums/Scene/GroupCategoryEnum.cs @@ -0,0 +1,12 @@ +namespace EggLink.DanhengServer.Enums.Scene +{ + public enum GroupCategoryEnum + { + Normal = 0, + Mission = 1, + BattleProps = 2, + Custom = 3, + System = 4, + Atmosphere = 5, + } +} diff --git a/Common/Util/GameConstants.cs b/Common/Util/GameConstants.cs index 242ff38a..ed5278f3 100644 --- a/Common/Util/GameConstants.cs +++ b/Common/Util/GameConstants.cs @@ -14,6 +14,7 @@ public const int MAX_LINEUP_COUNT = 9; public static readonly List UpgradeWorldLevel = [20, 30, 40, 50, 60, 65]; + public static readonly List AllowedChessRogueEntranceId = [8020701, 8020901, 8020401, 8020201]; public const int AMBUSH_BUFF_ID = 1000102; diff --git a/Config/ChessRogueContentGen.json b/Config/ChessRogueContentGen.json deleted file mode 100644 index 7ff4595c..00000000 --- a/Config/ChessRogueContentGen.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "114": [204002], - "115": [206001], - "116": [204004], - "12": [0], - "52": [0], - "34": [200008], - "81": [205002], - "83": [205004], - "82": [205003], - "48": [201002], - "50": [201004], - "49": [201003] -} \ No newline at end of file diff --git a/Config/ChessRogueLayerGen.json b/Config/ChessRogueLayerGen.json deleted file mode 100644 index 5c2f63d2..00000000 --- a/Config/ChessRogueLayerGen.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "2021": { - "-1": [2111011], - "0": [3], - "1": [1, 2, 3, 4], - "2": [1, 2, 3, 4, 5], - "3": [1, 2, 3, 4], - "4": [3] - }, - "2022": { - "-1": [2112025], - "0": [2, 3, 4, 5], - "1": [0, 1, 2, 4, 5], - "2": [0, 1, 2, 3, 4, 5, 6], - "3": [0, 1, 2, 4, 5], - "4": [2, 3, 4, 5] - }, - "2023": { - "-1": [2113011], - "1": [1, 2], - "2": [1, 2, 3, 4], - "3": [1, 2] - } -} \ No newline at end of file diff --git a/Config/ChessRogueMapGen.json b/Config/ChessRogueMapGen.json deleted file mode 100644 index a81cb25d..00000000 --- a/Config/ChessRogueMapGen.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "211": { - "EntranceId": 8020701, - "Groups": [ - 8, - 3, - 9, - 121, - 1, - 2, - 7 - ], - "CellGroup": {} - }, - "222": { - "EntranceId": 8020901, - "Groups": [ - 28, - 27, - 26, - 22, - 1, - 23, - 21, - 20, - 24 - ] - }, - "122": { - "EntranceId": 8020401, - "Groups": [ - 9, - 8, - 7, - 6, - 2, - 5, - 4, - 1, - 3 - ] - }, - "300": { - "EntranceId": 8020201, - "Groups": [ - 9, - 1, - 6, - 3, - 8, - 2 - ] - } -} \ No newline at end of file diff --git a/Config/ChessRogueRoomGen.json b/Config/ChessRogueRoomGen.json index b73ff551..b186e768 100644 --- a/Config/ChessRogueRoomGen.json +++ b/Config/ChessRogueRoomGen.json @@ -1,244 +1,1581 @@ -{ - "2110312": { - "PosX": "3.9519", - "PosY": "0.91", - "PosZ": "11.9593", - "RotY": "28.994", - "Groups": [ - 14, - 13, - 15, - 113, - 112, - 114, - 116, - 115 - ] - }, - "2110813": { - "PosX": "7.955", - "PosY": "0.2231", - "PosZ": "9.751", - "RotY": "18", - "Groups": [ - 36, - 35, - 37 - ] - }, - "2110812": { - "PosX": "-0.7129", - "PosY": "0.5235", - "PosZ": "-6.419", - "RotY": "18", - "Groups": [ - 33, - 32, - 34 - ] - }, - "2110815": { - "PosX": "4.295", - "PosY": "-0.1095", - "PosZ": "-0.8019", - "RotY": "0", - "Groups": [ - 103, - 102, - 105 - ] - }, - "2110731": { - "PosX": "1.139", - "PosY": "0.0433", - "PosZ": "4.693", - "RotY": "9", - "Groups": [ - 27, - 26, - 79 - ] - }, - "2110712": { - "PosX": "1.139", - "PosY": "0.0433", - "PosZ": "4.693", - "RotY": "9", - "Groups": [ - 27, - 26, - 79 - ] - }, - "2111111": { - "PosX": "1.037", - "PosY": "0.7021", - "PosZ": "-11.743", - "RotY": "18", - "Groups": [ - 11, +[ + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterBoss", + "AnchorGroup": 11, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ 10, + 11 + ], + "DefaultLoadGroup": [ 12 ] }, - "2111531": { - "PosX": "1.037", - "PosY": "0.7021", - "PosZ": "-11.743", - "RotY": "18", - "Groups": [ - 11, - 52, - 10 - ] - }, - "2110231": { - "PosX": "3.752", - "PosY": "0.7006", - "PosZ": "-10.3568", - "RotY": "9", - "Groups": [ + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Respite", + "AnchorGroup": 14, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ 13, - 14, + 14 + ], + "DefaultLoadGroup": [ 15 ] }, - "2111734": { - "PosX": "1.139", - "PosY": "0.0433", - "PosZ": "4.6930", - "RotY": "9", - "Groups": [ - 27, - 26, - 79 + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterNormal", + "AnchorGroup": 17, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 16, + 17 + ], + "DefaultLoadGroup": [ + 18 + ], + "SubMonsterGroup": [ + 19 ] }, - "2220312": { - "PosX": "-7.905", - "PosY": "5.3253", - "PosZ": "10.417", - "RotY": "0", - "Groups": [ - 80, - 79, - 81, - 83, - 82 - ] - }, - "1220312": { - "PosX": "-6.773", - "PosY": "1.1393", - "PosZ": "15.5779", - "RotY": "21.8443", - "Groups": [ - 47, - 46, - 48, - 50, - 49 - ] - }, - "2110101": { - "PosX": "7.869", - "PosY": "0.2231", - "PosZ": "7.377", - "Groups": [ - 35, - 85 - ] - }, - "2110817": { - "PosX": "7.955", - "PosY": "0.2231", - "PosZ": "9.751", - "RotY": "18", - "Groups": [ - 140, - 35, - 36 - ] - }, - "2110818": { - "PosX": "7.869", - "PosY": "0.2231", - "PosZ": "7.377", - "RotY": "0", - "Groups": [ - 35, - 85 - ] - }, - "2111718": { - "PosX": "-3.835", - "PosY": "0.5562", - "PosZ": "-10.865", - "RotY": "9", - "Groups": [ - 139, - 138, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Event", + "AnchorGroup": 72, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ 16, 72 + ], + "DefaultLoadGroup": [ + 73 + ], + "DoubleEventLoadGroup": [ + 135, + 136 + ], + "SelectEventLoadGroup": [ + 137, + 138, + 139 ] }, - "3000221": { - "PosX": "2.1924", - "PosY": "8.0286", - "PosZ": "9.92", - "RotY": "27", - "Groups": [ - 17, - 7, - 15, - 16 + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterNormal", + "AnchorGroup": 21, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 20, + 21 + ], + "DefaultLoadGroup": [ + 22 ] }, - "3000825": { - "PosX": "9.3488", - "PosY": "7.8661", - "PosZ": "14.0126", - "RotY": "27", - "Groups": [ - 7, - 69, - 64, - 68 + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Event", + "AnchorGroup": 21, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 20, + 21 + ], + "DefaultLoadGroup": [ + 76 ] }, - "3000722": { - "PosX": "9.809", - "PosY": "7.4171", - "PosZ": "11.675", - "RotY": "18", - "Groups": [ - 7, - 41, - 39, - 40 - ] - }, - "3001624": { - "PosX": "6.6691", - "PosY": "7.8661", - "PosZ": "14.0126", - "RotY": "9", - "Groups": [ - 7, - 66, - 65, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Empty", + "AnchorGroup": 64, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 20, 64 ] }, - "3000325": { - "PosX": "12.599", - "PosY": "8.0482", - "PosZ": "10.119", - "Groups": [ - 7, - 32, - 34, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterNormal", + "AnchorGroup": 108, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 107, + 108 + ], + "DefaultLoadGroup": [ + 109 + ], + "SubMonsterGroup": [ + 110, + 111 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterNormal", + "AnchorGroup": 24, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 23, + 24 + ], + "DefaultLoadGroup": [ + 25 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Trade", + "AnchorGroup": 57, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 23, + 57 + ], + "DefaultLoadGroup": [ + 58, + 95 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterNormal", + "AnchorGroup": 27, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 26, + 27 + ], + "DefaultLoadGroup": [ + 28 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Event", + "AnchorGroup": 27, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 26, + 27 + ], + "DefaultLoadGroup": [ + 79 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Event", + "AnchorGroup": 30, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 29, + 30 + ], + "DefaultLoadGroup": [ 31 ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterElite", + "AnchorGroup": 61, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 29, + 61 + ], + "DefaultLoadGroup": [ + 62 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Empty", + "AnchorGroup": 89, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 29, + 89 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Trade", + "AnchorGroup": 53, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 32, + 53 + ], + "DefaultLoadGroup": [ + 54, + 96 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Event", + "AnchorGroup": 33, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 32, + 33 + ], + "DefaultLoadGroup": [ + 34 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterNormal", + "AnchorGroup": 36, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 35, + 36 + ], + "DefaultLoadGroup": [ + 84 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Event", + "AnchorGroup": 36, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 35, + 36 + ], + "DefaultLoadGroup": [ + 37 + ], + "DoubleEventLoadGroup": [ + 140, + 141 + ], + "SelectEventLoadGroup": [ + 142, + 143, + 144 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterElite", + "AnchorGroup": 55, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 35, + 55 + ], + "DefaultLoadGroup": [ + 56 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Empty", + "AnchorGroup": 85, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 35, + 85 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterNormal", + "AnchorGroup": 43, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 42, + 43 + ], + "DefaultLoadGroup": [ + 44 + ], + "SubMonsterGroup": [ + 46, + 45 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterNormal", + "AnchorGroup": 48, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 47, + 48 + ], + "DefaultLoadGroup": [ + 49 + ], + "SubMonsterGroup": [ + 50, + 51 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterNormal", + "AnchorGroup": 113, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 112, + 113 + ], + "DefaultLoadGroup": [ + 114 + ], + "SubMonsterGroup": [ + 115, + 116 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Trade", + "AnchorGroup": 118, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 117, + 118 + ], + "DefaultLoadGroup": [ + 119, + 120 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterNormal", + "AnchorGroup": 78, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 77, + 78 + ], + "DefaultLoadGroup": [ + 80 + ], + "SubMonsterGroup": [ + 83 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Empty", + "AnchorGroup": 104, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 102, + 104 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "Event", + "AnchorGroup": 103, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 102, + 103 + ], + "DefaultLoadGroup": [ + 105 + ] + }, + { + "EntranceId": 8020701, + "RoomPrefix": 211, + "BlockType": "MonsterNormal", + "AnchorGroup": 103, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 102, + 103 + ], + "DefaultLoadGroup": [ + 106 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterBoss", + "AnchorGroup": 30, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 29, + 30 + ], + "DefaultLoadGroup": [ + 31 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Respite", + "AnchorGroup": 34, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 33, + 34 + ], + "DefaultLoadGroup": [ + 35 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Trade", + "AnchorGroup": 38, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 37, + 38 + ], + "DefaultLoadGroup": [ + 39, + 92 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Trade", + "AnchorGroup": 41, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 40, + 41 + ], + "DefaultLoadGroup": [ + 42, + 93 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Trade", + "AnchorGroup": 98, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 97, + 98 + ], + "DefaultLoadGroup": [ + 101, + 100 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterElite", + "AnchorGroup": 44, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 43, + 44 + ], + "DefaultLoadGroup": [ + 45 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Event", + "AnchorGroup": 47, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 43, + 47 + ], + "DefaultLoadGroup": [ + 46 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterNormal", + "AnchorGroup": 48, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 43, + 48 + ], + "DefaultLoadGroup": [ + 50 + ], + "SubMonsterGroup": [ + 51 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Empty", + "AnchorGroup": 49, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 43, + 49 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Event", + "AnchorGroup": 55, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 52, + 55 + ], + "DefaultLoadGroup": [ + 56 + ], + "DoubleEventLoadGroup": [ + 102, + 103 + ], + "SelectEventLoadGroup": [ + 104, + 105, + 106 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterNormal", + "AnchorGroup": 55, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 52, + 55 + ], + "DefaultLoadGroup": [ + 54 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterNormal", + "AnchorGroup": 57, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 52, + 57 + ], + "DefaultLoadGroup": [ + 58 + ], + "SubMonsterGroup": [ + 59 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Empty", + "AnchorGroup": 60, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 52, + 60 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterElite", + "AnchorGroup": 63, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 62, + 63 + ], + "DefaultLoadGroup": [ + 65 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Empty", + "AnchorGroup": 64, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 62, + 64 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterNormal", + "AnchorGroup": 70, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 69, + 70 + ], + "DefaultLoadGroup": [ + 73 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Event", + "AnchorGroup": 70, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 69, + 70 + ], + "DefaultLoadGroup": [ + 72 + ], + "DoubleEventLoadGroup": [ + 107, + 108 + ], + "SelectEventLoadGroup": [ + 109, + 110, + 111 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Empty", + "AnchorGroup": 71, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 69, + 71 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterNormal", + "AnchorGroup": 75, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 74, + 75 + ], + "DefaultLoadGroup": [ + 76 + ], + "SubMonsterGroup": [ + 77, + 78 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterNormal", + "AnchorGroup": 80, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 79, + 80 + ], + "DefaultLoadGroup": [ + 81 + ], + "SubMonsterGroup": [ + 82, + 83 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterNormal", + "AnchorGroup": 85, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 84, + 85 + ], + "DefaultLoadGroup": [ + 87 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Event", + "AnchorGroup": 85, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 84, + 85 + ], + "DefaultLoadGroup": [ + 86 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterNormal", + "AnchorGroup": 89, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 88, + 89 + ], + "DefaultLoadGroup": [ + 91 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "Event", + "AnchorGroup": 89, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 88, + 89 + ], + "DefaultLoadGroup": [ + 90 + ] + }, + { + "EntranceId": 8020901, + "RoomPrefix": 222, + "BlockType": "MonsterNormal", + "AnchorGroup": 95, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 94, + 95 + ], + "DefaultLoadGroup": [ + 96 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Respite", + "AnchorGroup": 11, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 21, + 11 + ], + "DefaultLoadGroup": [ + 12 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Event", + "AnchorGroup": 13, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 20, + 13 + ], + "DefaultLoadGroup": [ + 14 + ], + "DoubleEventLoadGroup": [ + 92, + 93 + ], + "SelectEventLoadGroup": [ + 94, + 95, + 96 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 13, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 20, + 13 + ], + "DefaultLoadGroup": [ + 75 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterElite", + "AnchorGroup": 58, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 20, + 58 + ], + "DefaultLoadGroup": [ + 59 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Event", + "AnchorGroup": 15, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 17, + 15 + ], + "DefaultLoadGroup": [ + 66 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 15, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 17, + 15 + ], + "DefaultLoadGroup": [ + 16 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 65, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 17, + 65 + ], + "DefaultLoadGroup": [ + 67 + ], + "SubMonsterGroup": [ + 68 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Event", + "AnchorGroup": 23, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 22, + 23 + ], + "DefaultLoadGroup": [ + 24 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 23, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 22, + 23 + ], + "DefaultLoadGroup": [ + 69 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Event", + "AnchorGroup": 82, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 81, + 82 + ], + "DefaultLoadGroup": [ + 83 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 82, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 81, + 82 + ], + "DefaultLoadGroup": [ + 84 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterBoss", + "AnchorGroup": 32, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 31, + 32 + ], + "DefaultLoadGroup": [ + 33 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 35, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 34, + 35 + ], + "DefaultLoadGroup": [ + 36 + ], + "SubMonsterGroup": [ + 37 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 70, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 34, + 70 + ], + "DefaultLoadGroup": [ + 72 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Event", + "AnchorGroup": 70, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 34, + 70 + ], + "DefaultLoadGroup": [ + 71 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 39, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 38, + 39 + ], + "DefaultLoadGroup": [ + 40 + ], + "SubMonsterGroup": [ + 41, + 42 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Empty", + "AnchorGroup": 76, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 43, + 76 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Event", + "AnchorGroup": 44, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 43, + 44 + ], + "DefaultLoadGroup": [ + 45 + ], + "DoubleEventLoadGroup": [ + 97, + 98 + ], + "SelectEventLoadGroup": [ + 99, + 100, + 101 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Trade", + "AnchorGroup": 62, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 43, + 62 + ], + "DefaultLoadGroup": [ + 63, + 77 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterElite", + "AnchorGroup": 60, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 43, + 60 + ], + "DefaultLoadGroup": [ + 61 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 47, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 46, + 47 + ], + "DefaultLoadGroup": [ + 48 + ], + "SubMonsterGroup": [ + 49, + 50 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 52, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 51, + 52 + ], + "DefaultLoadGroup": [ + 53 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 73, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 51, + 73 + ], + "DefaultLoadGroup": [ + 79 + ], + "SubMonsterGroup": [ + 80 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Empty", + "AnchorGroup": 74, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 51, + 74 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Trade", + "AnchorGroup": 55, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 54, + 55 + ], + "DefaultLoadGroup": [ + 56, + 78 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "Empty", + "AnchorGroup": 64, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 54, + 64 + ] + }, + { + "EntranceId": 8020401, + "RoomPrefix": 122, + "BlockType": "MonsterNormal", + "AnchorGroup": 88, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 54, + 88 + ], + "DefaultLoadGroup": [ + 89 + ], + "SubMonsterGroup": [ + 90 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterBoss", + "AnchorGroup": 13, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 12, + 13 + ], + "DefaultLoadGroup": [ + 53 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Respite", + "AnchorGroup": 16, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 15, + 16 + ], + "DefaultLoadGroup": [ + 17 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Trade", + "AnchorGroup": 19, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 18, + 19 + ], + "DefaultLoadGroup": [ + 20, + 73 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterNormal", + "AnchorGroup": 22, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 21, + 22 + ], + "DefaultLoadGroup": [ + 23 + ], + "SubMonsterGroup": [ + 24, + 25 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterNormal", + "AnchorGroup": 27, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 26, + 27 + ], + "DefaultLoadGroup": [ + 28 + ], + "SubMonsterGroup": [ + 29, + 30 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Event", + "AnchorGroup": 32, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 31, + 32 + ], + "DefaultLoadGroup": [ + 33 + ], + "DoubleEventLoadGroup": [ + 75, + 76 + ], + "SelectEventLoadGroup": [ + 77, + 78, + 79 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterNormal", + "AnchorGroup": 32, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 31, + 32 + ], + "DefaultLoadGroup": [ + 34 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterNormal", + "AnchorGroup": 59, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 31, + 59 + ], + "DefaultLoadGroup": [ + 60 + ], + "SubMonsterGroup": [ + 61 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Empty", + "AnchorGroup": 36, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 31, + 36 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterElite", + "AnchorGroup": 37, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 31, + 37 + ], + "DefaultLoadGroup": [ + 38 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Event", + "AnchorGroup": 40, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 39, + 40 + ], + "DefaultLoadGroup": [ + 41 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterNormal", + "AnchorGroup": 40, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 39, + 40 + ], + "DefaultLoadGroup": [ + 42 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Empty", + "AnchorGroup": 43, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 39, + 43 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterNormal", + "AnchorGroup": 44, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 39, + 44 + ], + "DefaultLoadGroup": [ + 54 + ], + "SubMonsterGroup": [ + 55 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Event", + "AnchorGroup": 47, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 46, + 47 + ], + "DefaultLoadGroup": [ + 48 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterNormal", + "AnchorGroup": 47, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 46, + 47 + ], + "DefaultLoadGroup": [ + 49 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Event", + "AnchorGroup": 62, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 46, + 62 + ], + "DefaultLoadGroup": [ + 80 + ], + "DoubleEventLoadGroup": [ + 81, + 82 + ], + "SelectEventLoadGroup": [ + 83, + 84 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterNormal", + "AnchorGroup": 62, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 46, + 62 + ], + "DefaultLoadGroup": [ + 63 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Empty", + "AnchorGroup": 50, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 46, + 50 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterElite", + "AnchorGroup": 51, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 46, + 51 + ], + "DefaultLoadGroup": [ + 52 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Trade", + "AnchorGroup": 57, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 56, + 57 + ], + "DefaultLoadGroup": [ + 58, + 74 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Event", + "AnchorGroup": 65, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 64, + 65 + ], + "DefaultLoadGroup": [ + 66 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "MonsterNormal", + "AnchorGroup": 65, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 64, + 65 + ], + "DefaultLoadGroup": [ + 67 + ] + }, + { + "EntranceId": 8020201, + "RoomPrefix": 300, + "BlockType": "Event", + "AnchorGroup": 68, + "AnchorId": 1, + "DefaultLoadBasicGroup": [ + 64, + 68 + ], + "DefaultLoadGroup": [ + 69 + ] } -} \ No newline at end of file +] \ No newline at end of file diff --git a/GameServer/Game/ChessRogue/Cell/ChessRogueCellInstance.cs b/GameServer/Game/ChessRogue/Cell/ChessRogueCellInstance.cs index e56b0f22..748c6526 100644 --- a/GameServer/Game/ChessRogue/Cell/ChessRogueCellInstance.cs +++ b/GameServer/Game/ChessRogue/Cell/ChessRogueCellInstance.cs @@ -15,7 +15,7 @@ namespace EggLink.DanhengServer.Game.ChessRogue.Cell { public class ChessRogueCellInstance { - public int CellType { get; set; } + public RogueDLCBlockTypeEnum CellType { get; set; } public int PosY { get; set; } public int PosX { get; set; } public int CellId { get; set; } @@ -25,7 +25,6 @@ namespace EggLink.DanhengServer.Game.ChessRogue.Cell public ChessRogueInstance Instance { get; set; } public ChessRogueBoardCellStatus CellStatus { get; set; } = ChessRogueBoardCellStatus.Idle; public ChessRogueRoomConfig? RoomConfig { get; set; } - public ChessRogueCellConfig? CellConfig { get; set; } public int SelectMonsterId { get; set; } public List SelectedDecayId { get; set; } = []; @@ -36,16 +35,16 @@ namespace EggLink.DanhengServer.Game.ChessRogue.Cell { Instance = instance; Layer = instance.Layers.IndexOf(instance.CurLayer) + 1; - var list = new RandomList(); - list.Add((int)RogueDLCBlockTypeEnum.MonsterNormal, 8); - list.Add((int)RogueDLCBlockTypeEnum.Reward, 4); - list.Add((int)RogueDLCBlockTypeEnum.Event, 6); - list.Add((int)RogueDLCBlockTypeEnum.NousSpecialEvent, 4); - list.Add((int)RogueDLCBlockTypeEnum.NousEvent, 2); + var list = new RandomList(); + list.Add(RogueDLCBlockTypeEnum.MonsterNormal, 8); + list.Add(RogueDLCBlockTypeEnum.Reward, 4); + list.Add(RogueDLCBlockTypeEnum.Event, 6); + list.Add(RogueDLCBlockTypeEnum.NousSpecialEvent, 4); + list.Add(RogueDLCBlockTypeEnum.NousEvent, 2); if (item.BlockTypeList.Count > 0) { - CellType = (int)item.BlockTypeList.RandomElement(); + CellType = item.BlockTypeList.RandomElement(); } else { @@ -55,7 +54,7 @@ namespace EggLink.DanhengServer.Game.ChessRogue.Cell public void Init() { - if (CellType == 11) + if (CellType == RogueDLCBlockTypeEnum.MonsterBoss) { // boss if (Layer == 1) @@ -105,7 +104,7 @@ namespace EggLink.DanhengServer.Game.ChessRogue.Cell }); } } - else if (CellType == 15) + else if (CellType == RogueDLCBlockTypeEnum.MonsterNousBoss || CellType == RogueDLCBlockTypeEnum.MonsterSwarmBoss) { // last boss CellAdvanceInfo.Add(new ChessRogueCellAdvanceInfo() @@ -151,31 +150,20 @@ namespace EggLink.DanhengServer.Game.ChessRogue.Cell public int GetEntryId() { - List mapList = []; - foreach (var cell in GameData.ChessRogueCellGenData) + if (RoomConfig == null) { - var cellType = int.Parse(cell.Key.ToString().Substring(3, 2)); - if (cellType != CellType) continue; - - var mapId = int.Parse(cell.Key.ToString()[..3]); - mapList.SafeAdd(mapId); - } - - MapId = mapList.RandomElement(); - RoomConfig = GameData.ChessRogueRoomGenData[MapId]; - - var randomList = new List(); - foreach (var key in GameData.ChessRogueCellGenData.Keys) - { - if (key.ToString().StartsWith($"{MapId * 100 + CellType}")) + var pool = GameData.ChessRogueRoomData[CellType].FindAll(x => x.EntranceId == Instance.LayerMap).ToList(); + RoomConfig = pool.RandomElement(); + if (Instance.FirstEnterBattle && CellType == RogueDLCBlockTypeEnum.MonsterNormal) { - randomList.Add(key); + do + { + RoomConfig = pool.RandomElement(); + } while (RoomConfig.SubMonsterGroup.Count == 0); // make sure the room has sub monster + Instance.FirstEnterBattle = false; } + RoomId = RoomConfig.RoomPrefix * 10000 + (int) CellType * 100 + Random.Shared.Next(1, 10); // find a better way to generate room id } - - RoomId = randomList.RandomElement(); - CellConfig = GameData.ChessRogueCellGenData[RoomId]; - return RoomConfig.EntranceId; } @@ -187,12 +175,9 @@ namespace EggLink.DanhengServer.Game.ChessRogue.Cell public List GetLoadGroupList() { var groupList = new List(); - if (RoomConfig!.CellGroup.TryGetValue(CellType, out ChessRogueRoom? value)) - { - groupList.AddRange(value.Groups); - } - groupList.AddRange(CellConfig?.Groups ?? []); - groupList.AddRange(RoomConfig.Groups); + groupList.AddRange(RoomConfig!.DefaultLoadBasicGroup); + groupList.AddRange(RoomConfig.DefaultLoadGroup); + groupList.AddRange(RoomConfig.SubMonsterGroup); return groupList; } diff --git a/GameServer/Game/ChessRogue/Cell/ChessRogueEntityLoader.cs b/GameServer/Game/ChessRogue/Cell/ChessRogueEntityLoader.cs index ad3ef3d8..68b0d3d2 100644 --- a/GameServer/Game/ChessRogue/Cell/ChessRogueEntityLoader.cs +++ b/GameServer/Game/ChessRogue/Cell/ChessRogueEntityLoader.cs @@ -11,6 +11,8 @@ using System.Text; using System.Threading.Tasks; using EggLink.DanhengServer.Game.Rogue; using EggLink.DanhengServer.Util; +using EggLink.DanhengServer.Enums.Rogue; +using EggLink.DanhengServer.Data.Excel; namespace EggLink.DanhengServer.Game.ChessRogue.Cell { @@ -32,6 +34,10 @@ namespace EggLink.DanhengServer.Game.ChessRogue.Cell { LoadGroup(group); } + else if (group.Category == GroupCategoryEnum.Normal) + { + LoadGroup(group); + } } Scene.IsLoaded = true; } @@ -89,20 +95,33 @@ namespace EggLink.DanhengServer.Game.ChessRogue.Cell var room = instance.CurCell; if (room == null) return null; int monsterId; - + RogueMonsterExcel? rogueMonster; if (room.SelectMonsterId > 0) { monsterId = room.SelectMonsterId; + + GameData.RogueMonsterData.TryGetValue(monsterId * 10 + 1, out rogueMonster); + if (rogueMonster == null) return null; } else { - GameData.ChessRogueContentGenData.TryGetValue(group.Id, out var content); - if (content == null) return null; - monsterId = content.RandomElement(); - } + List allowedRank = []; + if (room.CellType == RogueDLCBlockTypeEnum.MonsterElite) + { + allowedRank.Add(MonsterRankEnum.Elite); + } else + { + allowedRank.Add(MonsterRankEnum.Minion); + allowedRank.Add(MonsterRankEnum.MinionLv2); + } - GameData.RogueMonsterData.TryGetValue(monsterId * 10 + 1, out var rogueMonster); - if (rogueMonster == null) return null; + NPCMonsterDataExcel? data; + do + { + rogueMonster = GameData.RogueMonsterData.Values.ToList().RandomElement(); + GameData.NpcMonsterDataData.TryGetValue(rogueMonster.NpcMonsterID, out data); + } while (data == null || !allowedRank.Contains(data.Rank)); + } GameData.NpcMonsterDataData.TryGetValue(rogueMonster.NpcMonsterID, out var excel); if (excel == null) return null; @@ -132,10 +151,10 @@ namespace EggLink.DanhengServer.Game.ChessRogue.Cell { prop.SetState(PropStateEnum.CustomState02); prop.IsChessRogue = true; - if (instance.CurCell!.CellType == 11 || instance.CurCell.CellType == 15) + if (instance.CurCell!.CellType == RogueDLCBlockTypeEnum.MonsterBoss || instance.CurCell.CellType == RogueDLCBlockTypeEnum.MonsterNousBoss || instance.CurCell.CellType == RogueDLCBlockTypeEnum.MonsterSwarmBoss) { prop.SetState(PropStateEnum.CustomState04); - if (instance.CurCell!.CellType == 11) + if (instance.CurCell!.CellType != RogueDLCBlockTypeEnum.MonsterBoss) { prop.IsLastRoom = true; } diff --git a/GameServer/Game/ChessRogue/ChessRogueInstance.cs b/GameServer/Game/ChessRogue/ChessRogueInstance.cs index 29aa9a96..b38bfeca 100644 --- a/GameServer/Game/ChessRogue/ChessRogueInstance.cs +++ b/GameServer/Game/ChessRogue/ChessRogueInstance.cs @@ -1,5 +1,6 @@ using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Data.Excel; +using EggLink.DanhengServer.Enums.Rogue; using EggLink.DanhengServer.Game.Battle; using EggLink.DanhengServer.Game.ChessRogue.Cell; using EggLink.DanhengServer.Game.ChessRogue.Dice; @@ -32,6 +33,9 @@ namespace EggLink.DanhengServer.Game.ChessRogue public RogueDLCChessBoardExcel? CurBoardExcel { get; set; } public ChessRogueLevelStatusType CurLevelStatus { get; set; } = ChessRogueLevelStatusType.ChessRogueLevelProcessing; + public bool FirstEnterBattle { get; set; } = true; + public int LayerMap { get; set; } = 0; + public int ActionPoint { get; set; } = 15; public List DisableAeonIds { get; set; } = []; @@ -78,7 +82,7 @@ namespace EggLink.DanhengServer.Game.ChessRogue public override void RollBuff(int amount) { - if (CurCell!.CellType == 11) + if (CurCell!.CellType == RogueDLCBlockTypeEnum.MonsterBoss) { RollBuff(amount, 100003, 2); // boss room RollMiracle(1); @@ -183,6 +187,10 @@ namespace EggLink.DanhengServer.Game.ChessRogue public void GenerateLayer() { var level = Layers.IndexOf(CurLayer) + 1; + FirstEnterBattle = true; + + LayerMap = GameConstants.AllowedChessRogueEntranceId.RandomElement(); + if (RogueVersionId == 201) { CurBoardExcel = GameData.RogueSwarmChessBoardData[level].RandomElement(); @@ -235,15 +243,7 @@ namespace EggLink.DanhengServer.Game.ChessRogue CurCell = cell; cell.CellStatus = ChessRogueBoardCellStatus.Finish; - Player.EnterScene(cell.GetEntryId(), 0, false); - Player.MoveTo(new EntityMotion() - { - Motion = new() - { - Rot = cell.CellConfig!.ToRotation().ToProto(), - Pos = cell.CellConfig!.ToPosition().ToProto(), - } - }); + Player.EnterMissionScene(cell.GetEntryId(), cell.RoomConfig!.AnchorGroup, cell.RoomConfig!.AnchorId, false); HistoryCell.Add(cell); @@ -380,12 +380,12 @@ namespace EggLink.DanhengServer.Game.ChessRogue CalculateDifficulty(battle); - if (CurCell!.CellType == 15) + if (CurCell!.CellType == RogueDLCBlockTypeEnum.MonsterNousBoss || CurCell!.CellType == RogueDLCBlockTypeEnum.MonsterSwarmBoss) { var buffList = new List(); foreach (var buff in BossBuff) { - if (buff.EffectType == Enums.Rogue.BossDecayEffectTypeEnum.AddMazeBuffList) + if (buff.EffectType == BossDecayEffectTypeEnum.AddMazeBuffList) { buffList.SafeAddRange(buff.EffectParamList); // add buff } else @@ -478,11 +478,11 @@ namespace EggLink.DanhengServer.Game.ChessRogue RollBuff(battle.Stages.Count); - if (CurCell!.CellType == 11) + if (CurCell!.CellType == RogueDLCBlockTypeEnum.MonsterBoss) { Player.SendPacket(new PacketChessRogueLayerAccountInfoNotify(this)); } - else if (CurCell!.CellType == 15) + else if (CurCell!.CellType == RogueDLCBlockTypeEnum.MonsterNousBoss || CurCell!.CellType == RogueDLCBlockTypeEnum.MonsterSwarmBoss) { CurLevelStatus = ChessRogueLevelStatusType.ChessRogueLevelFinish; Player.SendPacket(new PacketChessRogueLayerAccountInfoNotify(this)); diff --git a/GameServer/Game/Rogue/Event/RogueEventManager.cs b/GameServer/Game/Rogue/Event/RogueEventManager.cs index d3a76df5..a32e6f3b 100644 --- a/GameServer/Game/Rogue/Event/RogueEventManager.cs +++ b/GameServer/Game/Rogue/Event/RogueEventManager.cs @@ -1,6 +1,7 @@ using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Enums.Rogue; using EggLink.DanhengServer.Game.Player; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Rogue; using EggLink.DanhengServer.Server.Packet.Send.Rogue; using Google.Protobuf.WellKnownTypes; using System; @@ -156,6 +157,7 @@ namespace EggLink.DanhengServer.Game.Rogue.Event } // send rsp + Player.SendPacket(new PacketSyncRogueCommonDialogueOptionFinishScNotify(eventInstance)); Player.SendPacket(new PacketSelectRogueCommonDialogueOptionScRsp(eventInstance)); } } diff --git a/GameServer/Server/Packet/Send/Rogue/PacketSyncRogueCommonDialogueOptionFinishScNotify.cs b/GameServer/Server/Packet/Send/Rogue/PacketSyncRogueCommonDialogueOptionFinishScNotify.cs new file mode 100644 index 00000000..0d553afd --- /dev/null +++ b/GameServer/Server/Packet/Send/Rogue/PacketSyncRogueCommonDialogueOptionFinishScNotify.cs @@ -0,0 +1,27 @@ +using EggLink.DanhengServer.Game.Rogue.Event; +using EggLink.DanhengServer.Proto; +using EggLink.DanhengServer.Server.Packet; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Rogue +{ + public class PacketSyncRogueCommonDialogueOptionFinishScNotify : BasePacket + { + public PacketSyncRogueCommonDialogueOptionFinishScNotify(RogueEventInstance instance) : base(CmdIds.SyncRogueCommonDialogueOptionFinishScNotify) + { + var proto = new SyncRogueCommonDialogueOptionFinishScNotify() + { + DialogueData = instance.ToProto(), + EventUniqueId = (uint)instance.EventUniqueId, + OptionId = (uint)instance.SelectedOptionId, + ResultOptionInfo = instance.Options.Find(o => o.OptionId == instance.SelectedOptionId)!.ToProto() + }; + + SetData(proto); + } + } +} diff --git a/Program/Handbook/HandbookGenerator.cs b/Program/Handbook/HandbookGenerator.cs index ed34c61e..322ce944 100644 --- a/Program/Handbook/HandbookGenerator.cs +++ b/Program/Handbook/HandbookGenerator.cs @@ -1,4 +1,5 @@ using EggLink.DanhengServer.Data; +using EggLink.DanhengServer.Internationalization; using EggLink.DanhengServer.Program; using EggLink.DanhengServer.Util; using Newtonsoft.Json; @@ -83,8 +84,8 @@ namespace EggLink.DanhengServer.Handbook foreach (var cmd in EntryPoint.CommandManager.CommandInfo) { builder.Append("Command: " + cmd.Key); - builder.Append(" --- Description: " + cmd.Value.Description); - builder.Append(" --- Usage: " + cmd.Value.Usage); + builder.Append(" --- Description: " + I18nManager.Translate(cmd.Value.Description)); + builder.Append(" --- Usage: " + I18nManager.Translate(cmd.Value.Usage)); builder.AppendLine(); } }