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; }
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; }
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)); }
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; }
public List<string[]> FusionSearch(Persona desiredPersona, Persona firstRequredPersona, Persona secondRequiredPersona, int upperLevelBoundary) { throw new NotImplementedException(); }
public List<string[]> FusionSearch(Persona desiredPersona, Persona firstRequredPersona) { throw new NotImplementedException(); }
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); }