---
name: "Simple Expression"
type: topic
aliases: ["simple expression"]
source: https://community.bistudio.com/wiki/Simple_Expression
revid: 352181
updated: 2024-02-01T23:25:49Z
---

# Simple Expression

> [!NOTE]
> Simple expressions are not as flexible as normal scripts, but they are compiled for a very efficient execution.

### Available Operators

|  |  |
|---|---|
| randomGen a | random value from 0 to *a* (randomGen 5) |
| randomGen expr | random value from 0 to expression value (randomGen daylight) |
| *a* factor [*x*,*y*] | `factor` is the same as `interpolate` only output range is fixed and capped to 0...1 (or 1...0 if input range is reversed)<br>if *x*<*y* then *a*<*x*: 0, *a*>*y*: 1<br>if *x*>*y* then *a*>*x*: 0, *a*<*y*: 1 |
| *a* interpolate [*xFrom*,*xTo*,*resFrom*,*resTo*] | Introduced in Arma 2 1.05. interpolate result based on input value.<br>Equivalent to x factor [xFrom,xTo] * (resTo-resFrom) + resFrom |
| *a* min *b* | see [min](../commands/min.md) |
| *a* max *b* | see [max](../commands/max.md) |
| *a* - *b* | see a-b |
| *a* + *b* | see a+b |
| *a* * *b* | see [a*b](../commands/a_~2A_b.md) |
| *a* / *b* | see [a/b](../commands/a_~2F_b.md) (for A3, not sure if others) |
| abs *a* | see [abs](../commands/abs.md) (introduced in Arma 3 patch 1.68) |
| x envelope [a,b,c,d] | trapezoid envelope with output <0;1> (substitution for "(v factor(a,b))*(v factor(d,c))" (Since Arma 3 1.67) |
| *a* > *b* | see [a > b](../commands/a_greater_b.md). Returns 1 and 0 rather than true and false. |
| *a* < *b* | see [a < b](../commands/a_less_b.md). Returns 1 and 0 rather than true and false. |
| *a* >= *b* | see [a >= b](../commands/a_greater~3D_b.md). Returns 1 and 0 rather than true and false. |
| *a* <= *b* | see [a <= b](../commands/a_less~3D_b.md). Returns 1 and 0 rather than true and false. |

Description: *a*,*b* can be any simple expression. *x*,*y* can be a constant expression only (i.e. expression with a type [Number](../topics/Number.md)).

Since Arma 3 1.67 the following operators are also available (v ... controller value):

- abs(v) - absolute value
- sqr(v) - square value
- sqrt(v) - square root value
- pow(v, a) - power

### SQF Equivalent of `factor`

```sqf
SQF_fnc_factor =
{
    private _fnc_interpolateCommon =
    {
        params ["_c", "_cMin", "_cMax", "_vMin", "_vMax"];

        if (_c < _cMin) exitWith { _vMin };
        if (_c > _cMax) exitWith { _vMax };

        (_c - _cMin) * (1 / (_cMax - _cMin)) * (_vMax - _vMin) + _vMin
    };

    params ["_c", "_cMin", "_cMax"];

    if (_cMin < _cMax) then
    {
        [_c, _cMin, _cMax, 0, 1] call _fnc_interpolateCommon
    }
    else
    {
        [_c, _cMax, _cMin, 1, 0] call _fnc_interpolateCommon
    };
};
```

Example:

```sqf
[0.2, 0.1, 0.7] call SQF_fnc_factor; // 0.166667
```

### SQF Equivalent of `interpolate`

```sqf
SQF_fnc_interpolate =
{
    private _fnc_interpolateCommon =
    {
        params ["_c", "_cMin", "_cMax", "_vMin", "_vMax"];

        if (_c < _cMin) exitWith { _vMin };
        if (_c > _cMax) exitWith { _vMax };

        (_c - _cMin) * (1 / (_cMax - _cMin)) * (_vMax - _vMin) + _vMin
    };

    params ["_c", "_cMin", "_cMax", "_vMin", "_vMax"];

    if (_cMin < _cMax) then
    {
        [_c, _cMin, _cMax, _vMin, _vMax] call _fnc_interpolateCommon
    }
    else
    {
        [_c, _cMax, _cMin, _vMax, _vMin] call _fnc_interpolateCommon
    };
};
```

Example:

```sqf
[0.2, 0.1, 0.7, 0, 100] call SQF_fnc_interpolate; // 16.6667
```

### SQF Equivalent of `envelope`

```sqf
SQF_fnc_envelope =
{
    private _fnc_interpolateCommon =
    {
        params ["_c", "_cMin", "_cMax", "_vMin", "_vMax"];

        if (_c < _cMin) exitWith { _vMin };
        if (_c > _cMax) exitWith { _vMax };

        (_c - _cMin) * (1 / (_cMax - _cMin)) * (_vMax - _vMin) + _vMin
    };

    params ["_x", "_a", "_b", "_c", "_d"];

    private _ret = 0;

    if (_x > _a && _x < _d) then
    {
        private _v = [_x, _a, _b, 0, 1] call _fnc_interpolateCommon;

        if (_v > 0) then { _ret = _v * ([_x, _c, _d, 1, 0] call _fnc_interpolateCommon) };
    };

    _ret
};
```

Example:

```sqf
[0.5, 0.1, 0.3, 0.7, 0.9] call SQF_fnc_envelope; // 1
```

### Simple Expressions - How do they work?

**The following is an example taken from the [Eden Editor: Entity Context Menu](../topics/Eden_Editor~3A_Entity_Context_Menu.md).**

**Example:**

```cpp
conditionShow = "hoverObjectCanFly * (1 - hoverObjectFlying)";
```

Entry will only show if the object you are hovering over can fly and the object isn't flying.

**Let's take a closer look at the example.**

hoverObjectCanFly and hoverObjectFlying are two boolean values, which can either be [true](../commands/true.md) (1) or [false](../commands/false.md) (0).

If hoverObjectCanFly is [true](../commands/true.md) (1) and hoverObjectFlying is [false](../commands/false.md) (0) the resulting equation looks like this:

```
1 * (1-0) = x
1 * 1 = x
x = 1
```

The result will be [true](../commands/true.md) (1), therefore the entry will be shown.

<sub>Source: [BI Community Wiki — Simple Expression](https://community.bistudio.com/wiki/Simple_Expression) (revision 352181).</sub>
