//
// UseSkillPolicy.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.Data.Abstractions.Enums;
using NosSmooth.Extensions.Combat.Errors;
using NosSmooth.Extensions.Combat.Selectors;
using NosSmooth.Game.Data.Characters;
using Remora.Results;
namespace NosSmooth.Extensions.Combat.Policies;
///
/// The policy to use a skill.
///
/// Whether to prefer targeted skills (true) or area skills (false).
/// The vnums of the skills that are allowed to be used.
public record UseSkillPolicy(bool PreferTargetedSkills, int[]? AllowedSkillVNums)
: ISkillSelector
{
///
public Result GetSelectedSkill(IEnumerable usableSkills)
{
var skills = usableSkills.Where(x => CanBeUsed(x))
.Reverse();
if (PreferTargetedSkills)
{
skills = skills.OrderBy(x => x.Info!.HitType == HitType.EnemiesInZone ? 1 : 0);
}
var skill = skills.FirstOrDefault();
if (skill is null)
{
return new SkillNotFoundError();
}
return skill;
}
private bool CanBeUsed(Skill skill)
{
if (AllowedSkillVNums is not null && !AllowedSkillVNums.Contains(skill.SkillVNum))
{
return false;
}
if (skill.Info is null)
{
return false;
}
return skill.Info.HitType is HitType.EnemiesInZone or HitType.TargetOnly
&& skill.Info.TargetType is TargetType.Target or TargetType.NoTarget;
}
}