# Formula

The formulae supporting the complexity are as follows

`pow(${Armor} - 1, 2 + 1) + sqrt(${HP}) * abs(sin(${HP})) + max(random(1, ${Armor}), min(${HP}, 100)) + dice(${Armor}, 6) * chance(${Armor})`

Support + - \* / % Commonly used math, parametric variable.

## Use

Variables require ${variable name} Parameters require @{parameter name}, Otherwise, as normal, as shown in the formula above.

For quick use see [Quick Start](../quick-start-guide#formula).

See [examples](examples) for more ways to use.

## Extension

If you want to support more it can be easily modified.

<pre><code><strong>FormulaParser.cs
</strong>
private static double ApplyFunction(string name, double[] args)
{
    if (args.Length == 0)
        throw new ArgumentException($"No arguments provided for function: {name}");

    switch (name)
    {
        case "pow":
            if (args.Length != 2) throw new ArgumentException("pow requires 2 arguments");
            return Math.Pow(args[0], args[1]);
        case "abs":
            return Math.Abs(args[0]);
        case "sqrt":
            return Math.Sqrt(args[0]);
        case "sin":
            return Math.Sin(args[0] * Math.PI / 180);
        case "cos":
            return Math.Cos(args[0] * Math.PI / 180);
        case "random":
            if (args.Length != 2) throw new ArgumentException("random requires 2 arguments");
            return RandomInstance.Next((int)args[0], (int)args[1] + 1);
        case "min":
            if (args.Length != 2) throw new ArgumentException("min requires 2 arguments");
            return Math.Min(args[0], args[1]);
        case "max":
            if (args.Length != 2) throw new ArgumentException("max requires 2 arguments");
            return Math.Max(args[0], args[1]);
        case "dice":
            if (args.Length != 2) throw new ArgumentException("dice requires 2 arguments");
            return Enumerable.Range(0, (int)args[0]).Sum(_ => RandomInstance.Next(1, (int)args[1] + 1));
        case "chance":
            return RandomInstance.NextDouble() * 100 &#x3C; args[0] ? 1.0 : 0.0;
        default:
            throw new ArgumentException($"Unknown function: {name}");
    }
}
</code></pre>

```
private static double ApplyOperator(double a, double b, string op)
{
    switch (op)
    {
        case "+":
            return a + b;
        case "-":
            return a - b;
        case "*":
            return a * b;
        case "/":
            if (b == 0) throw new DivideByZeroException();
            return a / b;
        case "%":
            if (b == 0) throw new DivideByZeroException();
            return a % b;
        default:
            throw new ArgumentException($"Unknown operator: {op}");
    }
}
```
