Файлы _ren.py — Ren'Py в Python

В более сложных играх могут быть файлы, которые в основном состоят из Python с небольшим количеством операторов Ren'Py, таких как init python:, для введения кода Python в Ren'Py. У Ren'Py есть альтернативный способ написания этих файлов с большим количеством кода на Python. Файлы, имена которых заканчиваются на _ren.py, могут быть написаны с использованием синтаксиса Python, который затем преобразуется в скрипт Ren'Py и обрабатывается.

Есть две основные причины использовать эту возможность:

  • Использование синтаксиса _ren.py убирает дополнительный уровень отступов, который нужно ставить перед каждой строкой кода на Python.

  • Редакторы могут открывать файлы _ren.py, используя инструменты, специализированные для Python, что позволяет редактору выполнять анализ кода и операции рефакторинга, недоступные для Python-в-Ren'Py.

Файлы Ren'Py в Python имеют имена, которые заканчиваются на _ren.py, например, actions_ren.py. Эти файлы обрабатываются в том же порядке unicode, что и файлы .rpy, так что actions_ren.py обрабатывается в том же месте, где обрабатывался бы actions.rpy. Ошибкой является наличие и .rpy, и _ren.py файла с одинаковым корнем имени — например, actions.rpy и actions_ren.py конфликтуют и вызовут ошибку, если оба существуют в одной и той же директории.

Синтаксис и преобразование

Файлы Ren'Py в Python содержат три типа секций.

  • Единственная игнорируемая секция в начале файла. Она может использоваться для импортов Python и других конструкций, которые помогут редакторам и другим инструментам, но не являются частью игры и не будут выполняться Ren'Py.

  • Одна или несколько секций Ren'Py, которые содержат скрипт Ren'Py. Скрипт Ren'Py обычно используется для введения секций Python, а также задает отступы этого кода Python.

    Секция Ren'Py начинается с """renpy на отдельной строке и заканчивается """ на отдельной строке. И начало, и конец должны быть размещены в начале строки, без каких-либо отступов перед ними. Если что-либо из них будет иметь отступ, файл не будет обработан корректно.

  • Одна или несколько секций Python. Секции Python идут после секций Ren'Py и имеют отступ на уровне отступа последней строки в секции Ren'Py, не являющейся пробелом или комментарием. Если эта строка заканчивается двоеточием (:), код Python получает дополнительный отступ в 4 пробела.

Это преобразование используется для создания эквивалента .rpy-файла в памяти, и этот файл компилируется обычным образом. Примечательно, что Ren'Py в Python работает в хранилище (store) Ren'Py (а не в изолированном модуле), и код Python подвергается преобразованиям, которые обеспечивают работу отката и сохранения/загрузки — см. Инструкции Python и Откат.

Пример

Вот пример файла _ren.py:

# This is not included in the game. It's here so that an editor knows
# the type of strength.
strength = 100

"""renpy
init python:
"""

class BoostStrength(Action):
    """
    Boosts the strength of the player by 10.
    """

    def __call__(self):
        global strength
        strength += 10
        renpy.restart_interaction()

Этот файл преобразуется в (с удалением некоторых пустых строк):

init python:

    class BoostStrength(Action):
        """
        Boosts the strength of the player by 10.
        """

        def __call__(self):
            global strength
            strength += 10
            renpy.restart_interaction()