diff --git a/EpinelPS/LobbyServer/Campaign/ObtainItem.cs b/EpinelPS/LobbyServer/Campaign/ObtainItem.cs index f881b58..cd906cf 100644 --- a/EpinelPS/LobbyServer/Campaign/ObtainItem.cs +++ b/EpinelPS/LobbyServer/Campaign/ObtainItem.cs @@ -46,7 +46,7 @@ namespace EpinelPS.LobbyServer.Campaign if (!GameData.Instance.PositionReward.TryGetValue(req.FieldObject.PositionId, out int fieldReward)) throw new Exception("bad position id"); var positionReward = GameData.Instance.FieldItems[fieldReward]; var reward = GameData.Instance.GetRewardTableEntry(positionReward.type_value) ?? throw new Exception("failed to get reward"); - response.Reward = ClearStage.RegisterRewardsForUser(user, reward); + response.Reward = RewardUtils.RegisterRewardsForUser(user, reward); // Hide it from the field field.CompletedObjects.Add(new NetFieldObject() { PositionId = req.FieldObject.PositionId, Type = req.FieldObject.Type}); diff --git a/EpinelPS/LobbyServer/Outpost/ObtainOutpostReward.cs b/EpinelPS/LobbyServer/Outpost/ObtainOutpostReward.cs index b0e10fe..7f188ba 100644 --- a/EpinelPS/LobbyServer/Outpost/ObtainOutpostReward.cs +++ b/EpinelPS/LobbyServer/Outpost/ObtainOutpostReward.cs @@ -1,8 +1,7 @@ using EpinelPS.Database; -using EpinelPS.LobbyServer.Stage; using EpinelPS.Utils; -namespace EpinelPS.LobbyServer.Outpost +namespace EpinelPS.LobbyServer.Msgs.Outpost { [PacketPath("/outpost/obtainoutpostbattlereward")] public class ObtainOutpostReward : LobbyMsgHandler diff --git a/EpinelPS/LobbyServer/Sidestory/ClearSideStoryStage.cs b/EpinelPS/LobbyServer/Sidestory/ClearSideStoryStage.cs index d47e494..7193327 100644 --- a/EpinelPS/LobbyServer/Sidestory/ClearSideStoryStage.cs +++ b/EpinelPS/LobbyServer/Sidestory/ClearSideStoryStage.cs @@ -24,7 +24,7 @@ namespace EpinelPS.LobbyServer.Sidestory var rewardData = GameData.Instance.GetRewardTableEntry(GameData.Instance.SidestoryRewardTable[req.SideStoryStageId]); if (rewardData != null) - response.Reward = ClearStage.RegisterRewardsForUser(user, rewardData); + response.Reward = RewardUtils.RegisterRewardsForUser(user, rewardData); else throw new Exception("failed to find reward"); } diff --git a/EpinelPS/LobbyServer/Stage/ClearStage.cs b/EpinelPS/LobbyServer/Stage/ClearStage.cs index 8fbf0c6..c0ebdb4 100644 --- a/EpinelPS/LobbyServer/Stage/ClearStage.cs +++ b/EpinelPS/LobbyServer/Stage/ClearStage.cs @@ -55,7 +55,7 @@ namespace EpinelPS.LobbyServer.Stage } if (rewardData != null) - response.StageClearReward = RegisterRewardsForUser(user, rewardData); + response.StageClearReward = RewardUtils.RegisterRewardsForUser(user, rewardData); else Console.WriteLine("rewardId is null for stage " + StageId); @@ -115,156 +115,6 @@ namespace EpinelPS.LobbyServer.Stage return response; } - public static NetRewardData RegisterRewardsForUser(Database.User user, RewardTableRecord rewardData) - { - NetRewardData ret = new(); - if (rewardData.rewards == null) return ret; - - if (rewardData.user_exp != 0) - { - var newXp = rewardData.user_exp + user.userPointData.ExperiencePoint; - - var oldXpData = GameData.Instance.GetUserLevelFromUserExp(user.userPointData.ExperiencePoint); - var newLevelExp = GameData.Instance.GetUserMinXpForLevel(user.userPointData.UserLevel); - var newLevel = user.userPointData.UserLevel; - - if (newLevelExp == -1) - { - Console.WriteLine("Unknown user level value for xp " + newXp); - } - - - while (newXp >= newLevelExp) - { - newLevel++; - newXp -= oldXpData.Item2; - if (user.Currency.ContainsKey(CurrencyType.FreeCash)) - user.Currency[CurrencyType.FreeCash] += 30; - else - user.Currency.Add(CurrencyType.FreeCash, 30); - - newLevelExp = GameData.Instance.GetUserMinXpForLevel(newLevel); - } - - - // TODO: what is the difference between IncreaseExp and GainExp - // NOTE: Current Exp/Lv refers to after XP was added. - - ret.UserExp = new NetIncreaseExpData() - { - BeforeExp = user.userPointData.ExperiencePoint, - BeforeLv = user.userPointData.UserLevel, - - IncreaseExp = rewardData.user_exp, - CurrentExp = newXp, - CurrentLv = newLevel, - - GainExp = rewardData.user_exp, - Csn = 123, - }; - user.userPointData.ExperiencePoint = newXp; - - user.userPointData.UserLevel = newLevel; - } - - foreach (var item in rewardData.rewards) - { - if (item.reward_id != 0) - { - if (string.IsNullOrEmpty(item.reward_type) || string.IsNullOrWhiteSpace(item.reward_type)) { } - else if (item.reward_type == "Currency") - { - bool found = false; - foreach (var currentReward in user.Currency) - { - if (currentReward.Key == (CurrencyType)item.reward_id) - { - user.Currency[currentReward.Key] += item.reward_value; - - ret.Currency.Add(new NetCurrencyData() - { - FinalValue = user.Currency[currentReward.Key], - Value = item.reward_value, - Type = item.reward_id - }); - found = true; - break; - } - } - - if (!found) - { - user.Currency.Add((CurrencyType)item.reward_id, item.reward_value); - ret.Currency.Add(new NetCurrencyData() - { - FinalValue = item.reward_value, - Value = item.reward_value, - Type = item.reward_id - }); - } - } - else if (item.reward_type == "Item") - { - // Check if user already has said item. If it is level 1, increase item count. - // If user does not have item, generate a new item ID - if (user.Items.Where(x => x.ItemType == item.reward_id && x.Level == 1).Any()) - { - ItemData? newItem = user.Items.Where(x => x.ItemType == item.reward_id && x.Level == 1).FirstOrDefault(); - if (newItem != null) - { - newItem.Count += item.reward_value; - - ret.Item.Add(new NetItemData() - { - Count = item.reward_value, - Tid = item.reward_id, - Isn = newItem.Isn - }); - } - else - { - throw new Exception("should not occur"); - } - } - else - { - - var id = user.GenerateUniqueItemId(); - user.Items.Add(new ItemData() { ItemType = item.reward_id, Isn = id, Level = 1, Exp = 0, Count = item.reward_value }); - ret.Item.Add(new NetItemData() - { - Count = item.reward_value, - Tid = item.reward_id, - Isn = id - }); - } - } - else if (item.reward_type == "Memorial") - { - if (!user.Memorial.Contains(item.reward_id)) - { - ret.Memorial.Add(item.reward_id); - user.Memorial.Add(item.reward_id); - } - } - else if (item.reward_type == "Bgm") - { - if (!user.JukeboxBgm.Contains(item.reward_id)) - { - ret.JukeboxBgm.Add(item.reward_id); - user.JukeboxBgm.Add(item.reward_id); - } - } - else - { - Console.WriteLine("TODO: Reward type " + item.reward_type); - } - } - } - - return ret; - } - private static void DoQuestSpecificUserOperations(Database.User user, int clearedStageId) { var quest = GameData.Instance.GetMainQuestForStageClearCondition(clearedStageId); diff --git a/EpinelPS/LobbyServer/Tower/ClearTower.cs b/EpinelPS/LobbyServer/Tower/ClearTower.cs index 2c40975..705ed14 100644 --- a/EpinelPS/LobbyServer/Tower/ClearTower.cs +++ b/EpinelPS/LobbyServer/Tower/ClearTower.cs @@ -44,7 +44,7 @@ namespace EpinelPS.LobbyServer.Tower } var reward = GameData.Instance.GetRewardTableEntry(record.reward_id) ?? throw new Exception("failed to get reward"); - response.Reward = ClearStage.RegisterRewardsForUser(user, reward); + response.Reward = RewardUtils.RegisterRewardsForUser(user, reward); JsonDb.Save(); diff --git a/EpinelPS/LobbyServer/Trigger/ObtainMainQuestReward.cs b/EpinelPS/LobbyServer/Trigger/ObtainMainQuestReward.cs index efdf875..ba78537 100644 --- a/EpinelPS/LobbyServer/Trigger/ObtainMainQuestReward.cs +++ b/EpinelPS/LobbyServer/Trigger/ObtainMainQuestReward.cs @@ -33,7 +33,7 @@ namespace EpinelPS.LobbyServer.Trigger var reward = GameData.Instance.GetRewardTableEntry(questInfo.reward_id); if (reward == null) throw new Exception("failed to lookup reward id " + questInfo.reward_id); - rewards.Add(ClearStage.RegisterRewardsForUser(user, reward)); + rewards.Add(RewardUtils.RegisterRewardsForUser(user, reward)); } } diff --git a/EpinelPS/Utils/RewardUtils.cs b/EpinelPS/Utils/RewardUtils.cs new file mode 100644 index 0000000..8954cf7 --- /dev/null +++ b/EpinelPS/Utils/RewardUtils.cs @@ -0,0 +1,160 @@ +using EpinelPS.Database; +using EpinelPS.StaticInfo; + +namespace EpinelPS.Utils +{ + // Calculate rewards for various messages + public class RewardUtils + { + + public static NetRewardData RegisterRewardsForUser(Database.User user, RewardTableRecord rewardData) + { + NetRewardData ret = new(); + if (rewardData.rewards == null) return ret; + + if (rewardData.user_exp != 0) + { + var newXp = rewardData.user_exp + user.userPointData.ExperiencePoint; + + var oldXpData = GameData.Instance.GetUserLevelFromUserExp(user.userPointData.ExperiencePoint); + var newLevelExp = GameData.Instance.GetUserMinXpForLevel(user.userPointData.UserLevel); + var newLevel = user.userPointData.UserLevel; + + if (newLevelExp == -1) + { + Console.WriteLine("Unknown user level value for xp " + newXp); + } + + + while (newXp >= newLevelExp) + { + newLevel++; + newXp -= oldXpData.Item2; + if (user.Currency.ContainsKey(CurrencyType.FreeCash)) + user.Currency[CurrencyType.FreeCash] += 30; + else + user.Currency.Add(CurrencyType.FreeCash, 30); + + newLevelExp = GameData.Instance.GetUserMinXpForLevel(newLevel); + } + + + // TODO: what is the difference between IncreaseExp and GainExp + // NOTE: Current Exp/Lv refers to after XP was added. + + ret.UserExp = new NetIncreaseExpData() + { + BeforeExp = user.userPointData.ExperiencePoint, + BeforeLv = user.userPointData.UserLevel, + + IncreaseExp = rewardData.user_exp, + CurrentExp = newXp, + CurrentLv = newLevel, + + GainExp = rewardData.user_exp, + Csn = 123, + }; + user.userPointData.ExperiencePoint = newXp; + + user.userPointData.UserLevel = newLevel; + } + + foreach (var item in rewardData.rewards) + { + if (item.reward_id != 0) + { + if (string.IsNullOrEmpty(item.reward_type) || string.IsNullOrWhiteSpace(item.reward_type)) { } + else if (item.reward_type == "Currency") + { + bool found = false; + foreach (var currentReward in user.Currency) + { + if (currentReward.Key == (CurrencyType)item.reward_id) + { + user.Currency[currentReward.Key] += item.reward_value; + + ret.Currency.Add(new NetCurrencyData() + { + FinalValue = user.Currency[currentReward.Key], + Value = item.reward_value, + Type = item.reward_id + }); + found = true; + break; + } + } + + if (!found) + { + user.Currency.Add((CurrencyType)item.reward_id, item.reward_value); + ret.Currency.Add(new NetCurrencyData() + { + FinalValue = item.reward_value, + Value = item.reward_value, + Type = item.reward_id + }); + } + } + else if (item.reward_type == "Item") + { + // Check if user already has said item. If it is level 1, increase item count. + // If user does not have item, generate a new item ID + if (user.Items.Where(x => x.ItemType == item.reward_id && x.Level == 1).Any()) + { + ItemData? newItem = user.Items.Where(x => x.ItemType == item.reward_id && x.Level == 1).FirstOrDefault(); + if (newItem != null) + { + newItem.Count += item.reward_value; + + ret.Item.Add(new NetItemData() + { + Count = item.reward_value, + Tid = item.reward_id, + Isn = newItem.Isn + }); + } + else + { + throw new Exception("should not occur"); + } + } + else + { + + var id = user.GenerateUniqueItemId(); + user.Items.Add(new ItemData() { ItemType = item.reward_id, Isn = id, Level = 1, Exp = 0, Count = item.reward_value }); + ret.Item.Add(new NetItemData() + { + Count = item.reward_value, + Tid = item.reward_id, + Isn = id + }); + } + } + else if (item.reward_type == "Memorial") + { + if (!user.Memorial.Contains(item.reward_id)) + { + ret.Memorial.Add(item.reward_id); + user.Memorial.Add(item.reward_id); + } + } + else if (item.reward_type == "Bgm") + { + if (!user.JukeboxBgm.Contains(item.reward_id)) + { + ret.JukeboxBgm.Add(item.reward_id); + user.JukeboxBgm.Add(item.reward_id); + } + } + else + { + Console.WriteLine("TODO: Reward type " + item.reward_type); + } + } + } + + return ret; + } + } +}