From 6ed393714fcba1da7d27403629d4e7ac32421d41 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 18 Jul 2024 11:29:40 -0400 Subject: [PATCH] Fix XP, outpost level working, completestages also completes scenarios now --- nksrv/LobbyServer/Msgs/Stage/ClearStage.cs | 55 +++++++++++++++++----- nksrv/Program.cs | 2 +- nksrv/StaticInfo/JsonStaticData.cs | 2 + nksrv/StaticInfo/StaticDataParser.cs | 21 +++++++++ 4 files changed, 66 insertions(+), 14 deletions(-) diff --git a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs index 685cbce..0587023 100644 --- a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs +++ b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs @@ -1,12 +1,6 @@ -using nksrv.Net; -using nksrv.StaticInfo; +using nksrv.StaticInfo; using nksrv.Utils; using Swan.Logging; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace nksrv.LobbyServer.Msgs.Stage { @@ -32,7 +26,7 @@ namespace nksrv.LobbyServer.Msgs.Stage } - public static ResClearStage CompleteStage(Utils.User user, int StageId) + public static ResClearStage CompleteStage(Utils.User user, int StageId, bool forceCompleteScenarios = false) { var response = new ResClearStage(); var clearedStage = StaticDataParser.Instance.GetStageData(StageId); @@ -47,6 +41,19 @@ namespace nksrv.LobbyServer.Msgs.Stage DoQuestSpecificUserOperations(user, StageId); var rewardData = StaticDataParser.Instance.GetRewardTableEntry(clearedStage.reward_id); + + if (forceCompleteScenarios) + { + if (!user.CompletedScenarios.Contains(clearedStage.enter_scenario) && !string.IsNullOrEmpty(clearedStage.enter_scenario) && !string.IsNullOrWhiteSpace(clearedStage.enter_scenario)) + { + user.CompletedScenarios.Add(clearedStage.enter_scenario); + } + if (!user.CompletedScenarios.Contains(clearedStage.exit_scenario) && !string.IsNullOrEmpty(clearedStage.exit_scenario) && !string.IsNullOrWhiteSpace(clearedStage.exit_scenario)) + { + user.CompletedScenarios.Add(clearedStage.exit_scenario); + } + } + if (rewardData != null) response.StageClearReward = RegisterRewardsForUser(user, rewardData); else @@ -77,6 +84,26 @@ namespace nksrv.LobbyServer.Msgs.Stage Logger.Warn("Unknown stage category " + clearedStage.stage_category); } + if (clearedStage.stage_type != "Sub") + { + // add outpost reward level if unlocked + if (user.IsStageCompleted(6002016, true)) + { + user.OutpostBattleLevel.Exp++; + if (user.OutpostBattleLevel.Exp >= 5) + { + user.OutpostBattleLevel.Exp = 0; + user.OutpostBattleLevel.Level++; + response.OutpostBattle = new NetOutpostBattleLevel() { IsLevelUp = true, Exp = 0, Level = user.OutpostBattleLevel.Level }; + user.AddCurrency(CurrencyType.FreeCash, 100); // todo is reward the same for all level upgrades + } + else + { + response.OutpostBattle = new NetOutpostBattleLevel() { IsLevelUp = false, Exp = user.OutpostBattleLevel.Exp, Level = user.OutpostBattleLevel.Level }; + } + } + } + var key = (clearedStage.chapter_id - 1) + "_" + clearedStage.chapter_mod; if (!user.FieldInfoNew.ContainsKey(key)) user.FieldInfoNew.Add(key, new FieldInfoNew()); @@ -96,23 +123,25 @@ namespace nksrv.LobbyServer.Msgs.Stage var newXp = rewardData.user_exp + user.userPointData.ExperiencePoint; var oldXpData = StaticDataParser.Instance.GetUserLevelFromUserExp(user.userPointData.ExperiencePoint); - var xpData = StaticDataParser.Instance.GetUserLevelFromUserExp(newXp); - var newLevel = xpData.Item1; + var newLevelExp = StaticDataParser.Instance.GetUserMinXpForLevel(user.userPointData.UserLevel + 1); + var newLevel = user.userPointData.UserLevel; - if (newLevel == -1) + if (newLevelExp == -1) { Logger.Warn("Unknown user level value for xp " + newXp); } - - if (newLevel > user.userPointData.UserLevel) + while (newXp >= newLevelExp) { + newLevel++; newXp -= oldXpData.Item2; if (user.Currency.ContainsKey(CurrencyType.FreeCash)) user.Currency[CurrencyType.FreeCash] += 30; else user.Currency.Add(CurrencyType.FreeCash, 30); + + newLevelExp = StaticDataParser.Instance.GetUserMinXpForLevel(newLevel + 1); } diff --git a/nksrv/Program.cs b/nksrv/Program.cs index 58e7a7c..6da8cd6 100644 --- a/nksrv/Program.cs +++ b/nksrv/Program.cs @@ -196,7 +196,7 @@ namespace nksrv if (!user.IsStageCompleted(item, true)) { Console.WriteLine("Completing stage " + item); - ClearStage.CompleteStage(user, item); + ClearStage.CompleteStage(user, item, true); } if (i == chapterNumber && target == stageNumber) diff --git a/nksrv/StaticInfo/JsonStaticData.cs b/nksrv/StaticInfo/JsonStaticData.cs index ed02434..eeb4a28 100644 --- a/nksrv/StaticInfo/JsonStaticData.cs +++ b/nksrv/StaticInfo/JsonStaticData.cs @@ -27,6 +27,8 @@ namespace nksrv.StaticInfo /// public string chapter_mod = ""; public string stage_type = ""; + public string enter_scenario = ""; + public string exit_scenario = ""; } public class RewardTableRecord { diff --git a/nksrv/StaticInfo/StaticDataParser.cs b/nksrv/StaticInfo/StaticDataParser.cs index 53829ac..b0cc9e2 100644 --- a/nksrv/StaticInfo/StaticDataParser.cs +++ b/nksrv/StaticInfo/StaticDataParser.cs @@ -393,6 +393,27 @@ namespace nksrv.StaticInfo } return (-1, -1); } + public int GetUserMinXpForLevel(int targetLevel) + { + for (int i = 0; i < userExpDataRecords.Count; i++) + { + var item = userExpDataRecords[i]; + + var level = item["level"]; + if (level == null) throw new Exception("expected level field in user exp table data"); + + int levelValue = level.ToObject(); + if (targetLevel == levelValue) + { + var exp = item["exp"]; + if (exp == null) throw new Exception("expected exp field in user exp table data"); + + int expValue = exp.ToObject(); + return expValue; + } + } + return -1; + } public int GetNormalChapterNumberFromFieldName(string field) { foreach (JObject item in chapterCampaignData)