forked from aly/qstbak
105 lines
3.5 KiB
C#
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}";
|
|
}
|
|
}
|