qstbak/Questionable/Questionable.Controller.CustomDelivery/DeliveryRewardCalculator.cs
2026-08-17 20:29:32 +10:00

105 lines
3.5 KiB
C#

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<uint, int> ScripCaps = new Dictionary<uint, int>
{
[33913u] = 4000,
[41784u] = 4000
};
internal List<CurrencyReward> CalculateRewards(uint rewardRowId, bool hasBonus, Configuration.CustomDeliveryConfiguration.ECollectabilityTier tier = Configuration.CustomDeliveryConfiguration.ECollectabilityTier.High)
{
List<CurrencyReward> list = new List<CurrencyReward>();
if (!dataManager.GetExcelSheet<SatisfactionSupplyReward>().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<CurrencyReward> 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<SatisfactionSupplyReward>().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<Item>().TryGetRow(currencyItemId, out var row))
{
return row.Name.ToString();
}
return $"Currency#{currencyItemId}";
}
}