public DomainResult ChooseSkill(SkillReadModel newSkill) { if (!FreeSkillPoints.Any()) { return(DomainResult.Error(new NoLevelUpsAvailable())); } if (CurrentSkills.Any(s => s.SkillId == newSkill.SkillId)) { return(DomainResult.Error( new CanNotPickSkillTwice(CurrentSkills.Select(s => s.SkillId)))); } foreach (var freeSkillPoint in FreeSkillPoints) { if (!HasPlayerFreeSkillForChosenSkill(newSkill, freeSkillPoint)) { return(DomainResult.Error(new SkillNotPickable(freeSkillPoint))); } } var newFreeSkills = GetMinimalSkillToRemove(FreeSkillPoints, newSkill); var domainEvent = new SkillChosen(PlayerId, newSkill, newFreeSkills); Apply(domainEvent); return(DomainResult.Ok(domainEvent)); }
public void Apply(SkillChosen domainEvent) { CurrentSkills = CurrentSkills.Append(domainEvent.NewSkill); FreeSkillPoints = domainEvent.NewFreeSkillPoints; }
public void Handle(SkillChosen domainEvent) { Skills = Skills.Append(domainEvent.NewSkill.SkillId); FreeSkillPoints = domainEvent.NewFreeSkillPoints; }