Операторы, определяемые разработчиком (Creator-Defined Statements)

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску

Операторы, определяемые разработчиком, позволяют добавлять ваши собственные операторы в Ren'Py. Это позволяет добавлять то, что не поддерживается текущим синтаксисом Ren'Py.

Операторы, определяемые разработчиком, должны быть определены в блоке python early. Более того, имя файла, содержащее определяемый разработчиком оператор, должно быть загружено раньше, чем любой файл,Пер который его использует. Так как Ren'Py загружает файлы в порядке сортировки Unicode, обычно имеет смысл добавить перед именем любого файла, содержащего пользовательский оператор, префикс 01 или другое небольшое число.

Пользовательский оператор не может использоваться в файле, в котором он определён.

Оператор, определяемый разработчиком, регистрируются с помощью функции renpy.register_statement().


renpy.register_statement(name, parse=None, lint=None, execute=None, predict=None, next=None, scry=None, block=False, init=False, translatable=False, execute_init=None, init_priority=0, label=None, warp=None, translation_strings=None)

Эта функция регистрирует пользовательский оператор.
name
Это либо разделённый пробелами список имён, с которых начинается оператор, либо пустая строка для определения нового оператора по умолчанию (оператор по умолчанию заменит оператор say).
block
Если принимает значение False, оператор не ожидает блока. Если принимает значение True, оператор ожидает блок, но оставляет его до лексического анализатора, чтобы проанализировать этот блок. Если строка "script", блок интерпретируется как содержащий один или несколько операторов скриптового языка Ren'Py. Если строка "possible", условие ожидания блока определяется функцией анализа.
parse
Функция, принимающая объект Lexer. Она должна анализировать оператор и возвращать объект. Этот объект передаётся всем остальным функциям как аргумент. Аргумент lexer имеет следующие методы:
lint
Вызывается для проверки оператора. Функции передаётся единственный аргумент, объект возвращается из синтаксического анализа. Чтобы сообщить об ошибках, функция должна вызвать renpy.error.
execute
Эта функция вызывается при выполнении оператора. Ей передается единственный аргумент, объект возвращается из синтаксического анализа.
execute_init
Функция вызывается во время инициализации с приоритетом 0.
predict
Эта функция вызывается для прогнозирования изображений, используемых оператором. Ей передается единственный аргумент, объект возвращается из синтаксического анализа. Она должна возвращать список отображаемых объектов, используемых оператором.
next
Функция вызывается для определения оператора next.
Если block принимает значение не "script", ему передаётся единственный аргумент, возвращаемый объектом из функции parse. Если block принимает значение "script", дополнительный аргумент будет передан объекту, который присваивает имя первому оператору в блоке.
Функция должна возвращать либо строку с меткой для перехода, либо второй аргумент для передачи управления в блок, либо значение None для продолжения выполнения оператора после этого.
label
Функция, которая вызывается для определения метки этого оператора. Если он возвращает строку, то эта строка используется в качестве метки оператора, которую можно вызывать и переходить к ней, как к любой другой метке.
warp
Функция, которая вызывается, чтобы определить, должен ли этот оператор выполняться во время деформации. Если функция существует и возвращает значение True, она выполняется во время деформации, иначе оператор не запускается во время деформации.
scry
Используется внутри Ren'Py.
init
Принимает значение True, если этот оператор должен выполняться во время инициализации (если оператор еще не находится внутри блока инициализации, он автоматически помещается в блок init). В дополнение к функции execute_init вызывается функцию execute.
init_priority
Целое число, определяющее приоритет инициализации блока init.
translation_strings
Функция, вызываемая с анализируемым блоком. Ожидается, что он вернёт список строк, которые затем сообщаются как доступные для перевода.


Метод синтаксического анализа принимает в качестве параметра объект Lexer:

class Lexer
eol()
Принимает значение True, если лексический анализатор находится в конце строки.
match(re)
Соответствует произвольной строке регулярного выражения.
Все операторы в объекте Lexer, соответствующее элементам, реализованы с точки зрения этой функции. Сначала они пропускают пробелы, а затем пытаются сопоставить их со строкой. Если распознавание завершилось успешно, сопоставленный текст возвращается. Если нет, возвращается значение None.
keyword(s)
Распознаёт s как ключевое слово.
name()
Соответствует имени. Не соответствует встроенным ключевым словам.
word()
Соответствует любому слову, включая ключевые слова. Возвращает текст совпадающего слова.
string()
Соответствует строке Ren'Py.
integer()
Соответствует целому числу. Возвращает строку, содержащую целое число.
float()
Соответствует числу с плавающей точкой. Возвращает строку, содержащую число с плавающей точкой.
simple_expression()
Соответствует простому выражению Python, возвращает его в виде строки.
rest()
Пропускает пробелы, а затем возвращает оставшуюся часть строки.
checkpoint()
Возвращает непрозрачный объект, представляющий текущее состояние объекта Lexer.
revert(o)
Когда o – объект, возвращенный из checkpoint(), то состояние объекта Lexer возвращается к тому, что было при вызове checkpoint(). Используется для возврат к предыдущему состоянию.
subblock_lexer()
Возвращает объект Lexer для блока, связанного с текущей строкой.
advance()
В подблоке объекта Lexer переходит к следующей строке. Это должно быть вызвано перед первой строкой, тогда первая строка может быть проанализирована.

Функции полезности контроля качества кода (Lint Utility Functions)[править | править код]

Эти функции полезны при создании функций lint.

renpy.check_text_tags(s)

Проверяет правильность текстовых тегов в s. Если произошла ошибка, функция возвращает строку об ошибке или значение None, если ошибки нет.

Пример (Example)[править | править код]

Данный код создает новый оператор line, позволяющий указывать строки текста без кавычек.

python early:

    def parse_smartline(lex):
        who = lex.simple_expression()
        what = lex.rest()
        return (who, what)

    def execute_smartline(o):
        who, what = o
        renpy.say(eval(who), what)

    def lint_smartline(o):
        who, what = o
        try:
            eval(who)
        except:
            renpy.error("Character not defined: %s" % who)

        tte = renpy.check_text_tags(what)
        if tte:
            renpy.error(tte)

    renpy.register_statement("line", parse=parse_smartline, execute=execute_smartline, lint=lint_smartline)

В коде это может быть использовано так:

line e "Эти цитаты появятся," сказала Эйлин, "и нет необходимости в обратном слеше."

Источник[править | править код]

Статья "Creator-Defined Statements" на английском языке.


На главную страницу Официальная документация движка Вернуться к началу статьи