Ejemplo n.º 1
0
        public IPotion Create(IAlchemyOptions options)
        {
            var commonEffects = options.Ingredients
                                .SelectMany(
                x => x.CombinedEffects,
                (x, effect) => new
            {
                Ingredient = x,
                Effect     = effect
            })
                                .GroupBy(x => x.Effect.Id)
                                .Where(x => x.Count() > 1)
                                .Select(x => x
                                        .OrderByDescending(y => effectIngredientPriorityFactory
                                                           .Create(y.Effect)
                                                           .GetPriority(y.Ingredient))
                                        .First()
                                        .Effect);

            if (commonEffects.Count() == 0)
            {
                return(null);
            }

            var processedEffects = commonEffects
                                   .Select(x => new
            {
                Effect  = x,
                Results = alchemyFormulae.GetResults(x, options)
            })
                                   .OrderByDescending(x => x.Results.BaseCost)
                                   .ThenBy(x => x.Effect.Name)
                                   .AsEnumerable();

            var mainEffect = processedEffects.First();

            var hasPurityPerk = HasPurityPerk(options.Perks);

            if (hasPurityPerk)
            {
                processedEffects = processedEffects.Where(x => x.Effect.IsPositiveEffect == mainEffect.Effect.IsPositiveEffect);
            }

            var potionEffects = processedEffects
                                .Select(x => alchemyEffectFactory.Create(
                                            x.Effect,
                                            x.Results.Cost,
                                            x.Results.Duration,
                                            x.Results.Magnitude));

            var potionName = mainEffect.Effect.IsPositiveEffect
                ? $"Potion of {mainEffect.Effect.Name}"
                : $"Poison of {mainEffect.Effect.Name}";

            return(new Potion(potionEffects, potionName));
        }
Ejemplo n.º 2
0
        public AlchemyFormulaeResults GetResults(IAlchemyEffect effect, IAlchemyOptions options)
        {
            var baseFactor = BaseFormulae.GetBase(effect, options);
            var perkFactor = PerksFormulae.GetPerks(effect, options.Perks);

            var baseMagnitude = MagnitudeFormulae.GetMagnitude(effect, baseFactor);
            var magnitude     = MagnitudeFormulae.GetMagnitude(effect, baseFactor * perkFactor);

            var baseDuration = DurationFormulae.GetDuration(effect, baseFactor);
            var duration     = DurationFormulae.GetDuration(effect, baseFactor * perkFactor);

            var baseCost = CostFormulae.GetCost(effect, baseMagnitude, baseDuration);
            var cost     = CostFormulae.GetCost(effect, magnitude, duration);

            return(new AlchemyFormulaeResults(
                       baseCost,
                       cost,
                       duration,
                       magnitude));
        }
Ejemplo n.º 3
0
        public void ValidOptions()
        {
            IAlchemyOptions options = null;

            validator
            .Setup(x => x.ValidateAndThrow(It.IsAny <IAlchemyOptions>()))
            .Callback((IAlchemyOptions o) => {
                options = o;
            });

            potionFactory
            .Setup(x => x.Create(It.IsAny <IAlchemyOptions>()))
            .Returns(It.IsAny <IPotion>())
            .Verifiable();


            var alchemyOptions = It.IsAny <IAlchemyOptions>();

            var potion = subject.Validate().Build();

            potionFactory.Verify(x => x.Create(options), Times.Once);
        }
Ejemplo n.º 4
0
 public void ValidateAndThrow(IAlchemyOptions options)
 {
     validator.ValidateAndThrow(options);
 }
Ejemplo n.º 5
0
 public ValidatedPotionBuilder(IPotionFactory potionFactory, IAlchemyOptions options)
 {
     this.options       = options;
     this.potionFactory = potionFactory;
 }
Ejemplo n.º 6
0
 public static decimal GetBase(IAlchemyEffect effect, IAlchemyOptions options)
 {
     return(AlchemyConstants.IngredientMultiplier
            * (1 + (AlchemyConstants.AlchemySkillFactor - 1) * (decimal)options.AlchemyLevel / 100)
            * (1 + options.FortifyAlchemyPercent / 100));
 }