From e4e8f801ceb351fab9624e0004a93a1c3eb111c8 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 1 May 2025 18:18:15 -0400 Subject: [PATCH] Messenger implementation --- EpinelPS/Database/JsonDb.cs | 44 ++++++++++++++++++- EpinelPS/GameData/GameData.cs | 21 +++++++++ EpinelPS/GameData/JsonStaticData.cs | 36 +++++++++++++++ EpinelPS/LobbyServer/Gacha/ExecGacha.cs | 9 +--- .../LobbyUser/SetNicknameInTutorial.cs | 2 +- .../LobbyServer/Messenger/EnterMessenger.cs | 20 +++++---- .../LobbyServer/Messenger/EnterSubquest.cs | 10 ++++- EpinelPS/LobbyServer/Messenger/GetMessages.cs | 12 ++++- EpinelPS/LobbyServer/Messenger/ProceedMsg.cs | 17 ++++++- EpinelPS/LobbyServer/Stage/ClearStage.cs | 6 +++ EpinelPS/Program.cs | 1 + 11 files changed, 155 insertions(+), 23 deletions(-) diff --git a/EpinelPS/Database/JsonDb.cs b/EpinelPS/Database/JsonDb.cs index 9210188..5dd0d93 100644 --- a/EpinelPS/Database/JsonDb.cs +++ b/EpinelPS/Database/JsonDb.cs @@ -160,7 +160,7 @@ namespace EpinelPS.Database public BadgeContents BadgeContent; public string BadgeGuid = ""; - public Badge() {} + public Badge() { } public Badge(NetBadge badge) { Location = badge.Location; @@ -201,6 +201,18 @@ namespace EpinelPS.Database }; } } + public class ConversationChoice + { + + } + public class ConversationMessage + { + public string ConversationId { get; set; } = ""; + public long CreatedAt { get; set; } + public ulong Seq { get; set; } + public string Id { get; set; } = ""; + public int State { get; set; } + } public class User { // User info @@ -282,6 +294,8 @@ namespace EpinelPS.Database public List Triggers = []; public int LastTriggerId = 1; public List CompletedAchievements = []; + public List MessengerData = []; + public ulong LastMessageId = 1; // Event data public Dictionary EventInfo = new(); @@ -524,6 +538,34 @@ namespace EpinelPS.Database return removed; } + + public NetMessage CreateMessage(MessengerDialogRecord r, int state = 0) + { + var msg = new NetMessage() + { + ConversationId = r.conversation_id, + CreatedAt = DateTime.UtcNow.Ticks, + MessageId = r.id, + Seq = (long)LastMessageId++, + State = state + }; + MessengerData.Add(msg); + return msg; + } + + public NetMessage CreateMessage(string conversationId, string messageId, int state = 0) + { + var msg = new NetMessage() + { + ConversationId = conversationId, + CreatedAt = DateTime.UtcNow.Ticks, + MessageId = messageId, + Seq = (long)LastMessageId++, + State = state + }; + MessengerData.Add(msg); + return msg; + } } public class CoreInfo { diff --git a/EpinelPS/GameData/GameData.cs b/EpinelPS/GameData/GameData.cs index 544b8a2..2a601c1 100644 --- a/EpinelPS/GameData/GameData.cs +++ b/EpinelPS/GameData/GameData.cs @@ -69,6 +69,9 @@ namespace EpinelPS.StaticInfo public readonly Dictionary InfracoreTable = []; public readonly Dictionary AttractiveCounselCharacterTable = []; public readonly Dictionary AttractiveLevelReward = []; + public readonly Dictionary Subquests = []; + public readonly Dictionary Messages = []; + public readonly Dictionary MessageConditions = []; public byte[] Sha256Hash; @@ -528,6 +531,24 @@ namespace EpinelPS.StaticInfo { this.AttractiveLevelReward.Add(obj.id, obj); } + + var subquest = await LoadZip("SubQuestTable.json", progress); + foreach (var obj in subquest.records) + { + this.Subquests.Add(obj.id, obj); + } + + var msgs = await LoadZip("MessengerDialogTable.json", progress); + foreach (var obj in msgs.records) + { + this.Messages.Add(obj.id, obj); + } + + var msgc = await LoadZip("MessengerConditionTriggerTable.json", progress); + foreach (var obj in msgc.records) + { + this.MessageConditions.Add(obj.id, obj); + } } public MainQuestCompletionRecord? GetMainQuestForStageClearCondition(int stage) diff --git a/EpinelPS/GameData/JsonStaticData.cs b/EpinelPS/GameData/JsonStaticData.cs index f06b98e..a2c3775 100644 --- a/EpinelPS/GameData/JsonStaticData.cs +++ b/EpinelPS/GameData/JsonStaticData.cs @@ -713,4 +713,40 @@ { public List records = []; } + public class SubquestRecord + { + public int id; + public int group_id; + public int clear_condition_id; + public int clear_condition_value; + public string conversation_id = ""; + public string end_messenger_conversation_id = ""; + public int before_sub_quest_id; + } + public class SubquestTable + { + public List records = []; + } + public class MessengerDialogRecord + { + public string id = ""; + public string conversation_id = ""; + public string jump_target = ""; + public bool is_opener; + public int reward_id; + } + public class MessengerDialogTable + { + public List records = []; + } + public class MessengerMsgConditionRecord + { + public int id; + public string tid = ""; + public int reward_id; + } + public class MessengerMsgConditionTable + { + public List records = []; + } } diff --git a/EpinelPS/LobbyServer/Gacha/ExecGacha.cs b/EpinelPS/LobbyServer/Gacha/ExecGacha.cs index 4506ba9..f77a7e2 100644 --- a/EpinelPS/LobbyServer/Gacha/ExecGacha.cs +++ b/EpinelPS/LobbyServer/Gacha/ExecGacha.cs @@ -219,14 +219,7 @@ namespace EpinelPS.LobbyServer.Gacha { user.BondInfo.Add(new() { NameCode = characterData.name_code, Level = 1 }); - if (characterData.original_rare == "SSR") - { - user.AddTrigger(TriggerType.ObtainCharacterSSR, characterData.name_code); - } - else - { - user.AddTrigger(TriggerType.ObtainCharacter, characterData.name_code); - } + user.AddTrigger(TriggerType.ObtainCharacter, characterData.name_code); } } diff --git a/EpinelPS/LobbyServer/LobbyUser/SetNicknameInTutorial.cs b/EpinelPS/LobbyServer/LobbyUser/SetNicknameInTutorial.cs index f110027..e53f8dd 100644 --- a/EpinelPS/LobbyServer/LobbyUser/SetNicknameInTutorial.cs +++ b/EpinelPS/LobbyServer/LobbyUser/SetNicknameInTutorial.cs @@ -3,7 +3,7 @@ using EpinelPS.Utils; namespace EpinelPS.LobbyServer.LobbyUser { - [PacketPath("/user/SetNickNameInTutorial")] + [PacketPath("/User/SetNickNameInTutorial")] public class SetNicknameInTutorial : LobbyMsgHandler { protected override async Task HandleAsync() diff --git a/EpinelPS/LobbyServer/Messenger/EnterMessenger.cs b/EpinelPS/LobbyServer/Messenger/EnterMessenger.cs index 89a71a0..21f862d 100644 --- a/EpinelPS/LobbyServer/Messenger/EnterMessenger.cs +++ b/EpinelPS/LobbyServer/Messenger/EnterMessenger.cs @@ -1,4 +1,6 @@ using EpinelPS.Utils; +using EpinelPS.StaticInfo; +using EpinelPS.Database; namespace EpinelPS.LobbyServer.Messenger { @@ -8,16 +10,18 @@ namespace EpinelPS.LobbyServer.Messenger protected override async Task HandleAsync() { var req = await ReadData(); + var user = GetUser(); - // TODO: save these things var response = new ResEnterMessengerDialog(); - response.Message = new NetMessage(){ -ConversationId = "m_mainafter_28_01", -CreatedAt = 132123123, -MessageId = "m_mainafter_28_01_1", -Seq = 324234, -State = 0 - }; + + var opener = GameData.Instance.MessageConditions[req.Tid]; + var conversation = GameData.Instance.Messages.Where(x => x.Value.conversation_id == opener.tid && x.Value.is_opener).First(); + + response.Message = user.CreateMessage(conversation.Value); + + user.AddTrigger(TriggerType.MessageClear, 1, req.Tid); // TODO check if this is correct + + JsonDb.Save(); await WriteDataAsync(response); } diff --git a/EpinelPS/LobbyServer/Messenger/EnterSubquest.cs b/EpinelPS/LobbyServer/Messenger/EnterSubquest.cs index f6614f8..bd77aec 100644 --- a/EpinelPS/LobbyServer/Messenger/EnterSubquest.cs +++ b/EpinelPS/LobbyServer/Messenger/EnterSubquest.cs @@ -1,3 +1,5 @@ +using EpinelPS.Database; +using EpinelPS.StaticInfo; using EpinelPS.Utils; namespace EpinelPS.LobbyServer.Messenger @@ -8,10 +10,16 @@ namespace EpinelPS.LobbyServer.Messenger protected override async Task HandleAsync() { var req = await ReadData(); + var user = GetUser(); - // TODO: save these things var response = new ResEnterSubQuestMessengerDialog(); + 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.conversation_id && x.Value.is_opener).First(); + + response.Message = user.CreateMessage(conversation.Value); + JsonDb.Save(); + await WriteDataAsync(response); } } diff --git a/EpinelPS/LobbyServer/Messenger/GetMessages.cs b/EpinelPS/LobbyServer/Messenger/GetMessages.cs index 376c623..dfdbe09 100644 --- a/EpinelPS/LobbyServer/Messenger/GetMessages.cs +++ b/EpinelPS/LobbyServer/Messenger/GetMessages.cs @@ -1,4 +1,5 @@ -using EpinelPS.Utils; +using EpinelPS.Database; +using EpinelPS.Utils; namespace EpinelPS.LobbyServer.Messenger { @@ -8,10 +9,17 @@ namespace EpinelPS.LobbyServer.Messenger protected override async Task HandleAsync() { var req = await ReadData(); + var user = GetUser(); - // TODO: save these things var response = new ResGetMessages(); + var newMessages = user.MessengerData.Where(x => x.Seq >= req.Seq); + + foreach (var item in newMessages) + { + response.Messages.Add(item); + } + await WriteDataAsync(response); } } diff --git a/EpinelPS/LobbyServer/Messenger/ProceedMsg.cs b/EpinelPS/LobbyServer/Messenger/ProceedMsg.cs index 87171a1..86f38ac 100644 --- a/EpinelPS/LobbyServer/Messenger/ProceedMsg.cs +++ b/EpinelPS/LobbyServer/Messenger/ProceedMsg.cs @@ -1,4 +1,6 @@ using EpinelPS.Utils; +using EpinelPS.StaticInfo; +using EpinelPS.Database; namespace EpinelPS.LobbyServer.Messenger { @@ -7,10 +9,21 @@ namespace EpinelPS.LobbyServer.Messenger { protected override async Task HandleAsync() { + // This request handles saving user choices var req = await ReadData(); + ResProceedMessage response = new(); + var user = GetUser(); - // TODO: save these things - var response = new ResProceedMessage(); + var msgToSave = GameData.Instance.Messages.Where(x => x.Key == req.MessageId).First(); + + response.Message = user.CreateMessage(msgToSave.Value.conversation_id, req.MessageId); + + if (msgToSave.Value.reward_id != 0) + { + Console.WriteLine("TODO reward for messenger. Reward ID: " + msgToSave.Value.reward_id + " Message ID: " + req.MessageId); + } + + JsonDb.Save(); await WriteDataAsync(response); } diff --git a/EpinelPS/LobbyServer/Stage/ClearStage.cs b/EpinelPS/LobbyServer/Stage/ClearStage.cs index f08809f..a0b7ef4 100644 --- a/EpinelPS/LobbyServer/Stage/ClearStage.cs +++ b/EpinelPS/LobbyServer/Stage/ClearStage.cs @@ -185,6 +185,12 @@ namespace EpinelPS.LobbyServer.Stage user.BondInfo.Add(new() { NameCode = 3001, Level = 1 }); user.BondInfo.Add(new() { NameCode = 3005, Level = 1 }); + + user.AddTrigger(TriggerType.ObtainCharacter, 1, 3001); + user.AddTrigger(TriggerType.ObtainCharacter, 1, 1018); + user.AddTrigger(TriggerType.ObtainCharacter, 1, 1015); + user.AddTrigger(TriggerType.ObtainCharacter, 1, 1014); + user.AddTrigger(TriggerType.ObtainCharacter, 1, 3005); NetTeamData team1Sub = new() { diff --git a/EpinelPS/Program.cs b/EpinelPS/Program.cs index f119d67..9d6fc05 100644 --- a/EpinelPS/Program.cs +++ b/EpinelPS/Program.cs @@ -303,6 +303,7 @@ namespace EpinelPS }); user.BondInfo.Add(new() { NameCode = character.name_code, Level = 1 }); + user.AddTrigger(TriggerType.ObtainCharacter, 1, character.name_code); } }