Опкоды. Ключевые слова. Классы

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

Нам с базовых терминов, которые Вы встретите в любом случае. Начнём с понятия «Опкод».

Опкоды

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

YXXX: 0 1 2

Где YXXX — это число в шестнадцатеричной системе счисления. При этом Y может быть только числом 0 или 8*. А 0 1 2 — это параметры опкода. Количество параметров напрямую зависит от опкода. Их может быть несколько, они могут отсутствовать или не иметь фиксированного количества параметров.

* в большинстве ситуаций в плане скриптинга. Но значимую роль играет только самый старший бит части числа Y, который играет роль версии с инверсией опкода; о его роли будет отдельная тема.

Первый опкод, который важно рассмотреть, будет:

0001: 1000

Суть команды заключается в том, что он приостанавливает выполнение текущего скрипта на указанное время и передаёт управление другому скрипту. Параметр 1000 указывает минимальное количество времени, который скрипт будет в состоянии ожидания.

Минимальное время ожидания должно быть 0 или больше!

Думаю, Вы заметили, что команда не имеет какого-либо описания. Я это сделал специально, так как не всё в строке опкода является параметром. Дело в том, что между параметрами обычно есть описание параметров. Без этих описаний читать скрипт было бы невероятно сложно. Для опкода 0001 описание обычно такое:

0001: wait 1000 ms

Описание опкодов может изменяться в зависимости от версии Sanny Builder и CLEO-плагин!

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

Ключевые слова (кейворды, keywords)

Если делать большой проект, то мы можем заметить, что некоторые команды встречаются очень часто. Настолько, что использование опкода становится неудобным. Для таких опкодов придумана система ключевых слов. Идея заключается в том, что компилятор Sanny Builder может самостоятельно распознать опкод без указания его ID. При этом описание становится ключевым словом, за которым следуют параметры:

wait 1000

Ключевые слова очень полезны, когда опкод имеет до 2-х параметров. Если их становится больше, то понять что за что отвечает весьма проблематично, так как в ключевых словах нет описания параметров. Значения и типы нужно заучивать. Этим пренебрегают некоторые плагины, которые добавляют ключевые слова с кучей параметров без явной необходимости. При открытии какого-либо файла, Sanny Builder вместо опкода будет использовать ключевые слова, как приоритет (процесс можно регулировать в настройках Sanny Builder.).

Следующий опкод, который важно рассмотреть, — это:

03A4: script_name 'MAIN'
// или ключевое слово
script_name 'MAIN'

В своей сути он указывает имя (уникальный ID) скрипта. Некоторые опкоды могут использовать это имя в различных целях. Сейчас я не буду описать эти опкоды (пока это не имеет значения), но нужно это иметь в виду. А Sanny Builder может использовать это имя для формирования названий меток (будет отдельная статья), что помогает при чтении кода в больших проектах (в визуальном плане).

Ввиду развития скриптинга и Sanny Builder, часть ключевых слов могут иметь синонимы. То есть за одно и тоже действие могут отвечать сразу несколько ключевых слов. К примеру опкод 03A4 кроме script_name имеет синоним:

thread 'MAIN' // то же, что и 03A4: script_name 'MAIN'

Оба варианта работают одинаково. В основном такие изменения происходят с целью сделать код похожим на тот, который использовали разработчики игры. При этом устаревшие названия ключевых слов сохраняются для обратной совместимости со старыми скриптами, чтобы код, написанный условно 10 лет назад, мог компилироваться в современной версии SB.

Классы

Ещё одним вариантом написания опкодов являются классы. Если говорить в общем, то класс — это некая группа опкодов, которая объединена одним именем. Каждый опкод получает своё уникальное название. Это название принято называть членом класса и применяется в форматах:

ИмяКласса.УникальноеНазвание(<Список параметров>)

<Переменная> = ИмяКласса.УникальноеНазвание(<Список параметров>)

<Переменная> = ИмяКласса(<Параметр>).УникальноеНазвание
ИмяКласса(<Параметр>).УникальноеНазвание <оператор> <Значение/Переменная>

Когда Sanny Builder находит подобные записи, он пытается преобразовать их в опкод, которые указаны в файлах classes.db в каталогах SB. Примером использования класса может стать этот код:

Camera.SetAtPos(2228.517, -1734.274, 15.744)

Если в коде Вы увидите подобные записи, то будете знать, что это классы. Для них существует своя подсветка синтаксиса, так что визуально их различить очень легко.

Из кода выше, мы видим название класса Camera, его метод SetAtPos и параметры (которые указываются через запятую), Sanny Builder будет воспринимать эту строку так же, как и опкод:

03CB: load_scene 2228.517 -1734.274 15.744

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

Некоторые режимы редактирования могут не иметь классов, поэтому я буду пытаться использовать опкоды, чтобы добиться совместимости примеров для разных игр.

Виды классов

На текущий момент есть два вида классов:

  1. Классы, которые имеют экземпляры (instance).

  2. Классы, которые не имеют экземпляров (static).

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

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

Второй вид лишён такой возможности. В основном такие классы описывают сущности, которые представлены в единственном экземпляре, при этом сами экземпляры явно не используются.

Если посмотреть пример выше, то $PLAYER_CHAR является указателем/экземпляром. В то время, как статический класс в таком указателе не нуждается:

Camera.SetBehindPlayer()

Авторы: wmysterio, Seemann

Last updated