# Инструкция 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 происходит по ее имени. \
Имя заключается в двойные кавычки.&#x20;

> **Формат вызова инструкции 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 является вложенной*&#x20;

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

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

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

*нужное окончание: 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" %}
Если у вас возникли сложности с пониманием терминологии и сути описания инструкции, то ознакомьтесь с информацией из статьи [Общая информация о конфигурационных файлах](/documentation/gem-rts-v1-ru/bazovaya-informaciya-o-gem-rts/obshaya-informaciya-o-konfiguracionnykh-failakh.md)
{% endhint %}

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bestway-1.gitbook.io/documentation/gem-rts-v1-ru/bazovaya-informaciya-o-gem-rts/obshaya-informaciya-o-konfiguracionnykh-failakh/instrukciya-define.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
