From 7a4542b97bf9d07fa24f0d685f97e6945a4f101f Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 27 Dec 2024 09:45:55 -0500 Subject: [PATCH] some fixes --- EpinelPS/Database/JsonDb.cs | 1 + .../LobbyServer/Campaign/GetCampaignField.cs | 2 +- EpinelPS/LobbyServer/Gacha/ExecGacha.cs | 8 ++++-- .../LobbyServer/Messenger/EnterMessenger.cs | 25 +++++++++++++++++++ EpinelPS/LobbyServer/Mission/GetAllRewards.cs | 5 +++- .../LobbyServer/Mission/ObtainAchievement.cs | 11 ++++++-- EpinelPS/LobbyServer/Mission/ObtainDaily.cs | 13 +++++----- EpinelPS/LobbyServer/Mission/ObtainWeekly.cs | 7 +----- EpinelPS/LobbyServer/Stage/ClearStage.cs | 14 ++++++++--- EpinelPS/LobbyServer/Stage/EnterStage.cs | 23 ++++++++++++++--- EpinelPS/LobbyServer/Stage/GetStage.cs | 21 ++++++++-------- EpinelPS/LobbyServer/Tower/ClearTower.cs | 10 ++++---- 12 files changed, 100 insertions(+), 40 deletions(-) create mode 100644 EpinelPS/LobbyServer/Messenger/EnterMessenger.cs diff --git a/EpinelPS/Database/JsonDb.cs b/EpinelPS/Database/JsonDb.cs index 8466baa..9210188 100644 --- a/EpinelPS/Database/JsonDb.cs +++ b/EpinelPS/Database/JsonDb.cs @@ -24,6 +24,7 @@ namespace EpinelPS.Database { public List CompletedStages = []; public List CompletedObjects = []; + public bool BossEntered = false; } public class Character diff --git a/EpinelPS/LobbyServer/Campaign/GetCampaignField.cs b/EpinelPS/LobbyServer/Campaign/GetCampaignField.cs index a5c348d..f281795 100644 --- a/EpinelPS/LobbyServer/Campaign/GetCampaignField.cs +++ b/EpinelPS/LobbyServer/Campaign/GetCampaignField.cs @@ -15,7 +15,7 @@ namespace EpinelPS.LobbyServer.Campaign Console.WriteLine("Map ID: " + req.MapId); var response = new ResGetCampaignFieldData(); - response.Field = GetStage.CreateFieldInfo(user, GameData.Instance.GetNormalChapterNumberFromFieldName(req.MapId), req.MapId.Contains("hard") ? "Hard" : "Normal"); + response.Field = GetStage.CreateFieldInfo(user, GameData.Instance.GetNormalChapterNumberFromFieldName(req.MapId), req.MapId.Contains("hard") ? "Hard" : "Normal", out bool bossEntered); // todo save this data response.Team = new NetUserTeamData() { LastContentsTeamNumber = 1, Type = 1 }; diff --git a/EpinelPS/LobbyServer/Gacha/ExecGacha.cs b/EpinelPS/LobbyServer/Gacha/ExecGacha.cs index 716d14d..5588a9c 100644 --- a/EpinelPS/LobbyServer/Gacha/ExecGacha.cs +++ b/EpinelPS/LobbyServer/Gacha/ExecGacha.cs @@ -206,14 +206,18 @@ namespace EpinelPS.LobbyServer.Gacha if (characterData.original_rare == "SSR") { - user.AddTrigger(TriggerType.ObtainCharacterSSR, 1); + user.AddTrigger(TriggerType.ObtainCharacterSSR, characterData.name_code); + } + else + { + user.AddTrigger(TriggerType.ObtainCharacter, characterData.name_code); } } } response.Gacha.Add(gacha); - user.AddTrigger(TriggerType.GachaCharacter, 1); + user.AddTrigger(TriggerType.GachaCharacter, 0, 0); } response.Reward.Currency.Add(new NetCurrencyData() { Type = (int)CurrencyType.SilverMileageTicket, Value = numberOfPulls }); diff --git a/EpinelPS/LobbyServer/Messenger/EnterMessenger.cs b/EpinelPS/LobbyServer/Messenger/EnterMessenger.cs new file mode 100644 index 0000000..89a71a0 --- /dev/null +++ b/EpinelPS/LobbyServer/Messenger/EnterMessenger.cs @@ -0,0 +1,25 @@ +using EpinelPS.Utils; + +namespace EpinelPS.LobbyServer.Messenger +{ + [PacketPath("/messenger/enter")] + public class EnterMessenger : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + + // 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 + }; + + await WriteDataAsync(response); + } + } +} diff --git a/EpinelPS/LobbyServer/Mission/GetAllRewards.cs b/EpinelPS/LobbyServer/Mission/GetAllRewards.cs index 0d2fd76..2e2728a 100644 --- a/EpinelPS/LobbyServer/Mission/GetAllRewards.cs +++ b/EpinelPS/LobbyServer/Mission/GetAllRewards.cs @@ -8,10 +8,13 @@ namespace EpinelPS.LobbyServer.Mission protected override async Task HandleAsync() { var req = await ReadData(); + var user = GetUser(); var response = new ResGetRewardedData(); - // TOOD + response.AchievementIds.Add(user.CompletedAchievements); + response.WeeklyIds.Add(user.WeeklyResetableData.CompletedWeeklyMissions); + response.DailyIds.Add(user.ResetableData.CompletedDailyMissions); await WriteDataAsync(response); } diff --git a/EpinelPS/LobbyServer/Mission/ObtainAchievement.cs b/EpinelPS/LobbyServer/Mission/ObtainAchievement.cs index 09b51fe..5876a6b 100644 --- a/EpinelPS/LobbyServer/Mission/ObtainAchievement.cs +++ b/EpinelPS/LobbyServer/Mission/ObtainAchievement.cs @@ -14,7 +14,9 @@ namespace EpinelPS.LobbyServer.Mission var response = new ResObtainAchievementReward(); - List rewards = new(); + List rewards = []; + + int total_points = 0; foreach (var item in req.TidList) { @@ -24,11 +26,16 @@ namespace EpinelPS.LobbyServer.Mission var rewardRecord = GameData.Instance.GetRewardTableEntry(key.reward_id) ?? throw new Exception("unable to lookup reward"); - rewards.Add(RewardUtils.RegisterRewardsForUser(user, rewardRecord)); + var reward = RewardUtils.RegisterRewardsForUser(user, rewardRecord); + rewards.Add(reward); user.CompletedAchievements.Add(item); + + total_points++; } + user.AddTrigger(TriggerType.PointRewardAchievement, total_points); + response.Reward = NetUtils.MergeRewards(rewards, user); JsonDb.Save(); diff --git a/EpinelPS/LobbyServer/Mission/ObtainDaily.cs b/EpinelPS/LobbyServer/Mission/ObtainDaily.cs index 190f08c..7b295da 100644 --- a/EpinelPS/LobbyServer/Mission/ObtainDaily.cs +++ b/EpinelPS/LobbyServer/Mission/ObtainDaily.cs @@ -14,13 +14,17 @@ namespace EpinelPS.LobbyServer.Mission var response = new ResObtainDailyMissionReward(); - List rewards = new(); + List rewards = []; int total_points = 0; foreach (var item in req.TidList) { - if (user.ResetableData.CompletedDailyMissions.Contains(item)) continue; + if (user.ResetableData.CompletedDailyMissions.Contains(item)) + { + Console.WriteLine("already completed daily mission"); + continue; + } if (!GameData.Instance.TriggerTable.TryGetValue(item, out TriggerRecord? key)) throw new Exception("unknown TID"); @@ -35,11 +39,6 @@ namespace EpinelPS.LobbyServer.Mission else { // Point reward - - var reward = new NetRewardData(); - - rewards.Add(reward); - total_points += key.point_value; } } diff --git a/EpinelPS/LobbyServer/Mission/ObtainWeekly.cs b/EpinelPS/LobbyServer/Mission/ObtainWeekly.cs index 981017e..850f3d5 100644 --- a/EpinelPS/LobbyServer/Mission/ObtainWeekly.cs +++ b/EpinelPS/LobbyServer/Mission/ObtainWeekly.cs @@ -14,7 +14,7 @@ namespace EpinelPS.LobbyServer.Mission var response = new ResObtainWeeklyMissionReward(); - List rewards = new(); + List rewards = []; int total_points = 0; @@ -35,11 +35,6 @@ namespace EpinelPS.LobbyServer.Mission else { // Point reward - - var reward = new NetRewardData(); - - rewards.Add(reward); - total_points += key.point_value; } } diff --git a/EpinelPS/LobbyServer/Stage/ClearStage.cs b/EpinelPS/LobbyServer/Stage/ClearStage.cs index fa0a184..8a6ed5f 100644 --- a/EpinelPS/LobbyServer/Stage/ClearStage.cs +++ b/EpinelPS/LobbyServer/Stage/ClearStage.cs @@ -29,9 +29,7 @@ namespace EpinelPS.LobbyServer.Stage public static ResClearStage CompleteStage(User user, int StageId, bool forceCompleteScenarios = false) { var response = new ResClearStage(); - var clearedStage = GameData.Instance.GetStageData(StageId); - if (clearedStage == null) throw new Exception("cleared stage cannot be null"); - + var clearedStage = GameData.Instance.GetStageData(StageId) ?? throw new Exception("cleared stage cannot be null"); if (user.FieldInfoNew.Count == 0) { @@ -134,6 +132,16 @@ namespace EpinelPS.LobbyServer.Stage } } + + // Mark chapter as completed if boss stage was completed + if (clearedStage.stage_category == "Boss" && clearedStage.stage_type == "Main") + { + if (clearedStage.chapter_mod == "Hard") + user.AddTrigger(TriggerType.HardChapterClear, 1, clearedStage.chapter_id); + else + user.AddTrigger(TriggerType.ChapterClear, 1, clearedStage.chapter_id); + } + // CreateClearInfo(user); var key = (clearedStage.chapter_id - 1) + "_" + clearedStage.chapter_mod; diff --git a/EpinelPS/LobbyServer/Stage/EnterStage.cs b/EpinelPS/LobbyServer/Stage/EnterStage.cs index b17937d..ad0122a 100644 --- a/EpinelPS/LobbyServer/Stage/EnterStage.cs +++ b/EpinelPS/LobbyServer/Stage/EnterStage.cs @@ -1,4 +1,6 @@ -using EpinelPS.Utils; +using EpinelPS.Database; +using EpinelPS.StaticInfo; +using EpinelPS.Utils; namespace EpinelPS.LobbyServer.Stage { @@ -11,8 +13,23 @@ namespace EpinelPS.LobbyServer.Stage var user = GetUser(); var response = new ResEnterStage(); - - user.AddTrigger(StaticInfo.TriggerType.CampaignStart, 1); + + var clearedStage = GameData.Instance.GetStageData(req.StageId) ?? throw new Exception("cleared stage cannot be null"); + + if (clearedStage.stage_category == "Boss") + { + // When entering a boss stage, unlock boss information in campaign + var key = (clearedStage.chapter_id - 1) + "_" + clearedStage.chapter_mod; + if (!user.FieldInfoNew.ContainsKey(key)) + user.FieldInfoNew.Add(key, new FieldInfoNew()); + + if (user.FieldInfoNew.TryGetValue(key, out FieldInfoNew? info)) + info.BossEntered = true; + } + + user.AddTrigger(TriggerType.CampaignStart, 1); + + JsonDb.Save(); await WriteDataAsync(response); } diff --git a/EpinelPS/LobbyServer/Stage/GetStage.cs b/EpinelPS/LobbyServer/Stage/GetStage.cs index 29290fc..37e35e4 100644 --- a/EpinelPS/LobbyServer/Stage/GetStage.cs +++ b/EpinelPS/LobbyServer/Stage/GetStage.cs @@ -8,25 +8,25 @@ namespace EpinelPS.LobbyServer.Stage { protected override async Task HandleAsync() { - var req = await ReadData(); + ReqGetStageData req = await ReadData(); var user = GetUser(); - var response = new ResGetStageData(); - - response.Field = CreateFieldInfo(user, req.Chapter - 1, req.Mod == 0 ? "Normal" : "Hard"); - - response.HasChapterBossEntered = true; - - response.SquadData = ""; + ResGetStageData response = new() + { + Field = CreateFieldInfo(user, req.Chapter - 1, req.Mod == 0 ? "Normal" : "Hard", out bool bossEntered), + HasChapterBossEntered = bossEntered, + SquadData = "" + }; await WriteDataAsync(response); } - public static NetFieldObjectData CreateFieldInfo(Database.User user, int chapter, string mod) + public static NetFieldObjectData CreateFieldInfo(Database.User user, int chapter, string mod, out bool BossEntered) { var f = new NetFieldObjectData(); bool found = false; string key = chapter + "_" + mod; + BossEntered = false; foreach (var item in user.FieldInfoNew) { if (item.Key == key) @@ -40,6 +40,7 @@ namespace EpinelPS.LobbyServer.Stage { f.Objects.Add(obj); } + BossEntered = item.Value.BossEntered; break; } } @@ -47,7 +48,7 @@ namespace EpinelPS.LobbyServer.Stage if (!found) { user.FieldInfoNew.Add(key, new FieldInfoNew()); - return CreateFieldInfo(user, chapter, mod); + return CreateFieldInfo(user, chapter, mod, out BossEntered); } return f; diff --git a/EpinelPS/LobbyServer/Tower/ClearTower.cs b/EpinelPS/LobbyServer/Tower/ClearTower.cs index 72002f4..f52156b 100644 --- a/EpinelPS/LobbyServer/Tower/ClearTower.cs +++ b/EpinelPS/LobbyServer/Tower/ClearTower.cs @@ -44,23 +44,23 @@ namespace EpinelPS.LobbyServer.Tower if (record.type == "TETRA") { - user.AddTrigger(TriggerType.TowerTetraClear, 1); + user.AddTrigger(TriggerType.TowerTetraClear, TowerId); } else if (record.type == "ELYSION") { - user.AddTrigger(TriggerType.TowerElysionClear, 1); + user.AddTrigger(TriggerType.TowerElysionClear, TowerId); } else if (record.type == "MISSILIS") { - user.AddTrigger(TriggerType.TowerMissilisClear, 1); + user.AddTrigger(TriggerType.TowerMissilisClear, TowerId); } else if (record.type == "PILGRIM") { - user.AddTrigger(TriggerType.TowerOverspecClear, 1); + user.AddTrigger(TriggerType.TowerOverspecClear, TowerId); } else if (record.type == "ALL") { - user.AddTrigger(TriggerType.TowerBasicClear, 1); + user.AddTrigger(TriggerType.TowerBasicClear, TowerId); } var reward = GameData.Instance.GetRewardTableEntry(record.reward_id) ?? throw new Exception("failed to get reward");