From 65dac31a1aaf697aa7a2d0e055bf2bdd8f3b634f Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 5 Jul 2024 15:43:04 -0400 Subject: [PATCH] Add support for extra/hard stages --- .../Msgs/Campaign/GetCampaignField.cs | 5 ++- nksrv/LobbyServer/Msgs/Campaign/ObtainItem.cs | 11 ++++++- nksrv/LobbyServer/Msgs/Stage/ClearStage.cs | 32 ++++++++++++++++--- nksrv/LobbyServer/Msgs/Stage/GetStage.cs | 14 ++++---- nksrv/StaticInfo/JsonStaticData.cs | 4 +++ nksrv/Utils/JsonDb.cs | 25 ++++++++++++++- 6 files changed, 76 insertions(+), 15 deletions(-) diff --git a/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs b/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs index a28a42f..30a0d84 100644 --- a/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs +++ b/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs @@ -17,11 +17,11 @@ namespace nksrv.LobbyServer.Msgs.Campaign { var req = await ReadData(); var user = GetUser(); - + Console.WriteLine("Map ID: " + req.MapId); var response = new ResGetCampaignFieldData(); - response.Field = GetStage.CreateFieldInfo(user, StaticDataParser.Instance.GetNormalChapterNumberFromFieldName(req.MapId)); + response.Field = GetStage.CreateFieldInfo(user, StaticDataParser.Instance.GetNormalChapterNumberFromFieldName(req.MapId), req.MapId.Contains("hard") ? "Hard" : "Normal"); // todo save this data response.Team = new NetUserTeamData() { LastContentsTeamNumber = 1, Type = 1 }; @@ -51,7 +51,6 @@ namespace nksrv.LobbyServer.Msgs.Campaign response.Json = resultingJson; - WriteData(response); } } diff --git a/nksrv/LobbyServer/Msgs/Campaign/ObtainItem.cs b/nksrv/LobbyServer/Msgs/Campaign/ObtainItem.cs index 53d8479..1da7586 100644 --- a/nksrv/LobbyServer/Msgs/Campaign/ObtainItem.cs +++ b/nksrv/LobbyServer/Msgs/Campaign/ObtainItem.cs @@ -1,4 +1,5 @@ -using nksrv.Utils; +using nksrv.StaticInfo; +using nksrv.Utils; using System; using System.Collections.Generic; using System.Linq; @@ -17,8 +18,16 @@ namespace nksrv.LobbyServer.Msgs.Campaign var response = new ResObtainCampaignItem(); + var chapter = StaticDataParser.Instance.GetNormalChapterNumberFromFieldName(req.MapId); + var mod = req.MapId.Contains("hard") ? "Hard" : "Normal"; + var key = chapter + "_" + mod; + var field = user.FieldInfo[key]; + // TODO response.Reward = new(); + + + WriteData(response); } diff --git a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs index d7ef864..3cad8ac 100644 --- a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs +++ b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs @@ -30,7 +30,7 @@ namespace nksrv.LobbyServer.Msgs.Stage if (user.FieldInfo.Count == 0) { - user.FieldInfo.Add(0, new FieldInfo() { }); + user.FieldInfo.Add("0_" + clearedStage.chapter_mod, new FieldInfo() { }); } DoQuestSpecificUserOperations(user, req.StageId); @@ -41,8 +41,32 @@ namespace nksrv.LobbyServer.Msgs.Stage else Logger.Warn("rewardId is null for stage " + req.StageId); - user.LastNormalStageCleared = req.StageId; - user.FieldInfo[clearedStage.chapter_id - 1].CompletedStages.Add(new NetFieldStageData() { StageId = req.StageId }); + + if (clearedStage.stage_category == "Normal" || clearedStage.stage_category == "Boss") + { + if (clearedStage.chapter_mod == "Hard") + { + user.LastHardStageCleared = req.StageId; + } + else if (clearedStage.chapter_mod == "Normal") + { + user.LastNormalStageCleared = req.StageId; + } + else + { + Logger.Warn("Unknown chapter mod " + clearedStage.chapter_mod); + } + } + else if (clearedStage.stage_category == "Extra") + { + + } + else + { + Logger.Warn("Unknown stage category " + clearedStage.stage_category); + } + + user.FieldInfo[(clearedStage.chapter_id - 1) + "_" + clearedStage.chapter_mod].CompletedStages.Add(new NetFieldStageData() { StageId = req.StageId }); JsonDb.Save(); } @@ -132,7 +156,7 @@ namespace nksrv.LobbyServer.Msgs.Stage Count = 1, Tid = item.reward_id }); - } + } } } else diff --git a/nksrv/LobbyServer/Msgs/Stage/GetStage.cs b/nksrv/LobbyServer/Msgs/Stage/GetStage.cs index 9641c18..0f59785 100644 --- a/nksrv/LobbyServer/Msgs/Stage/GetStage.cs +++ b/nksrv/LobbyServer/Msgs/Stage/GetStage.cs @@ -19,7 +19,8 @@ namespace nksrv.LobbyServer.Msgs.Stage var user = GetUser(); var response = new ResGetStageData(); - response.Field = CreateFieldInfo(user, req.Chapter - 1); + + response.Field = CreateFieldInfo(user, req.Chapter - 1, req.Mod == 0 ? "Normal" : "Hard"); response.HasChapterBossEntered = true; @@ -28,13 +29,14 @@ namespace nksrv.LobbyServer.Msgs.Stage WriteData(response); } - public static NetFieldObjectData CreateFieldInfo(Utils.User user, int chapter) + public static NetFieldObjectData CreateFieldInfo(Utils.User user, int chapter, string mod) { var f = new NetFieldObjectData(); bool found = false; + string key = chapter + "_" + mod; foreach (var item in user.FieldInfo) { - if (item.Key == chapter) + if (item.Key == key) { found = true; foreach (var stage in item.Value.CompletedStages) @@ -47,10 +49,10 @@ namespace nksrv.LobbyServer.Msgs.Stage if (!found) { - Console.WriteLine("chapter not found: " + chapter); + Console.WriteLine("chapter not found: " + key); - user.FieldInfo.Add(chapter, new FieldInfo()); - return CreateFieldInfo(user, chapter); + user.FieldInfo.Add(key, new FieldInfo()); + return CreateFieldInfo(user, chapter, mod); } return f; diff --git a/nksrv/StaticInfo/JsonStaticData.cs b/nksrv/StaticInfo/JsonStaticData.cs index 11a50e6..2cb8b5b 100644 --- a/nksrv/StaticInfo/JsonStaticData.cs +++ b/nksrv/StaticInfo/JsonStaticData.cs @@ -22,6 +22,10 @@ namespace nksrv.StaticInfo public int chapter_id; public string stage_category = ""; public int reward_id = 0; + /// + /// Can be Normal or Hard + /// + public string chapter_mod = ""; } public class RewardTableRecord { diff --git a/nksrv/Utils/JsonDb.cs b/nksrv/Utils/JsonDb.cs index 358c836..e57c8ab 100644 --- a/nksrv/Utils/JsonDb.cs +++ b/nksrv/Utils/JsonDb.cs @@ -69,7 +69,7 @@ namespace nksrv.Utils // Game data public List CompletedScenarios = []; - public Dictionary FieldInfo = []; + public Dictionary FieldInfo = []; public Dictionary MapJson = []; public Dictionary Currency = new() { { CurrencyType.ContentStamina, 2 }, @@ -110,6 +110,7 @@ namespace nksrv.Utils } public class CoreInfo { + public int DbVersion = 0; public List Users = []; public List LauncherAccessTokens = []; @@ -137,6 +138,28 @@ namespace nksrv.Utils if (j != null) { Instance = j; + + if (Instance.DbVersion == 0) + { + Instance.DbVersion = 1; + // In older versions, field info key used chapter number, but now difficultly is appened. + Console.WriteLine("Starting database update..."); + + foreach (var user in Instance.Users) + { + foreach (var f in user.FieldInfo.ToList()) + { + var isNumeric = int.TryParse(f.Key, out int n); + if (isNumeric) + { + var val = f.Value; + user.FieldInfo.Remove(f.Key); + user.FieldInfo.Add(n + "_Normal", val); + } + } + } + Console.WriteLine("Database update completed"); + } Save(); } else