Инициализация

Сразу после фазы анализа скриптов начинается фаза инициализации. Во время неё обрабатываются все блоки init (как и блоки init python), блоки define, операторы и/или блоки image, блоки transform, блоки screen и блоки style.

Операторы default обрабатываются после фазы инициализации — в отдельной фазе перед началом игры.

В этой статье мы разберём как работают блоки инициализации, приоритеты и блоки Python-кода.

Блок init

Блок init нужен в основном для того, чтобы удобно группировать операторы вызываемые при инициализации и маленькие Python-блоки.
Синтаксис:

init:
    <Ваши команды>

Пример:

init:
    image mymod_sprite_al = "mymod/images/sprites/al.png"
    $ mymod_char_al = Character("Алексей")

Приоритеты блоков инициализации

Каждому блоку инициализации можно задать свой приоритет от -999 до 999. Команды из блоков с низким приоритетом будут выполняться раньше команд из блоков с высоким приоритетом.
Синтаксис:

init <Ваш приоритет>:
    <Ваши команды>

Пример:

init -10:
    $ a = -10
init: # Если приоритет явно не указан, то он равен нулю
    $ a = 0
init 10:
    $ a = 10

В итоге значение переменной a будет равно 10, так как последний раз она была определена в инициализационном блоке с приоритетом 10.

Блок python

Весь текст из этого блока интерпретируется движком как код Python. В нём можно читать и изменять переменные, создавать и связывать с движком свои функции и много чего ещё.
Синтаксис:

    python:
        <Ваш Python-код>

Также к этому блоку можно добавить аргументы hide и in.

Аргумент hide

С аргументом hide весь код блока будет выполнен в анонимном поле. После выполнения поле выполнения будет уничтожено, а созданные переменные потеряны. При этом изменения существующих переменных из других store будут сохранены. Это же значит, что по умолчанию с этим аргументом всегда требуется обращаться к общему store с помощью renpy.store (или отдельным именным store) чтобы сохранить какие-либо данные.
Пример:

    # ...
    python hide:
        a = 10
        renpy.store.b = 20
    # ...

В примере переменная a просто пропадёт, а b, так как изменено через модификацию общего store, сохранит изменение.

Аргумент in

С аргументом in весь код блока будет выполнен в выбранном store. Выполнение кода в конкретном store позволяет защитить переменные вашего мода от конфликтов. Об использовании отдельных именных store вы можете прочитать в этой статье.
Пример:

    # ...
    python in mymod_store:
        a = 10
    # ...

В примере в store mymod_store будет создана переменная a.

Однострочный блок кода Python

В Ren'Py также можно открыть и однострочный блок кода Python. Делается это с помощью символа $ перед строкой Python-кода. С помощью однострочных блоков кода можно быстро изменить какую-либо переменную или вызвать какую-либо функцию и сделать это при инициализации или во время повествования.
Пример:

    # ...
    $ a = 10
    # ...

Однострочный блок кода Python всегда выполняется в общем store.

Блок init python

Блок init python выполняет весь Python-код из себя во время инициализации.
Синтаксис:

init python:
    <Ваш код>

Также как и блок python, блок init python принимает приоритеты (init <Ваш приоритет> python:), а также аргументы hide (init python hide:) и in (init python in <Название вашего store>:).

Блок python early

Блок python early позволяет выполнять Python-код до других блоков инициализации. Весь код из него выполняется сразу после чтения файла движком.
Синтаксис:

python early:
    <Ваш код>

Также как и блок python, блок python early принимает аргументы hide (python early hide:) и in (python early in <Название вашего store>:).

Блок python early равен по функционалу блоку init python early.