Exemplo n.º 1
0
        public void AddSkill(HeroBattle hero, string skillName, string knowledgeLevel)
        {
            // Verifica se herói tem experiência disponível para adquirir a skill.
            KnowledgeLevel level = null;

            if (knowledgeLevel == null)
            {
                throw new CannotUseNullAsKnowledge();
            }

            if (skillName == null)
            {
                throw new CannotUseNullAsSkillException();
            }

            if (KnowledgeLevel.Assimilate.Name.Equals(knowledgeLevel.ToLower()))
            {
                level = KnowledgeLevel.Assimilate;
            }
            else if (KnowledgeLevel.Learn.Name.Equals(knowledgeLevel.ToLower()))
            {
                level = KnowledgeLevel.Learn;
            }
            else
            {
                throw new CannotFindKnowledgeException();
            }

            if (StatusService.GetPoints(hero.Name) < level.NecessaryPoints)
            {
                throw new NecessaryPointsIsNotEnoughException();
            }

            // Verifica se a skill existe e pode ser usada pela classe do herói.
            var skill = GetSkillByName(skillName);

            if (skill == null)
            {
                throw new CannotFindSkillException(skillName);
            }

            if (!CanBeUsedBy(hero, skill))
            {
                throw new ItemCannotBeUsedByThisClassException();
            }

            // Verifica se o herói já possui a skill
            var skillKnowledge = GetSkillsFrom(hero.Name).FirstOrDefault(sk => sk.skill.Equals(skillName));

            if (skillKnowledge != null)
            {
                if (knowledgeLevel.Equals(skillKnowledge.knowledge))
                {
                    throw new SkillAlreadyLearnedException();
                }

                // não permite assimilar uma skill já aprendida.
                var alreadyLearnedTheSkill = skillKnowledge.knowledge.Equals(KnowledgeLevel.Learn.Name);
                if (alreadyLearnedTheSkill)
                {
                    throw new CannotAddSkillWithLessKnowledgeLevelException();
                }
            }

            // Não permite adicionar a nova skill se não cumprir os requisitos.
            if (skill.requirements != null &&
                hero.Skills.All(s => s.name?.ToLower().Equals(skill.requirements[0]?.ToLower()) == null))
            {
                throw new CannotFindRequiredSkillToAdd(skillName, skill.requirements[0]);
            }

            // Adiciona a skill ao herói.
            var skills = hero.Skills.ToList();

            skills.Add(skill);
            hero.Skills = skills.ToArray();

            StatusService.ConsumeTheNecessaryPoints(hero.Name, level);
            Save(hero, skillName, knowledgeLevel);
        }