Add support for extra/hard stages

This commit is contained in:
Mikhail
2024-07-05 15:43:04 -04:00
parent d08c293cd4
commit 65dac31a1a
6 changed files with 76 additions and 15 deletions

View File

@@ -17,11 +17,11 @@ namespace nksrv.LobbyServer.Msgs.Campaign
{ {
var req = await ReadData<ReqGetCampaignFieldData>(); var req = await ReadData<ReqGetCampaignFieldData>();
var user = GetUser(); var user = GetUser();
Console.WriteLine("Map ID: " + req.MapId); Console.WriteLine("Map ID: " + req.MapId);
var response = new ResGetCampaignFieldData(); 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 // todo save this data
response.Team = new NetUserTeamData() { LastContentsTeamNumber = 1, Type = 1 }; response.Team = new NetUserTeamData() { LastContentsTeamNumber = 1, Type = 1 };
@@ -51,7 +51,6 @@ namespace nksrv.LobbyServer.Msgs.Campaign
response.Json = resultingJson; response.Json = resultingJson;
WriteData(response); WriteData(response);
} }
} }

View File

@@ -1,4 +1,5 @@
using nksrv.Utils; using nksrv.StaticInfo;
using nksrv.Utils;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -17,8 +18,16 @@ namespace nksrv.LobbyServer.Msgs.Campaign
var response = new ResObtainCampaignItem(); 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 // TODO
response.Reward = new(); response.Reward = new();
WriteData(response); WriteData(response);
} }

View File

@@ -30,7 +30,7 @@ namespace nksrv.LobbyServer.Msgs.Stage
if (user.FieldInfo.Count == 0) if (user.FieldInfo.Count == 0)
{ {
user.FieldInfo.Add(0, new FieldInfo() { }); user.FieldInfo.Add("0_" + clearedStage.chapter_mod, new FieldInfo() { });
} }
DoQuestSpecificUserOperations(user, req.StageId); DoQuestSpecificUserOperations(user, req.StageId);
@@ -41,8 +41,32 @@ namespace nksrv.LobbyServer.Msgs.Stage
else else
Logger.Warn("rewardId is null for stage " + req.StageId); 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(); JsonDb.Save();
} }
@@ -132,7 +156,7 @@ namespace nksrv.LobbyServer.Msgs.Stage
Count = 1, Count = 1,
Tid = item.reward_id Tid = item.reward_id
}); });
} }
} }
} }
else else

View File

@@ -19,7 +19,8 @@ namespace nksrv.LobbyServer.Msgs.Stage
var user = GetUser(); var user = GetUser();
var response = new ResGetStageData(); 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; response.HasChapterBossEntered = true;
@@ -28,13 +29,14 @@ namespace nksrv.LobbyServer.Msgs.Stage
WriteData(response); 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(); var f = new NetFieldObjectData();
bool found = false; bool found = false;
string key = chapter + "_" + mod;
foreach (var item in user.FieldInfo) foreach (var item in user.FieldInfo)
{ {
if (item.Key == chapter) if (item.Key == key)
{ {
found = true; found = true;
foreach (var stage in item.Value.CompletedStages) foreach (var stage in item.Value.CompletedStages)
@@ -47,10 +49,10 @@ namespace nksrv.LobbyServer.Msgs.Stage
if (!found) if (!found)
{ {
Console.WriteLine("chapter not found: " + chapter); Console.WriteLine("chapter not found: " + key);
user.FieldInfo.Add(chapter, new FieldInfo()); user.FieldInfo.Add(key, new FieldInfo());
return CreateFieldInfo(user, chapter); return CreateFieldInfo(user, chapter, mod);
} }
return f; return f;

View File

@@ -22,6 +22,10 @@ namespace nksrv.StaticInfo
public int chapter_id; public int chapter_id;
public string stage_category = ""; public string stage_category = "";
public int reward_id = 0; public int reward_id = 0;
/// <summary>
/// Can be Normal or Hard
/// </summary>
public string chapter_mod = "";
} }
public class RewardTableRecord public class RewardTableRecord
{ {

View File

@@ -69,7 +69,7 @@ namespace nksrv.Utils
// Game data // Game data
public List<string> CompletedScenarios = []; public List<string> CompletedScenarios = [];
public Dictionary<int, FieldInfo> FieldInfo = []; public Dictionary<string, FieldInfo> FieldInfo = [];
public Dictionary<string, string> MapJson = []; public Dictionary<string, string> MapJson = [];
public Dictionary<CurrencyType, long> Currency = new() { public Dictionary<CurrencyType, long> Currency = new() {
{ CurrencyType.ContentStamina, 2 }, { CurrencyType.ContentStamina, 2 },
@@ -110,6 +110,7 @@ namespace nksrv.Utils
} }
public class CoreInfo public class CoreInfo
{ {
public int DbVersion = 0;
public List<User> Users = []; public List<User> Users = [];
public List<AccessToken> LauncherAccessTokens = []; public List<AccessToken> LauncherAccessTokens = [];
@@ -137,6 +138,28 @@ namespace nksrv.Utils
if (j != null) if (j != null)
{ {
Instance = j; 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(); Save();
} }
else else