Fix XP, outpost level working, completestages also completes scenarios now

This commit is contained in:
Mikhail
2024-07-18 11:29:40 -04:00
parent fcf9396b86
commit 6ed393714f
4 changed files with 66 additions and 14 deletions

View File

@@ -1,12 +1,6 @@
using nksrv.Net; using nksrv.StaticInfo;
using nksrv.StaticInfo;
using nksrv.Utils; using nksrv.Utils;
using Swan.Logging; using Swan.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace nksrv.LobbyServer.Msgs.Stage 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 response = new ResClearStage();
var clearedStage = StaticDataParser.Instance.GetStageData(StageId); var clearedStage = StaticDataParser.Instance.GetStageData(StageId);
@@ -47,6 +41,19 @@ namespace nksrv.LobbyServer.Msgs.Stage
DoQuestSpecificUserOperations(user, StageId); DoQuestSpecificUserOperations(user, StageId);
var rewardData = StaticDataParser.Instance.GetRewardTableEntry(clearedStage.reward_id); 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) if (rewardData != null)
response.StageClearReward = RegisterRewardsForUser(user, rewardData); response.StageClearReward = RegisterRewardsForUser(user, rewardData);
else else
@@ -77,6 +84,26 @@ namespace nksrv.LobbyServer.Msgs.Stage
Logger.Warn("Unknown stage category " + clearedStage.stage_category); 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; var key = (clearedStage.chapter_id - 1) + "_" + clearedStage.chapter_mod;
if (!user.FieldInfoNew.ContainsKey(key)) if (!user.FieldInfoNew.ContainsKey(key))
user.FieldInfoNew.Add(key, new FieldInfoNew()); user.FieldInfoNew.Add(key, new FieldInfoNew());
@@ -96,23 +123,25 @@ namespace nksrv.LobbyServer.Msgs.Stage
var newXp = rewardData.user_exp + user.userPointData.ExperiencePoint; var newXp = rewardData.user_exp + user.userPointData.ExperiencePoint;
var oldXpData = StaticDataParser.Instance.GetUserLevelFromUserExp(user.userPointData.ExperiencePoint); var oldXpData = StaticDataParser.Instance.GetUserLevelFromUserExp(user.userPointData.ExperiencePoint);
var xpData = StaticDataParser.Instance.GetUserLevelFromUserExp(newXp); var newLevelExp = StaticDataParser.Instance.GetUserMinXpForLevel(user.userPointData.UserLevel + 1);
var newLevel = xpData.Item1; var newLevel = user.userPointData.UserLevel;
if (newLevel == -1) if (newLevelExp == -1)
{ {
Logger.Warn("Unknown user level value for xp " + newXp); Logger.Warn("Unknown user level value for xp " + newXp);
} }
while (newXp >= newLevelExp)
if (newLevel > user.userPointData.UserLevel)
{ {
newLevel++;
newXp -= oldXpData.Item2; newXp -= oldXpData.Item2;
if (user.Currency.ContainsKey(CurrencyType.FreeCash)) if (user.Currency.ContainsKey(CurrencyType.FreeCash))
user.Currency[CurrencyType.FreeCash] += 30; user.Currency[CurrencyType.FreeCash] += 30;
else else
user.Currency.Add(CurrencyType.FreeCash, 30); user.Currency.Add(CurrencyType.FreeCash, 30);
newLevelExp = StaticDataParser.Instance.GetUserMinXpForLevel(newLevel + 1);
} }

View File

@@ -196,7 +196,7 @@ namespace nksrv
if (!user.IsStageCompleted(item, true)) if (!user.IsStageCompleted(item, true))
{ {
Console.WriteLine("Completing stage " + item); Console.WriteLine("Completing stage " + item);
ClearStage.CompleteStage(user, item); ClearStage.CompleteStage(user, item, true);
} }
if (i == chapterNumber && target == stageNumber) if (i == chapterNumber && target == stageNumber)

View File

@@ -27,6 +27,8 @@ namespace nksrv.StaticInfo
/// </summary> /// </summary>
public string chapter_mod = ""; public string chapter_mod = "";
public string stage_type = ""; public string stage_type = "";
public string enter_scenario = "";
public string exit_scenario = "";
} }
public class RewardTableRecord public class RewardTableRecord
{ {

View File

@@ -393,6 +393,27 @@ namespace nksrv.StaticInfo
} }
return (-1, -1); 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<int>();
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<int>();
return expValue;
}
}
return -1;
}
public int GetNormalChapterNumberFromFieldName(string field) public int GetNormalChapterNumberFromFieldName(string field)
{ {
foreach (JObject item in chapterCampaignData) foreach (JObject item in chapterCampaignData)