Диалог и повествование (Dialogue and Narration)

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

Текст играет чрезвычайно важную роль в визуальных новеллах и, как правило, много значит для игр, основанных на повествовании. Этот текст может состоять из диалога с указанием персонажа, который его произносит, и повествования, в котором нет того, кто говорит.

Для удобства мы объединим понятия «диалог» и «повествование», как диалог, за исключением случаев, когда их различия имеют важное значение. Также важно, чтобы пользователь мог настроить внешний вид диалога, изменив его с учетом своей игры.

В Ren'Py большинство диалогов написано с помощью операторов say. Внешний вид диалога можно настроить для каждого персонажа, используя объекты Character.

Оператор say (Say Statement)[править | править код]

Оператор say используется для диалога и повествования. Поскольку оператор say практически всегда является наиболее часто используемым оператором в скриптах Ren'Py, он имеет синтаксис, позволяющий свести к минимуму издержки при его написании в коде. Вот несколько примеров использования операторов say:

    "Это повествование."

    "Эйлин" "Это диалог с указанием конкретного имени персонажа."

    e "Это диалог, использующий объект Сharacter вместо указания конкретного имени персонажа."

    "Бам!!" with vpunch

В вышеуказанном коде приведены четыре формы оператора say:

  • 1-я форма
Представляет собой отдельную строку. Эта форма используется для повествования, при этом повествование является содержимым этой строки.
  • 2-я форма
Состоит из двух строк. Первая строка – имя персонажа, который произносит фразу, а вторая – фраза, произнесённая персонажем.
  • 3-я форма
Состоит из простого выражения, за которым следует строка. Простое выражение должно вычисляться либо в строке, задающей имя персонажа, либо в объекте Character. В последнем случае объект Characte используется для управления отображением диалога.
  • 4-я форма
Состоит из строки и оператора with с переходом vpunch. В данном случае строка отображается и в это же время экран сотрясается.


Хотя есть конкретные сведения о том, что оператор say определяется используемым объектом Character, стандартный результат оператора say - отображение диалога на экране, пока пользователь не щелкнет на него, чтобы прекратить, после удаление этого диалога с экрана.

Определенные символы имеет особое значение в Ren'Py, поэтому их нельзя использовать в строках диалога. Фигурная скобка начинает текстовый тег, а с квадратной скобки начинается замена. Чтобы использовать скобки в диалоге, удвойте их. Также может потребоваться поставить перед кавычками обратную косую черту, чтобы предотвратить закрытие строки. Например:

    "Я прошел мимо табличка с надписью \"Давайте выложимся на 100%!\""

Определение объектов Character (Defining Character Objects)[править | править код]

Создав объект Character и используя его в операторе say, можно настроить внешний вид (и в некоторой степени поведение) диалога. Персонажи создаются с помощью оператора define, предназначенного для присвоения значения переменной Character. Например:

define e = Character("Эйлин",
                     who_color="#c8ffc8")

После этого персонаж может быть использован в операторе say:

    e "Привет, мир."


Character – функция в языке программирования Python, принимающая большое количество именованных аргументов. Эти именованные аргументы настраивают поведение персонажа.

Оператор define вызывает выражение, которое вычисляется и присваивается к указанному имени. Если имя расположено не в блоке init, оператор define будет автоматически запущен с приоритетом инициализации 0.

Character(name, kind=adv, **args)

Создаёт и возвращает объект Character, управляющий внешним видом интерфейса диалога и повествования.
name
Если представляет последовательность символов – имя персонажа в диалоге. Когда name принимает значение None, то имя персонажа не отображается, как и при повествовании.
kind
Если используется, то значение по умолчанию для любого аргумента, не предоставленное для данного Character, представляет собой значение этого аргумента, заданное в kind. Можно использовать для разработки шаблона персонажа, а затем для создания копий шаблона этого персонажа с изменениями.


Связанное изображение
Тег изображения может быть связан с Character. Это позволяет оператору say, связанному с персонажем, с помощью тега отобразить изображение, а также позволяет Ren'Py автоматически выбрать позицию отображаемого изображения, когда персонаж говорит.
image
Последовательность символов, задающая тег изображения, связанный с этим персонажем.


Голосовой тег
Если голосовой тег назначается Character, то голосовые файлы, связанные с ним, можно приглушить или воспроизвести в разделе Настройки.
voice_tag
Последовательность символов, позволяющая приглушить или воспроизвести голосовой файл, связанный с Character, на голосовом канале.


Префиксы и суффиксы
Позволяют применять префикс и суффикс к имени персонажа и отображаемому тексту. Это можно использовать, например, для добавления кавычек до и после каждой строки диалога.
what_prefix
Последовательность символов, которая добавляется перед произносимым диалогов, прежде чем он появится.
what_suffix
Последовательность символов, которая добавляется после произносимого диалога, прежде чем он появится.
who_prefix
Последовательность символов, которая добавляется перед именем персонажа, прежде чем оно отобразится.
who_suffix
Последовательность символов, которая добавляется после имени персонажа, прежде чем оно отобразится.


Изменение отображения имени
Эти параметры помогают управлять отображением имени.
dynamic
Если принимает значение True, то name должно быть последовательностью символов, содержащей выражение Python. Эта последовательность будет вычисляться перед каждой строкой диалога, а результат используется в качестве имени персонажа.


Управление взаимодействиями
Эти параметры осуществляют контроль при отображение диалога, если происходит взаимодействие и режим приступил к выводу на экран.
condition
Если параметр задан, то это должна быть последовательность символов, содержащая выражение Python. Если выражение принимает значение False, диалог не возникает, как будто оператор say не произошел.
interact
Если принимает значение True, по умолчанию взаимодействие происходит при каждом отображении диалога. Если принимает значение False, взаимодействие не произойдет и на экран могут быть добавлены дополнительные элементы.
advance
Если принимает значение True, по умолчанию игрок может нажать на кнопку для перехода через оператор, другие средства продвижения (такие как пропуск и режим автоматической перемотки вперёд) также будут работать. Если принимает значение False, игрок не сможет обойти оператор say, если не предоставляется альтернативный способ (например, переход по гиперссылке или экрану).
mode
Строка, позволяющая добавить режим для ввода, когда персонаж говорит. Для получения дополнительной информации перейдите в раздел «Режимы».
callback
Функция, вызываемая при возникновении событий во время разговора персонажа. Для получения дополнительной информации перейдите в раздел «Функция обратного вызова для Character».


Указатель "Нажмите для продолжения"
Указатель "Нажмите для продолжения" отображается после того, как весь текст выведен на экран, чтобы предложить пользователю продолжить.
ctc
Отображаемый на экране объект, используемый в качестве указателя "Нажмите для продолжения", если не используется более конкретный указатель.
ctc_pause
Отображаемый на экране объект, используемый в качестве указателя "Нажмите для продолжения", когда отображение текста приостанавливается с помощью текстовых тегов {p} или {w}.
ctc_timedpause
Отображаемый на экране объект, используемый в качестве указателя "Нажмите для продолжения", когда отображение текста приостанавливается с помощью текстовых тегов {p=} или {w=}. Когда значение None, по умолчанию принимает значение ctc_pause, используйте Null(), когда вы захотите применить ctc_pause, но не ctc_timedpause.
ctc_position
Управляет расположением указателя "Нажмите для продолжения". Если принимает значение nestled, указатель отображается, как часть показываемого текста сразу после последнего символа. Если принимает значение fixed, указатель добавляется на экран, а его положение контролируется свойствами стиля позиции.


Экраны
При отображении диалога используется экран. Эти аргументы позволяют выбрать этот экран и предоставить аргументы к нему.
screen
Название экрана, используемого для отображения диалогового окна.
Именованные аргументы, начинающиеся с show_, имеют удалённый префикс, который передается на экран в качестве аргументов. Например, значение show_myflag станет на экране значением переменной myflag (переменная myflag не используется по умолчанию, но может использоваться пользовательским экраном say).
Одна переменная show по историческим причинам обрабатывается самим Ren'Py:
show_layer
Если переменная задана, это должна быть последовательность символов, дающая имя слою для отображения экрана «say» на экране.


Внешнее оформление текста и окон
Именованные аргументы, начинающиеся с who_, what_ и window_`, имеют свой удалённый префикс и используют стили для имени персонажа, произносящего текст, и, соответственно, окна, включающего обоих.
Например, если персонажу присваивается именованный аргумент who_color="#c8ffc8", то в данном случае цвет имени персонажа изменяется на зеленый. Window_background="frame.png" устанавливает фон окна, содержащего диалог этого персонажа.
Стиль, применяемый к имени персонажа, произносимому тексту и окну можно установить с помощью аргументов who_style, what_style и window_style.
Установка config.character_id_prefixes позволяет также задать стили для отображаемых объектов. Например, если по умолчанию используется графический интерфейс пользователя, стили с префиксом namebox_ используются для стилизации имени персонажа, произносящего реплику.

Say с атрибутами изображения (Say with Image Attributes)[править | править код]

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

В таком виде, если изображение с заданным тегом отображается, Ren'Py выдаст команду show, включающую тег персонажа и атрибуты. Если изображение не отображается, Ren'Py сохранит атрибуты для использования боковыми изображениям, но не будет показывать изображение.

Например:

define e = Character("Эйлин", image="eileen")

label start:

    show eileen mad
    e "Я немного злюсь на тебя."

    e happy "Но это пройдёт."

соответствует:

define e = Character("Эйлин")

label start:

    show eileen mad
    e "Я немного злюсь на тебя."

    show eileen happy
    e "Но это пройдёт."


Когда атрибут изображения начинается с символа @, изменение является временным и возвращается к ранее отображаемому изображению в конце строки диалога. Например:

define e = Character("Эйлин", image="eileen")

label start:

    show eileen mad
    e "Я немного злюсь на тебя."

    e @ happy "Забавно."

    e "Но не думай, что это вытащит тебя из ада."

соответствует:

define e = Character("Эйлин")

label start:

    show eileen mad
    e "Я немного злюсь на тебя."

    show eileen happy
    e "Забавно."

    show eileen mad
    e "Но не думай, что это вытащит тебя из ада."


Два синтаксиса могут быть объединены, причём постоянные изменения происходят перед @, а временные после.

e happy @ vhappy "В самом деле! Это всё меняет."

Чтобы переход происходил всякий раз, когда изображения изменяются таким образом, установите для перехода config.say_attribute_transition. Для большего контроля используйте config.say_attribute_transition_callback.

Пример Персонажей (Example Characters)[править | править код]

Ниже приведено несколько примеров объявления персонажей в коде:

# Персонаж, диалог которого заключен в скобки.
define e = Character("Эйлин", what_prefix='"', what_suffix='"')

# Персонаж, который извлекает своё имя из переменной.
define p = Character("player_name", dynamic=True)

Специальные персонажи (Special Characters)[править | править код]

Несколько имён персонажей определяются по умолчанию и автоматически используются в определенных ситуациях. Преднамеренное переопределение этих персонажей может изменить поведение RenPy, но их случайное использование в коде может быть проблемой.

adv
По умолчанию представляет собой разновидность персонажа, используемого объектом Character. Настраивает персонажа таким образом, что за раз на экран выводится одна строка с текстом диалога.
nvl
Своего рода объект Character, вызывающий диалог, который будет выводиться на экран как в руководстве по NVL-режиму, а именно с одновременным отображением нескольких строк текста на экране.
narrator
Персонаж-рассказчик, используемый для отображения повествования, путем операторов say без имени персонажа.
name_only
Персонаж, используемый для отображений диалога, в котором имя персонажа задаётся в виде последовательности символов. Этот персонаж копируется в нового персонажа с заданным именем, а затем этот новый персонаж используется для отображения диалога.
centered
Персонаж, вызывающий то, что он говорит для отображения по центру, в середине экрана, за пределами любого окна.
vcentered
Персонаж, вызывающий то, что он говорит для отображения в вертикально ориентированном тексте, в середине экрана, за пределами любого окна.
extend
Персонаж, вызывающий реплику, произнесенную последним персонажем диалога, состоящую из последней строки произнесенного диалога, "{fast}" и диалогу продолжается. Можно использовать для изменения экрана в течение диалога.
Extend знает о NVL-режиме и воспринимает его корректно.
Например:
# Показать первую строку диалога, дождаться от игрока нажатия на кнопку, изменить выражение персонажа и показать остальной текст.

show eileen concerned

e "Иногда, мне грустно."

show eileen happy

extend "Но обычно я быстро с этим справляюсь!"


# Аналогично, но автоматически изменяет выражение при завершении отображения первой строки.
# Это имеет смысл только тогда, когда пользователь не установил скорость текста на максимум.

show eileen concerned

e "Иногда, мне грустно.{nw}"

show eileen happy

extend "Но обычно я быстро с этим справляюсь!"

Управление диалоговым окном (Dialogue Window Management)[править | править код]

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

window show
Оператор window show вызывает отображение окна. В качестве аргумента оператор принимает необязательный переход, который используется для отображения окна. Если переход не задан, то используется config.window_show_transition.
window hide
Оператор window hide позволяет скрыть окно. В качестве аргумента оператор принимает необязательный переход, который используется для того, чтобы скрыть окно. Если переход не задан, то используется config.window_hide_transition.
window auto hide, window auto show
Эти операторы показывают или скрывают окно с дополнительным переходом, как window show или window hide. Однако, в отличие от этих операторов, это позволяет включить автоматическое управление.
window auto
Оператор window auto позволяет автоматически управлять окном. Окно отображается перед операторами, перечисленными в config.window_auto_show - по умолчанию операторы say. Окно скрывается перед операторами, перечисленными в config.window_auto_hide - по умолчанию операторы scene и call screen (учитываются только операторы, а не эквивалентные функции операторов).
Оператор window auto использует config.window_show_transition и config.window_hide_transition для отображения и, соответственно скрытия окна. Window auto отменяется window show или window hide.
Например:
window show # отображает окно с переходом по умолчанию, если он есть.
pause       # окно отображается во время этой паузы.
window hide # скрывает окно.
pause       # окно скрывается во время этой паузы.

window show dissolve # показывает окно с dissolve (растворение).
pause                # окно отображается во время этой паузы.
window hide dissolve # скрывает окно с dissolve (растворение).
pause                # окно скрывается во время этой паузы.


window auto

"Окно автоматически отображается перед этой строкой диалога."
pause                # окно отображается во время этой паузы.

scene bg washington  # окно скрывается перед сменой scene.
with dissolve

window auto show     # Показывает окно до того, как оно будет показано.

show eileen
with dissolve

«Без window auto show окно было бы показано здесь».

Управление диалоговым окном зависит от "show empty window" Preference(). Если preference отключён, приведенные выше операторы не действуют.

Оператор say с аргументами (Say with Arguments)[править | править код]

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

e "Привет, мир." (what_color="#8c8")

Аргументы оператора say сначала обрабатываются переменной config.say_arguments_callback, если нет значения не None. Если какие-либо аргументы остаются, они передаются персонажу, который обрабатывает их так, как если бы они присутствовали при определении персонажа. Таким образом, в приведенном выше примере текст диалога зеленого цвета. Специальные ключевые слова _mode и _with_node будут переопределять те, которые заданы в персонаже, только для этого взаимодействия.

Режим монолога (Monologue Mode)[править | править код]

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

Чтобы охватить указанные случаи, Ren'Py поддерживает режим монолога. Когда диалог находится внутри строк с тройными кавычками, Ren'Py разбивает диалог на блоки в пустых строках. Затем каждый блок используется для создания собственного оператора say. Вот пример с тремя блоками повествования, за которыми следуют три строки диалога:

"""
Это первая строка повествования. Она длиннее, чем две другие
строки, так что надо её перенести.

Это вторая строка повествования.

Это третья строка повествования.
"""

e """
Это первая строка повествования. Она длиннее, чем две другие
строки, так что надо её перенести.

Это вторая строка повествования.

Это третья строка повествования.
"""

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

Если вы хотите опустить пробелы между блоками, допишите rpy monologue single на верхнем уровне файла перед первой строкой монолога.

Аналоги Python (Python Equivalents)[править | править код]

Заметка: Имеет смысл ознакомиться с данным разделом, если вы прочитали «Операторы в языке программирования Python».


Когда присутствует первый параметр оператора say и выражение, оператор say соответствует вызову этого выражения с диалогом и аргументом interact со значением True. Например:

e "Привет, мир."

аналогично:

$ e("Привет, мир.", interact=True)

Оператор say будет искать character по имени хранения перед хранилищем по умолчанию. Если вы хотите сделать персонажа с тем же именем, что и переменная в хранилище по умолчанию, его можно определить с помощью:

define character.e = Character("Эйлин")

Впоследствии этот сharacter можно использовать наряду с переменной в хранилище по умолчанию:

label start:

    # Это ужасное имя переменной.
    e = 100

    e "Наша начальная энергия - [e] единиц."

Оператор say с аргументами видит аргументы, переданные функции. Например:

e "Привет, мир." (what_size=32)

аналогично:

e("Привет, мир.", interact=True, what_size=32)

Когда e представляет собой Character, это также эквивалентно:

Character(kind=e, what_size=32)("Привет, мир.", interact=True)

Но можно использовать переменную config.say_arguments_callback или e поместить в Сharacter, чтобы сделать всё по другому.


Управление окнами осуществляется путем указания переменных _window и _window_auto, а также с помощью нижеуказанных функций:

_window_hide(trans=False)
Эквивалент оператора window hide в Python.
trans
Если принимает значение False, по умолчанию используется переход window hide. Если принимает значение None, переход не используется. Иначе применяется заданный переход.


_window_show(trans=False)
Эквивалент оператора window show в Python.
trans
Если принимает значение False, по умолчанию используется переход window show. Если принимает значение None, переход не используется. Иначе применяется заданный переход.

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

Статья "Dialogue and Narration" на английском языке.


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