include discounts in purchase prices

This commit is contained in:
Spirtix 2023-12-09 22:01:10 +01:00
parent 5b8c952419
commit 80481713e3
3 changed files with 56 additions and 5 deletions

View File

@ -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;

View File

@ -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));
}
}
}

View File

@ -17,8 +17,11 @@ public class StoreService {
SalesAtStore = s.SalesAtStore,
PopularItems = s.PopularItems
};
for (int i=0; i<s.ItemId.Length; ++i) {
IEnumerable<ItemsInStoreDataSale>? memberSales = s.SalesAtStore?.Where(x => x.ForMembers == true);
IEnumerable<ItemsInStoreDataSale>? 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<ItemsInStoreDataSale>? memberSales, IEnumerable<ItemsInStoreDataSale>? 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;
}
}
}
}
}