diff --git a/nksrv/LobbyServer/Msgs/Character/GetCharacterData.cs b/nksrv/LobbyServer/Msgs/Character/GetCharacterData.cs index 46e5219..e0b5450 100644 --- a/nksrv/LobbyServer/Msgs/Character/GetCharacterData.cs +++ b/nksrv/LobbyServer/Msgs/Character/GetCharacterData.cs @@ -13,7 +13,7 @@ namespace nksrv.LobbyServer.Msgs.Character var response = new ResGetCharacterData(); foreach (var item in user.Characters) { - response.Character.Add(new NetUserCharacterData() { Default = new() { Csn = item.Csn, Skill1Lv = item.Skill1Lvl, Skill2Lv = item.Skill2Lvl, CostumeId = item.CostumeId, Lv = item.Level, Grade = item.Grade, Tid = item.Tid } }); + response.Character.Add(new NetUserCharacterData() { Default = new() { Csn = item.Csn, Skill1Lv = item.Skill1Lvl, Skill2Lv = item.Skill2Lvl, CostumeId = item.CostumeId, Lv = item.Level, Grade = item.Grade, Tid = item.Tid, UltiSkillLv = item.UltimateLevel } }); } WriteData(response); diff --git a/nksrv/LobbyServer/Msgs/Gacha/CheckGachaDailyEvent.cs b/nksrv/LobbyServer/Msgs/Gacha/CheckGachaDailyEvent.cs new file mode 100644 index 0000000..ae6d920 --- /dev/null +++ b/nksrv/LobbyServer/Msgs/Gacha/CheckGachaDailyEvent.cs @@ -0,0 +1,26 @@ +using nksrv.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.LobbyServer.Msgs.Gacha +{ + [PacketPath("/gacha/event/check")] + public class CheckGachaDailyEvent : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = ReadData(); + + var response = new ResCheckDailyFreeGacha(); + + // TODO implement + response.FreeCount = 1000; + response.EventData = new NetEventData() { Id = 1 }; + + WriteData(response); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs b/nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs new file mode 100644 index 0000000..e76d59a --- /dev/null +++ b/nksrv/LobbyServer/Msgs/Gacha/ExecGacha.cs @@ -0,0 +1,32 @@ +using nksrv.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace nksrv.LobbyServer.Msgs.Gacha +{ + [PacketPath("/gacha/execute")] + public class ExecGacha : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + + var response = new ResExecuteGacha(); + + // TODO implement + response.Reward = new NetRewardData(); + for (int i = 0; i < 10; i++) + { + response.Gacha.Add(new NetGachaEntityData() { Corporation = 0, PieceCount = 1, CurrencyValue = 5, Sn = 130201, Tid = 2500601, Type = 1 }); + // response.Characters.Add(new NetUserCharacterDefaultData() { Lv = 1, Skill1Lv = 1, Grade = 0, Csn = 1, Tid = 130201 }); + + } + + + WriteData(response); + } + } +} diff --git a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs index 73734c0..e05f111 100644 --- a/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs +++ b/nksrv/LobbyServer/Msgs/Stage/ClearStage.cs @@ -24,6 +24,9 @@ namespace nksrv.LobbyServer.Msgs.Stage if (req.BattleResult == 1) { + var clearedStage = StaticDataParser.Instance.GetStageData(req.StageId); + if (clearedStage == null) throw new Exception("cleared stage cannot be null"); + user.LastStageCleared = req.StageId; if (user.FieldInfo.Count == 0) @@ -34,7 +37,7 @@ namespace nksrv.LobbyServer.Msgs.Stage DoQuestSpecificUserOperations(user, req.StageId); // TODO: figure out how stageid corresponds to chapter - user.FieldInfo[GetChapterForStageId(req.StageId)].CompletedStages.Add(new NetFieldStageData() { StageId = req.StageId }); + user.FieldInfo[clearedStage.chapter_id - 1].CompletedStages.Add(new NetFieldStageData() { StageId = req.StageId }); JsonDb.Save(); @@ -112,21 +115,5 @@ namespace nksrv.LobbyServer.Msgs.Stage user.TeamData.Slots.Add(new NetWholeTeamSlot { Slot = 5, Csn = 47263459, Tid = 301201, Lvl = 1 }); } } - public static int GetChapterForStageId(int stageId) - { - if (6000001 <= stageId && stageId <= 6000003) - { - return 0; - } - else if (6001001 <= stageId && stageId <= 6001004) - { - return 1; - } - else - { - Logger.Error("Unknown stage id: " + stageId); - return 100; - } - } } } diff --git a/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs b/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs index 3208bcd..0ed4e2b 100644 --- a/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs +++ b/nksrv/LobbyServer/Msgs/User/EnterLobbyServer.cs @@ -50,7 +50,7 @@ namespace nksrv.LobbyServer.Msgs.User } foreach (var item in user.Characters) { - response.Character.Add(new NetUserCharacterData() { Default = new() { Csn = item.Csn, Skill1Lv = item.Skill1Lvl, Skill2Lv = item.Skill2Lvl, CostumeId = item.CostumeId, Lv = item.Level, Grade = item.Grade, Tid = item.Tid } }); + response.Character.Add(new NetUserCharacterData() { Default = new() { Csn = item.Csn, Skill1Lv = item.Skill1Lvl, Skill2Lv = item.Skill2Lvl, CostumeId = item.CostumeId, Lv = item.Level, Grade = item.Grade, Tid = item.Tid, UltiSkillLv = item.UltimateLevel } }); } if (user.Characters.Count > 0) diff --git a/nksrv/Protos/allmsgs.proto b/nksrv/Protos/allmsgs.proto index c192928..8cd0fd1 100644 --- a/nksrv/Protos/allmsgs.proto +++ b/nksrv/Protos/allmsgs.proto @@ -1630,4 +1630,37 @@ message ResGetSimRoom { //repeated NetSimRoomClearInfo clearInfos = 4; //repeated NetSimRoomEvent events = 5; +} + +message ReqCheckDailyFreeGacha { + int32 gachaId = 1; +} + +message ResCheckDailyFreeGacha { + NetEventData eventData = 1; + int32 freeCount = 2; +} + +message ReqExecuteGacha { + int32 tid = 2; + int32 currencyType = 3; + int32 count = 4; + bool isDiscount = 5; +} + +message NetGachaEntityData { + int32 tid = 1; + int32 sn = 2; + int32 type = 3; + int32 corporation = 4; + int32 pieceCount = 5; + int32 currencyValue = 6; +} + +message ResExecuteGacha { + repeated NetGachaEntityData gacha = 2; + repeated NetUserCurrencyData currencies = 3; + repeated NetUserCharacterDefaultData characters = 6; + repeated NetUserItemData items = 5; + NetRewardData reward = 9; } \ No newline at end of file diff --git a/nksrv/StaticInfo/JsonStaticData.cs b/nksrv/StaticInfo/JsonStaticData.cs index cdbf686..30f6708 100644 --- a/nksrv/StaticInfo/JsonStaticData.cs +++ b/nksrv/StaticInfo/JsonStaticData.cs @@ -16,4 +16,11 @@ namespace nksrv.StaticInfo public int reward_id = 0; public int target_chapter_id; } + public class CampaignStageRecord + { + public int id; + public int chapter_id; + public string stage_category = ""; + public int reward_id = 0; + } } diff --git a/nksrv/StaticInfo/StaticDataParser.cs b/nksrv/StaticInfo/StaticDataParser.cs index 0fbe0d6..f95af48 100644 --- a/nksrv/StaticInfo/StaticDataParser.cs +++ b/nksrv/StaticInfo/StaticDataParser.cs @@ -43,6 +43,7 @@ namespace nksrv.StaticInfo private MemoryStream ZipStream; private JArray questDataRecords; private JArray stageDataRecords; + private JArray rewardDataRecords; public StaticDataParser(string filePath) { @@ -200,23 +201,32 @@ namespace nksrv.StaticInfo { var mainQuestData = MainZip.GetEntry("MainQuestTable.json"); var campaignStageData = MainZip.GetEntry("CampaignStageTable.json"); + var rewardDataEntry = MainZip.GetEntry("RewardTable.json"); + if (mainQuestData == null) throw new Exception("MainQuestTable.json does not exist in static data"); if (campaignStageData == null) throw new Exception("CampaignStageTable.json does not exist in static data"); + if (rewardDataEntry == null) throw new Exception("RewardTable.json does not exist in static data"); using StreamReader mainQuestReader = new StreamReader(MainZip.GetInputStream(mainQuestData)); var mainQuestDataString = await mainQuestReader.ReadToEndAsync(); - using StreamReader campaignStageDataReader = new StreamReader(MainZip.GetInputStream(mainQuestData)); + using StreamReader campaignStageDataReader = new StreamReader(MainZip.GetInputStream(campaignStageData)); var campaignStageDataString = await campaignStageDataReader.ReadToEndAsync(); + using StreamReader rewardDataReader = new StreamReader(MainZip.GetInputStream(rewardDataEntry)); + var rewardJsonString = await rewardDataReader.ReadToEndAsync(); + var questdata = JObject.Parse(mainQuestDataString); var stagedata = JObject.Parse(campaignStageDataString); + var rewardData = JObject.Parse(rewardJsonString); questDataRecords = (JArray?)questdata["records"]; stageDataRecords = (JArray?)stagedata["records"]; + rewardDataRecords = (JArray?)rewardData["records"]; if (questDataRecords == null) throw new Exception("MainQuestTable.json does not contain records array"); if (stageDataRecords == null) throw new Exception("CampaignStageTable.json does not contain records array"); + if (rewardDataRecords == null) throw new Exception("CampaignChapterTable.json does not contain records array"); } public MainQuestCompletionData? GetMainQuestForStageClearCondition(int stage) @@ -253,6 +263,24 @@ namespace nksrv.StaticInfo } } + return null; + } + public CampaignStageRecord? GetStageData(int stage) + { + foreach (JObject item in stageDataRecords) + { + var id = item["id"]; + if (id == null) throw new Exception("expected id field in campaign data"); + + int value = id.ToObject(); + if (value == stage) + { + CampaignStageRecord? data = JsonConvert.DeserializeObject(item.ToString()); + if (data == null) throw new Exception("failed to deserialize stage data"); + return data; + } + } + return null; } }