//
// UseItemPolicy.cs
//
// Copyright (c) František Boháček. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using NosSmooth.Extensions.Combat.Errors;
using NosSmooth.Extensions.Combat.Selectors;
using NosSmooth.Game.Data.Characters;
using NosSmooth.Game.Data.Items;
using Remora.Results;
namespace NosSmooth.Extensions.Combat.Policies;
///
/// The policy to use an item.
///
/// Whether to use items.
/// Use items below the given character's health percentage.
/// Use items below the given character's mana percentage.
/// The vnums of the items to use as health items.
/// The vnums of the items to use as mana items.
public record UseItemPolicy
(
bool UseItems,
int UseBelowHealthPercentage,
int UseBelowManaPercentage,
int[] UseHealthItemsVNums,
int[] UseManaItemsVNums
) : IItemSelector
{
///
public Result GetSelectedItem(ICombatState combatState, ICollection possibleItems)
{
var character = combatState.Game.Character;
if (character is null)
{
return new ItemNotFoundError();
}
if (ShouldUseHpItem(character))
{
var item = possibleItems.Cast().FirstOrDefault
(x => UseHealthItemsVNums.Contains(x?.Item.Item?.ItemVNum ?? -1));
if (item is not null)
{
return item.Value;
}
}
if (ShouldUseMpItem(character))
{
var item = possibleItems.Cast().FirstOrDefault
(x => UseManaItemsVNums.Contains(x?.Item.Item?.ItemVNum ?? -1));
if (item is not null)
{
return item.Value;
}
}
return new ItemNotFoundError();
}
///
public Result ShouldUseItem(ICombatState combatState)
{
if (!UseItems)
{
return false;
}
var character = combatState.Game.Character;
if (character is null)
{
return false;
}
return ShouldUseHpItem(character) || ShouldUseMpItem(character);
}
private bool ShouldUseHpItem(Character character)
{
return character.Hp is not null && character.Hp.Percentage is not null
&& character.Hp.Percentage < UseBelowHealthPercentage;
}
private bool ShouldUseMpItem(Character character)
{
return character.Mp is not null && character.Mp.Percentage is not null
&& character.Mp.Percentage < UseBelowManaPercentage;
}
}