Файлы _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()