Как посмотреть картинки в renpy

Отображение изображений (Displaying Images)

Содержание

Характерной особенностью визуальной новеллы, придающей её имени форму, является графика. Ren’Py содержит четыре оператора, которые управляют выводом изображений на экран и моделью, определяющей порядок отображения изображений. Это позволяет легко выводить изображения на экран таким образом, чтобы это подходило для использования в визуальных новеллах и других играх с элементами повествования.

Ниже приведено четыре оператора, работающих с изображениями:

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

Общие понятия (Concepts) [ править ]

◇ Изображение [ править ]

Изображение (англ. image) – это то, что можно отобразить на экране с помощью оператора show. Изображение состоит из имени и отображаемого объекта. Когда изображение появляется на слое, связанный с ним отображаемый объект выводится на этом же слое.

Имя изображения состоит из одного или нескольких имён, разделенных пробелами. Первый элемент имени изображения – тег изображения. Второй и последующий элемент имени изображения – атрибуты изображения.

Отображаемый объект – это то, что можно отобразить на экране. Наиболее распространенный объект для отображения на экране – неподвижное изображение, которое может быть задано путем указания имени файла изображения в виде последовательности символов. В примере, приведённом выше, мы можем использовать «mary_beach_night_happy.png» в качестве имени файла. В то же время изображение может относиться к любому отображаемому объекту, поддерживаемому Ren’Py, а не только к неподвижным изображениям. Таким образом, операторы, используемые для отображения изображений, также могут применяться для выведения на экран анимации, сплошных цветов и других видов отображаемых объектов.

◇ Слой [ править ]

Слой (англ. layer) – список отображаемых объектов, которые отображаются на экране. Ren’Py поддерживает несколько слоёв, включая слои, задаваемые пользователем. Порядок слоёв фиксируется внутри разрабатываемой игры (управляется переменной config.layers), а порядок отображаемых объектов внутри слоя контролируется порядком, в котором вызываются операторы scene и show, и свойствами, заданными для этих операторов.

Следующие слои являются частью Ren’Py:

master Слой по умолчанию, используемый операторами scene, show, и hide. Обычно используется для отображения фона и спрайтов персонажей. transient Слой по умолчанию, используемый функциями пользовательского интерфейса. Слой очищается в конце каждого взаимодействия. screens Слой используется системой экранов. overlay Слой по умолчанию, используемый при вызове функции пользовательского интерфейса из функции наложения. Слой очищается при перезапуске взаимодействия.

Дополнительные слои можно определить, обновив config.layers и другие различные конфигурационные переменные, относящиеся к слою. С помощью renpy.layer_at_list() к слою можно применить одно или несколько преобразований.

Определение изображений (Defining Images) [ править ]

Существует два способа определения изображений. Можно поместить файл изображения в папку с изображениями, либо определить изображение с помощью оператора image. Первый способ просто реализовать, так как он предполагает размещение правильно названных файлов в соответствующей папке, а второй предоставляет вам больше контроля над тем, как определяется изображение, а также позволяет объявить изображения, которые не имеют собственных файлов.

Изображения, определенные с помощью оператора image, имеют преимущество над изображениями, размещенными в папке.

◇ Папка изображений [ править ]

Этот процесс происходят во всех папках внутри папки с изображениями. Например, все эти файлы определят изображение eileen happy:

◇ Оператор image [ править ]

Для определения изображения используется оператор image. Он состоит из одной логической строки, начинающейся с ключевого слова image, за которым следует имя изображения, знак равенства и отображаемый объект. Например:

Когда изображение непосредственно не находится в директории игры, необходимо указать папки, расположенные внутри директории. Например, если изображение находится в папке game/eileen/happy.png, в коде необходимо прописать:

Оператор image выполняется во время инициализации перед отображением меню или запуском метки label start. Если операторы image не содержатся внутри блока инициализации, они выполняются так, как если бы они были помещены в блок init с приоритетом 500.

Оператор show (Show Statement) [ править ]

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

Если оператору show задано точное имя существующего изображения, то это изображение отображается на экране. Иначе Ren’Py попытается найти уникальное изображение, которое:

Если уникальное изображение невозможно найти, возникает исключение.

Если изображение с таким же тегом изображения уже отображается на слое, новое изображение заменяет его. Иначе изображение помещается поверх всех остальных изображений, размещенных на слое (иными словами, ближе всего к пользователю). Такой порядок может быть изменен с помощью свойств zorder и behind.

Оператор show не вызывает взаимодействия. Чтобы изображение действительно отобразилось перед пользователем, необходимо запустить оператор, вызывающий взаимодействие (например, операторы say, menu, pause и with).

Оператор show принимает следующие свойства:

as Свойство as принимает имя. Это имя используется вместо тега изображения при отображении изображения. Позволяет одному и тому же изображению во второй раз отобразиться на экране. at Свойство at принимает одно или несколько простых выражений, разделенных запятыми. Каждое выражение должно быть преобразовано. Преобразования применяются к изображению в порядке слева направо. Если положение at не задано, Ren’Py сохранит любое существующее преобразование, примененное к изображению. Если преобразование не существует, изображение будет отображаться с помощью преобразования default. behind Содержит список из одного или нескольких имён, разделённых запятыми. Каждое имя используется в качестве тега изображения. Изображение отображается за всеми изображениями с указанными тегами, которые показываются в настоящее время. onlayer Принимает имя. Показывает изображение на именованном слое. zorder Принимает целое число. Оно определяет относительный порядок расположения изображений в пределах слоя, при большее число означает более близкое расположение изображения к пользователю. Это свойство обычно не используется в играх, созданных на движке Ren’Py, но может быть полезно при переносе визуальных новелл с других движков.

Читайте также:  миковизин что за препарат

Принимая во внимание вышеуказанное, ниже приводится определение изображений в коде:

Вот несколько примером применения оператора show:

Выражение show Вариант оператора show заменяет имя изображения на ключевое слово expression, за которым следует простое выражение. Выражение должно быть отображаемым объектом, а отображаемый объект показан на слое. Чтобы скрыть отображаемый объект, тег необходимо задать с помощью оператора as. Например:

Оператор show layer Оператор show layer позволяет применить ко всему слою преобразование или преобразование ATL (например, «master»), используя следующий синтаксис

Оператор scene (Scene Statement) [ править ]

Оператор scene удаляет все отображаемые объекты со слоя, а затем выводит изображение на этом слое. Оператор состоит из ключевого слова scene, за которым следует имя изображения и ноль или более свойств. Изображение отображается таким же образом, как и в операторе show, а оператор scene принимает те же свойства, что и оператор show.

Выражение scene Как и оператор show, оператор scene может принимать выражения вместо имён изображений.

Очистка слоя Когда имя изображения полностью исключено, оператор scene очищает все отображаемые объекты со слоя, не показывая другие отображаемые объекты.

Оператор hide (Hide Statement) [ править ]

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

Оператор hide используют в редких случаях. Если спрайт представляет собой персонажа, то оператор hide нужен только тогда, когда персонаж покидает экран. Когда персонаж изменяет свои эмоции, то вместо оператора hide предпочтительнее использовать оператор show, поскольку он автоматически заменит изображение с тем же тегом.

Оператор hide принимает следующее свойство:

onlayer Принимает имя. Скрывает изображение из именованного слоя.

Никогда не прописывайте в коде:

Вместо этого просто напишите:

Оператор with (With Statement) [ править ]

Оператор with используется для применения эффекта перехода при изменении сцены, в результате чего отображение и скрытие изображений становится менее резким. Оператор состоит из ключевого слова with, за которым следует простое выражение, которое вычисляется либо для объекта перехода, либо для специального значения None.

Эффект перехода используется между содержимым экрана в конце предыдущего взаимодействия (с переходными экранами и скрытыми отображениями объектами) и текущим наполнением сцены после выполнения операторов show и hide.

Оператор with вызывает взаимодействие. Продолжительность этого взаимодействия контролируется пользователем и он может привести к его преждевременному завершению.

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

Ниже приведён пример применения оператора with:

Вышеуказанный код приводит к возникновению двух переходов:

◇ Оператор with None [ править ]

Выше приведен пример с двумя переходами dissolve. Но что, если мы хотим, чтобы фон появился мгновенно, а затем растворились два персонажа? Простое исключение первого оператора with приведёт к растворению всех трех изображений, но нам нужен способ при котором первое изображение отобразится мгновенно.

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

В вышеуказанном коде происходит только один переход: от фона washington к сцене, состоящей из всех трех изображений.

◇ Выражение with операторов scene, show и hide [ править ]

Операторы show, scene и hide могут принимать необязательное выражение with, позволяющее комбинировать переход с отображением или скрытием изображения. Это выражение следует за операторами, располагаясь в конце той же логической строки. Выражение with начинается с ключевого слова with, за которым следует простое выражение.

Выражение with равноценно предшествующей строке с оператором with None и следующему за ним оператору with, содержащему текст выражения with. Например:

Операторы window show и hide (Hide and Show Window) [ править ]

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

Если задан дополнительный переход, он используется для отображения и скрытия окна. Если не задан, по умолчанию используются config.window_show_transition и config.window_hide_transition. Если в качестве перехода задано значение None, то это не позволяет переходу произойти.

Само окно отображается при вызове переменной config.empty_window. По умолчанию она способствует тому, что персонаж-рассказчик произносит пустую строку:

Функции изображения (Image Functions) [ править ]

renpy.can_show (name, layer=None, tag=None)

Функция определяет, может ли name использоваться для отображения изображения. Интерпретирует name как тег и атрибуты. А также объединяется с атрибутами отображаемого в данный момент изображением с tag на layer в попытке определить уникальное изображение для показа на экране. Если уникальное изображение может быть отображено, возвращает имя этого изображения в виде кортежа. Иначе возвращает значение None. tag Тег изображения для получения атрибутов. Если не задан, по умолчанию используется первый компонент name. layer Проверяемый слой. Если принимает значение None, для tag используется слой по умолчанию.

renpy.check_image_attributes (tag, attributes)

Проверяет наличие уникального изображения с заданным тегом и атрибутами. Если есть, то возвращает атрибуты по порядку. Иначе возвращает значение None.

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

Возвращает кортеж, задающий атрибуты изображения для изображения с tag. Если изображение не отображается, возвращает значение None. layer Проверяемый слой. Если принимает значение None, для tag используется слой по умолчанию.

Предоставляет список определённых тегов изображений.

Возвращает набор тегов изображений на layer, которые в настоящее время скрыты, но всё еще имеют связанные с ними данные атрибута.

renpy.get_image_bounds (tag, width=None, height=None, layer=’master’)

Если изображение с tag существует на layer, возвращает ограничительную рамку этого изображения. Возвращает значение None, если изображение не найдено. Ограничительная рамка представляет собой (x, y, ширина, высота) кортеж. Компоненты кортежей выражаются в пикселях и могут быть числами с плавающей точкой. width, height Ширина и высота области, содержащей изображение. Если принимает значение None, то по умолчанию ширина и высота экрана, соответственно. layer Если принимает значение None, для tag используется слой по умолчанию.

Читайте также:  баня у пруда подмосковье

renpy.get_ordered_image_attributes (tag, attributes=(), sort=None)

Если изображение с таким же именем было зарегистрировано в renpy.register_image, возвращает его. Иначе возвращает значение None.

Возвращает тег, соответствующий персонажу, которая в настоящее время говорит (аргумент image, заданный для этого персонажа). Возвращается значение None, если ни один из персонажей не говорит или персонаж, говорящий в данный момент, не имеет соответствующего тега изображения.

renpy.get_showing_tags (layer=’master’, sort=False)

Возвращает набор тегов изображений, в данный момент отображаемых на layer. Если sort принимает значение True, возвращает список тегов от конца к началу.

Возвращает список изображений, добавленных в Ren’Py, в виде списка строк с пробелами между компонентами имени.

Возвращает значение True, если именованное изображение хотя бы раз было показано в системе пользователя. Изображение считается просмотренным, если оно было отображено с помощью оператора show, оператора scene или функции renpy.show(). Обратите внимание, что есть случаи, когда пользователь не видел изображение, как оператор show за которым сразу же следует оператор hide.

Возвращает значение True, если на layer отображается изображение с тем же тегом, что и name. image Может быть строкой, задающей имя изображения, или кортежем, содержащим каждый из компонентов имени изображения. Также может быть строкой, содержащей только тег изображения. layer Слой для проверки. Если принимает значение None, для тега используется слой по умолчанию.

Данная функция принимает в качестве аргументов один или несколько отображаемых объектов. Это заставляет Ren’Py прогнозировать эти отображаемые объекты во время каждого взаимодействия, пока они не будут удалены renpy.stop_predict(). Если отображаемое имя представляет собой последовательность символов, содержащую один или несколько символов *, звездочки используются в качестве шаблона специальных символов. Если в последовательности символов есть по крайней мере одна . — шаблон сопоставляется с именами файлов, иначе он сопоставляется с именами изображений. Например, данный код

Данная функция принимает в качестве аргументов один или несколько отображаемых объектов. Это заставляет Ren’Py перестать прогнозировать эти отображаемые объекты во время каждого взаимодействия. Шаблоны специальных символов можно использовать, как описано в renpy.start_predict().

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

Статья «Displaying Images» на английском языке.

Источник

Изображения, расположенные сбоку диалогового окна (Side Images)

Содержание

Многие визуальные новеллы включают изображения говорящего персонажа как часть их интерфейса. Ren’Py называет такие изображения боковыми и поддерживает автоматический выбор и отображение таких изображения в рамках диалога.

Поддержка бокового изображения предполагает, что Character() объявлен со связанным тегом изображения:

Когда говорит персонаж со связанным тегом изображения, Ren’Py создаёт пул атрибутов изображения. В этот пул добавляется связанный тег изображения, а также текущие атрибуты изображения, связанные с этим тегом.

Чтобы определить боковое изображение, связанное с тегом, Ren’Py пытается найти изображение с тегом side и наибольшим количеством атрибутов из пула. Если изображение не найдено или несколько изображений имеют одинаковое количество атрибутов, отображается значение Null.

Например, у нас есть следующий скрипт:

В данном коде о точке А говорит персонаж е, связанный с тегом изображения «eileen». Отображается изображение «eileen happy», поэтому в пул атрибутов добавляется «eileen» и «happy». Мы ищем изображение с тегом «side» и как можно большим количеством этих атрибутов – и сопоставляем «side eileen happy», которое будет отображаться на боковом изображении Ren’Py.

Скрытые персонажи (Invisible Characters) [ править ]

Ещё один способ использования бокового изображения – отобразить изображение персонажа игрока, когда он говорит. Это можно сделать с помощью привязки изображения к персонажу, а затем использовать конструкцию say с атрибутами для выбора бокового изображения для отображения.

Вариации (Variations) [ править ]

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

define config.side_image_tag = None

Если задана, то боковое изображение будет отслеживать заданный тег изображения, а не изображение, связанное с текущим говорящим персонажем. Например:

define config.side_image_only_not_showing = False

Если установлено значение True, боковое изображение будет отображаться только в том случае, если изображение с этим тегом ещё не отображается на экране.

define config.side_image_prefix_tag = ‘side’

Префикс, используемый при поиске бокового изображения.

define config.side_image_null = Null()

Значение Null, которое можно использовать, когда боковое изображение не отображается. Изменяться, но только для других Null объектов. Одна из причин заключается в том, чтобы установить сторону Null (например, Null(width=200, height=150)) для предотвращения растворения из-за прерывания.

define config.side_image_same_transform = None

Если принимает значение не None, преобразование, которое используется, когда новое боковое изображение использует тот же тег изображения, что и предыдущее боковое изображение.

define config.side_image_change_transform = None

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

Преобразования и переходы (Transforms and Transitions) [ править ]

Преобразования config.side_image_same_transform и config.side_image_change_transform вызываются с двумя аргументами (old и new), когда боковое изображение отображается. Их можно использовать для перемещения по боковым изображениям или для перехода между боковыми изображениями.

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

Это используется для растворения между старыми и новыми боковыми изображениями, когда персонаж остаётся неизменным. Например, когда персонаж меняет эмоции. Для корректной работы Dissolve оба боковых изображения должны быть одного размера.

Пространство / Настройка (Leaving Room / Customization) [ править ]

По умолчанию текст занимает всю ширину экрана. Если попытаетесь отобразить боковое изображение, оно выведется поверх текста. Чтобы это исправить, нужно добавить margin или padding на соответствующей стороне текстового окна:

Читайте также:  сайт с персонажами friday night funkin

Положение бокового изображения можно изменить, настроив экраны say или nvl. Оба включают строку:

Изменяя свойства xalign и yalign, можно управлять расположением бокового изображения на экране.

Наконец, функция SideImage() возвращает в качестве отображаемого объекта текущее боковое изображение. Это можно использовать как часть более сложной настройки экрана.

Функции (Functions) [ править ]

renpy.get_side_image (prefix_tag, image_tag=None, not_showing=None, layer=None)

Пытается найти изображение, которое будет отображаться в качестве бокового изображения. Начинается с определения набора атрибутов изображения. Если задан image_tag, он получает атрибуты изображения из тега. Иначе он получает их от текущего показываемого персонажа. Затем он ищет изображение с тегом prefix_tag и этими атрибутами и возвращает его, если он существует. Если not_showing принимает значение True, то это возвращает боковое изображение только в том случае, если изображение, из которого взяты атрибуты, отсутствует на экране. Если принимает значение None, значение берется из config.side_image_only_not_showing. Если layer принимает значение None, для текущего отображаемого тега используется слой по умолчанию.

renpy.set_tag_attributes (name, layer=None)

Источник

Как посмотреть картинки в renpy

Декомпиляция rpyc- и rpa-файлов. Утилиты от Vendor’а, Lolbot’а и скрипт от Eliont’а.

В этой статье я расскажу о трёх способах декомпиляции rpyc- и rpa-файлов. Эти методы просты и не требуют каких-то дополнительных программных средств, но, к сожалению, они не универсальны и не всесильны. Соответственно, если они не смогли справиться с имеющимися в вашем распоряжении архивами, то не стоит унывать, есть и другие утилиты и скрипты (например, unrpec или rpatool), просто они могут быть более сложными в применении и требовать установки дополнительных программ.

Метод 1. Утилита от Vendor’а (тексты)

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

1. Качаем vendor_utils.zip, распаковываем во временную папку (например, \Katawa Shoujo\_temp)
2. Туда же копируем интересующие файлы. Например, script-a1-monday-RU.rpyc
3. Запускаем GetText.bat, получаем два файла: script-a1-monday-RU.TXT и script-a1-monday-RU.BIN
4. Глумимся над полученным файлом с расширением TXT (в BIN не лезем. )
5. Запускаем InsertText.bat, получаем новый вариант файла script-a1-monday-RU.rpyc
6. Перемещаем (это важно, если временную папку вы создали вложенной в главную папку игры, иначе игра будет ругаться на дубликаты, т.к. она найдёт ваш забытый во временной папке rpyc-файл и попытается его подключить к проекту) новый script-a1-monday-RU.rpyc обратно.
7. Запускаем игру…

Ссылку на первоисточник, к сожалению, найти не смог 🙁

Метод 2. Утилита от lolbot’а (скрипты)

Эта утилита позволяет получить исходники всех скриптов, включая системные, и подойдёт для любого уровня проекта, лишь бы справилась…

1. Качаем lolbot_decompile.zip, распаковываем в папку с игрой (в результате файл decompile.rpy из архива должен оказаться в папке \game, например \Katawa Shoujo\game)
2. Запускаем игру и некоторое время ждём, пока игра не начнётся. Всё, из игры можно выходить. Наигрались 🙂
3. Если первые два пункта выполнены без ошибок, то в корневой папке игры (например, \Katawa Shoujo) увидите огромное количество файлов с длинными названиями, например _Users_delta_Documents_ks svn_Katawa Shoujo Act 1_game_RU_ui_strings-RU.rpy.txt. Это – исходный код во всей красе. Он менее читабелен, чем полученный в методе 1, зато делать с ним можно ну всё что угодно. В том числе править имена персонажей, меню и прочее. Файл decompile.rpy из папки \game можно удалять, иначе при каждом запуске игра будет генерить эти многочисленные файлы.
4. После внесения изменений вспоминаем, что движок RenPy сам генерит этот файл rpyc из rpy. Итак, в папку игры копируем уже исправленный файл (например, _Users_delta_Documents_ks svn_Katawa Shoujo Act 1_game_RU_ui_strings-RU.rpy.txt) и приводим его название в нормальный вид (например, ui_strings-RU.rpy)
5. Запускаем игру…
6. После запуска получаем свежесгенерённый rpyc-файл, а rpy-файл можно стирать

Очевидно, что описанные выше операции можно проделывать и над другими файлами, например над script-a1-monday-RU.rpyc.

Метод 3. Скрипт от Eliont’а (графика, звук, шрифты и т.п.)

Для небольшой новеллы:

1. В папке \game (например, \Sugars Delight\game) переименовываем файлы script.rpyc и (если есть) script.rpy в script.rpyc_ и script.rpy_, соответственно.
2. В папке \game (например, \Sugars Delight\game) создаём файл script.rpy со следующим содержимым:

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
init python:
image_files = [
fn
for dir, fn in renpy.loader.listdirfiles()
if not fn.lower().endswith(«.rpy») and not fn.lower().endswith(«.rpyc») and not fn.lower().endswith(«.rpa») and not fn.lower().endswith(«.rpyb»)
if not fn[0] == «_»
]

def unarchive(original_filename, new_filename):
import os
import os.path

new_filename = config.basedir + «/» + new_filename
dirname = os.path.dirname(new_filename)

if not os.path.exists(dirname):
os.makedirs(dirname)

orig = renpy.file(original_filename)
new = file(new_filename, «wb»)
new.write(orig.read())
new.close()
orig.close()

label start:
python:
for img in image_files:
unarchive(img, «extracted/»+img)
return

3. Запускаем игру, жмём «Начать» и ждём, пока снова не появится меню (т.е. игра не запустится), после чего выходим из игры.
4. В новой папке \extracted (например, \Sugars Delight\extracted) получаем всё, кроме самих скриптов, т.е. видео, музыку, аудио, шрифты.
5. Удаляем наш script.rpy, переименовываем описанные в п.1 файлы script.rpyc_ и script.rpy_ обратно в script.rpyc и script.rpy.

Для новеллы побольше:

0. Перво-наперво нам понадобятся исходники скриптов, которые можно получить методом 2.
1. Находим файл, содержащий метку label start:. Меняем расширение оригинальному файлу (например, ui_labels.rpyc переименовываем в ui_labels.rpyc_)
2. Копируем полученный по 2-му методу в эту папку одноимённый файл (например, ui_labels.rpy), в котором удаляем блок, начинающийся с label start:.
3. В папке \game (например, \Katawa Shoujo\game) создаём файл script.rpy со следующим содержимым:

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
init python:
image_files = [
fn
for dir, fn in renpy.loader.listdirfiles()
if not fn.lower().endswith(«.rpy») and not fn.lower().endswith(«.rpyc») and not fn.lower().endswith(«.rpa») and not fn.lower().endswith(«.rpyb»)
if not fn[0] == «_»
]

def unarchive(original_filename, new_filename):
import os
import os.path

new_filename = config.basedir + «/» + new_filename
dirname = os.path.dirname(new_filename)

if not os.path.exists(dirname):
os.makedirs(dirname)

orig = renpy.file(original_filename)
new = file(new_filename, «wb»)
new.write(orig.read())
new.close()
orig.close()

label start:
python:
for img in image_files:
unarchive(img, «extracted/»+img)
return

Источник

Обучающий онлайн портал