Esempio n. 1
0
        public Persona FusePersona(Persona first, Persona second)
        {
            if (first.Equals(second))
            {
                throw new ArgumentException("A persona cannot be fused to itself");
            }

            if (fusionArcanaModel.CombinationResultsInSpecialFusion(new string[] { first.Name, second.Name }))
            {
                return personaModel.GetPersonaByPersonaName(fusionArcanaModel.GetSpecialFusionResult(new string[] { first.Name, second.Name }));
            }

            double averageBaseLevel = ((double)first.ActualLevel + (double)second.ActualLevel) / 2 + 1;

            if (first.Arcana == second.Arcana)
            {
                return personaModel.GetPersonaList(first.Arcana).Where(o => o.ActualLevel < averageBaseLevel && !o.Equals(first) && !o.Equals(second)).OrderByDescending(o => o.ActualLevel).FirstOrDefault();
            }

            Persona result = new Persona();
            
            Arcana resultingArcana;

            if (fusionArcanaModel.GetDoubleFusionResultingArcana(first.Arcana, second.Arcana) == Arcana.None)
            {
                resultingArcana = fusionArcanaModel.GetDoubleFusionResultingArcana(second.Arcana, first.Arcana);
            }
            else
            {
                resultingArcana = fusionArcanaModel.GetDoubleFusionResultingArcana(first.Arcana, second.Arcana);
            }

            //Get the persona on either side of the base level.
            Tuple<Persona, Persona> resultCandidates = personaModel.GetNextLowestAndNextHighestPersonaByArcana(resultingArcana, averageBaseLevel);

            Persona lower = resultCandidates.Item1;
            Persona higher = resultCandidates.Item2;
            
            //Take higher or lower, depending on which one has the smallest difference from the averageBaseLevel.
            if (Math.Abs(averageBaseLevel - lower.ActualLevel) > Math.Abs(higher.ActualLevel - averageBaseLevel) || Math.Abs(averageBaseLevel - lower.ActualLevel) == Math.Abs(higher.ActualLevel - averageBaseLevel))
            {
                result = higher;
            }
            else
            {
                result = lower;
            }

            return result;
        }
Esempio n. 2
0
        public Tuple<Persona, Persona> GetNextLowestAndNextHighestPersonaByArcana(Arcana arcana, double targetLevel)
        {
            Persona lower = new Persona();
            Persona higher = new Persona();

            lower = GetPersonaList(arcana).Where(o => o.ActualLevel <= targetLevel).OrderByDescending(o => o.ActualLevel).FirstOrDefault();
            if (lower == null)
            {
                lower = GetPersonaList(arcana).OrderBy(o => o.ActualLevel).FirstOrDefault();
            }

            higher = GetPersonaList(arcana).Where(o => o.ActualLevel >= targetLevel).OrderBy(o => o.ActualLevel).FirstOrDefault();
            if (higher == null)
            {
                higher = GetPersonaList(arcana).OrderByDescending(o => o.ActualLevel).FirstOrDefault();
            }

            Tuple<Persona, Persona> result = new Tuple<Persona, Persona>(lower, higher);

            return result;
        }
Esempio n. 3
0
        protected List<Persona> BuildPersonaList(StreamReader reader)
        {
            List<Persona> list = new List<Persona>();
            CompendiumEntry entry = new CompendiumEntry();            

            using (TextReader textReader = reader)
            {
                var csv = new CsvReader(textReader);
                
                while (csv.Read())
                {
                    Persona persona = new Persona();                    
                    persona.HPIncrease = Convert.ToInt32(csv.GetField<string>("HP"));
                    persona.SPIncrease = Convert.ToInt32(csv.GetField<string>("SP"));
                    persona.Arcana = (Arcana)Enum.Parse(typeof(Arcana), csv.GetField<string>("Arcana"));
                    persona.ExtractedSkill = skillModel.GetSkillBySkillName(csv.GetField<string>("Card"));
                    persona.InitialLevel = Convert.ToInt32(csv.GetField<string>("Lv"));
                    persona.IsDownloadedContent = (csv.GetField<string>("DLC") == "X") ? true : false;
                    persona.Name = csv.GetField<string>("Persona");
                    persona.LearnedSkills = skillModel.GetLearnedSkillsFromSkillList(csv.GetField<string>("Skills"));
                    persona.InheritanceType = (csv.GetField<string>("Type") == "") ? PersonaInheritanceType.Any : (PersonaInheritanceType)Enum.Parse(typeof(PersonaInheritanceType), csv.GetField<string>("Type"));
                    persona.InheritableSkillTypes = inheritanceModel.GetSkillInheritanceByPersonaInheritanceType(persona.InheritanceType);
                    try
                    {
                        entry = compendiumModel.GetCompendiumEntryByPersonaName(persona.Name);
                    }
                    catch(KeyNotFoundException)
                    {
                        entry = null;
                    }
                    persona.ActualLevel = entry != null ? entry.ActualLevel : persona.InitialLevel;
                    persona.InheritedSkills = entry != null ? skillModel.GetSkillsFromSkillList(entry.InheritedSkills) : new List<Skill>();
                    persona.HasCompendiumEntry = entry != null ? true : false;          
                    list.Add(persona);                    
                }
            }

            return list;
        }
        public void GetPersonaByPersonaName_GetActualPersonaByPersonaName()
        {            
            //Arrange                
            string name = "Ukobach";
            Persona expected = new Persona
            {
                Arcana = Arcana.Devil,
                ExtractedSkill = skillModel.GetSkillBySkillName("Panic Circle"),
                HPIncrease = 22,
                InheritableSkillTypes = inheritanceModel.GetSkillInheritanceByPersonaInheritanceType(PersonaInheritanceType.Any),
                InheritanceType = PersonaInheritanceType.Any,
                InitialLevel = 4,
                IsDownloadedContent = false,
                LearnedSkills = skillModel.GetLearnedSkillsFromSkillList("Pulinpa, Agi, Lullaby Song(5), Panic Circle(6), Evil Touch(7)"),
                Name = "Ukobach",
                SPIncrease = 14
            };

            //Act
            var result = model.GetPersonaByPersonaName(name);

            //Assert            
            Assert.AreEqual(expected, result);
            Assert.IsInstanceOfType(result, typeof(Persona));
        }
Esempio n. 5
0
        public Persona FusePersona(Persona first, Persona second, Persona third)
        {
            if (first.Equals(second) || second.Equals(third) || first.Equals(third))
            {
                throw new ArgumentException("A persona cannot be fused to itself");
            }

            if (fusionArcanaModel.CombinationResultsInSpecialFusion(new string[] { first.Name, second.Name, third.Name }))
            {
                return personaModel.GetPersonaByPersonaName(fusionArcanaModel.GetSpecialFusionResult(new string[] { first.Name, second.Name, third.Name }));
            }

            double averageBaseLevel = ((double)first.ActualLevel + (double)second.ActualLevel + (double)third.ActualLevel) / 3 + 5;

            if (first.Arcana == second.Arcana && first.Arcana == third.Arcana)
            {
                return personaModel.GetPersonaList(first.Arcana).Where(o => o.ActualLevel > averageBaseLevel && !o.Equals(first) && !o.Equals(second) && !o.Equals(third)).OrderBy(o => o.ActualLevel).FirstOrDefault();
            }

            Persona result = new Persona();

            //Make a list of the persona, order by level.
            List<Persona> components = new List<Persona>();
            components.Add(first);
            components.Add(second);
            components.Add(third);
            components.OrderBy(o => o.ActualLevel);

            //Fuse the lowest two persona.
            Persona temp = FusePersona(components[0], components[1]);

            //If the temporary persona equals the third, not valid.
            if (temp.Equals(components[2]))
            {
                throw new ArgumentException("This fusion is invalid - the first step would result in a persona being fused to itself.");
            }

            Arcana resultingArcana;

            if (fusionArcanaModel.GetTripleFusionResultingArcana(temp.Arcana, components[2].Arcana) == Arcana.None)
            {
                resultingArcana = fusionArcanaModel.GetTripleFusionResultingArcana(components[2].Arcana, temp.Arcana);
            }
            else
            {
                resultingArcana = fusionArcanaModel.GetTripleFusionResultingArcana(temp.Arcana, components[2].Arcana);
            }

            //Get the persona on either side of the base level.
            Tuple<Persona, Persona> resultCandidates = personaModel.GetNextLowestAndNextHighestPersonaByArcana(resultingArcana, averageBaseLevel);

            Persona lower = resultCandidates.Item1;
            Persona higher = resultCandidates.Item2;

            //Take higher or lower, depending on which one has the smallest difference.
            if (Math.Abs(averageBaseLevel - lower.ActualLevel) > Math.Abs(higher.ActualLevel - averageBaseLevel) || Math.Abs(averageBaseLevel - lower.ActualLevel) == Math.Abs(higher.ActualLevel - averageBaseLevel))
            {
                result = higher;
            }
            else
            {
                result = lower;
            }

            return result;
        }
Esempio n. 6
0
 public List<string[]> FusionSearch(Persona desiredPersona, Persona firstRequredPersona, Persona secondRequiredPersona, int upperLevelBoundary)
 {
     throw new NotImplementedException();
 }
Esempio n. 7
0
 public List<string[]> FusionSearch(Persona desiredPersona, Persona firstRequredPersona)
 {
     throw new NotImplementedException();
 }
Esempio n. 8
0
        public Tuple<int,List<Skill>> GetInheritableSkills(Persona result, Persona first, Persona second, Persona third)
        {
            int maximumTransferableSkills = 0;
            List<Skill> skills = new List<Skill>();

            //Check for compendium existence, if it doesn't exist, use the learned skills.
            if (first.HasCompendiumEntry)
            {
                skills.AddRange(first.InheritedSkills);
            }
            else
            {
                skills.AddRange(first.LearnedSkills.Where(o => o.LevelLearned <= first.ActualLevel).Select(o => o.Skill).ToList<Skill>());
            }

            if (second.HasCompendiumEntry)
            {
                skills.AddRange(second.InheritedSkills);
            }
            else
            {
                skills.AddRange(second.LearnedSkills.Where(o => o.LevelLearned <= second.ActualLevel).Select(o => o.Skill).ToList<Skill>());
            }

            if (third.HasCompendiumEntry)
            {
                skills.AddRange(third.InheritedSkills);
            }
            else
            {
                skills.AddRange(third.LearnedSkills.Where(o => o.LevelLearned <= third.ActualLevel).Select(o => o.Skill).ToList<Skill>());
            }

            maximumTransferableSkills = personaModel.GetMaximumTransferableSkills(skills.Count);

            //Now check to make sure all of the skills are inheritable (and unique).
            skills = skills.Where(o => o.CanPassDown && result.InheritableSkillTypes.Where(p => p.CanInherit).Select(p => p.Type).ToList<SkillInheritanceType>().Contains(o.SkillType)).Distinct<Skill>().ToList<Skill>();

            return new Tuple<int, List<Skill>>(maximumTransferableSkills, skills);
        }