> For the complete documentation index, see [llms.txt](https://docs.bestway.com.ua/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bestway.com.ua/gem-rts-v1-ru/bazovaya-informaciya-o-resursakh-v-gem-rts/obshaya-informaciya-o-konfiguracionnykh-failakh/instrukciya-define.md).

# Инструкция define

## Описание инструкции define

Повторяющиеся фрагменты SDL можно описать с помощью инструкции define для дальнейшего многократного вызова в нужных местах.

> **Формат описания и вызова инструкции define**
>
> ```
> (define “name” [...])
> ```
>
> *name - имя инструкции, задается в двойных кавычках*\
> `[...]` - *фрагмент SDL, который будет добавляться при вызове инструкции*

## Аргументы в инструкции define

Фрагмент SDL может содержать аргументы[^1], значения которых обычно меняются от вызова к вызову.

<details>

<summary>Пример описания инструкции define без аргументов</summary>

```
(define "seismic_custom"
    {damage seismic {energy 10} {radius 8}}
)
```

</details>

<details>

<summary>Пример описания инструкции define с аргументами в виде порядкового номера</summary>

```
(define "seismic_custom"
    {damage seismic {energy %0} {radius %1}}
)
```

</details>

<details>

<summary>Пример описания инструкции define с именными аргументами</summary>

```
(define "seismic_custom"
    {damage seismic {energy %energy} {radius %radius}}
)
```

</details>

## Вызов инструкции define

Вызов инструкции define происходит по ее имени.\
Имя заключается в двойные кавычки.

> **Формат вызова инструкции define**
>
> ```
> ("name" [args])
> ```

Аргументы являются опциональными, поэтому в формуле формата они указаны в квадратных скобках.

<details>

<summary>Пример вызова инструкции define, которая не содержит аргументы</summary>

```
(“seismic_custom”)
```

</details>

<details>

<summary>Пример вызова Инструкции define с аргументами, которые заданы порядковым номером</summary>

```
("seismic_custom" args 10 8)
```

</details>

<details>

<summary>Пример вызова инструкции define с именными аргументами</summary>

```
(“seismic_custom” energy(10) radius(8))
```

</details>

При вызове Инструкции значения для именных агрументов могут отсутствовать.

<details>

<summary>Пример вызова инструкции define с пустым аргументом</summary>

```
(“seismic_custom” energy() radius(8))
```

</details>

## Вложенные инструкции define

Инструкции define могут быть вложенными

<details>

<summary>Пример описания вложенной инструкции define</summary>

```
(define "set_default" ("content_%con"))
```

*Инструкция set\_default вызывает инструкцию content\_%con*

</details>

## Пустые инструкции define

Пустые инструкции define используют в случае необходимости выключить одну или несколько вложенных инструкций.\
При этом часто при вызове инструкции в имени вложенной инструкции используется аргумент

<details>

<summary>Пример использования пустой инструкции define</summary>

```
(define "content_none")
(define "content_v" 
    {content data1}
)
(define "content_v_officer" 
    {content data2"}
)
(define "set_default" ("content_%con"))
...
("set_default" con(none))
("set_default" con(v) )
("set_default" con(v_officer))
```

*Пустая инструкция content\_none вызывается, когда content не нужен.*

*Инструкция content\_%con является вложенной*

*Ее вызов происходит в инструкции "set\_default"*

*В имени вложенной инструкции используется аргумент %con*

*При вызове инструкции "set\_default" в качестве значения аргумента передают*

*нужное окончание: none, v или v\_officer*

*От этого зависит, какая из инструкций "content\_\*" будет вызвана*

</details>

## Примеры

Альтернативное название инструкции define - макрос.

<details>

<summary>Пример основного макроса с базовым набором параметров</summary>

```
(define "set_generic"
  {charge %ch}
  ("score" sc(%sc))
  {tags "%tag %side"}
  ("cw_%cw")
  {cp %cp}
  {level %lvl}
  {cost 0}
  {fore 1}
)
```

</details>

<details>

<summary>Пример макроса со стандартным набором настроек</summary>

```
(define "set_default"
    ("content_%con" side(%side) n(%n))
    ("set_generic" ch(%ch) sc(%sc) tag(%tag) side(%side) cw(%cw) cp(%cp) lvl(%lvl))
    ("spawn_distance_%sd")
    ("territory_holder_%th")
)
```

</details>

<details>

<summary>Пример макроса верхнего уровня, который использует стандартные настройки</summary>

```
(define "set_v" 
    ("set_default" 
        con(v) 
        ch(0) 
        sc(%sc) 
        tag(%tag) 
        side(%side) 
        n(%n) 
        cw(%cw) 
        cp(%cp) 
        lvl(%lvl) 
        sd(default) 
        th(%th)
    )
)
```

*Результатом вызова инструкции set\_v будет итоговая настройка для юнита pz1b*

```
{"pz1b" 
    ("set_v" 
        lvl(1) 
        tag(all tnk_light level_1) 
        side(ger) 
        n(2) 
        sc(10) 
        cw(s2) 
        cp(3) 
        th(tanks)
    )
}
```

</details>

{% hint style="info" %}
Если у вас возникли сложности с пониманием терминологии и сути описания инструкции, то ознакомьтесь с информацией из статьи [Общая информация о конфигурационных файлах](/gem-rts-v1-ru/bazovaya-informaciya-o-resursakh-v-gem-rts/obshaya-informaciya-o-konfiguracionnykh-failakh.md)
{% endhint %}

[^1]: [Аргументы](/gem-rts-v1-ru/bazovaya-informaciya-o-resursakh-v-gem-rts/obshaya-informaciya-o-konfiguracionnykh-failakh.md#argumenty) используются для вызова одной и той же инструкции, но с разными значениями параметров. При описании инструкции признаком аргумента является символ процент **%.**
