public List <Persona> GetPersonaList()
 {
     return(personaModel.GetPersonaList());
 }
Example #2
0
        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);
        }