diff --git a/EpinelPS/LobbyServer/Archive/ArchiveClearStage.cs b/EpinelPS/LobbyServer/Archive/ArchiveClearStage.cs index 8924607..ecb5e73 100644 --- a/EpinelPS/LobbyServer/Archive/ArchiveClearStage.cs +++ b/EpinelPS/LobbyServer/Archive/ArchiveClearStage.cs @@ -10,8 +10,8 @@ namespace EpinelPS.LobbyServer.Archive ReqClearArchiveStage req = await ReadData(); // has fields EventId, StageId, BattleResult int evid = req.EventId; int stgid = req.StageId; - int result = req.BattleResult; // if 2 add to event info as last stage - User user = GetUser() ?? throw new Exception("User not found."); + int result = req.BattleResult; + User user = GetUser(); // Check if the EventInfo exists for the given EventId if (!user.EventInfo.TryGetValue(evid, out EventData? eventData)) @@ -19,13 +19,12 @@ namespace EpinelPS.LobbyServer.Archive throw new Exception($"Event with ID {evid} not found."); } - // Update the EventData if BattleResult is 2 - if (result == 1) + // Update the EventData if BattleResult is 1 + if (result == 1 && !eventData.ClearedStages.Contains(stgid)) { - + eventData.ClearedStages.Add(stgid); // Update the LastStage in EventData eventData.LastStage = stgid; - } JsonDb.Save(); ResClearArchiveStage response = new(); diff --git a/EpinelPS/LobbyServer/Archive/FastClearArchiveStage.cs b/EpinelPS/LobbyServer/Archive/FastClearArchiveStage.cs index 338f310..55847b6 100644 --- a/EpinelPS/LobbyServer/Archive/FastClearArchiveStage.cs +++ b/EpinelPS/LobbyServer/Archive/FastClearArchiveStage.cs @@ -11,16 +11,19 @@ namespace EpinelPS.LobbyServer.Archive int evid = req.EventId; int stgid = req.StageId; - User user = GetUser() ?? throw new Exception("User not found."); + User user = GetUser(); // Check if the EventInfo exists for the given EventId if (!user.EventInfo.TryGetValue(evid, out EventData? eventData)) { throw new Exception($"Event with ID {evid} not found."); } - // Update the LastStage in EventData - eventData.LastStage = stgid; - + if (!eventData.ClearedStages.Contains(stgid)) + { + eventData.ClearedStages.Add(stgid); + // Update the LastStage in EventData + eventData.LastStage = stgid; + } JsonDb.Save(); ResFastClearArchiveStage response = new(); diff --git a/EpinelPS/LobbyServer/Archive/GetNonResettable.cs b/EpinelPS/LobbyServer/Archive/GetNonResettable.cs index 4a64ac3..8ca02d7 100644 --- a/EpinelPS/LobbyServer/Archive/GetNonResettable.cs +++ b/EpinelPS/LobbyServer/Archive/GetNonResettable.cs @@ -1,7 +1,4 @@ using EpinelPS.Utils; -using EpinelPS.Data; // Ensure this namespace is included - - namespace EpinelPS.LobbyServer.Archive { [PacketPath("/archive/scenario/getnonresettable")] @@ -9,41 +6,16 @@ namespace EpinelPS.LobbyServer.Archive { protected override async Task HandleAsync() { - ReqGetNonResettableArchiveScenario req = await ReadData(); // req has EventId field - int evId = req.EventId; + ReqGetNonResettableArchiveScenario req = await ReadData(); ResGetNonResettableArchiveScenario response = new(); - // Access the GameData instance - GameData gameData = GameData.Instance; - - if (evId == 130002) + User user = GetUser(); + foreach (var (evtId, evtData) in user.EventInfo) { - // Directly use the archiveEventQuestRecords dictionary - foreach (ArchiveEventQuestRecord_Raw record in gameData.archiveEventQuestRecords.Values) + if (evtId == req.EventId) { - if (record.EventQuestManagerId == evId) - { - // Add the end_scenario_Id to the ScenarioIdList - if (!string.IsNullOrEmpty(record.EndScenarioId)) - { - response.ScenarioIdList.Add(record.EndScenarioId); - } - } - } - } - else - { - // Directly use the archiveEventStoryRecords dictionary - foreach (ArchiveEventStoryRecord record in gameData.archiveEventStoryRecords.Values) - { - if (record.EventId == evId) - { - // Add the PrologueScenario to the ScenarioIdList - if (!string.IsNullOrEmpty(record.PrologueScenario)) - { - response.ScenarioIdList.Add(record.PrologueScenario); - } - } + response.ScenarioIdList.AddRange(evtData.CompletedScenarios); + break; } } diff --git a/EpinelPS/LobbyServer/Archive/GetResettable.cs b/EpinelPS/LobbyServer/Archive/GetResettable.cs index a06c5a6..79b277e 100644 --- a/EpinelPS/LobbyServer/Archive/GetResettable.cs +++ b/EpinelPS/LobbyServer/Archive/GetResettable.cs @@ -10,11 +10,21 @@ namespace EpinelPS.LobbyServer.Archive ReqGetResettableArchiveScenario req = await ReadData(); ResGetResettableArchiveScenario response = new(); // has ScenarioIdList field that takes in strings - // Retrieve stage IDs from GameData - List stageIds = [.. GameData.Instance.archiveEventDungeonStageRecords.Values.Select(record => record.StageId.ToString())]; - - // Add them to the response - response.ScenarioIdList.Add(stageIds); + GameData gameData = GameData.Instance; + User user = GetUser(); + foreach (ArchiveEventStoryRecord record in gameData.archiveEventStoryRecords.Values) + { + // Add the PrologueScenario to the ScenarioIdList + if (record.EventId == req.EventId && !string.IsNullOrEmpty(record.PrologueScenario)) + { + if (user.EventInfo.TryGetValue(req.EventId, out EventData? evtData) && + evtData.CompletedScenarios.Contains(record.PrologueScenario)) + { + response.ScenarioIdList.Add(record.PrologueScenario); + } + break; + } + } await WriteDataAsync(response); } diff --git a/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs b/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs index dbc9785..74107b3 100644 --- a/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs +++ b/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs @@ -1,5 +1,4 @@ using EpinelPS.Utils; - namespace EpinelPS.LobbyServer.LobbyUser { [PacketPath("/user/scenario/exist")] @@ -13,21 +12,34 @@ namespace EpinelPS.LobbyServer.LobbyUser ResExistScenario response = new(); - User user = GetUser(); - foreach (string? item in req.ScenarioGroupIds) { - foreach (string completed in user.CompletedScenarios) + if (FindScenarioInMainStages(item) || FindScenarioInArchiveStages(item)) { - // story thingy was completed - if (completed == item) - { - response.ExistGroupIds.Add(item); - } + response.ExistGroupIds.Add(item); } } await WriteDataAsync(response); } + + private bool FindScenarioInMainStages(string scenarioGroupId) + { + User user = GetUser(); + return user.CompletedScenarios.Contains(scenarioGroupId); + } + + private bool FindScenarioInArchiveStages(string scenarioGroupId) + { + User user = GetUser(); + foreach (EventData evtData in user.EventInfo.Values) + { + if (evtData.CompletedScenarios.Contains(scenarioGroupId)) + { + return true; + } + } + return false; + } } }