diff --git a/EpinelPS/LobbyServer/Inventory/IncreaseEquipmentExp.cs b/EpinelPS/LobbyServer/Inventory/IncreaseEquipmentExp.cs index d16c8ce..0591d1d 100644 --- a/EpinelPS/LobbyServer/Inventory/IncreaseEquipmentExp.cs +++ b/EpinelPS/LobbyServer/Inventory/IncreaseEquipmentExp.cs @@ -20,11 +20,13 @@ namespace EpinelPS.LobbyServer.Inventory var item = user.Items.FirstOrDefault(x => x.Isn == srcItem.Isn); item.Count -= srcItem.Count; - goldCost += AddExp(srcItem, destItem); + goldCost += AddExp(srcItem, destItem).exp; + + // TODO: boost modules. for now, excess exp gets scrapped response.Items.Add(NetUtils.ToNet(item)); } - + response.Currency = new NetUserCurrencyData { Type = (int)CurrencyType.Gold, @@ -33,13 +35,13 @@ namespace EpinelPS.LobbyServer.Inventory // we NEED to make sure the target item itself is in the delta list, or the UI won't update! response.Items.Add(NetUtils.ToNet(destItem)); - + JsonDb.Save(); await WriteDataAsync(response); } - int AddExp(NetItemData srcItem, ItemData destItem) + (int exp, int modules) AddExp(NetItemData srcItem, ItemData destItem) { var srcEquipRecord = GameData.Instance.itemEquipTable.Values.FirstOrDefault(x => x.id == srcItem.Tid); var destEquipRecord = GameData.Instance.itemEquipTable.Values.FirstOrDefault(x => x.id == destItem.ItemType); @@ -51,11 +53,12 @@ namespace EpinelPS.LobbyServer.Inventory .OrderBy(x => x) // order from lowest to highest .ToArray(); int exp = levelRecord.exp * srcItem.Count; + int modules = 0; destItem.Exp += exp * srcItem.Count; - + // TODO: double-check this. is this a thing? - // destItem.Exp += GetUser().Items.FirstOrDefault(x => x.Isn == srcItem.Isn).Exp; + // destItem.Exp += GetSourceExp(srcItem); while (destItem.Exp >= expNextTable[destItem.Level + 1] && destItem.Level < maxLevel[destEquipRecord.grade_core_id - 1]) { @@ -65,9 +68,30 @@ namespace EpinelPS.LobbyServer.Inventory if (destItem.Level >= maxLevel[destEquipRecord.grade_core_id - 1]) { + modules = destItem.Exp; // is the ratio actually 1:1? destItem.Exp = 0; } + return (exp, modules); + } + + int GetSourceExp(NetItemData srcItem) + { + var item = GetUser().Items.FirstOrDefault(x => x.Isn == srcItem.Isn); + var equipRecord = GameData.Instance.itemEquipTable.Values.FirstOrDefault(x => x.id == item.ItemType); + var levelRecord = GameData.Instance.ItemEquipGradeExpTable.Values.FirstOrDefault(x => x.grade_core_id == equipRecord.grade_core_id); + int[] expNextTable = GameData.Instance.itemEquipExpTable.Values + .Where(x => x.item_rare == equipRecord.item_rare) + .Select(x => x.exp) + .ToArray(); + int level = item.Level; + int exp = item.Exp; + + while (level-- > 0) + { + exp += expNextTable[level]; + } + return exp; } }