Руководство по NVL-режиму

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

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

Начало работы

NVL-режим можно добавить в скрипт Ren'Py за два шага. Первый — объявить персонажей для использования NVL-режима, а второй — добавить операторы nvl clear в конце каждой страницы.

Персонажи могут быть объявлены для использования NVL-режима путём добавления параметра kind=nvl к каждому объявлению Character. Например, если мы используем объявления персонажей из руководства для начинающих:

define s = Character('Sylvie', color="#c8ffc8")
define m = Character('Me', color="#c8c8ff")

Для использования NVL-режима эти объявления становятся:

define s = Character('Sylvie', kind=nvl, color="#c8ffc8")
define m = Character('Me', kind=nvl, color="#c8c8ff")

Рассказчик в NVL-режиме также может быть использован путём включения следующего определения:

define narrator = nvl_narrator

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

Если мы запустим игру в таком виде, первые несколько строк будут отображаться нормально, но через некоторое время строки начнут появляться ниже нижней границы экрана. Чтобы разбить скрипт на страницы, включите оператор nvl clear после каждой страницы.

Ниже приведён пример скрипта с разбивкой на страницы:

label start:
    "I'll ask her..."

    m "Um... will you..."
    m "Will you be my artist for a visual novel?"

    nvl clear

    "Silence."
    "She is shocked, and then..."

    s "Sure, but what is a \"visual novel?\""

    nvl clear

Хотя в играх NVL-режима обычно больше текста в абзаце, этот пример демонстрирует базовый скрипт NVL-режима. (Подходит для использования в кинетической новелле без переходов.)

Режим монолога также работает с NVL-режимом. Включение текстового тега {clear} в отдельной строке эквивалентно оператору nvl clear, не выходя из режима монолога. Например:

label start:
    s """
    This is one block of text in monologue mode.

    This is a second block, on the same page as the first.

    {clear}

    The page just cleared!
    """

Меню в NVL-режиме

По умолчанию меню отображаются в ADV-режиме, занимая весь экран. Существует также альтернативное представление меню в NVL-режиме, которое отображает меню сразу после текущей страницы текста в NVL-режиме.

Чтобы получить доступ к этому альтернативному представлению меню, напишите:

define menu = nvl_menu

Меню исчезнет после того, как выбор будет сделан, поэтому обычно имеет смысл следовать за меню с помощью "nvl clear" или какого-либо указания на выбор.

Аргументы меню также можно использовать для доступа к меню в NVL-режиме. Это делается путем предоставления истинного аргумента nvl, установленного в True. Это полезно при смешивании меню в NVL-режиме и ADV-режиме в одной игре.

menu (nvl=True):
    "I prefer NVL-mode.":
        pass

    "ADV-mode is more for me.":
        pass

Отображение и скрытие окна NVL-режима

Окном NVL-режима можно управлять с помощью стандартных операторов window show и window hide. Чтобы выбрать переходы по умолчанию, которые будут использоваться для отображения и скрытия окна, добавьте в свою игру следующее:

init python:
    config.window_hide_transition = dissolve
    config.window_show_transition = dissolve

Переменная config.empty_window по умолчанию должна выбирать подходящее окно автоматически, но установка config.empty_window в nvl_show_core принудительно отобразит окно NVL-режима во время перехода.:

init python:
    config.empty_window = nvl_show_core

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

label meadow:

    nvl clear

    window hide
    scene bg meadow
    with fade
    window show

    "We reached the meadows just outside our hometown. Autumn was so
     beautiful here."
    "When we were children, we often played here."

    m "Hey... ummm..."

    window hide
    show sylvie smile
    with dissolve
    window show

    "She turned to me and smiled."
    "I'll ask her..."
    m "Ummm... will you..."
    m "Will you be my artist for a visual novel?"

Существуют также явные команды nvl show и nvl hide, которые показывают и скрывают окно NVL-режима. Они принимают необязательный переход и могут использоваться в играх, которые используют смешение окон NVL-режима и ADV-режима.

Настройка персонажей

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

  1. Внешний вид по умолчанию: имя персонажа слева, а диалог с отступом справа от имени. Цвет имени контролируется параметром ''color''.

    define s = Character('Sylvie', kind=nvl, color="#c8ffc8")
    
  2. Второй вид: имя персонажа встроено в текст. Диалог, произносимый персонажем, заключается в кавычки. Обратите внимание, что здесь имя персонажа помещается в параметр ''what_prefix'', вместе с открывающей кавычкой. (Закрывающая кавычка помещается в параметр ''what_suffix''.)

    define s = Character(None, kind=nvl, what_prefix="Sylvie: \"",
                         what_suffix="\"")
    
  3. Третий вид полностью обходится без имени персонажа, при этом диалог заключается в кавычки.

    define s = Character(None, kind=nvl, what_prefix="\"", what_suffix="\"")
    
  4. Поскольку третий вид может затруднить распознавание того, кто говорит, мы можем окрасить диалог с помощью параметра ''what_color''.

    define s = Character(None, kind=nvl, what_prefix="\"", what_suffix="\"",
                         what_color="#c8ffc8")
    
  5. Конечно, можно использовать полностью ненастроенного персонажа NVL-режима, если вы хотите полностью контролировать то, что отображается. (Это часто используется для рассказчика.)

    define s = Character(None, kind=nvl)
    

Переменные конфигурации

Следующие переменные конфигурации управляют функциональностью, связанной с NVL.

define config.nvl_layer = "screens"

Слой, на котором отображаются экраны nvl.

define config.nvl_list_length = None

Если не None, это максимальная длина списка диалогов NVL. Это можно установить (часто в сочетании с принудительной установкой фиксированной высоты диалогового окна), чтобы эмулировать бесконечно прокручивающееся окно NVL.

define config.nvl_page_ctc = None

Если не None, это индикатор «нажмите, чтобы продолжить», который используется для персонажей в режиме NVL в конце страницы. (То есть сразу за которым следует оператор nvl clear.) Это заменяет параметр ctc функции Character().

define config.nvl_page_ctc_position = "nestled"

Если не None, это позиция индикатора «нажмите, чтобы продолжить», которая используется для персонажей в режиме NVL в конце страницы. (То есть сразу за которым следует оператор nvl clear.) Это заменяет параметр ctc_position функции Character().

define config.nvl_paged_rollback = False

Если true, откат (rollback) в режиме NVL будет происходить по одной полной странице за раз.

Функции Python

nvl_clear()

Python-эквивалент инструкции nvl clear.

nvl_hide(with_)

Python-эквивалент инструкции nvl hide.

with_

Переход, используемый для скрытия окна в режиме NVL.

nvl_menu(items)

Python-функция, которая отображает меню в стиле NVL. Она редко используется напрямую. Вместо этого она присваивается переменной menu, используя что-то вроде:

define menu = nvl_menu
nvl_show(with_)

Python-эквивалент инструкции nvl show.

with_

Переход, используемый для отображения окна в режиме NVL.

Постраничный откат

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

init python:
    config.nvl_paged_rollback = True

Скрипт The Question (издание в NVL-режиме)

Вы можете просмотреть полный скрипт NVL-режимной версии ''The Question'' здесь.