diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index 932ddf8..3a8abbf 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -754,8 +754,8 @@ public class ContentController : Controller { int itemId = request.Items[i]; ItemData item = itemService.GetItem(itemId); UserGameCurrency currency = achievementService.GetUserCurrency(viking); - int coinCost = (int)Math.Round(0.8 * item.Cost); // 20% discount for members - int gemCost = (int)Math.Round(0.8 * item.CashCost); + int coinCost = (int)Math.Round(item.FinalDiscoutModifier * item.Cost); + int gemCost = (int)Math.Round(item.FinalDiscoutModifier * item.CashCost); if (currency.GameCurrency - coinCost < 0 && currency.CashCurrency - gemCost < 0) { success = false; break; @@ -819,8 +819,8 @@ public class ContentController : Controller { for (int i = 0; i < itemIdArr.Length; i++) { ItemData item = itemService.GetItem(itemIdArr[i]); UserGameCurrency currency = achievementService.GetUserCurrency(viking); - int coinCost = (int)Math.Round(0.8 * item.Cost); // 20% discount for members - int gemCost = (int)Math.Round(0.8 * item.CashCost); + int coinCost = (int)Math.Round(item.FinalDiscoutModifier * item.Cost); + int gemCost = (int)Math.Round(item.FinalDiscoutModifier * item.CashCost); if (currency.GameCurrency - coinCost < 0 && currency.CashCurrency - gemCost < 0) { success = false; break; diff --git a/src/Schema/ItemData.cs b/src/Schema/ItemData.cs index bd95933..fc18947 100644 --- a/src/Schema/ItemData.cs +++ b/src/Schema/ItemData.cs @@ -97,4 +97,17 @@ public class ItemData [XmlElement(ElementName = "p", IsNullable = true)] public int? Points; + + [XmlIgnore] + public float NormalDiscoutModifier; + + [XmlIgnore] + public float MemberDiscountModifier; + + [XmlIgnore] + public float FinalDiscoutModifier { + get { + return Math.Min(1f, (1f - NormalDiscoutModifier) * (1f - MemberDiscountModifier)); + } + } } diff --git a/src/Services/StoreService.cs b/src/Services/StoreService.cs index b20a7ce..8994043 100644 --- a/src/Services/StoreService.cs +++ b/src/Services/StoreService.cs @@ -17,8 +17,11 @@ public class StoreService { SalesAtStore = s.SalesAtStore, PopularItems = s.PopularItems }; - for (int i=0; i? memberSales = s.SalesAtStore?.Where(x => x.ForMembers == true); + IEnumerable? normalSales = s.SalesAtStore?.Where(x => x.ForMembers == false || x.ForMembers == null); + for (int i = 0; i < s.ItemId.Length; ++i) { newStore.Items[i] = itemService.GetItem(s.ItemId[i]); + UpdateItemSaleModifier(newStore.Items[i], memberSales, normalSales); } stores.Add(s.Id, newStore); } @@ -27,4 +30,39 @@ public class StoreService { public ItemsInStoreData GetStore(int id) { return stores[id]; } + + private bool IsSaleOutdated(ItemsInStoreDataSale sale) { + if (sale.EndDate == null) + return false; + return sale.EndDate < DateTime.Now; + } + + private void UpdateItemSaleModifier(ItemData item, IEnumerable? memberSales, IEnumerable? normalSales) { + if (memberSales != null) { + foreach (var memberSale in memberSales) { + if (IsSaleOutdated(memberSale)) continue; + if (item.Category != null && memberSale.CategoryIDs != null && item.Category.Any(x => memberSale.CategoryIDs.Contains(x.CategoryId))) { + item.MemberDiscountModifier = memberSale.Modifier; + break; + } + if (memberSale.ItemIDs != null && memberSale.ItemIDs.Contains(item.ItemID)) { + item.MemberDiscountModifier = memberSale.Modifier; + break; + } + } + } + if (normalSales != null) { + foreach (var normalSale in normalSales) { + if (IsSaleOutdated(normalSale)) continue; + if (item.Category != null && normalSale.CategoryIDs != null && item.Category.Any(x => normalSale.CategoryIDs.Contains(x.CategoryId))) { + item.NormalDiscoutModifier = normalSale.Modifier; + break; + } + if (normalSale.ItemIDs != null && normalSale.ItemIDs.Contains(item.ItemID)) { + item.NormalDiscoutModifier = normalSale.Modifier; + break; + } + } + } + } }