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 @@ +