using RPGLibrary.Abstraction.Services; using RPGLibrary.Command; namespace RPGLibrary.Implementation.Command { public class AttackCommand : ICommand { private readonly Character[] _target; private readonly StrengthAttackData _attackData; private readonly IDamageCalculator _damageCalculator; public AttackCommand(Character[] target, StrengthAttackData attackData, IDamageCalculator damageCalculator) { _target = target; _attackData = attackData; _damageCalculator = damageCalculator; } public async IAsyncEnumerable Execute() { foreach (var character in _target) { var damage = _damageCalculator.Calculate(character, _attackData); var newCurrentHP = new HP(character.HP.Value - damage, character.HP.Maximum); yield return character.With(newCurrentHP); } } } }