public List <Persona> GetPersonaList() { return(personaModel.GetPersonaList()); }
public Persona FuseTwoKnownPersona(Persona firstPersona, Persona secondPersona) { //Can't fuse a person to itself. if (firstPersona.Equals(secondPersona)) { throw new ArgumentException("A persona cannot be fused to itself."); } Persona result = new Persona(); //Is it a special fusion? if (fusionUtilities.SpecialFusionOnly(new string[] { firstPersona.Name, secondPersona.Name })) { result = personaModel.GetPersonaByName(fusionUtilities.SpecialFusionResultantPersonaName(new string[] { firstPersona.Name, secondPersona.Name })); return(result); } double averageBaseLevel = ((double)firstPersona.InitialLevel + (double)secondPersona.InitialLevel) / 2 + 1; //Same arcana means different fusion rules. if (firstPersona.Arcana == secondPersona.Arcana) { result = personaModel.GetPersonaList(firstPersona.Arcana).Where(o => o.InitialLevel < averageBaseLevel && o.Name != firstPersona.Name && o.Name != secondPersona.Name).OrderByDescending(o => o.InitialLevel).FirstOrDefault(); } else { object firstArcanaAsNumber = Convert.ChangeType(firstPersona.Arcana, firstPersona.Arcana.GetTypeCode()); object secondArcanaAsNumber = Convert.ChangeType(secondPersona.Arcana, secondPersona.Arcana.GetTypeCode()); Arcana resultingArcana; if (String.IsNullOrEmpty(fusionUtilities.GetDoubleFusionArcana((int)firstArcanaAsNumber, (int)secondArcanaAsNumber))) { resultingArcana = (Arcana)Enum.Parse(typeof(Arcana), fusionUtilities.GetDoubleFusionArcana((int)secondArcanaAsNumber, (int)firstArcanaAsNumber)); } else { resultingArcana = (Arcana)Enum.Parse(typeof(Arcana), fusionUtilities.GetDoubleFusionArcana((int)firstArcanaAsNumber, (int)secondArcanaAsNumber)); } //Get the persona on either side of the base level. If one doesn't exist, get the highest or lowest of the arcana respectively. Persona lower = personaModel.GetPersonaList(resultingArcana).Where(o => o.InitialLevel <= averageBaseLevel).OrderByDescending(o => o.InitialLevel).FirstOrDefault(); if (lower == null) { lower = personaModel.GetPersonaList(resultingArcana).OrderBy(o => o.InitialLevel).FirstOrDefault(); } Persona higher = personaModel.GetPersonaList(resultingArcana).Where(o => o.InitialLevel >= averageBaseLevel).OrderBy(o => o.InitialLevel).FirstOrDefault(); if (higher == null) { higher = personaModel.GetPersonaList(resultingArcana).OrderByDescending(o => o.InitialLevel).FirstOrDefault(); } //Take higher or lower, depending on which one has the smallest difference. if (Math.Abs(averageBaseLevel - lower.InitialLevel) > Math.Abs(higher.InitialLevel - averageBaseLevel) || Math.Abs(averageBaseLevel - lower.InitialLevel) == Math.Abs(higher.InitialLevel - averageBaseLevel)) { result = higher; } else { result = lower; } } return(result); }