From 98311f73d27d0592fd8023c631cb34ff2294bf8b Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 2 May 2025 11:14:11 -0400 Subject: [PATCH] implement subquests, some fixes --- EpinelPS/Database/JsonDb.cs | 9 ++--- EpinelPS/LobbyServer/Gacha/ExecGacha.cs | 1 + .../Messenger/EnterFinishSubquest.cs | 26 ++++++++++++++ .../LobbyServer/Messenger/FinishSubquest.cs | 33 +++++++++++++++++ EpinelPS/LobbyServer/Stage/CheckCleared.cs | 5 --- EpinelPS/LobbyServer/Stage/ClearStage.cs | 1 + .../LobbyServer/Subquest/EnrollSubquest.cs | 35 +++++++++++++++++++ EpinelPS/LobbyServer/Subquest/SetTrigger.cs | 2 ++ EpinelPS/Program.cs | 1 + 9 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 EpinelPS/LobbyServer/Messenger/EnterFinishSubquest.cs create mode 100644 EpinelPS/LobbyServer/Messenger/FinishSubquest.cs create mode 100644 EpinelPS/LobbyServer/Subquest/EnrollSubquest.cs diff --git a/EpinelPS/Database/JsonDb.cs b/EpinelPS/Database/JsonDb.cs index fea884f..3ad5bb2 100644 --- a/EpinelPS/Database/JsonDb.cs +++ b/EpinelPS/Database/JsonDb.cs @@ -297,6 +297,7 @@ namespace EpinelPS.Database public List CompletedAchievements = []; public List MessengerData = []; public ulong LastMessageId = 1; + public long LastBadgeSeq = 1; // Event data public Dictionary EventInfo = new(); @@ -321,19 +322,13 @@ namespace EpinelPS.Database public Badge AddBadge(BadgeContents type, string location) { // generate unique badge SEQ - var num = Rng.RandomId(); - - while (Badges.Any(x => x.Seq == num)) - { - num = Rng.RandomId(); - } var badge = new Badge() { BadgeContent = type, Location = location, BadgeGuid = Guid.NewGuid().ToString(), - Seq = num + Seq = LastBadgeSeq++ }; Badges.Add(badge); diff --git a/EpinelPS/LobbyServer/Gacha/ExecGacha.cs b/EpinelPS/LobbyServer/Gacha/ExecGacha.cs index e294157..b71e653 100644 --- a/EpinelPS/LobbyServer/Gacha/ExecGacha.cs +++ b/EpinelPS/LobbyServer/Gacha/ExecGacha.cs @@ -215,6 +215,7 @@ namespace EpinelPS.LobbyServer.Gacha // Add "New Character" Badge user.AddBadge(BadgeContents.BadgeContentsNikkeNew, characterData.name_code.ToString()); user.AddTrigger(TriggerType.ObtainCharacter, 1, characterData.name_code); + user.AddTrigger(TriggerType.ObtainCharacterNew, 1); if (characterData.original_rare == "SSR" || characterData.original_rare == "SR") { diff --git a/EpinelPS/LobbyServer/Messenger/EnterFinishSubquest.cs b/EpinelPS/LobbyServer/Messenger/EnterFinishSubquest.cs new file mode 100644 index 0000000..cd3a385 --- /dev/null +++ b/EpinelPS/LobbyServer/Messenger/EnterFinishSubquest.cs @@ -0,0 +1,26 @@ +using EpinelPS.Database; +using EpinelPS.StaticInfo; +using EpinelPS.Utils; + +namespace EpinelPS.LobbyServer.Messenger +{ + [PacketPath("/messenger/subquestfin/enter")] + public class EnterFinishSubquest : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + var response = new ResEnterSubQuestFinMessengerDialog(); + + var opener = GameData.Instance.Subquests.Where(x => x.Key == req.SubQuestId).First(); + var conversation = GameData.Instance.Messages.Where(x => x.Value.conversation_id == opener.Value.end_messenger_conversation_id && x.Value.is_opener).First(); + + response.Message = user.CreateMessage(conversation.Value); + JsonDb.Save(); + + await WriteDataAsync(response); + } + } +} diff --git a/EpinelPS/LobbyServer/Messenger/FinishSubquest.cs b/EpinelPS/LobbyServer/Messenger/FinishSubquest.cs new file mode 100644 index 0000000..4c28862 --- /dev/null +++ b/EpinelPS/LobbyServer/Messenger/FinishSubquest.cs @@ -0,0 +1,33 @@ +using EpinelPS.Database; +using EpinelPS.StaticInfo; +using EpinelPS.Utils; + +namespace EpinelPS.LobbyServer.Messenger +{ + [PacketPath("/messenger/finsubquest")] + public class FinishSubquest : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + var response = new ResFinSubQuest(); + + var opener = GameData.Instance.Subquests.Where(x => x.Key == req.SubQuestId).First(); + var conversation = GameData.Instance.Messages.Where(x => x.Value.id == req.MessageId).First(); + + var rewardRecord = GameData.Instance.GetRewardTableEntry(conversation.Value.reward_id) ?? throw new Exception("unable to lookup reward"); + + user.SetSubQuest(req.SubQuestId, true); + + var conversationRecordUser = user.MessengerData.Where(x => x.MessageId == req.MessageId).First(); + conversationRecordUser.State = 2; // mark as claimed + + response.Reward = RewardUtils.RegisterRewardsForUser(user, rewardRecord); + JsonDb.Save(); + + await WriteDataAsync(response); + } + } +} diff --git a/EpinelPS/LobbyServer/Stage/CheckCleared.cs b/EpinelPS/LobbyServer/Stage/CheckCleared.cs index 2bcc89e..6b043b3 100644 --- a/EpinelPS/LobbyServer/Stage/CheckCleared.cs +++ b/EpinelPS/LobbyServer/Stage/CheckCleared.cs @@ -11,9 +11,6 @@ namespace EpinelPS.LobbyServer.Stage var response = new ResCheckStageClear(); var user = GetUser(); - Console.WriteLine("CheckClear len: " + req.StageIds.Count); - - // TODO: is this correct foreach (var fields in user.FieldInfoNew) { @@ -24,8 +21,6 @@ namespace EpinelPS.LobbyServer.Stage } } - - await WriteDataAsync(response); } } diff --git a/EpinelPS/LobbyServer/Stage/ClearStage.cs b/EpinelPS/LobbyServer/Stage/ClearStage.cs index a0b7ef4..07efe1b 100644 --- a/EpinelPS/LobbyServer/Stage/ClearStage.cs +++ b/EpinelPS/LobbyServer/Stage/ClearStage.cs @@ -191,6 +191,7 @@ namespace EpinelPS.LobbyServer.Stage user.AddTrigger(TriggerType.ObtainCharacter, 1, 1015); user.AddTrigger(TriggerType.ObtainCharacter, 1, 1014); user.AddTrigger(TriggerType.ObtainCharacter, 1, 3005); + user.AddTrigger(TriggerType.ObtainCharacterNew, 1); NetTeamData team1Sub = new() { diff --git a/EpinelPS/LobbyServer/Subquest/EnrollSubquest.cs b/EpinelPS/LobbyServer/Subquest/EnrollSubquest.cs new file mode 100644 index 0000000..d7fdcc4 --- /dev/null +++ b/EpinelPS/LobbyServer/Subquest/EnrollSubquest.cs @@ -0,0 +1,35 @@ +using EpinelPS.StaticInfo; +using EpinelPS.Utils; +using EpinelPS.Database; + +namespace EpinelPS.LobbyServer.Subquest +{ + [PacketPath("/subquest/enrollment")] + public class EnrollSubquest : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + var response = new ResEnrollmentSubQuest(); + + if (!GameData.Instance.Subquests.TryGetValue(req.SubquestId, out _)) + throw new Exception("no such subquest: " + req.SubquestId); + + if (!user.SubQuestData.ContainsKey(req.SubquestId)) + user.SetSubQuest(req.SubquestId, false); + + response.SubquestData = new NetSubQuestData() + { + CreatedAt = DateTime.UtcNow.Ticks, + IsReceived = false, + SubQuestId = req.SubquestId + }; + + JsonDb.Save(); + + await WriteDataAsync(response); + } + } +} diff --git a/EpinelPS/LobbyServer/Subquest/SetTrigger.cs b/EpinelPS/LobbyServer/Subquest/SetTrigger.cs index 8c75fdd..c0bf809 100644 --- a/EpinelPS/LobbyServer/Subquest/SetTrigger.cs +++ b/EpinelPS/LobbyServer/Subquest/SetTrigger.cs @@ -17,7 +17,9 @@ namespace EpinelPS.LobbyServer.Subquest if (!GameData.Instance.Subquests.TryGetValue(req.SubquestId, out SubquestRecord? record)) throw new Exception("no such subquest: " + req.SubquestId); + user.AddTrigger(TriggerType.CampaignGroupClear, record.clear_condition_value, record.clear_condition_id); // TODO this may need to go elsewhere +user.AddTrigger(TriggerType.FieldObjectCollection, record.clear_condition_value, record.clear_condition_id); // TODO this may need to go elsewhere user.AddTrigger(TriggerType.SubQuestClear, 1, req.SubquestId); JsonDb.Save(); diff --git a/EpinelPS/Program.cs b/EpinelPS/Program.cs index 4daeb5d..cfbc419 100644 --- a/EpinelPS/Program.cs +++ b/EpinelPS/Program.cs @@ -305,6 +305,7 @@ namespace EpinelPS user.BondInfo.Add(new() { NameCode = character.name_code, Level = 1 }); user.AddTrigger(TriggerType.ObtainCharacter, 1, character.name_code); + user.AddTrigger(TriggerType.ObtainCharacterNew, 1); } }