diff --git a/ProtobufViewUtil/Program.cs b/ProtobufViewUtil/Program.cs
new file mode 100644
index 0000000..2fa5574
--- /dev/null
+++ b/ProtobufViewUtil/Program.cs
@@ -0,0 +1,30 @@
+using Google.Protobuf;
+using nksrv;
+using System.Diagnostics;
+
+namespace ProtobufViewUtil
+{
+ internal class Program
+ {
+ static void Main(string[] args)
+ {
+ Console.WriteLine("Hello, World!");
+
+ ResGetScenarioList s = new ResGetScenarioList();
+ var inn = File.ReadAllBytes(@"C:\NIKKE\NIKKE\game\ses1\output-49");
+ s.MergeFrom(inn);
+ Console.WriteLine(s.ToString());
+ var outt = s.ToByteArray();
+
+ if (inn.SequenceEqual(outt))
+ {
+ Console.WriteLine("Check OK");
+ }
+ else
+ {
+ Console.WriteLine("Check FAIL");
+ }
+ Debugger.Break();
+ }
+ }
+}
diff --git a/ProtobufViewUtil/ProtobufViewUtil.csproj b/ProtobufViewUtil/ProtobufViewUtil.csproj
new file mode 100644
index 0000000..653c21b
--- /dev/null
+++ b/ProtobufViewUtil/ProtobufViewUtil.csproj
@@ -0,0 +1,22 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ProtobufViewUtil/doimport.proto b/ProtobufViewUtil/doimport.proto
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/ProtobufViewUtil/doimport.proto
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/nksrv.sln b/nksrv.sln
index 97b13f6..62226a8 100644
--- a/nksrv.sln
+++ b/nksrv.sln
@@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "nksrv", "nksrv\nksrv.csproj
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataFixupUtil", "DataFixupUtil\DataFixupUtil.csproj", "{13124DFB-448B-4F4F-A479-537EE067D836}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtobufViewUtil", "ProtobufViewUtil\ProtobufViewUtil.csproj", "{FDEDD0D6-9C02-4E58-8110-04E8D5639881}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -41,6 +43,18 @@ Global
{13124DFB-448B-4F4F-A479-537EE067D836}.Release|x64.Build.0 = Release|Any CPU
{13124DFB-448B-4F4F-A479-537EE067D836}.Release|x86.ActiveCfg = Release|Any CPU
{13124DFB-448B-4F4F-A479-537EE067D836}.Release|x86.Build.0 = Release|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|x64.Build.0 = Debug|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Debug|x86.Build.0 = Debug|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|x64.ActiveCfg = Release|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|x64.Build.0 = Release|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|x86.ActiveCfg = Release|Any CPU
+ {FDEDD0D6-9C02-4E58-8110-04E8D5639881}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs b/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs
index 4c4deee..ae1c8f1 100644
--- a/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs
+++ b/nksrv/LobbyServer/Msgs/Campaign/GetCampaignField.cs
@@ -12,9 +12,29 @@ namespace nksrv.LobbyServer.Msgs.Campaign
{
protected override async Task HandleAsync()
{
- var req = ReadData();
+ var req = await ReadData();
+ var user = GetUser();
+
+ Console.WriteLine("Map ID: " + req.MapId);
var response = new ResGetCampaignFieldData();
+ response.Field = new NetFieldObjectData();
+
+ // todo save this data
+ response.Team = new NetUserTeamData() { LastContentsTeamNumber = 1, Type = 1 };
+
+ string resultingJson;
+ if (!user.MapJson.ContainsKey(req.MapId))
+ {
+ resultingJson = "{\"_mapID\":\"" + req.MapId + "\",\"_triggerDataList\":[],\"_interactionActionTriggerDataList\":[],\"_interactionObjectDataList\":[],\"_questObjectDataList\":[],\"_togglePortalDataList\":[],\"_squadDataList\":[{\"UniqueKey\":\"a365d3ab-2961-4eb8-940b-f68629957b48\",\"IsValid\":true,\"TeamType\":1,\"Number\":1,\"Position\":{\"x\":-14.899999618530274,\"y\":0.08333173394203186,\"z\":-3.2200000286102297}}]}";
+ user.MapJson.Add(req.MapId, resultingJson);
+ }
+ else
+ {
+ resultingJson = user.MapJson[req.MapId];
+ }
+
+
WriteData(response);
}
}
diff --git a/nksrv/LobbyServer/Msgs/Campaign/SaveField.cs b/nksrv/LobbyServer/Msgs/Campaign/SaveField.cs
new file mode 100644
index 0000000..c3f018e
--- /dev/null
+++ b/nksrv/LobbyServer/Msgs/Campaign/SaveField.cs
@@ -0,0 +1,33 @@
+using nksrv.Utils;
+
+namespace nksrv.LobbyServer.Msgs.Campaign
+{
+ [PacketPath("/campaign/savefield")]
+ public class SaveField : LobbyMsgHandler
+ {
+ protected override async Task HandleAsync()
+ {
+ var req = await ReadData();
+ var user = GetUser();
+
+ Console.WriteLine("Map ID: " + req.MapId);
+
+ var response = new ResGetFieldTalkList();
+
+ Console.WriteLine($"todo save {req.MapId} with {req.Json}");
+
+ if (!user.MapJson.ContainsKey(req.MapId))
+ {
+ user.MapJson.Add(req.MapId, req.Json);
+ }
+ else
+ {
+ user.MapJson[req.MapId] = req.Json;
+ }
+
+
+
+ WriteData(response);
+ }
+ }
+}
diff --git a/nksrv/LobbyServer/Msgs/Stage/CheckCleared.cs b/nksrv/LobbyServer/Msgs/Stage/CheckCleared.cs
new file mode 100644
index 0000000..bbf1b81
--- /dev/null
+++ b/nksrv/LobbyServer/Msgs/Stage/CheckCleared.cs
@@ -0,0 +1,39 @@
+using nksrv.Utils;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace nksrv.LobbyServer.Msgs.Stage
+{
+ [PacketPath("/stage/checkclear")]
+ public class CheckCleared : LobbyMsgHandler
+ {
+ protected override async Task HandleAsync()
+ {
+ var req = await ReadData();
+
+ var response = new ResCheckStageClear();
+ var user = GetUser();
+
+ foreach (var stageIds in req.StageIds)
+ {
+ foreach (var fields in user.FieldInfo)
+ {
+ foreach (var stages in fields.Value.CompletedStages)
+ {
+ if (stages.StageId == stageIds)
+ {
+ response.ClearedStageIds.Add(stages.StageId);
+ }
+ }
+ }
+ }
+
+
+ WriteData(response);
+ }
+ }
+
+}
diff --git a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs
index 3cd4727..babec63 100644
--- a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs
+++ b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs
@@ -15,13 +15,22 @@ namespace nksrv.LobbyServer.Msgs.Stage
var req = await ReadData();
var response = new ResClearStage();
+ var user = GetUser();
// TOOD: save to user info
Console.WriteLine($"Stage " + req.StageId + " completed, result is " + req.BattleResult);
if (req.BattleResult == 1)
{
- GetUser().LastStageCleared = req.StageId;
+ user.LastStageCleared = req.StageId;
+
+ if (user.FieldInfo.Count == 0)
+ {
+ user.FieldInfo.Add(0, new FieldInfo() { });
+ }
+
+ // TODO: figure out how stageid corresponds to chapter
+ user.FieldInfo[0].CompletedStages.Add(new NetFieldStageData() { StageId = req.StageId });
JsonDb.Save();
}
diff --git a/nksrv/LobbyServer/Msgs/Stage/GetStage.cs b/nksrv/LobbyServer/Msgs/Stage/GetStage.cs
index a2acb3d..09d83aa 100644
--- a/nksrv/LobbyServer/Msgs/Stage/GetStage.cs
+++ b/nksrv/LobbyServer/Msgs/Stage/GetStage.cs
@@ -12,9 +12,41 @@ namespace nksrv.LobbyServer.Msgs.Stage
{
protected override async Task HandleAsync()
{
- var req = ReadData();
+ var req = await ReadData();
+ var user = GetUser();
var response = new ResGetStageData();
+ response.Field = new NetFieldObjectData();
+
+ // locate chapter
+ bool found = false;
+
+ retry:
+ foreach (var item in user.FieldInfo)
+ {
+ if (item.Key == req.Chapter)
+ {
+ found = true;
+ foreach (var stage in item.Value.CompletedStages)
+ {
+ response.Field.Stages.Add(stage);
+ }
+ response.HasChapterBossEntered = item.Value.BossEntered;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ Console.WriteLine("chapter not found: " + req.Chapter);
+
+ user.FieldInfo.Add(req.Chapter, new FieldInfo());
+ goto retry;
+ }
+
+
+ response.SquadData = "";
+
WriteData(response);
}
diff --git a/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs b/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs
index 4a77f30..4ec5393 100644
--- a/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs
+++ b/nksrv/LobbyServer/Msgs/System/CheckClientVersion.cs
@@ -8,10 +8,10 @@ namespace nksrv.LobbyServer.Msgs.System
protected override async Task HandleAsync()
{
var req = await ReadData();
- var r = new CheckVersionResponse();
- r.Availability = 0; // None = 0, Available = 1, Mandatory = 2
+ var response = new CheckVersionResponse();
+ response.Availability = 0; // None = 0, Available = 1, Mandatory = 2
- WriteData(r);
+ WriteData(response);
}
}
}
diff --git a/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs b/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs
index 9ee4517..d624931 100644
--- a/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs
+++ b/nksrv/LobbyServer/Msgs/Team/GetTeamData.cs
@@ -18,7 +18,7 @@ namespace nksrv.LobbyServer.Msgs.Team
// TODO: assume that team data did not change
var resp = new ResGetTeamData();
//resp.TypeTeams
- WriteData(req);
+ WriteData(resp);
}
}
}
diff --git a/nksrv/LobbyServer/Msgs/User/GetFieldTalkList.cs b/nksrv/LobbyServer/Msgs/User/GetFieldTalkList.cs
new file mode 100644
index 0000000..d8220a6
--- /dev/null
+++ b/nksrv/LobbyServer/Msgs/User/GetFieldTalkList.cs
@@ -0,0 +1,24 @@
+using nksrv.Utils;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace nksrv.LobbyServer.Msgs.User
+{
+ [PacketPath("/user/getfieldtalklist")]
+ public class GetFieldTalkList : LobbyMsgHandler
+ {
+ protected override async Task HandleAsync()
+ {
+ var req = await ReadData();
+ var user = GetUser();
+
+ var response = new ResGetFieldTalkList();
+ // TODO
+
+ WriteData(response);
+ }
+ }
+}
diff --git a/nksrv/LobbyServer/Msgs/User/GetScenarioList.cs b/nksrv/LobbyServer/Msgs/User/GetScenarioList.cs
new file mode 100644
index 0000000..5f582a7
--- /dev/null
+++ b/nksrv/LobbyServer/Msgs/User/GetScenarioList.cs
@@ -0,0 +1,30 @@
+using nksrv.Utils;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace nksrv.LobbyServer.Msgs.User
+{
+ [PacketPath("/User/GetScenarioList")]
+ public class GetScenarioList : LobbyMsgHandler
+ {
+ protected override async Task HandleAsync()
+ {
+ var req = await ReadData();
+ var user = GetUser();
+
+ // todo what are bookmark scenarios?
+
+ // this returns a list of scenarios that user has completed
+ var response = new ResGetScenarioList();
+ foreach (var item in user.CompletedScenarios)
+ {
+ response.ScenarioList.Add(item);
+ }
+
+ WriteData(response);
+ }
+ }
+}
diff --git a/nksrv/Protos/allmsgs.proto b/nksrv/Protos/allmsgs.proto
index 142f67a..8c46f5e 100644
--- a/nksrv/Protos/allmsgs.proto
+++ b/nksrv/Protos/allmsgs.proto
@@ -753,7 +753,7 @@ message ReqGetCampaignFieldData {
message ResGetCampaignFieldData {
NetFieldObjectData field = 2;
NetUserTeamData team = 3;
- NetCampaignTeamPosition teamPositions = 4;
+ repeated NetCampaignTeamPosition teamPositions = 4;
string json = 5;
}
@@ -965,4 +965,33 @@ message NetSubQuestData {
message ResGetSubQuestList {
repeated NetSubQuestData subquestList = 2;
+}
+
+message ReqCheckStageClear {
+ repeated int32 stageIds = 1;
+}
+message ResCheckStageClear {
+ repeated int32 clearedStageIds = 2;
+}
+
+message ReqGetScenarioList {
+
+}
+message ResGetScenarioList {
+ repeated string scenarioList = 2;
+ repeated string bookmarkScenarioList = 3;
+}
+
+message ReqSaveCampaignField{
+ string mapId = 2;
+ string json = 3;
+}
+
+message ResSaveCampaignField{
+
+}
+
+message ReqGetFieldTalkList {}
+message ResGetFieldTalkList {
+ repeated string fieldTalkList = 2;
}
\ No newline at end of file
diff --git a/nksrv/Utils/JsonDb.cs b/nksrv/Utils/JsonDb.cs
index d04c156..26506ef 100644
--- a/nksrv/Utils/JsonDb.cs
+++ b/nksrv/Utils/JsonDb.cs
@@ -16,6 +16,18 @@ namespace nksrv.Utils
public long ExpirationTime;
public ulong UserID;
}
+ public class NetworkPosition
+ {
+ public float x;
+ public float y;
+ public float z;
+ }
+ public class FieldInfo
+ {
+ public List CompletedStages = new();
+ public bool BossEntered = false;
+ public NetworkPosition teamPosition = new();
+ }
public class User
{
// User info
@@ -28,7 +40,9 @@ namespace nksrv.Utils
// Game data
- public List CompletedScenarios = new List();
+ public List CompletedScenarios = new();
+ public Dictionary FieldInfo = new();
+ public Dictionary MapJson = new();
}
public class CoreInfo
{