Работа с RPYC- и RPA-файлами

"Обфускация" (шифровка) исходного кода

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

Рассмотрим один из самых простых методов шифрования кода. Для удаления исходного кода, но сохранения функциональности достаточно удалить .rpy-файлы, оставив лишь их .rpyc-версии. В .rpyc-файле содержится скомпилированный вариант кода вашего мода с нечитаемым для человека синтаксисом. Удаление .rpy на работоспособность мода не влияет.

Создание RPA-архива

Для создания rpa-архива можно воспользоваться:

  1. Инструментом ES Doc для упаковки RPA
  2. RPATool
  3. Самим Ren'Py

Инструмент ES Doc

  1. Откройте упаковщик RPA и добавьте файлы или папку с ресурсами.
  2. Укажите имя архива, например my_mod.rpa.
  3. Проверьте «Пути внутри архива». Они должны совпадать с путями в коде относительно папки game: game/my_mod/images/bg.png должен стать my_mod/images/bg.png. При выборе папки game её имя удаляется автоматически. Для других папок настройте «Удалить из начала путей» и «Добавить папку в начале».
  4. Нажмите «Создать и скачать RPA».

RPATool

Необходимо установить Python версии не ниже 3.1, при установке выберите опцию Добавить Python в PATH.

  1. Скачайте файл rpatool и положите в удобное для вас место.
  2. Нажмите ПКМ с зажатым Shift, выберите Открыть окно PowerShell здесь.
  3. Введите в консоль (путь без кавычек):
python rpatool -c название_архива.rpa путь_до_папки_с_файлами_без_кавычек

Если папок несколько, то разделяйте их пробелами, если нужно заархивировать лишь один файл, то не забудьте указать его расширение.

По окончании архивации появится соответствующий RPA-архив рядом с файлом rpatool.

Ren'Py

  1. Установите Ren'Py удобным для вас способом, запустите renpy.exe.
  2. Создайте новый проект в Ren'Py, дайте любое имя, любые настройки.
  3. Перейдите в папку проекта, создайте новый rpy-файл и откройте его.
  4. Пропишите:
init python:
    build.archive("archive", "all") # Создаём новый архив с названием 'archive'
    build.classify('game/**', 'archive') # Помещаем все файлы из папки 'game' в 'archive'

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

init python:
    # Изображения
    build.classify('game/**.jpg', 'archive')
    build.classify('game/**.png', 'archive')
    # Музыка
    build.classify('game/**.ogg', 'archive')
    build.classify('game/**.mp3', 'archive')
    # Не добавляем в архив все файлы с расширением .txt в папке и подпапках 'game'.
    build.classify("**.txt", None)

Также можем положить файлы в разные архивы:

init python:
    # Создаём архивы
    build.archive("images", "all")
    build.archive("music", "all")

    # Изображения в 'images'
    build.classify('game/**.jpg', 'images')
    build.classify('game/**.png', 'images')
    # Музыка в 'music'
    build.classify('game/**.ogg', 'music')
    build.classify('game/**.mp3', 'music')

Подробнее о параметрах при создании архива здесь.

  1. Переходим обратно в renpy.exe, выбираем проект, нажимаем Build Distributions.
  2. Выбираем PC: Windows and Linux, нажимаем Build.
  3. После окончания разархивируем архив с билдом проекта и находим rpa-архивы.

Интеграция RPA в БЛ

Допустим, мод лежит в game/my_mod. До упаковки фон находился в game/my_mod/images/bg.png, а музыка — в game/my_mod/audio/theme.ogg. Внутри RPA сохраните пути без game/:

my_mod/images/bg.png
my_mod/audio/theme.ogg

Скачанный my_mod.rpa положите в game/my_mod. Рядом создайте archive_loader.rpy:

init -9999 python:
    mod_archive = "my_mod/my_mod"
    if mod_archive not in config.archives:
        config.archives.append(mod_archive)

В config.archives указывается путь от game до архива без расширения .rpa. Добавляйте свой архив в существующий список: присваивание config.archives = [...] уберёт из него архивы игры и других модов. Загрузчик оставьте вне RPA, чтобы игра могла выполнить его до обращения к ресурсам.

Пути к ресурсам в сценарии остаются прежними:

image my_mod_bg = "my_mod/images/bg.png"

label my_mod_start:
    scene my_mod_bg
    play music "my_mod/audio/theme.ogg"
    "Ресурсы загружены из RPA."
    return

Папка, в которой лежит RPA, не добавляется к путям внутри него автоматически. Если положить в архив просто images/bg.png, обращение к my_mod/images/bg.png не сработает.

У разных модов должны быть разные пути ресурсов. append сохраняет остальные архивы, но не устраняет совпадения имён файлов: при поиске используется первый подходящий архив в списке, а отдельные файлы на диске имеют приоритет над архивами. Для проверки перенесите исходные ресурсы из game в резервную папку вне игры, перезапустите БЛ и проверьте загрузку изображений и музыки.

В современном Ren'Py архивы в game подключаются автоматически. Для БЛ с её старым загрузчиком и архивом в папке мода используйте явное добавление выше. Подробнее: config.archives и загрузчик Ren'Py 6.

Декодирование RPYC

Для декодирования rpyc-файлов вы можете воспользоваться:

UnRen

  1. Скачайте архив и распакуйте bat-ник в директорию game.
  2. Запустите bat-файл и выберите Decompile rpyc files.
  3. По окончании нажмите любую клавишу для выхода или введите 1 в командную строку, чтобы вернуться.

Будут декодированы все rpyc в директории game, включая подпапки.

UnRpyc

Перейдите в releases и скачайте файл в зависимости от варианта декодирования:

  1. bytecode.rpyb
  2. un.rpy/un.rpyc

Скачайте rpyb-файл, положите в game\cache (с заменой, если необходимо) и запустите игру.

Или

Скачайте un.rpy или un.rpyc, положите в game и запустите игру.

После загрузки игры и запуска главного меню все rpyc-файлы, включая rpyc из модов Мастерской, будут декодированы.

Декодирование RPA

Для декодирования rpa-файлов вы можете воспользоваться:

UnRen

  1. Скачайте архив и распакуйте bat-ник в директорию game.
  2. Запустите bat-файл и выберите Extract RPA packages.
  3. По окончании нажмите любую клавишу для выхода или введите 1 в командную строку, чтобы вернуться.

Будут декодированы все rpa-архивы в директории game, включая подпапки.

UnRpa

  1. Необходимо установить Python версии не ниже 3.1, при установке выберите опцию Добавить Python в PATH.
  2. Поддерживается версия Windows не ниже Windows 8.
  1. Установите и разархивируйте в удобное для вас место.
  2. Запустите UnRPA Commander.exe.
  3. Нажмите Install UnRPA.
  4. В первом поле укажите полный путь до rpa-архива.
  5. Во втором поле укажите путь распаковки rpa-архива.
  6. Нажмите Extract All.

RPATool

Необходимо установить Python версии не ниже 3.1, при установке выберите опцию Добавить Python в PATH.

  1. Скачайте файл rpatool и положите в удобное для вас место.
  2. Нажмите ПКМ с зажатым Shift, выберите Открыть окно PowerShell здесь.
  3. Введите в консоль (пути без кавычек):
python rpatool -x путь_до_архива.расширение -o путь_до_папки_с_разархивированными_ресурсами

Обновлено