using System; using System.Collections.Generic; using Dalamud.Plugin.Services; using LLib.Inventory; using Lumina.Excel.Sheets; namespace Questionable.Controller.CustomDelivery; internal sealed class DeliveryRewardCalculator(IDataManager dataManager) { internal record struct CurrencyReward(uint CurrencyItemId, string CurrencyName, int AmountPerDelivery); private static readonly Dictionary ScripCaps = new Dictionary { [33913u] = 4000, [41784u] = 4000 }; internal List CalculateRewards(uint rewardRowId, bool hasBonus, Configuration.CustomDeliveryConfiguration.ECollectabilityTier tier = Configuration.CustomDeliveryConfiguration.ECollectabilityTier.High) { List list = new List(); if (!dataManager.GetExcelSheet().TryGetRow(rewardRowId, out var row)) { return list; } foreach (SatisfactionSupplyReward.SatisfactionSupplyRewardDataStruct satisfactionSupplyRewardDatum in row.SatisfactionSupplyRewardData) { uint rewardCurrency = satisfactionSupplyRewardDatum.RewardCurrency; if (rewardCurrency != 0) { int num = tier switch { Configuration.CustomDeliveryConfiguration.ECollectabilityTier.Low => satisfactionSupplyRewardDatum.QuantityLow, Configuration.CustomDeliveryConfiguration.ECollectabilityTier.Mid => satisfactionSupplyRewardDatum.QuantityMid, _ => satisfactionSupplyRewardDatum.QuantityHigh, }; if (hasBonus) { num = num * row.BonusMultiplier / 100; } string currencyName = GetCurrencyName(rewardCurrency); list.Add(new CurrencyReward(rewardCurrency, currencyName, num)); } } return list; } internal static bool WouldOvercap(uint currencyItemId, int amountPerDelivery, int deliveryCount) { if (!ScripCaps.TryGetValue(currencyItemId, out var value)) { return false; } return InventoryHelper.GetItemCount(currencyItemId) + amountPerDelivery * deliveryCount > value; } internal int MaxDeliveriesBeforeOvercap(uint rewardRowId, bool hasBonus, Configuration.CustomDeliveryConfiguration.ECollectabilityTier tier = Configuration.CustomDeliveryConfiguration.ECollectabilityTier.High) { List list = CalculateRewards(rewardRowId, hasBonus, tier); int num = int.MaxValue; foreach (CurrencyReward item in list) { if (ScripCaps.TryGetValue(item.CurrencyItemId, out var value) && item.AmountPerDelivery > 0) { int itemCount = InventoryHelper.GetItemCount(item.CurrencyItemId); int num2 = value - itemCount; int val = ((num2 > 0) ? (num2 / item.AmountPerDelivery) : 0); num = Math.Min(num, val); } } if (num != int.MaxValue) { return num; } return int.MaxValue; } internal int CalculateSatisfactionPerDelivery(uint rewardRowId, bool hasBonus, Configuration.CustomDeliveryConfiguration.ECollectabilityTier tier = Configuration.CustomDeliveryConfiguration.ECollectabilityTier.High) { if (!dataManager.GetExcelSheet().TryGetRow(rewardRowId, out var row)) { return 0; } int num = tier switch { Configuration.CustomDeliveryConfiguration.ECollectabilityTier.Low => row.SatisfactionLow, Configuration.CustomDeliveryConfiguration.ECollectabilityTier.Mid => row.SatisfactionMid, _ => row.SatisfactionHigh, }; if (hasBonus) { num = num * row.BonusMultiplier / 100; } return num; } private string GetCurrencyName(uint currencyItemId) { if (dataManager.GetExcelSheet().TryGetRow(currencyItemId, out var row)) { return row.Name.ToString(); } return $"Currency#{currencyItemId}"; } }