private static IValue Build(
            BuildParameters parameters,
            IValueBuilder operand,
            Func <NodeValue?, bool> calculate,
            Func <IValue, string> identity)
        {
            var builtOperand = operand.Build(parameters);

            return(new ConditionalValue(c => calculate(builtOperand.Calculate(c)), identity(builtOperand)));
        }
        private static IValue Build(
            BuildParameters parameters,
            IValueBuilder left, IValueBuilder right,
            Func <NodeValue?, NodeValue?, bool> calculate,
            Func <IValue, IValue, string> identity)
        {
            var l = left.Build(parameters);
            var r = right.Build(parameters);

            return(new ConditionalValue(c => calculate(l.Calculate(c), r.Calculate(c)), identity(l, r)));
        }
Beispiel #3
0
        public void IfBuildsToCorrectValue(int trueBranch)
        {
            var sut = CreateSut();

            IValueBuilder valueBuilder = sut
                .If(ConstantConditionBuilder.Create(trueBranch == 0))
                .Then(0)
                .ElseIf(ConstantConditionBuilder.Create(trueBranch == 1))
                .Then(new ValueBuilderImpl(1))
                .Else(2);

            var actual = valueBuilder.Build().Calculate(null!);
            Assert.AreEqual(new NodeValue(trueBranch), actual);
        }
        private IValue Build(Skill skill, IValueBuilder valueBuilder, Entity modifierSourceEntity)
        {
            var gem = skill.Gem;

            if (gem is null)
            {
                return(new Constant(0));
            }

            var displayName       = GetSkillDefinition(gem.SkillId).DisplayName;
            var gemModifierSource = new ModifierSource.Local.Gem(gem, displayName);
            var buildParameters   = new BuildParameters(new ModifierSource.Global(gemModifierSource), modifierSourceEntity, default);

            return(valueBuilder.Build(buildParameters));
        }
Beispiel #5
0
        private IValue BuildInPastXSecondsValue(BuildParameters parameters, IValueBuilder seconds)
        {
            var builtEntity           = BuildEntity(parameters, Entity);
            var recentOccurrencesStat = BuildRecentOccurrencesStat(parameters, builtEntity);
            var lastOccurenceStat     = BuildLastOccurrenceStat(parameters, builtEntity);
            var secondsValue          = seconds.Build(parameters);

            return(new ConditionalValue(Calculate,
                                        $"({RecentlySeconds} <= {secondsValue} && {recentOccurrencesStat} > 0) " +
                                        $"|| {lastOccurenceStat} <= {secondsValue}"));

            bool Calculate(IValueCalculationContext context)
            {
                NodeValue?threshold = secondsValue.Calculate(context);

                if (RecentlySeconds <= threshold && context.GetValue(recentOccurrencesStat) > 0)
                {
                    return(true);
                }
                return(context.GetValue(lastOccurenceStat) <= threshold);
            }
        }
 private static string BuildEveryXSecondsIdentity(BuildParameters parameters, IValueBuilder builder)
 => $"Every{builder.Build(parameters).Calculate(new ThrowingContext())}Seconds";
 private static string BuildSpendManaIdentity(BuildParameters parameters, IValueBuilder builder) =>
 $"Spend{builder.Build(parameters).Calculate(new ThrowingContext())}Mana";