diff --git a/README.md b/README.md
index ab1846a..e1d3330 100644
--- a/README.md
+++ b/README.md
@@ -33,8 +33,7 @@ To access the admin panel, go to https://127.0.0.1/admin/ and sign in. Note that
To skip stages, a basic command line interface is implemented.
-## Progress
-Stage, character, outpost and story information is saved and works, as well as player nickname.
+## Screenshots
@@ -50,6 +49,8 @@ Stage, character, outpost and story information is saved and works, as well as p
- [X] Open Archives UI
- [X] Inventory system
- [X] Character level up
+ - [X] Side story
+ - [X] Archives
- [ ] Skill level up
- [ ] Outpost jukebox / relics saving
- [ ] Field obtain object
@@ -64,7 +65,15 @@ Stage, character, outpost and story information is saved and works, as well as p
- [ ] Lost sector
- [ ] Custom launcher
- [ ] Limit temporary participation
- - [ ] Archives
+
+## What is not working:
+ - Collecting items in campaign
+ - Events
+ - Skill upgrade, limit break
+ - Mission reward, daily/weekly missions
+ - Side quests
+ - Lots of things in the outpost
+ - And a lot more...
## Contributing
Server code structure:
diff --git a/nksrv/AdminApiController.cs b/nksrv/AdminApiController.cs
index 7122929..c0434ca 100644
--- a/nksrv/AdminApiController.cs
+++ b/nksrv/AdminApiController.cs
@@ -1,7 +1,7 @@
using EmbedIO;
using EmbedIO.Routing;
using EmbedIO.WebApi;
-using nksrv.Utils;
+using nksrv.Database;
using System.Security.Cryptography;
using System.Text;
diff --git a/nksrv/Utils/JsonDb.cs b/nksrv/Database/JsonDb.cs
similarity index 96%
rename from nksrv/Utils/JsonDb.cs
rename to nksrv/Database/JsonDb.cs
index 77bb557..528b391 100644
--- a/nksrv/Utils/JsonDb.cs
+++ b/nksrv/Database/JsonDb.cs
@@ -1,9 +1,10 @@
using Newtonsoft.Json;
using nksrv.LobbyServer;
using nksrv.StaticInfo;
+using nksrv.Utils;
using Swan.Logging;
-namespace nksrv.Utils
+namespace nksrv.Database
{
public class AccessToken
{
@@ -107,6 +108,7 @@ namespace nksrv.Utils
public NetOutpostBattleLevel OutpostBattleLevel = new() { Level = 1 };
public int GachaTutorialPlayCount = 0;
public List CompletedTacticAcademyLessons = [];
+ public List CompletedSideStoryStages = new();
// Event data
public Dictionary EventInfo = new();
@@ -213,7 +215,7 @@ namespace nksrv.Utils
{
if (!File.Exists(AppDomain.CurrentDomain.BaseDirectory + "/db.json"))
{
- Logger.Warn("users: warning: configuration not found, writing default data");
+ "users: warning: configuration not found, writing default data".Warn();
Instance = new CoreInfo();
Save();
}
@@ -281,7 +283,7 @@ namespace nksrv.Utils
Save();
ValidateDb();
- Logger.Info("Loaded db");
+ "Loaded db".Info();
}
else
{
@@ -298,7 +300,7 @@ namespace nksrv.Utils
{
if (c.Level > 1000)
{
- Logger.Warn($"Warning: Character level for character {c.Tid} cannot be above 1000, setting to 1000");
+ $"Warning: Character level for character {c.Tid} cannot be above 1000, setting to 1000".Warn();
c.Level = 1000;
}
}
diff --git a/nksrv/IntlServer/IntlAccountRegisterEndpoint.cs b/nksrv/IntlServer/IntlAccountRegisterEndpoint.cs
index 4f4c5d0..11cb67b 100644
--- a/nksrv/IntlServer/IntlAccountRegisterEndpoint.cs
+++ b/nksrv/IntlServer/IntlAccountRegisterEndpoint.cs
@@ -1,5 +1,6 @@
using EmbedIO;
using Newtonsoft.Json;
+using nksrv.Database;
using nksrv.Utils;
using System.Net;
using static nksrv.IntlServer.IntlLogin2Endpoint;
diff --git a/nksrv/IntlServer/IntlHandler.cs b/nksrv/IntlServer/IntlHandler.cs
index f5b98ae..538d611 100644
--- a/nksrv/IntlServer/IntlHandler.cs
+++ b/nksrv/IntlServer/IntlHandler.cs
@@ -1,4 +1,5 @@
using EmbedIO;
+using nksrv.Database;
using nksrv.Utils;
namespace nksrv.IntlServer
diff --git a/nksrv/IntlServer/IntlLogin1Endpoint.cs b/nksrv/IntlServer/IntlLogin1Endpoint.cs
index a6229c9..a91db84 100644
--- a/nksrv/IntlServer/IntlLogin1Endpoint.cs
+++ b/nksrv/IntlServer/IntlLogin1Endpoint.cs
@@ -1,6 +1,6 @@
using EmbedIO;
using Newtonsoft.Json;
-using nksrv.Utils;
+using nksrv.Database;
using System.Net;
using static nksrv.IntlServer.IntlLogin2Endpoint;
diff --git a/nksrv/IntlServer/IntlLogin2Endpoint.cs b/nksrv/IntlServer/IntlLogin2Endpoint.cs
index a7f8cdb..b5608f3 100644
--- a/nksrv/IntlServer/IntlLogin2Endpoint.cs
+++ b/nksrv/IntlServer/IntlLogin2Endpoint.cs
@@ -1,6 +1,6 @@
using EmbedIO;
using Newtonsoft.Json;
-using nksrv.Utils;
+using nksrv.Database;
using System.Net;
namespace nksrv.IntlServer
diff --git a/nksrv/IntlServer/IntlMsgHandler.cs b/nksrv/IntlServer/IntlMsgHandler.cs
index 64429ea..5def769 100644
--- a/nksrv/IntlServer/IntlMsgHandler.cs
+++ b/nksrv/IntlServer/IntlMsgHandler.cs
@@ -1,6 +1,6 @@
using EmbedIO;
using Newtonsoft.Json;
-using nksrv.Utils;
+using nksrv.Database;
using Swan.Logging;
using System.Text;
diff --git a/nksrv/IntlServer/SendCodeEndpoint.cs b/nksrv/IntlServer/SendCodeEndpoint.cs
index 63125fd..5a007c2 100644
--- a/nksrv/IntlServer/SendCodeEndpoint.cs
+++ b/nksrv/IntlServer/SendCodeEndpoint.cs
@@ -1,6 +1,6 @@
using EmbedIO;
using Newtonsoft.Json;
-using nksrv.Utils;
+using nksrv.Database;
using System.Net;
using static nksrv.IntlServer.IntlLogin2Endpoint;
diff --git a/nksrv/LobbyServer/LobbyHandler.cs b/nksrv/LobbyServer/LobbyHandler.cs
index 8da0c38..c5ddc97 100644
--- a/nksrv/LobbyServer/LobbyHandler.cs
+++ b/nksrv/LobbyServer/LobbyHandler.cs
@@ -1,6 +1,7 @@
using ASodium;
using EmbedIO;
using Google.Protobuf;
+using nksrv.Database;
using nksrv.Utils;
using Swan.Logging;
diff --git a/nksrv/LobbyServer/LobbyMsgHandler.cs b/nksrv/LobbyServer/LobbyMsgHandler.cs
index 57766a0..91ad9ba 100644
--- a/nksrv/LobbyServer/LobbyMsgHandler.cs
+++ b/nksrv/LobbyServer/LobbyMsgHandler.cs
@@ -1,5 +1,6 @@
using EmbedIO;
using Google.Protobuf;
+using nksrv.Database;
using nksrv.Utils;
namespace nksrv.LobbyServer
diff --git a/nksrv/LobbyServer/Msgs/Auth/AuthLogout.cs b/nksrv/LobbyServer/Msgs/Auth/AuthLogout.cs
index d40dfb7..11dd376 100644
--- a/nksrv/LobbyServer/Msgs/Auth/AuthLogout.cs
+++ b/nksrv/LobbyServer/Msgs/Auth/AuthLogout.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Auth
{
diff --git a/nksrv/LobbyServer/Msgs/Auth/DoEnterServer.cs b/nksrv/LobbyServer/Msgs/Auth/DoEnterServer.cs
index 67f1983..866242c 100644
--- a/nksrv/LobbyServer/Msgs/Auth/DoEnterServer.cs
+++ b/nksrv/LobbyServer/Msgs/Auth/DoEnterServer.cs
@@ -1,6 +1,7 @@
using EmbedIO;
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
+using nksrv.Database;
using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Auth
diff --git a/nksrv/LobbyServer/Msgs/Campaign/SaveFieldObject.cs b/nksrv/LobbyServer/Msgs/Campaign/SaveFieldObject.cs
index 09d2f6b..f4c9275 100644
--- a/nksrv/LobbyServer/Msgs/Campaign/SaveFieldObject.cs
+++ b/nksrv/LobbyServer/Msgs/Campaign/SaveFieldObject.cs
@@ -1,4 +1,5 @@
-using nksrv.StaticInfo;
+using nksrv.Database;
+using nksrv.StaticInfo;
using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Campaign
diff --git a/nksrv/LobbyServer/Msgs/Character/LevelUp.cs b/nksrv/LobbyServer/Msgs/Character/LevelUp.cs
index 2b5530a..bcbeaa4 100644
--- a/nksrv/LobbyServer/Msgs/Character/LevelUp.cs
+++ b/nksrv/LobbyServer/Msgs/Character/LevelUp.cs
@@ -1,4 +1,5 @@
-using nksrv.StaticInfo;
+using nksrv.Database;
+using nksrv.StaticInfo;
using nksrv.Utils;
using Swan.Logging;
diff --git a/nksrv/LobbyServer/Msgs/Character/SetCharacterCostume.cs b/nksrv/LobbyServer/Msgs/Character/SetCharacterCostume.cs
index 660a968..8f858a1 100644
--- a/nksrv/LobbyServer/Msgs/Character/SetCharacterCostume.cs
+++ b/nksrv/LobbyServer/Msgs/Character/SetCharacterCostume.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Character
{
diff --git a/nksrv/LobbyServer/Msgs/Event/CompleteEventScenario.cs b/nksrv/LobbyServer/Msgs/Event/CompleteEventScenario.cs
index c1d8dfa..5101c9f 100644
--- a/nksrv/LobbyServer/Msgs/Event/CompleteEventScenario.cs
+++ b/nksrv/LobbyServer/Msgs/Event/CompleteEventScenario.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Event
{
diff --git a/nksrv/LobbyServer/Msgs/Event/GetEventScenario.cs b/nksrv/LobbyServer/Msgs/Event/GetEventScenario.cs
index 3d89425..eb11852 100644
--- a/nksrv/LobbyServer/Msgs/Event/GetEventScenario.cs
+++ b/nksrv/LobbyServer/Msgs/Event/GetEventScenario.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Event
{
diff --git a/nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs b/nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs
index 269c42d..7e39b54 100644
--- a/nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs
+++ b/nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs
@@ -1,4 +1,5 @@
-using nksrv.StaticInfo;
+using nksrv.Database;
+using nksrv.StaticInfo;
using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Gacha
@@ -25,7 +26,7 @@ namespace nksrv.LobbyServer.Msgs.Gacha
response.Gacha.Add(new NetGachaEntityData() { Corporation = 1, PieceCount = 1, CurrencyValue = 5, Sn = c, Tid = c, Type = 1 });
response.Characters.Add(new NetUserCharacterDefaultData() { CostumeId = 0, Csn = c, Grade = 0, Lv = 1, Skill1Lv = 1, Skill2Lv = 1, Tid = c, UltiSkillLv = 1 });
- user.Characters.Add(new Utils.Character() { CostumeId = 0, Csn = c, Grade = 0, Level = 1, Skill1Lvl = 1, Skill2Lvl = 1, Tid = c, UltimateLevel = 1 });
+ user.Characters.Add(new Database.Character() { CostumeId = 0, Csn = c, Grade = 0, Level = 1, Skill1Lvl = 1, Skill2Lvl = 1, Tid = c, UltimateLevel = 1 });
}
user.GachaTutorialPlayCount++;
}
diff --git a/nksrv/LobbyServer/Msgs/Inventory/ClearAllEquipment.cs b/nksrv/LobbyServer/Msgs/Inventory/ClearAllEquipment.cs
index 99061c3..a52eebe 100644
--- a/nksrv/LobbyServer/Msgs/Inventory/ClearAllEquipment.cs
+++ b/nksrv/LobbyServer/Msgs/Inventory/ClearAllEquipment.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Inventory
{
diff --git a/nksrv/LobbyServer/Msgs/Inventory/ClearEquipment.cs b/nksrv/LobbyServer/Msgs/Inventory/ClearEquipment.cs
index 554d768..5ba4b56 100644
--- a/nksrv/LobbyServer/Msgs/Inventory/ClearEquipment.cs
+++ b/nksrv/LobbyServer/Msgs/Inventory/ClearEquipment.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Inventory
{
diff --git a/nksrv/LobbyServer/Msgs/Inventory/WearEquipment.cs b/nksrv/LobbyServer/Msgs/Inventory/WearEquipment.cs
index bc0b367..e902ccb 100644
--- a/nksrv/LobbyServer/Msgs/Inventory/WearEquipment.cs
+++ b/nksrv/LobbyServer/Msgs/Inventory/WearEquipment.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Inventory
{
diff --git a/nksrv/LobbyServer/Msgs/Inventory/WearEquipmentList.cs b/nksrv/LobbyServer/Msgs/Inventory/WearEquipmentList.cs
index ddb4135..f06bf00 100644
--- a/nksrv/LobbyServer/Msgs/Inventory/WearEquipmentList.cs
+++ b/nksrv/LobbyServer/Msgs/Inventory/WearEquipmentList.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Inventory
{
diff --git a/nksrv/LobbyServer/Msgs/Sidestory/ClearBattle.cs b/nksrv/LobbyServer/Msgs/Sidestory/ClearBattle.cs
new file mode 100644
index 0000000..a12ca31
--- /dev/null
+++ b/nksrv/LobbyServer/Msgs/Sidestory/ClearBattle.cs
@@ -0,0 +1,21 @@
+using nksrv.Net;
+using nksrv.Utils;
+
+namespace nksrv.LobbyServer.Msgs.Sidestory
+{
+ [PacketPath("/sidestory/cut/clearbattle")]
+ public class ClearBattle : LobbyMsgHandler
+ {
+ protected override async Task HandleAsync()
+ {
+ var req = await ReadData();
+ var user = GetUser();
+
+ var response = new ResClearSideStoryCutForBattle();
+
+ // TODO
+
+ await WriteDataAsync(response);
+ }
+ }
+}
diff --git a/nksrv/LobbyServer/Msgs/Sidestory/ClearSideStoryCut.cs b/nksrv/LobbyServer/Msgs/Sidestory/ClearSideStoryCut.cs
new file mode 100644
index 0000000..452513f
--- /dev/null
+++ b/nksrv/LobbyServer/Msgs/Sidestory/ClearSideStoryCut.cs
@@ -0,0 +1,26 @@
+using nksrv.Net;
+using nksrv.Utils;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace nksrv.LobbyServer.Msgs.Sidestory
+{
+ [PacketPath("/sidestory/cut/clearscenario")]
+ public class ClearSideStoryCut : LobbyMsgHandler
+ {
+ protected override async Task HandleAsync()
+ {
+ var req = await ReadData();
+ var user = GetUser();
+
+ var response = new ResClearSideStoryCutForScenario();
+
+ // TODO
+
+ await WriteDataAsync(response);
+ }
+ }
+}
diff --git a/nksrv/LobbyServer/Msgs/Sidestory/ClearSideStoryStage.cs b/nksrv/LobbyServer/Msgs/Sidestory/ClearSideStoryStage.cs
new file mode 100644
index 0000000..aa9cc41
--- /dev/null
+++ b/nksrv/LobbyServer/Msgs/Sidestory/ClearSideStoryStage.cs
@@ -0,0 +1,45 @@
+using nksrv.Database;
+using nksrv.LobbyServer.Msgs.Stage;
+using nksrv.Net;
+using nksrv.StaticInfo;
+using nksrv.Utils;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace nksrv.LobbyServer.Msgs.Sidestory
+{
+ [PacketPath("/sidestory/stage/clear")]
+ public class ClearSideStoryStage : LobbyMsgHandler
+ {
+ protected override async Task HandleAsync()
+ {
+ var req = await ReadData();
+ var user = GetUser();
+
+ var response = new ResClearSideStoryStage();
+
+ if (!user.CompletedSideStoryStages.Contains(req.SideStoryStageId))
+ {
+ user.CompletedSideStoryStages.Add(req.SideStoryStageId);
+
+ if (StaticDataParser.Instance.SidestoryRewardTable.ContainsKey(req.SideStoryStageId))
+ {
+ var rewardData = StaticDataParser.Instance.GetRewardTableEntry(StaticDataParser.Instance.SidestoryRewardTable[req.SideStoryStageId]);
+
+ if (rewardData != null)
+ response.Reward = ClearStage.RegisterRewardsForUser(user, rewardData);
+ else
+ throw new Exception("failed to find reward");
+ }
+
+ JsonDb.Save();
+ }
+
+
+ await WriteDataAsync(response);
+ }
+ }
+}
diff --git a/nksrv/LobbyServer/Msgs/Sidestory/EnterBattle.cs b/nksrv/LobbyServer/Msgs/Sidestory/EnterBattle.cs
new file mode 100644
index 0000000..7990a78
--- /dev/null
+++ b/nksrv/LobbyServer/Msgs/Sidestory/EnterBattle.cs
@@ -0,0 +1,19 @@
+using nksrv.Net;
+using nksrv.Utils;
+
+namespace nksrv.LobbyServer.Msgs.Sidestory
+{
+ [PacketPath("/sidestory/cut/enterbattle")]
+ public class EnterBattle : LobbyMsgHandler
+ {
+ protected override async Task HandleAsync()
+ {
+ var req = await ReadData();
+ var user = GetUser();
+
+ var response = new ResEnterSideStoryCutForBattle();
+
+ await WriteDataAsync(response);
+ }
+ }
+}
diff --git a/nksrv/LobbyServer/Msgs/Sidestory/EnterSidestoryStage.cs b/nksrv/LobbyServer/Msgs/Sidestory/EnterSidestoryStage.cs
new file mode 100644
index 0000000..74a5261
--- /dev/null
+++ b/nksrv/LobbyServer/Msgs/Sidestory/EnterSidestoryStage.cs
@@ -0,0 +1,26 @@
+using nksrv.Net;
+using nksrv.Utils;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace nksrv.LobbyServer.Msgs.Sidestory
+{
+ [PacketPath("/sidestory/stage/enter")]
+ public class EnterSidestoryStage : LobbyMsgHandler
+ {
+ protected override async Task HandleAsync()
+ {
+ var req = await ReadData();
+ var user = GetUser();
+
+ var response = new ResEnterSideStoryStage();
+
+ // TODO
+
+ await WriteDataAsync(response);
+ }
+ }
+}
diff --git a/nksrv/LobbyServer/Msgs/Sidestory/ListSideStory.cs b/nksrv/LobbyServer/Msgs/Sidestory/ListSideStory.cs
index 2476054..49ecf2e 100644
--- a/nksrv/LobbyServer/Msgs/Sidestory/ListSideStory.cs
+++ b/nksrv/LobbyServer/Msgs/Sidestory/ListSideStory.cs
@@ -1,4 +1,6 @@
-using nksrv.Utils;
+using Google.Protobuf.WellKnownTypes;
+using nksrv.Net;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Sidestory
{
@@ -12,7 +14,11 @@ namespace nksrv.LobbyServer.Msgs.Sidestory
var response = new ResListSideStory();
- // TODO
+ foreach (var item in user.CompletedSideStoryStages)
+ {
+ // TODO cleared at
+ response.SideStoryStageDataList.Add(new NetSideStoryStageData() { SideStoryStageId = item, ClearedAt = Timestamp.FromDateTime(DateTime.UtcNow) });
+ }
await WriteDataAsync(response);
}
diff --git a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs
index 0587023..bcab4cc 100644
--- a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs
+++ b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs
@@ -1,4 +1,5 @@
-using nksrv.StaticInfo;
+using nksrv.Database;
+using nksrv.StaticInfo;
using nksrv.Utils;
using Swan.Logging;
@@ -26,7 +27,7 @@ namespace nksrv.LobbyServer.Msgs.Stage
}
- public static ResClearStage CompleteStage(Utils.User user, int StageId, bool forceCompleteScenarios = false)
+ public static ResClearStage CompleteStage(Database.User user, int StageId, bool forceCompleteScenarios = false)
{
var response = new ResClearStage();
var clearedStage = StaticDataParser.Instance.GetStageData(StageId);
@@ -113,7 +114,7 @@ namespace nksrv.LobbyServer.Msgs.Stage
return response;
}
- private static NetRewardData RegisterRewardsForUser(Utils.User user, RewardTableRecord rewardData)
+ public static NetRewardData RegisterRewardsForUser(Database.User user, RewardTableRecord rewardData)
{
NetRewardData ret = new();
if (rewardData.rewards == null) return ret;
@@ -222,7 +223,7 @@ namespace nksrv.LobbyServer.Msgs.Stage
return ret;
}
- private static void DoQuestSpecificUserOperations(Utils.User user, int clearedStageId)
+ private static void DoQuestSpecificUserOperations(Database.User user, int clearedStageId)
{
var quest = StaticDataParser.Instance.GetMainQuestForStageClearCondition(clearedStageId);
if (quest != null)
@@ -240,11 +241,11 @@ namespace nksrv.LobbyServer.Msgs.Stage
team1.LastContentsTeamNumber = 1;
- user.Characters.Add(new Utils.Character() { Csn = 47263455, Tid = 201001 });
- user.Characters.Add(new Utils.Character() { Csn = 47273456, Tid = 330501 });
- user.Characters.Add(new Utils.Character() { Csn = 47263457, Tid = 130201 });
- user.Characters.Add(new Utils.Character() { Csn = 47263458, Tid = 230101 });
- user.Characters.Add(new Utils.Character() { Csn = 47263459, Tid = 301201 });
+ user.Characters.Add(new Database.Character() { Csn = 47263455, Tid = 201001 });
+ user.Characters.Add(new Database.Character() { Csn = 47273456, Tid = 330501 });
+ user.Characters.Add(new Database.Character() { Csn = 47263457, Tid = 130201 });
+ user.Characters.Add(new Database.Character() { Csn = 47263458, Tid = 230101 });
+ user.Characters.Add(new Database.Character() { Csn = 47263459, Tid = 301201 });
var team1Sub = new NetTeamData();
team1Sub.TeamNumber = 1;
diff --git a/nksrv/LobbyServer/Msgs/Stage/GetStage.cs b/nksrv/LobbyServer/Msgs/Stage/GetStage.cs
index b4755f7..a0775e9 100644
--- a/nksrv/LobbyServer/Msgs/Stage/GetStage.cs
+++ b/nksrv/LobbyServer/Msgs/Stage/GetStage.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Stage
{
@@ -21,7 +22,7 @@ namespace nksrv.LobbyServer.Msgs.Stage
await WriteDataAsync(response);
}
- public static NetFieldObjectData CreateFieldInfo(Utils.User user, int chapter, string mod)
+ public static NetFieldObjectData CreateFieldInfo(Database.User user, int chapter, string mod)
{
var f = new NetFieldObjectData();
bool found = false;
diff --git a/nksrv/LobbyServer/Msgs/Team/SetTeam.cs b/nksrv/LobbyServer/Msgs/Team/SetTeam.cs
index 2bff5ea..499d301 100644
--- a/nksrv/LobbyServer/Msgs/Team/SetTeam.cs
+++ b/nksrv/LobbyServer/Msgs/Team/SetTeam.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Team
{
diff --git a/nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs b/nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs
index 3f48e66..10ba000 100644
--- a/nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs
+++ b/nksrv/LobbyServer/Msgs/Trigger/FinishMainQuest.cs
@@ -1,4 +1,5 @@
-using nksrv.StaticInfo;
+using nksrv.Database;
+using nksrv.StaticInfo;
using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.Trigger
diff --git a/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs b/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs
index 0068262..1fd1896 100644
--- a/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs
+++ b/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.User
{
diff --git a/nksrv/LobbyServer/Msgs/User/SetProfileIcon.cs b/nksrv/LobbyServer/Msgs/User/SetProfileIcon.cs
index c03623e..c8d3f7a 100644
--- a/nksrv/LobbyServer/Msgs/User/SetProfileIcon.cs
+++ b/nksrv/LobbyServer/Msgs/User/SetProfileIcon.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.User
{
diff --git a/nksrv/LobbyServer/Msgs/User/SetScenarioCompleted.cs b/nksrv/LobbyServer/Msgs/User/SetScenarioCompleted.cs
index 2eda203..20301b9 100644
--- a/nksrv/LobbyServer/Msgs/User/SetScenarioCompleted.cs
+++ b/nksrv/LobbyServer/Msgs/User/SetScenarioCompleted.cs
@@ -1,4 +1,5 @@
-using nksrv.Utils;
+using nksrv.Database;
+using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.User
{
diff --git a/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs b/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs
index f2f8704..9339b86 100644
--- a/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs
+++ b/nksrv/LobbyServer/Msgs/User/Tutorial/SetTutorial.cs
@@ -1,4 +1,5 @@
-using nksrv.StaticInfo;
+using nksrv.Database;
+using nksrv.StaticInfo;
using nksrv.Utils;
namespace nksrv.LobbyServer.Msgs.User.Tutorial
diff --git a/nksrv/Program.cs b/nksrv/Program.cs
index 0aa4845..e52e368 100644
--- a/nksrv/Program.cs
+++ b/nksrv/Program.cs
@@ -1,6 +1,7 @@
using EmbedIO;
using EmbedIO.Actions;
using EmbedIO.WebApi;
+using nksrv.Database;
using nksrv.IntlServer;
using nksrv.LobbyServer;
using nksrv.LobbyServer.Msgs.Stage;
diff --git a/nksrv/Protos/allmsgs.proto b/nksrv/Protos/allmsgs.proto
index 6cfbd7f..136370a 100644
--- a/nksrv/Protos/allmsgs.proto
+++ b/nksrv/Protos/allmsgs.proto
@@ -2193,16 +2193,6 @@ message ResGetLostSectorData {
repeated NetFieldStageData ClearedStages = 4;
}
-message NetSideStoryStageData {
- int32 SideStoryStageId = 1;
- google.protobuf.Timestamp ClearedAt = 2;
-}
-
-message ReqListSideStory {}
-message ResListSideStory {
- repeated NetSideStoryStageData SideStoryStageDataList = 1;
-}
-
enum LiberateMissionState {
LiberateMissionState_Running = 0;
LiberateMissionState_Rewarded = 1;
@@ -2253,4 +2243,4 @@ message ReqGetSpecialLobbySlotData {
}
message ResGetSpecialLobbySlotData {
repeated SpecialLobbySlot SpecialLobbySlots = 1;
-}
\ No newline at end of file
+}
diff --git a/nksrv/Protos/sidestory.proto b/nksrv/Protos/sidestory.proto
new file mode 100644
index 0000000..b7806cc
--- /dev/null
+++ b/nksrv/Protos/sidestory.proto
@@ -0,0 +1,63 @@
+syntax = "proto3";
+
+option csharp_namespace = "nksrv.Net";
+
+import "google/protobuf/timestamp.proto";
+import "google/protobuf/Duration.proto";
+import "Protos/allmsgs.proto";
+
+// List completed
+message NetSideStoryStageData {
+ int32 SideStoryStageId = 1;
+ google.protobuf.Timestamp ClearedAt = 2;
+}
+
+message ReqListSideStory {}
+message ResListSideStory {
+ repeated NetSideStoryStageData SideStoryStageDataList = 1;
+}
+
+// Enter stage
+message ReqEnterSideStoryStage {
+ int32 SideStoryId = 1;
+ int32 SideStoryStageId = 2;
+ int32 TeamNumber = 3;
+ NetAntiCheatBattleTLogAdditionalInfo AnticheatData = 4;
+}
+message ResEnterSideStoryStage {
+}
+
+// Clear sceneario
+message ReqClearSideStoryCutForScenario {
+ int32 SideStoryStageId = 1;
+ int32 SideStoryCutId = 2;
+}
+message ResClearSideStoryCutForScenario {}
+
+// Clear stage
+message ReqClearSideStoryStage {
+ int32 SideStoryStageId = 1;
+}
+message ResClearSideStoryStage {
+ NetRewardData reward = 1;
+}
+
+// Enter battle
+message ReqEnterSideStoryCutForBattle {
+ int32 SideStoryStageId = 1;
+ int32 SideStoryCutId = 2;
+ int32 TeamNumber = 3;
+ NetAntiCheatBattleTLogAdditionalInfo AnticheatData = 4;
+}
+message ResEnterSideStoryCutForBattle {}
+
+// Clear battle
+message ReqClearSideStoryCutForBattle {
+ int32 SideStoryStageId = 1;
+ int32 SideStoryCutId = 2;
+ int32 TeamNumber = 3;
+ int32 BattleResult = 4;
+ NetAntiCheatBattleData AnticheatBattleData = 5;
+ NetAntiCheatBattleTLogAdditionalInfo AnticheatData = 6;
+}
+message ResClearSideStoryCutForBattle {}
\ No newline at end of file
diff --git a/nksrv/StaticInfo/StaticDataParser.cs b/nksrv/StaticInfo/StaticDataParser.cs
index 2526c26..5838054 100644
--- a/nksrv/StaticInfo/StaticDataParser.cs
+++ b/nksrv/StaticInfo/StaticDataParser.cs
@@ -49,6 +49,7 @@ namespace nksrv.StaticInfo
private Dictionary FieldMapData = [];
private Dictionary LevelData = [];
private Dictionary TacticAcademyLessons = [];
+ public Dictionary SidestoryRewardTable = [];
public byte[] Sha256Hash;
public int Size;
@@ -273,6 +274,22 @@ namespace nksrv.StaticInfo
TacticAcademyLessons.Add(id, new TacticAcademyLessonRecord() { CurrencyId = (CurrencyType)currencyId, CurrencyValue = currencyValue, GroupId = groupid, Id = id });
}
+ var sideStoryTable = await LoadZip("SideStoryStageTable.json");
+
+ foreach (JToken item in sideStoryTable)
+ {
+ var idRaw = item["id"];
+ var rewardIdRaw = item["first_clear_reward"];
+
+ if (idRaw == null) throw new InvalidDataException();
+ if (rewardIdRaw != null)
+ {
+ var id2 = idRaw.ToObject();
+ var reward = rewardIdRaw.ToObject();
+
+ SidestoryRewardTable.Add(id2, reward);
+ }
+ }
}
public MainQuestCompletionData? GetMainQuestForStageClearCondition(int stage)
diff --git a/nksrv/Utils/NetUtils.cs b/nksrv/Utils/NetUtils.cs
index 3c6dc4c..7ed63f8 100644
--- a/nksrv/Utils/NetUtils.cs
+++ b/nksrv/Utils/NetUtils.cs
@@ -1,4 +1,5 @@
-using nksrv.StaticInfo;
+using nksrv.Database;
+using nksrv.StaticInfo;
using Swan.Logging;
namespace nksrv.Utils
diff --git a/nksrv/nksrv.csproj b/nksrv/nksrv.csproj
index 264aff6..cd8f5b0 100644
--- a/nksrv/nksrv.csproj
+++ b/nksrv/nksrv.csproj
@@ -32,6 +32,7 @@
+