# Синтаксис, комментарии, опкоды, команды. Ключевые слова

Начнём из терминов и синтаксиса. Собственно первым будем само  слово «Синтаксис» — это набор правил, которые понимают редакторы кода (и Sanny Builder в том числе). Эти правила позволяют избежать ошибок, которые возникают при неправильном напасании кода в их окружении. Если написать что-то, что не соответсвует правилам, редакторы сообщают об синтаксиеской ошибке с описанием того, что там не так и где это случилось. Для успешного выпонения сборки нашего кода нужно будет написать код так, чтобы таких ошибок не возникало. Это можно навазать первым шагом — умение соблюдать синтаксис.

### «Комментарий»

Некоторый код Sanny Builder будет игнорировать при сборке скрипта. Такой код называют комментариями и смысл их как раз делать напоминание или уточние для себя или других людей. Я называю такие комментарии <mark style="color:orange;">**явными**</mark>. Сейчас есть три типа комментариев со следующим синтаксисом:

* Однострочный комментарий. Начинается символами `//` и продолжается до конца строки:

```clike
// это комментарий
```

* Многострочный комментарий. Текст между символами `/*` и `*/`:

```clike
/*
Можно написать комментарий в
несколько строк, если осталось мало места
и читать будет неудобно
*/
```

* Многострочный комментарий. Текст между  символами<mark style="color:red;">\*</mark> `{` и `}`:&#x20;

```pascal
{ Многострочные комментарии не обязательно писать на разных строках }
```

{% hint style="danger" %} <mark style="color:red;">\*</mark> Комментарием не будет считаться синтаксис, если после символа **`{`** сразу же идёт символ **`$`**. С этим исключением мы познакомимся при первой встрече с ним.
{% endhint %}

### «Опкод»

Под этим словом подразумевается некая команда, которую будет выполнять игра. За каждым опкодом закреплён его персональный уникальный идентификатор (также известен как номер опкода) и набор параметров (аргументов), которые необходимы для правильного выполнения игрой. Общий синтаксис опкода в Sanny Builder представлен следующим образом:

```
YXXX: 0 1 2
```

Где `YXXX` — это `ID`(идентификатор — число в [шестнадцатеричной системе](https://ru.wikipedia.org/wiki/%D0%A8%D0%B5%D1%81%D1%82%D0%BD%D0%B0%D0%B4%D1%86%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F) счисления), а `0 1 2` — это параметры. Количество параметров напрямую зависит от опкода. Их может быть несколько, они могут отсутствовать или не иметь фиксированного количества. Символ **`:`** используется как разделитель.

Часть числа, пемеченного как `Y`, имеет особое свойство. Дело в том, что многие опкоды могут использоваться не только как прямой вызов некой команды игры, но и использовать инвертированную версию этой команды для внутренней работы, например при проверках различных состояний (условий). В этом случае самый старший бит отвечает за версию опкода: если он равен `0`, то команда будет выполняться как обычно; если `1`, то — инвертированная версия. Больше подроностей я попытаюсь донести в статье об условиях.

**ID** опкода ограничен 2-мя байтами, так что общее число опкодов с учётом двух версий будет не более `7FFF`, то есть 32767 штук. Этого будет более чем достаточно для добавления опкодов плагинами в будущем :)

Если вспомнить секцию о комментариях, то я упомянул о неких <mark style="color:orange;">**явных**</mark> комментариях со своим синтакисом, то есть также <mark style="color:green;">**неявные**</mark>: описание опкода и его параметров, который также игнорируется Sanny Builder. Во внимание берётся только его параметры. Например, это будет восприниматься редакором как одно и тоже при создании скрипта:

```
0001: 1000
0001: wait 1000 ms
0001: my_any_custom_text 1000
```

Как правило, каждый опкод имеет описание и оно может отличаться в разных режимах редактирования. Более того, опкоды под разные игры и даже версии игр могут иметь разное количетсво параметров, не использоваться вовсе, делать разные вещи или просто ничего не делать. Всё это нужно будет изучать самостоятельно!

### «Команда»

Под этим словом подразумевается особый способ написания опкода. В синтаксисе команды не используется **ID** опкода, разделитель `:` и нет описания. Всё сводится к такому синтаксису:

```
wait 1000
```

Если параметры конкретно для **wait** можно запомнить, то когда будет больше таких параметров, вероятно мы забудет что за что отвечает. Выходом из ситуации оказалить <mark style="color:green;">**явные**</mark> комментарии. Они не нарушили синтаксис и дали возможность читать описание. В общем виде они представлены так:

```pascal
{0001:} wait {time} [int]
```

Здесь `wait` — это имя команды, а `[int]` помогает заранее узнать какой тип<mark style="color:red;">\*\*</mark> данных требуется для параметра. Оставить в таком виде мы не сможем из за синтаксической ошибки. Нам нужно заменить **\[int]** на конкретное значение. В данном случае я использую значение `1000` и икончательный вариант будет таков:

```pascal
{0001:} wait {time} 1000
```

{% hint style="warning" %} <mark style="color:red;">\*\*</mark> О типах данных будет отдельная статья!
{% endhint %}

### Поиск команд

Количество команд дастаточно много и постоянно пополняются разными расширениями, помимо базового CLEO. Много из них можно найти на сайте [библиотеки Sanny Builder](https://library.sannybuilder.com/) и получить больше сведений о нужной команде.

Нам доступен список команд также прямо из Sanny Builder в меню `Сервис->Инструменты->Поиск опкодов` (на английском: `Tools->IDE Tools->Opcode Search`) или использовать горячие клавиши: `Ctrl`+`Alt`+`2` (по умолчанию):

<figure><img src="https://github.com/wmysterio/scm-scripting-lessons/raw/resources/images/sb_opcode_search_tool.png" alt=""><figcaption><p>Окно поиска опкодов</p></figcaption></figure>

Поисковик можно испольовать оффлайн, так что в любом случае Вы будете иметь под рукой список команд.

### Ключевые слова

Кроме скриптовых команд (назовём их так), есть особые команды — команды, которые выполняет только Sanny Builder с целью собрать некоторый код, который вручную нужно выполнять часто и далеко не самым лёгким способом. Для таких команд будут целые статьи!

Автор: **wmysterio**. Спасибо **Seemann** за некотрые важные уточнения!
