From 913c1a226256d1a7ac392f50c23951bb468acedf Mon Sep 17 00:00:00 2001 From: Mikhail Tyukin Date: Sat, 6 Dec 2025 12:14:01 -0500 Subject: [PATCH] begin implementing story mode --- EpinelPS/Data/GameData.cs | 46 +++---------------- .../LobbyServer/LobbyUser/EnterLobbyServer.cs | 4 ++ EpinelPS/LobbyServer/LobbyUser/GetUser.cs | 3 ++ .../LobbyServer/Misc/GetMaintenanceNotice.cs | 4 +- EpinelPS/LobbyServer/Stage/ClearStage.cs | 14 ++++-- EpinelPS/Models/UserModel.cs | 2 + 6 files changed, 28 insertions(+), 45 deletions(-) diff --git a/EpinelPS/Data/GameData.cs b/EpinelPS/Data/GameData.cs index 0f2c29d..29d4d6b 100644 --- a/EpinelPS/Data/GameData.cs +++ b/EpinelPS/Data/GameData.cs @@ -595,45 +595,6 @@ namespace EpinelPS.Data } return -1; } - public string? GetMapIdFromDBFieldName(string field) - { - // Get game map ID from DB Field Name (ex: 1_Normal for chapter 1 normal) - string[] keys = field.Split("_"); - if (int.TryParse(keys[0], out int chapterNum)) - { - string difficulty = keys[1]; - - foreach (KeyValuePair item in ChapterCampaignData) - { - if (difficulty == "Normal" && item.Value.Chapter == chapterNum) - { - return item.Value.FieldId; - } - else if (difficulty == "Hard" && item.Value.Chapter == chapterNum) - { - return item.Value.HardFieldId; - } - } - - return null; - } - else - { - return keys[0]; // Already a Map ID - } - } - public int GetNormalChapterNumberFromFieldName(string field) - { - foreach (KeyValuePair item in ChapterCampaignData) - { - if (item.Value.FieldId == field) - { - return item.Value.Chapter; - } - } - - return -1; - } public IEnumerable GetAllCostumes() { foreach (KeyValuePair item in CharacterCostumeTable) @@ -740,7 +701,12 @@ namespace EpinelPS.Data CampaignChapterRecord data = ChapterCampaignData[chapter - 1]; if (mod == ChapterMod.Hard) return data.HardFieldId; - else return data.FieldId; + else if (mod == ChapterMod.Normal) + return data.FieldId; + else if (mod == ChapterMod.Story) + return data.StoryFieldId; + + throw new NotImplementedException($"difficulty {mod} not implemented"); } internal int GetConditionReward(int groupId, long damage) diff --git a/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs b/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs index f2d0f2d..2cfd479 100644 --- a/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs +++ b/EpinelPS/LobbyServer/LobbyUser/EnterLobbyServer.cs @@ -110,6 +110,10 @@ namespace EpinelPS.LobbyServer.LobbyUser } response.LastClearedNormalMainStageId = user.LastNormalStageCleared; + response.LastClearedStoryStageId = user.LastStoryStageCleared; + response.LastClearedHardMainStageId = user.LastHardStageCleared; + response.LastClearedMod = user.LastClearedDifficulty; + response.TimeRewardBuffs.AddRange(NetUtils.GetOutpostTimeReward(user)); response.OwnedLobbyDecoBackgroundIdList.AddRange(user.LobbyDecoBackgroundList); diff --git a/EpinelPS/LobbyServer/LobbyUser/GetUser.cs b/EpinelPS/LobbyServer/LobbyUser/GetUser.cs index 13f7faf..8f0e7c3 100644 --- a/EpinelPS/LobbyServer/LobbyUser/GetUser.cs +++ b/EpinelPS/LobbyServer/LobbyUser/GetUser.cs @@ -30,6 +30,9 @@ namespace EpinelPS.LobbyServer.LobbyUser response.RepresentationTeam = NetUtils.GetDisplayedTeam(user); response.LastClearedNormalMainStageId = user.LastNormalStageCleared; + response.LastClearedStoryStageId = user.LastStoryStageCleared; + response.LastClearedHardMainStageId = user.LastHardStageCleared; + response.LastClearedMod = user.LastClearedDifficulty; // Restore completed tutorials. GroupID is the first 4 digits of the Table ID. foreach (KeyValuePair item in user.ClearedTutorialData) diff --git a/EpinelPS/LobbyServer/Misc/GetMaintenanceNotice.cs b/EpinelPS/LobbyServer/Misc/GetMaintenanceNotice.cs index 76bf40e..622fef4 100644 --- a/EpinelPS/LobbyServer/Misc/GetMaintenanceNotice.cs +++ b/EpinelPS/LobbyServer/Misc/GetMaintenanceNotice.cs @@ -17,7 +17,7 @@ namespace EpinelPS.LobbyServer.Misc }; // Define maintenance window timestamps - Google.Protobuf.WellKnownTypes.Timestamp maintenanceFrom = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow.AddHours(-2)); // Example: 2 hour ago + /*Google.Protobuf.WellKnownTypes.Timestamp maintenanceFrom = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow.AddHours(-2)); // Example: 2 hour ago Google.Protobuf.WellKnownTypes.Timestamp maintenanceTo = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow.AddHours(-1)); // Example: 1 hour ago // Add a new maintenance window @@ -25,7 +25,7 @@ namespace EpinelPS.LobbyServer.Misc { From = maintenanceFrom, To = maintenanceTo - }; + };*/ await WriteDataAsync(r); } diff --git a/EpinelPS/LobbyServer/Stage/ClearStage.cs b/EpinelPS/LobbyServer/Stage/ClearStage.cs index 88e54c7..a175e86 100644 --- a/EpinelPS/LobbyServer/Stage/ClearStage.cs +++ b/EpinelPS/LobbyServer/Stage/ClearStage.cs @@ -92,25 +92,33 @@ namespace EpinelPS.LobbyServer.Stage }); } - if (clearedStage.StageCategory == StageCategory.Normal || clearedStage.StageCategory == StageCategory.Boss || clearedStage.StageCategory == StageCategory.Hard) + if (clearedStage.StageCategory == StageCategory.Normal || clearedStage.StageCategory == StageCategory.Boss || clearedStage.StageCategory == StageCategory.Hard || clearedStage.StageCategory == StageCategory.Story) { if (clearedStage.ChapterMod == ChapterMod.Hard) { if (StageId > user.LastHardStageCleared) user.LastHardStageCleared = StageId; } - else + else if (clearedStage.ChapterMod == ChapterMod.Story) + { + if (StageId > user.LastStoryStageCleared) + user.LastStoryStageCleared = StageId; + } + else if (clearedStage.ChapterMod == ChapterMod.Normal) { if (StageId > user.LastNormalStageCleared) user.LastNormalStageCleared = StageId; } + else throw new NotImplementedException(); } else { Logging.Warn("Unknown stage category " + clearedStage.StageCategory); } - if (clearedStage.StageType != StageType.Sub) + user.LastClearedDifficulty = (int)clearedStage.ChapterMod; + + if (clearedStage.StageType != StageType.Sub && clearedStage.ChapterMod != ChapterMod.Story) { // add outpost reward level if unlocked if (user.MainQuestData.TryGetValue(21, out bool _)) diff --git a/EpinelPS/Models/UserModel.cs b/EpinelPS/Models/UserModel.cs index 9919b6a..cd0c89b 100644 --- a/EpinelPS/Models/UserModel.cs +++ b/EpinelPS/Models/UserModel.cs @@ -22,7 +22,9 @@ public class User public ulong ID; public long RegisterTime; public int LastNormalStageCleared; + public int LastStoryStageCleared; public int LastHardStageCleared; + public int LastClearedDifficulty; public string? Nickname; public int ProfileIconId = 39900; public bool ProfileIconIsPrism = false;