Колбэки персонажа

Ren'Py предоставляет возможность выполнять колбэки при возникновении различных событий во время диалога. Это делается путём передачи аргумента callback в Character() или путём установки переменных config.character_callback или config.all_character_callbacks.

Колбэк персонажа вызывается с одним позиционным аргументом — произошедшим событием. Возможные события:

"begin"

Вызывается в начале инструкции say.

"show"

Вызывается перед показом каждого сегмента диалога. Диалог может быть разделён на несколько сегментов с помощью текстовых тегов {w} или {p}, но всегда состоит как минимум из одного сегмента.

"show_done"

Вызывается после показа каждого сегмента диалога.

"slow_done"

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

"interact_done"

Вызывается после завершения взаимодействия. Обратите внимание, что вход в новый контекст (например, игровое меню) не завершает взаимодействие.

"end"

Вызывается в конце инструкции say.

Колбэк вызывается со следующими именованными аргументами:

interact

Имеет значение true, если диалог приводит к взаимодействию.

type

Тип персонажа (например, "nvl", "adv", "bubble").

what

Текст, который будет передан отображаемому элементу what.

multiple

Аргумент multiple для Character().

Колбэкам "show", "slow_done" и "interact_done" также передаются дополнительные именованные аргументы:

start

Начало текущего сегмента диалога в строке what.

end

Конец текущего сегмента диалога в строке what.

delay

Продолжительность паузы Ren'Py после показа текущего сегмента диалога, или None, если Ren'Py будет ожидать клика игрока.

last_segment

True, если это последний сегмент диалога в инструкции say, иначе False.

Колбэк "interact_done" принимает дополнительный именованный аргумент:

exception

True, если взаимодействие завершилось из-за исключения, иначе False. Исключения включают такие события, как загрузка игры и откат (rollback).

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

Пример

В этом примере воспроизводятся звуковые сигналы (бипы) вместо голоса персонажа, когда включён медленный вывод текста:

init python:
    def beepy_voice(event, interact=True, **kwargs):
        if not interact:
            return

        if event == "show_done":
            renpy.sound.play("beeps.ogg")
        elif event == "slow_done":
            renpy.sound.stop()

define pike = Character("Christopher Pike", callback=beepy_voice)

label start:

    pike "So, hanging out on Talos IV, minding my own business, when..."

Для специализации общего колбэка под конкретных персонажей, вы можете передавать аргументы в функцию колбэка с префиксом cb_:

init python:
    def boopy_voice(event, interact=True, boopfile="normal_boop.ogg", **kwargs):
        if not interact:
            return

        if event == "show_done":
            renpy.sound.play(boopfile)
        elif event == "slow_done":
            renpy.sound.stop()

define chrisjen = Character("Chrisjen", callback=boopy_voice)
define nagata = Character("Naomi", callback=boopy_voice, cb_boopfile="sfx-blipmale.ogg")