// // UsePrimarySkillOperation.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.Game.Data.Characters; using NosSmooth.Game.Data.Entities; using NosSmooth.Packets.Client.Battle; using Remora.Results; namespace NosSmooth.Extensions.Combat.Operations; /// /// An operation that uses the primary skill of the character. /// public record UsePrimarySkillOperation(ILivingEntity Target) : ICombatOperation { private UseSkillOperation? _useSkillOperation; /// public Result CanBeUsed(ICombatState combatState) { if (_useSkillOperation is null) { var primarySkillResult = GetPrimarySkill(combatState); if (!primarySkillResult.IsDefined(out var primarySkill)) { return Result.FromError(primarySkillResult); } _useSkillOperation = new UseSkillOperation(primarySkill, Target); } return _useSkillOperation.CanBeUsed(combatState); } /// public async Task UseAsync(ICombatState combatState, CancellationToken ct) { if (_useSkillOperation is null) { var primarySkillResult = GetPrimarySkill(combatState); if (!primarySkillResult.IsDefined(out var primarySkill)) { return Result.FromError(primarySkillResult); } _useSkillOperation = new UseSkillOperation(primarySkill, Target); } return await _useSkillOperation.UseAsync(combatState, ct); } private Result GetPrimarySkill(ICombatState combatState) { var character = combatState.Game.Character; if (character is null) { return new CharacterNotInitializedError(); } var skills = character.Skills; if (skills is null) { return new CharacterNotInitializedError("Skills"); } return skills.PrimarySkill; } }