示例#1
0
        public void InvokeArithmeticExpression()
        {
            var f      = ExpressionCompiler.CompileExpression <CountExpression>("1 + q + p / 200");
            var result = f(350, 1, 0.3, 0.6);

            Assert.AreEqual(3, result);
        }
示例#2
0
        public void InvokeConditionalExpression()
        {
            var f      = ExpressionCompiler.CompileExpression <QualityExpression>("(r1 > 0.9)? 2 : (r2 > 0.2)? 1 : 0");
            var result = f(350, 1, 0.3, 0.6);

            Assert.AreEqual(1, result);
        }
示例#3
0
        public void InvokeIntExpression()
        {
            var f      = ExpressionCompiler.CompileExpression <PriceExpression>("100");
            var result = f(1, 350);

            Assert.AreEqual(100, result);
        }
示例#4
0
        protected virtual int?GetOutputPrice(OutputItem outputItem, Object dropInItem)
        {
            var priceExpression = outputItem?.Price ?? Output.Price;
            var calculatePrice  = ExpressionCompiler.CompileExpression <PriceExpression>(priceExpression);

            return(calculatePrice?.Invoke(dropInItem.price, dropInItem.quality));
        }
示例#5
0
        protected virtual int GetOutputCount(OutputItem outputItem, Object dropInItem)
        {
            var countExpression = outputItem?.Count ?? Output.Count;
            var calculateCount  = ExpressionCompiler.CompileExpression <CountExpression>(countExpression);

            if (calculateCount == null)
            {
                return(1);
            }

            var random = GetRandom();

            return(calculateCount(dropInItem.Price, dropInItem.quality, random.NextDouble(), random.NextDouble()));
        }
示例#6
0
        protected virtual int GetOutputQuality(OutputItem outputItem, Object dropInItem)
        {
            var qualityExpression = outputItem?.Quality ?? Output.Quality;
            var calculateQuality  = ExpressionCompiler.CompileExpression <QualityExpression>(qualityExpression);

            if (calculateQuality == null)
            {
                return(0);
            }

            var random = GetRandom();

            return(calculateQuality(dropInItem.Price, dropInItem.quality, random.NextDouble(), random.NextDouble()));
        }
        private void PrecompileExpressions()
        {
            var compilingTask = Task.Run(() =>
            {
                try
                {
                    var machineOutputs = _machines.Select(m => m.Output).Concat(Config.MachineOverrides.Select(m => m.Output));
                    foreach (var machineOutput in machineOutputs)
                    {
                        if (machineOutput == null)
                        {
                            continue;
                        }
                        ExpressionCompiler.CompileExpression <CountExpression>(machineOutput.Count);
                        ExpressionCompiler.CompileExpression <QualityExpression>(machineOutput.Quality);
                        ExpressionCompiler.CompileExpression <PriceExpression>(machineOutput.Price);

                        foreach (var outputItem in machineOutput.Items.Values)
                        {
                            if (outputItem == null)
                            {
                                continue;
                            }
                            ExpressionCompiler.CompileExpression <CountExpression>(outputItem.Count);
                            ExpressionCompiler.CompileExpression <QualityExpression>(outputItem.Quality);
                            ExpressionCompiler.CompileExpression <PriceExpression>(outputItem.Price);
                        }
                    }
                }
                catch (Exception e)
                {
                    Log.Error($"Fail during precompiling expressions! Cause: {e}");
                    throw;
                }
            });

            PlayerEvents.LoadedGame += (s, e) => compilingTask?.Wait();
        }